http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/96dd55ec/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/AccumuloIndexSetTest.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/AccumuloIndexSetTest.java b/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/AccumuloIndexSetTest.java index ed5d37d..f7f249f 100644 --- a/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/AccumuloIndexSetTest.java +++ b/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/AccumuloIndexSetTest.java @@ -18,17 +18,34 @@ */ package mvm.rya.indexing.external.tupleSet; +import info.aduna.iteration.CloseableIteration; + import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import mvm.rya.accumulo.AccumuloRdfConfiguration; +import mvm.rya.api.RdfCloudTripleStoreConfiguration; +import mvm.rya.api.persist.RyaDAOException; +import mvm.rya.api.resolver.RyaTypeResolverException; +import mvm.rya.indexing.accumulo.ConfigUtils; +import mvm.rya.indexing.external.PcjIntegrationTestingUtil; +import mvm.rya.indexing.pcj.matching.QueryVariableNormalizer; +import mvm.rya.rdftriplestore.RyaSailRepository; +import mvm.rya.rdftriplestore.inference.InferenceEngineException; +import mvm.rya.sail.config.RyaSailFactory; + import org.apache.accumulo.core.client.AccumuloException; import org.apache.accumulo.core.client.AccumuloSecurityException; import org.apache.accumulo.core.client.Connector; import org.apache.accumulo.core.client.MutationsRejectedException; +import org.apache.accumulo.core.client.Scanner; import org.apache.accumulo.core.client.TableNotFoundException; import org.apache.accumulo.core.client.admin.TableOperations; +import org.apache.accumulo.core.data.Key; +import org.apache.accumulo.core.security.Authorizations; import org.apache.hadoop.conf.Configuration; import org.apache.rya.indexing.pcj.storage.PcjException; import org.apache.rya.indexing.pcj.storage.accumulo.PcjTableNameFactory; @@ -43,11 +60,13 @@ import org.openrdf.model.impl.NumericLiteralImpl; import org.openrdf.model.impl.StatementImpl; import org.openrdf.model.impl.URIImpl; import org.openrdf.model.vocabulary.XMLSchema; +import org.openrdf.query.Binding; import org.openrdf.query.BindingSet; import org.openrdf.query.MalformedQueryException; import org.openrdf.query.QueryEvaluationException; import org.openrdf.query.algebra.Projection; import org.openrdf.query.algebra.evaluation.QueryBindingSet; +import org.openrdf.query.impl.BindingImpl; import org.openrdf.query.parser.ParsedQuery; import org.openrdf.query.parser.sparql.SPARQLParser; import org.openrdf.repository.RepositoryConnection; @@ -58,639 +77,1823 @@ import com.google.common.base.Optional; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import info.aduna.iteration.CloseableIteration; -import mvm.rya.accumulo.AccumuloRdfConfiguration; -import mvm.rya.api.RdfCloudTripleStoreConfiguration; -import mvm.rya.api.persist.RyaDAOException; -import mvm.rya.api.resolver.RyaTypeResolverException; -import mvm.rya.indexing.accumulo.ConfigUtils; -import mvm.rya.indexing.external.PcjIntegrationTestingUtil; -import mvm.rya.indexing.external.QueryVariableNormalizer; -import mvm.rya.rdftriplestore.RyaSailRepository; -import mvm.rya.rdftriplestore.inference.InferenceEngineException; -import mvm.rya.sail.config.RyaSailFactory; - public class AccumuloIndexSetTest { - protected static Connector accumuloConn = null; - protected RyaSailRepository ryaRepo = null; - protected RepositoryConnection ryaConn = null; - protected Configuration conf = getConf(); - protected String prefix = "rya_"; + protected static Connector accumuloConn = null; + protected RyaSailRepository ryaRepo = null; + protected RepositoryConnection ryaConn = null; + protected Configuration conf = getConf(); + protected String prefix = "rya_"; @Before - public void init() throws AccumuloException, AccumuloSecurityException, RyaDAOException, RepositoryException, TableNotFoundException, InferenceEngineException { + public void init() throws AccumuloException, AccumuloSecurityException, + RyaDAOException, RepositoryException, TableNotFoundException, + InferenceEngineException { accumuloConn = ConfigUtils.getConnector(conf); final TableOperations ops = accumuloConn.tableOperations(); - if(ops.exists(prefix+"INDEX_"+ "testPcj")) { - ops.delete(prefix+"INDEX_"+ "testPcj"); + if (ops.exists(prefix + "INDEX_" + "testPcj")) { + ops.delete(prefix + "INDEX_" + "testPcj"); + } + if (ops.exists(prefix + "spo")) { + ops.delete(prefix + "spo"); + } + if (ops.exists(prefix + "po")) { + ops.delete(prefix + "po"); + } + if (ops.exists(prefix + "osp")) { + ops.delete(prefix + "osp"); } ryaRepo = new RyaSailRepository(RyaSailFactory.getInstance(conf)); ryaRepo.initialize(); ryaConn = ryaRepo.getConnection(); } - /** - * TODO doc - * @throws MutationsRejectedException - * @throws QueryEvaluationException - * @throws SailException - * @throws MalformedQueryException - */ - @Test - public void accumuloIndexSetTestWithEmptyBindingSet() throws RepositoryException, PcjException, TableNotFoundException, - RyaTypeResolverException, MalformedQueryException, SailException, QueryEvaluationException, MutationsRejectedException { - // Load some Triples into Rya. - final Set<Statement> triples = new HashSet<>(); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - - for(final Statement triple : triples) { - ryaConn.add(triple); - } - - // Create a PCJ table will include those triples in its results. - final String sparql = - "SELECT ?name ?age " + - "{" + - "FILTER(?age < 30) ." + - "?name <http://hasAge> ?age." + - "?name <http://playsSport> \"Soccer\" " + - "}"; - - final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj"); - // Create and populate the PCJ table. - PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent()); - - final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, pcjTableName); - - final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(new QueryBindingSet()); - final Set<BindingSet> fetchedResults = new HashSet<BindingSet>(); - while(results.hasNext()) { - fetchedResults.add(results.next()); - } - // Ensure the expected results match those that were stored. - final QueryBindingSet alice = new QueryBindingSet(); - alice.addBinding("name", new URIImpl("http://Alice")); - alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); - - final QueryBindingSet bob = new QueryBindingSet(); - bob.addBinding("name", new URIImpl("http://Bob")); - bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); - - final QueryBindingSet charlie = new QueryBindingSet(); - charlie.addBinding("name", new URIImpl("http://Charlie")); - charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER)); - - final Set<BindingSet> expectedResults = Sets.<BindingSet>newHashSet(alice, bob, charlie); - Assert.assertEquals(expectedResults, fetchedResults); - } + * TODO doc + * + * @throws MutationsRejectedException + * @throws QueryEvaluationException + * @throws SailException + * @throws MalformedQueryException + */ + @Test + public void accumuloIndexSetTestWithEmptyBindingSet() + throws RepositoryException, PcjException, TableNotFoundException, + RyaTypeResolverException, MalformedQueryException, SailException, + QueryEvaluationException, MutationsRejectedException { + // Load some Triples into Rya. + final Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://hasAge"), new NumericLiteralImpl(12, + XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + + for (final Statement triple : triples) { + ryaConn.add(triple); + } + // Create a PCJ table will include those triples in its results. + final String sparql = "SELECT ?name ?age " + "{" + + "FILTER(?age < 30) ." + "?name <http://hasAge> ?age." + + "?name <http://playsSport> \"Soccer\" " + "}"; + + final String pcjTableName = new PcjTableNameFactory().makeTableName( + prefix, "testPcj"); + // Create and populate the PCJ table. + PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, + pcjTableName, sparql, new String[] { "name", "age" }, + Optional.<PcjVarOrderFactory> absent()); + + final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, + pcjTableName); + + final CloseableIteration<BindingSet, QueryEvaluationException> results = ais + .evaluate(new QueryBindingSet()); + final Set<BindingSet> fetchedResults = new HashSet<BindingSet>(); + while (results.hasNext()) { + fetchedResults.add(results.next()); + } + // Ensure the expected results match those that were stored. + final QueryBindingSet alice = new QueryBindingSet(); + alice.addBinding("name", new URIImpl("http://Alice")); + alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); + + final QueryBindingSet bob = new QueryBindingSet(); + bob.addBinding("name", new URIImpl("http://Bob")); + bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); + + final QueryBindingSet charlie = new QueryBindingSet(); + charlie.addBinding("name", new URIImpl("http://Charlie")); + charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER)); + + final Set<BindingSet> expectedResults = Sets.<BindingSet> newHashSet( + alice, bob, charlie); + Assert.assertEquals(expectedResults, fetchedResults); + } /** - * TODO doc - * @throws MutationsRejectedException - * @throws QueryEvaluationException - * @throws SailException - * @throws MalformedQueryException - */ - @Test - public void accumuloIndexSetTestWithBindingSet() throws RepositoryException, PcjException, TableNotFoundException, - RyaTypeResolverException, MalformedQueryException, SailException, QueryEvaluationException, MutationsRejectedException { - // Load some Triples into Rya. - final Set<Statement> triples = new HashSet<>(); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - - for(final Statement triple : triples) { - ryaConn.add(triple); - } - - // Create a PCJ table will include those triples in its results. - final String sparql = - "SELECT ?name ?age " + - "{" + - "FILTER(?age < 30) ." + - "?name <http://hasAge> ?age." + - "?name <http://playsSport> \"Soccer\" " + - "}"; - - final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj"); - - // Create and populate the PCJ table. - PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent()); - - final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, pcjTableName); - - final QueryBindingSet bs = new QueryBindingSet(); - bs.addBinding("name",new URIImpl("http://Alice")); - bs.addBinding("location",new URIImpl("http://Virginia")); - - final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bs); - - bs.addBinding("age",new NumericLiteralImpl(14, XMLSchema.INTEGER)); - Assert.assertEquals(bs, results.next()); - - } - - - @Test - public void accumuloIndexSetTestWithTwoBindingSets() throws RepositoryException, PcjException, TableNotFoundException, - RyaTypeResolverException, MalformedQueryException, SailException, QueryEvaluationException, MutationsRejectedException { - // Load some Triples into Rya. - final Set<Statement> triples = new HashSet<>(); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - - for(final Statement triple : triples) { - ryaConn.add(triple); - } - - // Create a PCJ table will include those triples in its results. - final String sparql = - "SELECT ?name ?age " + - "{" + - "FILTER(?age < 30) ." + - "?name <http://hasAge> ?age." + - "?name <http://playsSport> \"Soccer\" " + - "}"; - - final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj"); - - // Create and populate the PCJ table. - PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent()); - - final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, pcjTableName); - - final QueryBindingSet bs = new QueryBindingSet(); - bs.addBinding("birthDate",new LiteralImpl("1983-03-17",new URIImpl("http://www.w3.org/2001/XMLSchema#date"))); - bs.addBinding("name",new URIImpl("http://Alice")); - - final QueryBindingSet bs2 = new QueryBindingSet(); - bs2.addBinding("birthDate",new LiteralImpl("1983-04-18",new URIImpl("http://www.w3.org/2001/XMLSchema#date"))); - bs2.addBinding("name",new URIImpl("http://Bob")); - - final Set<BindingSet> bSets = Sets.<BindingSet>newHashSet(bs,bs2); - - final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bSets); - - final QueryBindingSet alice = new QueryBindingSet(); - alice.addBinding("name", new URIImpl("http://Alice")); - alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); - alice.addBinding("birthDate", new LiteralImpl("1983-03-17",new URIImpl("http://www.w3.org/2001/XMLSchema#date"))); - - final QueryBindingSet bob = new QueryBindingSet(); - bob.addBinding("name", new URIImpl("http://Bob")); - bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); - bob.addBinding("birthDate", new LiteralImpl("1983-04-18",new URIImpl("http://www.w3.org/2001/XMLSchema#date"))); - - - final Set<BindingSet> fetchedResults = new HashSet<>(); - while(results.hasNext()) { - final BindingSet next = results.next(); - System.out.println(next); - fetchedResults.add(next); - } - - Assert.assertEquals(Sets.<BindingSet>newHashSet(alice,bob), fetchedResults); - } - - - - @Test - public void accumuloIndexSetTestWithNoBindingSet() throws RepositoryException, PcjException, TableNotFoundException, - RyaTypeResolverException, MalformedQueryException, SailException, QueryEvaluationException, MutationsRejectedException { - // Load some Triples into Rya. - final Set<Statement> triples = new HashSet<>(); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - - for(final Statement triple : triples) { - ryaConn.add(triple); - } - - // Create a PCJ table will include those triples in its results. - final String sparql = - "SELECT ?name ?age " + - "{" + - "FILTER(?age < 30) ." + - "?name <http://hasAge> ?age." + - "?name <http://playsSport> \"Soccer\" " + - "}"; - - final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj"); - - // Create and populate the PCJ table. - PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent()); - - final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, pcjTableName); - - final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(new HashSet<BindingSet>()); - - Assert.assertEquals(false, results.hasNext()); - - } - - - @Test - public void accumuloIndexSetTestWithDirectProductBindingSet() throws RepositoryException, PcjException, TableNotFoundException, - RyaTypeResolverException, MalformedQueryException, SailException, QueryEvaluationException, MutationsRejectedException { - // Load some Triples into Rya. - final Set<Statement> triples = new HashSet<>(); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - - for(final Statement triple : triples) { - ryaConn.add(triple); - } - - // Create a PCJ table will include those triples in its results. - final String sparql = - "SELECT ?name ?age " + - "{" + - "FILTER(?age < 30) ." + - "?name <http://hasAge> ?age." + - "?name <http://playsSport> \"Soccer\" " + - "}"; - - final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj"); - - // Create and populate the PCJ table. - PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent()); - - final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, pcjTableName); - - final QueryBindingSet bs = new QueryBindingSet(); - bs.addBinding("birthDate",new LiteralImpl("1983-03-17",new URIImpl("http://www.w3.org/2001/XMLSchema#date"))); - bs.addBinding("location",new URIImpl("http://Virginia")); - - final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bs); - - final QueryBindingSet alice = new QueryBindingSet(); - alice.addBinding("name", new URIImpl("http://Alice")); - alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); - alice.addAll(bs); - - final QueryBindingSet bob = new QueryBindingSet(); - bob.addBinding("name", new URIImpl("http://Bob")); - bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); - bob.addAll(bs); - - final QueryBindingSet charlie = new QueryBindingSet(); - charlie.addBinding("name", new URIImpl("http://Charlie")); - charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER)); - charlie.addAll(bs); - - final Set<BindingSet> fetchedResults = new HashSet<>(); - while(results.hasNext()) { - fetchedResults.add(results.next()); - } - Assert.assertEquals(3,fetchedResults.size()); - Assert.assertEquals(Sets.<BindingSet>newHashSet(alice,bob,charlie), fetchedResults); - } - - @Test - public void accumuloIndexSetTestWithTwoDirectProductBindingSet() throws RepositoryException, PcjException, TableNotFoundException, - RyaTypeResolverException, MalformedQueryException, SailException, QueryEvaluationException, MutationsRejectedException { - // Load some Triples into Rya. - final Set<Statement> triples = new HashSet<>(); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - - for(final Statement triple : triples) { - ryaConn.add(triple); - } - - // Create a PCJ table will include those triples in its results. - final String sparql = - "SELECT ?name ?age " + - "{" + - "FILTER(?age < 30) ." + - "?name <http://hasAge> ?age." + - "?name <http://playsSport> \"Soccer\" " + - "}"; - - final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj"); - - // Create and populate the PCJ table. - PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent()); - - final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, pcjTableName); - - final QueryBindingSet bs = new QueryBindingSet(); - bs.addBinding("birthDate",new LiteralImpl("1983-03-17",new URIImpl("http://www.w3.org/2001/XMLSchema#date"))); - bs.addBinding("location",new URIImpl("http://Virginia")); - - final QueryBindingSet bs2 = new QueryBindingSet(); - bs2.addBinding("birthDate",new LiteralImpl("1983-04-18",new URIImpl("http://www.w3.org/2001/XMLSchema#date"))); - bs2.addBinding("location",new URIImpl("http://Georgia")); - - final Set<BindingSet> bSets = Sets.<BindingSet>newHashSet(bs,bs2); - - final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bSets); - - final QueryBindingSet alice1 = new QueryBindingSet(); - alice1.addBinding("name", new URIImpl("http://Alice")); - alice1.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); - alice1.addAll(bs); - - final QueryBindingSet bob1 = new QueryBindingSet(); - bob1.addBinding("name", new URIImpl("http://Bob")); - bob1.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); - bob1.addAll(bs); - - final QueryBindingSet charlie1 = new QueryBindingSet(); - charlie1.addBinding("name", new URIImpl("http://Charlie")); - charlie1.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER)); - charlie1.addAll(bs); - - final QueryBindingSet alice2 = new QueryBindingSet(); - alice2.addBinding("name", new URIImpl("http://Alice")); - alice2.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); - alice2.addAll(bs2); - - final QueryBindingSet bob2 = new QueryBindingSet(); - bob2.addBinding("name", new URIImpl("http://Bob")); - bob2.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); - bob2.addAll(bs2); - - final QueryBindingSet charlie2 = new QueryBindingSet(); - charlie2.addBinding("name", new URIImpl("http://Charlie")); - charlie2.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER)); - charlie2.addAll(bs2); - - final Set<BindingSet> fetchedResults = new HashSet<>(); - while(results.hasNext()) { - final BindingSet next = results.next(); - System.out.println(next); - fetchedResults.add(next); - } - - Assert.assertEquals(Sets.<BindingSet>newHashSet(alice1,bob1,charlie1,alice2,bob2,charlie2), fetchedResults); - } - - - - @Test - public void accumuloIndexSetTestWithTwoDirectProductBindingSetsWithMapping() throws RepositoryException, PcjException, TableNotFoundException, - RyaTypeResolverException, MalformedQueryException, SailException, QueryEvaluationException, MutationsRejectedException { - // Load some Triples into Rya. - final Set<Statement> triples = new HashSet<>(); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - - for(final Statement triple : triples) { - ryaConn.add(triple); - } - - // Create a PCJ table will include those triples in its results. - final String sparql = - "SELECT ?name ?age " + - "{" + - "FILTER(?age < 30) ." + - "?name <http://hasAge> ?age." + - "?name <http://playsSport> \"Soccer\" " + - "}"; - - final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj"); - - // Create and populate the PCJ table. - PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent()); - - final String sparql2 = - "SELECT ?x ?y " + - "{" + - "FILTER(?y < 30) ." + - "?x <http://hasAge> ?y." + - "?x <http://playsSport> \"Soccer\" " + - "}"; - - final SPARQLParser p = new SPARQLParser(); - final ParsedQuery pq = p.parseQuery(sparql2, null); - - final Map<String,String> map = new HashMap<>(); - map.put("x", "name"); - map.put("y", "age"); - final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, pcjTableName); - ais.setProjectionExpr((Projection) pq.getTupleExpr()); - ais.setTableVarMap(map); - ais.setSupportedVariableOrderMap(Lists.<String>newArrayList("x;y","y;x")); - - final QueryBindingSet bs = new QueryBindingSet(); - bs.addBinding("birthDate",new LiteralImpl("1983-03-17",new URIImpl("http://www.w3.org/2001/XMLSchema#date"))); - bs.addBinding("x",new URIImpl("http://Alice")); - - final QueryBindingSet bs2 = new QueryBindingSet(); - bs2.addBinding("birthDate",new LiteralImpl("1983-04-18",new URIImpl("http://www.w3.org/2001/XMLSchema#date"))); - bs2.addBinding("x",new URIImpl("http://Bob")); - - final Set<BindingSet> bSets = Sets.<BindingSet>newHashSet(bs,bs2); - - final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bSets); - - final QueryBindingSet alice = new QueryBindingSet(); - alice.addBinding("x", new URIImpl("http://Alice")); - alice.addBinding("y", new NumericLiteralImpl(14, XMLSchema.INTEGER)); - alice.addBinding("birthDate", new LiteralImpl("1983-03-17",new URIImpl("http://www.w3.org/2001/XMLSchema#date"))); - - final QueryBindingSet bob = new QueryBindingSet(); - bob.addBinding("x", new URIImpl("http://Bob")); - bob.addBinding("y", new NumericLiteralImpl(16, XMLSchema.INTEGER)); - bob.addBinding("birthDate", new LiteralImpl("1983-04-18",new URIImpl("http://www.w3.org/2001/XMLSchema#date"))); - - - final Set<BindingSet> fetchedResults = new HashSet<>(); - while(results.hasNext()) { - final BindingSet next = results.next(); - System.out.println(next); - fetchedResults.add(next); - } - - Assert.assertEquals(Sets.<BindingSet>newHashSet(alice,bob), fetchedResults); - } - - - - @Test - public void accumuloIndexSetTestWithTwoDirectProductBindingSetsWithConstantMapping() throws Exception { - // Load some Triples into Rya. - final Set<Statement> triples = new HashSet<>(); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - - for(final Statement triple : triples) { - ryaConn.add(triple); - } - - // Create a PCJ table will include those triples in its results. - final String sparql = - "SELECT ?name ?age " + - "{" + - "?name <http://hasAge> ?age." + - "?name <http://playsSport> \"Soccer\" " + - "}"; + * TODO doc + * + * @throws MutationsRejectedException + * @throws QueryEvaluationException + * @throws SailException + * @throws MalformedQueryException + */ + @Test + public void accumuloIndexSetTestWithBindingSet() + throws RepositoryException, PcjException, TableNotFoundException, + RyaTypeResolverException, MalformedQueryException, SailException, + QueryEvaluationException, MutationsRejectedException { + // Load some Triples into Rya. + final Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://hasAge"), new NumericLiteralImpl(12, + XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + + for (final Statement triple : triples) { + ryaConn.add(triple); + } - final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj"); + // Create a PCJ table will include those triples in its results. + final String sparql = "SELECT ?name ?age " + "{" + + "FILTER(?age < 30) ." + "?name <http://hasAge> ?age." + + "?name <http://playsSport> \"Soccer\" " + "}"; - // Create and populate the PCJ table. - PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent()); + final String pcjTableName = new PcjTableNameFactory().makeTableName( + prefix, "testPcj"); - final String sparql2 = - "SELECT ?x " + - "{" + - "?x <http://hasAge> 16 ." + - "?x <http://playsSport> \"Soccer\" " + - "}"; + // Create and populate the PCJ table. + PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, + pcjTableName, sparql, new String[] { "name", "age" }, + Optional.<PcjVarOrderFactory> absent()); - final SPARQLParser p = new SPARQLParser(); - final ParsedQuery pq1 = p.parseQuery(sparql, null); - final ParsedQuery pq2 = p.parseQuery(sparql2, null); + final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, + pcjTableName); - final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, pcjTableName); - ais.setProjectionExpr((Projection) QueryVariableNormalizer.getNormalizedIndex(pq2.getTupleExpr(), pq1.getTupleExpr()).get(0)); + final QueryBindingSet bs = new QueryBindingSet(); + bs.addBinding("name", new URIImpl("http://Alice")); + bs.addBinding("location", new URIImpl("http://Virginia")); - final QueryBindingSet bs = new QueryBindingSet(); - bs.addBinding("birthDate",new LiteralImpl("1983-03-17",new URIImpl("http://www.w3.org/2001/XMLSchema#date"))); - bs.addBinding("x",new URIImpl("http://Alice")); + final CloseableIteration<BindingSet, QueryEvaluationException> results = ais + .evaluate(bs); - final QueryBindingSet bs2 = new QueryBindingSet(); - bs2.addBinding("birthDate",new LiteralImpl("1983-04-18",new URIImpl("http://www.w3.org/2001/XMLSchema#date"))); - bs2.addBinding("x",new URIImpl("http://Bob")); + bs.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); + Assert.assertEquals(bs, results.next()); - final Set<BindingSet> bSets = Sets.<BindingSet>newHashSet(bs,bs2); + } + + @Test + public void accumuloIndexSetTestWithTwoBindingSets() + throws RepositoryException, PcjException, TableNotFoundException, + RyaTypeResolverException, MalformedQueryException, SailException, + QueryEvaluationException, MutationsRejectedException { + // Load some Triples into Rya. + final Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://hasAge"), new NumericLiteralImpl(12, + XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + + for (final Statement triple : triples) { + ryaConn.add(triple); + } + + // Create a PCJ table will include those triples in its results. + final String sparql = "SELECT ?name ?age " + "{" + + "FILTER(?age < 30) ." + "?name <http://hasAge> ?age." + + "?name <http://playsSport> \"Soccer\" " + "}"; + + final String pcjTableName = new PcjTableNameFactory().makeTableName( + prefix, "testPcj"); + + // Create and populate the PCJ table. + PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, + pcjTableName, sparql, new String[] { "name", "age" }, + Optional.<PcjVarOrderFactory> absent()); + + final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, + pcjTableName); + + final QueryBindingSet bs = new QueryBindingSet(); + bs.addBinding("birthDate", new LiteralImpl("1983-03-17", new URIImpl( + "http://www.w3.org/2001/XMLSchema#date"))); + bs.addBinding("name", new URIImpl("http://Alice")); + + final QueryBindingSet bs2 = new QueryBindingSet(); + bs2.addBinding("birthDate", new LiteralImpl("1983-04-18", new URIImpl( + "http://www.w3.org/2001/XMLSchema#date"))); + bs2.addBinding("name", new URIImpl("http://Bob")); + + final Set<BindingSet> bSets = Sets.<BindingSet> newHashSet(bs, bs2); + + final CloseableIteration<BindingSet, QueryEvaluationException> results = ais + .evaluate(bSets); + + final QueryBindingSet alice = new QueryBindingSet(); + alice.addBinding("name", new URIImpl("http://Alice")); + alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); + alice.addBinding("birthDate", new LiteralImpl("1983-03-17", + new URIImpl("http://www.w3.org/2001/XMLSchema#date"))); + + final QueryBindingSet bob = new QueryBindingSet(); + bob.addBinding("name", new URIImpl("http://Bob")); + bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); + bob.addBinding("birthDate", new LiteralImpl("1983-04-18", new URIImpl( + "http://www.w3.org/2001/XMLSchema#date"))); + + final Set<BindingSet> fetchedResults = new HashSet<>(); + while (results.hasNext()) { + final BindingSet next = results.next(); + System.out.println(next); + fetchedResults.add(next); + } + + Assert.assertEquals(Sets.<BindingSet> newHashSet(alice, bob), + fetchedResults); + } + + @Test + public void accumuloIndexSetTestWithNoBindingSet() + throws RepositoryException, PcjException, TableNotFoundException, + RyaTypeResolverException, MalformedQueryException, SailException, + QueryEvaluationException, MutationsRejectedException { + // Load some Triples into Rya. + final Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://hasAge"), new NumericLiteralImpl(12, + XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + + for (final Statement triple : triples) { + ryaConn.add(triple); + } + + // Create a PCJ table will include those triples in its results. + final String sparql = "SELECT ?name ?age " + "{" + + "FILTER(?age < 30) ." + "?name <http://hasAge> ?age." + + "?name <http://playsSport> \"Soccer\" " + "}"; + + final String pcjTableName = new PcjTableNameFactory().makeTableName( + prefix, "testPcj"); + + // Create and populate the PCJ table. + PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, + pcjTableName, sparql, new String[] { "name", "age" }, + Optional.<PcjVarOrderFactory> absent()); + + final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, + pcjTableName); + + final CloseableIteration<BindingSet, QueryEvaluationException> results = ais + .evaluate(new HashSet<BindingSet>()); + + Assert.assertEquals(false, results.hasNext()); - final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bSets); + } + + @Test + public void multipleCommonVarBindingTest() throws RepositoryException, + PcjException, TableNotFoundException, RyaTypeResolverException, + MalformedQueryException, SailException, QueryEvaluationException, + MutationsRejectedException { + // Load some Triples into Rya. + final Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://hasAge"), new NumericLiteralImpl(12, + XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + + for (final Statement triple : triples) { + ryaConn.add(triple); + } - final Set<BindingSet> fetchedResults = new HashSet<>(); - while(results.hasNext()) { - final BindingSet next = results.next(); - fetchedResults.add(next); - } + // Create a PCJ table will include those triples in its results. + final String sparql = "SELECT ?name ?age " + "{" + + "FILTER(?age < 30) ." + "?name <http://hasAge> ?age." + + "?name <http://playsSport> \"Soccer\" " + "}"; - Assert.assertEquals(Sets.<BindingSet>newHashSet(bs2), fetchedResults); - } + final String pcjTableName = new PcjTableNameFactory().makeTableName( + prefix, "testPcj"); + // Create and populate the PCJ table. + PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, + pcjTableName, sparql, new String[] { "name", "age" }, + Optional.<PcjVarOrderFactory> absent()); + final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, + pcjTableName); - @Test - public void accumuloIndexSetTestAttemptJoinAccrossTypes() throws Exception { - // Load some Triples into Rya. - final Set<Statement> triples = new HashSet<>(); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) ); - triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) ); + final QueryBindingSet bs = new QueryBindingSet(); + bs.addBinding("birthDate", new LiteralImpl("1983-03-17", new URIImpl( + "http://www.w3.org/2001/XMLSchema#date"))); + bs.addBinding("location", new URIImpl("http://Virginia")); - for(final Statement triple : triples) { - ryaConn.add(triple); - } + final CloseableIteration<BindingSet, QueryEvaluationException> results = ais + .evaluate(bs); - // Create a PCJ table will include those triples in its results. - final String sparql = - "SELECT ?name ?age " + - "{" + - "?name <http://hasAge> ?age." + - "?name <http://playsSport> \"Soccer\" " + - "}"; + final QueryBindingSet alice = new QueryBindingSet(); + alice.addBinding("name", new URIImpl("http://Alice")); + alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); + alice.addAll(bs); - final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj"); + final QueryBindingSet bob = new QueryBindingSet(); + bob.addBinding("name", new URIImpl("http://Bob")); + bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); + bob.addAll(bs); - // Create and populate the PCJ table. - PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent()); - final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn,pcjTableName); + final QueryBindingSet charlie = new QueryBindingSet(); + charlie.addBinding("name", new URIImpl("http://Charlie")); + charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER)); + charlie.addAll(bs); - final QueryBindingSet bs1 = new QueryBindingSet(); - bs1.addBinding("age",new LiteralImpl("16")); - final QueryBindingSet bs2 = new QueryBindingSet(); - bs2.addBinding("age",new NumericLiteralImpl(14, XMLSchema.INTEGER)); + final Set<BindingSet> fetchedResults = new HashSet<>(); + while (results.hasNext()) { + fetchedResults.add(results.next()); + } + Assert.assertEquals(3, fetchedResults.size()); + Assert.assertEquals(Sets.<BindingSet> newHashSet(alice, bob, charlie), + fetchedResults); + } - final Set<BindingSet> bSets = Sets.<BindingSet>newHashSet(bs1,bs2); + @Test + public void manyCommonVarBindingTest() throws RepositoryException, + PcjException, TableNotFoundException, RyaTypeResolverException, + MalformedQueryException, SailException, QueryEvaluationException, + MutationsRejectedException { + // Load some Triples into Rya. + final Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://hasAge"), new NumericLiteralImpl(12, + XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + + for (final Statement triple : triples) { + ryaConn.add(triple); + } - final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bSets); + // Create a PCJ table will include those triples in its results. + final String sparql = "SELECT ?name ?age " + "{" + + "FILTER(?age < 30) ." + "?name <http://hasAge> ?age." + + "?name <http://playsSport> \"Soccer\" " + "}"; + + final String pcjTableName = new PcjTableNameFactory().makeTableName( + prefix, "testPcj"); + + // Create and populate the PCJ table. + PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, + pcjTableName, sparql, new String[] { "name", "age" }, + Optional.<PcjVarOrderFactory> absent()); + + final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, + pcjTableName); + + final QueryBindingSet bs = new QueryBindingSet(); + bs.addBinding("birthDate", new LiteralImpl("1983-03-17", new URIImpl( + "http://www.w3.org/2001/XMLSchema#date"))); + bs.addBinding("location", new URIImpl("http://Virginia")); + + final QueryBindingSet bs2 = new QueryBindingSet(); + bs2.addBinding("birthDate", new LiteralImpl("1983-04-18", new URIImpl( + "http://www.w3.org/2001/XMLSchema#date"))); + bs2.addBinding("location", new URIImpl("http://Georgia")); + + final Set<BindingSet> bSets = Sets.<BindingSet> newHashSet(bs, bs2); + + final CloseableIteration<BindingSet, QueryEvaluationException> results = ais + .evaluate(bSets); + + final QueryBindingSet alice1 = new QueryBindingSet(); + alice1.addBinding("name", new URIImpl("http://Alice")); + alice1.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); + alice1.addAll(bs); + + final QueryBindingSet bob1 = new QueryBindingSet(); + bob1.addBinding("name", new URIImpl("http://Bob")); + bob1.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); + bob1.addAll(bs); + + final QueryBindingSet charlie1 = new QueryBindingSet(); + charlie1.addBinding("name", new URIImpl("http://Charlie")); + charlie1.addBinding("age", + new NumericLiteralImpl(12, XMLSchema.INTEGER)); + charlie1.addAll(bs); + + final QueryBindingSet alice2 = new QueryBindingSet(); + alice2.addBinding("name", new URIImpl("http://Alice")); + alice2.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); + alice2.addAll(bs2); + + final QueryBindingSet bob2 = new QueryBindingSet(); + bob2.addBinding("name", new URIImpl("http://Bob")); + bob2.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); + bob2.addAll(bs2); + + final QueryBindingSet charlie2 = new QueryBindingSet(); + charlie2.addBinding("name", new URIImpl("http://Charlie")); + charlie2.addBinding("age", + new NumericLiteralImpl(12, XMLSchema.INTEGER)); + charlie2.addAll(bs2); + + final Set<BindingSet> fetchedResults = new HashSet<>(); + while (results.hasNext()) { + final BindingSet next = results.next(); + System.out.println(next); + fetchedResults.add(next); + } - final Set<BindingSet> fetchedResults = new HashSet<>(); - while(results.hasNext()) { - final BindingSet next = results.next(); - fetchedResults.add(next); - } + Assert.assertEquals(Sets.<BindingSet> newHashSet(alice1, bob1, + charlie1, alice2, bob2, charlie2), fetchedResults); + } - bs2.addBinding("name", new URIImpl("http://Alice")); - Assert.assertEquals(Sets.<BindingSet>newHashSet(bs2), fetchedResults); - } + @Test + public void variableNormalizationTest() throws RepositoryException, + PcjException, TableNotFoundException, RyaTypeResolverException, + MalformedQueryException, SailException, QueryEvaluationException, + MutationsRejectedException { + // Load some Triples into Rya. + final Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://hasAge"), new NumericLiteralImpl(12, + XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + + for (final Statement triple : triples) { + ryaConn.add(triple); + } + + // Create a PCJ table will include those triples in its results. + final String sparql = "SELECT ?name ?age " + "{" + + "FILTER(?age < 30) ." + "?name <http://hasAge> ?age." + + "?name <http://playsSport> \"Soccer\" " + "}"; + + final String pcjTableName = new PcjTableNameFactory().makeTableName( + prefix, "testPcj"); + + // Create and populate the PCJ table. + PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, + pcjTableName, sparql, new String[] { "name", "age" }, + Optional.<PcjVarOrderFactory> absent()); + + final String sparql2 = "SELECT ?x ?y " + "{" + "FILTER(?y < 30) ." + + "?x <http://hasAge> ?y." + + "?x <http://playsSport> \"Soccer\" " + "}"; + + final SPARQLParser p = new SPARQLParser(); + final ParsedQuery pq = p.parseQuery(sparql2, null); + + final Map<String, String> map = new HashMap<>(); + map.put("x", "name"); + map.put("y", "age"); + final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, + pcjTableName); + ais.setProjectionExpr((Projection) pq.getTupleExpr()); + ais.setTableVarMap(map); + ais.setSupportedVariableOrderMap(Lists.<String> newArrayList("x;y", + "y;x")); + + final QueryBindingSet bs = new QueryBindingSet(); + bs.addBinding("birthDate", new LiteralImpl("1983-03-17", new URIImpl( + "http://www.w3.org/2001/XMLSchema#date"))); + bs.addBinding("x", new URIImpl("http://Alice")); + + final QueryBindingSet bs2 = new QueryBindingSet(); + bs2.addBinding("birthDate", new LiteralImpl("1983-04-18", new URIImpl( + "http://www.w3.org/2001/XMLSchema#date"))); + bs2.addBinding("x", new URIImpl("http://Bob")); + + final Set<BindingSet> bSets = Sets.<BindingSet> newHashSet(bs, bs2); + + final CloseableIteration<BindingSet, QueryEvaluationException> results = ais + .evaluate(bSets); + + final QueryBindingSet alice = new QueryBindingSet(); + alice.addBinding("x", new URIImpl("http://Alice")); + alice.addBinding("y", new NumericLiteralImpl(14, XMLSchema.INTEGER)); + alice.addBinding("birthDate", new LiteralImpl("1983-03-17", + new URIImpl("http://www.w3.org/2001/XMLSchema#date"))); + + final QueryBindingSet bob = new QueryBindingSet(); + bob.addBinding("x", new URIImpl("http://Bob")); + bob.addBinding("y", new NumericLiteralImpl(16, XMLSchema.INTEGER)); + bob.addBinding("birthDate", new LiteralImpl("1983-04-18", new URIImpl( + "http://www.w3.org/2001/XMLSchema#date"))); + + final Set<BindingSet> fetchedResults = new HashSet<>(); + while (results.hasNext()) { + final BindingSet next = results.next(); + System.out.println(next); + fetchedResults.add(next); + } + + Assert.assertEquals(Sets.<BindingSet> newHashSet(alice, bob), + fetchedResults); + } + + @Test + public void variableInstantiationTest() throws Exception { + // Load some Triples into Rya. + final Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://hasAge"), new NumericLiteralImpl(12, + XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Charlie"), + new URIImpl("http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Eve"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + + for (final Statement triple : triples) { + ryaConn.add(triple); + } + // Create a PCJ table will include those triples in its results. + final String sparql = "SELECT ?name ?age " + "{" + + "?name <http://hasAge> ?age." + + "?name <http://playsSport> \"Soccer\" " + "}"; + final String pcjTableName = new PcjTableNameFactory().makeTableName( + prefix, "testPcj"); + // Create and populate the PCJ table. + PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, + pcjTableName, sparql, new String[] { "name", "age" }, + Optional.<PcjVarOrderFactory> absent()); + final String sparql2 = "SELECT ?x " + "{" + "?x <http://hasAge> 16 ." + + "?x <http://playsSport> \"Soccer\" " + "}"; + final SPARQLParser p = new SPARQLParser(); + final ParsedQuery pq1 = p.parseQuery(sparql, null); + final ParsedQuery pq2 = p.parseQuery(sparql2, null); + + final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, + pcjTableName); + ais.setProjectionExpr((Projection) QueryVariableNormalizer + .getNormalizedIndex(pq2.getTupleExpr(), pq1.getTupleExpr()) + .get(0)); + + final QueryBindingSet bs = new QueryBindingSet(); + bs.addBinding("birthDate", new LiteralImpl("1983-03-17", new URIImpl( + "http://www.w3.org/2001/XMLSchema#date"))); + bs.addBinding("x", new URIImpl("http://Alice")); + + final QueryBindingSet bs2 = new QueryBindingSet(); + bs2.addBinding("birthDate", new LiteralImpl("1983-04-18", new URIImpl( + "http://www.w3.org/2001/XMLSchema#date"))); + bs2.addBinding("x", new URIImpl("http://Bob")); + + final Set<BindingSet> bSets = Sets.<BindingSet> newHashSet(bs, bs2); + + final CloseableIteration<BindingSet, QueryEvaluationException> results = ais + .evaluate(bSets); + + final Set<BindingSet> fetchedResults = new HashSet<>(); + while (results.hasNext()) { + final BindingSet next = results.next(); + fetchedResults.add(next); + } + + Assert.assertEquals(Sets.<BindingSet> newHashSet(bs2), fetchedResults); + } + + @Test + public void accumuloIndexSetTestAttemptJoinAccrossTypes() throws Exception { + // Load some Triples into Rya. + final Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + + for (final Statement triple : triples) { + ryaConn.add(triple); + } + + // Create a PCJ table will include those triples in its results. + final String sparql = "SELECT ?name ?age " + "{" + + "?name <http://hasAge> ?age." + + "?name <http://playsSport> \"Soccer\" " + "}"; + + final String pcjTableName = new PcjTableNameFactory().makeTableName( + prefix, "testPcj"); + + // Create and populate the PCJ table. + PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, + pcjTableName, sparql, new String[] { "name", "age" }, + Optional.<PcjVarOrderFactory> absent()); + AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, pcjTableName); + + final QueryBindingSet bs1 = new QueryBindingSet(); + bs1.addBinding("age", new LiteralImpl("16")); + final QueryBindingSet bs2 = new QueryBindingSet(); + bs2.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); + + final Set<BindingSet> bSets = Sets.<BindingSet> newHashSet(bs1, bs2); + + final CloseableIteration<BindingSet, QueryEvaluationException> results = ais + .evaluate(bSets); + + final Set<BindingSet> fetchedResults = new HashSet<>(); + while (results.hasNext()) { + final BindingSet next = results.next(); + fetchedResults.add(next); + } + + bs2.addBinding("name", new URIImpl("http://Alice")); + Assert.assertEquals(Sets.<BindingSet> newHashSet(bs2), fetchedResults); + } + + @Test + public void optionalBindingSetTest() throws Exception { + // Load some Triples into Rya. + final Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(32, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + + for (final Statement triple : triples) { + ryaConn.add(triple); + } + + // Create a PCJ table will include those triples in its results. + final String sparql = "SELECT ?name ?age " + "{" + + "?name <http://hasAge> ?age." + + "?name <http://playsSport> \"Soccer\" " + "}"; + + final String pcjTableName = new PcjTableNameFactory().makeTableName( + prefix, "testPcj"); + + // Create and populate the PCJ table. + PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, + pcjTableName, sparql, new String[] { "name", "age" }, + Optional.<PcjVarOrderFactory> absent()); + AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, pcjTableName); + + final QueryBindingSet bs1 = new QueryBindingSet(); + bs1.addBinding("name", new URIImpl("http://Alice")); + final QueryBindingSet bs2 = new QueryBindingSet(); + bs2.addBinding("name", new URIImpl("http://Bob")); + bs2.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); + + final List<BindingSet> bSets = Lists + .<BindingSet> newArrayList(bs1, bs2); + + final CloseableIteration<BindingSet, QueryEvaluationException> results = ais + .evaluate(bSets); + + Binding exBinding1 = new BindingImpl("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); + Binding exBinding2 = new BindingImpl("name", new URIImpl("http://Alice")); + Binding exBinding5 = new BindingImpl("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); + Binding exBinding6 = new BindingImpl("name", new URIImpl("http://Bob")); + + QueryBindingSet pcjBs1 = new QueryBindingSet(); + pcjBs1.addBinding(exBinding1); + pcjBs1.addBinding(exBinding2); + + QueryBindingSet pcjBs2 = new QueryBindingSet(); + pcjBs2.addBinding(exBinding5); + pcjBs2.addBinding(exBinding6); + + Set<BindingSet> expectedResults = new HashSet<>(); + expectedResults.add(pcjBs1); + expectedResults.add(pcjBs2); + + final Set<BindingSet> fetchedResults = new HashSet<>(); + while (results.hasNext()) { + final BindingSet next = results.next(); + fetchedResults.add(next); + } + + Assert.assertEquals(expectedResults, fetchedResults); + } + + @Test + public void variableCommonVarOrderLenWithCrossProductTest() + throws Exception { + // Load some Triples into Rya. + final Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(32, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + + for (final Statement triple : triples) { + ryaConn.add(triple); + } + + // Create a PCJ table will include those triples in its results. + final String sparql = "SELECT ?name ?age " + "{" + + "?name <http://hasAge> ?age." + + "?name <http://playsSport> \"Soccer\" " + "}"; + + final String pcjTableName = new PcjTableNameFactory().makeTableName( + prefix, "testPcj"); + + // Create and populate the PCJ table. + PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, + pcjTableName, sparql, new String[] { "name", "age" }, + Optional.<PcjVarOrderFactory> absent()); + AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, pcjTableName); + + QueryBindingSet bs1 = new QueryBindingSet(); + bs1.addBinding("name", new URIImpl("http://Alice")); + QueryBindingSet bs2 = new QueryBindingSet(); + bs2.addBinding("name", new URIImpl("http://Bob")); + bs2.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); + QueryBindingSet bs3 = new QueryBindingSet(); + bs3.addBinding("location", new URIImpl("http://Virginia")); + + final List<BindingSet> bSets = Lists.<BindingSet> newArrayList(bs1, + bs2, bs3); + + final CloseableIteration<BindingSet, QueryEvaluationException> results = ais + .evaluate(bSets); + + Binding exBinding1 = new BindingImpl("age", new NumericLiteralImpl(14, XMLSchema.INTEGER)); + Binding exBinding2 = new BindingImpl("name", new URIImpl("http://Alice")); + Binding exBinding5 = new BindingImpl("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); + Binding exBinding6 = new BindingImpl("name", new URIImpl("http://Bob")); + Binding exBinding3 = new BindingImpl("age", new NumericLiteralImpl(32, XMLSchema.INTEGER)); + Binding exBinding4 = new BindingImpl("name", new URIImpl("http://Bob")); + + QueryBindingSet pcjBs1 = new QueryBindingSet(); + pcjBs1.addBinding(exBinding1); + pcjBs1.addBinding(exBinding2); + + QueryBindingSet pcjBs2 = new QueryBindingSet(); + pcjBs2.addBinding(exBinding5); + pcjBs2.addBinding(exBinding6); + + QueryBindingSet pcjBs3 = new QueryBindingSet(); + pcjBs3.addBinding(exBinding3); + pcjBs3.addBinding(exBinding4); + + QueryBindingSet exBs1 = new QueryBindingSet(bs3); + exBs1.addAll(pcjBs1); + QueryBindingSet exBs2 = new QueryBindingSet(bs3); + exBs2.addAll(pcjBs2); + QueryBindingSet exBs3 = new QueryBindingSet(bs3); + exBs3.addAll(pcjBs3); + + Set<BindingSet> expectedResults = new HashSet<>(); + expectedResults.add(exBs1); + expectedResults.add(exBs2); + expectedResults.add(exBs3); + expectedResults.add(pcjBs1); + expectedResults.add(pcjBs2); + + + final Set<BindingSet> fetchedResults = new HashSet<>(); + while (results.hasNext()) { + BindingSet next = results.next(); + fetchedResults.add(next); + } + + Assert.assertEquals(expectedResults, fetchedResults); + } + + @Test + public void variableCommonVarOrderLenCrossProductTestWithConstantInstantiation() + throws Exception { + // Load some Triples into Rya. + final Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(32, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + + for (final Statement triple : triples) { + ryaConn.add(triple); + } + + // Create a PCJ table will include those triples in its results. + final String sparql = "SELECT ?name ?age " + "{" + + "?name <http://hasAge> ?age." + + "?name <http://playsSport> \"Soccer\" " + "}"; + + final String pcjTableName = new PcjTableNameFactory().makeTableName( + prefix, "testPcj"); + + // Create and populate the PCJ table. + PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, + pcjTableName, sparql, new String[] { "name", "age" }, + Optional.<PcjVarOrderFactory> absent()); + + final String sparql2 = "SELECT ?x " + "{" + "?x <http://hasAge> 16 ." + + "?x <http://playsSport> \"Soccer\" " + "}"; + + final SPARQLParser p = new SPARQLParser(); + final ParsedQuery pq1 = p.parseQuery(sparql, null); + final ParsedQuery pq2 = p.parseQuery(sparql2, null); + + final AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, + pcjTableName); + ais.setProjectionExpr((Projection) QueryVariableNormalizer + .getNormalizedIndex(pq2.getTupleExpr(), pq1.getTupleExpr()) + .get(0)); + + QueryBindingSet bs2 = new QueryBindingSet(); + bs2.addBinding("x", new URIImpl("http://Bob")); + QueryBindingSet bs3 = new QueryBindingSet(); + bs3.addBinding("location", new URIImpl("http://Virginia")); + + final List<BindingSet> bSets = Lists.<BindingSet> newArrayList(bs2, bs3); + + final CloseableIteration<BindingSet, QueryEvaluationException> results = ais + .evaluate(bSets); + + Binding exBinding6 = new BindingImpl("x", new URIImpl("http://Bob")); + + QueryBindingSet pcjBs2 = new QueryBindingSet(); + pcjBs2.addBinding(exBinding6); + + QueryBindingSet exBs4 = new QueryBindingSet(bs3); + exBs4.addAll(pcjBs2); + + Set<BindingSet> expectedResults = new HashSet<>(); + expectedResults.add(exBs4); + expectedResults.add(pcjBs2); + + final Set<BindingSet> fetchedResults = new HashSet<>(); + while (results.hasNext()) { + BindingSet next = results.next(); + fetchedResults.add(next); + } + + Assert.assertEquals(expectedResults, fetchedResults); + } + + + + @Test + public void variableCommonVarOrderLenCrossProductTestWithConstantInstantiation2() throws Exception { + // Load some Triples into Rya. + Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Baseball"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasWeight"), new NumericLiteralImpl(185, + XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasWeight"), new NumericLiteralImpl(125, + XMLSchema.INTEGER))); + + for (Statement triple : triples) { + ryaConn.add(triple); + } + + // Create a PCJ table will include those triples in its results. + String sparql = "SELECT ?name ?age ?sport ?weight " + "{" + + "?name <http://hasAge> ?age." + + "?name <http://playsSport> ?sport . " + + "?name <http://hasWeight> ?weight " + "}"; + + String sparql2 = "SELECT ?x ?y ?z " + "{" + "?x <http://hasAge> ?y." + + "?x <http://playsSport> \"Baseball\" . " + + "?x <http://hasWeight> ?z " + "}"; + + String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, + "testPcj"); + + // Create and populate the PCJ table. + PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, + pcjTableName, sparql, new String[] { "name", "age", "sport", + "weight" }, Optional.<PcjVarOrderFactory> absent()); + + SPARQLParser p = new SPARQLParser(); + ParsedQuery pq1 = p.parseQuery(sparql, null); + ParsedQuery pq2 = p.parseQuery(sparql2, null); + + AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, pcjTableName); + ais.setProjectionExpr((Projection) QueryVariableNormalizer + .getNormalizedIndex(pq2.getTupleExpr(), pq1.getTupleExpr()) + .get(0)); + + QueryBindingSet bs1 = new QueryBindingSet(); + bs1.addBinding("x", new URIImpl("http://Bob")); + QueryBindingSet bs2 = new QueryBindingSet(); + bs2.addBinding("x", new URIImpl("http://Alice")); + bs2.addBinding("y", new NumericLiteralImpl(16, XMLSchema.INTEGER)); + QueryBindingSet bs3 = new QueryBindingSet(); + bs3.addBinding("location", new URIImpl("http://Virginia")); + + final List<BindingSet> bSets = Lists.<BindingSet> newArrayList(bs1, bs2, bs3); + + final CloseableIteration<BindingSet, QueryEvaluationException> results = ais + .evaluate(bSets); + + Binding exBinding5 = new BindingImpl("y", new NumericLiteralImpl(16, XMLSchema.INTEGER)); + Binding exBinding6 = new BindingImpl("x", new URIImpl("http://Bob")); + Binding exBinding8 = new BindingImpl("z", new NumericLiteralImpl(185, XMLSchema.INTEGER)); + + QueryBindingSet pcjBs2 = new QueryBindingSet(); + pcjBs2.addBinding(exBinding5); + pcjBs2.addBinding(exBinding6); + pcjBs2.addBinding(exBinding8); + + QueryBindingSet exBs4 = new QueryBindingSet(bs3); + exBs4.addAll(pcjBs2); + + Set<BindingSet> expectedResults = new HashSet<>(); + expectedResults.add(exBs4); + expectedResults.add(pcjBs2); + + final Set<BindingSet> fetchedResults = new HashSet<>(); + while (results.hasNext()) { + BindingSet next = results.next(); + fetchedResults.add(next); + } + + Assert.assertEquals(expectedResults, fetchedResults); + } - @After - public void close() throws RepositoryException { - ryaConn.close(); - ryaRepo.shutDown(); - } - private static Configuration getConf() { - final AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration(); - conf.setBoolean(ConfigUtils.USE_MOCK_INSTANCE, true); - conf.set(RdfCloudTripleStoreConfiguration.CONF_TBL_PREFIX, "rya_"); - conf.set(ConfigUtils.CLOUDBASE_USER, "root"); - conf.set(ConfigUtils.CLOUDBASE_PASSWORD, ""); - conf.set(ConfigUtils.CLOUDBASE_INSTANCE, "instance"); - conf.set(ConfigUtils.CLOUDBASE_AUTHS, ""); - return conf; - } + @Test + public void partiallySupportedVarOrderTest() throws Exception { + // Load some Triples into Rya. + Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Baseball"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasWeight"), new NumericLiteralImpl(185, + XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasWeight"), new NumericLiteralImpl(125, + XMLSchema.INTEGER))); + for (Statement triple : triples) { + ryaConn.add(triple); + } + + // Create a PCJ table will include those triples in its results. + String sparql = "SELECT ?name ?age ?sport ?weight " + "{" + + "?name <http://hasAge> ?age." + + "?name <http://playsSport> ?sport . " + + "?name <http://hasWeight> ?weight " + "}"; + + String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, + "testPcj"); + + // Create and populate the PCJ table. + PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, + pcjTableName, sparql, new String[] { "name", "age", "sport", + "weight" }, Optional.<PcjVarOrderFactory> absent()); + AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, pcjTableName); + + QueryBindingSet bs = new QueryBindingSet(); + bs.addBinding("name", new URIImpl("http://Bob")); + bs.addBinding("sport", new LiteralImpl("Baseball")); + + final List<BindingSet> bSets = Lists.<BindingSet> newArrayList(bs); + + final CloseableIteration<BindingSet, QueryEvaluationException> results = ais + .evaluate(bSets); + + Binding exBinding5 = new BindingImpl("age", new NumericLiteralImpl(16, XMLSchema.INTEGER)); + Binding exBinding6 = new BindingImpl("name", new URIImpl("http://Bob")); + Binding exBinding7 = new BindingImpl("sport", new LiteralImpl("Baseball")); + Binding exBinding8 = new BindingImpl("weight", new NumericLiteralImpl(185, XMLSchema.INTEGER)); + + + QueryBindingSet pcjBs2 = new QueryBindingSet(); + pcjBs2.addBinding(exBinding5); + pcjBs2.addBinding(exBinding6); + pcjBs2.addBinding(exBinding7); + pcjBs2.addBinding(exBinding8); + + QueryBindingSet exBs3 = new QueryBindingSet(bs); + exBs3.addAll(pcjBs2); + + Set<BindingSet> expectedResults = new HashSet<>(); + expectedResults.add(exBs3); + + final Set<BindingSet> fetchedResults = new HashSet<>(); + while (results.hasNext()) { + BindingSet next = results.next(); + fetchedResults.add(next); + } + + Assert.assertEquals(expectedResults, fetchedResults); + } + + @Test + public void partiallySupportedVarOrderTestWithConstants() throws Exception { + // Load some Triples into Rya. + Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Baseball"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasWeight"), new NumericLiteralImpl(185, + XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasWeight"), new NumericLiteralImpl(125, + XMLSchema.INTEGER))); + + for (Statement triple : triples) { + ryaConn.add(triple); + } + + // Create a PCJ table will include those triples in its results. + String sparql = "SELECT ?name ?age ?sport ?weight " + "{" + + "?name <http://hasAge> ?age." + + "?name <http://playsSport> ?sport . " + + "?name <http://hasWeight> ?weight " + "}"; + + String sparql2 = "SELECT ?x ?y ?z " + "{" + "?x <http://hasAge> ?y." + + "?x <http://playsSport> \"Baseball\" . " + + "?x <http://hasWeight> ?z " + "}"; + + String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, + "testPcj"); + + // Create and populate the PCJ table. + PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, + pcjTableName, sparql, new String[] { "name", "age", "sport", + "weight" }, Optional.<PcjVarOrderFactory> absent()); + + SPARQLParser p = new SPARQLParser(); + ParsedQuery pq1 = p.parseQuery(sparql, null); + ParsedQuery pq2 = p.parseQuery(sparql2, null); + + AccumuloIndexSet ais = new AccumuloIndexSet(accumuloConn, pcjTableName); + ais.setProjectionExpr((Projection) QueryVariableNormalizer + .getNormalizedIndex(pq2.getTupleExpr(), pq1.getTupleExpr()) + .get(0)); + + QueryBindingSet bs = new QueryBindingSet(); + bs.addBinding("x", new URIImpl("http://Bob")); + + final List<BindingSet> bSets = Lists.<BindingSet> newArrayList(bs); + + final CloseableIteration<BindingSet, QueryEvaluationException> results = ais + .evaluate(bSets); + + Binding exBinding5 = new BindingImpl("y", new NumericLiteralImpl(16, XMLSchema.INTEGER)); + Binding exBinding6 = new BindingImpl("x", new URIImpl("http://Bob")); + Binding exBinding8 = new BindingImpl("z", new NumericLiteralImpl(185, XMLSchema.INTEGER)); + + + QueryBindingSet pcjBs2 = new QueryBindingSet(); + pcjBs2.addBinding(exBinding5); + pcjBs2.addBinding(exBinding6); + pcjBs2.addBinding(exBinding8); + + QueryBindingSet exBs3 = new QueryBindingSet(bs); + exBs3.addAll(pcjBs2); + + Set<BindingSet> expectedResults = new HashSet<>(); + expectedResults.add(exBs3); + + + final Set<BindingSet> fetchedResults = new HashSet<>(); + while (results.hasNext()) { + BindingSet next = results.next(); + fetchedResults.add(next); + } + + Assert.assertEquals(expectedResults, fetchedResults); + } + + + + + + + @Test + public void partiallySupportedConstantOrderNoBindingSet() throws Exception { + // Load some Triples into Rya. + Set<Statement> triples = new HashSet<>(); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://playsSport"), new LiteralImpl("Soccer"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://playsSport"), new LiteralImpl("Baseball"))); + triples.add(new StatementImpl(new URIImpl("http://Bob"), new URIImpl( + "http://hasWeight"), new NumericLiteralImpl(185, + XMLSchema.INTEGER))); + triples.add(new StatementImpl(new URIImpl("http://Alice"), new URIImpl( + "http://hasWeight"), new NumericLiteralImpl(125, + XMLSchema.INTEGER))); + + for (Statement triple : triples) { + ryaConn.add(triple); + } + + // Create a PCJ table will include those triples in its results. + String sparql = "SELECT ?name ?age ?sport ?weight " + "{" + + "?name <http://hasAge> ?age." + + "?name <http://playsSport> ?sport . " + + "?name <http://hasWeight> ?weight " + "}"; + + String sparql2 = "SELECT ?y ?z " + "{" + + "<http://Bob> <http://hasAge> ?y." + + "<http://Bob> <http://playsSport> \"Baseball\" . " + + "<http://Bob> <http://hasWeight> ?z
<TRUNCATED>
