All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bigdata.rdf.sparql.ast.optimizers.TestASTNamedSubqueryOptimizer Maven / Gradle / Ivy

There is a newer version: 2.1.4
Show newest version
/**

Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016.  All rights reserved.

Contact:
     SYSTAP, LLC DBA Blazegraph
     2501 Calvert ST NW #106
     Washington, DC 20008
     [email protected]

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
/*
 * Created on Sep 13, 2011
 */

package com.bigdata.rdf.sparql.ast.optimizers;

import java.util.LinkedHashSet;

import org.openrdf.model.impl.URIImpl;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.query.algebra.StatementPattern.Scope;

import com.bigdata.bop.IBindingSet;
import com.bigdata.bop.IVariable;
import com.bigdata.bop.Var;
import com.bigdata.rdf.internal.IV;
import com.bigdata.rdf.sparql.ast.ASTContainer;
import com.bigdata.rdf.sparql.ast.AbstractASTEvaluationTestCase;
import com.bigdata.rdf.sparql.ast.ConstantNode;
import com.bigdata.rdf.sparql.ast.IQueryNode;
import com.bigdata.rdf.sparql.ast.JoinGroupNode;
import com.bigdata.rdf.sparql.ast.NamedSubqueriesNode;
import com.bigdata.rdf.sparql.ast.NamedSubqueryInclude;
import com.bigdata.rdf.sparql.ast.NamedSubqueryRoot;
import com.bigdata.rdf.sparql.ast.ProjectionNode;
import com.bigdata.rdf.sparql.ast.QueryNodeWithBindingSet;
import com.bigdata.rdf.sparql.ast.QueryRoot;
import com.bigdata.rdf.sparql.ast.QueryType;
import com.bigdata.rdf.sparql.ast.StatementPatternNode;
import com.bigdata.rdf.sparql.ast.StaticAnalysis;
import com.bigdata.rdf.sparql.ast.SubqueryRoot;
import com.bigdata.rdf.sparql.ast.VarNode;
import com.bigdata.rdf.sparql.ast.eval.AST2BOpContext;
import com.bigdata.rdf.vocab.decls.FOAFVocabularyDecl;

/**
 * Test suite for the {@link ASTNamedSubqueryOptimizer}.
 * 
 * @author Bryan Thompson
 * @version $Id: TestASTNamedSubqueryOptimizer.java 6281 2012-04-12 17:27:36Z
 *          thompsonbry $
 * 
 *          FIXME Add unit test where there are no join variables because there
 *          is nothing which must be bound in one context or the other.
 * 
 *          FIXME Add unit test where there are no join variables because the
 *          named solution set is included from multiple locations without any
 *          overlap in the incoming bindings (consider doing a hash index build
 *          for each include location other than the most specific location (the
 *          one with the most possible join variables)).
 * 
 *          FIXME Add unit test where there are join variables, but they are
 *          only those which overlap for the different locations at which the
 *          named solution set is joined into the query.
 */
public class TestASTNamedSubqueryOptimizer extends
        AbstractASTEvaluationTestCase {

    /**
     * 
     */
    public TestASTNamedSubqueryOptimizer() {
    }

    /**
     * @param name
     */
    public TestASTNamedSubqueryOptimizer(String name) {
        super(name);
    }

    /**
     * Unit test for computing the join variables for a named subquery based on
     * the analysis of the bindings which MUST be produced by the subquery and
     * those which MUST be bound on entry into the group in which the subquery
     * solution set is included within the main query.
     * 
     * select ?x ?o
     * with {
     *  select ?x where { ?x rdf:type foaf:Person }
     * } AS %namedSet1
     * where {
     *  ?x rdfs:label ?o
     *  INCLUDE %namedSet1
     * }
     * 
* * The join should be on ?x in this example. *

* Note: Whether we use a join on ?x or whether there are NO * join variables depends on the order imposed on the named subquery include * versus the statement pattern, which depends on the expected cardinality * of the named solution set and ?x rdfs:label ?o. We should * only use ?x as a join variable if the expected cardinality * of ?x rdfs:label ?o is LT the expected cardinality of the * named solution set. In fact, for this case it probably won't be. */ public void test_static_analysis_join_vars() { /* * Note: DO NOT share structures in this test!!!! */ final IBindingSet[] bsets = new IBindingSet[]{}; @SuppressWarnings("rawtypes") final IV a = makeIV(RDF.TYPE); @SuppressWarnings("rawtypes") final IV rdfsLabel = makeIV(RDFS.LABEL); @SuppressWarnings("rawtypes") final IV person = makeIV(FOAFVocabularyDecl.Person); // The source AST. final QueryRoot given = new QueryRoot(QueryType.SELECT); final String namedSet1 = "namedSet1"; final VarNode[] joinVars = new VarNode[]{new VarNode("x")}; { // NamedSubqueryRoot { final NamedSubqueryRoot nsr = new NamedSubqueryRoot( QueryType.SELECT, namedSet1); given.getNamedSubqueriesNotNull().add(nsr); { final ProjectionNode projection = new ProjectionNode(); nsr.setProjection(projection); projection.addProjectionVar(new VarNode("x")); } { final SubqueryRoot subqueryRoot = new SubqueryRoot( QueryType.SELECT); nsr.setWhereClause(new JoinGroupNode(subqueryRoot)); final ProjectionNode projection = new ProjectionNode(); nsr.setProjection(projection); projection.addProjectionVar(new VarNode("x")); final JoinGroupNode whereClause = new JoinGroupNode(); nsr.setWhereClause(whereClause); whereClause.addChild(new StatementPatternNode(new VarNode( "x"), new ConstantNode(a), new ConstantNode(person), null/* c */, Scope.DEFAULT_CONTEXTS)); } } // Main Query { final ProjectionNode projection = new ProjectionNode(); given.setProjection(projection); projection.addProjectionVar(new VarNode("s")); projection.addProjectionVar(new VarNode("o")); final JoinGroupNode whereClause = new JoinGroupNode(); given.setWhereClause(whereClause); whereClause.addChild(new StatementPatternNode(new VarNode("x"), new ConstantNode(rdfsLabel), new VarNode("o"), null/* c */, Scope.DEFAULT_CONTEXTS)); whereClause.addChild(new NamedSubqueryInclude(namedSet1)); } } // The expected AST after the rewrite. final QueryRoot expected = new QueryRoot(QueryType.SELECT); { // NamedSubqueryRoot { final NamedSubqueryRoot nsr = new NamedSubqueryRoot( QueryType.SELECT, namedSet1); expected.getNamedSubqueriesNotNull().add(nsr); { final ProjectionNode projection = new ProjectionNode(); nsr.setProjection(projection); projection.addProjectionVar(new VarNode("x")); } { final SubqueryRoot subqueryRoot = new SubqueryRoot( QueryType.SELECT); nsr.setWhereClause(new JoinGroupNode(subqueryRoot)); final ProjectionNode projection = new ProjectionNode(); nsr.setProjection(projection); projection.addProjectionVar(new VarNode("x")); final JoinGroupNode whereClause = new JoinGroupNode(); nsr.setWhereClause(whereClause); whereClause.addChild(new StatementPatternNode(new VarNode( "x"), new ConstantNode(a), new ConstantNode(person), null/* c */, Scope.DEFAULT_CONTEXTS)); } // No dependencies. nsr.setDependsOn(new String[]{}); nsr.setJoinVars(joinVars); } // Main Query { final ProjectionNode projection = new ProjectionNode(); expected.setProjection(projection); projection.addProjectionVar(new VarNode("s")); projection.addProjectionVar(new VarNode("o")); final JoinGroupNode whereClause = new JoinGroupNode(); expected.setWhereClause(whereClause); whereClause.addChild(new StatementPatternNode(new VarNode("x"), new ConstantNode(rdfsLabel), new VarNode("o"), null/* c */, Scope.DEFAULT_CONTEXTS)); final NamedSubqueryInclude nsi = new NamedSubqueryInclude(namedSet1); whereClause.addChild(nsi); nsi.setJoinVars(joinVars); } } final IASTOptimizer rewriter = new ASTNamedSubqueryOptimizer(); final AST2BOpContext context = new AST2BOpContext(new ASTContainer( given), store); final IQueryNode actual = rewriter.optimize(context, new QueryNodeWithBindingSet(given, bsets)).getQueryNode(); assertSameAST(expected, actual); } /** * Variant of {@link #test_static_analysis_join_vars()} where the order of * the {@link StatementPatternNode} and the {@link NamedSubqueryInclude} in * the main WHERE clause is reversed such that there are no join variables * for the INCLUDE. *

     * select ?x ?o
     * with {
     *  select ?x where { ?x rdf:type foaf:Person }
     * } AS %namedSet1
     * where {
     *  INCLUDE %namedSet1
     *  ?x rdfs:label ?o
     * }
     * 
*/ public void test_static_analysis_no_join_vars() { /* * Note: DO NOT share structures in this test!!!! */ final IBindingSet[] bsets = new IBindingSet[]{}; @SuppressWarnings("rawtypes") final IV a = makeIV(RDF.TYPE); @SuppressWarnings("rawtypes") final IV rdfsLabel = makeIV(RDFS.LABEL); @SuppressWarnings("rawtypes") final IV person = makeIV(FOAFVocabularyDecl.Person); // The source AST. final QueryRoot given = new QueryRoot(QueryType.SELECT); final String namedSet1 = "namedSet1"; final VarNode[] joinVars = new VarNode[]{}; { // NamedSubqueryRoot { final NamedSubqueryRoot nsr = new NamedSubqueryRoot( QueryType.SELECT, namedSet1); given.getNamedSubqueriesNotNull().add(nsr); { final ProjectionNode projection = new ProjectionNode(); nsr.setProjection(projection); projection.addProjectionVar(new VarNode("x")); } { final SubqueryRoot subqueryRoot = new SubqueryRoot( QueryType.SELECT); nsr.setWhereClause(new JoinGroupNode(subqueryRoot)); final ProjectionNode projection = new ProjectionNode(); nsr.setProjection(projection); projection.addProjectionVar(new VarNode("x")); final JoinGroupNode whereClause = new JoinGroupNode(); nsr.setWhereClause(whereClause); whereClause.addChild(new StatementPatternNode(new VarNode( "x"), new ConstantNode(a), new ConstantNode(person), null/* c */, Scope.DEFAULT_CONTEXTS)); } } // Main Query { final ProjectionNode projection = new ProjectionNode(); given.setProjection(projection); projection.addProjectionVar(new VarNode("s")); projection.addProjectionVar(new VarNode("o")); final JoinGroupNode whereClause = new JoinGroupNode(); given.setWhereClause(whereClause); whereClause.addChild(new NamedSubqueryInclude(namedSet1)); whereClause.addChild(new StatementPatternNode(new VarNode("x"), new ConstantNode(rdfsLabel), new VarNode("o"), null/* c */, Scope.DEFAULT_CONTEXTS)); } } // The expected AST after the rewrite. final QueryRoot expected = new QueryRoot(QueryType.SELECT); { // NamedSubqueryRoot { final NamedSubqueryRoot nsr = new NamedSubqueryRoot( QueryType.SELECT, namedSet1); expected.getNamedSubqueriesNotNull().add(nsr); { final ProjectionNode projection = new ProjectionNode(); nsr.setProjection(projection); projection.addProjectionVar(new VarNode("x")); } { final SubqueryRoot subqueryRoot = new SubqueryRoot( QueryType.SELECT); nsr.setWhereClause(new JoinGroupNode(subqueryRoot)); final ProjectionNode projection = new ProjectionNode(); nsr.setProjection(projection); projection.addProjectionVar(new VarNode("x")); final JoinGroupNode whereClause = new JoinGroupNode(); nsr.setWhereClause(whereClause); whereClause.addChild(new StatementPatternNode(new VarNode( "x"), new ConstantNode(a), new ConstantNode(person), null/* c */, Scope.DEFAULT_CONTEXTS)); } // No dependencies. nsr.setDependsOn(new String[]{}); nsr.setJoinVars(joinVars); } // Main Query { final ProjectionNode projection = new ProjectionNode(); expected.setProjection(projection); projection.addProjectionVar(new VarNode("s")); projection.addProjectionVar(new VarNode("o")); final JoinGroupNode whereClause = new JoinGroupNode(); expected.setWhereClause(whereClause); final NamedSubqueryInclude nsi = new NamedSubqueryInclude(namedSet1); whereClause.addChild(nsi); nsi.setJoinVars(joinVars); whereClause.addChild(new StatementPatternNode(new VarNode("x"), new ConstantNode(rdfsLabel), new VarNode("o"), null/* c */, Scope.DEFAULT_CONTEXTS)); } } final IASTOptimizer rewriter = new ASTNamedSubqueryOptimizer(); final AST2BOpContext context = new AST2BOpContext(new ASTContainer( given), store); final IQueryNode actual = rewriter.optimize(context, new QueryNodeWithBindingSet(given, bsets)).getQueryNode(); assertSameAST(expected, actual); } /** * This unit test is a based on * bigdata-perf/CI/govtrack/queries/query10.rq * *
     * SELECT  ?_var1
     * WITH {
     *         SELECT ?_var1 ?_var6
     *         WHERE {
     *                 ?_var1 a 
     *                 OPTIONAL {
     *                      ?_var1  ?_var6
     *                 }.
     *         }
     * } as %_set1
     * WITH {
     *         SELECT ?_var1 ?_var4 ?_var12
     *         WHERE {
     *            INCLUDE %_set1
     *            OPTIONAL {
     *                 ?_var12  ?_var1.
     *                 ?_var12  ?_var4
     *            }.
     *         }
     * } as %_set2
     * WITH {
     *      SELECT ?_var1 ?_var10 ?_var13
     *      WHERE {
     *         INCLUDE %_set1
     *         OPTIONAL {
     *                 ?_var1  ?_var13.
     *                 ?_var13  ?_var10
     *         }
     *     }
     * } as %_set3
     *  WHERE {
     *         INCLUDE %_set2 . # JOIN ON ()
     *         INCLUDE %_set3 . # JOIN ON (?_var1)
     * }
     * 
* * @see https://sourceforge.net/apps/trac/bigdata/ticket/397 */ public void test_govtrack_query10() { /* * Note: DO NOT share structures in this test!!!! */ final IBindingSet[] bsets = new IBindingSet[]{}; @SuppressWarnings("rawtypes") final IV a = makeIV(RDF.TYPE); @SuppressWarnings("rawtypes") final IV polititian = makeIV(new URIImpl("http://www.rdfabout.com/rdf/schema/politico/Politician")); @SuppressWarnings("rawtypes") final IV name = makeIV(new URIImpl("http://www.rdfabout.com/rdf/schema/usgovt/name")); @SuppressWarnings("rawtypes") final IV sponsor = makeIV(new URIImpl("http://www.rdfabout.com/rdf/schema/usgovt/sponsor")); @SuppressWarnings("rawtypes") final IV title = makeIV(new URIImpl("http://www.rdfabout.com/rdf/schema/usgovt/title")); @SuppressWarnings("rawtypes") final IV N = makeIV(new URIImpl("http://www.w3.org/2001/vcard-rdf/3.0#N")); @SuppressWarnings("rawtypes") final IV family = makeIV(new URIImpl("http://www.w3.org/2001/vcard-rdf/3.0#Family")); // The source AST. final QueryRoot given = new QueryRoot(QueryType.SELECT); { { final ProjectionNode projection = new ProjectionNode(); given.setProjection(projection); projection.addProjectionVar(new VarNode("var1")); } final String set1 = "--nsr-1"; final String set2 = "--nsr-2"; final String set3 = "--nsr-3"; final NamedSubqueriesNode namedSubqueries = new NamedSubqueriesNode(); given.setNamedSubqueries(namedSubqueries); // Required joins and simple optionals lifted into a named subquery. { final NamedSubqueryRoot nsr = new NamedSubqueryRoot( QueryType.SELECT, set1); namedSubqueries.add(nsr); final ProjectionNode projection = new ProjectionNode(); nsr.setProjection(projection); projection.addProjectionVar(new VarNode("var1")); projection.addProjectionVar(new VarNode("var6")); final JoinGroupNode whereClause = new JoinGroupNode(); nsr.setWhereClause(whereClause); // ?_var1 a whereClause.addChild(new StatementPatternNode(new VarNode("var1"), new ConstantNode(a), new ConstantNode(polititian), null/* c */, Scope.DEFAULT_CONTEXTS)); // ?_var1 ?_var6 { final StatementPatternNode sp = new StatementPatternNode( new VarNode("var1"), new ConstantNode(name), new VarNode("var6"), null/* c */, Scope.DEFAULT_CONTEXTS); sp.setOptional(true); whereClause.addChild(sp); } } // First complex optional group. { final NamedSubqueryRoot nsr = new NamedSubqueryRoot( QueryType.SELECT, set2); namedSubqueries.add(nsr); final JoinGroupNode whereClause = new JoinGroupNode(); nsr.setWhereClause(whereClause); final ProjectionNode projection = new ProjectionNode(); nsr.setProjection(projection); projection.addProjectionVar(new VarNode("var1")); projection.addProjectionVar(new VarNode("var6")); // projection.addProjectionVar(new VarNode("var12")); projection.addProjectionVar(new VarNode("var4")); whereClause.addChild(new NamedSubqueryInclude(set1)); { final JoinGroupNode optionalGroup1 = new JoinGroupNode(true/* optional */); whereClause.addChild(optionalGroup1); // ?_var12 ?_var1. optionalGroup1.addChild(new StatementPatternNode(new VarNode( "var12"), new ConstantNode(sponsor), new VarNode( "var1"), null/* c */, Scope.DEFAULT_CONTEXTS)); // ?_var12 ?_var4 optionalGroup1.addChild(new StatementPatternNode(new VarNode( "var12"), new ConstantNode(title), new VarNode( "var4"), null/* c */, Scope.DEFAULT_CONTEXTS)); } } // Second complex optional group. { final NamedSubqueryRoot nsr = new NamedSubqueryRoot( QueryType.SELECT, set3); namedSubqueries.add(nsr); final JoinGroupNode whereClause = new JoinGroupNode(); nsr.setWhereClause(whereClause); final ProjectionNode projection = new ProjectionNode(); nsr.setProjection(projection); projection.addProjectionVar(new VarNode("var1")); projection.addProjectionVar(new VarNode("var6")); // projection.addProjectionVar(new VarNode("var13")); projection.addProjectionVar(new VarNode("var10")); whereClause.addChild(new NamedSubqueryInclude(set1)); { final JoinGroupNode optionalGroup2 = new JoinGroupNode(true/* optional */); whereClause.addChild(optionalGroup2); // ?_var1 ?_var13. optionalGroup2.addChild(new StatementPatternNode( new VarNode("var1"), new ConstantNode(N), new VarNode("var13"), null/* c */, Scope.DEFAULT_CONTEXTS)); // ?_var13 // ?_var10 optionalGroup2.addChild(new StatementPatternNode( new VarNode("var13"), new ConstantNode(family), new VarNode("var10"), null/* c */, Scope.DEFAULT_CONTEXTS)); } } // WHERE { final JoinGroupNode whereClause = new JoinGroupNode(); given.setWhereClause(whereClause); whereClause.addChild(new NamedSubqueryInclude(set2)); whereClause.addChild(new NamedSubqueryInclude(set3)); } } // The expected AST after the rewrite. final QueryRoot expected = new QueryRoot(QueryType.SELECT); final JoinGroupNode complexOpt1; final JoinGroupNode complexOpt2; { { final ProjectionNode projection = new ProjectionNode(); expected.setProjection(projection); projection.addProjectionVar(new VarNode("var1")); } final String set1 = "--nsr-1"; final String set2 = "--nsr-2"; final String set3 = "--nsr-3"; final NamedSubqueriesNode namedSubqueries = new NamedSubqueriesNode(); expected.setNamedSubqueries(namedSubqueries); // Required joins and simple optionals lifted into a named subquery. { final NamedSubqueryRoot nsr = new NamedSubqueryRoot( QueryType.SELECT, set1); namedSubqueries.add(nsr); nsr.setJoinVars(new VarNode[]{/*none*/}); // nsr.setJoinVars(new VarNode[]{new VarNode("var1")}); nsr.setDependsOn(new String[]{}); final ProjectionNode projection = new ProjectionNode(); nsr.setProjection(projection); projection.addProjectionVar(new VarNode("var1")); projection.addProjectionVar(new VarNode("var6")); final JoinGroupNode whereClause = new JoinGroupNode(); nsr.setWhereClause(whereClause); // ?_var1 a whereClause.addChild(new StatementPatternNode(new VarNode("var1"), new ConstantNode(a), new ConstantNode(polititian), null/* c */, Scope.DEFAULT_CONTEXTS)); // ?_var1 ?_var6 { final StatementPatternNode sp = new StatementPatternNode( new VarNode("var1"), new ConstantNode(name), new VarNode("var6"), null/* c */, Scope.DEFAULT_CONTEXTS); sp.setOptional(true); whereClause.addChild(sp); } } // First complex optional group. { final NamedSubqueryRoot nsr = new NamedSubqueryRoot( QueryType.SELECT, set2); namedSubqueries.add(nsr); nsr.setJoinVars(new VarNode[]{/*none*/}); // nsr.setJoinVars(new VarNode[]{new VarNode("var1")}); nsr.setDependsOn(new String[]{set1}); final JoinGroupNode whereClause = new JoinGroupNode(); nsr.setWhereClause(whereClause); final ProjectionNode projection = new ProjectionNode(); nsr.setProjection(projection); projection.addProjectionVar(new VarNode("var1")); projection.addProjectionVar(new VarNode("var6")); // projection.addProjectionVar(new VarNode("var12")); projection.addProjectionVar(new VarNode("var4")); final NamedSubqueryInclude nsi1 = new NamedSubqueryInclude(set1); nsi1.setJoinVars(new VarNode[]{/*none*/}); // nsi1.setJoinVars(new VarNode[]{new VarNode("var1")}); whereClause.addChild(nsi1); { final JoinGroupNode optionalGroup1 = new JoinGroupNode(true/* optional */); whereClause.addChild(optionalGroup1); // ?_var12 ?_var1. optionalGroup1.addChild(new StatementPatternNode(new VarNode( "var12"), new ConstantNode(sponsor), new VarNode( "var1"), null/* c */, Scope.DEFAULT_CONTEXTS)); // ?_var12 ?_var4 optionalGroup1.addChild(new StatementPatternNode(new VarNode( "var12"), new ConstantNode(title), new VarNode( "var4"), null/* c */, Scope.DEFAULT_CONTEXTS)); complexOpt1 = optionalGroup1; } } // Second complex optional group. { final NamedSubqueryRoot nsr = new NamedSubqueryRoot( QueryType.SELECT, set3); namedSubqueries.add(nsr); nsr.setJoinVars(new VarNode[]{new VarNode("var1")}); nsr.setDependsOn(new String[]{set1}); final JoinGroupNode whereClause = new JoinGroupNode(); nsr.setWhereClause(whereClause); final ProjectionNode projection = new ProjectionNode(); nsr.setProjection(projection); projection.addProjectionVar(new VarNode("var1")); projection.addProjectionVar(new VarNode("var6")); // projection.addProjectionVar(new VarNode("var13")); projection.addProjectionVar(new VarNode("var10")); final NamedSubqueryInclude nsi1 = new NamedSubqueryInclude(set1); nsi1.setJoinVars(new VarNode[]{/*none*/}); // nsi1.setJoinVars(new VarNode[]{new VarNode("var1")}); whereClause.addChild(nsi1); { final JoinGroupNode optionalGroup2 = new JoinGroupNode(true/* optional */); whereClause.addChild(optionalGroup2); // ?_var1 ?_var13. optionalGroup2.addChild(new StatementPatternNode( new VarNode("var1"), new ConstantNode(N), new VarNode("var13"), null/* c */, Scope.DEFAULT_CONTEXTS)); // ?_var13 // ?_var10 optionalGroup2.addChild(new StatementPatternNode( new VarNode("var13"), new ConstantNode(family), new VarNode("var10"), null/* c */, Scope.DEFAULT_CONTEXTS)); complexOpt2 = optionalGroup2; } } // WHERE { final JoinGroupNode whereClause = new JoinGroupNode(); expected.setWhereClause(whereClause); final NamedSubqueryInclude nsi2 = new NamedSubqueryInclude(set2); nsi2.setJoinVars(new VarNode[]{/*none*/}); // nsi2.setJoinVars(new VarNode[]{new VarNode("var1")}); whereClause.addChild(nsi2); final NamedSubqueryInclude nsi3 = new NamedSubqueryInclude(set3); nsi3.setJoinVars(new VarNode[]{new VarNode("var1")}); whereClause.addChild(nsi3); } } final IASTOptimizer rewriter = new ASTNamedSubqueryOptimizer(); final AST2BOpContext context = new AST2BOpContext(new ASTContainer( given), store); final IQueryNode actual = rewriter.optimize(context, new QueryNodeWithBindingSet(given, bsets)).getQueryNode(); assertSameAST(expected, actual); final StaticAnalysis sa = new StaticAnalysis(expected, context); // Test "incoming" bindings. assertEquals(asSet(new Var[] { Var.var("var1") }), sa.getDefinitelyIncomingBindings(complexOpt1, new LinkedHashSet>())); // Test "incoming" bindings. assertEquals(asSet(new Var[] { Var.var("var1") }), sa.getDefinitelyIncomingBindings(complexOpt2, new LinkedHashSet>())); // System.err.println(new ASTSubGroupJoinVarOptimizer().optimize(context, // actual/* queryNode */, bsets)); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy