http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c826ffea/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerTest2.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerTest2.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerTest2.java index 35e4ca3..2988ff3 100644 --- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerTest2.java +++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerTest2.java @@ -1,6 +1,4 @@ -package org.apache.rya.indexing.external; - -/* +/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -18,18 +16,27 @@ package org.apache.rya.indexing.external; * specific language governing permissions and limitations * under the License. */ +package org.apache.rya.indexing.external; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Set; +import org.apache.hadoop.conf.Configuration; import org.apache.rya.indexing.external.PcjIntegrationTestingUtil.BindingSetAssignmentCollector; import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet; import org.apache.rya.indexing.external.tupleSet.SimpleExternalTupleSet; +import org.apache.rya.indexing.mongodb.pcj.MongoPcjIndexSetProvider; import org.apache.rya.indexing.pcj.matching.PCJOptimizer; - +import org.apache.rya.indexing.pcj.matching.provider.AbstractPcjIndexSetProvider; +import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider; +import org.apache.rya.mongodb.EmbeddedMongoSingleton; +import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration; import org.junit.Assert; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import org.openrdf.query.algebra.Projection; import org.openrdf.query.algebra.QueryModelNode; import org.openrdf.query.algebra.StatementPattern; @@ -38,1095 +45,1127 @@ import org.openrdf.query.algebra.helpers.StatementPatternCollector; import org.openrdf.query.parser.ParsedQuery; import org.openrdf.query.parser.sparql.SPARQLParser; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; +@RunWith(Parameterized.class) public class PrecompJoinOptimizerTest2 { + private final AbstractPcjIndexSetProvider provider; + + @Parameterized.Parameters + public static Collection providers() throws Exception { + final StatefulMongoDBRdfConfiguration conf = new StatefulMongoDBRdfConfiguration(new Configuration(), EmbeddedMongoSingleton.getNewMongoClient()); + return Lists.<AbstractPcjIndexSetProvider> newArrayList( + new AccumuloIndexSetProvider(new Configuration()), + new MongoPcjIndexSetProvider(conf) + ); + } + + public PrecompJoinOptimizerTest2(final AbstractPcjIndexSetProvider provider) { + this.provider = provider; + } + + private final String queryString = ""// + + "SELECT ?e ?c ?l ?o " // + + "{" // + + " ?e a ?c . "// + + " ?c a ?l . "// + + " ?e <http://www.w3.org/2000/01/rdf-schema#label> ?l . "// + + " ?e <uri:talksTo> ?o "// + + "}";// + + private final String indexSparqlString = ""// + + "SELECT ?x ?y ?z " // + + "{" // + + " ?x <http://www.w3.org/2000/01/rdf-schema#label> ?z. "// + + " ?x a ?y . "// + + " ?y a ?z "// + + "}";// + + private final String q1 = ""// + + "SELECT ?e ?l ?c " // + + "{" // + + " ?e a ?c . "// + + " ?c <http://www.w3.org/2000/01/rdf-schema#label> ?l. "// + + " ?l <uri:talksTo> ?e . "// + + "}";// + + private final String q2 = ""// + + "SELECT ?a ?t ?v " // + + "{" // + + " ?a a ?t . "// + + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?v . "// + + " ?v <uri:talksTo> ?a . "// + + "}";// + + private final String q5 = ""// + + "SELECT ?f ?m ?d ?e ?l ?c ?n ?o ?p ?a ?h ?r " // + + "{" // + + " ?f a ?m ."// + + " ?e a ?l ."// + + " ?n a ?o ."// + + " ?a a ?h ."// + + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// + + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// + + " ?o <http://www.w3.org/2000/01/rdf-schema#label> ?p ."// + + " ?h <http://www.w3.org/2000/01/rdf-schema#label> ?r ."// + + " ?d <uri:talksTo> ?f . "// + + " ?c <uri:talksTo> ?e . "// + + " ?p <uri:talksTo> ?n . "// + + " ?r <uri:talksTo> ?a . "// + + "}";// + + 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 ?f ?m ?d ?e ?l ?c ?n ?o ?p ?a ?h ?r " // + + "{" // + + " ?h <http://www.w3.org/2000/01/rdf-schema#label> ?r ."// + + " ?f a ?m ."// + + " ?p <uri:talksTo> ?n . "// + + " ?e a ?l ."// + + " ?o <http://www.w3.org/2000/01/rdf-schema#label> ?p ."// + + " ?d <uri:talksTo> ?f . "// + + " ?c <uri:talksTo> ?e . "// + + " ?n a ?o ."// + + " ?a a ?h ."// + + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// + + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// + + " ?r <uri:talksTo> ?a . "// + + "}";// + + private final String q11 = ""// + + "SELECT ?f ?m ?d ?e ?l ?c ?n ?o ?p ?a ?h ?r ?x ?y ?w ?t ?duck ?chicken ?pig ?rabbit " // + + "{" // + + " ?w a ?t ."// + + " ?x a ?y ."// + + " ?duck a ?chicken ."// + + " ?pig a ?rabbit ."// + + " ?h <http://www.w3.org/2000/01/rdf-schema#label> ?r ."// + + " ?f a ?m ."// + + " ?p <uri:talksTo> ?n . "// + + " ?e a ?l ."// + + " ?o <http://www.w3.org/2000/01/rdf-schema#label> ?p ."// + + " ?d <uri:talksTo> ?f . "// + + " ?c <uri:talksTo> ?e . "// + + " ?n a ?o ."// + + " ?a a ?h ."// + + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// + + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// + + " ?r <uri:talksTo> ?a . "// + + "}";// + + private final String q12 = ""// + + "SELECT ?b ?p ?dog ?cat " // + + "{" // + + " ?b a ?p ."// + + " ?dog a ?cat. "// + + "}";// + + private final String q13 = ""// + + "SELECT ?f ?m ?d ?e ?l ?c ?n ?o ?p ?a ?h ?r ?x ?y ?w ?t ?duck ?chicken ?pig ?rabbit ?dick ?jane ?betty " // + + "{" // + + " ?w a ?t ."// + + " ?x a ?y ."// + + " ?duck a ?chicken ."// + + " ?pig a ?rabbit ."// + + " ?h <http://www.w3.org/2000/01/rdf-schema#label> ?r ."// + + " ?f a ?m ."// + + " ?p <uri:talksTo> ?n . "// + + " ?e a ?l ."// + + " ?o <http://www.w3.org/2000/01/rdf-schema#label> ?p ."// + + " ?d <uri:talksTo> ?f . "// + + " ?c <uri:talksTo> ?e . "// + + " ?n a ?o ."// + + " ?a a ?h ."// + + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// + + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// + + " ?r <uri:talksTo> ?a . "// + + " ?dick <uri:talksTo> ?jane . "// + + " ?jane <uri:talksTo> ?betty . "// + + "}";// + + private final String q14 = ""// + + "SELECT ?harry ?susan ?mary " // + + "{" // + + " ?harry <uri:talksTo> ?susan . "// + + " ?susan <uri:talksTo> ?mary . "// + + "}";// + + String q15 = ""// + + "SELECT ?a ?b ?c ?d ?e ?f ?q " // + + "{" // + + " GRAPH ?x { " // + + " ?a a ?b ."// + + " ?b <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// + + " ?d <uri:talksTo> ?e . "// + + " FILTER ( ?e < ?f && (?a > ?b || ?c = ?d) ). " // + + " FILTER(bound(?f) && sameTerm(?a,?b)&&bound(?q)). " // + + " ?b a ?q ."// + + " }"// + + "}";// + + String q16 = ""// + + "SELECT ?g ?h ?i " // + + "{" // + + " GRAPH ?y { " // + + " ?g a ?h ."// + + " ?h <http://www.w3.org/2000/01/rdf-schema#label> ?i ."// + + " }"// + + "}";// + + String q17 = ""// + + "SELECT ?j ?k ?l ?m ?n ?o " // + + "{" // + + " GRAPH ?z { " // + + " ?j <uri:talksTo> ?k . "// + + " FILTER ( ?k < ?l && (?m > ?n || ?o = ?j) ). " // + + " }"// + + "}";// + + String q18 = ""// + + "SELECT ?r ?s ?t ?u " // + + "{" // + + " GRAPH ?q { " // + + " FILTER(bound(?r) && sameTerm(?s,?t)&&bound(?u)). " // + + " ?t a ?u ."// + + " }"// + + "}";// + + String q19 = ""// + + "SELECT ?a ?b ?c ?d ?e ?f ?q ?g ?h " // + + "{" // + + " GRAPH ?x { " // + + " ?a a ?b ."// + + " ?b <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// + + " ?d <uri:talksTo> ?e . "// + + " FILTER ( ?e < ?f && (?a > ?b || ?c = ?d) ). " // + + " FILTER(bound(?f) && sameTerm(?a,?b)&&bound(?q)). " // + + " FILTER(?g IN (1,2,3) && ?h NOT IN(5,6,7)). " // + + " ?h <http://www.w3.org/2000/01/rdf-schema#label> ?g. "// + + " ?b a ?q ."// + + " }"// + + "}";// + + String q20 = ""// + + "SELECT ?m ?n " // + + "{" // + + " GRAPH ?q { " // + + " FILTER(?m IN (1,2,3) && ?n NOT IN(5,6,7)). " // + + " ?n <http://www.w3.org/2000/01/rdf-schema#label> ?m. "// + + " }"// + + "}";// + + String q21 = "PREFIX geo: <http://www.opengis.net/ont/geosparql#> "// + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/> "// + + "SELECT ?feature ?point ?wkt " // + + "{" // + + " ?feature a geo:Feature . "// + + " ?feature geo:hasGeometry ?point . "// + + " ?point a geo:Point . "// + + " ?point geo:asWKT ?wkt . "// + + " FILTER(geof:sfWithin(?wkt, \"Polygon\")) " // + + "}";// + + String q22 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// + + "SELECT ?person ?commentmatch ?labelmatch" // + + "{" // + + " ?person a <http://example.org/ontology/Person> . "// + + " ?person <http://www.w3.org/2000/01/rdf-schema#label> ?labelmatch . "// + + " ?person <http://www.w3.org/2000/01/rdf-schema#comment> ?commentmatch . "// + + " FILTER(fts:text(?labelmatch, \"bob\")) . " // + + " FILTER(fts:text(?commentmatch, \"bob\")) " // + + "}";// + + String q23 = "PREFIX geo: <http://www.opengis.net/ont/geosparql#> "// + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/> "// + + "SELECT ?a ?b ?c " // + + "{" // + + " ?a a geo:Feature . "// + + " ?b a geo:Point . "// + + " ?b geo:asWKT ?c . "// + + " FILTER(geof:sfWithin(?c, \"Polygon\")) " // + + "}";// + + String q24 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// + + "SELECT ?f ?g " // + + "{" // + + " ?f <http://www.w3.org/2000/01/rdf-schema#comment> ?g . "// + + " FILTER(fts:text(?g, \"bob\")) " // + + "}";// + + String q25 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// + + "SELECT ?person ?commentmatch ?labelmatch ?point" // + + "{" // + + " ?person a ?point. " // + + " ?person a <http://example.org/ontology/Person> . "// + + " ?person <http://www.w3.org/2000/01/rdf-schema#label> ?labelmatch . "// + + " ?person <http://www.w3.org/2000/01/rdf-schema#comment> ?commentmatch . "// + + " FILTER((?person > ?point) || (?person = ?labelmatch)). " + + " FILTER(fts:text(?labelmatch, \"bob\")) . " // + + " FILTER(fts:text(?commentmatch, \"bob\")) " // + + "}";// + + String q26 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// + + "SELECT ?a ?b ?c " // + + "{" // + + " ?a a ?c. " // + + " ?a a <http://example.org/ontology/Person> . "// + + " ?a <http://www.w3.org/2000/01/rdf-schema#label> ?b . "// + + " FILTER((?a > ?c) || (?a = ?b)). " + + " FILTER(fts:text(?b, \"bob\")) . " // + + "}";// + + String q27 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// + + "PREFIX geo: <http://www.opengis.net/ont/geosparql#> "// + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/> "// + + "SELECT ?person ?commentmatch ?labelmatch ?other ?feature ?point ?wkt ?g ?h" // + + "{" // + + " ?person a <http://example.org/ontology/Person> . "// + + " ?person <http://www.w3.org/2000/01/rdf-schema#label> ?labelmatch . "// + + " ?person <http://www.w3.org/2000/01/rdf-schema#comment> ?commentmatch . "// + + " FILTER((?person > ?other) || (?person = ?labelmatch)). " + + " ?person a ?other. "// + + " FILTER(fts:text(?labelmatch, \"bob\")) . " // + + " FILTER(fts:text(?commentmatch, \"bob\")) " // + + " ?feature a geo:Feature . "// + + " ?point a geo:Point . "// + + " ?point geo:asWKT ?wkt . "// + + " FILTER(geof:sfWithin(?wkt, \"Polygon\")) " // + + " FILTER(?g IN (1,2,3) && ?h NOT IN(5,6,7)). " // + + " ?h <http://www.w3.org/2000/01/rdf-schema#label> ?g. "// + + "}";// + + String q28 = ""// + + "SELECT ?m ?n " // + + "{" // + + " FILTER(?m IN (1,2,3) && ?n NOT IN(5,6,7)). " // + + " ?n <http://www.w3.org/2000/01/rdf-schema#label> ?m. "// + + "}";// + + String q29 = ""// + + "SELECT ?m ?n ?o" // + + "{" // + + " FILTER(?m IN (1,2,3) && ?n NOT IN(5,6,7)). " // + + " ?n <http://www.w3.org/2000/01/rdf-schema#label> ?m. "// + + " ?m a ?o." // + + " FILTER(ISNUMERIC(?o))." + "}";// + + String q30 = ""// + + "SELECT ?pig ?dog ?owl" // + + "{" // + + " FILTER(?pig IN (1,2,3) && ?dog NOT IN(5,6,7)). " // + + " ?dog <http://www.w3.org/2000/01/rdf-schema#label> ?pig. "// + + " ?pig a ?owl. " // + + " FILTER(ISNUMERIC(?owl))." + "}";// + + String q31 = ""// + + "SELECT ?q ?r ?s " // + + "{" // + + " {?q a ?r} UNION {?r a ?s} ."// + + " ?r a ?s ."// + + "}";// + + String q33 = ""// + + "SELECT ?q ?r ?s ?t " // + + "{" // + + " OPTIONAL {?q a ?r} ."// + + " ?s a ?t ."// + + "}";// + + String q34 = ""// + + "SELECT ?q ?r " // + + "{" // + + " FILTER(?q > ?r) ."// + + " ?q a ?r ."// + + "}";// + + String q35 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// + + "SELECT ?s ?t ?u ?v ?w ?x ?y ?z " // + + "{" // + + " FILTER(?s > ?t)."// + + " ?s a ?t ."// + + " FILTER(?u > ?v)."// + + " ?u a ?v ."// + + " ?w <http://www.w3.org/2000/01/rdf-schema#label> ?x ."// + + " FILTER(fts:text(?x, \"bob\")) . " // + + " ?y <http://www.w3.org/2000/01/rdf-schema#label> ?z ."// + + " FILTER(fts:text(?z, \"bob\")) . " // + + "}";// + + String q36 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// + + "SELECT ?dog ?cat " // + + "{" // + + " ?dog <http://www.w3.org/2000/01/rdf-schema#label> ?cat ."// + + " FILTER(fts:text(?cat, \"bob\")) . " // + + "}";// + + String q37 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// + + "SELECT ?s ?t " // + + "{" // + + " FILTER(?s > ?t)."// + + " ?s a ?t ."// + + " FILTER(?s > ?t)."// + + " ?s a ?t ."// + + " FILTER(?s > ?t)."// + + " ?s a ?t ."// + + "}";// + + String q38 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// + + "SELECT ?s ?t " // + + "{" // + + " FILTER(?s > ?t)."// + + " ?s a ?t ."// + + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?s ."// + + " FILTER(?s > ?t)."// + + "}";// + + String q39 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// + + "SELECT ?s ?t " // + + "{" // + + " VALUES(?s) { (<ub:poodle>)(<ub:pitbull>)} ." // + + " ?t <ub:peesOn> <ub:rug> ." // + + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?s ."// + + "}";// + + String q40 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// + + "SELECT ?u ?v " // + + "{" // + + " ?v <ub:peesOn> <ub:rug> ." // + + " ?v <http://www.w3.org/2000/01/rdf-schema#label> ?u ."// + + "}";// + + String q41 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// + + "SELECT ?s ?t ?w ?x" // + + "{" // + + " FILTER(?s > ?t)."// + + " VALUES(?s) { (<ub:poodle>)(<ub:pitbull>)} ." // + + " VALUES(?w) { (<ub:persian>) (<ub:siamese>) } ." // + + " ?t <ub:peesOn> <ub:rug> ." // + + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?s ."// + + " ?w <ub:peesOn> <ub:rug> ." // + + " ?w <http://www.w3.org/2000/01/rdf-schema#label> ?x ."// + + "}";// + + String q42 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// + + "SELECT ?u ?v " // + + "{" // + + " FILTER(?u > ?v)."// + + " ?v <ub:peesOn> <ub:rug> ." // + + " ?v <http://www.w3.org/2000/01/rdf-schema#label> ?u ."// + + "}";// + + String q43 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// + + "SELECT ?a ?b " // + + "{" // + + " ?b <ub:peesOn> <ub:rug> ." // + + " ?b <http://www.w3.org/2000/01/rdf-schema#label> ?a ."// + + "}";// + + @Test + public void testVarRelableIndexSmaller() throws Exception { + + final SPARQLParser parser1 = new SPARQLParser(); + final SPARQLParser parser2 = new SPARQLParser(); + + final ParsedQuery pq1 = parser1.parseQuery(queryString, null); + final ParsedQuery pq2 = parser2.parseQuery(indexSparqlString, null); + + System.out.println("Query is " + pq1.getTupleExpr()); + System.out.println("Index is " + pq2.getTupleExpr()); + + final SimpleExternalTupleSet extTup = new SimpleExternalTupleSet( + new Projection(pq2.getTupleExpr())); + + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + list.add(extTup); + + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); + + final Set<StatementPattern> qSet = Sets + .newHashSet(StatementPatternCollector.process(pq1 + .getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); + + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } + + Assert.assertTrue(qSet.containsAll(set) && set.size() != 0); + } + + @Test + public void testVarRelableIndexSameSize() throws Exception { + + final SPARQLParser parser1 = new SPARQLParser(); + final SPARQLParser parser2 = new SPARQLParser(); + + final ParsedQuery pq1 = parser1.parseQuery(q1, null); + final ParsedQuery pq2 = parser2.parseQuery(q2, null); + + final SimpleExternalTupleSet extTup = new SimpleExternalTupleSet( + new Projection(pq2.getTupleExpr())); + + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + list.add(extTup); + + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); + + final Set<StatementPattern> qSet = Sets + .newHashSet(StatementPatternCollector.process(pq1 + .getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); + + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } + + Assert.assertTrue(set.equals(qSet)); + + } + + @Test + public void testTwoIndexLargeQuery() throws Exception { + + final SPARQLParser parser1 = new SPARQLParser(); + final SPARQLParser parser2 = new SPARQLParser(); + final SPARQLParser parser3 = new SPARQLParser(); + + final ParsedQuery pq1 = parser1.parseQuery(q11, null); + final ParsedQuery pq2 = parser2.parseQuery(q7, null); + final ParsedQuery pq3 = parser3.parseQuery(q12, null); - private final String queryString = ""// - + "SELECT ?e ?c ?l ?o " // - + "{" // - + " ?e a ?c . "// - + " ?c a ?l . "// - + " ?e <http://www.w3.org/2000/01/rdf-schema#label> ?l . "// - + " ?e <uri:talksTo> ?o "// - + "}";// - - private final String indexSparqlString = ""// - + "SELECT ?x ?y ?z " // - + "{" // - + " ?x <http://www.w3.org/2000/01/rdf-schema#label> ?z. "// - + " ?x a ?y . "// - + " ?y a ?z "// - + "}";// - - private final String q1 = ""// - + "SELECT ?e ?l ?c " // - + "{" // - + " ?e a ?c . "// - + " ?c <http://www.w3.org/2000/01/rdf-schema#label> ?l. "// - + " ?l <uri:talksTo> ?e . "// - + "}";// - - private final String q2 = ""// - + "SELECT ?a ?t ?v " // - + "{" // - + " ?a a ?t . "// - + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?v . "// - + " ?v <uri:talksTo> ?a . "// - + "}";// - - private final String q5 = ""// - + "SELECT ?f ?m ?d ?e ?l ?c ?n ?o ?p ?a ?h ?r " // - + "{" // - + " ?f a ?m ."// - + " ?e a ?l ."// - + " ?n a ?o ."// - + " ?a a ?h ."// - + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// - + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// - + " ?o <http://www.w3.org/2000/01/rdf-schema#label> ?p ."// - + " ?h <http://www.w3.org/2000/01/rdf-schema#label> ?r ."// - + " ?d <uri:talksTo> ?f . "// - + " ?c <uri:talksTo> ?e . "// - + " ?p <uri:talksTo> ?n . "// - + " ?r <uri:talksTo> ?a . "// - + "}";// - - 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 ?f ?m ?d ?e ?l ?c ?n ?o ?p ?a ?h ?r " // - + "{" // - + " ?h <http://www.w3.org/2000/01/rdf-schema#label> ?r ."// - + " ?f a ?m ."// - + " ?p <uri:talksTo> ?n . "// - + " ?e a ?l ."// - + " ?o <http://www.w3.org/2000/01/rdf-schema#label> ?p ."// - + " ?d <uri:talksTo> ?f . "// - + " ?c <uri:talksTo> ?e . "// - + " ?n a ?o ."// - + " ?a a ?h ."// - + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// - + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// - + " ?r <uri:talksTo> ?a . "// - + "}";// - - private final String q11 = ""// - + "SELECT ?f ?m ?d ?e ?l ?c ?n ?o ?p ?a ?h ?r ?x ?y ?w ?t ?duck ?chicken ?pig ?rabbit " // - + "{" // - + " ?w a ?t ."// - + " ?x a ?y ."// - + " ?duck a ?chicken ."// - + " ?pig a ?rabbit ."// - + " ?h <http://www.w3.org/2000/01/rdf-schema#label> ?r ."// - + " ?f a ?m ."// - + " ?p <uri:talksTo> ?n . "// - + " ?e a ?l ."// - + " ?o <http://www.w3.org/2000/01/rdf-schema#label> ?p ."// - + " ?d <uri:talksTo> ?f . "// - + " ?c <uri:talksTo> ?e . "// - + " ?n a ?o ."// - + " ?a a ?h ."// - + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// - + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// - + " ?r <uri:talksTo> ?a . "// - + "}";// - - private final String q12 = ""// - + "SELECT ?b ?p ?dog ?cat " // - + "{" // - + " ?b a ?p ."// - + " ?dog a ?cat. "// - + "}";// - - private final String q13 = ""// - + "SELECT ?f ?m ?d ?e ?l ?c ?n ?o ?p ?a ?h ?r ?x ?y ?w ?t ?duck ?chicken ?pig ?rabbit ?dick ?jane ?betty " // - + "{" // - + " ?w a ?t ."// - + " ?x a ?y ."// - + " ?duck a ?chicken ."// - + " ?pig a ?rabbit ."// - + " ?h <http://www.w3.org/2000/01/rdf-schema#label> ?r ."// - + " ?f a ?m ."// - + " ?p <uri:talksTo> ?n . "// - + " ?e a ?l ."// - + " ?o <http://www.w3.org/2000/01/rdf-schema#label> ?p ."// - + " ?d <uri:talksTo> ?f . "// - + " ?c <uri:talksTo> ?e . "// - + " ?n a ?o ."// - + " ?a a ?h ."// - + " ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."// - + " ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// - + " ?r <uri:talksTo> ?a . "// - + " ?dick <uri:talksTo> ?jane . "// - + " ?jane <uri:talksTo> ?betty . "// - + "}";// - - private final String q14 = ""// - + "SELECT ?harry ?susan ?mary " // - + "{" // - + " ?harry <uri:talksTo> ?susan . "// - + " ?susan <uri:talksTo> ?mary . "// - + "}";// - - String q15 = ""// - + "SELECT ?a ?b ?c ?d ?e ?f ?q " // - + "{" // - + " GRAPH ?x { " // - + " ?a a ?b ."// - + " ?b <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// - + " ?d <uri:talksTo> ?e . "// - + " FILTER ( ?e < ?f && (?a > ?b || ?c = ?d) ). " // - + " FILTER(bound(?f) && sameTerm(?a,?b)&&bound(?q)). " // - + " ?b a ?q ."// - + " }"// - + "}";// - - String q16 = ""// - + "SELECT ?g ?h ?i " // - + "{" // - + " GRAPH ?y { " // - + " ?g a ?h ."// - + " ?h <http://www.w3.org/2000/01/rdf-schema#label> ?i ."// - + " }"// - + "}";// - - String q17 = ""// - + "SELECT ?j ?k ?l ?m ?n ?o " // - + "{" // - + " GRAPH ?z { " // - + " ?j <uri:talksTo> ?k . "// - + " FILTER ( ?k < ?l && (?m > ?n || ?o = ?j) ). " // - + " }"// - + "}";// - - String q18 = ""// - + "SELECT ?r ?s ?t ?u " // - + "{" // - + " GRAPH ?q { " // - + " FILTER(bound(?r) && sameTerm(?s,?t)&&bound(?u)). " // - + " ?t a ?u ."// - + " }"// - + "}";// - - String q19 = ""// - + "SELECT ?a ?b ?c ?d ?e ?f ?q ?g ?h " // - + "{" // - + " GRAPH ?x { " // - + " ?a a ?b ."// - + " ?b <http://www.w3.org/2000/01/rdf-schema#label> ?c ."// - + " ?d <uri:talksTo> ?e . "// - + " FILTER ( ?e < ?f && (?a > ?b || ?c = ?d) ). " // - + " FILTER(bound(?f) && sameTerm(?a,?b)&&bound(?q)). " // - + " FILTER(?g IN (1,2,3) && ?h NOT IN(5,6,7)). " // - + " ?h <http://www.w3.org/2000/01/rdf-schema#label> ?g. "// - + " ?b a ?q ."// - + " }"// - + "}";// - - String q20 = ""// - + "SELECT ?m ?n " // - + "{" // - + " GRAPH ?q { " // - + " FILTER(?m IN (1,2,3) && ?n NOT IN(5,6,7)). " // - + " ?n <http://www.w3.org/2000/01/rdf-schema#label> ?m. "// - + " }"// - + "}";// - - String q21 = "PREFIX geo: <http://www.opengis.net/ont/geosparql#> "// - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/> "// - + "SELECT ?feature ?point ?wkt " // - + "{" // - + " ?feature a geo:Feature . "// - + " ?feature geo:hasGeometry ?point . "// - + " ?point a geo:Point . "// - + " ?point geo:asWKT ?wkt . "// - + " FILTER(geof:sfWithin(?wkt, \"Polygon\")) " // - + "}";// - - String q22 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// - + "SELECT ?person ?commentmatch ?labelmatch" // - + "{" // - + " ?person a <http://example.org/ontology/Person> . "// - + " ?person <http://www.w3.org/2000/01/rdf-schema#label> ?labelmatch . "// - + " ?person <http://www.w3.org/2000/01/rdf-schema#comment> ?commentmatch . "// - + " FILTER(fts:text(?labelmatch, \"bob\")) . " // - + " FILTER(fts:text(?commentmatch, \"bob\")) " // - + "}";// - - String q23 = "PREFIX geo: <http://www.opengis.net/ont/geosparql#> "// - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/> "// - + "SELECT ?a ?b ?c " // - + "{" // - + " ?a a geo:Feature . "// - + " ?b a geo:Point . "// - + " ?b geo:asWKT ?c . "// - + " FILTER(geof:sfWithin(?c, \"Polygon\")) " // - + "}";// - - String q24 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// - + "SELECT ?f ?g " // - + "{" // - + " ?f <http://www.w3.org/2000/01/rdf-schema#comment> ?g . "// - + " FILTER(fts:text(?g, \"bob\")) " // - + "}";// - - String q25 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// - + "SELECT ?person ?commentmatch ?labelmatch ?point" // - + "{" // - + " ?person a ?point. " // - + " ?person a <http://example.org/ontology/Person> . "// - + " ?person <http://www.w3.org/2000/01/rdf-schema#label> ?labelmatch . "// - + " ?person <http://www.w3.org/2000/01/rdf-schema#comment> ?commentmatch . "// - + " FILTER((?person > ?point) || (?person = ?labelmatch)). " - + " FILTER(fts:text(?labelmatch, \"bob\")) . " // - + " FILTER(fts:text(?commentmatch, \"bob\")) " // - + "}";// - - String q26 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// - + "SELECT ?a ?b ?c " // - + "{" // - + " ?a a ?c. " // - + " ?a a <http://example.org/ontology/Person> . "// - + " ?a <http://www.w3.org/2000/01/rdf-schema#label> ?b . "// - + " FILTER((?a > ?c) || (?a = ?b)). " - + " FILTER(fts:text(?b, \"bob\")) . " // - + "}";// - - String q27 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// - + "PREFIX geo: <http://www.opengis.net/ont/geosparql#> "// - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/> "// - + "SELECT ?person ?commentmatch ?labelmatch ?other ?feature ?point ?wkt ?g ?h" // - + "{" // - + " ?person a <http://example.org/ontology/Person> . "// - + " ?person <http://www.w3.org/2000/01/rdf-schema#label> ?labelmatch . "// - + " ?person <http://www.w3.org/2000/01/rdf-schema#comment> ?commentmatch . "// - + " FILTER((?person > ?other) || (?person = ?labelmatch)). " - + " ?person a ?other. "// - + " FILTER(fts:text(?labelmatch, \"bob\")) . " // - + " FILTER(fts:text(?commentmatch, \"bob\")) " // - + " ?feature a geo:Feature . "// - + " ?point a geo:Point . "// - + " ?point geo:asWKT ?wkt . "// - + " FILTER(geof:sfWithin(?wkt, \"Polygon\")) " // - + " FILTER(?g IN (1,2,3) && ?h NOT IN(5,6,7)). " // - + " ?h <http://www.w3.org/2000/01/rdf-schema#label> ?g. "// - + "}";// - - String q28 = ""// - + "SELECT ?m ?n " // - + "{" // - + " FILTER(?m IN (1,2,3) && ?n NOT IN(5,6,7)). " // - + " ?n <http://www.w3.org/2000/01/rdf-schema#label> ?m. "// - + "}";// - - String q29 = ""// - + "SELECT ?m ?n ?o" // - + "{" // - + " FILTER(?m IN (1,2,3) && ?n NOT IN(5,6,7)). " // - + " ?n <http://www.w3.org/2000/01/rdf-schema#label> ?m. "// - + " ?m a ?o." // - + " FILTER(ISNUMERIC(?o))." + "}";// - - String q30 = ""// - + "SELECT ?pig ?dog ?owl" // - + "{" // - + " FILTER(?pig IN (1,2,3) && ?dog NOT IN(5,6,7)). " // - + " ?dog <http://www.w3.org/2000/01/rdf-schema#label> ?pig. "// - + " ?pig a ?owl. " // - + " FILTER(ISNUMERIC(?owl))." + "}";// - - String q31 = ""// - + "SELECT ?q ?r ?s " // - + "{" // - + " {?q a ?r} UNION {?r a ?s} ."// - + " ?r a ?s ."// - + "}";// - - String q33 = ""// - + "SELECT ?q ?r ?s ?t " // - + "{" // - + " OPTIONAL {?q a ?r} ."// - + " ?s a ?t ."// - + "}";// - - String q34 = ""// - + "SELECT ?q ?r " // - + "{" // - + " FILTER(?q > ?r) ."// - + " ?q a ?r ."// - + "}";// - - String q35 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// - + "SELECT ?s ?t ?u ?v ?w ?x ?y ?z " // - + "{" // - + " FILTER(?s > ?t)."// - + " ?s a ?t ."// - + " FILTER(?u > ?v)."// - + " ?u a ?v ."// - + " ?w <http://www.w3.org/2000/01/rdf-schema#label> ?x ."// - + " FILTER(fts:text(?x, \"bob\")) . " // - + " ?y <http://www.w3.org/2000/01/rdf-schema#label> ?z ."// - + " FILTER(fts:text(?z, \"bob\")) . " // - + "}";// - - String q36 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// - + "SELECT ?dog ?cat " // - + "{" // - + " ?dog <http://www.w3.org/2000/01/rdf-schema#label> ?cat ."// - + " FILTER(fts:text(?cat, \"bob\")) . " // - + "}";// - - String q37 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// - + "SELECT ?s ?t " // - + "{" // - + " FILTER(?s > ?t)."// - + " ?s a ?t ."// - + " FILTER(?s > ?t)."// - + " ?s a ?t ."// - + " FILTER(?s > ?t)."// - + " ?s a ?t ."// - + "}";// - - String q38 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// - + "SELECT ?s ?t " // - + "{" // - + " FILTER(?s > ?t)."// - + " ?s a ?t ."// - + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?s ."// - + " FILTER(?s > ?t)."// - + "}";// - - String q39 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// - + "SELECT ?s ?t " // - + "{" // - + " VALUES(?s) { (<ub:poodle>)(<ub:pitbull>)} ." // - + " ?t <ub:peesOn> <ub:rug> ." // - + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?s ."// - + "}";// - - String q40 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// - + "SELECT ?u ?v " // - + "{" // - + " ?v <ub:peesOn> <ub:rug> ." // - + " ?v <http://www.w3.org/2000/01/rdf-schema#label> ?u ."// - + "}";// - - String q41 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// - + "SELECT ?s ?t ?w ?x" // - + "{" // - + " FILTER(?s > ?t)."// - + " VALUES(?s) { (<ub:poodle>)(<ub:pitbull>)} ." // - + " VALUES(?w) { (<ub:persian>) (<ub:siamese>) } ." // - + " ?t <ub:peesOn> <ub:rug> ." // - + " ?t <http://www.w3.org/2000/01/rdf-schema#label> ?s ."// - + " ?w <ub:peesOn> <ub:rug> ." // - + " ?w <http://www.w3.org/2000/01/rdf-schema#label> ?x ."// - + "}";// - - String q42 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// - + "SELECT ?u ?v " // - + "{" // - + " FILTER(?u > ?v)."// - + " ?v <ub:peesOn> <ub:rug> ." // - + " ?v <http://www.w3.org/2000/01/rdf-schema#label> ?u ."// - + "}";// - - String q43 = "PREFIX fts: <http://rdf.useekm.com/fts#> "// - + "SELECT ?a ?b " // - + "{" // - + " ?b <ub:peesOn> <ub:rug> ." // - + " ?b <http://www.w3.org/2000/01/rdf-schema#label> ?a ."// - + "}";// - - @Test - public void testVarRelableIndexSmaller() throws Exception { - - final SPARQLParser parser1 = new SPARQLParser(); - final SPARQLParser parser2 = new SPARQLParser(); - - final ParsedQuery pq1 = parser1.parseQuery(queryString, null); - final ParsedQuery pq2 = parser2.parseQuery(indexSparqlString, null); - - System.out.println("Query is " + pq1.getTupleExpr()); - System.out.println("Index is " + pq2.getTupleExpr()); - - final SimpleExternalTupleSet extTup = new SimpleExternalTupleSet( - new Projection(pq2.getTupleExpr())); - - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - list.add(extTup); - - final TupleExpr tup = pq1.getTupleExpr().clone(); - final PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); - - final Set<StatementPattern> qSet = Sets - .newHashSet(StatementPatternCollector.process(pq1 - .getTupleExpr())); - final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); - - final Set<StatementPattern> set = Sets.newHashSet(); - for (final QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } - - Assert.assertTrue(qSet.containsAll(set) && set.size() != 0); - } - - @Test - public void testVarRelableIndexSameSize() throws Exception { - - final SPARQLParser parser1 = new SPARQLParser(); - final SPARQLParser parser2 = new SPARQLParser(); - - final ParsedQuery pq1 = parser1.parseQuery(q1, null); - final ParsedQuery pq2 = parser2.parseQuery(q2, null); - - final SimpleExternalTupleSet extTup = new SimpleExternalTupleSet( - new Projection(pq2.getTupleExpr())); - - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - list.add(extTup); - - final TupleExpr tup = pq1.getTupleExpr().clone(); - final PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); - - final Set<StatementPattern> qSet = Sets - .newHashSet(StatementPatternCollector.process(pq1 - .getTupleExpr())); - final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); - - final Set<StatementPattern> set = Sets.newHashSet(); - for (final QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } - - Assert.assertTrue(set.equals(qSet)); - - } - - @Test - public void testTwoIndexLargeQuery() throws Exception { - - final SPARQLParser parser1 = new SPARQLParser(); - final SPARQLParser parser2 = new SPARQLParser(); - final SPARQLParser parser3 = new SPARQLParser(); - - final ParsedQuery pq1 = parser1.parseQuery(q11, null); - final ParsedQuery pq2 = parser2.parseQuery(q7, null); - final ParsedQuery pq3 = parser3.parseQuery(q12, null); - - System.out.println("Query is " + pq1.getTupleExpr()); - System.out.println("Indexes are " + pq2.getTupleExpr() + " and " - + pq3.getTupleExpr()); - - final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( - (Projection) pq2.getTupleExpr()); - final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( - (Projection) pq3.getTupleExpr()); - - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - list.add(extTup1); - list.add(extTup2); - - TupleExpr tup = pq1.getTupleExpr().clone(); - PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); - - Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector - .process(pq1.getTupleExpr())); - Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); - - Set<StatementPattern> set = Sets.newHashSet(); - for (QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } - - Assert.assertTrue(set.equals(qSet)); - - } - - @Test - public void testThreeIndexLargeQuery() throws Exception { - - final SPARQLParser parser1 = new SPARQLParser(); - final SPARQLParser parser2 = new SPARQLParser(); - final SPARQLParser parser3 = new SPARQLParser(); - final SPARQLParser parser4 = new SPARQLParser(); - - final ParsedQuery pq1 = parser1.parseQuery(q13, null); - final ParsedQuery pq2 = parser2.parseQuery(q5, null); - final ParsedQuery pq3 = parser3.parseQuery(q12, null); - final ParsedQuery pq4 = parser4.parseQuery(q14, null); - - System.out.println("Query is " + pq1.getTupleExpr()); - System.out.println("Indexes are " + pq2.getTupleExpr() + " , " - + pq3.getTupleExpr() + " , " + pq4.getTupleExpr()); - - 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); - list.add(extTup2); - list.add(extTup3); - - TupleExpr tup = pq1.getTupleExpr().clone(); - PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); - - Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector - .process(pq1.getTupleExpr())); - Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); - - Set<StatementPattern> set = Sets.newHashSet(); - for (QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } - - Assert.assertTrue(set.equals(qSet)); - - } - - @Test - public void testSingleIndexLargeQuery() throws Exception { - - final SPARQLParser parser1 = new SPARQLParser(); - final SPARQLParser parser2 = new SPARQLParser(); - - final ParsedQuery pq1 = parser1.parseQuery(q8, null); - final ParsedQuery pq2 = parser2.parseQuery(q7, null); - - final SimpleExternalTupleSet extTup = new SimpleExternalTupleSet( - new Projection(pq2.getTupleExpr())); - - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - list.add(extTup); - - TupleExpr tup = pq1.getTupleExpr().clone(); - PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); - - Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector - .process(pq1.getTupleExpr())); - Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); - - Set<StatementPattern> set = Sets.newHashSet(); - for (QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } - - Assert.assertTrue(set.equals(qSet)); - - } - - @Test - public void testContextFilter1() throws Exception { - - final SPARQLParser parser1 = new SPARQLParser(); - final SPARQLParser parser2 = new SPARQLParser(); - final SPARQLParser parser3 = new SPARQLParser(); - final SPARQLParser parser4 = new SPARQLParser(); - - final ParsedQuery pq1 = parser1.parseQuery(q15, null); - final ParsedQuery pq2 = parser2.parseQuery(q16, null); - final ParsedQuery pq3 = parser3.parseQuery(q17, null); - final ParsedQuery pq4 = parser4.parseQuery(q18, null); - - System.out.println("Query is " + pq1.getTupleExpr()); - System.out.println("Indexes are " + pq2.getTupleExpr() + " , " - + pq3.getTupleExpr() + " , " + pq4.getTupleExpr()); - - 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); - list.add(extTup2); - list.add(extTup3); - - TupleExpr tup = pq1.getTupleExpr().clone(); - PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); - - Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector - .process(pq1.getTupleExpr())); - Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); - - Set<StatementPattern> set = Sets.newHashSet(); - for (QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } - - Assert.assertTrue(qSet.containsAll(set)); - Assert.assertEquals(3, eTupSet.size()); - } - - @Test - public void testGeoFilter() throws Exception { - - final SPARQLParser parser1 = new SPARQLParser(); - final SPARQLParser parser2 = new SPARQLParser(); - - String query1 = "PREFIX geo: <http://www.opengis.net/ont/geosparql#> "// - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/> "// - + "SELECT ?a ?b ?c " // - + "{" // - + " ?a a geo:Feature . "// - + " ?b a geo:Point . "// - + " ?b geo:asWKT ?c . "// - + " FILTER(geof:sfWithin(?b, \"Polygon\")) " // - + "}";// - - String query2 = "PREFIX geo: <http://www.opengis.net/ont/geosparql#> "// - + "SELECT ?f ?g " // - + "{" // - + " ?f a geo:Feature . "// - + " ?g a geo:Point . "// - + "}";// - - final ParsedQuery pq1 = parser1.parseQuery(query1, null); - final ParsedQuery pq2 = parser2.parseQuery(query2, null); - - final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( - (Projection) pq2.getTupleExpr()); - - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - list.add(extTup1); - - TupleExpr tup = pq1.getTupleExpr().clone(); - PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); - - Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector - .process(pq1.getTupleExpr())); - Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); - - Set<StatementPattern> set = Sets.newHashSet(); - for (QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } - - Assert.assertTrue(qSet.containsAll(set) && eTupSet.size() == 1); - } - - @Test - public void testContextFilter2() throws Exception { - - final SPARQLParser parser1 = new SPARQLParser(); - final SPARQLParser parser2 = new SPARQLParser(); - - String query1 = ""// - + "SELECT ?k ?l ?m ?n " // - + "{" // - + " GRAPH ?z { " // - + " ?l <uri:talksTo> ?n . "// - + " ?l a ?n."// - + " ?k a ?m."// - + " FILTER ((?k < ?l) && (?m < ?n)). " // - + " }"// - + "}";// - - String query2 = ""// - + "SELECT ?s ?t " // - + "{" // - + " GRAPH ?r { " // - + " ?s <uri:talksTo> ?t . "// - + " ?s a ?t."// - + " }"// - + "}";// - - final ParsedQuery pq1 = parser1.parseQuery(query1, null); - final ParsedQuery pq2 = parser2.parseQuery(query2, null); - - final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( - (Projection) pq2.getTupleExpr()); - - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - list.add(extTup1); - - TupleExpr tup = pq1.getTupleExpr().clone(); - PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); - - Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector - .process(pq1.getTupleExpr())); - Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); - - Set<StatementPattern> set = Sets.newHashSet(); - for (QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } - - Assert.assertTrue(qSet.containsAll(set) && eTupSet.size() == 1); - } - - @Test - public void testGeoIndexFunction() throws Exception { - - final SPARQLParser parser1 = new SPARQLParser(); - final SPARQLParser parser2 = new SPARQLParser(); - - final ParsedQuery pq1 = parser1.parseQuery(q21, null); - final ParsedQuery pq2 = parser2.parseQuery(q23, null); - - System.out.println("Query is " + pq1.getTupleExpr()); - System.out.println("Index is " + pq2.getTupleExpr()); - - final SimpleExternalTupleSet extTup = new SimpleExternalTupleSet( - new Projection(pq2.getTupleExpr())); - - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - list.add(extTup); - - TupleExpr tup = pq1.getTupleExpr().clone(); - PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); - - Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector - .process(pq1.getTupleExpr())); - Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); - - Set<StatementPattern> set = Sets.newHashSet(); - for (QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } - - Assert.assertTrue(qSet.containsAll(set) && set.size() != 0); - - } - - @Test - public void testFreeTextIndexFunction() throws Exception { - - final SPARQLParser parser1 = new SPARQLParser(); - final SPARQLParser parser2 = new SPARQLParser(); - - final ParsedQuery pq1 = parser1.parseQuery(q22, null); - final ParsedQuery pq2 = parser2.parseQuery(q24, null); - - System.out.println("Query is " + pq1.getTupleExpr()); - System.out.println("Index is " + pq2.getTupleExpr()); - - final SimpleExternalTupleSet extTup = new SimpleExternalTupleSet( - (Projection) pq2.getTupleExpr()); - - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - list.add(extTup); - - TupleExpr tup = pq1.getTupleExpr().clone(); - PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); - - Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector - .process(pq1.getTupleExpr())); - Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); - - Set<StatementPattern> set = Sets.newHashSet(); - for (QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } - - Assert.assertTrue(qSet.containsAll(set) && set.size() != 0); - - } - - @Test - public void testThreeIndexGeoFreeCompareFilterMix() throws Exception { - - final SPARQLParser parser1 = new SPARQLParser(); - final SPARQLParser parser2 = new SPARQLParser(); - final SPARQLParser parser3 = new SPARQLParser(); - - final ParsedQuery pq1 = parser1.parseQuery(q25, null); - final ParsedQuery pq2 = parser2.parseQuery(q24, null); - final ParsedQuery pq3 = parser3.parseQuery(q26, null); - - final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( - new Projection(pq2.getTupleExpr())); - final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( - new Projection(pq3.getTupleExpr())); - - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - list.add(extTup1); - list.add(extTup2); - - TupleExpr tup = pq1.getTupleExpr().clone(); - PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); - - Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector - .process(pq1.getTupleExpr())); - Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); + System.out.println("Query is " + pq1.getTupleExpr()); + System.out.println("Indexes are " + pq2.getTupleExpr() + " and " + + pq3.getTupleExpr()); - Set<StatementPattern> set = Sets.newHashSet(); - for (QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } + final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( + (Projection) pq2.getTupleExpr()); + final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( + (Projection) pq3.getTupleExpr()); - Assert.assertTrue(set.equals(qSet) && eTupSet.size() == 2); + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + list.add(extTup1); + list.add(extTup2); - } + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); - @Test - public void testFourIndexGeoFreeCompareFilterMix() throws Exception { + final Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector + .process(pq1.getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); - final SPARQLParser parser1 = new SPARQLParser(); - final SPARQLParser parser2 = new SPARQLParser(); - final SPARQLParser parser3 = new SPARQLParser(); - final SPARQLParser parser4 = new SPARQLParser(); - final SPARQLParser parser5 = new SPARQLParser(); + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } - final ParsedQuery pq1 = parser1.parseQuery(q27, null); - final ParsedQuery pq2 = parser2.parseQuery(q23, null); - final ParsedQuery pq3 = parser3.parseQuery(q26, null); - final ParsedQuery pq4 = parser4.parseQuery(q24, null); - final ParsedQuery pq5 = parser5.parseQuery(q28, null); + Assert.assertTrue(set.equals(qSet)); - System.out.println("Query is " + pq1.getTupleExpr()); - System.out.println("Indexes are " + pq2.getTupleExpr() + " , " - + pq3.getTupleExpr() + " , " + pq4.getTupleExpr() + " and " - + pq5.getTupleExpr()); + } - final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( - new Projection(pq2.getTupleExpr())); - final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( - new Projection(pq3.getTupleExpr())); - final SimpleExternalTupleSet extTup3 = new SimpleExternalTupleSet( - new Projection(pq4.getTupleExpr())); - final SimpleExternalTupleSet extTup4 = new SimpleExternalTupleSet( - new Projection(pq5.getTupleExpr())); + @Test + public void testThreeIndexLargeQuery() throws Exception { - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - list.add(extTup4); - list.add(extTup1); - list.add(extTup2); - list.add(extTup3); + final SPARQLParser parser1 = new SPARQLParser(); + final SPARQLParser parser2 = new SPARQLParser(); + final SPARQLParser parser3 = new SPARQLParser(); + final SPARQLParser parser4 = new SPARQLParser(); - TupleExpr tup = pq1.getTupleExpr().clone(); - PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); + final ParsedQuery pq1 = parser1.parseQuery(q13, null); + final ParsedQuery pq2 = parser2.parseQuery(q5, null); + final ParsedQuery pq3 = parser3.parseQuery(q12, null); + final ParsedQuery pq4 = parser4.parseQuery(q14, null); - Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector - .process(pq1.getTupleExpr())); - Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); + System.out.println("Query is " + pq1.getTupleExpr()); + System.out.println("Indexes are " + pq2.getTupleExpr() + " , " + + pq3.getTupleExpr() + " , " + pq4.getTupleExpr()); - Set<StatementPattern> set = Sets.newHashSet(); - for (QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } + 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); + list.add(extTup2); + list.add(extTup3); + + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); + + final Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector + .process(pq1.getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); + + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } + + Assert.assertTrue(set.equals(qSet)); + + } + + @Test + public void testSingleIndexLargeQuery() throws Exception { + + final SPARQLParser parser1 = new SPARQLParser(); + final SPARQLParser parser2 = new SPARQLParser(); + + final ParsedQuery pq1 = parser1.parseQuery(q8, null); + final ParsedQuery pq2 = parser2.parseQuery(q7, null); + + final SimpleExternalTupleSet extTup = new SimpleExternalTupleSet( + new Projection(pq2.getTupleExpr())); + + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + list.add(extTup); + + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); + + final Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector + .process(pq1.getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); + + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } + + Assert.assertTrue(set.equals(qSet)); + + } + + @Test + public void testContextFilter1() throws Exception { + + final SPARQLParser parser1 = new SPARQLParser(); + final SPARQLParser parser2 = new SPARQLParser(); + final SPARQLParser parser3 = new SPARQLParser(); + final SPARQLParser parser4 = new SPARQLParser(); + + final ParsedQuery pq1 = parser1.parseQuery(q15, null); + final ParsedQuery pq2 = parser2.parseQuery(q16, null); + final ParsedQuery pq3 = parser3.parseQuery(q17, null); + final ParsedQuery pq4 = parser4.parseQuery(q18, null); + + System.out.println("Query is " + pq1.getTupleExpr()); + System.out.println("Indexes are " + pq2.getTupleExpr() + " , " + + pq3.getTupleExpr() + " , " + pq4.getTupleExpr()); + + 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); + list.add(extTup2); + list.add(extTup3); + + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); + + final Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector + .process(pq1.getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); + + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } + + Assert.assertTrue(qSet.containsAll(set)); + Assert.assertEquals(3, eTupSet.size()); + } + + @Test + public void testGeoFilter() throws Exception { + + final SPARQLParser parser1 = new SPARQLParser(); + final SPARQLParser parser2 = new SPARQLParser(); + + final String query1 = "PREFIX geo: <http://www.opengis.net/ont/geosparql#> "// + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/> "// + + "SELECT ?a ?b ?c " // + + "{" // + + " ?a a geo:Feature . "// + + " ?b a geo:Point . "// + + " ?b geo:asWKT ?c . "// + + " FILTER(geof:sfWithin(?b, \"Polygon\")) " // + + "}";// + + final String query2 = "PREFIX geo: <http://www.opengis.net/ont/geosparql#> "// + + "SELECT ?f ?g " // + + "{" // + + " ?f a geo:Feature . "// + + " ?g a geo:Point . "// + + "}";// + + final ParsedQuery pq1 = parser1.parseQuery(query1, null); + final ParsedQuery pq2 = parser2.parseQuery(query2, null); + + final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( + (Projection) pq2.getTupleExpr()); + + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + list.add(extTup1); + + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); + + final Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector + .process(pq1.getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); + + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } + + Assert.assertTrue(qSet.containsAll(set) && eTupSet.size() == 1); + } + + @Test + public void testContextFilter2() throws Exception { + + final SPARQLParser parser1 = new SPARQLParser(); + final SPARQLParser parser2 = new SPARQLParser(); + + final String query1 = ""// + + "SELECT ?k ?l ?m ?n " // + + "{" // + + " GRAPH ?z { " // + + " ?l <uri:talksTo> ?n . "// + + " ?l a ?n."// + + " ?k a ?m."// + + " FILTER ((?k < ?l) && (?m < ?n)). " // + + " }"// + + "}";// + + final String query2 = ""// + + "SELECT ?s ?t " // + + "{" // + + " GRAPH ?r { " // + + " ?s <uri:talksTo> ?t . "// + + " ?s a ?t."// + + " }"// + + "}";// + + final ParsedQuery pq1 = parser1.parseQuery(query1, null); + final ParsedQuery pq2 = parser2.parseQuery(query2, null); + + final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( + (Projection) pq2.getTupleExpr()); + + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + list.add(extTup1); + + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); + + final Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector + .process(pq1.getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); + + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } + + Assert.assertTrue(qSet.containsAll(set) && eTupSet.size() == 1); + } + + @Test + public void testGeoIndexFunction() throws Exception { + + final SPARQLParser parser1 = new SPARQLParser(); + final SPARQLParser parser2 = new SPARQLParser(); + + final ParsedQuery pq1 = parser1.parseQuery(q21, null); + final ParsedQuery pq2 = parser2.parseQuery(q23, null); + + System.out.println("Query is " + pq1.getTupleExpr()); + System.out.println("Index is " + pq2.getTupleExpr()); + + final SimpleExternalTupleSet extTup = new SimpleExternalTupleSet( + new Projection(pq2.getTupleExpr())); - Assert.assertTrue(set.equals(qSet)); - - } + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + list.add(extTup); - @Test - public void testThreeIndexGeoFreeCompareFilterMix2() throws Exception { + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); - final SPARQLParser parser1 = new SPARQLParser(); - final SPARQLParser parser2 = new SPARQLParser(); - final SPARQLParser parser3 = new SPARQLParser(); - final SPARQLParser parser4 = new SPARQLParser(); - - final ParsedQuery pq1 = parser1.parseQuery(q27, null); - final ParsedQuery pq2 = parser2.parseQuery(q23, null); - final ParsedQuery pq3 = parser3.parseQuery(q26, null); - final ParsedQuery pq4 = parser4.parseQuery(q28, null); - - final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( - new Projection(pq2.getTupleExpr())); - final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( - new Projection(pq3.getTupleExpr())); - final SimpleExternalTupleSet extTup3 = new SimpleExternalTupleSet( - new Projection(pq4.getTupleExpr())); - - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - - list.add(extTup1); - list.add(extTup3); - list.add(extTup2); + final Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector + .process(pq1.getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); + + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } + + Assert.assertTrue(qSet.containsAll(set) && set.size() != 0); - TupleExpr tup = pq1.getTupleExpr().clone(); - PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); + } + + @Test + public void testFreeTextIndexFunction() throws Exception { + + final SPARQLParser parser1 = new SPARQLParser(); + final SPARQLParser parser2 = new SPARQLParser(); + + final ParsedQuery pq1 = parser1.parseQuery(q22, null); + final ParsedQuery pq2 = parser2.parseQuery(q24, null); + + System.out.println("Query is " + pq1.getTupleExpr()); + System.out.println("Index is " + pq2.getTupleExpr()); + + final SimpleExternalTupleSet extTup = new SimpleExternalTupleSet( + (Projection) pq2.getTupleExpr()); + + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + list.add(extTup); + + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); + + final Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector + .process(pq1.getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); + + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } - Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector - .process(pq1.getTupleExpr())); - Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); + Assert.assertTrue(qSet.containsAll(set) && set.size() != 0); - Set<StatementPattern> set = Sets.newHashSet(); - for (QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } + } - Assert.assertTrue(qSet.containsAll(set)); + @Test + public void testThreeIndexGeoFreeCompareFilterMix() throws Exception { - } + final SPARQLParser parser1 = new SPARQLParser(); + final SPARQLParser parser2 = new SPARQLParser(); + final SPARQLParser parser3 = new SPARQLParser(); + + final ParsedQuery pq1 = parser1.parseQuery(q25, null); + final ParsedQuery pq2 = parser2.parseQuery(q24, null); + final ParsedQuery pq3 = parser3.parseQuery(q26, null); + + final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( + new Projection(pq2.getTupleExpr())); + final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( + new Projection(pq3.getTupleExpr())); + + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + list.add(extTup1); + list.add(extTup2); - @Test - public void testISNUMERIC() throws Exception { - - final SPARQLParser parser1 = new SPARQLParser(); - final SPARQLParser parser2 = new SPARQLParser(); - - final ParsedQuery pq1 = parser1.parseQuery(q29, null); - final ParsedQuery pq2 = parser2.parseQuery(q30, null); - - final SimpleExternalTupleSet extTup = new SimpleExternalTupleSet( - new Projection(pq2.getTupleExpr())); - - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - list.add(extTup); + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); + + final Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector + .process(pq1.getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); + + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } + + Assert.assertTrue(set.equals(qSet) && eTupSet.size() == 2); + + } + + @Test + public void testFourIndexGeoFreeCompareFilterMix() throws Exception { + + final SPARQLParser parser1 = new SPARQLParser(); + final SPARQLParser parser2 = new SPARQLParser(); + final SPARQLParser parser3 = new SPARQLParser(); + final SPARQLParser parser4 = new SPARQLParser(); + final SPARQLParser parser5 = new SPARQLParser(); + + final ParsedQuery pq1 = parser1.parseQuery(q27, null); + final ParsedQuery pq2 = parser2.parseQuery(q23, null); + final ParsedQuery pq3 = parser3.parseQuery(q26, null); + final ParsedQuery pq4 = parser4.parseQuery(q24, null); + final ParsedQuery pq5 = parser5.parseQuery(q28, null); - TupleExpr tup = pq1.getTupleExpr().clone(); - PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); + System.out.println("Query is " + pq1.getTupleExpr()); + System.out.println("Indexes are " + pq2.getTupleExpr() + " , " + + pq3.getTupleExpr() + " , " + pq4.getTupleExpr() + " and " + + pq5.getTupleExpr()); - Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector - .process(pq1.getTupleExpr())); - Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); + final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( + new Projection(pq2.getTupleExpr())); + final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( + new Projection(pq3.getTupleExpr())); + final SimpleExternalTupleSet extTup3 = new SimpleExternalTupleSet( + new Projection(pq4.getTupleExpr())); + final SimpleExternalTupleSet extTup4 = new SimpleExternalTupleSet( + new Projection(pq5.getTupleExpr())); + + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + list.add(extTup4); + list.add(extTup1); + list.add(extTup2); + list.add(extTup3); + + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); + + final Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector + .process(pq1.getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); + + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } + + Assert.assertTrue(set.equals(qSet)); + + } + + @Test + public void testThreeIndexGeoFreeCompareFilterMix2() throws Exception { + + final SPARQLParser parser1 = new SPARQLParser(); + final SPARQLParser parser2 = new SPARQLParser(); + final SPARQLParser parser3 = new SPARQLParser(); + final SPARQLParser parser4 = new SPARQLParser(); + + final ParsedQuery pq1 = parser1.parseQuery(q27, null); + final ParsedQuery pq2 = parser2.parseQuery(q23, null); + final ParsedQuery pq3 = parser3.parseQuery(q26, null); + final ParsedQuery pq4 = parser4.parseQuery(q28, null); + + final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( + new Projection(pq2.getTupleExpr())); + final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( + new Projection(pq3.getTupleExpr())); + final SimpleExternalTupleSet extTup3 = new SimpleExternalTupleSet( + new Projection(pq4.getTupleExpr())); + + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + + list.add(extTup1); + list.add(extTup3); + list.add(extTup2); + + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); + + final Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector + .process(pq1.getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); + + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } + + Assert.assertTrue(qSet.containsAll(set)); + + } + + @Test + public void testISNUMERIC() throws Exception { + + final SPARQLParser parser1 = new SPARQLParser(); + final SPARQLParser parser2 = new SPARQLParser(); + + final ParsedQuery pq1 = parser1.parseQuery(q29, null); + final ParsedQuery pq2 = parser2.parseQuery(q30, null); + + final SimpleExternalTupleSet extTup = new SimpleExternalTupleSet( + new Projection(pq2.getTupleExpr())); + + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + list.add(extTup); + + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); + + final Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector + .process(pq1.getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); - Set<StatementPattern> set = Sets.newHashSet(); - for (QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } - Assert.assertTrue(set.equals(qSet) && eTupSet.size() == 1); + Assert.assertTrue(set.equals(qSet) && eTupSet.size() == 1); - } + } - @Test - public void testTwoRepeatedIndex() throws Exception { + @Test + public void testTwoRepeatedIndex() throws Exception { - final SPARQLParser parser1 = new SPARQLParser(); - final SPARQLParser parser2 = new SPARQLParser(); - final SPARQLParser parser3 = new SPARQLParser(); + final SPARQLParser parser1 = new SPARQLParser(); + final SPARQLParser parser2 = new SPARQLParser(); + final SPARQLParser parser3 = new SPARQLParser(); - final ParsedQuery pq1 = parser1.parseQuery(q35, null); - final ParsedQuery pq2 = parser2.parseQuery(q34, null); - final ParsedQuery pq3 = parser3.parseQuery(q36, null); + final ParsedQuery pq1 = parser1.parseQuery(q35, null); + final ParsedQuery pq2 = parser2.parseQuery(q34, null); + final ParsedQuery pq3 = parser3.parseQuery(q36, null); - System.out.println("Query is " + pq1.getTupleExpr()); - System.out.println("Indexes are " + pq2.getTupleExpr() + " and " - + pq3.getTupleExpr()); + System.out.println("Query is " + pq1.getTupleExpr()); + System.out.println("Indexes are " + pq2.getTupleExpr() + " and " + + pq3.getTupleExpr()); - final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( - new Projection(pq2.getTupleExpr())); - final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( - new Projection(pq3.getTupleExpr())); + final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( + new Projection(pq2.getTupleExpr())); + final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( + new Projection(pq3.getTupleExpr())); - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - list.add(extTup1); - list.add(extTup2); + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + list.add(extTup1); + list.add(extTup2); - TupleExpr tup = pq1.getTupleExpr().clone(); - PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); - Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector - .process(pq1.getTupleExpr())); - Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); + final Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector + .process(pq1.getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); - Set<StatementPattern> set = Sets.newHashSet(); - for (QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } - Assert.assertEquals(4, eTupSet.size()); - Assert.assertEquals(qSet, set); + Assert.assertEquals(4, eTupSet.size()); + Assert.assertEquals(qSet, set); - } + } - @Test - public void testBindingSetAssignment2() throws Exception { + @Test + public void testBindingSetAssignment2() throws Exception { - final SPARQLParser parser = new SPARQLParser(); + final SPARQLParser parser = new SPARQLParser(); - final ParsedQuery pq1 = parser.parseQuery(q41, null); - final ParsedQuery pq2 = parser.parseQuery(q42, null); - final ParsedQuery pq3 = parser.parseQuery(q43, null); + final ParsedQuery pq1 = parser.parseQuery(q41, null); + final ParsedQuery pq2 = parser.parseQuery(q42, null); + final ParsedQuery pq3 = parser.parseQuery(q43, null); - final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( - new Projection(pq2.getTupleExpr())); - final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( - new Projection(pq3.getTupleExpr())); + final SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet( + new Projection(pq2.getTupleExpr())); + final SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet( + new Projection(pq3.getTupleExpr())); - final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); - list.add(extTup1); - list.add(extTup2); + final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>(); + list.add(extTup1); + list.add(extTup2); - TupleExpr tup = pq1.getTupleExpr().clone(); - PCJOptimizer pcj = new PCJOptimizer(list, false); - pcj.optimize(tup, null, null); + final TupleExpr tup = pq1.getTupleExpr().clone(); + provider.setIndices(list); + final PCJOptimizer pcj = new PCJOptimizer(list, false, provider); + pcj.optimize(tup, null, null); - Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector - .process(pq1.getTupleExpr())); - Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil - .getTupleSets(tup); + final Set<StatementPattern> qSet = Sets.newHashSet(StatementPatternCollector + .process(pq1.getTupleExpr())); + final Set<QueryModelNode> eTupSet = PcjIntegrationTestingUtil + .getTupleSets(tup); - Set<StatementPattern> set = Sets.newHashSet(); - for (QueryModelNode s : eTupSet) { - set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) - .getTupleExpr())); - } + final Set<StatementPattern> set = Sets.newHashSet(); + for (final QueryModelNode s : eTupSet) { + set.addAll(StatementPatternCollector.process(((ExternalTupleSet) s) + .getTupleExpr())); + } - Assert.assertEquals(2, eTupSet.size()); - Assert.assertEquals(qSet, set); + Assert.assertEquals(2, eTupSet.size()); + Assert.assertEquals(qSet, set); - BindingSetAssignmentCollector bsac1 = new BindingSetAssignmentCollector(); - BindingSetAssignmentCollector bsac2 = new BindingSetAssignmentCollector(); - pq1.getTupleExpr().visit(bsac1); - tup.visit(bsac2); + final BindingSetAssignmentCollector bsac1 = new BindingSetAssignmentCollector(); + final BindingSetAssignmentCollector bsac2 = new BindingSetAssignmentCollector(); + pq1.getTupleExpr().visit(bsac1); + tup.visit(bsac2); - Assert.assertEquals(bsac1.getBindingSetAssignments(), - bsac2.getBindingSetAssignments()); + Assert.assertEquals(bsac1.getBindingSetAssignments(), + bsac2.getBindingSetAssignments()); - } + } }
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/c826ffea/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java index 1b9b408..b3823de 100644 --- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java +++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java @@ -24,10 +24,11 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; +import org.apache.hadoop.conf.Configuration; import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet; import org.apache.rya.indexing.external.tupleSet.SimpleExternalTupleSet; import org.apache.rya.indexing.pcj.matching.PCJOptimizer; - +import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider; import org.junit.Assert; import org.junit.Test; import org.openrdf.query.algebra.Projection; @@ -224,7 +225,7 @@ public class PrecompJoinOptimizerVarToConstTest { final TupleExpr tup = pq1.getTupleExpr().clone(); - final PCJOptimizer pcj = new PCJOptimizer(list, false); + final PCJOptimizer pcj = new PCJOptimizer(list, false, new AccumuloIndexSetProvider(new Configuration(), list)); pcj.optimize(tup, null, null); System.out.println("Processed query is " + tup); @@ -264,7 +265,7 @@ public class PrecompJoinOptimizerVarToConstTest { list.add(extTup); final TupleExpr tup = pq1.getTupleExpr().clone(); - final PCJOptimizer pcj = new PCJOptimizer(list, false); + final PCJOptimizer pcj = new PCJOptimizer(list, false, new AccumuloIndexSetProvider(new Configuration(), list)); pcj.optimize(tup, null, null); System.out.println("Processed query is " + tup); @@ -305,7 +306,7 @@ public class PrecompJoinOptimizerVarToConstTest { list.add(extTup); final TupleExpr tup = pq1.getTupleExpr().clone(); - final PCJOptimizer pcj = new PCJOptimizer(list, false); + final PCJOptimizer pcj = new PCJOptimizer(list, false, new AccumuloIndexSetProvider(new Configuration(), list)); pcj.optimize(tup, null, null); System.out.println("Processed query is " + tup); @@ -350,7 +351,7 @@ public class PrecompJoinOptimizerVarToConstTest { list.add(extTup2); final TupleExpr tup = pq1.getTupleExpr().clone(); - final PCJOptimizer pcj = new PCJOptimizer(list, false); + final PCJOptimizer pcj = new PCJOptimizer(list, false, new AccumuloIndexSetProvider(new Configuration(), list)); pcj.optimize(tup, null, null); System.out.println("Processed query is " + tup); @@ -399,7 +400,7 @@ public class PrecompJoinOptimizerVarToConstTest { list.add(extTup3); final TupleExpr tup = pq1.getTupleExpr().clone(); - final PCJOptimizer pcj = new PCJOptimizer(list, false); + final PCJOptimizer pcj = new PCJOptimizer(list, false, new AccumuloIndexSetProvider(new Configuration(), list)); pcj.optimize(tup, null, null); System.out.println("Processed query is " + tup);
