http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/extras/indexing/src/test/java/mvm/rya/accumulo/documentIndex/DocumentIndexIntersectingIteratorTest.java
----------------------------------------------------------------------
diff --git 
a/extras/indexing/src/test/java/mvm/rya/accumulo/documentIndex/DocumentIndexIntersectingIteratorTest.java
 
b/extras/indexing/src/test/java/mvm/rya/accumulo/documentIndex/DocumentIndexIntersectingIteratorTest.java
new file mode 100644
index 0000000..075a111
--- /dev/null
+++ 
b/extras/indexing/src/test/java/mvm/rya/accumulo/documentIndex/DocumentIndexIntersectingIteratorTest.java
@@ -0,0 +1,1883 @@
+package mvm.rya.accumulo.documentIndex;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Assert;
+import mvm.rya.accumulo.AccumuloRdfConfiguration;
+import mvm.rya.accumulo.RyaTableMutationsFactory;
+import mvm.rya.api.domain.RyaStatement;
+import mvm.rya.api.domain.RyaType;
+import mvm.rya.api.domain.RyaURI;
+import mvm.rya.api.resolver.RdfToRyaConversions;
+import mvm.rya.api.resolver.RyaContext;
+import mvm.rya.api.resolver.RyaToRdfConversions;
+import mvm.rya.api.resolver.RyaTripleContext;
+import mvm.rya.indexing.accumulo.entity.EntityCentricIndex;
+
+import org.apache.accumulo.core.client.AccumuloException;
+import org.apache.accumulo.core.client.AccumuloSecurityException;
+import org.apache.accumulo.core.client.BatchWriter;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.IteratorSetting;
+import org.apache.accumulo.core.client.Scanner;
+import org.apache.accumulo.core.client.TableExistsException;
+import org.apache.accumulo.core.client.mock.MockInstance;
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Mutation;
+import org.apache.accumulo.core.data.Range;
+import org.apache.accumulo.core.data.Value;
+import org.apache.accumulo.core.security.Authorizations;
+import org.apache.hadoop.io.Text;
+import org.junit.Before;
+import org.junit.Test;
+import org.openrdf.model.vocabulary.XMLSchema;
+import org.openrdf.query.MalformedQueryException;
+import org.openrdf.query.QueryEvaluationException;
+import org.openrdf.query.TupleQueryResultHandlerException;
+import org.openrdf.query.algebra.StatementPattern;
+import org.openrdf.query.algebra.TupleExpr;
+import org.openrdf.query.algebra.helpers.StatementPatternCollector;
+import org.openrdf.query.parser.ParsedQuery;
+import org.openrdf.query.parser.sparql.SPARQLParser;
+import org.openrdf.repository.RepositoryException;
+
+import com.google.common.primitives.Bytes;
+
+
+public class DocumentIndexIntersectingIteratorTest {
+
+    
+ 
+    private Connector accCon;
+    String tablename = "table";
+    
+
+    @Before
+    public void init() throws RepositoryException, 
TupleQueryResultHandlerException, QueryEvaluationException,
+            MalformedQueryException, AccumuloException, 
AccumuloSecurityException, TableExistsException {
+
+        accCon = new MockInstance().getConnector("root", "".getBytes());
+        accCon.tableOperations().create(tablename);
+
+    }
+    
+    
+    
+    
+    
+    
+    
+@Test
+    public void testBasicColumnObj() throws Exception {
+
+        BatchWriter bw = null;
+
+            bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+            for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+                m.put(new Text("cf"), new Text(null + "\u0000" + "obj" + 
"\u0000" + "cq"), new Value(new byte[0]));
+                m.put(new Text("cF"), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cQ"), new Value(new byte[0]));
+
+                if (i == 30 || i == 60) {
+                    m.put(new Text("CF"), new Text(null + "\u0000" +"obj" + 
"\u0000" + "CQ"), new Value(new byte[0]));
+                }
+
+                bw.addMutation(m);
+
+            }
+            
+            DocumentIndexIntersectingIterator dii = new 
DocumentIndexIntersectingIterator();
+            TextColumn tc1 = new TextColumn(new Text("cf"), new Text("obj" + 
"\u0000" + "cq" ));
+            TextColumn tc2 = new TextColumn(new Text("cF"), new Text("obj" + 
"\u0000" + "cQ" ));
+            TextColumn tc3 = new TextColumn(new Text("CF"), new Text("obj" + 
"\u0000" + "CQ" ));
+
+            TextColumn[] tc = new TextColumn[3];
+            tc[0] = tc1;
+            tc[1] = tc2;
+            tc[2] = tc3;
+
+            IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+            dii.setColumnFamilies(is, tc);
+
+            Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+            scan.addScanIterator(is);
+
+            int results = 0;
+            System.out.println("************************Test 
1****************************");
+            for (Map.Entry<Key, Value> e : scan) {
+                System.out.println(e);
+                results++;
+            }
+            
+            
+            Assert.assertEquals(2, results);
+
+            
+            
+
+    }
+    
+    
+    
+    
+    
+    
+    
+@Test
+    public void testBasicColumnObjPrefix()  throws Exception {
+
+        BatchWriter bw = null;
+
+            bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+            for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+                m.put(new Text("cf"), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" ), new Value(new byte[0]));
+                m.put(new Text("cF"), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cQ"), new Value(new byte[0]));
+
+                if (i == 30 || i == 60) {
+                    m.put(new Text("CF"), new Text(null + "\u0000" +"obj" + 
"\u0000" + "CQ" ), new Value(new byte[0]));
+                }
+                
+                
+
+                bw.addMutation(m);
+
+            }
+            
+            DocumentIndexIntersectingIterator dii = new 
DocumentIndexIntersectingIterator();
+            TextColumn tc1 = new TextColumn(new Text("cf"), new Text("obj" + 
"\u0000" + "cq"));
+            TextColumn tc2 = new TextColumn(new Text("cF"), new Text("obj" + 
"\u0000" + "cQ"));
+            TextColumn tc3 = new TextColumn(new Text("CF"), new Text("obj"));
+
+            TextColumn[] tc = new TextColumn[3];
+            tc[0] = tc1;
+            tc[1] = tc2;
+            tc[2] = tc3;
+            
+            tc3.setIsPrefix(true);
+
+            IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+            dii.setColumnFamilies(is, tc);
+
+            Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+            scan.addScanIterator(is);
+
+            int results = 0;
+            System.out.println("************************Test 
2****************************");
+            for (Map.Entry<Key, Value> e : scan) {
+                System.out.println(e);
+                results++;
+            }
+            
+            
+            Assert.assertEquals(2, results);
+
+            
+            
+
+    }
+    
+    
+    
+    
+@Test
+    public void testBasicColumnSubjObjPrefix() throws Exception {
+
+        BatchWriter bw = null;
+
+            bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+            for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+                m.put(new Text("cf"), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq"), new Value(new byte[0]));
+                m.put(new Text("cF"), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cQ"), new Value(new byte[0]));
+
+                if (i == 30 ) {
+                    m.put(new Text("CF"), new Text(null + "\u0000" +"obj" + 
"\u0000" + "CQ"), new Value(new byte[0]));
+                }
+                
+                if  (i == 60) {
+                    m.put(new Text("CF"), new Text(null + "\u0000" +"subj" + 
"\u0000" + "CQ"), new Value(new byte[0]));
+                }
+                
+                
+                
+
+                bw.addMutation(m);
+
+            }
+            
+            DocumentIndexIntersectingIterator dii = new 
DocumentIndexIntersectingIterator();
+            TextColumn tc1 = new TextColumn(new Text("cf"), new Text("obj" + 
"\u0000" + "cq" ));
+            TextColumn tc2 = new TextColumn(new Text("cF"), new Text("obj" + 
"\u0000" + "cQ"));
+            TextColumn tc3 = new TextColumn(new Text("CF"), new Text("subj"));
+
+            TextColumn[] tc = new TextColumn[3];
+            tc[0] = tc1;
+            tc[1] = tc2;
+            tc[2] = tc3;
+            
+            tc3.setIsPrefix(true);
+
+            IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+            dii.setColumnFamilies(is, tc);
+
+            Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+            scan.addScanIterator(is);
+
+            int results = 0;
+            System.out.println("************************Test 
3****************************");
+            for (Map.Entry<Key, Value> e : scan) {
+                System.out.println(e);
+                results++;
+            }
+            
+            
+            Assert.assertEquals(1, results);
+
+            
+            
+
+    }
+    
+    
+    
+    
+@Test
+    public void testOneHundredColumnSubjObj() throws Exception {
+
+        BatchWriter bw = null;
+
+            bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+            for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+                
+                for(int j= 0; j < 100; j++) {
+                    m.put(new Text("cf" + j), new Text(null + "\u0000" +"obj" 
+ "\u0000" + "cq" + j), new Value(new byte[0]));
+                }
+                
+                if (i == 30 ) {
+                    m.put(new Text("cf" + 100), new Text(null + "\u0000" 
+"obj" + "\u0000" + "cq" + 100), new Value(new byte[0]));
+                }
+                
+                if  (i == 60) {
+                    m.put(new Text("cf" + 100), new Text(null + "\u0000" 
+"subj" + "\u0000" + "cq" + 100), new Value(new byte[0]));
+                }
+                
+                
+                
+
+                bw.addMutation(m);
+
+            }
+            
+            DocumentIndexIntersectingIterator dii = new 
DocumentIndexIntersectingIterator();
+            TextColumn tc1 = new TextColumn(new Text("cf" + 20), new 
Text("obj" + "\u0000" + "cq" + 20));
+            TextColumn tc2 = new TextColumn(new Text("cf" + 50), new 
Text("obj" + "\u0000" + "cq" + 50));
+            TextColumn tc3 = new TextColumn(new Text("cf" + 100), new 
Text("obj" + "\u0000" + "cq" + 100));
+
+            TextColumn[] tc = new TextColumn[3];
+            tc[0] = tc1;
+            tc[1] = tc2;
+            tc[2] = tc3;
+
+            IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+            dii.setColumnFamilies(is, tc);
+
+            Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+            scan.addScanIterator(is);
+
+            int results = 0;
+            System.out.println("************************Test 
4****************************");
+            for (Map.Entry<Key, Value> e : scan) {
+                System.out.println(e);
+                results++;
+            }
+            
+            
+            Assert.assertEquals(1, results);
+
+            
+            
+
+    }
+    
+    
+    
+    
+@Test
+    public void testOneHundredColumnObjPrefix() throws Exception {
+
+        BatchWriter bw = null;
+
+            bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+            for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+                
+                for(int j= 0; j < 100; j++) {
+                    m.put(new Text("cf" + j), new Text(null + "\u0000" +"obj" 
+ "\u0000" + "cq" + j ), new Value(new byte[0]));
+                }
+                
+                if (i == 30 || i == 60 || i == 90 || i == 99) {
+                    m.put(new Text("cf" + 100), new Text(null + "\u0000" 
+"obj" + "\u0000" + "cq" + (100 + i)), new Value(new byte[0]));
+                }
+                
+                
+                
+                
+                
+
+                bw.addMutation(m);
+
+            }
+            
+            DocumentIndexIntersectingIterator dii = new 
DocumentIndexIntersectingIterator();
+            TextColumn tc1 = new TextColumn(new Text("cf" + 20), new 
Text("obj" + "\u0000" + "cq" + 20));
+            TextColumn tc2 = new TextColumn(new Text("cf" + 50), new 
Text("obj" + "\u0000" + "cq" + 50));
+            TextColumn tc3 = new TextColumn(new Text("cf" + 100), new 
Text("obj"));
+
+            TextColumn[] tc = new TextColumn[3];
+            tc[0] = tc1;
+            tc[1] = tc2;
+            tc[2] = tc3;
+            
+            tc3.setIsPrefix(true);
+
+            IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+            dii.setColumnFamilies(is, tc);
+
+            Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+            scan.addScanIterator(is);
+
+            int results = 0;
+            System.out.println("************************Test 
5****************************");
+            for (Map.Entry<Key, Value> e : scan) {
+                System.out.println(e);
+                results++;
+            }
+            
+            
+            Assert.assertEquals(4, results);
+
+            
+            
+
+    }
+    
+    
+    
+    
+    
+    
+    
+@Test
+    public void testOneHundredColumnMultipleEntriesPerSubject() throws 
Exception {
+
+        BatchWriter bw = null;
+
+            bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+            for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+                
+                for(int j= 0; j < 100; j++) {
+                    m.put(new Text("cf" + j), new Text(null + "\u0000" +"obj" 
+ "\u0000" + "cq" + j ), new Value(new byte[0]));
+                }
+                
+                if (i == 30 || i == 60 || i == 90 || i == 99) {
+                    m.put(new Text("cf" + 100), new Text(null + "\u0000" 
+"obj" + "\u0000" + "cq" + (100 + i)), new Value(new byte[0]));
+                    m.put(new Text("cf" + 100), new Text(null + "\u0000" 
+"obj" + "\u0000" + "cq" + (100 + i + 1)), new Value(new byte[0]));
+                }
+                
+                
+                
+                
+                
+
+                bw.addMutation(m);
+
+            }
+            
+            DocumentIndexIntersectingIterator dii = new 
DocumentIndexIntersectingIterator();
+            TextColumn tc1 = new TextColumn(new Text("cf" + 20), new 
Text("obj" + "\u0000" + "cq" + 20 ));
+            TextColumn tc2 = new TextColumn(new Text("cf" + 50), new 
Text("obj" + "\u0000" + "cq" + 50));
+            TextColumn tc3 = new TextColumn(new Text("cf" + 100), new 
Text("obj"));
+
+            tc3.setIsPrefix(true);
+            
+            TextColumn[] tc = new TextColumn[3];
+            tc[0] = tc1;
+            tc[1] = tc2;
+            tc[2] = tc3;
+
+            IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+            dii.setColumnFamilies(is, tc);
+
+            Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+            scan.addScanIterator(is);
+
+            int results = 0;
+            System.out.println("************************Test 
6****************************");
+            for (Map.Entry<Key, Value> e : scan) {
+                System.out.println(e);
+                results++;
+            }
+            
+            
+            Assert.assertEquals(8, results);
+
+            
+            
+
+    }
+    
+    
+    
+    
+
+@Test
+public void testOneHundredColumnSubjObjPrefix() throws Exception {
+
+    BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+            
+            for(int j= 0; j < 100; j++) {
+                m.put(new Text("cf" + j), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" + j), new Value(new byte[0]));
+            }
+            
+            if (i == 30 || i == 60 || i == 90 || i == 99) {
+                m.put(new Text("cf" + 100), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" + (100 + i)), new Value(new byte[0]));
+                m.put(new Text("cf" + 100), new Text(null + "\u0000" +"subj" + 
"\u0000" + "cq" + (100 + i + 1)), new Value(new byte[0]));
+            }
+            
+            
+            
+            
+            
+
+            bw.addMutation(m);
+
+        }
+        
+        DocumentIndexIntersectingIterator dii = new 
DocumentIndexIntersectingIterator();
+        TextColumn tc1 = new TextColumn(new Text("cf" + 20), new Text("obj" + 
"\u0000" + "cq" + 20));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 50), new Text("obj" + 
"\u0000" + "cq" + 50));
+        TextColumn tc3 = new TextColumn(new Text("cf" + 100), new 
Text("subj"));
+
+        tc3.setIsPrefix(true);
+        
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+        IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+        dii.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 
7****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+        
+        
+        Assert.assertEquals(4, results);
+
+        
+        
+
+}
+
+
+
+
+
+
+@Test
+public void testOneHundredColumnSubjObjPrefixFourTerms() throws Exception {
+
+    BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+            
+            for(int j= 0; j < 100; j++) {
+                m.put(new Text("cf" + j), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" + j), new Value(new byte[0]));
+            }
+            
+            if (i == 30 || i == 60 || i == 90 || i == 99) {
+                m.put(new Text("cf" + 100), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" + (100 + i)), new Value(new byte[0]));
+                m.put(new Text("cf" + 100), new Text(null + "\u0000" +"subj" + 
"\u0000" + "cq" + (100 + i + 1)), new Value(new byte[0]));
+            }
+            
+            
+            
+            
+            
+
+            bw.addMutation(m);
+
+        }
+        
+        DocumentIndexIntersectingIterator dii = new 
DocumentIndexIntersectingIterator();
+        TextColumn tc1 = new TextColumn(new Text("cf" + 20), new Text("obj" + 
"\u0000" + "cq" + 20));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 50), new Text("obj" + 
"\u0000" + "cq" + 50));
+        TextColumn tc3 = new TextColumn(new Text("cf" + 100), new 
Text("subj"));
+        TextColumn tc4 = new TextColumn(new Text("cf" + 100), new Text("obj"));
+
+        tc3.setIsPrefix(true);
+        tc4.setIsPrefix(true);
+        
+        TextColumn[] tc = new TextColumn[4];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+        tc[3] = tc4;
+
+        IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+        dii.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 
8****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+        
+        
+        Assert.assertEquals(4, results);
+
+        
+        
+
+}
+
+
+
+
+
+
+//@Test
+public void testOneHundredColumnSameCf() throws Exception {
+
+    BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+            
+            for(int j= 0; j < 100; j++) {
+                m.put(new Text("cf"), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" + j), new Value(new byte[0]));
+            }
+             
+            
+
+            bw.addMutation(m);
+
+        }
+        
+        DocumentIndexIntersectingIterator dii = new 
DocumentIndexIntersectingIterator();
+        TextColumn tc1 = new TextColumn(new Text("cf" ), new Text("obj" + 
"\u0000" + "cq" + 20));
+        TextColumn tc2 = new TextColumn(new Text("cf"), new Text("obj" + 
"\u0000" + "cq" + 50));
+        TextColumn tc3 = new TextColumn(new Text("cf" ), new Text("obj" + 
"\u0000" + "cq" + 80));
+        TextColumn tc4 = new TextColumn(new Text("cf"), new Text("obj"));
+
+        tc4.setIsPrefix(true);
+        
+        TextColumn[] tc = new TextColumn[4];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+        tc[3] = tc4;
+
+        IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+        dii.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 
9****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            //System.out.println(e);
+            results++;
+        }
+        
+        
+        Assert.assertEquals(10000, results);
+
+        
+        
+
+}
+
+
+
+
+
+@Test
+public void testGeneralStarQuery() throws Exception {
+
+  BatchWriter bw = null;
+
+      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+     
+      
+      for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+    
+                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" + 1), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" + 2 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"subj" + 
"\u0000" + "cq" + 1 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"subj" + 
"\u0000" + "cq" + 2 ), new Value(new byte[0]));
+                
+                
+
+                if(i == 30 || i == 60 ) {
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" 
+ "\u0000" + "cq" + 3), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" 
+ "\u0000" + "cq" + 3), new Value(new byte[0]));
+                }
+                
+                bw.addMutation(m);
+
+      }
+     
+      
+      DocumentIndexIntersectingIterator dii = new 
DocumentIndexIntersectingIterator();
+      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + 
"\u0000" + "cq" + 1));
+      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + 
"\u0000" + "cq" + 2));
+      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("subj" + 
"\u0000" + "cq" + 3));
+
+      
+      TextColumn[] tc = new TextColumn[3];
+      tc[0] = tc1;
+      tc[1] = tc2;
+      tc[2] = tc3;
+    
+
+      IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+      dii.setColumnFamilies(is, tc);
+
+      Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+      scan.addScanIterator(is);
+
+      int results = 0;
+      System.out.println("************************Test 
10****************************");
+      for (Map.Entry<Key, Value> e : scan) {
+          System.out.println(e);
+          results++;
+      }
+      
+      
+      Assert.assertEquals(2, results);
+
+      
+      
+
+}
+
+
+
+
+
+
+
+@Test
+public void testGeneralStarQuerySubjPrefix() throws Exception {
+
+  BatchWriter bw = null;
+
+      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+     
+      
+      for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+    
+                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" + 1), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" + 2 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"subj" + 
"\u0000" + "cq" + 1), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"subj" + 
"\u0000" + "cq" + 2), new Value(new byte[0]));
+                
+                
+
+                if(i == 30 || i == 60 || i == 90 || i == 99) {
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" 
+ "\u0000" + "cq" + 3), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" 
+ "\u0000" + "cq" + 3), new Value(new byte[0]));
+                }
+                
+                bw.addMutation(m);
+
+      }
+     
+      
+      DocumentIndexIntersectingIterator dii = new 
DocumentIndexIntersectingIterator();
+      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + 
"\u0000" + "cq" + 1));
+      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + 
"\u0000" + "cq" + 2));
+      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("subj"));
+
+      tc3.setIsPrefix(true);
+      
+      TextColumn[] tc = new TextColumn[3];
+      tc[0] = tc1;
+      tc[1] = tc2;
+      tc[2] = tc3;
+    
+
+      IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+      dii.setColumnFamilies(is, tc);
+
+      Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+      scan.addScanIterator(is);
+
+      int results = 0;
+      System.out.println("************************Test 
11****************************");
+      for (Map.Entry<Key, Value> e : scan) {
+          System.out.println(e);
+          results++;
+      }
+      
+      
+      Assert.assertEquals(4, results);
+
+      
+      
+
+}
+
+
+
+
+
+@Test
+public void testGeneralStarQueryMultipleSubjPrefix() throws Exception {
+
+  BatchWriter bw = null;
+
+      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+     
+      
+      for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+    
+                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" + 1), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" + 2 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"subj" + 
"\u0000" + "cq" + 1 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"subj" + 
"\u0000" + "cq" + 2), new Value(new byte[0]));
+                
+                
+
+                if(i == 30 || i == 60 || i == 90 || i == 99) {
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" 
+ "\u0000" + "cq" + 3 ), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" 
+ "\u0000" + "cq" + 3), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" 
+ "\u0000" + "cq" + 4), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" 
+ "\u0000" + "cq" + 4), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" 
+ "\u0000" + "cq" + 5), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" 
+ "\u0000" + "cq" + 5), new Value(new byte[0]));
+                }
+                
+                bw.addMutation(m);
+
+      }
+     
+      
+     
+      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + 
"\u0000" + "cq" + 1));
+      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + 
"\u0000" + "cq" + 2));
+      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("subj"));
+
+      tc3.setIsPrefix(true);
+      
+      TextColumn[] tc = new TextColumn[3];
+      tc[0] = tc1;
+      tc[1] = tc2;
+      tc[2] = tc3;
+    
+
+      IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+
+      Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+      scan.addScanIterator(is);
+
+      int results = 0;
+      System.out.println("************************Test 
12****************************");
+      for (Map.Entry<Key, Value> e : scan) {
+          System.out.println(e);
+          results++;
+      }
+      
+      
+      Assert.assertEquals(12, results);
+
+      
+      
+
+}
+
+
+
+
+@Test
+public void testFixedRangeColumnValidateExact() throws Exception {
+
+  BatchWriter bw = null;
+
+      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+     
+      
+      for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+    
+                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" + 1 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" + 2), new Value(new byte[0]));
+                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"subj" + 
"\u0000" + "cq" + 1), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"subj" + 
"\u0000" + "cq" + 2), new Value(new byte[0]));
+                
+                
+
+                if(i == 30 || i == 60 || i == 90 || i == 99) {
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" 
+ "\u0000" + "cq" + 3), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" 
+ "\u0000" + "cq" + 3), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" 
+ "\u0000" + "cq" + 4), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" 
+ "\u0000" + "cq" + 4), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" 
+ "\u0000" + "cq" + 5), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" 
+ "\u0000" + "cq" + 5), new Value(new byte[0]));
+                }
+                
+                bw.addMutation(m);
+
+      }
+     
+      
+     
+      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + 
"\u0000" + "cq" + 1));
+      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + 
"\u0000" + "cq" + 2));
+      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("subj" + 
"\u0000" + "cq" + 3));
+      TextColumn tc4 = new TextColumn(new Text("cf" + 3), new Text("subj" + 
"\u0000" + "cq" + 4));
+      TextColumn tc5 = new TextColumn(new Text("cf" + 3), new Text("subj" + 
"\u0000" + "cq" + 5));
+
+
+      
+      TextColumn[] tc = new TextColumn[5];
+      tc[0] = tc1;
+      tc[1] = tc2;
+      tc[2] = tc3;
+      tc[3] = tc4;
+      tc[4] = tc5;
+    
+
+      IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+
+      Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+      scan.setRange(Range.exact(new Text("" + 30)));
+      scan.addScanIterator(is);
+
+      int results = 0;
+      System.out.println("************************Test 
14****************************");
+      for (Map.Entry<Key, Value> e : scan) {
+          System.out.println(e);
+          results++;
+      }
+      
+      
+      Assert.assertEquals(1, results);
+
+      
+      
+
+}
+
+
+
+
+
+
+@Test
+public void testLubmLikeTest() throws Exception {
+
+  BatchWriter bw = null;
+
+      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+     
+      
+      for (int i = 0; i < 100; i++) {
+
+                Mutation m1 = new Mutation(new Text("ProfessorA" + i));
+                Mutation m2= new Mutation(new Text("ProfessorB" + i));
+    
+                m1.put(new 
Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#doctoralDegreeFrom";), 
+                        new Text(null + "\u0000" +"object" + "\u0000" + 
"http://www.University"; + i + ".edu"), new Value(new byte[0]));
+                m2.put(new 
Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#doctoralDegreeFrom";), 
+                        new Text(null + "\u0000" +"object" + "\u0000" + 
"http://www.University"; + i + ".edu"), new Value(new byte[0]));
+                m1.put(new 
Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#teacherOf";), 
+                        new Text(null + "\u0000" +"object" + "\u0000" + 
"http://Course"; + i), new Value(new byte[0]));
+                m2.put(new 
Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#teacherOf";), 
+                        new Text(null + "\u0000" +"object" + "\u0000" + 
"http://Course"; + i), new Value(new byte[0]));
+            
+                
+                bw.addMutation(m1);
+                bw.addMutation(m2);
+
+      }
+     
+      
+     
+      TextColumn tc1 = new TextColumn(new 
Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#doctoralDegreeFrom"; ), 
+              new Text("object" + "\u0000" + "http://www.University"; + 30 + 
".edu"));
+      TextColumn tc2 = new TextColumn(new 
Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#teacherOf";), 
+              new Text("object" + "\u0000" + "http://Course"; + 30));
+      
+
+
+      
+      TextColumn[] tc = new TextColumn[2];
+      tc[0] = tc1;
+      tc[1] = tc2;
+     
+
+      IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+
+      Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+      scan.addScanIterator(is);
+
+      int results = 0;
+      System.out.println("************************Test 
15****************************");
+      for (Map.Entry<Key, Value> e : scan) {
+          System.out.println(e);
+          results++;
+      }
+      
+      
+      Assert.assertEquals(2, results);
+
+      
+      
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@Test
+public void testFixedRangeColumnValidateSubjPrefix() throws Exception {
+
+  BatchWriter bw = null;
+
+      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+     
+      
+      for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+    
+                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" + 1 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"obj" + 
"\u0000" + "cq" + 2), new Value(new byte[0]));
+                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"subj" + 
"\u0000" + "cq" + 1 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"subj" + 
"\u0000" + "cq" + 2 ), new Value(new byte[0]));
+                
+                
+
+                if(i == 30 || i == 60 || i == 90 || i == 99) {
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" 
+ "\u0000" + "cq" + 3 ), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" 
+ "\u0000" + "cq" + 3), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" 
+ "\u0000" + "cq" + 4), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" 
+ "\u0000" + "cq" + 4 ), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" 
+ "\u0000" + "cq" + 5 ), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" 
+ "\u0000" + "cq" + 5 ), new Value(new byte[0]));
+                }
+                
+                bw.addMutation(m);
+
+      }
+     
+      
+     
+      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + 
"\u0000" + "cq" + 1));
+      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + 
"\u0000" + "cq" + 2));
+      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("subj"));
+
+      tc3.setIsPrefix(true);
+      
+      TextColumn[] tc = new TextColumn[3];
+      tc[0] = tc1;
+      tc[1] = tc2;
+      tc[2] = tc3;
+    
+
+      IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+
+      Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+      scan.setRange(Range.exact(new Text("" + 30)));
+      scan.addScanIterator(is);
+
+      int results = 0;
+      System.out.println("************************Test 
13****************************");
+      for (Map.Entry<Key, Value> e : scan) {
+          System.out.println(e);
+          results++;
+      }
+      
+      
+      Assert.assertEquals(3, results);
+
+      
+      
+
+}
+
+
+
+
+
+//@Test
+//public void testRangeBound() {
+//
+//  BatchWriter bw = null;
+//
+//  try {
+//    
+//
+//     
+//      
+//      for (int i = 0; i < 100; i++) {
+//
+//                Mutation m = new Mutation(new Text("" + i));
+//    
+//                m.put(new Text("cf" + 1), new Text("obj" + "\u0000" + "cq" + 
1), new Value(new byte[0]));
+//                m.put(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 
2), new Value(new byte[0]));
+//                m.put(new Text("cf" + 1), new Text("subj" + "\u0000" + "cq" 
+ 1), new Value(new byte[0]));
+//                m.put(new Text("cf" + 2), new Text("subj" + "\u0000" + "cq" 
+ 2), new Value(new byte[0]));
+//                
+//                
+//
+//                if(i == 30 || i == 60 || i == 90 || i == 99) {
+//                    m.put(new Text("cf" + 3), new Text("obj" + "\u0000" + 
"cq" + 3), new Value(new byte[0]));
+//                    m.put(new Text("cf" + 3), new Text("subj" + "\u0000" + 
"cq" + 3), new Value(new byte[0]));
+//                    m.put(new Text("cf" + 3), new Text("obj" + "\u0000" + 
"cq" + 4), new Value(new byte[0]));
+//                    m.put(new Text("cf" + 3), new Text("subj" + "\u0000" + 
"cq" + 4), new Value(new byte[0]));
+//                    m.put(new Text("cf" + 3), new Text("obj" + "\u0000" + 
"cq" + 5), new Value(new byte[0]));
+//                    m.put(new Text("cf" + 3), new Text("subj" + "\u0000" + 
"cq" + 5), new Value(new byte[0]));
+//                }
+//                
+//                bw.addMutation(m);
+//
+//      }
+//     
+//    
+//      
+//     Text cf = new Text("cf" + 3); 
+//     Text cq = new Text("obj" + "\u0000" + "cq" + 3);
+//    
+//      Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+//      scan.fetchColumn(cf, cq );
+//      scan.setRange(new Range());
+//      
+//
+//      int results = 0;
+//      System.out.println("************************Test 
14****************************");
+//      for (Map.Entry<Key, Value> e : scan) {
+//          System.out.println(e);
+//          results++;
+//      }
+//      
+//      
+//      
+//
+//      
+//      
+//  } catch (MutationsRejectedException e) {
+//      // TODO Auto-generated catch block
+//      e.printStackTrace();
+//  } catch (TableNotFoundException e) {
+//      // TODO Auto-generated catch block
+//      e.printStackTrace();
+//  }
+//
+//}
+
+
+
+  
+
+@Test
+public void testContext1() throws Exception {
+
+  BatchWriter bw = null;
+
+      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+     
+      
+      for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+    
+                m.put(new Text("cf" + 1), new Text("context1" + "\u0000" + 
"obj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text("context1" + "\u0000" 
+"obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
+                
+
+                if(i == 30 || i == 60 || i == 90 || i == 99) {
+                    m.put(new Text("cf" + 3), new Text("context1" + "\u0000" 
+"obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text("context2" + "\u0000" 
+"obj" + "\u0000" + "cq" + 4 ), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text("context1" + "\u0000" 
+"obj" + "\u0000" + "cq" + 5 ), new Value(new byte[0]));
+                 
+                }
+                
+                bw.addMutation(m);
+
+      }
+     
+      
+     
+      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + 
"\u0000" + "cq" + 1));
+      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + 
"\u0000" + "cq" + 2));
+      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("obj"));
+
+      tc3.setIsPrefix(true);
+      
+      TextColumn[] tc = new TextColumn[3];
+      tc[0] = tc1;
+      tc[1] = tc2;
+      tc[2] = tc3;
+    
+
+      IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+      DocumentIndexIntersectingIterator.setContext(is, "context1");
+
+      Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+     
+      scan.addScanIterator(is);
+
+      int results = 0;
+      System.out.println("************************Test 
14****************************");
+      for (Map.Entry<Key, Value> e : scan) {
+          System.out.println(e);
+          results++;
+      }
+      
+      
+      Assert.assertEquals(8, results);
+
+      
+      
+
+}
+
+
+
+
+
+
+
+@Test
+public void testContext2() throws Exception {
+
+  BatchWriter bw = null;
+
+      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+     
+      
+      for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+    
+                m.put(new Text("cf" + 1), new Text("context1" + "\u0000" 
+"obj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text("context1" + "\u0000" 
+"obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text("context2" + "\u0000" 
+"obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
+                
+
+                if(i == 30 || i == 60 || i == 90 || i == 99) {
+                    m.put(new Text("cf" + 3), new Text("context1" + "\u0000" 
+"obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text("context2" + "\u0000" 
+"obj" + "\u0000" + "cq" + 4 ), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text("context3" + "\u0000" 
+"obj" + "\u0000" + "cq" + 5 ), new Value(new byte[0]));
+                 
+                }
+                
+                bw.addMutation(m);
+
+      }
+     
+      
+     
+      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + 
"\u0000" + "cq" + 1));
+      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + 
"\u0000" + "cq" + 2));
+      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("obj"));
+
+      tc3.setIsPrefix(true);
+      
+      TextColumn[] tc = new TextColumn[3];
+      tc[0] = tc1;
+      tc[1] = tc2;
+      tc[2] = tc3;
+    
+
+      IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+      DocumentIndexIntersectingIterator.setContext(is, "context2");
+
+      Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+     
+      scan.addScanIterator(is);
+
+      int results = 0;
+      System.out.println("************************Test 
15****************************");
+      for (Map.Entry<Key, Value> e : scan) {
+          System.out.println(e);
+          results++;
+      }
+      
+      
+      Assert.assertEquals(0, results);
+
+      
+      
+
+}
+
+
+
+
+
+
+
+
+@Test
+public void testContext3() throws Exception {
+
+  BatchWriter bw = null;
+
+      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+     
+      
+      for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+    
+                m.put(new Text("cf" + 1), new Text("context1" + "\u0000" 
+"obj" + "\u0000" + "cq" + 1 + "\u0000" + "context1"), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text("context1" + "\u0000" 
+"obj" + "\u0000" + "cq" + 2 + "\u0000" + "context1"), new Value(new byte[0]));
+                m.put(new Text("cf" + 1), new Text("context2" + "\u0000" 
+"obj" + "\u0000" + "cq" + 1 + "\u0000" + "context2"), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text("context2" + "\u0000" 
+"obj" + "\u0000" + "cq" + 2 + "\u0000" + "context2"), new Value(new byte[0]));
+                
+
+                if(i == 30 || i == 60 || i == 90 || i == 99) {
+                    m.put(new Text("cf" + 3), new Text("context1" + "\u0000" 
+"obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text("context2" + "\u0000" 
+"obj" + "\u0000" + "cq" + 4 ), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text("context3" + "\u0000" 
+"obj" + "\u0000" + "cq" + 5 ), new Value(new byte[0]));
+                 
+                }
+                
+                bw.addMutation(m);
+
+      }
+     
+      
+     
+      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + 
"\u0000" + "cq" + 1));
+      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + 
"\u0000" + "cq" + 2));
+      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("obj"));
+
+      tc3.setIsPrefix(true);
+      
+      TextColumn[] tc = new TextColumn[3];
+      tc[0] = tc1;
+      tc[1] = tc2;
+      tc[2] = tc3;
+    
+
+      IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+      DocumentIndexIntersectingIterator.setContext(is, "context2");
+
+      Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+     
+      scan.addScanIterator(is);
+
+      int results = 0;
+      System.out.println("************************Test 
16****************************");
+      for (Map.Entry<Key, Value> e : scan) {
+          System.out.println(e);
+          results++;
+      }
+      
+      
+      Assert.assertEquals(4, results);
+
+      
+      
+
+}
+
+
+
+
+
+
+
+
+
+@Test
+public void testContext4() throws Exception {
+
+  BatchWriter bw = null;
+
+      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+     
+      
+      for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+    
+                m.put(new Text("cf" + 1), new Text("context1" + "\u0000" 
+"obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text("context1" + "\u0000" 
+"obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
+                m.put(new Text("cf" + 1), new Text("context2" + "\u0000" 
+"obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text("context2" + "\u0000" 
+"obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
+                
+
+                if(i == 30 || i == 60 || i == 90 || i == 99) {
+                    m.put(new Text("cf" + 3), new Text("context1" + "\u0000" 
+"obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text("context2" + "\u0000" 
+"obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+                    
+                 
+                }
+                
+                bw.addMutation(m);
+
+      }
+     
+      
+     
+      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + 
"\u0000" + "cq" + 1));
+      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + 
"\u0000" + "cq" + 2));
+      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("obj"));
+
+      tc3.setIsPrefix(true);
+      
+      TextColumn[] tc = new TextColumn[3];
+      tc[0] = tc1;
+      tc[1] = tc2;
+      tc[2] = tc3;
+    
+
+      IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+     
+
+      Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+     
+      scan.addScanIterator(is);
+
+      int results = 0;
+      System.out.println("************************Test 
17****************************");
+      for (Map.Entry<Key, Value> e : scan) {
+          System.out.println(e);
+          results++;
+      }
+      
+      
+      Assert.assertEquals(8, results);
+
+      
+      
+
+
+}
+
+
+
+
+
+@Test
+public void testContext5() throws Exception {
+
+  BatchWriter bw = null;
+
+      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+     
+      
+      for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("" + i));
+    
+                m.put(new Text("cf" + 1), new Text("context1" + "\u0000"  + 
"obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text("context1" + "\u0000"  + 
"obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
+                m.put(new Text("cf" + 1), new Text("context2" + "\u0000"  + 
"obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text("context2" + "\u0000"  + 
"obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
+                m.put(new Text("cf" + 1), new Text(null + "\u0000" + "obj" + 
"\u0000" + "cq" + 1 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text(null + "\u0000" + "obj" + 
"\u0000" + "cq" + 2 ), new Value(new byte[0]));
+                
+
+                if(i == 30 || i == 60 || i == 90 || i == 99) {
+                    m.put(new Text("cf" + 3), new Text("context1" + "\u0000"  
+ "obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text("context2" + "\u0000"  
+ "obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
+                    m.put(new Text("cf" + 3), new Text(null + "\u0000"  + 
"obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
+                    
+                 
+                }
+                
+                bw.addMutation(m);
+
+      }
+     
+      
+     
+      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + 
"\u0000" + "cq" + 1));
+      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + 
"\u0000" + "cq" + 2));
+      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("obj"));
+
+      tc3.setIsPrefix(true);
+      
+      TextColumn[] tc = new TextColumn[3];
+      tc[0] = tc1;
+      tc[1] = tc2;
+      tc[2] = tc3;
+    
+
+      IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+     
+
+      Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+     
+      scan.addScanIterator(is);
+
+      int results = 0;
+      System.out.println("************************Test 
18****************************");
+      for (Map.Entry<Key, Value> e : scan) {
+          System.out.println(e);
+          results++;
+      }
+      
+      
+      Assert.assertEquals(12, results);
+
+      
+      
+
+}
+
+
+
+
+
+
+@Test
+public void testContext6() throws Exception {
+
+  BatchWriter bw = null;
+
+      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+     
+      
+      for (int i = 0; i < 100; i++) {
+
+                Mutation m = new Mutation(new Text("row" + i));
+               
+    
+                m.put(new Text("cf" + 1), new Text("context1" + "\u0000"  + 
"obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text("context1" + "\u0000"  + 
"subj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+                m.put(new Text("cf" + 1), new Text("context2" + "\u0000"  + 
"obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text("context2" + "\u0000"  + 
"subj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+     
+                
+                bw.addMutation(m);
+                
+
+      }
+     
+      
+     
+      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" ));
+      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("subj" ));
+      
+
+      tc1.setIsPrefix(true);
+      tc2.setIsPrefix(true);
+      
+      TextColumn[] tc = new TextColumn[2];
+      tc[0] = tc1;
+      tc[1] = tc2;
+      
+    
+
+      IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+      DocumentIndexIntersectingIterator.setContext(is, "context2");
+
+      Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+     
+      scan.addScanIterator(is);
+
+      int results = 0;
+      System.out.println("************************Test 
19****************************");
+      for (Map.Entry<Key, Value> e : scan) {
+          System.out.println(e);
+          results++;
+      }
+      
+      
+      Assert.assertEquals(100, results);
+
+      
+      
+
+}
+
+
+
+@Test
+public void testContext7() throws Exception {
+
+  BatchWriter bw = null;
+
+      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+     
+      
+      for (int i = 0; i < 10; i++) {
+
+                Mutation m = new Mutation(new Text("row" + i));
+               
+    
+                m.put(new Text("cf" + 1), new Text("context1" + "\u0000"  + 
"obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text("context1" + "\u0000"  + 
"obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text("context1" + "\u0000"  + 
"obj" + "\u0000" + "cq" + 100 + i), new Value(new byte[0]));
+                m.put(new Text("cf" + 1), new Text("context2" + "\u0000"  + 
"obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text("context2" + "\u0000"  + 
"obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+                m.put(new Text("cf" + 2), new Text("context2" + "\u0000"  + 
"obj" + "\u0000" + "cq" + 100+i), new Value(new byte[0]));
+     
+                
+                bw.addMutation(m);
+                
+
+      }
+     
+      
+     
+      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" ));
+      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" ));
+      
+
+      tc1.setIsPrefix(true);
+      tc2.setIsPrefix(true);
+      
+      TextColumn[] tc = new TextColumn[2];
+      tc[0] = tc1;
+      tc[1] = tc2;
+      
+    
+
+      IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+      
+
+      Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+     
+      scan.addScanIterator(is);
+
+      int results = 0;
+      System.out.println("************************Test 
20****************************");
+      for (Map.Entry<Key, Value> e : scan) {
+          System.out.println(e);
+          results++;
+      }
+      
+      
+      Assert.assertEquals(40, results);
+
+      
+      
+
+}
+
+
+
+
+
+
+
+@Test
+public void testSerialization1() throws Exception {
+
+  BatchWriter bw = null;
+  AccumuloRdfConfiguration acc = new AccumuloRdfConfiguration();
+  acc.set(AccumuloRdfConfiguration.CONF_ADDITIONAL_INDEXERS, 
EntityCentricIndex.class.getName());
+  RyaTableMutationsFactory rtm = new 
RyaTableMutationsFactory(RyaTripleContext.getInstance(acc));
+
+      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, 
Long.MAX_VALUE, 30);
+
+     
+      
+      for (int i = 0; i < 20; i++) {
+                  
+          
+                RyaStatement rs1 = new RyaStatement(new RyaURI("uri:" + i ), 
new RyaURI("uri:cf1"), new RyaType(XMLSchema.STRING, "cq1"));
+                RyaStatement rs2 = new RyaStatement(new RyaURI("uri:" + i ), 
new RyaURI("uri:cf2"), new RyaType(XMLSchema.STRING, "cq2"));
+                RyaStatement rs3 = null;
+                RyaStatement rs4 = null;
+               
+                if(i == 5 || i == 15) {
+                    rs3 = new RyaStatement(new RyaURI("uri:" +i ), new 
RyaURI("uri:cf3"), new RyaType(XMLSchema.INTEGER,Integer.toString(i)));
+                    rs4 = new RyaStatement(new RyaURI("uri:" +i ), new 
RyaURI("uri:cf3"), new RyaType(XMLSchema.STRING,Integer.toString(i)));
+                }
+                
+
+                
+                Collection<Mutation> m1 = 
EntityCentricIndex.createMutations(rs1);
+                for (Mutation m : m1) {
+                    bw.addMutation(m);
+                }
+                Collection<Mutation> m2 = 
EntityCentricIndex.createMutations(rs2);
+                for (Mutation m : m2) {
+                    bw.addMutation(m);
+                }
+                if (rs3 != null) {
+                    Collection<Mutation> m3 = 
EntityCentricIndex.createMutations(rs3);
+                    for (Mutation m : m3) {
+                        bw.addMutation(m);
+                    }
+                }
+                if (rs4 != null) {
+                    Collection<Mutation> m4 = 
EntityCentricIndex.createMutations(rs4);
+                    for (Mutation m : m4) {
+                        bw.addMutation(m);
+                    }
+                }
+     
+                
+                
+                
+
+      }
+     
+      String q1 = "" //
+              + "SELECT ?X ?Y1 ?Y2 " //
+              + "{"//
+              +  "?X <uri:cf1> ?Y1 ."//
+              +  "?X <uri:cf2> ?Y2 ."//
+              +  "?X <uri:cf3> 5 ."//
+              +  "}";
+      
+      
+      String q2 = "" //
+              + "SELECT ?X ?Y1 ?Y2 " //
+              + "{"//
+              +  "?X <uri:cf1> ?Y1  ."//
+              +  "?X <uri:cf2> ?Y2 ."//
+              +  "?X <uri:cf3> \"15\" ."//
+              +  "}";
+      
+           
+      
+            SPARQLParser parser = new SPARQLParser();
+
+            ParsedQuery pq1 = parser.parseQuery(q1, null);
+            ParsedQuery pq2 = parser.parseQuery(q2, null);
+
+            TupleExpr te1 = pq1.getTupleExpr();
+            TupleExpr te2 = pq2.getTupleExpr();
+
+            List<StatementPattern> spList1 = 
StatementPatternCollector.process(te1);
+            List<StatementPattern> spList2 = 
StatementPatternCollector.process(te2);
+
+            System.out.println(spList1);
+            System.out.println(spList2);
+
+            RyaType rt1 = 
RdfToRyaConversions.convertValue(spList1.get(2).getObjectVar().getValue());
+            RyaType rt2 = 
RdfToRyaConversions.convertValue(spList2.get(2).getObjectVar().getValue());
+            
+            RyaURI predURI1 = (RyaURI) 
RdfToRyaConversions.convertValue(spList1.get(0).getPredicateVar().getValue());
+            RyaURI predURI2 = (RyaURI) 
RdfToRyaConversions.convertValue(spList1.get(1).getPredicateVar().getValue());
+            RyaURI predURI3 = (RyaURI) 
RdfToRyaConversions.convertValue(spList1.get(2).getPredicateVar().getValue());
+            
+//            System.out.println("to string" + 
spList1.get(2).getObjectVar().getValue().stringValue());
+//            System.out.println("converted obj" + rt1.getData());
+//            System.out.println("equal: " + 
rt1.getData().equals(spList1.get(2).getObjectVar().getValue().stringValue()));
+            
+            
+            System.out.println(rt1);
+            System.out.println(rt2);
+
+            RyaContext rc = RyaContext.getInstance();
+
+            byte[][] b1 = rc.serializeType(rt1);
+            byte[][] b2 = rc.serializeType(rt2);
+
+            byte[] b3 = Bytes.concat("object".getBytes(), "\u0000".getBytes(), 
b1[0], b1[1]);
+            byte[] b4 = Bytes.concat("object".getBytes(), "\u0000".getBytes(), 
b2[0], b2[1]);
+
+            System.out.println(new String(b3));
+            System.out.println(new String(b4));
+
+            TextColumn tc1 = new TextColumn(new Text(predURI1.getData()), new 
Text("object"));
+            TextColumn tc2 = new TextColumn(new Text(predURI2.getData()), new 
Text("object"));
+            TextColumn tc3 = new TextColumn(new Text(predURI3.getData()), new 
Text(b3));
+
+            tc1.setIsPrefix(true);
+            tc2.setIsPrefix(true);
+      
+            TextColumn[] tc = new TextColumn[3];
+            tc[0] = tc1;
+            tc[1] = tc2;
+            tc[2] = tc3;
+
+            IteratorSetting is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+            DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+
+            Scanner scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+
+            scan.addScanIterator(is);
+
+            int results = 0;
+            System.out.println("************************Test 
21****************************");
+            Text t = null;
+            for (Map.Entry<Key, Value> e : scan) {
+                t = e.getKey().getColumnQualifier();
+                System.out.println(e);
+                results++;
+            }
+
+            Assert.assertEquals(1, results);
+            String [] s = t.toString().split("\u001D" + "\u001E");
+            String[] s1 = s[2].split("\u0000");
+            RyaType rt = rc.deserialize(s1[2].getBytes());
+            System.out.println("Rya type is " + rt);
+            org.openrdf.model.Value v = RyaToRdfConversions.convertValue(rt);
+            
Assert.assertTrue(v.equals(spList1.get(2).getObjectVar().getValue()));
+
+            tc1 = new TextColumn(new Text(predURI1.getData()), new 
Text("object"));
+            tc2 = new TextColumn(new Text(predURI2.getData()), new 
Text("object"));
+            tc3 = new TextColumn(new Text(predURI3.getData()), new Text(b4));
+
+            tc1.setIsPrefix(true);
+            tc2.setIsPrefix(true);
+
+            tc = new TextColumn[3];
+            tc[0] = tc1;
+            tc[1] = tc2;
+            tc[2] = tc3;
+
+            is = new IteratorSetting(30, "fii", 
DocumentIndexIntersectingIterator.class);
+
+            DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+
+            scan = accCon.createScanner(tablename, new 
Authorizations("auths"));
+
+            scan.addScanIterator(is);
+
+            results = 0;
+            System.out.println("************************Test 
21****************************");
+            
+            for (Map.Entry<Key, Value> e : scan) {
+                t = e.getKey().getColumnQualifier();
+                System.out.println(e);
+                results++;
+            }
+
+            Assert.assertEquals(1, results);
+            s = t.toString().split("\u001D" + "\u001E");
+            s1 = s[2].split("\u0000");
+            rt = rc.deserialize(s1[2].getBytes());
+            System.out.println("Rya type is " + rt);
+            v = RyaToRdfConversions.convertValue(rt);
+            
Assert.assertTrue(v.equals(spList2.get(2).getObjectVar().getValue()));
+            
+            
+
+
+}
+
+
+
+
+
+
+
+
+
+    
+    
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/extras/indexing/src/test/java/mvm/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessorTest.java
----------------------------------------------------------------------
diff --git 
a/extras/indexing/src/test/java/mvm/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessorTest.java
 
b/extras/indexing/src/test/java/mvm/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessorTest.java
new file mode 100644
index 0000000..edf5d57
--- /dev/null
+++ 
b/extras/indexing/src/test/java/mvm/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessorTest.java
@@ -0,0 +1,305 @@
+package mvm.rya.indexing.IndexPlanValidator;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.Assert;
+import mvm.rya.indexing.external.ExternalProcessor;
+import mvm.rya.indexing.external.tupleSet.ExternalTupleSet;
+import mvm.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
+
+import org.junit.Test;
+import org.openrdf.query.algebra.Projection;
+import org.openrdf.query.algebra.TupleExpr;
+import org.openrdf.query.parser.ParsedQuery;
+import org.openrdf.query.parser.sparql.SPARQLParser;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
+public class GeneralizedExternalProcessorTest {
+
+    private 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 String q8 = ""//
+            + "SELECT ?f ?m ?d ?e ?l ?c ?n ?o ?p ?a ?h ?r " //
+            + "{" //
+            + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> ?r ."//
+            + "  ?f a ?m ."//
+            + "  ?p <uri:talksTo> ?n . "//
+            + "  ?e a ?l ."//
+            + "  ?o <http://www.w3.org/2000/01/rdf-schema#label> ?p ."//
+            + "  ?d <uri:talksTo> ?f . "//
+            + "  ?c <uri:talksTo> ?e . "//
+            + "  ?n a ?o ."//
+            + "  ?a a ?h ."//
+            + "  ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
+            + "  ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."//
+            + "  ?r <uri:talksTo> ?a . "//
+            + "}";//
+    
+    
+    
+    
+    private String q11 = ""//
+            + "SELECT ?f ?m ?d ?e ?l ?c ?n ?o ?p ?a ?h ?r ?x ?y ?w ?t ?duck 
?chicken ?pig ?rabbit " //
+            + "{" //
+            + "  ?w a ?t ."//
+            + "  ?x a ?y ."//
+            + "  ?duck a ?chicken ."//
+            + "  ?pig a ?rabbit ."//
+            + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> ?r ."//
+            + "  ?f a ?m ."//
+            + "  ?p <uri:talksTo> ?n . "//
+            + "  ?e a ?l ."//
+            + "  ?o <http://www.w3.org/2000/01/rdf-schema#label> ?p ."//
+            + "  ?d <uri:talksTo> ?f . "//
+            + "  ?c <uri:talksTo> ?e . "//
+            + "  ?n a ?o ."//
+            + "  ?a a ?h ."//
+            + "  ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
+            + "  ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."//
+            + "  ?r <uri:talksTo> ?a . "//
+            + "}";//
+    
+    
+    private String q12 = ""//
+            + "SELECT ?b ?p ?dog ?cat " //
+            + "{" //
+            + "  ?b a ?p ."//
+            + "  ?dog a ?cat. "//
+            + "}";//
+    
+    
+    
+    private String q13 = ""//
+            + "SELECT ?f ?m ?d ?e ?l ?c ?n ?o ?p ?a ?h ?r ?x ?y ?w ?t ?duck 
?chicken ?pig ?rabbit ?dick ?jane ?betty " //
+            + "{" //
+            + "  ?w a ?t ."//
+            + "  ?x a ?y ."//
+            + "  ?duck a ?chicken ."//
+            + "  ?pig a ?rabbit ."//
+            + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> ?r ."//
+            + "  ?f a ?m ."//
+            + "  ?p <uri:talksTo> ?n . "//
+            + "  ?e a ?l ."//
+            + "  ?o <http://www.w3.org/2000/01/rdf-schema#label> ?p ."//
+            + "  ?d <uri:talksTo> ?f . "//
+            + "  ?c <uri:talksTo> ?e . "//
+            + "  ?n a ?o ."//
+            + "  ?a a ?h ."//
+            + "  ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
+            + "  ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."//
+            + "  ?r <uri:talksTo> ?a . "//
+            + "  ?dick <uri:talksTo> ?jane . "//
+            + "  ?jane <uri:talksTo> ?betty . "//
+            + "}";//
+    
+    private String q14 = ""//
+            + "SELECT ?f ?m ?d ?e ?l ?c ?n ?o ?p ?a ?h ?r ?x ?y ?w ?t ?duck 
?chicken ?pig ?rabbit " //
+            + "{" //
+            + "  ?w a ?t ."//
+            + "  ?x a ?y ."//
+            + "  ?duck a ?chicken ."//
+            + "  ?pig a ?rabbit ."//
+            + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> ?r ."//
+            + "  ?f a ?m ."//
+            + "  ?p <uri:talksTo> ?n . "//
+            + "  ?e a ?l ."//
+            + "  ?o <http://www.w3.org/2000/01/rdf-schema#label> ?p ."//
+            + "  ?d <uri:talksTo> ?f . "//
+            + "  ?c <uri:talksTo> ?e . "//
+            + "  ?n a ?o ."//
+            + "  ?a a ?h ."//
+            + "  ?m <http://www.w3.org/2000/01/rdf-schema#label> ?d ."//
+            + "  ?l <http://www.w3.org/2000/01/rdf-schema#label> ?c ."//
+            + "  ?r <uri:talksTo> ?a . "//
+            + "  ?d <uri:talksTo> ?a . "//
+            + "}";//
+    
+    
+    private 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 String q16 = ""//
+            + "SELECT ?f ?m ?d ?e ?l ?c " //
+            + "{" //
+            + "  ?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 String q17 = ""//
+            + "SELECT ?dog ?cat ?chicken " //
+            + "{" //
+            + "  ?chicken <uri:talksTo> ?dog . "//
+            + "  ?cat <http://www.w3.org/2000/01/rdf-schema#label> ?chicken 
."//
+            + "}";//
+    
+    private String q18 = ""//
+            + "SELECT ?dog ?chicken " //
+            + "{" //
+            + "  ?chicken <uri:talksTo> ?dog . "//
+            + "}";//
+    
+    private String q19 = ""//
+            + "SELECT ?cat ?chicken " //
+            + "{" //
+            + "  ?cat <http://www.w3.org/2000/01/rdf-schema#label> ?chicken 
."//
+            + "}";//
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    //@Test
+    public void testTwoIndexLargeQuery() throws Exception {
+
+        SPARQLParser parser = new SPARQLParser();
+        
+
+        ParsedQuery pq1 = parser.parseQuery(q15, null);
+        ParsedQuery pq2 = parser.parseQuery(q7, null);
+        ParsedQuery pq3 = parser.parseQuery(q12, null);
+       
+        
+
+        System.out.println("Query is " + pq1.getTupleExpr());
+        
+        SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet(new 
Projection(pq2.getTupleExpr()));
+        SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet(new 
Projection(pq3.getTupleExpr()));
+        //SimpleExternalTupleSet extTup3 = new SimpleExternalTupleSet(new 
Projection(pq5.getTupleExpr()));
+       
+
+        List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>();
+       
+        list.add(extTup2);
+       //list.add(extTup3);
+       list.add(extTup1);
+        
+
+        IndexedExecutionPlanGenerator iep = new 
IndexedExecutionPlanGenerator(pq1.getTupleExpr(),list);
+        List<ExternalTupleSet> indexSet = iep.getNormalizedIndices();
+        Assert.assertEquals(4, indexSet.size());
+        
+//        System.out.println("Normalized indices are: ");
+//        for(ExternalTupleSet e: indexSet) {
+//            System.out.println(e.getTupleExpr());
+//        }
+        
+        Set<TupleExpr> processedTups = Sets.newHashSet(iep.getIndexedTuples());
+        
+        Assert.assertEquals(5, processedTups.size());
+        
+     //   System.out.println("Size is " + processedTups.size());
+        
+//        System.out.println("Indexed tuples are :" );
+//        for(TupleExpr te: processedTups) {
+//            System.out.println(te);
+//        }
+        
+        
+       
+        
+
+
+    }
+    
+    
+    
+    
+    
+    @Test
+    public void testThreeIndexQuery() throws Exception {
+
+        SPARQLParser parser = new SPARQLParser();
+        
+
+        ParsedQuery pq1 = parser.parseQuery(q16, null);
+        ParsedQuery pq2 = parser.parseQuery(q17, null);
+        ParsedQuery pq3 = parser.parseQuery(q18, null);
+        ParsedQuery pq4 = parser.parseQuery(q19, null);
+       
+        
+
+        System.out.println("Query is " + pq1.getTupleExpr());
+        
+        SimpleExternalTupleSet extTup1 = new SimpleExternalTupleSet(new 
Projection(pq2.getTupleExpr()));
+        SimpleExternalTupleSet extTup2 = new SimpleExternalTupleSet(new 
Projection(pq3.getTupleExpr()));
+        SimpleExternalTupleSet extTup3 = new SimpleExternalTupleSet(new 
Projection(pq4.getTupleExpr()));
+       
+
+        List<ExternalTupleSet> list = new ArrayList<ExternalTupleSet>();
+       
+        list.add(extTup2);
+        list.add(extTup3);
+        list.add(extTup1);
+        
+
+        IndexedExecutionPlanGenerator iep = new 
IndexedExecutionPlanGenerator(pq1.getTupleExpr(),list);
+        List<ExternalTupleSet> indexSet = iep.getNormalizedIndices();
+        Assert.assertEquals(6, indexSet.size());
+        
+//        System.out.println("Normalized indices are: ");
+//        for(ExternalTupleSet e: indexSet) {
+//            System.out.println(e.getTupleExpr());
+//        }
+        
+        Set<TupleExpr> processedTups = Sets.newHashSet(iep.getIndexedTuples());
+        
+        Assert.assertEquals(17, processedTups.size());
+        
+      //  System.out.println("Size is " + processedTups.size());
+        
+//        System.out.println("Indexed tuples are :" );
+//        for(TupleExpr te: processedTups) {
+//            System.out.println(te);
+//        }
+        
+        
+        TupleExecutionPlanGenerator tep = new TupleExecutionPlanGenerator();
+        List<TupleExpr> plans = 
Lists.newArrayList(tep.getPlans(processedTups.iterator()));
+        
+        
+      System.out.println("Size is " + plans.size());
+        
+      System.out.println("Possible indexed tuple plans are :" );
+      for(TupleExpr te: plans) {
+          System.out.println(te);
+      }
+       
+        
+
+
+    }
+    
+    
+    
+    
+    
+
+
+}

Reply via email to