http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/96dd55ec/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest.java
----------------------------------------------------------------------
diff --git 
a/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest.java
 
b/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest.java
index 9428ae4..ce9ef2f 100644
--- 
a/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest.java
+++ 
b/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest.java
@@ -19,12 +19,14 @@ package mvm.rya.indexing.external;
  * under the License.
  */
 
-
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import mvm.rya.indexing.external.tupleSet.ExternalTupleSet;
 import mvm.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
+import mvm.rya.indexing.pcj.matching.PCJOptimizer;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -38,483 +40,386 @@ import org.openrdf.query.parser.ParsedQuery;
 import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.beust.jcommander.internal.Lists;
+import com.google.common.collect.Sets;
 
 public class PrecompJoinOptimizerTest {
 
-    private final String q7 = ""//
-            + "SELECT ?s ?t ?u " //
-            + "{" //
-            + "  ?s a ?t ."//
-            + "  ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."//
-            + "  ?u <uri:talksTo> ?s . "//
-            + "}";//
-
-    private final String q8 = ""//
-            + "SELECT ?e ?l ?c " //
-            + "{" //
-            + "  ?e a ?l ."//
-            + "  ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."//
-            + "  ?c <uri:talksTo> ?e . "//
-            + "}";//
-
-    private final String q9 = ""//
-            + "SELECT ?f ?m ?d " //
-            + "{" //
-            + "  ?f a ?m ."//
-            + "  ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
-            + "  ?d <uri:talksTo> ?f . "//
-            + "}";//
-
-
-
-
-    private final String q15 = ""//
-            + "SELECT ?f ?m ?d ?e ?l ?c " //
-            + "{" //
-            + "  ?f a ?m ."//
-            + "  ?e a ?l ."//
-            + "  ?d <uri:talksTo> ?f . "//
-            + "  ?c <uri:talksTo> ?e . "//
-            + "  ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
-            + "  ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."//
-            + "}";//
-
-    private final String q16 = ""//
-            + "SELECT ?f ?m ?d ?e ?l " //
-            + "{" //
-            + "  ?d <uri:talksTo> ?f . "//
-            + "  ?d <uri:talksTo> ?e . "//
-            + "  ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
-            + "  ?l <http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
-            + "}";//
-
-    private final String q17 = ""//
-            + "SELECT ?chicken ?dog ?cat  " //
-            + "{" //
-            + "  ?chicken <uri:talksTo> ?dog . "//
-            + "  ?cat <http://www.w3.org/2000/01/rdf-schema#label> ?chicken 
."//
-            + "}";//
-
-    private final String q18 = ""//
-            + "SELECT ?dog ?chicken " //
-            + "{" //
-            + "  ?chicken <uri:talksTo> ?dog . "//
-            + "}";//
-
-    private final String q19 = ""//
-            + "SELECT ?cat ?chicken " //
-            + "{" //
-            + "  ?cat <http://www.w3.org/2000/01/rdf-schema#label> ?chicken 
."//
-            + "}";//
-
-
-    private final String q20 = ""//
-            + "SELECT ?f ?m ?d ?e ?l ?c " //
-            + "{" //
-            + "  ?f a ?m ."//
-            + "  ?e a ?l ."//
-            + "  ?d <uri:talksTo> ?f . "//
-            + "  ?c <uri:talksTo> ?e . "//
-            + "  ?m <uri:talksTo> ?e . "//
-            + "  ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
-            + "  ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."//
-            + "}";//
-
-
-
-    private final String q21 = ""//
-            + "SELECT ?u ?s ?t " //
-            + "{" //
-            + "  ?s a ?t ."//
-            + "  ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."//
-            + "  ?u <uri:talksTo> ?s . "//
-            + "}";//
-
-
-
-    @Test
-    public void testSingleIndex() throws Exception {
-
-        final SPARQLParser parser = new SPARQLParser();
-
-
-        final ParsedQuery pq1 = parser.parseQuery(q15, null);
-        final ParsedQuery pq2 = parser.parseQuery(q7, null);
-        final ParsedQuery pq3 = parser.parseQuery(q8, null);
-        final ParsedQuery pq4 = parser.parseQuery(q9, null);
-
-        final SimpleExternalTupleSet extTup1 = new 
SimpleExternalTupleSet((Projection) pq2.getTupleExpr());
-        final SimpleExternalTupleSet extTup2 = new 
SimpleExternalTupleSet((Projection) pq3.getTupleExpr());
-        final SimpleExternalTupleSet extTup3 = new 
SimpleExternalTupleSet((Projection) pq4.getTupleExpr());
-
-        final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>();
-
-        list.add(extTup1);
-
-        final List<QueryModelNode> optTupNodes = Lists.newArrayList();
-        optTupNodes.add(extTup2);
-        optTupNodes.add(extTup3);
-
-        final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, true);
-        final TupleExpr te = pq1.getTupleExpr();
-        pcj.optimize(te, null, null);
-
-        final NodeCollector nc = new NodeCollector();
-        te.visit(nc);
-
-        final List<QueryModelNode> qNodes = nc.getNodes();
-
-
-        Assert.assertEquals(qNodes.size(), optTupNodes.size());
-        for(final QueryModelNode node: qNodes) {
-            Assert.assertTrue(optTupNodes.contains(node));
-        }
-
-
-    }
-
-
-
-
-    @Test
-    public void testSingleIndex2() throws Exception {
-
-        final String q1 = ""//
-                + "SELECT ?f ?m ?d ?e ?l ?c " //
-                + "{" //
-                + "  ?f a ?m ."//
-                + "  ?c a ?l ."//
-                + "  ?d <uri:talksTo> ?f . "//
-                + "  ?e <uri:talksTo> ?c . "//
-                + "  ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
-                + "  ?l <http://www.w3.org/2000/01/rdf-schema#label> ?e ."//
-                + "  ?m <uri:talksTo> ?e . "//
-                + "}";//
-
-        final String q2 = ""//
-                + "SELECT ?u ?s ?t " //
-                + "{" //
-                + "  ?s a ?t ."//
-                + "  ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."//
-                + "  ?u <uri:talksTo> ?s . "//
-                + "}";//
-
-        final String q3 = ""//
-                + "SELECT ?e ?c ?l " //
-                + "{" //
-                + "  ?c a ?l ."//
-                + "  ?l <http://www.w3.org/2000/01/rdf-schema#label> ?e ."//
-                + "  ?e <uri:talksTo> ?c . "//
-                + "}";//
-
-        final String q4 = ""//
-                + "SELECT ?d ?f ?m " //
-                + "{" //
-                + "  ?f a ?m ."//
-                + "  ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
-                + "  ?d <uri:talksTo> ?f . "//
-                + "}";//
-
-        final SPARQLParser parser = new SPARQLParser();
-
-        final ParsedQuery pq1 = parser.parseQuery(q1, null);
-        final ParsedQuery pq2 = parser.parseQuery(q2, null);
-        final ParsedQuery pq3 = parser.parseQuery(q3, null);
-        final ParsedQuery pq4 = parser.parseQuery(q4, null);
-
-        final SimpleExternalTupleSet extTup1 = new 
SimpleExternalTupleSet((Projection) pq2.getTupleExpr());
-        final SimpleExternalTupleSet extTup2 = new 
SimpleExternalTupleSet((Projection) pq3.getTupleExpr());
-        final SimpleExternalTupleSet extTup3 = new 
SimpleExternalTupleSet((Projection) pq4.getTupleExpr());
-
-        final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>();
-
-        list.add(extTup1);
-
-        final List<StatementPattern> spList = 
StatementPatternCollector.process(pq1.getTupleExpr());
-        final List<QueryModelNode> optTupNodes = Lists.newArrayList();
-        optTupNodes.add(extTup3);
-        optTupNodes.add(spList.get(6));
-        optTupNodes.add(extTup2);
-
-        final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, true);
-        final TupleExpr te = pq1.getTupleExpr();
-        pcj.optimize(te, null, null);
-
-        final NodeCollector nc = new NodeCollector();
-        te.visit(nc);
-
-        //System.out.println("Optimal plan is " + optimalTup);
-
-        final List<QueryModelNode> qNodes = nc.getNodes();
-        //System.out.println("Returned list is " + qNodes + " and comp list is 
" + optTupNodes);
-
-        Assert.assertTrue(qNodes.equals(optTupNodes));
-
-    }
-
-
-
-
-
-
-
-
-    @Test
-    public void testTwoIndex() throws Exception {
-
-        final String q1 = ""//
-                + "SELECT ?f ?m ?d ?h ?i " //
-                + "{" //
-                + "  ?f a ?m ."//
-                + "  ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
-                + "  ?d <uri:talksTo> ?f . "//
-                + "  ?d <uri:hangOutWith> ?f ." //
-                + "  ?f <uri:hangOutWith> ?h ." //
-                + "  ?f <uri:associatesWith> ?i ." //
-                + "  ?i <uri:associatesWith> ?h ." //
-                + "}";//
-
-        final String q2 = ""//
-                + "SELECT ?t ?s ?u " //
-                + "{" //
-                + "  ?s a ?t ."//
-                + "  ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."//
-                + "  ?u <uri:talksTo> ?s . "//
-                + "}";//
-
-        final String q3 = ""//
-                + "SELECT ?s ?t ?u " //
-                + "{" //
-                + "  ?s <uri:hangOutWith> ?t ." //
-                + "  ?t <uri:hangOutWith> ?u ." //
-                + "}";//
-
-        final String q4 = ""//
-                + "SELECT ?s ?t ?u " //
-                + "{" //
-                + "  ?s <uri:associatesWith> ?t ." //
-                + "  ?t <uri:associatesWith> ?u ." //
-                + "}";//
-
-        final String q5 = ""//
-                + "SELECT ?m ?f ?d " //
-                + "{" //
-                + "  ?f a ?m ."//
-                + "  ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
-                + "  ?d <uri:talksTo> ?f . "//
-                + "}";//
-
-        final String q6 = ""//
-                + "SELECT ?d ?f ?h " //
-                + "{" //
-                + "  ?d <uri:hangOutWith> ?f ." //
-                + "  ?f <uri:hangOutWith> ?h ." //
-                + "}";//
-
-        final String q7 = ""//
-                + "SELECT ?f ?i ?h " //
-                + "{" //
-                + "  ?f <uri:associatesWith> ?i ." //
-                + "  ?i <uri:associatesWith> ?h ." //
-                + "}";//
-
-        final SPARQLParser parser = new SPARQLParser();
-
-        final ParsedQuery pq1 = parser.parseQuery(q1, null);
-        final ParsedQuery pq2 = parser.parseQuery(q2, null);
-        final ParsedQuery pq3 = parser.parseQuery(q3, null);
-        final ParsedQuery pq4 = parser.parseQuery(q4, null);
-        final ParsedQuery pq5 = parser.parseQuery(q5, null);
-        final ParsedQuery pq6 = parser.parseQuery(q6, null);
-        final ParsedQuery pq7 = parser.parseQuery(q7, null);
-
-        final SimpleExternalTupleSet extTup1 = new 
SimpleExternalTupleSet((Projection) pq2.getTupleExpr());
-        final SimpleExternalTupleSet extTup2 = new 
SimpleExternalTupleSet((Projection) pq3.getTupleExpr());
-        final SimpleExternalTupleSet extTup3 = new 
SimpleExternalTupleSet((Projection) pq4.getTupleExpr());
-        final SimpleExternalTupleSet extTup4 = new 
SimpleExternalTupleSet((Projection) pq5.getTupleExpr());
-        final SimpleExternalTupleSet extTup5 = new 
SimpleExternalTupleSet((Projection) pq6.getTupleExpr());
-        final SimpleExternalTupleSet extTup6 = new 
SimpleExternalTupleSet((Projection) pq7.getTupleExpr());
-
-        final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>();
-
-        list.add(extTup2);
-        list.add(extTup1);
-        list.add(extTup3);
-
-        final List<QueryModelNode> optTupNodes = Lists.newArrayList();
-        optTupNodes.add(extTup4);
-        optTupNodes.add(extTup6);
-        optTupNodes.add(extTup5);
-
-        final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, true);
-        final TupleExpr te = pq1.getTupleExpr();
-        pcj.optimize(te, null, null);
-
-        System.out.println(te);
-
-        final NodeCollector nc = new NodeCollector();
-        te.visit(nc);
-
-        final List<QueryModelNode> qNodes = nc.getNodes();
-
-        Assert.assertTrue(qNodes.equals(optTupNodes));
-
-    }
-
-
-
-
-
-
-    @Test
-    public void twoIndexFilterTest() {
-
-
-        final String q1 = ""//
-                + "SELECT ?f ?m ?d ?e ?l ?c " //
-                + "{" //
-                + "  Filter(?f > \"5\")." //
-                + "  Filter(?e > \"5\")." //
-                + "  ?f a ?m ."//
-                + "  ?e a ?l ."//
-                + "  ?d <uri:talksTo> ?f . "//
-                + "  ?c <uri:talksTo> ?e . "//
-                + "  ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
-                + "  ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."//
-                + "}";//
-
-
-        final String q2 = ""//
-                + "SELECT ?s ?t ?u " //
-                + "{" //
-                + "  ?s a ?t ."//
-                + "  ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."//
-                + "  ?u <uri:talksTo> ?s . "//
-                + "}";//
-
-
-        final String q3 = ""//
-                + "SELECT ?s ?t ?u " //
-                + "{" //
-                + " Filter(?s > \"5\") ."//
-                + "  ?s a ?t ."//
-                + "  ?t <http://www.w3.org/2000/01/rdf-schema#label> ?u ."//
-                + "  ?u <uri:talksTo> ?s . "//
-                + "}";//
-
-
-
-        final String q4 = ""//
-                + "SELECT ?f ?m ?d " //
-                + "{" //
-                + " Filter(?f > \"5\") ."//
-                + "  ?f a ?m ."//
-                + "  ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
-                + "  ?d <uri:talksTo> ?f . "//
-                + "}";//
-
-
-        final String q5 = ""//
-                + "SELECT ?e ?l ?c " //
-                + "{" //
-                + " Filter(?e > \"5\") ."//
-                + "  ?e a ?l ."//
-                + "  ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."//
-                + "  ?c <uri:talksTo> ?e . "//
-                + "}";//
-
-
-
-
-        final SPARQLParser parser = new SPARQLParser();
-
-        ParsedQuery pq1 = null;
-        ParsedQuery pq2 = null;
-        ParsedQuery pq3 = null;
-        ParsedQuery pq4 = null;
-        ParsedQuery pq5 = null;
-
-
-
-        try {
-            pq1 = parser.parseQuery(q1, null);
-            pq2 = parser.parseQuery(q2, null);
-            pq3 = parser.parseQuery(q3, null);
-            pq4 = parser.parseQuery(q4, null);
-            pq5 = parser.parseQuery(q5, null);
-
-
-        } catch (final Exception e) {
-            e.printStackTrace();
-        }
-
-        final SimpleExternalTupleSet extTup1 = new 
SimpleExternalTupleSet((Projection) pq2.getTupleExpr());
-        final SimpleExternalTupleSet extTup2 = new 
SimpleExternalTupleSet((Projection) pq3.getTupleExpr());
-        final SimpleExternalTupleSet extTup3 = new 
SimpleExternalTupleSet((Projection) pq4.getTupleExpr());
-        final SimpleExternalTupleSet extTup4 = new 
SimpleExternalTupleSet((Projection) pq5.getTupleExpr());
-
-        final List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>();
-
-        list.add(extTup2);
-        list.add(extTup1);
-
-        final List<ExternalTupleSet> list2 = new ArrayList<ExternalTupleSet>();
-
-        list2.add(extTup3);
-        list2.add(extTup4);
-
-        final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, true);
-        final TupleExpr te = pq1.getTupleExpr();
-        pcj.optimize(te, null, null);
-
-        System.out.println(te);
-
-        final NodeCollector nc = new NodeCollector();
-        te.visit(nc);
-
-        Assert.assertEquals(nc.getNodes().size(), list2.size());
-
-        for(final QueryModelNode e: nc.getNodes()) {
-            Assert.assertTrue(list2.contains(e));
-        }
-
-
-
-    }
-
-
-
-
-
-
-
-
-    public static class NodeCollector extends 
QueryModelVisitorBase<RuntimeException> {
-
-        List<QueryModelNode> qNodes = Lists.newArrayList();
-
-
-        public List<QueryModelNode> getNodes() {
-            return qNodes;
-        }
-
-
-
-        @Override
-        public void meetNode(QueryModelNode node) {
-            if(node instanceof StatementPattern || node instanceof 
ExternalTupleSet) {
-                qNodes.add(node);
-            }
-            super.meetNode(node);
-
-        }
-
-
-    }
-
-
-
-
-
+       @Test
+       public void testThreeIndex() throws Exception {
+
+               String q7 = ""//
+                               + "SELECT ?s ?t ?u " //
+                               + "{" //
+                               + "  ?s a ?t ."//
+                               + "  ?t 
<http://www.w3.org/2000/01/rdf-schema#label> ?u ."//
+                               + "  ?u <uri:talksTo> ?s . "//
+                               + "}";//
+
+               String q8 = ""//
+                               + "SELECT ?e ?l ?c " //
+                               + "{" //
+                               + "  ?e a ?l ."//
+                               + "  ?l 
<http://www.w3.org/2000/01/rdf-schema#label> ?c ."//
+                               + "  ?c <uri:talksTo> ?e . "//
+                               + "}";//
+
+               String q9 = ""//
+                               + "SELECT ?f ?m ?d " //
+                               + "{" //
+                               + "  ?f a ?m ."//
+                               + "  ?m 
<http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
+                               + "  ?d <uri:talksTo> ?f . "//
+                               + "}";//
+
+               String q15 = ""//
+                               + "SELECT ?f ?m ?d ?e ?l ?c " //
+                               + "{" //
+                               + "  ?f a ?m ."//
+                               + "  ?e a ?l ."//
+                               + "  ?d <uri:talksTo> ?f . "//
+                               + "  ?c <uri:talksTo> ?e . "//
+                               + "  ?m 
<http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
+                               + "  ?l 
<http://www.w3.org/2000/01/rdf-schema#label> ?c ."//
+                               + "}";//
+
+               final SPARQLParser parser = new SPARQLParser();
+
+               final ParsedQuery pq1 = parser.parseQuery(q15, null);
+               final ParsedQuery pq2 = parser.parseQuery(q7, null);
+               final ParsedQuery pq3 = parser.parseQuery(q8, null);
+               final ParsedQuery pq4 = parser.parseQuery(q9, null);
+
+               final SimpleExternalTupleSet extTup1 = new 
SimpleExternalTupleSet(
+                               (Projection) pq2.getTupleExpr());
+               final SimpleExternalTupleSet extTup2 = new 
SimpleExternalTupleSet(
+                               (Projection) pq3.getTupleExpr());
+               final SimpleExternalTupleSet extTup3 = new 
SimpleExternalTupleSet(
+                               (Projection) pq4.getTupleExpr());
+
+               final List<ExternalTupleSet> list = new 
ArrayList<ExternalTupleSet>();
+
+               list.add(extTup1);
+
+               final List<QueryModelNode> optTupNodes = Lists.newArrayList();
+               optTupNodes.add(extTup2);
+               optTupNodes.add(extTup3);
+
+               final PCJOptimizer pcj = new PCJOptimizer(list, true);
+               final TupleExpr te = pq1.getTupleExpr();
+               pcj.optimize(te, null, null);
+
+               final NodeCollector nc = new NodeCollector();
+               te.visit(nc);
+
+               Assert.assertEquals(nc.qNodes.size(), optTupNodes.size());
+               for (final QueryModelNode node : nc.qNodes) {
+                       Assert.assertTrue(optTupNodes.contains(node));
+               }
+
+       }
+
+       @Test
+       public void testThreeIndex2() throws Exception {
+
+               final String q1 = ""//
+                               + "SELECT ?f ?m ?d ?e ?l ?c " //
+                               + "{" //
+                               + "  ?f a ?m ."//
+                               + "  ?c a ?l ."//
+                               + "  ?d <uri:talksTo> ?f . "//
+                               + "  ?e <uri:talksTo> ?c . "//
+                               + "  ?m 
<http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
+                               + "  ?l 
<http://www.w3.org/2000/01/rdf-schema#label> ?e ."//
+                               + "  ?m <uri:talksTo> ?e . "//
+                               + "}";//
+
+               final String q2 = ""//
+                               + "SELECT ?u ?s ?t " //
+                               + "{" //
+                               + "  ?s a ?t ."//
+                               + "  ?t 
<http://www.w3.org/2000/01/rdf-schema#label> ?u ."//
+                               + "  ?u <uri:talksTo> ?s . "//
+                               + "}";//
+
+               final String q3 = ""//
+                               + "SELECT ?e ?c ?l " //
+                               + "{" //
+                               + "  ?c a ?l ."//
+                               + "  ?l 
<http://www.w3.org/2000/01/rdf-schema#label> ?e ."//
+                               + "  ?e <uri:talksTo> ?c . "//
+                               + "}";//
+
+               final String q4 = ""//
+                               + "SELECT ?d ?f ?m " //
+                               + "{" //
+                               + "  ?f a ?m ."//
+                               + "  ?m 
<http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
+                               + "  ?d <uri:talksTo> ?f . "//
+                               + "}";//
+
+               final SPARQLParser parser = new SPARQLParser();
+
+               final ParsedQuery pq1 = parser.parseQuery(q1, null);
+               final ParsedQuery pq2 = parser.parseQuery(q2, null);
+               final ParsedQuery pq3 = parser.parseQuery(q3, null);
+               final ParsedQuery pq4 = parser.parseQuery(q4, null);
+
+               final SimpleExternalTupleSet extTup1 = new 
SimpleExternalTupleSet(
+                               (Projection) pq2.getTupleExpr());
+               final SimpleExternalTupleSet extTup2 = new 
SimpleExternalTupleSet(
+                               (Projection) pq3.getTupleExpr());
+               final SimpleExternalTupleSet extTup3 = new 
SimpleExternalTupleSet(
+                               (Projection) pq4.getTupleExpr());
+
+               final List<ExternalTupleSet> list = new 
ArrayList<ExternalTupleSet>();
+
+               list.add(extTup1);
+
+               final List<StatementPattern> spList = StatementPatternCollector
+                               .process(pq1.getTupleExpr());
+               final List<QueryModelNode> optTupNodes = Lists.newArrayList();
+               optTupNodes.add(extTup3);
+               optTupNodes.add(spList.get(6));
+               optTupNodes.add(extTup2);
+
+               final PCJOptimizer pcj = new PCJOptimizer(list, true);
+               final TupleExpr te = pq1.getTupleExpr();
+               pcj.optimize(te, null, null);
+
+               final NodeCollector nc = new NodeCollector();
+               te.visit(nc);
+
+               Assert.assertEquals(nc.qNodes, Sets.newHashSet(optTupNodes));
+
+       }
+
+       @Test
+       public void testSixIndex() throws Exception {
+
+               final String q1 = ""//
+                               + "SELECT ?f ?m ?d ?h ?i " //
+                               + "{" //
+                               + "  ?f a ?m ."//
+                               + "  ?m 
<http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
+                               + "  ?d <uri:talksTo> ?f . "//
+                               + "  ?d <uri:hangOutWith> ?f ." //
+                               + "  ?f <uri:hangOutWith> ?h ." //
+                               + "  ?f <uri:associatesWith> ?i ." //
+                               + "  ?i <uri:associatesWith> ?h ." //
+                               + "}";//
+
+               final String q2 = ""//
+                               + "SELECT ?t ?s ?u " //
+                               + "{" //
+                               + "  ?s a ?t ."//
+                               + "  ?t 
<http://www.w3.org/2000/01/rdf-schema#label> ?u ."//
+                               + "  ?u <uri:talksTo> ?s . "//
+                               + "}";//
+
+               final String q3 = ""//
+                               + "SELECT ?s ?t ?u " //
+                               + "{" //
+                               + "  ?s <uri:hangOutWith> ?t ." //
+                               + "  ?t <uri:hangOutWith> ?u ." //
+                               + "}";//
+
+               final String q4 = ""//
+                               + "SELECT ?s ?t ?u " //
+                               + "{" //
+                               + "  ?s <uri:associatesWith> ?t ." //
+                               + "  ?t <uri:associatesWith> ?u ." //
+                               + "}";//
+
+               final String q5 = ""//
+                               + "SELECT ?m ?f ?d " //
+                               + "{" //
+                               + "  ?f a ?m ."//
+                               + "  ?m 
<http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
+                               + "  ?d <uri:talksTo> ?f . "//
+                               + "}";//
+
+               final String q6 = ""//
+                               + "SELECT ?d ?f ?h " //
+                               + "{" //
+                               + "  ?d <uri:hangOutWith> ?f ." //
+                               + "  ?f <uri:hangOutWith> ?h ." //
+                               + "}";//
+
+               final String q7 = ""//
+                               + "SELECT ?f ?i ?h " //
+                               + "{" //
+                               + "  ?f <uri:associatesWith> ?i ." //
+                               + "  ?i <uri:associatesWith> ?h ." //
+                               + "}";//
+
+               final SPARQLParser parser = new SPARQLParser();
+
+               final ParsedQuery pq1 = parser.parseQuery(q1, null);
+               final ParsedQuery pq2 = parser.parseQuery(q2, null);
+               final ParsedQuery pq3 = parser.parseQuery(q3, null);
+               final ParsedQuery pq4 = parser.parseQuery(q4, null);
+               final ParsedQuery pq5 = parser.parseQuery(q5, null);
+               final ParsedQuery pq6 = parser.parseQuery(q6, null);
+               final ParsedQuery pq7 = parser.parseQuery(q7, null);
+
+               final SimpleExternalTupleSet extTup1 = new 
SimpleExternalTupleSet(
+                               (Projection) pq2.getTupleExpr());
+               final SimpleExternalTupleSet extTup2 = new 
SimpleExternalTupleSet(
+                               (Projection) pq3.getTupleExpr());
+               final SimpleExternalTupleSet extTup3 = new 
SimpleExternalTupleSet(
+                               (Projection) pq4.getTupleExpr());
+               final SimpleExternalTupleSet extTup4 = new 
SimpleExternalTupleSet(
+                               (Projection) pq5.getTupleExpr());
+               final SimpleExternalTupleSet extTup5 = new 
SimpleExternalTupleSet(
+                               (Projection) pq6.getTupleExpr());
+               final SimpleExternalTupleSet extTup6 = new 
SimpleExternalTupleSet(
+                               (Projection) pq7.getTupleExpr());
+
+               final List<ExternalTupleSet> list = new 
ArrayList<ExternalTupleSet>();
+
+               list.add(extTup2);
+               list.add(extTup1);
+               list.add(extTup3);
+
+               final List<QueryModelNode> optTupNodes = Lists.newArrayList();
+               optTupNodes.add(extTup4);
+               optTupNodes.add(extTup6);
+               optTupNodes.add(extTup5);
+
+               final PCJOptimizer pcj = new PCJOptimizer(list, true);
+               final TupleExpr te = pq1.getTupleExpr();
+               pcj.optimize(te, null, null);
+
+               System.out.println(te);
+
+               final NodeCollector nc = new NodeCollector();
+               te.visit(nc);
+
+               Assert.assertEquals(nc.qNodes, Sets.newHashSet(optTupNodes));
+
+       }
+
+       @Test
+       public void twoFourIndexWithFilterTest() {
+
+               final String q1 = ""//
+                               + "SELECT ?f ?m ?d ?e ?l ?c " //
+                               + "{" //
+                               + "  Filter(?f > \"5\")." //
+                               + "  Filter(?e > \"5\")." //
+                               + "  ?f a ?m ."//
+                               + "  ?e a ?l ."//
+                               + "  ?d <uri:talksTo> ?f . "//
+                               + "  ?c <uri:talksTo> ?e . "//
+                               + "  ?m 
<http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
+                               + "  ?l 
<http://www.w3.org/2000/01/rdf-schema#label> ?c ."//
+                               + "}";//
+
+               final String q2 = ""//
+                               + "SELECT ?s ?t ?u " //
+                               + "{" //
+                               + "  ?s a ?t ."//
+                               + "  ?t 
<http://www.w3.org/2000/01/rdf-schema#label> ?u ."//
+                               + "  ?u <uri:talksTo> ?s . "//
+                               + "}";//
+
+               final String q3 = ""//
+                               + "SELECT ?s ?t ?u " //
+                               + "{" //
+                               + " Filter(?s > \"5\") ."//
+                               + "  ?s a ?t ."//
+                               + "  ?t 
<http://www.w3.org/2000/01/rdf-schema#label> ?u ."//
+                               + "  ?u <uri:talksTo> ?s . "//
+                               + "}";//
+
+               final String q4 = ""//
+                               + "SELECT ?f ?m ?d " //
+                               + "{" //
+                               + " Filter(?f > \"5\") ."//
+                               + "  ?f a ?m ."//
+                               + "  ?m 
<http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
+                               + "  ?d <uri:talksTo> ?f . "//
+                               + "}";//
+
+               final String q5 = ""//
+                               + "SELECT ?e ?l ?c " //
+                               + "{" //
+                               + " Filter(?e > \"5\") ."//
+                               + "  ?e a ?l ."//
+                               + "  ?l 
<http://www.w3.org/2000/01/rdf-schema#label> ?c ."//
+                               + "  ?c <uri:talksTo> ?e . "//
+                               + "}";//
+
+               final SPARQLParser parser = new SPARQLParser();
+
+               ParsedQuery pq1 = null;
+               ParsedQuery pq2 = null;
+               ParsedQuery pq3 = null;
+               ParsedQuery pq4 = null;
+               ParsedQuery pq5 = null;
+
+               try {
+                       pq1 = parser.parseQuery(q1, null);
+                       pq2 = parser.parseQuery(q2, null);
+                       pq3 = parser.parseQuery(q3, null);
+                       pq4 = parser.parseQuery(q4, null);
+                       pq5 = parser.parseQuery(q5, null);
+
+               } catch (final Exception e) {
+                       e.printStackTrace();
+               }
+
+               final SimpleExternalTupleSet extTup1 = new 
SimpleExternalTupleSet(
+                               (Projection) pq2.getTupleExpr());
+               final SimpleExternalTupleSet extTup2 = new 
SimpleExternalTupleSet(
+                               (Projection) pq3.getTupleExpr());
+               final SimpleExternalTupleSet extTup3 = new 
SimpleExternalTupleSet(
+                               (Projection) pq4.getTupleExpr());
+               final SimpleExternalTupleSet extTup4 = new 
SimpleExternalTupleSet(
+                               (Projection) pq5.getTupleExpr());
+
+               final List<ExternalTupleSet> list = new 
ArrayList<ExternalTupleSet>();
+
+               list.add(extTup2);
+               list.add(extTup1);
+
+               final List<ExternalTupleSet> list2 = new 
ArrayList<ExternalTupleSet>();
+
+               list2.add(extTup3);
+               list2.add(extTup4);
+
+               final PCJOptimizer pcj = new PCJOptimizer(list, true);
+               final TupleExpr te = pq1.getTupleExpr();
+               pcj.optimize(te, null, null);
+
+               System.out.println(te);
+
+               final NodeCollector nc = new NodeCollector();
+               te.visit(nc);
+
+               Assert.assertEquals(nc.qNodes.size(), list2.size());
+
+               for (final QueryModelNode e : nc.qNodes) {
+                       Assert.assertTrue(list2.contains(e));
+               }
+
+       }
+
+       public static class NodeCollector extends
+                       QueryModelVisitorBase<RuntimeException> {
+
+               Set<QueryModelNode> qNodes = new HashSet<>();
+
+               @Override
+               public void meetNode(QueryModelNode node) {
+                       if (node instanceof StatementPattern
+                                       || node instanceof ExternalTupleSet) {
+                               qNodes.add(node);
+                       }
+                       super.meetNode(node);
+
+               }
+
+       }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/96dd55ec/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest2.java
----------------------------------------------------------------------
diff --git 
a/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest2.java
 
b/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest2.java
index ea173bb..a9994b1 100644
--- 
a/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest2.java
+++ 
b/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerTest2.java
@@ -26,6 +26,7 @@ import java.util.Set;
 import 
mvm.rya.indexing.external.PcjIntegrationTestingUtil.BindingSetAssignmentCollector;
 import mvm.rya.indexing.external.tupleSet.ExternalTupleSet;
 import mvm.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
+import mvm.rya.indexing.pcj.matching.PCJOptimizer;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -463,7 +464,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup);
 
                final TupleExpr tup = pq1.getTupleExpr().clone();
-               final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               final PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                final Set<StatementPattern> qSet = Sets
@@ -497,7 +498,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup);
 
                final TupleExpr tup = pq1.getTupleExpr().clone();
-               final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               final PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                final Set<StatementPattern> qSet = Sets
@@ -541,7 +542,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup2);
 
                TupleExpr tup = pq1.getTupleExpr().clone();
-               PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                Set<StatementPattern> qSet = 
Sets.newHashSet(StatementPatternCollector
@@ -589,7 +590,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup3);
 
                TupleExpr tup = pq1.getTupleExpr().clone();
-               PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                Set<StatementPattern> qSet = 
Sets.newHashSet(StatementPatternCollector
@@ -623,7 +624,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup);
 
                TupleExpr tup = pq1.getTupleExpr().clone();
-               PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                Set<StatementPattern> qSet = 
Sets.newHashSet(StatementPatternCollector
@@ -671,7 +672,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup3);
 
                TupleExpr tup = pq1.getTupleExpr().clone();
-               PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                Set<StatementPattern> qSet = 
Sets.newHashSet(StatementPatternCollector
@@ -721,7 +722,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup1);
 
                TupleExpr tup = pq1.getTupleExpr().clone();
-               PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                Set<StatementPattern> qSet = 
Sets.newHashSet(StatementPatternCollector
@@ -774,7 +775,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup1);
 
                TupleExpr tup = pq1.getTupleExpr().clone();
-               PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                Set<StatementPattern> qSet = 
Sets.newHashSet(StatementPatternCollector
@@ -810,7 +811,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup);
 
                TupleExpr tup = pq1.getTupleExpr().clone();
-               PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                Set<StatementPattern> qSet = 
Sets.newHashSet(StatementPatternCollector
@@ -847,7 +848,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup);
 
                TupleExpr tup = pq1.getTupleExpr().clone();
-               PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                Set<StatementPattern> qSet = 
Sets.newHashSet(StatementPatternCollector
@@ -886,7 +887,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup2);
 
                TupleExpr tup = pq1.getTupleExpr().clone();
-               PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                Set<StatementPattern> qSet = 
Sets.newHashSet(StatementPatternCollector
@@ -940,7 +941,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup3);
 
                TupleExpr tup = pq1.getTupleExpr().clone();
-               PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                Set<StatementPattern> qSet = 
Sets.newHashSet(StatementPatternCollector
@@ -985,7 +986,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup2);
 
                TupleExpr tup = pq1.getTupleExpr().clone();
-               PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                Set<StatementPattern> qSet = 
Sets.newHashSet(StatementPatternCollector
@@ -1019,7 +1020,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup);
 
                TupleExpr tup = pq1.getTupleExpr().clone();
-               PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                Set<StatementPattern> qSet = 
Sets.newHashSet(StatementPatternCollector
@@ -1062,7 +1063,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup2);
 
                TupleExpr tup = pq1.getTupleExpr().clone();
-               PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                Set<StatementPattern> qSet = 
Sets.newHashSet(StatementPatternCollector
@@ -1100,7 +1101,7 @@ public class PrecompJoinOptimizerTest2 {
                list.add(extTup2);
 
                TupleExpr tup = pq1.getTupleExpr().clone();
-               PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               PCJOptimizer pcj = new PCJOptimizer(list, false);
                pcj.optimize(tup, null, null);
 
                Set<StatementPattern> qSet = 
Sets.newHashSet(StatementPatternCollector

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/96dd55ec/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java
----------------------------------------------------------------------
diff --git 
a/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java
 
b/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java
index bae935c..409f92c 100644
--- 
a/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java
+++ 
b/extras/indexing/src/test/java/mvm/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java
@@ -24,9 +24,9 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
-import mvm.rya.indexing.external.PrecompJoinOptimizer;
 import mvm.rya.indexing.external.tupleSet.ExternalTupleSet;
 import mvm.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
+import mvm.rya.indexing.pcj.matching.PCJOptimizer;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -130,12 +130,12 @@ public class PrecompJoinOptimizerVarToConstTest {
 
      String q23 = "PREFIX geo: <http://www.opengis.net/ont/geosparql#>  "//
                 + "PREFIX geof: 
<http://www.opengis.net/def/function/geosparql/>  "//
-                + "SELECT ?a ?b ?c ?d " //
+                + "SELECT ?a ?b ?c " //
                 + "{" //
                 + "  ?a a geo:Feature . "//
                 + "  ?b a geo:Point . "//
                 + "  ?b geo:asWKT ?c . "//
-                + "  FILTER(geof:sfWithin(?c, ?d)) " //
+                + "  FILTER(geof:sfWithin(?c, \"Polygon\")) " //
                 + "}";//
 
 
@@ -224,7 +224,7 @@ public class PrecompJoinOptimizerVarToConstTest {
 
         final TupleExpr tup = pq1.getTupleExpr().clone();
 
-               final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               final PCJOptimizer pcj = new PCJOptimizer(list, false);
         pcj.optimize(tup, null, null);
 
         System.out.println("Processed query is " + tup);
@@ -264,7 +264,7 @@ public class PrecompJoinOptimizerVarToConstTest {
         list.add(extTup);
 
         final TupleExpr tup = pq1.getTupleExpr().clone();
-               final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               final PCJOptimizer pcj = new PCJOptimizer(list, false);
         pcj.optimize(tup, null, null);
 
         System.out.println("Processed query is " + tup);
@@ -305,7 +305,7 @@ public class PrecompJoinOptimizerVarToConstTest {
         list.add(extTup);
 
         final TupleExpr tup = pq1.getTupleExpr().clone();
-               final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               final PCJOptimizer pcj = new PCJOptimizer(list, false);
         pcj.optimize(tup, null, null);
 
         System.out.println("Processed query is " + tup);
@@ -350,7 +350,7 @@ public class PrecompJoinOptimizerVarToConstTest {
         list.add(extTup2);
 
         final TupleExpr tup = pq1.getTupleExpr().clone();
-               final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               final PCJOptimizer pcj = new PCJOptimizer(list, false);
         pcj.optimize(tup, null, null);
 
         System.out.println("Processed query is " + tup);
@@ -399,7 +399,7 @@ public class PrecompJoinOptimizerVarToConstTest {
         list.add(extTup3);
 
         final TupleExpr tup = pq1.getTupleExpr().clone();
-               final PrecompJoinOptimizer pcj = new PrecompJoinOptimizer(list, 
false);
+               final PCJOptimizer pcj = new PCJOptimizer(list, false);
         pcj.optimize(tup, null, null);
 
         System.out.println("Processed query is " + tup);


Reply via email to