You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@rya.apache.org by pu...@apache.org on 2015/12/04 17:46:16 UTC

[04/49] incubator-rya git commit: RYA-7 POM and License Clean-up for Apache Move

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/80faf06d/sail/src/test/java/mvm/rya/RdfCloudTripleStoreTest.java
----------------------------------------------------------------------
diff --git a/sail/src/test/java/mvm/rya/RdfCloudTripleStoreTest.java b/sail/src/test/java/mvm/rya/RdfCloudTripleStoreTest.java
new file mode 100644
index 0000000..eee6bce
--- /dev/null
+++ b/sail/src/test/java/mvm/rya/RdfCloudTripleStoreTest.java
@@ -0,0 +1,699 @@
+package mvm.rya;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+
+import junit.framework.TestCase;
+import mvm.rya.accumulo.AccumuloRdfConfiguration;
+import mvm.rya.accumulo.AccumuloRyaDAO;
+import mvm.rya.api.RdfCloudTripleStoreConstants;
+import mvm.rya.rdftriplestore.RdfCloudTripleStore;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.mock.MockInstance;
+import org.openrdf.model.Namespace;
+import org.openrdf.model.ValueFactory;
+import org.openrdf.model.impl.StatementImpl;
+import org.openrdf.model.impl.ValueFactoryImpl;
+import org.openrdf.query.*;
+import org.openrdf.repository.RepositoryException;
+import org.openrdf.repository.RepositoryResult;
+import org.openrdf.repository.sail.SailRepository;
+import org.openrdf.repository.sail.SailRepositoryConnection;
+
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Class PartitionConnectionTest
+ * Date: Jul 6, 2011
+ * Time: 5:24:07 PM
+ */
+public class RdfCloudTripleStoreTest extends TestCase {
+    public static final String NAMESPACE = "http://here/2010/tracked-data-provenance/ns#";//44 len
+    public static final String RDF_NS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+    public static final String HBNAMESPACE = "http://here/2010/tracked-data-provenance/heartbeat/ns#";
+    public static final String HB_TIMESTAMP = HBNAMESPACE + "timestamp";
+
+    private SailRepository repository;
+    private SailRepositoryConnection connection;
+
+    ValueFactory vf = ValueFactoryImpl.getInstance();
+
+    private String objectUuid = "objectuuid1";
+    private String ancestor = "ancestor1";
+    private String descendant = "descendant1";
+    private static final long START = 1309532965000l;
+    private static final long END = 1310566686000l;
+    private Connector connector;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        connector = new MockInstance().getConnector("", "");
+
+        RdfCloudTripleStore sail = new RdfCloudTripleStore();
+        AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
+        conf.setTablePrefix("lubm_");
+        sail.setConf(conf);
+        AccumuloRyaDAO crdfdao = new AccumuloRyaDAO();
+        crdfdao.setConnector(connector);
+        crdfdao.setConf(conf);
+        sail.setRyaDAO(crdfdao);
+
+        repository = new SailRepository(sail);
+        repository.initialize();
+        connection = repository.getConnection();
+
+        loadData();
+    }
+
+    private void loadData() throws RepositoryException, DatatypeConfigurationException {
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, objectUuid), vf.createURI(NAMESPACE, "name"), vf.createLiteral("objUuid")));
+        //created
+        String uuid = "uuid1";
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(RDF_NS, "type"), vf.createURI(NAMESPACE, "Created")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "createdItem"), vf.createURI(NAMESPACE, objectUuid)));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedBy"), vf.createURI("urn:system:A")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "stringLit"), vf.createLiteral("stringLit1")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "stringLit"), vf.createLiteral("stringLit2")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "stringLit"), vf.createLiteral("stringLit3")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "stringLit"), vf.createLiteral("stringLit4")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "strLit1"), vf.createLiteral("strLit1")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "strLit1"), vf.createLiteral("strLit2")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "strLit1"), vf.createLiteral("strLit3")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 0, 0, 0, 0))));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "reportedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 1, 0, 0, 0))));
+        //clicked
+        uuid = "uuid2";
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(RDF_NS, "type"), vf.createURI(NAMESPACE, "Clicked")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "clickedItem"), vf.createURI(NAMESPACE, objectUuid)));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedBy"), vf.createURI("urn:system:B")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 2, 0, 0, 0))));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "reportedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 3, 0, 0, 0))));
+        //deleted
+        uuid = "uuid3";
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(RDF_NS, "type"), vf.createURI(NAMESPACE, "Deleted")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "deletedItem"), vf.createURI(NAMESPACE, objectUuid)));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedBy"), vf.createURI("urn:system:C")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 4, 0, 0, 0))));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "reportedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 5, 0, 0, 0))));
+        //dropped
+        uuid = "uuid4";
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(RDF_NS, "type"), vf.createURI(NAMESPACE, "Dropped")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "droppedItem"), vf.createURI(NAMESPACE, objectUuid)));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedBy"), vf.createURI("urn:system:D")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 6, 0, 0, 0))));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "reportedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 7, 0, 0, 0))));
+        //received
+        uuid = "uuid5";
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(RDF_NS, "type"), vf.createURI(NAMESPACE, "Received")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "receivedItem"), vf.createURI(NAMESPACE, objectUuid)));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedBy"), vf.createURI("urn:system:E")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 8, 0, 0, 0))));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "reportedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 9, 0, 0, 0))));
+        //sent
+        uuid = "uuid6";
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(RDF_NS, "type"), vf.createURI(NAMESPACE, "Sent")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "sentItem"), vf.createURI(NAMESPACE, objectUuid)));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedBy"), vf.createURI("urn:system:F")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 10, 0, 0, 0))));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "reportedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 11, 0, 0, 0))));
+        //stored
+        uuid = "uuid7";
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(RDF_NS, "type"), vf.createURI(NAMESPACE, "Stored")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "storedItem"), vf.createURI(NAMESPACE, objectUuid)));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedBy"), vf.createURI("urn:system:G")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 12, 0, 0, 0))));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "reportedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 13, 0, 0, 0))));
+
+        //derivedFrom
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, descendant), vf.createURI(NAMESPACE, "derivedFrom"), vf.createURI(NAMESPACE, ancestor)));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, descendant), vf.createURI(NAMESPACE, "name"), vf.createLiteral("descendantOne")));
+        connection.add(new StatementImpl(vf.createURI(NAMESPACE, ancestor), vf.createURI(NAMESPACE, "name"), vf.createLiteral("ancestor1")));
+
+        //heartbeats
+        String hbuuid = "hbuuid1";
+        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(RDF_NS, "type"), vf.createURI(HBNAMESPACE, "HeartbeatMeasurement")));
+        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HB_TIMESTAMP), vf.createLiteral((START + 1) + "")));
+        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HBNAMESPACE, "count"), vf.createLiteral(1 + "")));
+        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HBNAMESPACE, "systemName"), vf.createURI("urn:system:A")));
+        connection.add(new StatementImpl(vf.createURI("urn:system:A"), vf.createURI(HBNAMESPACE, "heartbeat"), vf.createURI(HBNAMESPACE, hbuuid)));
+
+        hbuuid = "hbuuid2";
+        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(RDF_NS, "type"), vf.createURI(HBNAMESPACE, "HeartbeatMeasurement")));
+        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HB_TIMESTAMP), vf.createLiteral((START + 2) + "")));
+        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HBNAMESPACE, "count"), vf.createLiteral(2 + "")));
+        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HBNAMESPACE, "systemName"), vf.createURI("urn:system:B")));
+        connection.add(new StatementImpl(vf.createURI("urn:system:B"), vf.createURI(HBNAMESPACE, "heartbeat"), vf.createURI(HBNAMESPACE, hbuuid)));
+
+        hbuuid = "hbuuid3";
+        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(RDF_NS, "type"), vf.createURI(HBNAMESPACE, "HeartbeatMeasurement")));
+        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HB_TIMESTAMP), vf.createLiteral((START + 3) + "")));
+        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HBNAMESPACE, "count"), vf.createLiteral(3 + "")));
+        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HBNAMESPACE, "systemName"), vf.createURI("urn:system:C")));
+        connection.add(new StatementImpl(vf.createURI("urn:system:C"), vf.createURI(HBNAMESPACE, "heartbeat"), vf.createURI(HBNAMESPACE, hbuuid)));
+
+        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral("obj1")));
+        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral("obj2")));
+        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral("obj3")));
+        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral("obj4")));
+        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral("obj1")));
+        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral("obj2")));
+        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral("obj3")));
+        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral("obj4")));
+        connection.add(new StatementImpl(vf.createURI("urn:subj3"), vf.createURI("urn:pred"), vf.createLiteral("obj1")));
+        connection.add(new StatementImpl(vf.createURI("urn:subj3"), vf.createURI("urn:pred"), vf.createLiteral("obj4")));
+
+        //Foreign Chars
+        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral(FAN_CH_SIM))); 
+        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral(FAN_CH_TRAD))); 
+        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral(FAN_TH))); 
+        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral(FAN_RN))); 
+        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral(FAN_CH_SIM)));
+        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral(FAN_CH_TRAD)));
+        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral(FAN_TH)));
+        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral(FAN_RN)));
+        connection.add(new StatementImpl(vf.createURI("urn:subj3"), vf.createURI("urn:pred"), vf.createLiteral(FAN_CH_SIM)));
+        connection.add(new StatementImpl(vf.createURI("urn:subj3"), vf.createURI("urn:pred"), vf.createLiteral(FAN_CH_TRAD)));
+        
+        connection.commit();
+    }
+
+    private static final String FAN_CH_SIM = "风扇";
+    private static final String FAN_CH_TRAD = "風扇";
+    private static final String FAN_TH = "แฟน";
+    private static final String FAN_RN = "вентилятор";
+    
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        connection.close();
+        repository.shutDown();
+    }
+
+    protected String getXmlDate(long ts) throws DatatypeConfigurationException {
+        GregorianCalendar gregorianCalendar = new GregorianCalendar();
+        gregorianCalendar.setTimeInMillis(ts);
+        //"2011-07-12T05:12:00.000Z"^^xsd:dateTime
+        return "\"" + vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar)).stringValue() + "\"^^xsd:dateTime";
+    }
+
+//    public void testScanAll() throws Exception {
+//        Scanner sc = connector.createScanner("lubm_spo", Constants.NO_AUTHS);
+//        for (Map.Entry<Key, Value> aSc : sc) System.out.println(aSc.getKey().getRow());
+//    }
+
+    public void testNamespace() throws Exception {
+        String namespace = "urn:testNamespace#";
+        String prefix = "pfx";
+        connection.setNamespace(prefix, namespace);
+
+        assertEquals(namespace, connection.getNamespace(prefix));
+    }
+
+    public void testValues() throws Exception {
+      String query = "SELECT DISTINCT ?entity WHERE {"
+              + "VALUES (?entity) { (<http://test/entity>) }" 
+              + "}";
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(1, tupleHandler.getCount());
+    }
+    
+    public void testGetNamespaces() throws Exception {
+        String namespace = "urn:testNamespace#";
+        String prefix = "pfx";
+        connection.setNamespace(prefix, namespace);
+
+        namespace = "urn:testNamespace2#";
+        prefix = "pfx2";
+        connection.setNamespace(prefix, namespace);
+
+        RepositoryResult<Namespace> result = connection.getNamespaces();
+        int count = 0;
+        while (result.hasNext()) {
+            result.next();
+            count++;
+        }
+
+        assertEquals(2, count);
+    }
+
+    public void testAddCommitStatement() throws Exception {
+        StatementImpl stmt = new StatementImpl(vf.createURI("urn:namespace#subj"), vf.createURI("urn:namespace#pred"), vf.createLiteral("object"));
+        connection.add(stmt);
+        connection.commit();
+    }
+
+    public void testSelectOnlyQuery() throws Exception {
+        String query = "PREFIX ns:<" + NAMESPACE + ">\n" +
+                "select * where {\n" +
+                "ns:uuid1 ns:createdItem ?cr.\n" +
+                "ns:uuid1 ns:reportedAt ?ra.\n" +
+                "ns:uuid1 ns:performedAt ?pa.\n" +
+                "}\n";
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+//        tupleQuery.evaluate(new PrintTupleHandler());
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(1, tupleHandler.getCount());
+    }
+
+    public void testForeignSelectOnlyQuery() throws Exception {
+        String query;
+        query = "select * where { ?s <urn:pred> ?o }"; // hits po
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(20, tupleHandler.getCount());
+
+        query = "select * where { <urn:subj1> <urn:pred> ?o }"; //hits spo
+        tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+        tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(8, tupleHandler.getCount());
+
+        query = "select * where { ?s ?p '"+FAN_CH_SIM+"' }"; //hits osp
+        tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+        tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(3, tupleHandler.getCount());
+}
+      
+
+
+    //provenance Queries//////////////////////////////////////////////////////////////////////
+
+    public void testEventInfo() throws Exception {
+        String query = "PREFIX ns:<" + NAMESPACE + ">\n" +
+                "select * where {\n" +
+                "   ns:uuid1 ?p ?o.\n" +
+                "}\n";
+
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+//                tupleQuery.evaluate(new PrintTupleHandler());
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(12, tupleHandler.getCount());
+    }
+
+    public void testAllAncestors() throws Exception {
+        String query = "PREFIX ns:<" + NAMESPACE + ">\n" +
+                "select * where {\n" +
+                "ns:" + descendant + " ns:derivedFrom ?dr.\n" +
+                "}\n";
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+        //        tupleQuery.evaluate(new PrintTupleHandler());
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(1, tupleHandler.getCount());
+    }
+
+    public void testAllDescendants() throws Exception {
+        String query = "PREFIX ns:<" + NAMESPACE + ">\n" +
+                "select * where {\n" +
+                "?ds ns:derivedFrom ns:" + ancestor + ".\n" +
+                "}\n";
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+//        tupleQuery.evaluate(new PrintTupleHandler());
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(1, tupleHandler.getCount());
+    }
+
+    public void testEventsForUri() throws Exception {
+        String query = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
+                "PREFIX ns:<" + NAMESPACE + ">\n" +
+                "PREFIX mvmpart: <urn:mvm.mmrts.partition.rdf/08/2011#>\n" +
+                "PREFIX mvm: <" + RdfCloudTripleStoreConstants.NAMESPACE + ">\n" +
+                "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n" +
+                "select * where {\n" +
+                "{" +
+                "   ?s rdf:type ns:Created.\n" +
+                "   ?s ns:createdItem ns:objectuuid1.\n" +
+                "   ?s ns:performedBy ?pb.\n" +
+                "   ?s ns:performedAt ?pa.\n" +
+                "   FILTER(mvm:range(?pa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "}\n" +
+                "UNION {" +
+                "   ?s rdf:type ns:Clicked.\n" +
+                "   ?s ns:clickedItem ns:objectuuid1.\n" +
+                "   ?s ns:performedBy ?pb.\n" +
+                "   ?s ns:performedAt ?pa.\n" +
+                "   FILTER(mvm:range(?pa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "}\n" +
+                "UNION {" +
+                "   ?s rdf:type ns:Deleted.\n" +
+                "   ?s ns:deletedItem ns:objectuuid1.\n" +
+                "   ?s ns:performedBy ?pb.\n" +
+                "   ?s ns:performedAt ?pa.\n" +
+                "   FILTER(mvm:range(?pa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "}\n" +
+                "UNION {" +
+                "   ?s rdf:type ns:Dropped.\n" +
+                "   ?s ns:droppedItem ns:objectuuid1.\n" +
+                "   ?s ns:performedBy ?pb.\n" +
+                "   ?s ns:performedAt ?pa.\n" +
+                "   FILTER(mvm:range(?pa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "}\n" +
+                "UNION {" +
+                "   ?s rdf:type ns:Received.\n" +
+                "   ?s ns:receivedItem ns:objectuuid1.\n" +
+                "   ?s ns:performedBy ?pb.\n" +
+                "   ?s ns:performedAt ?pa.\n" +
+                "   FILTER(mvm:range(?pa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "}\n" +
+                "UNION {" +
+                "   ?s rdf:type ns:Stored.\n" +
+                "   ?s ns:storedItem ns:objectuuid1.\n" +
+                "   ?s ns:performedBy ?pb.\n" +
+                "   ?s ns:performedAt ?pa.\n" +
+                "   FILTER(mvm:range(?pa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "}\n" +
+                "UNION {" +
+                "   ?s rdf:type ns:Sent.\n" +
+                "   ?s ns:sentItem ns:objectuuid1.\n" +
+                "   ?s ns:performedBy ?pb.\n" +
+                "   ?s ns:performedAt ?pa.\n" +
+                "   FILTER(mvm:range(?pa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "}\n" +
+                "}\n";
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+//        tupleQuery.setBinding(START_BINDING, vf.createLiteral(START));
+//        tupleQuery.setBinding(END_BINDING, vf.createLiteral(END));
+//        tupleQuery.setBinding(TIME_PREDICATE, vf.createURI(NAMESPACE, "performedAt"));
+//                tupleQuery.evaluate(new PrintTupleHandler());
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(7, tupleHandler.getCount());
+    }
+
+    public void testAllEvents() throws Exception {
+        String query = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
+                "PREFIX ns:<" + NAMESPACE + ">\n" +
+                "PREFIX mvmpart: <urn:mvm.mmrts.partition.rdf/08/2011#>\n" +
+                "PREFIX mvm: <" + RdfCloudTripleStoreConstants.NAMESPACE + ">\n" +
+                "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n" +
+                "select * where {\n" +
+                "{" +
+                "   ?s rdf:type ns:Created.\n" +
+                "   ?s ns:performedBy ?pb.\n" +
+                "   ?s ns:performedAt ?pa.\n" +
+                "   FILTER(mvm:range(?pa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "}\n" +
+                "UNION {" +
+                "   ?s rdf:type ns:Clicked.\n" +
+                "   ?s ns:performedBy ?pb.\n" +
+                "   ?s ns:performedAt ?pa.\n" +
+                "   FILTER(mvm:range(?pa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "}\n" +
+                "UNION {" +
+                "   ?s rdf:type ns:Deleted.\n" +
+                "   ?s ns:performedBy ?pb.\n" +
+                "   ?s ns:performedAt ?pa.\n" +
+                "   FILTER(mvm:range(?pa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "}\n" +
+                "UNION {" +
+                "   ?s rdf:type ns:Dropped.\n" +
+                "   ?s ns:performedBy ?pb.\n" +
+                "   ?s ns:performedAt ?pa.\n" +
+                "   FILTER(mvm:range(?pa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "}\n" +
+                "UNION {" +
+                "   ?s rdf:type ns:Received.\n" +
+                "   ?s ns:performedBy ?pb.\n" +
+                "   ?s ns:performedAt ?pa.\n" +
+                "   FILTER(mvm:range(?pa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "}\n" +
+                "UNION {" +
+                "   ?s rdf:type ns:Stored.\n" +
+                "   ?s ns:performedBy ?pb.\n" +
+                "   ?s ns:performedAt ?pa.\n" +
+                "   FILTER(mvm:range(?pa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "}\n" +
+                "UNION {" +
+                "   ?s rdf:type ns:Sent.\n" +
+                "   ?s ns:performedBy ?pb.\n" +
+                "   ?s ns:performedAt ?pa.\n" +
+                "   FILTER(mvm:range(?pa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "}\n" +
+                "}\n";
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+//        tupleQuery.setBinding(START_BINDING, vf.createLiteral(START));
+//        tupleQuery.setBinding(END_BINDING, vf.createLiteral(END));
+//        tupleQuery.setBinding(TIME_PREDICATE, vf.createURI(NAMESPACE, "performedAt"));
+//                tupleQuery.evaluate(new PrintTupleHandler());
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(7, tupleHandler.getCount());
+//        System.out.println(tupleHandler.getCount());
+    }
+
+    public void testEventsBtwnSystems() throws Exception {  //TODO: How to do XMLDateTime ranges
+        String query = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
+                "PREFIX ns:<" + NAMESPACE + ">\n" +
+                "PREFIX mvmpart: <urn:mvm.mmrts.partition.rdf/08/2011#>\n" +
+                "PREFIX mvm: <" + RdfCloudTripleStoreConstants.NAMESPACE + ">\n" +
+                "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n" +
+                "select * where {\n" +
+                "   ?sendEvent rdf:type ns:Sent;\n" +
+                "              ns:sentItem ?objUuid;\n" +
+                "              ns:performedBy <urn:system:F>;\n" +
+                "              ns:performedAt ?spa.\n" +
+                "   ?recEvent rdf:type ns:Received;\n" +
+                "              ns:receivedItem ?objUuid;\n" +
+                "              ns:performedBy <urn:system:E>;\n" +
+                "              ns:performedAt ?rpa.\n" +
+//                "   FILTER(mvm:range(?spa, \"2011-07-12T05:12:00.000Z\"^^xsd:dateTime, \"2011-07-12T07:12:00.000Z\"^^xsd:dateTime))\n" +
+                "   FILTER(mvm:range(?spa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "   FILTER(mvm:range(?rpa, " + getXmlDate(START) + ", " + getXmlDate(END) + "))\n" +
+                "}\n";
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+//        tupleQuery.setBinding(START_BINDING, vf.createLiteral(START));
+//        tupleQuery.setBinding(END_BINDING, vf.createLiteral(END));
+//        tupleQuery.setBinding(TIME_PREDICATE, vf.createURI(NAMESPACE, "performedAt"));
+//        tupleQuery.evaluate(new PrintTupleHandler());
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(1, tupleHandler.getCount());
+    }
+
+    public void testHeartbeatCounts() throws Exception {
+        String query = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
+                "PREFIX hns:<" + HBNAMESPACE + ">\n" +
+                "PREFIX mvmpart: <urn:mvm.mmrts.partition.rdf/08/2011#>\n" +
+                "PREFIX mvm: <" + RdfCloudTripleStoreConstants.NAMESPACE + ">\n" +
+                "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n" +
+                "select * where {\n" +
+                "   ?hb rdf:type hns:HeartbeatMeasurement;\n" +
+                "              hns:count ?count;\n" +
+                "              hns:timestamp ?ts;\n" +
+                "              hns:systemName ?systemName.\n" +
+                "   FILTER(mvm:range(?ts, \"" + START + "\", \"" + (START + 3) + "\"))\n" +
+                "}\n";
+//        System.out.println(query);
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+//        tupleQuery.setBinding(RdfCloudTripleStoreConfiguration.CONF_QUERYPLAN_FLAG, vf.createLiteral(true));
+//        tupleQuery.evaluate(new PrintTupleHandler());
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(2, tupleHandler.getCount());
+    }
+
+    //provenance Queries//////////////////////////////////////////////////////////////////////
+
+    public void testCreatedEvents() throws Exception {
+        String query = "PREFIX ns:<" + NAMESPACE + ">\n" +
+                "select * where {\n" +
+                "   ?s ns:createdItem ns:objectuuid1.\n" +
+                "   ?s ns:reportedAt ?ra.\n" +
+                "}\n";
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(1, tupleHandler.getCount());
+    }
+
+    public void testSelectAllAfterFilter() throws Exception {
+        String query = "PREFIX ns:<" + NAMESPACE + ">\n" +
+                "select * where {\n" +
+                "   ?s ns:createdItem ns:objectuuid1.\n" +
+                "   ?s ?p ?o.\n" +
+                "}\n";
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(12, tupleHandler.getCount());
+    }
+
+    public void testFilterQuery() throws Exception {
+        String query = "PREFIX ns:<" + NAMESPACE + ">\n" +
+                "select * where {\n" +
+                "ns:uuid1 ns:createdItem ?cr.\n" +
+                "ns:uuid1 ns:stringLit ?sl.\n" +
+                "FILTER regex(?sl, \"stringLit1\")" +
+                "ns:uuid1 ns:reportedAt ?ra.\n" +
+                "ns:uuid1 ns:performedAt ?pa.\n" +
+                "}\n";
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+        //        tupleQuery.evaluate(new PrintTupleHandler());
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(1, tupleHandler.getCount());
+    }
+
+    public void testMultiplePredicatesMultipleBindingSets() throws Exception {
+        //MMRTS-121
+        String query = "PREFIX ns:<" + NAMESPACE + ">\n" +
+                "select * where {\n" +
+                "?id ns:createdItem ns:objectuuid1.\n" +
+                "?id ns:stringLit ?sl.\n" +
+                "?id ns:strLit1 ?s2.\n" +
+                "}\n";
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+//        tupleQuery.evaluate(new PrintTupleHandler());
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(12, tupleHandler.getCount());
+    }
+
+    public void testMultiShardLookupTimeRange() throws Exception {
+        //MMRTS-113
+        String query = "PREFIX hb: <http://here/2010/tracked-data-provenance/heartbeat/ns#>\n" +
+                "PREFIX mvmpart: <urn:mvm.mmrts.partition.rdf/08/2011#>\n" +
+                "SELECT * WHERE\n" +
+                "{\n" +
+                "?id hb:timestamp ?timestamp.\n" +
+//                "FILTER(mvmpart:timeRange(?id, hb:timestamp, " + START + " , " + (START + 2) + " , 'TIMESTAMP'))\n" +
+                "?id hb:count ?count.\n" +
+                "?system hb:heartbeat ?id.\n" +
+                "}";
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+//        tupleQuery.evaluate(new PrintTupleHandler());
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(3, tupleHandler.getCount());
+    }
+
+    public void testMultiShardLookupTimeRangeValueConst() throws Exception {
+        //MMRTS-113
+        String query = "PREFIX hb: <http://here/2010/tracked-data-provenance/heartbeat/ns#>\n" +
+                "PREFIX mvmpart: <urn:mvm.mmrts.partition.rdf/08/2011#>\n" +
+                "SELECT * WHERE\n" +
+                "{\n" +
+                "<http://here/2010/tracked-data-provenance/heartbeat/ns#hbuuid2> hb:timestamp ?timestamp.\n" +
+//                "FILTER(mvmpart:timeRange(<http://here/2010/tracked-data-provenance/heartbeat/ns#hbuuid2>, hb:timestamp, " + START + " , " + END + " , 'TIMESTAMP'))\n" +
+                "<http://here/2010/tracked-data-provenance/heartbeat/ns#hbuuid2> hb:count ?count.\n" +
+                "?system hb:heartbeat <http://here/2010/tracked-data-provenance/heartbeat/ns#hbuuid2>.\n" +
+                "}";
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+//        tupleQuery.evaluate(new PrintTupleHandler());
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(1, tupleHandler.getCount());
+    }
+
+    public void testLinkQuery() throws Exception {
+        String query = "PREFIX ns:<" + NAMESPACE + ">\n" +
+                "SELECT * WHERE {\n" +
+                "     <http://here/2010/tracked-data-provenance/ns#uuid1> ns:createdItem ?o .\n" +
+                "     ?o ns:name ?n .\n" +
+                "}";
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+//        tupleQuery.evaluate(new PrintTupleHandler());
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(1, tupleHandler.getCount());
+    }
+
+    public void testRangeOverDuplicateItems() throws Exception {
+        String query = "PREFIX ns:<" + NAMESPACE + ">\n" +
+                "SELECT * WHERE {\n" +
+                "     ?subj <urn:pred> \"obj2\" .\n" +
+                "}";
+        TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
+//        tupleQuery.evaluate(new PrintTupleHandler());
+        CountTupleHandler tupleHandler = new CountTupleHandler();
+        tupleQuery.evaluate(tupleHandler);
+        assertEquals(2, tupleHandler.getCount());
+    }
+
+    private static class PrintTupleHandler implements TupleQueryResultHandler {
+
+        @Override
+        public void startQueryResult(List<String> strings) throws TupleQueryResultHandlerException {
+        }
+
+        @Override
+        public void endQueryResult() throws TupleQueryResultHandlerException {
+
+        }
+
+        @Override
+        public void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandlerException {
+            System.out.println(bindingSet);
+        }
+
+        @Override
+        public void handleBoolean(boolean paramBoolean) throws QueryResultHandlerException {
+        }
+
+        @Override
+        public void handleLinks(List<String> paramList) throws QueryResultHandlerException {
+        }
+    }
+
+    private static class CountTupleHandler implements TupleQueryResultHandler {
+
+        int count = 0;
+
+        @Override
+        public void startQueryResult(List<String> strings) throws TupleQueryResultHandlerException {
+        }
+
+        @Override
+        public void endQueryResult() throws TupleQueryResultHandlerException {
+        }
+
+        @Override
+        public void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandlerException {
+            count++;
+        }
+
+        public int getCount() {
+            return count;
+        }
+
+        @Override
+        public void handleBoolean(boolean paramBoolean) throws QueryResultHandlerException {
+        }
+
+        @Override
+        public void handleLinks(List<String> paramList) throws QueryResultHandlerException {
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/80faf06d/sail/src/test/java/mvm/rya/RdfCloudTripleStoreUtilsTest.java
----------------------------------------------------------------------
diff --git a/sail/src/test/java/mvm/rya/RdfCloudTripleStoreUtilsTest.java b/sail/src/test/java/mvm/rya/RdfCloudTripleStoreUtilsTest.java
new file mode 100644
index 0000000..de49ef2
--- /dev/null
+++ b/sail/src/test/java/mvm/rya/RdfCloudTripleStoreUtilsTest.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+//package mvm.rya;
+
+//
+//import java.util.List;
+//
+//import junit.framework.TestCase;
+//
+//import org.openrdf.model.BNode;
+//import org.openrdf.model.Resource;
+//import org.openrdf.model.URI;
+//import org.openrdf.model.Value;
+//import org.openrdf.model.impl.ValueFactoryImpl;
+//
+//import com.google.common.io.ByteStreams;
+//
+//import static mvm.rya.api.RdfCloudTripleStoreUtils.*;
+//
+//public class RdfCloudTripleStoreUtilsTest extends TestCase {
+//
+//	public void testWriteReadURI() throws Exception {
+//		final ValueFactoryImpl vf = new ValueFactoryImpl();
+//		URI uri = vf.createURI("http://www.example.org/test/rel");
+//		byte[] value = writeValue(uri);
+//
+//		Value readValue = readValue(ByteStreams
+//				.newDataInput(value), vf);
+//		assertEquals(uri, readValue);
+//	}
+//
+//	public void testWriteReadBNode() throws Exception {
+//		final ValueFactoryImpl vf = new ValueFactoryImpl();
+//		Value val = vf.createBNode("bnodeid");
+//		byte[] value = writeValue(val);
+//
+//		Value readValue = readValue(ByteStreams
+//				.newDataInput(value), vf);
+//		assertEquals(val, readValue);
+//	}
+//
+//	public void testWriteReadLiteral() throws Exception {
+//		final ValueFactoryImpl vf = new ValueFactoryImpl();
+//		Value val = vf.createLiteral("myliteral");
+//		byte[] value = writeValue(val);
+//
+//		Value readValue = readValue(ByteStreams
+//				.newDataInput(value), vf);
+//		assertEquals(val, readValue);
+//	}
+//
+//	public void testContexts() throws Exception {
+//		final ValueFactoryImpl vf = new ValueFactoryImpl();
+//		BNode cont1 = vf.createBNode("cont1");
+//		BNode cont2 = vf.createBNode("cont2");
+//		BNode cont3 = vf.createBNode("cont3");
+//
+//		byte[] cont_bytes = writeContexts(cont1, cont2,
+//				cont3);
+//		final String cont = new String(cont_bytes);
+//		System.out.println(cont);
+//
+//		List<Resource> contexts = readContexts(cont_bytes,
+//				vf);
+//		for (Resource resource : contexts) {
+//			System.out.println(resource);
+//		}
+//	}
+//}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/80faf06d/sail/src/test/java/mvm/rya/rdftriplestore/evaluation/QueryJoinSelectOptimizerTest.java
----------------------------------------------------------------------
diff --git a/sail/src/test/java/mvm/rya/rdftriplestore/evaluation/QueryJoinSelectOptimizerTest.java b/sail/src/test/java/mvm/rya/rdftriplestore/evaluation/QueryJoinSelectOptimizerTest.java
new file mode 100644
index 0000000..c97c854
--- /dev/null
+++ b/sail/src/test/java/mvm/rya/rdftriplestore/evaluation/QueryJoinSelectOptimizerTest.java
@@ -0,0 +1,992 @@
+package mvm.rya.rdftriplestore.evaluation;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import mvm.rya.accumulo.AccumuloRdfConfiguration;
+import mvm.rya.api.RdfCloudTripleStoreConfiguration;
+import mvm.rya.api.layout.TablePrefixLayoutStrategy;
+import mvm.rya.api.persist.RdfEvalStatsDAO;
+import mvm.rya.joinselect.AccumuloSelectivityEvalDAO;
+import mvm.rya.prospector.service.ProspectorServiceEvalStatsDAO;
+import mvm.rya.rdftriplestore.evaluation.QueryJoinSelectOptimizer;
+import mvm.rya.rdftriplestore.evaluation.RdfCloudTripleStoreSelectivityEvaluationStatistics;
+
+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.BatchWriterConfig;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.Instance;
+import org.apache.accumulo.core.client.Scanner;
+import org.apache.accumulo.core.client.TableExistsException;
+import org.apache.accumulo.core.client.TableNotFoundException;
+import org.apache.accumulo.core.client.mock.MockInstance;
+import org.apache.accumulo.core.client.security.tokens.PasswordToken;
+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.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.openrdf.query.MalformedQueryException;
+import org.openrdf.query.algebra.TupleExpr;
+import org.openrdf.query.algebra.evaluation.impl.FilterOptimizer;
+import org.openrdf.query.parser.ParsedQuery;
+import org.openrdf.query.parser.sparql.SPARQLParser;
+
+public class QueryJoinSelectOptimizerTest {
+
+  private static final String DELIM = "\u0000";
+  private final byte[] EMPTY_BYTE = new byte[0];
+  private final Value EMPTY_VAL = new Value(EMPTY_BYTE);
+
+  private String q1 = ""//
+      + "SELECT ?h  " //
+      + "{" //
+      + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
+      + "  ?h <uri:barksAt> <uri:cat> ."//
+      + "  ?h <uri:peesOn> <uri:hydrant> . "//
+      + "}";//
+
+  private String Q1 = ""//
+      + "SELECT ?h  " //
+      + "{" //
+      + "  ?h <uri:peesOn> <uri:hydrant> . "//
+      + "  ?h <uri:barksAt> <uri:cat> ."//
+      + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
+      + "}";//
+
+  private String q2 = ""//
+      + "SELECT ?h ?l ?m" //
+      + "{" //
+      + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
+      + "  ?h <uri:barksAt> <uri:cat> ."//
+      + "  ?h <uri:peesOn> <uri:hydrant> . "//
+      + "  ?m <uri:eats>  <uri:chickens>. " //
+      + "  ?m <uri:scratches> <uri:ears>. " //
+      + "}";//
+
+  private String Q2 = ""//
+      + "SELECT ?h ?l ?m" //
+      + "{" //
+      + "  ?h <uri:peesOn> <uri:hydrant> . "//
+      + "  ?h <uri:barksAt> <uri:cat> ."//
+      + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
+      + "  ?m <uri:eats>  <uri:chickens>. " //
+      + "  ?m <uri:scratches> <uri:ears>. " //
+      + "}";//
+
+  private String q3 = ""//
+      + "SELECT ?h ?l ?m" //
+      + "{" //
+      + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
+      + "  ?h <uri:barksAt> <uri:cat> ."//
+      + "  ?h <uri:peesOn> <uri:hydrant> . "//
+      + "  {?m <uri:eats>  <uri:chickens>} OPTIONAL {?m <uri:scratches> <uri:ears>}. " //
+      + "  {?m <uri:eats>  <uri:kibble>. ?m <uri:watches> <uri:television>.} UNION {?m <uri:rollsIn> <uri:mud>}. " //
+      + "  ?l <uri:runsIn> <uri:field> ."//
+      + "  ?l <uri:smells> <uri:butt> ."//
+      + "  ?l <uri:eats> <uri:sticks> ."//
+      + "}";//
+
+  private String Q4 = ""//
+      + "SELECT ?h ?l ?m" //
+      + "{" //
+      + "  ?h <uri:barksAt> <uri:cat> ."//
+      + "  ?m <uri:scratches> <uri:ears>. " //
+      + "  ?m <uri:eats>  <uri:chickens>. " //
+      + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
+      + "  ?h <uri:peesOn> <uri:hydrant> . "//
+      + "}";//
+
+  private String q5 = ""//
+      + "SELECT ?h ?l ?m" //
+      + "{" //
+      + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
+      + "  ?h <uri:barksAt> <uri:cat> ."//
+      + "  ?h <uri:peesOn> <uri:hydrant> . "//
+      + "  {?m <uri:eats>  <uri:kibble>. ?m <uri:watches> <uri:television>.?m <uri:eats>  <uri:chickens>} " + "  UNION {?m <uri:rollsIn> <uri:mud>}. " //
+      + "  ?l <uri:runsIn> <uri:field> ."//
+      + "  ?l <uri:smells> <uri:butt> ."//
+      + "  ?l <uri:eats> <uri:sticks> ."//
+      + "}";//
+  
+  
+  private String q6 = ""//
+          + "SELECT ?h ?l ?m" //
+          + "{" //
+          + "  ?h <http://www.w3.org/2000/01/rdf-schema#label> <uri:dog> ."//
+          + "  ?h <uri:barksAt> <uri:cat> ."//
+          + "  ?h <uri:peesOn> <uri:hydrant> . "//
+           + "  FILTER(?l = <uri:grover>) ." //
+          + "  {?m <uri:eats>  <uri:kibble>. ?m <uri:watches> <uri:television>.?m <uri:eats>  <uri:chickens>} " + "  UNION {?m <uri:rollsIn> <uri:mud>}. " //
+          + "  ?l <uri:runsIn> <uri:field> ."//
+          + "  ?l <uri:smells> <uri:butt> ."//
+          + "  ?l <uri:eats> <uri:sticks> ."//
+          + "}";//
+
+  private Connector conn;
+  AccumuloRdfConfiguration arc;
+  BatchWriterConfig config;
+  RdfEvalStatsDAO<RdfCloudTripleStoreConfiguration> res;
+  Instance mock;
+
+  @Before
+  public void init() throws AccumuloException, AccumuloSecurityException, TableNotFoundException, TableExistsException {
+
+    mock = new MockInstance("accumulo");
+    PasswordToken pToken = new PasswordToken("pass".getBytes());
+    conn = mock.getConnector("user", pToken);
+
+    config = new BatchWriterConfig();
+    config.setMaxMemory(1000);
+    config.setMaxLatency(1000, TimeUnit.SECONDS);
+    config.setMaxWriteThreads(10);
+
+    if (conn.tableOperations().exists("rya_prospects")) {
+      conn.tableOperations().delete("rya_prospects");
+    }
+    if (conn.tableOperations().exists("rya_selectivity")) {
+      conn.tableOperations().delete("rya_selectivity");
+    }
+
+    arc = new AccumuloRdfConfiguration();
+    arc.setTableLayoutStrategy(new TablePrefixLayoutStrategy());
+    arc.setMaxRangesForScanner(300);
+    res = new ProspectorServiceEvalStatsDAO(conn, arc);
+
+  }
+
+  @Test
+  public void testOptimizeQ1() throws Exception {
+
+    RdfEvalStatsDAO<RdfCloudTripleStoreConfiguration> res = new ProspectorServiceEvalStatsDAO(conn, arc);
+    AccumuloSelectivityEvalDAO accc = new AccumuloSelectivityEvalDAO();
+    accc.setConf(arc);
+    accc.setConnector(conn);
+    accc.setRdfEvalDAO(res);
+    accc.init();
+
+    BatchWriter bw1 = conn.createBatchWriter("rya_prospects", config);
+    BatchWriter bw2 = conn.createBatchWriter("rya_selectivity", config);
+
+    String s1 = "predicateobject" + DELIM + "http://www.w3.org/2000/01/rdf-schema#label" + DELIM + "uri:dog";
+    String s2 = "predicateobject" + DELIM + "uri:barksAt" + DELIM + "uri:cat";
+    String s3 = "predicateobject" + DELIM + "uri:peesOn" + DELIM + "uri:hydrant";
+    List<Mutation> mList = new ArrayList<Mutation>();
+    List<Mutation> mList2 = new ArrayList<Mutation>();
+    List<String> sList = Arrays.asList("subjectobject", "subjectpredicate", "subjectsubject", "predicateobject", "predicatepredicate", "predicatesubject");
+    Mutation m1, m2, m3, m4;
+
+    m1 = new Mutation(s1 + DELIM + "3");
+    m1.put(new Text("count"), new Text(""), new Value("3".getBytes()));
+    m2 = new Mutation(s2 + DELIM + "2");
+    m2.put(new Text("count"), new Text(""), new Value("2".getBytes()));
+    m3 = new Mutation(s3 + DELIM + "1");
+    m3.put(new Text("count"), new Text(""), new Value("1".getBytes()));
+    mList.add(m1);
+    mList.add(m2);
+    mList.add(m3);
+
+    bw1.addMutations(mList);
+    bw1.close();
+
+    Scanner scan = conn.createScanner("rya_prospects", new Authorizations());
+    scan.setRange(new Range());
+
+    for (Map.Entry<Key,Value> entry : scan) {
+      System.out.println("Key row string is " + entry.getKey().getRow().toString());
+      System.out.println("Key is " + entry.getKey());
+      System.out.println("Value is " + (new String(entry.getValue().get())));
+    }
+
+    m1 = new Mutation(s1);
+    m2 = new Mutation(s2);
+    m3 = new Mutation(s3);
+    m4 = new Mutation(new Text("subjectpredicateobject" + DELIM + "FullTableCardinality"));
+    m4.put(new Text("FullTableCardinality"), new Text("100"), EMPTY_VAL);
+    int i = 2;
+    int j = 3;
+    int k = 4;
+    Long count1;
+    Long count2;
+    Long count3;
+
+    for (String s : sList) {
+      count1 = (long) i;
+      count2 = (long) j;
+      count3 = (long) k;
+      m1.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+      m2.put(new Text(s), new Text(count2.toString()), EMPTY_VAL);
+      m3.put(new Text(s), new Text(count3.toString()), EMPTY_VAL);
+      i = 2 * i;
+      j = 2 * j;
+      k = 2 * k;
+    }
+    mList2.add(m1);
+    mList2.add(m2);
+    mList2.add(m3);
+    mList2.add(m4);
+    bw2.addMutations(mList2);
+    bw2.close();
+
+    scan = conn.createScanner("rya_selectivity", new Authorizations());
+    scan.setRange(new Range());
+
+    for (Map.Entry<Key,Value> entry : scan) {
+      System.out.println("Key row string is " + entry.getKey().getRow().toString());
+      System.out.println("Key is " + entry.getKey());
+      System.out.println("Value is " + (new String(entry.getKey().getColumnQualifier().toString())));
+
+    }
+
+    TupleExpr te = getTupleExpr(q1);
+
+    RdfCloudTripleStoreSelectivityEvaluationStatistics ars = new RdfCloudTripleStoreSelectivityEvaluationStatistics(arc, res, accc);
+    QueryJoinSelectOptimizer qjs = new QueryJoinSelectOptimizer(ars, accc);
+    System.out.println("Originial query is " + te);
+    qjs.optimize(te, null, null);
+    Assert.assertTrue(te.equals(getTupleExpr(Q1)));
+
+  }
+
+  @Test
+  public void testOptimizeQ2() throws Exception {
+
+    System.out.println("*********************QUERY2********************");
+
+    RdfEvalStatsDAO<RdfCloudTripleStoreConfiguration> res = new ProspectorServiceEvalStatsDAO(conn, arc);
+    AccumuloSelectivityEvalDAO accc = new AccumuloSelectivityEvalDAO();
+    accc.setConf(arc);
+    accc.setConnector(conn);
+    accc.setRdfEvalDAO(res);
+    accc.init();
+
+    BatchWriter bw1 = conn.createBatchWriter("rya_prospects", config);
+    BatchWriter bw2 = conn.createBatchWriter("rya_selectivity", config);
+
+    String s1 = "predicateobject" + DELIM + "http://www.w3.org/2000/01/rdf-schema#label" + DELIM + "uri:dog";
+    String s2 = "predicateobject" + DELIM + "uri:barksAt" + DELIM + "uri:cat";
+    String s3 = "predicateobject" + DELIM + "uri:peesOn" + DELIM + "uri:hydrant";
+    String s5 = "predicateobject" + DELIM + "uri:scratches" + DELIM + "uri:ears";
+    String s4 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:chickens";
+    List<Mutation> mList = new ArrayList<Mutation>();
+    List<Mutation> mList2 = new ArrayList<Mutation>();
+    List<String> sList = Arrays.asList("subjectobject", "subjectpredicate", "subjectsubject", "predicateobject", "predicatepredicate", "predicatesubject");
+    Mutation m1, m2, m3, m4, m5, m6;
+
+    m1 = new Mutation(s1 + DELIM + "3");
+    m1.put(new Text("count"), new Text(""), new Value("4".getBytes()));
+    m2 = new Mutation(s2 + DELIM + "2");
+    m2.put(new Text("count"), new Text(""), new Value("3".getBytes()));
+    m3 = new Mutation(s3 + DELIM + "1");
+    m3.put(new Text("count"), new Text(""), new Value("2".getBytes()));
+    m4 = new Mutation(s4 + DELIM + "1");
+    m4.put(new Text("count"), new Text(""), new Value("3".getBytes()));
+    m5 = new Mutation(s5 + DELIM + "1");
+    m5.put(new Text("count"), new Text(""), new Value("5".getBytes()));
+    mList.add(m1);
+    mList.add(m2);
+    mList.add(m3);
+    mList.add(m4);
+    mList.add(m5);
+
+    bw1.addMutations(mList);
+    bw1.close();
+
+    Scanner scan = conn.createScanner("rya_prospects", new Authorizations());
+    scan.setRange(new Range());
+
+    for (Map.Entry<Key,Value> entry : scan) {
+      System.out.println("Key row string is " + entry.getKey().getRow().toString());
+      System.out.println("Key is " + entry.getKey());
+      System.out.println("Value is " + (new String(entry.getValue().get())));
+    }
+
+    m1 = new Mutation(s1);
+    m2 = new Mutation(s2);
+    m3 = new Mutation(s3);
+    m4 = new Mutation(s4);
+    m5 = new Mutation(s5);
+    m6 = new Mutation(new Text("subjectpredicateobject" + DELIM + "FullTableCardinality"));
+    m6.put(new Text("FullTableCardinality"), new Text("100"), EMPTY_VAL);
+    int i = 2;
+    int j = 3;
+    int k = 4;
+    Long count1;
+    Long count2;
+    Long count3;
+
+    for (String s : sList) {
+      count1 = (long) i;
+      count2 = (long) j;
+      count3 = (long) k;
+      m1.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+      m2.put(new Text(s), new Text(count2.toString()), EMPTY_VAL);
+      m3.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+      m4.put(new Text(s), new Text(count3.toString()), EMPTY_VAL);
+      m5.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+
+      i = 2 * i;
+      j = 2 * j;
+      k = 2 * k;
+    }
+    mList2.add(m1);
+    mList2.add(m2);
+    mList2.add(m3);
+    mList2.add(m5);
+    mList2.add(m4);
+    mList2.add(m6);
+    bw2.addMutations(mList2);
+    bw2.close();
+
+    // scan = conn.createScanner("rya_selectivity" , new Authorizations());
+    // scan.setRange(new Range());
+    //
+    // for (Map.Entry<Key, Value> entry : scan) {
+    // System.out.println("Key row string is " + entry.getKey().getRow().toString());
+    // System.out.println("Key is " + entry.getKey());
+    // System.out.println("Value is " + (new String(entry.getKey().getColumnQualifier().toString())));
+    //
+    // }
+
+    TupleExpr te = getTupleExpr(q2);
+    System.out.println("Bindings are " + te.getBindingNames());
+    RdfCloudTripleStoreSelectivityEvaluationStatistics ars = new RdfCloudTripleStoreSelectivityEvaluationStatistics(arc, res, accc);
+    QueryJoinSelectOptimizer qjs = new QueryJoinSelectOptimizer(ars, accc);
+    System.out.println("Originial query is " + te);
+    qjs.optimize(te, null, null);
+    System.out.println("Optimized query is " + te);
+    // System.out.println("Bindings are " + te.getBindingNames());
+    Assert.assertTrue(te.equals(getTupleExpr(Q2)));
+
+  }
+
+  @Test
+  public void testOptimizeQ3() throws Exception {
+
+    RdfEvalStatsDAO<RdfCloudTripleStoreConfiguration> res = new ProspectorServiceEvalStatsDAO(conn, arc);
+    AccumuloSelectivityEvalDAO accc = new AccumuloSelectivityEvalDAO();
+    accc.setConf(arc);
+    accc.setConnector(conn);
+    accc.setRdfEvalDAO(res);
+    accc.init();
+
+    BatchWriter bw1 = conn.createBatchWriter("rya_prospects", config);
+    BatchWriter bw2 = conn.createBatchWriter("rya_selectivity", config);
+
+    String s1 = "predicateobject" + DELIM + "http://www.w3.org/2000/01/rdf-schema#label" + DELIM + "uri:dog";
+    String s2 = "predicateobject" + DELIM + "uri:barksAt" + DELIM + "uri:cat";
+    String s3 = "predicateobject" + DELIM + "uri:peesOn" + DELIM + "uri:hydrant";
+    String s5 = "predicateobject" + DELIM + "uri:scratches" + DELIM + "uri:ears";
+    String s4 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:chickens";
+    String s6 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:kibble";
+    String s7 = "predicateobject" + DELIM + "uri:rollsIn" + DELIM + "uri:mud";
+    String s8 = "predicateobject" + DELIM + "uri:runsIn" + DELIM + "uri:field";
+    String s9 = "predicateobject" + DELIM + "uri:smells" + DELIM + "uri:butt";
+    String s10 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:sticks";
+
+    List<Mutation> mList = new ArrayList<Mutation>();
+    List<Mutation> mList2 = new ArrayList<Mutation>();
+    List<String> sList = Arrays.asList("subjectobject", "subjectpredicate", "subjectsubject", "predicateobject", "predicatepredicate", "predicatesubject");
+    Mutation m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11;
+
+    m1 = new Mutation(s1 + DELIM + "3");
+    m1.put(new Text("count"), new Text(""), new Value("5".getBytes()));
+    m2 = new Mutation(s2 + DELIM + "2");
+    m2.put(new Text("count"), new Text(""), new Value("3".getBytes()));
+    m3 = new Mutation(s3 + DELIM + "1");
+    m3.put(new Text("count"), new Text(""), new Value("2".getBytes()));
+    m4 = new Mutation(s4 + DELIM + "1");
+    m4.put(new Text("count"), new Text(""), new Value("3".getBytes()));
+    m5 = new Mutation(s5 + DELIM + "1");
+    m5.put(new Text("count"), new Text(""), new Value("5".getBytes()));
+    m6 = new Mutation(s6 + DELIM + "1");
+    m6.put(new Text("count"), new Text(""), new Value("3".getBytes()));
+    m7 = new Mutation(s7 + DELIM + "1");
+    m7.put(new Text("count"), new Text(""), new Value("2".getBytes()));
+    m8 = new Mutation(s8 + DELIM + "1");
+    m8.put(new Text("count"), new Text(""), new Value("3".getBytes()));
+    m9 = new Mutation(s9 + DELIM + "1");
+    m9.put(new Text("count"), new Text(""), new Value("1".getBytes()));
+    m10 = new Mutation(s10 + DELIM + "1");
+    m10.put(new Text("count"), new Text(""), new Value("1".getBytes()));
+
+    mList.add(m1);
+    mList.add(m2);
+    mList.add(m3);
+    mList.add(m4);
+    mList.add(m5);
+    mList.add(m6);
+    mList.add(m7);
+    mList.add(m8);
+    mList.add(m9);
+    mList.add(m10);
+
+    bw1.addMutations(mList);
+    bw1.close();
+
+    Scanner scan = conn.createScanner("rya_prospects", new Authorizations());
+    scan.setRange(new Range());
+
+    for (Map.Entry<Key,Value> entry : scan) {
+      System.out.println("Key row string is " + entry.getKey().getRow().toString());
+      System.out.println("Key is " + entry.getKey());
+      System.out.println("Value is " + (new String(entry.getValue().get())));
+    }
+
+    m1 = new Mutation(s1);
+    m2 = new Mutation(s2);
+    m3 = new Mutation(s3);
+    m4 = new Mutation(s4);
+    m5 = new Mutation(s5);
+    m6 = new Mutation(s6);
+    m7 = new Mutation(s7);
+    m8 = new Mutation(s8);
+    m9 = new Mutation(s9);
+    m10 = new Mutation(s10);
+    m11 = new Mutation(new Text("subjectpredicateobject" + DELIM + "FullTableCardinality"));
+    m11.put(new Text("FullTableCardinality"), new Text("100"), EMPTY_VAL);
+    int i = 2;
+    int j = 3;
+    int k = 4;
+    int l = 5;
+    Long count1;
+    Long count2;
+    Long count3;
+    Long count4;
+
+    for (String s : sList) {
+      count1 = (long) i;
+      count2 = (long) j;
+      count3 = (long) k;
+      count4 = (long) l;
+      m1.put(new Text(s), new Text(count4.toString()), EMPTY_VAL);
+      m2.put(new Text(s), new Text(count2.toString()), EMPTY_VAL);
+      m3.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+      m4.put(new Text(s), new Text(count3.toString()), EMPTY_VAL);
+      m5.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+      m6.put(new Text(s), new Text(count2.toString()), EMPTY_VAL);
+      m7.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+      m8.put(new Text(s), new Text(count4.toString()), EMPTY_VAL);
+      m9.put(new Text(s), new Text(count3.toString()), EMPTY_VAL);
+      m10.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+
+      i = 2 * i;
+      j = 2 * j;
+      k = 2 * k;
+      l = 2 * l;
+    }
+    mList2.add(m1);
+    mList2.add(m2);
+    mList2.add(m3);
+    mList2.add(m5);
+    mList2.add(m4);
+    mList2.add(m6);
+    mList2.add(m7);
+    mList2.add(m8);
+    mList2.add(m9);
+    mList2.add(m10);
+    mList2.add(m11);
+    bw2.addMutations(mList2);
+    bw2.close();
+
+    scan = conn.createScanner("rya_selectivity", new Authorizations());
+    scan.setRange(new Range());
+
+    for (Map.Entry<Key,Value> entry : scan) {
+      System.out.println("Key row string is " + entry.getKey().getRow().toString());
+      System.out.println("Key is " + entry.getKey());
+      System.out.println("Value is " + (new String(entry.getKey().getColumnQualifier().toString())));
+
+    }
+
+    TupleExpr te = getTupleExpr(q3);
+    RdfCloudTripleStoreSelectivityEvaluationStatistics ars = new RdfCloudTripleStoreSelectivityEvaluationStatistics(arc, res, accc);
+    QueryJoinSelectOptimizer qjs = new QueryJoinSelectOptimizer(ars, accc);
+    System.out.println("Originial query is " + te);
+    qjs.optimize(te, null, null);
+
+    System.out.print("Optimized query is " + te);
+
+  }
+
+  @Test
+  public void testOptimizeQ4() throws Exception {
+
+    RdfEvalStatsDAO<RdfCloudTripleStoreConfiguration> res = new ProspectorServiceEvalStatsDAO(conn, arc);
+    AccumuloSelectivityEvalDAO accc = new AccumuloSelectivityEvalDAO();
+    accc.setConf(arc);
+    accc.setConnector(conn);
+    accc.setRdfEvalDAO(res);
+    accc.init();
+
+    BatchWriter bw1 = conn.createBatchWriter("rya_prospects", config);
+    BatchWriter bw2 = conn.createBatchWriter("rya_selectivity", config);
+
+    String s1 = "predicateobject" + DELIM + "http://www.w3.org/2000/01/rdf-schema#label" + DELIM + "uri:dog";
+    String s2 = "predicateobject" + DELIM + "uri:barksAt" + DELIM + "uri:cat";
+    String s3 = "predicateobject" + DELIM + "uri:peesOn" + DELIM + "uri:hydrant";
+    String s5 = "predicateobject" + DELIM + "uri:scratches" + DELIM + "uri:ears";
+    String s4 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:chickens";
+    List<Mutation> mList = new ArrayList<Mutation>();
+    List<Mutation> mList2 = new ArrayList<Mutation>();
+    List<String> sList = Arrays.asList("subjectobject", "subjectpredicate", "subjectsubject", "predicateobject", "predicatepredicate", "predicatesubject");
+    Mutation m1, m2, m3, m4, m5, m6;
+
+    m1 = new Mutation(s1 + DELIM + "3");
+    m1.put(new Text("count"), new Text(""), new Value("4".getBytes()));
+    m2 = new Mutation(s2 + DELIM + "2");
+    m2.put(new Text("count"), new Text(""), new Value("0".getBytes()));
+    m3 = new Mutation(s3 + DELIM + "1");
+    m3.put(new Text("count"), new Text(""), new Value("8".getBytes()));
+    m4 = new Mutation(s4 + DELIM + "1");
+    m4.put(new Text("count"), new Text(""), new Value("3".getBytes()));
+    m5 = new Mutation(s5 + DELIM + "1");
+    m5.put(new Text("count"), new Text(""), new Value("0".getBytes()));
+    mList.add(m1);
+    mList.add(m2);
+    mList.add(m3);
+    mList.add(m4);
+    mList.add(m5);
+
+    bw1.addMutations(mList);
+    bw1.close();
+
+    Scanner scan = conn.createScanner("rya_prospects", new Authorizations());
+    scan.setRange(new Range());
+
+    for (Map.Entry<Key,Value> entry : scan) {
+      System.out.println("Key row string is " + entry.getKey().getRow().toString());
+      System.out.println("Key is " + entry.getKey());
+      System.out.println("Value is " + (new String(entry.getValue().get())));
+    }
+
+    m1 = new Mutation(s1);
+    m2 = new Mutation(s2);
+    m3 = new Mutation(s3);
+    m4 = new Mutation(s4);
+    m5 = new Mutation(s5);
+    m6 = new Mutation(new Text("subjectpredicateobject" + DELIM + "FullTableCardinality"));
+    m6.put(new Text("FullTableCardinality"), new Text("100"), EMPTY_VAL);
+    int i = 2;
+    int j = 3;
+    int k = 4;
+    Long count1;
+    Long count2;
+    Long count3;
+
+    for (String s : sList) {
+      count1 = (long) i;
+      count2 = (long) j;
+      count3 = (long) k;
+      m1.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+      m2.put(new Text(s), new Text(count2.toString()), EMPTY_VAL);
+      m3.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+      m4.put(new Text(s), new Text(count3.toString()), EMPTY_VAL);
+      m5.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+
+      i = 2 * i;
+      j = 2 * j;
+      k = 2 * k;
+    }
+    mList2.add(m1);
+    mList2.add(m2);
+    mList2.add(m3);
+    mList2.add(m5);
+    mList2.add(m4);
+    mList2.add(m6);
+    bw2.addMutations(mList2);
+    bw2.close();
+
+    scan = conn.createScanner("rya_selectivity", new Authorizations());
+    scan.setRange(new Range());
+
+    for (Map.Entry<Key,Value> entry : scan) {
+      System.out.println("Key row string is " + entry.getKey().getRow().toString());
+      System.out.println("Key is " + entry.getKey());
+      System.out.println("Value is " + (new String(entry.getKey().getColumnQualifier().toString())));
+
+    }
+
+    TupleExpr te = getTupleExpr(q2);
+    RdfCloudTripleStoreSelectivityEvaluationStatistics ars = new RdfCloudTripleStoreSelectivityEvaluationStatistics(arc, res, accc);
+    QueryJoinSelectOptimizer qjs = new QueryJoinSelectOptimizer(ars, accc);
+    System.out.println("Originial query is " + te);
+    qjs.optimize(te, null, null);
+    Assert.assertTrue(te.equals(getTupleExpr(Q4)));
+
+    System.out.print("Optimized query is " + te);
+
+  }
+
+  @Test
+  public void testOptimizeQ5() throws Exception {
+
+    RdfEvalStatsDAO<RdfCloudTripleStoreConfiguration> res = new ProspectorServiceEvalStatsDAO(conn, arc);
+    AccumuloSelectivityEvalDAO accc = new AccumuloSelectivityEvalDAO();
+    accc.setConf(arc);
+    accc.setConnector(conn);
+    accc.setRdfEvalDAO(res);
+    accc.init();
+
+    BatchWriter bw1 = conn.createBatchWriter("rya_prospects", config);
+    BatchWriter bw2 = conn.createBatchWriter("rya_selectivity", config);
+
+    String s1 = "predicateobject" + DELIM + "http://www.w3.org/2000/01/rdf-schema#label" + DELIM + "uri:dog";
+    String s2 = "predicateobject" + DELIM + "uri:barksAt" + DELIM + "uri:cat";
+    String s3 = "predicateobject" + DELIM + "uri:peesOn" + DELIM + "uri:hydrant";
+    String s5 = "predicateobject" + DELIM + "uri:watches" + DELIM + "uri:television";
+    String s4 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:chickens";
+    String s6 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:kibble";
+    String s7 = "predicateobject" + DELIM + "uri:rollsIn" + DELIM + "uri:mud";
+    String s8 = "predicateobject" + DELIM + "uri:runsIn" + DELIM + "uri:field";
+    String s9 = "predicateobject" + DELIM + "uri:smells" + DELIM + "uri:butt";
+    String s10 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:sticks";
+
+    List<Mutation> mList = new ArrayList<Mutation>();
+    List<Mutation> mList2 = new ArrayList<Mutation>();
+    List<String> sList = Arrays.asList("subjectobject", "subjectpredicate", "subjectsubject", "predicateobject", "predicatepredicate", "predicatesubject");
+    Mutation m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11;
+
+    m1 = new Mutation(s1 + DELIM + "3");
+    m1.put(new Text("count"), new Text(""), new Value("5".getBytes()));
+    m2 = new Mutation(s2 + DELIM + "2");
+    m2.put(new Text("count"), new Text(""), new Value("3".getBytes()));
+    m3 = new Mutation(s3 + DELIM + "1");
+    m3.put(new Text("count"), new Text(""), new Value("2".getBytes()));
+    m4 = new Mutation(s4 + DELIM + "1");
+    m4.put(new Text("count"), new Text(""), new Value("0".getBytes()));
+    m5 = new Mutation(s5 + DELIM + "1");
+    m5.put(new Text("count"), new Text(""), new Value("1".getBytes()));
+    m6 = new Mutation(s6 + DELIM + "1");
+    m6.put(new Text("count"), new Text(""), new Value("3".getBytes()));
+    m7 = new Mutation(s7 + DELIM + "1");
+    m7.put(new Text("count"), new Text(""), new Value("2".getBytes()));
+    m8 = new Mutation(s8 + DELIM + "1");
+    m8.put(new Text("count"), new Text(""), new Value("3".getBytes()));
+    m9 = new Mutation(s9 + DELIM + "1");
+    m9.put(new Text("count"), new Text(""), new Value("1".getBytes()));
+    m10 = new Mutation(s10 + DELIM + "1");
+    m10.put(new Text("count"), new Text(""), new Value("1".getBytes()));
+
+    mList.add(m1);
+    mList.add(m2);
+    mList.add(m3);
+    mList.add(m4);
+    mList.add(m5);
+    mList.add(m6);
+    mList.add(m7);
+    mList.add(m8);
+    mList.add(m9);
+    mList.add(m10);
+
+    bw1.addMutations(mList);
+    bw1.close();
+
+    Scanner scan = conn.createScanner("rya_prospects", new Authorizations());
+    scan.setRange(new Range());
+
+    for (Map.Entry<Key,Value> entry : scan) {
+      System.out.println("Key row string is " + entry.getKey().getRow().toString());
+      System.out.println("Key is " + entry.getKey());
+      System.out.println("Value is " + (new String(entry.getValue().get())));
+    }
+
+    m1 = new Mutation(s1);
+    m2 = new Mutation(s2);
+    m3 = new Mutation(s3);
+    m4 = new Mutation(s4);
+    m5 = new Mutation(s5);
+    m6 = new Mutation(s6);
+    m7 = new Mutation(s7);
+    m8 = new Mutation(s8);
+    m9 = new Mutation(s9);
+    m10 = new Mutation(s10);
+    m11 = new Mutation(new Text("subjectpredicateobject" + DELIM + "FullTableCardinality"));
+    m11.put(new Text("FullTableCardinality"), new Text("100"), EMPTY_VAL);
+    int i = 2;
+    int j = 3;
+    int k = 4;
+    int l = 5;
+    Long count1;
+    Long count2;
+    Long count3;
+    Long count4;
+
+    for (String s : sList) {
+      count1 = (long) i;
+      count2 = (long) j;
+      count3 = (long) k;
+      count4 = (long) l;
+      m1.put(new Text(s), new Text(count4.toString()), EMPTY_VAL);
+      m2.put(new Text(s), new Text(count2.toString()), EMPTY_VAL);
+      m3.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+      m4.put(new Text(s), new Text(count3.toString()), EMPTY_VAL);
+      m5.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+      m6.put(new Text(s), new Text(count2.toString()), EMPTY_VAL);
+      m7.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+      m8.put(new Text(s), new Text(count4.toString()), EMPTY_VAL);
+      m9.put(new Text(s), new Text(count3.toString()), EMPTY_VAL);
+      m10.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+
+      i = 2 * i;
+      j = 2 * j;
+      k = 2 * k;
+      l = 2 * l;
+    }
+    mList2.add(m1);
+    mList2.add(m2);
+    mList2.add(m3);
+    mList2.add(m5);
+    mList2.add(m4);
+    mList2.add(m6);
+    mList2.add(m7);
+    mList2.add(m8);
+    mList2.add(m9);
+    mList2.add(m10);
+    mList2.add(m11);
+    bw2.addMutations(mList2);
+    bw2.close();
+
+    scan = conn.createScanner("rya_selectivity", new Authorizations());
+    scan.setRange(new Range());
+
+    for (Map.Entry<Key,Value> entry : scan) {
+      System.out.println("Key row string is " + entry.getKey().getRow().toString());
+      System.out.println("Key is " + entry.getKey());
+      System.out.println("Value is " + (new String(entry.getKey().getColumnQualifier().toString())));
+
+    }
+
+    TupleExpr te = getTupleExpr(q5);
+    System.out.println("Bindings are " + te.getBindingNames());
+    RdfCloudTripleStoreSelectivityEvaluationStatistics ars = new RdfCloudTripleStoreSelectivityEvaluationStatistics(arc, res, accc);
+    QueryJoinSelectOptimizer qjs = new QueryJoinSelectOptimizer(ars, accc);
+    System.out.println("Originial query is " + te);
+    qjs.optimize(te, null, null);
+    System.out.println("Bindings are " + te.getBindingNames());
+
+    System.out.print("Optimized query is " + te);
+
+  }
+  
+  
+  
+  
+  
+  
+  
+  
+  @Test
+  public void testOptimizeQ6() throws Exception {
+
+    RdfEvalStatsDAO<RdfCloudTripleStoreConfiguration> res = new ProspectorServiceEvalStatsDAO(conn, arc);
+    AccumuloSelectivityEvalDAO accc = new AccumuloSelectivityEvalDAO();
+    accc.setConf(arc);
+    accc.setConnector(conn);
+    accc.setRdfEvalDAO(res);
+    accc.init();
+
+    BatchWriter bw1 = conn.createBatchWriter("rya_prospects", config);
+    BatchWriter bw2 = conn.createBatchWriter("rya_selectivity", config);
+
+    String s1 = "predicateobject" + DELIM + "http://www.w3.org/2000/01/rdf-schema#label" + DELIM + "uri:dog";
+    String s2 = "predicateobject" + DELIM + "uri:barksAt" + DELIM + "uri:cat";
+    String s3 = "predicateobject" + DELIM + "uri:peesOn" + DELIM + "uri:hydrant";
+    String s5 = "predicateobject" + DELIM + "uri:watches" + DELIM + "uri:television";
+    String s4 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:chickens";
+    String s6 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:kibble";
+    String s7 = "predicateobject" + DELIM + "uri:rollsIn" + DELIM + "uri:mud";
+    String s8 = "predicateobject" + DELIM + "uri:runsIn" + DELIM + "uri:field";
+    String s9 = "predicateobject" + DELIM + "uri:smells" + DELIM + "uri:butt";
+    String s10 = "predicateobject" + DELIM + "uri:eats" + DELIM + "uri:sticks";
+
+    List<Mutation> mList = new ArrayList<Mutation>();
+    List<Mutation> mList2 = new ArrayList<Mutation>();
+    List<String> sList = Arrays.asList("subjectobject", "subjectpredicate", "subjectsubject", "predicateobject", "predicatepredicate", "predicatesubject");
+    Mutation m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11;
+
+    m1 = new Mutation(s1 + DELIM + "3");
+    m1.put(new Text("count"), new Text(""), new Value("5".getBytes()));
+    m2 = new Mutation(s2 + DELIM + "2");
+    m2.put(new Text("count"), new Text(""), new Value("3".getBytes()));
+    m3 = new Mutation(s3 + DELIM + "1");
+    m3.put(new Text("count"), new Text(""), new Value("2".getBytes()));
+    m4 = new Mutation(s4 + DELIM + "1");
+    m4.put(new Text("count"), new Text(""), new Value("0".getBytes()));
+    m5 = new Mutation(s5 + DELIM + "1");
+    m5.put(new Text("count"), new Text(""), new Value("1".getBytes()));
+    m6 = new Mutation(s6 + DELIM + "1");
+    m6.put(new Text("count"), new Text(""), new Value("3".getBytes()));
+    m7 = new Mutation(s7 + DELIM + "1");
+    m7.put(new Text("count"), new Text(""), new Value("2".getBytes()));
+    m8 = new Mutation(s8 + DELIM + "1");
+    m8.put(new Text("count"), new Text(""), new Value("3".getBytes()));
+    m9 = new Mutation(s9 + DELIM + "1");
+    m9.put(new Text("count"), new Text(""), new Value("1".getBytes()));
+    m10 = new Mutation(s10 + DELIM + "1");
+    m10.put(new Text("count"), new Text(""), new Value("1".getBytes()));
+
+    mList.add(m1);
+    mList.add(m2);
+    mList.add(m3);
+    mList.add(m4);
+    mList.add(m5);
+    mList.add(m6);
+    mList.add(m7);
+    mList.add(m8);
+    mList.add(m9);
+    mList.add(m10);
+
+    bw1.addMutations(mList);
+    bw1.close();
+
+    Scanner scan = conn.createScanner("rya_prospects", new Authorizations());
+    scan.setRange(new Range());
+
+    for (Map.Entry<Key,Value> entry : scan) {
+      System.out.println("Key row string is " + entry.getKey().getRow().toString());
+      System.out.println("Key is " + entry.getKey());
+      System.out.println("Value is " + (new String(entry.getValue().get())));
+    }
+
+    m1 = new Mutation(s1);
+    m2 = new Mutation(s2);
+    m3 = new Mutation(s3);
+    m4 = new Mutation(s4);
+    m5 = new Mutation(s5);
+    m6 = new Mutation(s6);
+    m7 = new Mutation(s7);
+    m8 = new Mutation(s8);
+    m9 = new Mutation(s9);
+    m10 = new Mutation(s10);
+    m11 = new Mutation(new Text("subjectpredicateobject" + DELIM + "FullTableCardinality"));
+    m11.put(new Text("FullTableCardinality"), new Text("100"), EMPTY_VAL);
+    int i = 2;
+    int j = 3;
+    int k = 4;
+    int l = 5;
+    Long count1;
+    Long count2;
+    Long count3;
+    Long count4;
+
+    for (String s : sList) {
+      count1 = (long) i;
+      count2 = (long) j;
+      count3 = (long) k;
+      count4 = (long) l;
+      m1.put(new Text(s), new Text(count4.toString()), EMPTY_VAL);
+      m2.put(new Text(s), new Text(count2.toString()), EMPTY_VAL);
+      m3.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+      m4.put(new Text(s), new Text(count3.toString()), EMPTY_VAL);
+      m5.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+      m6.put(new Text(s), new Text(count2.toString()), EMPTY_VAL);
+      m7.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+      m8.put(new Text(s), new Text(count4.toString()), EMPTY_VAL);
+      m9.put(new Text(s), new Text(count3.toString()), EMPTY_VAL);
+      m10.put(new Text(s), new Text(count1.toString()), EMPTY_VAL);
+
+      i = 2 * i;
+      j = 2 * j;
+      k = 2 * k;
+      l = 2 * l;
+    }
+    mList2.add(m1);
+    mList2.add(m2);
+    mList2.add(m3);
+    mList2.add(m5);
+    mList2.add(m4);
+    mList2.add(m6);
+    mList2.add(m7);
+    mList2.add(m8);
+    mList2.add(m9);
+    mList2.add(m10);
+    mList2.add(m11);
+    bw2.addMutations(mList2);
+    bw2.close();
+
+    scan = conn.createScanner("rya_selectivity", new Authorizations());
+    scan.setRange(new Range());
+
+    for (Map.Entry<Key,Value> entry : scan) {
+      System.out.println("Key row string is " + entry.getKey().getRow().toString());
+      System.out.println("Key is " + entry.getKey());
+      System.out.println("Value is " + (new String(entry.getKey().getColumnQualifier().toString())));
+
+    }
+
+    TupleExpr te = getTupleExpr(q6);
+    TupleExpr te2 = (TupleExpr) te.clone();
+    System.out.println("Bindings are " + te.getBindingNames());
+    RdfCloudTripleStoreSelectivityEvaluationStatistics ars = new RdfCloudTripleStoreSelectivityEvaluationStatistics(arc, res, accc);
+    QueryJoinSelectOptimizer qjs = new QueryJoinSelectOptimizer(ars, accc);
+    System.out.println("Originial query is " + te);
+    qjs.optimize(te, null, null);
+    
+    
+    
+    FilterOptimizer fo = new FilterOptimizer();
+    fo.optimize(te2, null, null);
+    System.out.print("filter optimized query before js opt is " + te2);
+    qjs.optimize(te2, null, null);
+
+    System.out.println("join selectivity opt query before filter opt is " + te);
+    fo.optimize(te, null, null);
+    
+    System.out.println("join selectivity opt query is " + te);
+    System.out.print("filter optimized query is " + te2);
+
+  }
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+
+  private TupleExpr getTupleExpr(String query) throws MalformedQueryException {
+
+    SPARQLParser sp = new SPARQLParser();
+    ParsedQuery pq = sp.parseQuery(query, null);
+
+    return pq.getTupleExpr();
+  }
+
+}