http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/96dd55ec/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest.java b/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest.java index 9428ae4..ce9ef2f 100644 --- a/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest.java +++ b/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest.java @@ -19,12 +19,14 @@ package mvm.rya.indexing.external; * under the License. */ - import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import mvm.rya.indexing.external.tupleSet.ExternalTupleSet; import mvm.rya.indexing.external.tupleSet.SimpleExternalTupleSet; +import mvm.rya.indexing.pcj.matching.PCJOptimizer; import org.junit.Assert; import org.junit.Test; @@ -38,483 +40,386 @@ import org.openrdf.query.parser.ParsedQuery; import org.openrdf.query.parser.sparql.SPARQLParser; import com.beust.jcommander.internal.Lists; +import com.google.common.collect.Sets; public class PrecompJoinOptimizerTest { - private final String q7 = ""// - + "SELECT ?s ?t ?u " // - + "{" // - + " ?s a ?t ."// - + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."// - + " ?u <uri:talksTo> ?s . "// - + "}";// - - private final String q8 = ""// - + "SELECT ?e ?l ?c " // - + "{" // - + " ?e a ?l ."// - + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// - + " ?c <uri:talksTo> ?e . "// - + "}";// - - private final String q9 = ""// - + "SELECT ?f ?m ?d " // - + "{" // - + " ?f a ?m ."// - + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// - + " ?d <uri:talksTo> ?f . "// - + "}";// - - - - - private final String q15 = ""// - + "SELECT ?f ?m ?d ?e ?l ?c " // - + "{" // - + " ?f a ?m ."// - + " ?e a ?l ."// - + " ?d <uri:talksTo> ?f . "// - + " ?c <uri:talksTo> ?e . "// - + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// - + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// - + "}";// - - private final String q16 = ""// - + "SELECT ?f ?m ?d ?e ?l " // - + "{" // - + " ?d <uri:talksTo> ?f . "// - + " ?d <uri:talksTo> ?e . "// - + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// - + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// - + "}";// - - private final String q17 = ""// - + "SELECT ?chicken ?dog ?cat " // - + "{" // - + " ?chicken <uri:talksTo> ?dog . "// - + " ?cat <http://www.w3.org/2000/01/rdf-schema#label> ?chicken ."// - + "}";// - - private final String q18 = ""// - + "SELECT ?dog ?chicken " // - + "{" // - + " ?chicken <uri:talksTo> ?dog . "// - + "}";// - - private final String q19 = ""// - + "SELECT ?cat ?chicken " // - + "{" // - + " ?cat <http://www.w3.org/2000/01/rdf-schema#label> ?chicken ."// - + "}";// - - - private final String q20 = ""// - + "SELECT ?f ?m ?d ?e ?l ?c " // - + "{" // - + " ?f a ?m ."// - + " ?e a ?l ."// - + " ?d <uri:talksTo> ?f . "// - + " ?c <uri:talksTo> ?e . "// - + " ?m <uri:talksTo> ?e . "// - + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// - + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// - + "}";// - - - - private final String q21 = ""// - + "SELECT ?u ?s ?t " // - + "{" // - + " ?s a ?t ."// - + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."// - + " ?u <uri:talksTo> ?s . "// - + "}";// - - - - @Test - public void testSingleIndex() throws Exception { - - final SPARQLParser parser = new SPARQLParser(); - - - final ParsedQuery pq1 = parser.parseQuery(q15, null); - final ParsedQuery pq2 = parser.parseQuery(q7, null); - final ParsedQuery pq3 = parser.parseQuery(q8, null); - final ParsedQuery pq4 = parser.parseQuery(q9, null); - - final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet((Projection) pq2.getTupleExpr()); - final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet((Projection) pq3.getTupleExpr()); - final SimpleExternalTupleSet extTup3 = new SimpleExternalTupleSet((Projection) pq4.getTupleExpr()); - - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - - list.add(extTup1); - - final List<QueryModelNode> optTupNodes = Lists.newArrayList(); - optTupNodes.add(extTup2); - optTupNodes.add(extTup3); - - final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, true); - final TupleExpr te = pq1.getTupleExpr(); - pcj.optimize(te, null, null); - - final NodeCollector nc = new NodeCollector(); - te.visit(nc); - - final List<QueryModelNode> qNodes = nc.getNodes(); - - - Assert.assertEquals(qNodes.size(), optTupNodes.size()); - for(final QueryModelNode node: qNodes) { - Assert.assertTrue(optTupNodes.contains(node)); - } - - - } - - - - - @Test - public void testSingleIndex2() throws Exception { - - final String q1 = ""// - + "SELECT ?f ?m ?d ?e ?l ?c " // - + "{" // - + " ?f a ?m ."// - + " ?c a ?l ."// - + " ?d <uri:talksTo> ?f . "// - + " ?e <uri:talksTo> ?c . "// - + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// - + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?e ."// - + " ?m <uri:talksTo> ?e . "// - + "}";// - - final String q2 = ""// - + "SELECT ?u ?s ?t " // - + "{" // - + " ?s a ?t ."// - + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."// - + " ?u <uri:talksTo> ?s . "// - + "}";// - - final String q3 = ""// - + "SELECT ?e ?c ?l " // - + "{" // - + " ?c a ?l ."// - + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?e ."// - + " ?e <uri:talksTo> ?c . "// - + "}";// - - final String q4 = ""// - + "SELECT ?d ?f ?m " // - + "{" // - + " ?f a ?m ."// - + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// - + " ?d <uri:talksTo> ?f . "// - + "}";// - - final SPARQLParser parser = new SPARQLParser(); - - final ParsedQuery pq1 = parser.parseQuery(q1, null); - final ParsedQuery pq2 = parser.parseQuery(q2, null); - final ParsedQuery pq3 = parser.parseQuery(q3, null); - final ParsedQuery pq4 = parser.parseQuery(q4, null); - - final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet((Projection) pq2.getTupleExpr()); - final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet((Projection) pq3.getTupleExpr()); - final SimpleExternalTupleSet extTup3 = new SimpleExternalTupleSet((Projection) pq4.getTupleExpr()); - - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - - list.add(extTup1); - - final List<StatementPattern> spList = StatementPatternCollector.process(pq1.getTupleExpr()); - final List<QueryModelNode> optTupNodes = Lists.newArrayList(); - optTupNodes.add(extTup3); - optTupNodes.add(spList.get(6)); - optTupNodes.add(extTup2); - - final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, true); - final TupleExpr te = pq1.getTupleExpr(); - pcj.optimize(te, null, null); - - final NodeCollector nc = new NodeCollector(); - te.visit(nc); - - //System.out.println("Optimal plan is " + optimalTup); - - final List<QueryModelNode> qNodes = nc.getNodes(); - //System.out.println("Returned list is " + qNodes + " and comp list is " + optTupNodes); - - Assert.assertTrue(qNodes.equals(optTupNodes)); - - } - - - - - - - - - @Test - public void testTwoIndex() throws Exception { - - final String q1 = ""// - + "SELECT ?f ?m ?d ?h ?i " // - + "{" // - + " ?f a ?m ."// - + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// - + " ?d <uri:talksTo> ?f . "// - + " ?d <uri:hangOutWith> ?f ." // - + " ?f <uri:hangOutWith> ?h ." // - + " ?f <uri:associatesWith> ?i ." // - + " ?i <uri:associatesWith> ?h ." // - + "}";// - - final String q2 = ""// - + "SELECT ?t ?s ?u " // - + "{" // - + " ?s a ?t ."// - + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."// - + " ?u <uri:talksTo> ?s . "// - + "}";// - - final String q3 = ""// - + "SELECT ?s ?t ?u " // - + "{" // - + " ?s <uri:hangOutWith> ?t ." // - + " ?t <uri:hangOutWith> ?u ." // - + "}";// - - final String q4 = ""// - + "SELECT ?s ?t ?u " // - + "{" // - + " ?s <uri:associatesWith> ?t ." // - + " ?t <uri:associatesWith> ?u ." // - + "}";// - - final String q5 = ""// - + "SELECT ?m ?f ?d " // - + "{" // - + " ?f a ?m ."// - + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// - + " ?d <uri:talksTo> ?f . "// - + "}";// - - final String q6 = ""// - + "SELECT ?d ?f ?h " // - + "{" // - + " ?d <uri:hangOutWith> ?f ." // - + " ?f <uri:hangOutWith> ?h ." // - + "}";// - - final String q7 = ""// - + "SELECT ?f ?i ?h " // - + "{" // - + " ?f <uri:associatesWith> ?i ." // - + " ?i <uri:associatesWith> ?h ." // - + "}";// - - final SPARQLParser parser = new SPARQLParser(); - - final ParsedQuery pq1 = parser.parseQuery(q1, null); - final ParsedQuery pq2 = parser.parseQuery(q2, null); - final ParsedQuery pq3 = parser.parseQuery(q3, null); - final ParsedQuery pq4 = parser.parseQuery(q4, null); - final ParsedQuery pq5 = parser.parseQuery(q5, null); - final ParsedQuery pq6 = parser.parseQuery(q6, null); - final ParsedQuery pq7 = parser.parseQuery(q7, null); - - final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet((Projection) pq2.getTupleExpr()); - final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet((Projection) pq3.getTupleExpr()); - final SimpleExternalTupleSet extTup3 = new SimpleExternalTupleSet((Projection) pq4.getTupleExpr()); - final SimpleExternalTupleSet extTup4 = new SimpleExternalTupleSet((Projection) pq5.getTupleExpr()); - final SimpleExternalTupleSet extTup5 = new SimpleExternalTupleSet((Projection) pq6.getTupleExpr()); - final SimpleExternalTupleSet extTup6 = new SimpleExternalTupleSet((Projection) pq7.getTupleExpr()); - - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - - list.add(extTup2); - list.add(extTup1); - list.add(extTup3); - - final List<QueryModelNode> optTupNodes = Lists.newArrayList(); - optTupNodes.add(extTup4); - optTupNodes.add(extTup6); - optTupNodes.add(extTup5); - - final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, true); - final TupleExpr te = pq1.getTupleExpr(); - pcj.optimize(te, null, null); - - System.out.println(te); - - final NodeCollector nc = new NodeCollector(); - te.visit(nc); - - final List<QueryModelNode> qNodes = nc.getNodes(); - - Assert.assertTrue(qNodes.equals(optTupNodes)); - - } - - - - - - - @Test - public void twoIndexFilterTest() { - - - final String q1 = ""// - + "SELECT ?f ?m ?d ?e ?l ?c " // - + "{" // - + " Filter(?f > \"5\")." // - + " Filter(?e > \"5\")." // - + " ?f a ?m ."// - + " ?e a ?l ."// - + " ?d <uri:talksTo> ?f . "// - + " ?c <uri:talksTo> ?e . "// - + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// - + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// - + "}";// - - - final String q2 = ""// - + "SELECT ?s ?t ?u " // - + "{" // - + " ?s a ?t ."// - + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."// - + " ?u <uri:talksTo> ?s . "// - + "}";// - - - final String q3 = ""// - + "SELECT ?s ?t ?u " // - + "{" // - + " Filter(?s > \"5\") ."// - + " ?s a ?t ."// - + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."// - + " ?u <uri:talksTo> ?s . "// - + "}";// - - - - final String q4 = ""// - + "SELECT ?f ?m ?d " // - + "{" // - + " Filter(?f > \"5\") ."// - + " ?f a ?m ."// - + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// - + " ?d <uri:talksTo> ?f . "// - + "}";// - - - final String q5 = ""// - + "SELECT ?e ?l ?c " // - + "{" // - + " Filter(?e > \"5\") ."// - + " ?e a ?l ."// - + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// - + " ?c <uri:talksTo> ?e . "// - + "}";// - - - - - final SPARQLParser parser = new SPARQLParser(); - - ParsedQuery pq1 = null; - ParsedQuery pq2 = null; - ParsedQuery pq3 = null; - ParsedQuery pq4 = null; - ParsedQuery pq5 = null; - - - - try { - pq1 = parser.parseQuery(q1, null); - pq2 = parser.parseQuery(q2, null); - pq3 = parser.parseQuery(q3, null); - pq4 = parser.parseQuery(q4, null); - pq5 = parser.parseQuery(q5, null); - - - } catch (final Exception e) { - e.printStackTrace(); - } - - final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet((Projection) pq2.getTupleExpr()); - final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet((Projection) pq3.getTupleExpr()); - final SimpleExternalTupleSet extTup3 = new SimpleExternalTupleSet((Projection) pq4.getTupleExpr()); - final SimpleExternalTupleSet extTup4 = new SimpleExternalTupleSet((Projection) pq5.getTupleExpr()); - - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - - list.add(extTup2); - list.add(extTup1); - - final List<ExternalTupleSet> list2 = new ArrayList<ExternalTupleSet>(); - - list2.add(extTup3); - list2.add(extTup4); - - final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, true); - final TupleExpr te = pq1.getTupleExpr(); - pcj.optimize(te, null, null); - - System.out.println(te); - - final NodeCollector nc = new NodeCollector(); - te.visit(nc); - - Assert.assertEquals(nc.getNodes().size(), list2.size()); - - for(final QueryModelNode e: nc.getNodes()) { - Assert.assertTrue(list2.contains(e)); - } - - - - } - - - - - - - - - public static class NodeCollector extends QueryModelVisitorBase<RuntimeException> { - - List<QueryModelNode> qNodes = Lists.newArrayList(); - - - public List<QueryModelNode> getNodes() { - return qNodes; - } - - - - @Override - public void meetNode(QueryModelNode node) { - if(node instanceof StatementPattern || node instanceof ExternalTupleSet) { - qNodes.add(node); - } - super.meetNode(node); - - } - - - } - - - - - + @Test + public void testThreeIndex() throws Exception { + + String q7 = ""// + + "SELECT ?s ?t ?u " // + + "{" // + + " ?s a ?t ."// + + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."// + + " ?u <uri:talksTo> ?s . "// + + "}";// + + String q8 = ""// + + "SELECT ?e ?l ?c " // + + "{" // + + " ?e a ?l ."// + + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// + + " ?c <uri:talksTo> ?e . "// + + "}";// + + String q9 = ""// + + "SELECT ?f ?m ?d " // + + "{" // + + " ?f a ?m ."// + + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// + + " ?d <uri:talksTo> ?f . "// + + "}";// + + String q15 = ""// + + "SELECT ?f ?m ?d ?e ?l ?c " // + + "{" // + + " ?f a ?m ."// + + " ?e a ?l ."// + + " ?d <uri:talksTo> ?f . "// + + " ?c <uri:talksTo> ?e . "// + + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// + + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// + + "}";// + + final SPARQLParser parser = new SPARQLParser(); + + final ParsedQuery pq1 = parser.parseQuery(q15, null); + final ParsedQuery pq2 = parser.parseQuery(q7, null); + final ParsedQuery pq3 = parser.parseQuery(q8, null); + final ParsedQuery pq4 = parser.parseQuery(q9, null); + + final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( + (Projection) pq2.getTupleExpr()); + final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( + (Projection) pq3.getTupleExpr()); + final SimpleExternalTupleSet extTup3 = new SimpleExternalTupleSet( + (Projection) pq4.getTupleExpr()); + + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + + list.add(extTup1); + + final List<QueryModelNode> optTupNodes = Lists.newArrayList(); + optTupNodes.add(extTup2); + optTupNodes.add(extTup3); + + final PCJOptimizer pcj = new PCJOptimizer(list, true); + final TupleExpr te = pq1.getTupleExpr(); + pcj.optimize(te, null, null); + + final NodeCollector nc = new NodeCollector(); + te.visit(nc); + + Assert.assertEquals(nc.qNodes.size(), optTupNodes.size()); + for (final QueryModelNode node : nc.qNodes) { + Assert.assertTrue(optTupNodes.contains(node)); + } + + } + + @Test + public void testThreeIndex2() throws Exception { + + final String q1 = ""// + + "SELECT ?f ?m ?d ?e ?l ?c " // + + "{" // + + " ?f a ?m ."// + + " ?c a ?l ."// + + " ?d <uri:talksTo> ?f . "// + + " ?e <uri:talksTo> ?c . "// + + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// + + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?e ."// + + " ?m <uri:talksTo> ?e . "// + + "}";// + + final String q2 = ""// + + "SELECT ?u ?s ?t " // + + "{" // + + " ?s a ?t ."// + + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."// + + " ?u <uri:talksTo> ?s . "// + + "}";// + + final String q3 = ""// + + "SELECT ?e ?c ?l " // + + "{" // + + " ?c a ?l ."// + + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?e ."// + + " ?e <uri:talksTo> ?c . "// + + "}";// + + final String q4 = ""// + + "SELECT ?d ?f ?m " // + + "{" // + + " ?f a ?m ."// + + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// + + " ?d <uri:talksTo> ?f . "// + + "}";// + + final SPARQLParser parser = new SPARQLParser(); + + final ParsedQuery pq1 = parser.parseQuery(q1, null); + final ParsedQuery pq2 = parser.parseQuery(q2, null); + final ParsedQuery pq3 = parser.parseQuery(q3, null); + final ParsedQuery pq4 = parser.parseQuery(q4, null); + + final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( + (Projection) pq2.getTupleExpr()); + final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( + (Projection) pq3.getTupleExpr()); + final SimpleExternalTupleSet extTup3 = new SimpleExternalTupleSet( + (Projection) pq4.getTupleExpr()); + + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + + list.add(extTup1); + + final List<StatementPattern> spList = StatementPatternCollector + .process(pq1.getTupleExpr()); + final List<QueryModelNode> optTupNodes = Lists.newArrayList(); + optTupNodes.add(extTup3); + optTupNodes.add(spList.get(6)); + optTupNodes.add(extTup2); + + final PCJOptimizer pcj = new PCJOptimizer(list, true); + final TupleExpr te = pq1.getTupleExpr(); + pcj.optimize(te, null, null); + + final NodeCollector nc = new NodeCollector(); + te.visit(nc); + + Assert.assertEquals(nc.qNodes, Sets.newHashSet(optTupNodes)); + + } + + @Test + public void testSixIndex() throws Exception { + + final String q1 = ""// + + "SELECT ?f ?m ?d ?h ?i " // + + "{" // + + " ?f a ?m ."// + + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// + + " ?d <uri:talksTo> ?f . "// + + " ?d <uri:hangOutWith> ?f ." // + + " ?f <uri:hangOutWith> ?h ." // + + " ?f <uri:associatesWith> ?i ." // + + " ?i <uri:associatesWith> ?h ." // + + "}";// + + final String q2 = ""// + + "SELECT ?t ?s ?u " // + + "{" // + + " ?s a ?t ."// + + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."// + + " ?u <uri:talksTo> ?s . "// + + "}";// + + final String q3 = ""// + + "SELECT ?s ?t ?u " // + + "{" // + + " ?s <uri:hangOutWith> ?t ." // + + " ?t <uri:hangOutWith> ?u ." // + + "}";// + + final String q4 = ""// + + "SELECT ?s ?t ?u " // + + "{" // + + " ?s <uri:associatesWith> ?t ." // + + " ?t <uri:associatesWith> ?u ." // + + "}";// + + final String q5 = ""// + + "SELECT ?m ?f ?d " // + + "{" // + + " ?f a ?m ."// + + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// + + " ?d <uri:talksTo> ?f . "// + + "}";// + + final String q6 = ""// + + "SELECT ?d ?f ?h " // + + "{" // + + " ?d <uri:hangOutWith> ?f ." // + + " ?f <uri:hangOutWith> ?h ." // + + "}";// + + final String q7 = ""// + + "SELECT ?f ?i ?h " // + + "{" // + + " ?f <uri:associatesWith> ?i ." // + + " ?i <uri:associatesWith> ?h ." // + + "}";// + + final SPARQLParser parser = new SPARQLParser(); + + final ParsedQuery pq1 = parser.parseQuery(q1, null); + final ParsedQuery pq2 = parser.parseQuery(q2, null); + final ParsedQuery pq3 = parser.parseQuery(q3, null); + final ParsedQuery pq4 = parser.parseQuery(q4, null); + final ParsedQuery pq5 = parser.parseQuery(q5, null); + final ParsedQuery pq6 = parser.parseQuery(q6, null); + final ParsedQuery pq7 = parser.parseQuery(q7, null); + + final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( + (Projection) pq2.getTupleExpr()); + final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( + (Projection) pq3.getTupleExpr()); + final SimpleExternalTupleSet extTup3 = new SimpleExternalTupleSet( + (Projection) pq4.getTupleExpr()); + final SimpleExternalTupleSet extTup4 = new SimpleExternalTupleSet( + (Projection) pq5.getTupleExpr()); + final SimpleExternalTupleSet extTup5 = new SimpleExternalTupleSet( + (Projection) pq6.getTupleExpr()); + final SimpleExternalTupleSet extTup6 = new SimpleExternalTupleSet( + (Projection) pq7.getTupleExpr()); + + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + + list.add(extTup2); + list.add(extTup1); + list.add(extTup3); + + final List<QueryModelNode> optTupNodes = Lists.newArrayList(); + optTupNodes.add(extTup4); + optTupNodes.add(extTup6); + optTupNodes.add(extTup5); + + final PCJOptimizer pcj = new PCJOptimizer(list, true); + final TupleExpr te = pq1.getTupleExpr(); + pcj.optimize(te, null, null); + + System.out.println(te); + + final NodeCollector nc = new NodeCollector(); + te.visit(nc); + + Assert.assertEquals(nc.qNodes, Sets.newHashSet(optTupNodes)); + + } + + @Test + public void twoFourIndexWithFilterTest() { + + final String q1 = ""// + + "SELECT ?f ?m ?d ?e ?l ?c " // + + "{" // + + " Filter(?f > \"5\")." // + + " Filter(?e > \"5\")." // + + " ?f a ?m ."// + + " ?e a ?l ."// + + " ?d <uri:talksTo> ?f . "// + + " ?c <uri:talksTo> ?e . "// + + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// + + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// + + "}";// + + final String q2 = ""// + + "SELECT ?s ?t ?u " // + + "{" // + + " ?s a ?t ."// + + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."// + + " ?u <uri:talksTo> ?s . "// + + "}";// + + final String q3 = ""// + + "SELECT ?s ?t ?u " // + + "{" // + + " Filter(?s > \"5\") ."// + + " ?s a ?t ."// + + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."// + + " ?u <uri:talksTo> ?s . "// + + "}";// + + final String q4 = ""// + + "SELECT ?f ?m ?d " // + + "{" // + + " Filter(?f > \"5\") ."// + + " ?f a ?m ."// + + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// + + " ?d <uri:talksTo> ?f . "// + + "}";// + + final String q5 = ""// + + "SELECT ?e ?l ?c " // + + "{" // + + " Filter(?e > \"5\") ."// + + " ?e a ?l ."// + + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// + + " ?c <uri:talksTo> ?e . "// + + "}";// + + final SPARQLParser parser = new SPARQLParser(); + + ParsedQuery pq1 = null; + ParsedQuery pq2 = null; + ParsedQuery pq3 = null; + ParsedQuery pq4 = null; + ParsedQuery pq5 = null; + + try { + pq1 = parser.parseQuery(q1, null); + pq2 = parser.parseQuery(q2, null); + pq3 = parser.parseQuery(q3, null); + pq4 = parser.parseQuery(q4, null); + pq5 = parser.parseQuery(q5, null); + + } catch (final Exception e) { + e.printStackTrace(); + } + + final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( + (Projection) pq2.getTupleExpr()); + final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( + (Projection) pq3.getTupleExpr()); + final SimpleExternalTupleSet extTup3 = new SimpleExternalTupleSet( + (Projection) pq4.getTupleExpr()); + final SimpleExternalTupleSet extTup4 = new SimpleExternalTupleSet( + (Projection) pq5.getTupleExpr()); + + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + + list.add(extTup2); + list.add(extTup1); + + final List<ExternalTupleSet> list2 = new ArrayList<ExternalTupleSet>(); + + list2.add(extTup3); + list2.add(extTup4); + + final PCJOptimizer pcj = new PCJOptimizer(list, true); + final TupleExpr te = pq1.getTupleExpr(); + pcj.optimize(te, null, null); + + System.out.println(te); + + final NodeCollector nc = new NodeCollector(); + te.visit(nc); + + Assert.assertEquals(nc.qNodes.size(), list2.size()); + + for (final QueryModelNode e : nc.qNodes) { + Assert.assertTrue(list2.contains(e)); + } + + } + + public static class NodeCollector extends + QueryModelVisitorBase<RuntimeException> { + + Set<QueryModelNode> qNodes = new HashSet<>(); + + @Override + public void meetNode(QueryModelNode node) { + if (node instanceof StatementPattern + || node instanceof ExternalTupleSet) { + qNodes.add(node); + } + super.meetNode(node); + + } + + } }
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/96dd55ec/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest2.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest2.java b/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest2.java index ea173bb..a9994b1 100644 --- a/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest2.java +++ b/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest2.java @@ -26,6 +26,7 @@ import java.util.Set; import mvm.rya.indexing.external.PcjIntegrationTestingUtil.BindingSetAssignmentCollector; import mvm.rya.indexing.external.tupleSet.ExternalTupleSet; import mvm.rya.indexing.external.tupleSet.SimpleExternalTupleSet; +import mvm.rya.indexing.pcj.matching.PCJOptimizer; import org.junit.Assert; import org.junit.Test; @@ -463,7 +464,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup); final TupleExpr tup = pq1.getTupleExpr().clone(); - final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + final PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); final Set<StatementPattern> qSet = Sets @@ -497,7 +498,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup); final TupleExpr tup = pq1.getTupleExpr().clone(); - final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + final PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); final Set<StatementPattern> qSet = Sets @@ -541,7 +542,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup2); TupleExpr tup = pq1.getTupleExpr().clone(); - PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector @@ -589,7 +590,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup3); TupleExpr tup = pq1.getTupleExpr().clone(); - PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector @@ -623,7 +624,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup); TupleExpr tup = pq1.getTupleExpr().clone(); - PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector @@ -671,7 +672,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup3); TupleExpr tup = pq1.getTupleExpr().clone(); - PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector @@ -721,7 +722,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup1); TupleExpr tup = pq1.getTupleExpr().clone(); - PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector @@ -774,7 +775,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup1); TupleExpr tup = pq1.getTupleExpr().clone(); - PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector @@ -810,7 +811,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup); TupleExpr tup = pq1.getTupleExpr().clone(); - PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector @@ -847,7 +848,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup); TupleExpr tup = pq1.getTupleExpr().clone(); - PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector @@ -886,7 +887,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup2); TupleExpr tup = pq1.getTupleExpr().clone(); - PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector @@ -940,7 +941,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup3); TupleExpr tup = pq1.getTupleExpr().clone(); - PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector @@ -985,7 +986,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup2); TupleExpr tup = pq1.getTupleExpr().clone(); - PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector @@ -1019,7 +1020,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup); TupleExpr tup = pq1.getTupleExpr().clone(); - PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector @@ -1062,7 +1063,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup2); TupleExpr tup = pq1.getTupleExpr().clone(); - PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector @@ -1100,7 +1101,7 @@ public class PrecompJoinOptimizerTest2 { list.add(extTup2); TupleExpr tup = pq1.getTupleExpr().clone(); - PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/96dd55ec/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java b/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java index bae935c..409f92c 100644 --- a/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java +++ b/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java @@ -24,9 +24,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; -import mvm.rya.indexing.external.PrecompJoinOptimizer; import mvm.rya.indexing.external.tupleSet.ExternalTupleSet; import mvm.rya.indexing.external.tupleSet.SimpleExternalTupleSet; +import mvm.rya.indexing.pcj.matching.PCJOptimizer; import org.junit.Assert; import org.junit.Test; @@ -130,12 +130,12 @@ public class PrecompJoinOptimizerVarToConstTest { String q23 = "PREFIX geo: <http://www.opengis.net/ont/geosparql#> "// + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/> "// - + "SELECT ?a ?b ?c ?d " // + + "SELECT ?a ?b ?c " // + "{" // + " ?a a geo:Feature . "// + " ?b a geo:Point . "// + " ?b geo:asWKT ?c . "// - + " FILTER(geof:sfWithin(?c, ?d)) " // + + " FILTER(geof:sfWithin(?c, \"Polygon\")) " // + "}";// @@ -224,7 +224,7 @@ public class PrecompJoinOptimizerVarToConstTest { final TupleExpr tup = pq1.getTupleExpr().clone(); - final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + final PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); System.out.println("Processed query is " + tup); @@ -264,7 +264,7 @@ public class PrecompJoinOptimizerVarToConstTest { list.add(extTup); final TupleExpr tup = pq1.getTupleExpr().clone(); - final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + final PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); System.out.println("Processed query is " + tup); @@ -305,7 +305,7 @@ public class PrecompJoinOptimizerVarToConstTest { list.add(extTup); final TupleExpr tup = pq1.getTupleExpr().clone(); - final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + final PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); System.out.println("Processed query is " + tup); @@ -350,7 +350,7 @@ public class PrecompJoinOptimizerVarToConstTest { list.add(extTup2); final TupleExpr tup = pq1.getTupleExpr().clone(); - final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + final PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); System.out.println("Processed query is " + tup); @@ -399,7 +399,7 @@ public class PrecompJoinOptimizerVarToConstTest { list.add(extTup3); final TupleExpr tup = pq1.getTupleExpr().clone(); - final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, false); + final PCJOptimizer pcj = new PCJOptimizer(list, false); pcj.optimize(tup, null, null); System.out.println("Processed query is " + tup);
