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>

Reply via email to