You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rya.apache.org by pu...@apache.org on 2016/05/13 16:42:44 UTC

[2/6] incubator-rya git commit: RYA-64 - Integrated Rya PCJ Secondary Index support into core Rya.

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjSerialzerTest.java
----------------------------------------------------------------------
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjSerialzerTest.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjSerialzerTest.java
new file mode 100644
index 0000000..5011adf
--- /dev/null
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjSerialzerTest.java
@@ -0,0 +1,175 @@
+package org.apache.rya.indexing.pcj.storage.accumulo;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjSerializer;
+import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter;
+import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
+import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.junit.Test;
+import org.openrdf.model.impl.LiteralImpl;
+import org.openrdf.model.impl.URIImpl;
+import org.openrdf.query.BindingSet;
+import org.openrdf.query.algebra.evaluation.QueryBindingSet;
+import org.openrdf.query.impl.MapBindingSet;
+
+/*
+ * 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 mvm.rya.api.resolver.RyaTypeResolverException;
+
+/**
+ * Tests the methods of {@link AccumuloPcjSerialzer}.
+ */
+public class AccumuloPcjSerialzerTest {
+
+    /**
+     * The BindingSet has fewer Bindings than there are variables in the variable
+     * order, but they are all in the variable order. This is the case where
+     * the missing bindings were optional.
+     */
+    @Test
+    public void serialize_bindingsSubsetOfVarOrder() throws BindingSetConversionException {
+        // Setup the Binding Set.
+        final MapBindingSet originalBindingSet = new MapBindingSet();
+        originalBindingSet.addBinding("x", new URIImpl("http://a"));
+        originalBindingSet.addBinding("y", new URIImpl("http://b"));
+
+        // Setup the variable order.
+        final VariableOrder varOrder = new VariableOrder("x", "a", "y", "b");
+
+        // Create the byte[] representation of the BindingSet.
+        BindingSetConverter<byte[]> converter = new AccumuloPcjSerializer();
+        byte[] serialized = converter.convert(originalBindingSet, varOrder);
+
+        // Deserialize the byte[] back into the binding set.
+        BindingSet deserialized = converter.convert(serialized, varOrder);
+
+        // Ensure the deserialized value matches the original.
+        assertEquals(originalBindingSet, deserialized);
+    }
+
+    /**
+     * The BindingSet has a Binding whose name is not in the variable order.
+     * This is illegal.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void serialize_bindingNotInVariableOrder() throws RyaTypeResolverException, BindingSetConversionException {
+        // Setup the Binding Set.
+        final MapBindingSet originalBindingSet = new MapBindingSet();
+        originalBindingSet.addBinding("x", new URIImpl("http://a"));
+        originalBindingSet.addBinding("y", new URIImpl("http://b"));
+        originalBindingSet.addBinding("z", new URIImpl("http://d"));
+
+        // Setup the variable order.
+        final VariableOrder varOrder = new VariableOrder("x", "y");
+
+        // Create the byte[] representation of the BindingSet. This will throw an exception.
+        BindingSetConverter<byte[]> converter = new AccumuloPcjSerializer();
+        converter.convert(originalBindingSet, varOrder);
+    }
+
+	@Test
+	public void basicShortUriBsTest() throws BindingSetConversionException {
+		final QueryBindingSet bs = new QueryBindingSet();
+		bs.addBinding("X",new URIImpl("http://uri1"));
+		bs.addBinding("Y",new URIImpl("http://uri2"));
+		final VariableOrder varOrder = new VariableOrder("X","Y");
+
+		BindingSetConverter<byte[]> converter = new AccumuloPcjSerializer();
+		final byte[] byteVal = converter.convert(bs, varOrder);
+		final BindingSet newBs = converter.convert(byteVal, varOrder);
+		assertEquals(bs, newBs);
+	}
+
+	@Test
+	public void basicLongUriBsTest() throws BindingSetConversionException {
+		final QueryBindingSet bs = new QueryBindingSet();
+		bs.addBinding("X",new URIImpl("http://uri1"));
+		bs.addBinding("Y",new URIImpl("http://uri2"));
+		bs.addBinding("Z",new URIImpl("http://uri3"));
+		bs.addBinding("A",new URIImpl("http://uri4"));
+		bs.addBinding("B",new URIImpl("http://uri5"));
+		final VariableOrder varOrder = new VariableOrder("X","Y","Z","A","B");
+
+		BindingSetConverter<byte[]> converter = new AccumuloPcjSerializer();
+		final byte[] byteVal = converter.convert(bs, varOrder);
+		final BindingSet newBs = converter.convert(byteVal, varOrder);
+		assertEquals(bs, newBs);
+	}
+
+	@Test
+	public void basicShortStringLiteralBsTest() throws BindingSetConversionException {
+		final QueryBindingSet bs = new QueryBindingSet();
+		bs.addBinding("X",new LiteralImpl("literal1"));
+		bs.addBinding("Y",new LiteralImpl("literal2"));
+		final VariableOrder varOrder = new VariableOrder("X","Y");
+
+		BindingSetConverter<byte[]> converter = new AccumuloPcjSerializer();
+		final byte[] byteVal = converter.convert(bs, varOrder);
+		final BindingSet newBs = converter.convert(byteVal, varOrder);
+		assertEquals(bs, newBs);
+	}
+
+	@Test
+	public void basicShortMixLiteralBsTest() throws BindingSetConversionException {
+		final QueryBindingSet bs = new QueryBindingSet();
+		bs.addBinding("X",new LiteralImpl("literal1"));
+		bs.addBinding("Y",new LiteralImpl("5", new URIImpl("http://www.w3.org/2001/XMLSchema#integer")));
+		final VariableOrder varOrder = new VariableOrder("X","Y");
+
+		BindingSetConverter<byte[]> converter = new AccumuloPcjSerializer();
+		final byte[] byteVal = converter.convert(bs, varOrder);
+		final BindingSet newBs = converter.convert(byteVal, varOrder);
+		assertEquals(bs, newBs);
+	}
+
+	@Test
+	public void basicLongMixLiteralBsTest() throws BindingSetConversionException {
+		final QueryBindingSet bs = new QueryBindingSet();
+		bs.addBinding("X",new LiteralImpl("literal1"));
+		bs.addBinding("Y",new LiteralImpl("5", new URIImpl("http://www.w3.org/2001/XMLSchema#integer")));
+		bs.addBinding("Z",new LiteralImpl("5.0", new URIImpl("http://www.w3.org/2001/XMLSchema#double")));
+		bs.addBinding("W",new LiteralImpl("1000", new URIImpl("http://www.w3.org/2001/XMLSchema#long")));
+		final VariableOrder varOrder = new VariableOrder("W","X","Y","Z");
+
+		BindingSetConverter<byte[]> converter = new AccumuloPcjSerializer();
+		final byte[] byteVal = converter.convert(bs, varOrder);
+		final BindingSet newBs = converter.convert(byteVal, varOrder);
+		assertEquals(bs, newBs);
+	}
+
+	@Test
+	public void basicMixUriLiteralBsTest() throws BindingSetConversionException {
+		final QueryBindingSet bs = new QueryBindingSet();
+		bs.addBinding("X",new LiteralImpl("literal1"));
+		bs.addBinding("Y",new LiteralImpl("5", new URIImpl("http://www.w3.org/2001/XMLSchema#integer")));
+		bs.addBinding("Z",new LiteralImpl("5.0", new URIImpl("http://www.w3.org/2001/XMLSchema#double")));
+		bs.addBinding("W",new LiteralImpl("1000", new URIImpl("http://www.w3.org/2001/XMLSchema#long")));
+		bs.addBinding("A",new URIImpl("http://uri1"));
+		bs.addBinding("B",new URIImpl("http://uri2"));
+		bs.addBinding("C",new URIImpl("http://uri3"));
+		final VariableOrder varOrder = new VariableOrder("A","W","X","Y","Z","B","C");
+
+		BindingSetConverter<byte[]> converter = new AccumuloPcjSerializer();
+		final byte[] byteVal = converter.convert(bs, varOrder);
+		final BindingSet newBs = converter.convert(byteVal, varOrder);
+		assertEquals(bs, newBs);
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetStringConverterTest.java
----------------------------------------------------------------------
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetStringConverterTest.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetStringConverterTest.java
new file mode 100644
index 0000000..e01e7de
--- /dev/null
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetStringConverterTest.java
@@ -0,0 +1,311 @@
+/*
+ * 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 org.apache.rya.indexing.pcj.storage.accumulo;
+
+import static org.junit.Assert.assertEquals;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter;
+import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
+import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetStringConverter;
+import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.junit.Test;
+import org.openrdf.model.impl.BooleanLiteralImpl;
+import org.openrdf.model.impl.DecimalLiteralImpl;
+import org.openrdf.model.impl.IntegerLiteralImpl;
+import org.openrdf.model.impl.URIImpl;
+import org.openrdf.query.BindingSet;
+import org.openrdf.query.impl.MapBindingSet;
+
+/**
+ * Tests the methods of {@link BindingSetStringConverter}.
+ */
+public class BindingSetStringConverterTest {
+
+    @Test
+    public void toString_URIs() throws BindingSetConversionException {
+        // Setup the binding set that will be converted.
+        final MapBindingSet originalBindingSet = new MapBindingSet();
+        originalBindingSet.addBinding("x", new URIImpl("http://a"));
+        originalBindingSet.addBinding("y", new URIImpl("http://b"));
+        originalBindingSet.addBinding("z", new URIImpl("http://c"));
+
+        // Convert it to a String.
+        final VariableOrder varOrder = new VariableOrder("y", "z", "x");
+        final BindingSetConverter<String> converter = new BindingSetStringConverter();
+        final String bindingSetString = converter.convert(originalBindingSet, varOrder);
+
+        // Ensure it converted to the expected result.l
+        final String expected =
+                "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                "http://c<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI";
+
+        assertEquals(expected, bindingSetString);
+    }
+
+    @Test
+    public void toString_Decimal() throws BindingSetConversionException {
+        // Setup the binding set that will be converted.
+        final MapBindingSet originalBindingSet = new MapBindingSet();
+        originalBindingSet.addBinding("x", new DecimalLiteralImpl(new BigDecimal(2.5)));
+
+        // Convert it to a String.
+        final VariableOrder varOrder = new VariableOrder("x");
+        final BindingSetConverter<String> converter = new BindingSetStringConverter();
+        final String bindingSetString = converter.convert(originalBindingSet, varOrder);
+
+        // Ensure it converted to the expected result.
+        final String expected = "2.5<<~>>http://www.w3.org/2001/XMLSchema#decimal";
+        assertEquals(expected, bindingSetString);
+    }
+
+    @Test
+    public void toString_Boolean() throws BindingSetConversionException {
+        // Setup the binding set that will be converted.
+        final MapBindingSet originalBindingSet = new MapBindingSet();
+        originalBindingSet.addBinding("x", new BooleanLiteralImpl(true));
+
+        // Convert it to a String.
+        final VariableOrder varOrder = new VariableOrder("x");
+        final BindingSetConverter<String> converter = new BindingSetStringConverter();
+        final String bindingSetString = converter.convert(originalBindingSet, varOrder);
+
+        // Ensure it converted to the expected result.
+        final String expected = "true<<~>>http://www.w3.org/2001/XMLSchema#boolean";
+        assertEquals(expected, bindingSetString);
+    }
+
+    @Test
+    public void toString_Integer() throws BindingSetConversionException {
+        // Setup the binding set that will be converted.
+        final MapBindingSet originalBindingSet = new MapBindingSet();
+        originalBindingSet.addBinding("x", new IntegerLiteralImpl(BigInteger.valueOf(5)));
+
+        // Convert it to a String.
+        final VariableOrder varOrder = new VariableOrder("x");
+        final BindingSetConverter<String> converter = new BindingSetStringConverter();
+        final String bindingSetString = converter.convert(originalBindingSet, varOrder);
+
+        // Ensure it converted to the expected result.
+        final String expected = "5<<~>>http://www.w3.org/2001/XMLSchema#integer";
+        assertEquals(expected, bindingSetString);
+    }
+
+    /**
+     * All of the Bindings in the BindingSet exactly match the variable order.
+     * This is the simplest case and is legal.
+     */
+    @Test
+    public void toString_bindingsMatchVarOrder() throws BindingSetConversionException {
+        // Setup the Binding Set.
+        final MapBindingSet originalBindingSet = new MapBindingSet();
+        originalBindingSet.addBinding("x", new URIImpl("http://a"));
+        originalBindingSet.addBinding("y", new URIImpl("http://b"));
+
+        // Setup the variable order.
+        final VariableOrder varOrder = new VariableOrder("x", "y");
+
+        // Create the String representation of the BindingSet.
+        final BindingSetConverter<String> converter = new BindingSetStringConverter();
+        final String bindingSetString = converter.convert(originalBindingSet, varOrder);
+
+        // Ensure the expected value was created.
+        final String expected =
+                "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI";
+        assertEquals(expected, bindingSetString);
+    }
+
+    /**
+     * The BindingSet has fewer Bindings than there are variables in the variable
+     * order, but they are all in the variable order. This is the case where
+     * the missing bindings were optional.
+     */
+    @Test
+    public void toString_bindingsSubsetOfVarOrder() throws BindingSetConversionException {
+        // Setup the Binding Set.
+        final MapBindingSet originalBindingSet = new MapBindingSet();
+        originalBindingSet.addBinding("x", new URIImpl("http://a"));
+        originalBindingSet.addBinding("y", new URIImpl("http://b"));
+
+        // Setup the variable order.
+        final VariableOrder varOrder = new VariableOrder("x", "a", "y", "b");
+
+        // Create the String representation of the BindingSet.
+        final BindingSetConverter<String> converter = new BindingSetStringConverter();
+        final String bindingSetString = converter.convert(originalBindingSet, varOrder);
+
+        // Ensure the expected value was created.
+        final String expected =
+                "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                BindingSetStringConverter.NULL_VALUE_STRING + ":::" +
+                "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                BindingSetStringConverter.NULL_VALUE_STRING;
+        assertEquals(expected, bindingSetString);
+    }
+
+    /**
+     * The BindingSet has a Binding whose name is not in the variable order.
+     * This is illegal.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void toString_bindingNotInVariableOrder() throws BindingSetConversionException {
+        // Setup the Binding Set.
+        final MapBindingSet originalBindingSet = new MapBindingSet();
+        originalBindingSet.addBinding("x", new URIImpl("http://a"));
+        originalBindingSet.addBinding("y", new URIImpl("http://b"));
+        originalBindingSet.addBinding("z", new URIImpl("http://d"));
+
+        // Setup the variable order.
+        final VariableOrder varOrder = new VariableOrder("x", "y");
+
+        // Create the String representation of the BindingSet. This will throw an exception.
+        final BindingSetConverter<String> converter = new BindingSetStringConverter();
+        converter.convert(originalBindingSet, varOrder);
+    }
+
+    @Test
+    public void fromString() throws BindingSetConversionException {
+        // Setup the String that will be converted.
+        final String bindingSetString =
+                "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                "http://c<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI";
+
+        // Convert it to a BindingSet
+        final VariableOrder varOrder = new VariableOrder("y", "z", "x");
+        final BindingSetConverter<String> converter = new BindingSetStringConverter();
+        final BindingSet bindingSet = converter.convert(bindingSetString, varOrder);
+
+        // Ensure it converted to the expected result.
+        final MapBindingSet expected = new MapBindingSet();
+        expected.addBinding("x", new URIImpl("http://a"));
+        expected.addBinding("y", new URIImpl("http://b"));
+        expected.addBinding("z", new URIImpl("http://c"));
+
+        assertEquals(expected, bindingSet);
+    }
+
+    /**
+     * Ensures that when a binding set is converted from a String back to a
+     * BindingSet, null values do not get converted into Bindings.
+     */
+    @Test
+    public void fromString_nullValues() throws BindingSetConversionException {
+        // Setup the String that will be converted.
+        final String bindingSetString =
+                "http://value 1<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                BindingSetStringConverter.NULL_VALUE_STRING + ":::" +
+                "http://value 2<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                BindingSetStringConverter.NULL_VALUE_STRING;
+
+        // Convert it to a BindingSet
+        final VariableOrder varOrder = new VariableOrder("x", "a", "y", "b");
+        final BindingSetConverter<String> converter = new BindingSetStringConverter();
+        final BindingSet bindingSet = converter.convert(bindingSetString, varOrder);
+
+        // Ensure it converted to the expected reuslt.
+        final MapBindingSet expected = new MapBindingSet();
+        expected.addBinding("x", new URIImpl("http://value 1"));
+        expected.addBinding("y", new URIImpl("http://value 2"));
+
+        assertEquals(expected, bindingSet);
+    }
+
+    @Test
+    public void fromString_Decimal() throws BindingSetConversionException {
+        // Setup the String that will be converted.
+        final String bindingSetString = "2.5<<~>>http://www.w3.org/2001/XMLSchema#decimal";
+
+        // Convert it to a BindingSet
+        final BindingSetConverter<String> converter = new BindingSetStringConverter();
+        final BindingSet bindingSet = converter.convert(bindingSetString, new VariableOrder("x"));
+
+        // Ensure it converted to the expected result.
+        final MapBindingSet expected = new MapBindingSet();
+        expected.addBinding("x", new DecimalLiteralImpl(new BigDecimal(2.5)));
+
+        assertEquals(expected, bindingSet);
+    }
+
+    @Test
+    public void fromString_Boolean() throws BindingSetConversionException {
+        // Setup the String that will be converted.
+        final String bindingSetString = "true<<~>>http://www.w3.org/2001/XMLSchema#boolean";
+
+        // Convert it to a BindingSet
+        final BindingSetConverter<String> converter = new BindingSetStringConverter();
+        final BindingSet bindingSet = converter.convert(bindingSetString, new VariableOrder("x"));
+
+        // Ensure it converted to the expected result.
+        final MapBindingSet expected = new MapBindingSet();
+        expected.addBinding("x", new BooleanLiteralImpl(true));
+
+        assertEquals(expected, bindingSet);
+    }
+
+    @Test
+    public void fromString_Integer() throws BindingSetConversionException {
+        // Setup the String that will be converted.
+        final String bindingSetString = "5<<~>>http://www.w3.org/2001/XMLSchema#integer";
+
+        // Convert it to a BindingSet
+        final BindingSetConverter<String> converter = new BindingSetStringConverter();
+        final BindingSet bindingSet = converter.convert(bindingSetString, new VariableOrder("x"));
+
+        // Ensure it converted to the expected result.
+        final MapBindingSet expected = new MapBindingSet();
+        expected.addBinding("x", new IntegerLiteralImpl(BigInteger.valueOf(5)));
+
+        assertEquals(expected, bindingSet);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void fromString_varOrderTooShort() throws BindingSetConversionException {
+        // Setup the String that will be converted.
+        final String bindingSetString =
+                "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI";
+
+        // This variable order is too short.
+        final VariableOrder varOrder = new VariableOrder("x");
+
+        // The conversion should throw an exception.
+        final BindingSetConverter<String> converter = new BindingSetStringConverter();
+        converter.convert(bindingSetString, varOrder);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void fromString_varOrderTooLong() throws BindingSetConversionException {
+        // Setup the String that will be converted.
+        final String bindingSetString =
+                "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI";
+
+        // This variable order is too long.
+        final VariableOrder varOrder = new VariableOrder("x", "y", "z");
+
+        // The conversion should throw an exception.
+        final BindingSetConverter<String> converter = new BindingSetStringConverter();
+        converter.convert(bindingSetString, varOrder);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesIntegrationTests.java
----------------------------------------------------------------------
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesIntegrationTests.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesIntegrationTests.java
new file mode 100644
index 0000000..5d6fa54
--- /dev/null
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesIntegrationTests.java
@@ -0,0 +1,546 @@
+package org.apache.rya.indexing.pcj.storage.accumulo;
+
+/*
+ * 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 static com.google.common.base.Preconditions.checkNotNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.apache.accumulo.core.client.AccumuloException;
+import org.apache.accumulo.core.client.AccumuloSecurityException;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.Instance;
+import org.apache.accumulo.core.client.Scanner;
+import org.apache.accumulo.core.client.TableNotFoundException;
+import org.apache.accumulo.core.client.ZooKeeperInstance;
+import org.apache.accumulo.core.client.security.tokens.PasswordToken;
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Value;
+import org.apache.accumulo.core.security.Authorizations;
+import org.apache.accumulo.minicluster.MiniAccumuloCluster;
+import org.apache.hadoop.io.Text;
+import org.apache.log4j.Logger;
+import org.apache.rya.indexing.pcj.storage.PcjException;
+import org.apache.rya.indexing.pcj.storage.PcjMetadata;
+import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage.PCJStorageException;
+import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.openrdf.model.Statement;
+import org.openrdf.model.impl.LiteralImpl;
+import org.openrdf.model.impl.NumericLiteralImpl;
+import org.openrdf.model.impl.StatementImpl;
+import org.openrdf.model.impl.URIImpl;
+import org.openrdf.model.vocabulary.XMLSchema;
+import org.openrdf.query.BindingSet;
+import org.openrdf.query.impl.MapBindingSet;
+import org.openrdf.repository.RepositoryConnection;
+import org.openrdf.repository.RepositoryException;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Sets;
+import com.google.common.io.Files;
+
+import mvm.rya.accumulo.AccumuloRdfConfiguration;
+import mvm.rya.accumulo.AccumuloRyaDAO;
+import mvm.rya.api.RdfCloudTripleStoreConfiguration;
+import mvm.rya.rdftriplestore.RdfCloudTripleStore;
+import mvm.rya.rdftriplestore.RyaSailRepository;
+
+/**
+ * Performs integration test using {@link MiniAccumuloCluster} to ensure the
+ * functions of {@link PcjTables} work within a cluster setting.
+ */
+public class PcjTablesIntegrationTests {
+    private static final Logger log = Logger.getLogger(PcjTablesIntegrationTests.class);
+
+    private static final String USE_MOCK_INSTANCE = ".useMockInstance";
+    private static final String CLOUDBASE_INSTANCE = "sc.cloudbase.instancename";
+    private static final String CLOUDBASE_USER = "sc.cloudbase.username";
+    private static final String CLOUDBASE_PASSWORD = "sc.cloudbase.password";
+
+    private static final AccumuloPcjSerializer converter = new AccumuloPcjSerializer();
+
+    protected static final String RYA_TABLE_PREFIX = "demo_";
+
+    // Rya data store and connections.
+    protected MiniAccumuloCluster accumulo = null;
+    protected static Connector accumuloConn = null;
+    protected RyaSailRepository ryaRepo = null;
+    protected RepositoryConnection ryaConn = null;
+
+    @Before
+    public void setupMiniResources() throws IOException, InterruptedException, AccumuloException, AccumuloSecurityException, RepositoryException {
+        // Initialize the Mini Accumulo that will be used to store Triples and get a connection to it.
+        accumulo = startMiniAccumulo();
+
+        // Setup the Rya library to use the Mini Accumulo.
+        ryaRepo = setupRya(accumulo);
+        ryaConn = ryaRepo.getConnection();
+    }
+
+    /**
+     * Ensure that when a new PCJ table is created, it is initialized with the
+     * correct metadata values.
+     * <p>
+     * The method being tested is {@link PcjTables#createPcjTable(Connector, String, Set, String)}
+     */
+    @Test
+    public void createPcjTable() throws PcjException {
+        final String sparql =
+                "SELECT ?name ?age " +
+                "{" +
+                  "FILTER(?age < 30) ." +
+                  "?name <http://hasAge> ?age." +
+                  "?name <http://playsSport> \"Soccer\" " +
+                "}";
+
+        // Create a PCJ table in the Mini Accumulo.
+        final String pcjTableName = new PcjTableNameFactory().makeTableName(RYA_TABLE_PREFIX, "testPcj");
+        final Set<VariableOrder> varOrders = new ShiftVarOrderFactory().makeVarOrders(new VariableOrder("name;age"));
+        final PcjTables pcjs = new PcjTables();
+        pcjs.createPcjTable(accumuloConn, pcjTableName, varOrders, sparql);
+
+        // Fetch the PcjMetadata and ensure it has the correct values.
+        final PcjMetadata pcjMetadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName);
+
+        // Ensure the metadata matches the expected value.
+        final PcjMetadata expected = new PcjMetadata(sparql, 0L, varOrders);
+        assertEquals(expected, pcjMetadata);
+    }
+
+    /**
+     * Ensure when results have been written to the PCJ table that they are in Accumulo.
+     * <p>
+     * The method being tested is {@link PcjTables#addResults(Connector, String, java.util.Collection)}
+     */
+    @Test
+    public void addResults() throws PcjException, TableNotFoundException, BindingSetConversionException {
+        final String sparql =
+                "SELECT ?name ?age " +
+                "{" +
+                  "FILTER(?age < 30) ." +
+                  "?name <http://hasAge> ?age." +
+                  "?name <http://playsSport> \"Soccer\" " +
+                "}";
+
+        // Create a PCJ table in the Mini Accumulo.
+        final String pcjTableName = new PcjTableNameFactory().makeTableName(RYA_TABLE_PREFIX, "testPcj");
+        final Set<VariableOrder> varOrders = new ShiftVarOrderFactory().makeVarOrders(new VariableOrder("name;age"));
+        final PcjTables pcjs = new PcjTables();
+        pcjs.createPcjTable(accumuloConn, pcjTableName, varOrders, sparql);
+
+        // Add a few results to the PCJ table.
+        final MapBindingSet alice = new MapBindingSet();
+        alice.addBinding("name", new URIImpl("http://Alice"));
+        alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+
+        final MapBindingSet bob = new MapBindingSet();
+        bob.addBinding("name", new URIImpl("http://Bob"));
+        bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+
+        final MapBindingSet charlie = new MapBindingSet();
+        charlie.addBinding("name", new URIImpl("http://Charlie"));
+        charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+
+        final Set<BindingSet> results = Sets.<BindingSet>newHashSet(alice, bob, charlie);
+        pcjs.addResults(accumuloConn, pcjTableName, Sets.<VisibilityBindingSet>newHashSet(
+                new VisibilityBindingSet(alice),
+                new VisibilityBindingSet(bob),
+                new VisibilityBindingSet(charlie)));
+
+        // Make sure the cardinality was updated.
+        final PcjMetadata metadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName);
+        assertEquals(3, metadata.getCardinality());
+
+        // Scan Accumulo for the stored results.
+        final Multimap<String, BindingSet> fetchedResults = loadPcjResults(accumuloConn, pcjTableName);
+
+        // Ensure the expected results match those that were stored.
+        final Multimap<String, BindingSet> expectedResults = HashMultimap.create();
+        expectedResults.putAll("name;age", results);
+        expectedResults.putAll("age;name", results);
+        assertEquals(expectedResults, fetchedResults);
+    }
+
+    /**
+     * Ensure when results are already stored in Rya, that we are able to populate
+     * the PCJ table for a new SPARQL query using those results.
+     * <p>
+     * The method being tested is: {@link PcjTables#populatePcj(Connector, String, RepositoryConnection, String)}
+     */
+    @Test
+    public void populatePcj() throws RepositoryException, PcjException, TableNotFoundException, BindingSetConversionException {
+        // Load some Triples into Rya.
+        final Set<Statement> triples = new HashSet<>();
+        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
+        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
+        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
+        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
+        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+
+        for(final Statement triple : triples) {
+            ryaConn.add(triple);
+        }
+
+        // Create a PCJ table that will include those triples in its results.
+        final String sparql =
+                "SELECT ?name ?age " +
+                "{" +
+                  "FILTER(?age < 30) ." +
+                  "?name <http://hasAge> ?age." +
+                  "?name <http://playsSport> \"Soccer\" " +
+                "}";
+
+        final String pcjTableName = new PcjTableNameFactory().makeTableName(RYA_TABLE_PREFIX, "testPcj");
+        final Set<VariableOrder> varOrders = new ShiftVarOrderFactory().makeVarOrders(new VariableOrder("name;age"));
+        final PcjTables pcjs = new PcjTables();
+        pcjs.createPcjTable(accumuloConn, pcjTableName, varOrders, sparql);
+
+        // Populate the PCJ table using a Rya connection.
+        pcjs.populatePcj(accumuloConn, pcjTableName, ryaConn);
+
+        // Scan Accumulo for the stored results.
+        final Multimap<String, BindingSet> fetchedResults = loadPcjResults(accumuloConn, pcjTableName);
+
+        // Make sure the cardinality was updated.
+        final PcjMetadata metadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName);
+        assertEquals(3, metadata.getCardinality());
+
+        // Ensure the expected results match those that were stored.
+        final MapBindingSet alice = new MapBindingSet();
+        alice.addBinding("name", new URIImpl("http://Alice"));
+        alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+
+        final MapBindingSet bob = new MapBindingSet();
+        bob.addBinding("name", new URIImpl("http://Bob"));
+        bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+
+        final MapBindingSet charlie = new MapBindingSet();
+        charlie.addBinding("name", new URIImpl("http://Charlie"));
+        charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+
+        final Set<BindingSet> results = Sets.<BindingSet>newHashSet(alice, bob, charlie);
+
+        final Multimap<String, BindingSet> expectedResults = HashMultimap.create();
+        expectedResults.putAll("name;age", results);
+        expectedResults.putAll("age;name", results);
+        assertEquals(expectedResults, fetchedResults);
+    }
+
+    /**
+     * Ensure the method that creates a new PCJ table, scans Rya for matches, and
+     * stores them in the PCJ table works.
+     * <p>
+     * The method being tested is: {@link PcjTables#createAndPopulatePcj(RepositoryConnection, Connector, String, String, String[], Optional)}
+     */
+    @Test
+    public void createAndPopulatePcj() throws RepositoryException, PcjException, TableNotFoundException, BindingSetConversionException {
+        // Load some Triples into Rya.
+        final Set<Statement> triples = new HashSet<>();
+        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
+        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
+        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
+        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
+        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+
+        for(final Statement triple : triples) {
+            ryaConn.add(triple);
+        }
+
+        // Create a PCJ table that will include those triples in its results.
+        final String sparql =
+                "SELECT ?name ?age " +
+                "{" +
+                  "FILTER(?age < 30) ." +
+                  "?name <http://hasAge> ?age." +
+                  "?name <http://playsSport> \"Soccer\" " +
+                "}";
+
+        final String pcjTableName = new PcjTableNameFactory().makeTableName(RYA_TABLE_PREFIX, "testPcj");
+
+        // Create and populate the PCJ table.
+        final PcjTables pcjs = new PcjTables();
+        pcjs.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent());
+
+        // Make sure the cardinality was updated.
+        final PcjMetadata metadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName);
+        assertEquals(3, metadata.getCardinality());
+
+        // Scan Accumulo for the stored results.
+        final Multimap<String, BindingSet> fetchedResults = loadPcjResults(accumuloConn, pcjTableName);
+
+        // Ensure the expected results match those that were stored.
+        final MapBindingSet alice = new MapBindingSet();
+        alice.addBinding("name", new URIImpl("http://Alice"));
+        alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+
+        final MapBindingSet bob = new MapBindingSet();
+        bob.addBinding("name", new URIImpl("http://Bob"));
+        bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+
+        final MapBindingSet charlie = new MapBindingSet();
+        charlie.addBinding("name", new URIImpl("http://Charlie"));
+        charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+
+        final Set<BindingSet> results = Sets.<BindingSet>newHashSet(alice, bob, charlie);
+
+        final Multimap<String, BindingSet> expectedResults = HashMultimap.create();
+        expectedResults.putAll("name;age", results);
+        expectedResults.putAll("age;name", results);
+
+        assertEquals(expectedResults, fetchedResults);
+    }
+
+    @Test
+    public void listPcjs() throws PCJStorageException {
+        // Set up the table names that will be used.
+        final String instance1 = "instance1_";
+        final String instance2 = "instance2_";
+
+        final String instance1_table1 = new PcjTableNameFactory().makeTableName(instance1, "table1");
+        final String instance1_table2 = new PcjTableNameFactory().makeTableName(instance1, "table2");
+        final String instance1_table3 = new PcjTableNameFactory().makeTableName(instance1, "table3");
+
+        final String instance2_table1 = new PcjTableNameFactory().makeTableName(instance2, "table1");
+
+        // Create the PCJ Tables that are in instance 1 and instance 2.
+        final Set<VariableOrder> varOrders = Sets.<VariableOrder>newHashSet( new VariableOrder("x") );
+        final String sparql = "SELECT x WHERE ?x <http://isA> <http://Food>";
+
+        final PcjTables pcjs = new PcjTables();
+        pcjs.createPcjTable(accumuloConn, instance1_table1, varOrders, sparql);
+        pcjs.createPcjTable(accumuloConn, instance1_table2, varOrders, sparql);
+        pcjs.createPcjTable(accumuloConn, instance1_table3, varOrders, sparql);
+
+        pcjs.createPcjTable(accumuloConn, instance2_table1, varOrders, sparql);
+
+        // Ensure all of the names have been stored for instance 1 and 2.
+        final Set<String> expected1 = Sets.newHashSet(instance1_table1, instance1_table2, instance1_table3);
+        final Set<String> instance1Tables = Sets.newHashSet( pcjs.listPcjTables(accumuloConn, instance1) );
+        assertEquals(expected1, instance1Tables);
+
+        final Set<String> expected2 = Sets.newHashSet(instance2_table1);
+        final Set<String> instance2Tables = Sets.newHashSet( pcjs.listPcjTables(accumuloConn, instance2) );
+        assertEquals(expected2, instance2Tables);
+    }
+
+    @Test
+    public void purge() throws PCJStorageException {
+        final String sparql =
+                "SELECT ?name ?age " +
+                "{" +
+                  "FILTER(?age < 30) ." +
+                  "?name <http://hasAge> ?age." +
+                  "?name <http://playsSport> \"Soccer\" " +
+                "}";
+
+        // Create a PCJ table in the Mini Accumulo.
+        final String pcjTableName = new PcjTableNameFactory().makeTableName(RYA_TABLE_PREFIX, "testPcj");
+        final Set<VariableOrder> varOrders = new ShiftVarOrderFactory().makeVarOrders(new VariableOrder("name;age"));
+        final PcjTables pcjs = new PcjTables();
+        pcjs.createPcjTable(accumuloConn, pcjTableName, varOrders, sparql);
+
+        // Add a few results to the PCJ table.
+        final MapBindingSet alice = new MapBindingSet();
+        alice.addBinding("name", new URIImpl("http://Alice"));
+        alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+
+        final MapBindingSet bob = new MapBindingSet();
+        bob.addBinding("name", new URIImpl("http://Bob"));
+        bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+
+        final MapBindingSet charlie = new MapBindingSet();
+        charlie.addBinding("name", new URIImpl("http://Charlie"));
+        charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+
+        pcjs.addResults(accumuloConn, pcjTableName, Sets.<VisibilityBindingSet>newHashSet(
+                new VisibilityBindingSet(alice),
+                new VisibilityBindingSet(bob),
+                new VisibilityBindingSet(charlie)));
+
+        // Make sure the cardinality was updated.
+        PcjMetadata metadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName);
+        assertEquals(3, metadata.getCardinality());
+
+        // Purge the data.
+        pcjs.purgePcjTable(accumuloConn, pcjTableName);
+
+        // Make sure the cardinality was updated to 0.
+        metadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName);
+        assertEquals(0, metadata.getCardinality());
+    }
+
+    @Test
+    public void dropPcj() throws PCJStorageException {
+        // Create a PCJ index.
+        final String tableName = new PcjTableNameFactory().makeTableName(RYA_TABLE_PREFIX, "thePcj");
+        final Set<VariableOrder> varOrders = Sets.<VariableOrder>newHashSet( new VariableOrder("x") );
+        final String sparql = "SELECT x WHERE ?x <http://isA> <http://Food>";
+
+        final PcjTables pcjs = new PcjTables();
+        pcjs.createPcjTable(accumuloConn, tableName, varOrders, sparql);
+
+        // Fetch its metadata to show that it has actually been created.
+        final PcjMetadata expectedMetadata = new PcjMetadata(sparql, 0L, varOrders);
+        PcjMetadata metadata = pcjs.getPcjMetadata(accumuloConn, tableName);
+        assertEquals(expectedMetadata, metadata);
+
+        // Drop it.
+        pcjs.dropPcjTable(accumuloConn, tableName);
+
+        // Show the metadata is no longer present.
+        PCJStorageException tableDoesNotExistException = null;
+        try {
+            metadata = pcjs.getPcjMetadata(accumuloConn, tableName);
+        } catch(final PCJStorageException e) {
+            tableDoesNotExistException = e;
+        }
+        assertNotNull(tableDoesNotExistException);
+    }
+
+    /**
+     * Scan accumulo for the results that are stored in a PCJ table. The
+     * multimap stores a set of deserialized binding sets that were in the PCJ
+     * table for every variable order that is found in the PCJ metadata.
+     */
+    private static Multimap<String, BindingSet> loadPcjResults(final Connector accumuloConn, final String pcjTableName) throws PcjException, TableNotFoundException, BindingSetConversionException {
+        final Multimap<String, BindingSet> fetchedResults = HashMultimap.create();
+
+        // Get the variable orders the data was written to.
+        final PcjTables pcjs = new PcjTables();
+        final PcjMetadata pcjMetadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName);
+
+        // Scan Accumulo for the stored results.
+        for(final VariableOrder varOrder : pcjMetadata.getVarOrders()) {
+            final Scanner scanner = accumuloConn.createScanner(pcjTableName, new Authorizations());
+            scanner.fetchColumnFamily( new Text(varOrder.toString()) );
+
+            for(final Entry<Key, Value> entry : scanner) {
+                final byte[] serializedResult = entry.getKey().getRow().getBytes();
+                final BindingSet result = converter.convert(serializedResult, varOrder);
+                fetchedResults.put(varOrder.toString(), result);
+            }
+        }
+
+        return fetchedResults;
+    }
+
+    @After
+    public void shutdownMiniResources() {
+        if(ryaConn != null) {
+            try {
+                log.info("Shutting down Rya Connection.");
+                ryaConn.close();
+                log.info("Rya Connection shut down.");
+            } catch(final Exception e) {
+                log.error("Could not shut down the Rya Connection.", e);
+            }
+        }
+
+        if(ryaRepo != null) {
+            try {
+                log.info("Shutting down Rya Repo.");
+                ryaRepo.shutDown();
+                log.info("Rya Repo shut down.");
+            } catch(final Exception e) {
+                log.error("Could not shut down the Rya Repo.", e);
+            }
+        }
+
+        if(accumulo != null) {
+            try {
+                log.info("Shutting down the Mini Accumulo being used as a Rya store.");
+                accumulo.stop();
+                log.info("Mini Accumulo being used as a Rya store shut down.");
+            } catch(final Exception e) {
+                log.error("Could not shut down the Mini Accumulo.", e);
+            }
+        }
+    }
+
+    /**
+     * Setup a Mini Accumulo cluster that uses a temporary directory to store its data.
+     *
+     * @return A Mini Accumulo cluster.
+     */
+    private static MiniAccumuloCluster startMiniAccumulo() throws IOException, InterruptedException, AccumuloException, AccumuloSecurityException {
+        final File miniDataDir = Files.createTempDir();
+
+        // Setup and start the Mini Accumulo.
+        final MiniAccumuloCluster accumulo = new MiniAccumuloCluster(miniDataDir, "password");
+        accumulo.start();
+
+        // Store a connector to the Mini Accumulo.
+        final Instance instance = new ZooKeeperInstance(accumulo.getInstanceName(), accumulo.getZooKeepers());
+        accumuloConn = instance.getConnector("root", new PasswordToken("password"));
+
+        return accumulo;
+    }
+
+    /**
+     * Format a Mini Accumulo to be a Rya repository.
+     *
+     * @param accumulo - The Mini Accumulo cluster Rya will sit on top of. (not null)
+     * @return The Rya repository sitting on top of the Mini Accumulo.
+     */
+    private static RyaSailRepository setupRya(final MiniAccumuloCluster accumulo) throws AccumuloException, AccumuloSecurityException, RepositoryException {
+        checkNotNull(accumulo);
+
+        // Setup the Rya Repository that will be used to create Repository Connections.
+        final RdfCloudTripleStore ryaStore = new RdfCloudTripleStore();
+        final AccumuloRyaDAO crdfdao = new AccumuloRyaDAO();
+        crdfdao.setConnector(accumuloConn);
+
+        // Setup Rya configuration values.
+        final AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
+        conf.setTablePrefix("demo_");
+        conf.setDisplayQueryPlan(true);
+
+        conf.setBoolean(USE_MOCK_INSTANCE, true);
+        conf.set(RdfCloudTripleStoreConfiguration.CONF_TBL_PREFIX, RYA_TABLE_PREFIX);
+        conf.set(CLOUDBASE_USER, "root");
+        conf.set(CLOUDBASE_PASSWORD, "password");
+        conf.set(CLOUDBASE_INSTANCE, accumulo.getInstanceName());
+
+        crdfdao.setConf(conf);
+        ryaStore.setRyaDAO(crdfdao);
+
+        final RyaSailRepository ryaRepo = new RyaSailRepository(ryaStore);
+        ryaRepo.initialize();
+
+        return ryaRepo;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesTests.java
----------------------------------------------------------------------
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesTests.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesTests.java
new file mode 100644
index 0000000..e16aab9
--- /dev/null
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesTests.java
@@ -0,0 +1,84 @@
+package org.apache.rya.indexing.pcj.storage.accumulo;
+
+/*
+ * 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 static org.junit.Assert.assertEquals;
+
+import java.util.Set;
+
+import org.apache.rya.indexing.pcj.storage.PcjMetadata;
+import org.apache.rya.indexing.pcj.storage.accumulo.PcjTables;
+import org.apache.rya.indexing.pcj.storage.accumulo.ShiftVarOrderFactory;
+import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.junit.Test;
+
+import com.google.common.collect.Sets;
+
+/**
+ * Tests the classes and methods of {@link PcjTables}.
+ */
+public class PcjTablesTests {
+
+    @Test
+    public void variableOrder_hashCode() {
+        assertEquals(new VariableOrder("a", "b", "C").hashCode(), new VariableOrder("a", "b", "C").hashCode());
+    }
+
+    @Test
+    public void variableOrder_equals() {
+        assertEquals(new VariableOrder("a", "b", "C"), new VariableOrder("a", "b", "C"));
+    }
+
+    @Test
+    public void variableOrder_fromString() {
+        assertEquals(new VariableOrder("a", "b", "c"), new VariableOrder("a;b;c"));
+    }
+
+    @Test
+    public void variableORder_toString() {
+        assertEquals("a;b;c", new VariableOrder("a", "b", "c").toString());
+    }
+
+    @Test
+    public void pcjMetadata_hashCode() {
+        PcjMetadata meta1 = new PcjMetadata("A SPARQL string.", 5, Sets.newHashSet(new VariableOrder("a", "b", "c"), new VariableOrder("d", "e", "f")));
+        PcjMetadata meta2 = new PcjMetadata("A SPARQL string.", 5, Sets.newHashSet(new VariableOrder("a", "b", "c"), new VariableOrder("d", "e", "f")));
+        assertEquals(meta1.hashCode(), meta2.hashCode());
+    }
+
+    @Test
+    public void pcjMetadata_equals() {
+        PcjMetadata meta1 = new PcjMetadata("A SPARQL string.", 5, Sets.newHashSet(new VariableOrder("a", "b", "c"), new VariableOrder("d", "e", "f")));
+        PcjMetadata meta2 = new PcjMetadata("A SPARQL string.", 5, Sets.newHashSet(new VariableOrder("a", "b", "c"), new VariableOrder("d", "e", "f")));
+        assertEquals(meta1, meta2);
+    }
+
+    @Test
+    public void shiftVarOrdersFactory() {
+        Set<VariableOrder> expected = Sets.newHashSet(
+                new VariableOrder("a;b;c"),
+                new VariableOrder("b;c;a"),
+                new VariableOrder("c;a;b"));
+
+        Set<VariableOrder> varOrders = new ShiftVarOrderFactory().makeVarOrders(new VariableOrder("a;b;c"));
+        assertEquals(expected, varOrders);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetStringConverterTest.java
----------------------------------------------------------------------
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetStringConverterTest.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetStringConverterTest.java
new file mode 100644
index 0000000..9adb8f2
--- /dev/null
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetStringConverterTest.java
@@ -0,0 +1,133 @@
+/*
+ * 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 org.apache.rya.indexing.pcj.storage.accumulo;
+
+import static org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetStringConverter.VISIBILITY_DELIM;
+import static org.junit.Assert.assertEquals;
+
+import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
+import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetStringConverter;
+import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSet;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetStringConverter;
+import org.junit.Test;
+import org.openrdf.model.impl.URIImpl;
+import org.openrdf.query.BindingSet;
+import org.openrdf.query.impl.MapBindingSet;
+
+/**
+ * Tests the methods of {@link BindingSetStringConverter}.
+ */
+public class VisibilityBindingSetStringConverterTest {
+    @Test
+    public void toString_URIs() throws BindingSetConversionException {
+        // Setup the binding set that will be converted.
+        final MapBindingSet originalBindingSet = new MapBindingSet();
+        originalBindingSet.addBinding("x", new URIImpl("http://a"));
+        originalBindingSet.addBinding("y", new URIImpl("http://b"));
+        originalBindingSet.addBinding("z", new URIImpl("http://c"));
+
+        final VisibilityBindingSet visiSet = new VisibilityBindingSet(originalBindingSet, "A&B&C");
+
+        // Convert it to a String.
+        final VariableOrder varOrder = new VariableOrder("y", "z", "x");
+        final VisibilityBindingSetStringConverter converter = new VisibilityBindingSetStringConverter();
+        final String bindingSetString = converter.convert(visiSet, varOrder);
+
+        // Ensure it converted to the expected result.l
+        final String expected =
+                "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                "http://c<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI" +
+                VISIBILITY_DELIM + "A&B&C";
+
+        assertEquals(expected, bindingSetString);
+    }
+
+    @Test
+    public void fromString() throws BindingSetConversionException {
+        // Setup the String that will be converted.
+        final String bindingSetString =
+                "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                "http://c<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI" +
+                VISIBILITY_DELIM + "A&B";
+
+        // Convert it to a BindingSet
+        final VariableOrder varOrder = new VariableOrder("y", "z", "x");
+        final VisibilityBindingSetStringConverter converter = new VisibilityBindingSetStringConverter();
+        final BindingSet bindingSet = converter.convert(bindingSetString, varOrder);
+
+        // Ensure it converted to the expected result.
+        final MapBindingSet expected = new MapBindingSet();
+        expected.addBinding("z", new URIImpl("http://c"));
+        expected.addBinding("y", new URIImpl("http://b"));
+        expected.addBinding("x", new URIImpl("http://a"));
+        final VisibilityBindingSet visiSet = new VisibilityBindingSet(expected, "A&B");
+
+        assertEquals(visiSet, bindingSet);
+    }
+
+    @Test
+    public void toString_URIs_noVisi() throws BindingSetConversionException {
+        // Setup the binding set that will be converted.
+        final MapBindingSet originalBindingSet = new MapBindingSet();
+        originalBindingSet.addBinding("x", new URIImpl("http://a"));
+        originalBindingSet.addBinding("y", new URIImpl("http://b"));
+        originalBindingSet.addBinding("z", new URIImpl("http://c"));
+
+        final VisibilityBindingSet visiSet = new VisibilityBindingSet(originalBindingSet);
+
+        // Convert it to a String.
+        final VariableOrder varOrder = new VariableOrder("y", "z", "x");
+        final VisibilityBindingSetStringConverter converter = new VisibilityBindingSetStringConverter();
+        final String bindingSetString = converter.convert(visiSet, varOrder);
+
+        // Ensure it converted to the expected result.l
+        final String expected =
+                "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                "http://c<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI";
+
+        assertEquals(expected, bindingSetString);
+    }
+
+    @Test
+    public void fromString_noVisi() throws BindingSetConversionException {
+        // Setup the String that will be converted.
+        final String bindingSetString =
+                "http://b<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                "http://c<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
+                "http://a<<~>>http://www.w3.org/2001/XMLSchema#anyURI";
+
+        // Convert it to a BindingSet
+        final VariableOrder varOrder = new VariableOrder("y", "z", "x");
+        final VisibilityBindingSetStringConverter converter = new VisibilityBindingSetStringConverter();
+        final BindingSet bindingSet = converter.convert(bindingSetString, varOrder);
+
+        // Ensure it converted to the expected result.
+        final MapBindingSet expected = new MapBindingSet();
+        expected.addBinding("z", new URIImpl("http://c"));
+        expected.addBinding("y", new URIImpl("http://b"));
+        expected.addBinding("x", new URIImpl("http://a"));
+        final VisibilityBindingSet visiSet = new VisibilityBindingSet(expected);
+
+        assertEquals(visiSet, bindingSet);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.api/pom.xml
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.api/pom.xml b/extras/rya.pcj.fluo/pcj.fluo.api/pom.xml
index 292121d..7b88b5a 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.api/pom.xml
+++ b/extras/rya.pcj.fluo/pcj.fluo.api/pom.xml
@@ -44,5 +44,9 @@ under the License.
             <groupId>org.apache.rya</groupId>
             <artifactId>rya.pcj.fluo.app</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.rya</groupId>
+            <artifactId>rya.sail</artifactId>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreatePcj.java
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreatePcj.java b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreatePcj.java
index 58e2f9a..0a4885c 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreatePcj.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreatePcj.java
@@ -36,6 +36,12 @@ import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryMetadataDAO;
 import org.apache.rya.indexing.pcj.fluo.app.query.SparqlFluoQueryBuilder;
 import org.apache.rya.indexing.pcj.fluo.app.query.SparqlFluoQueryBuilder.NodeIds;
 import org.apache.rya.indexing.pcj.fluo.app.query.StatementPatternMetadata;
+import org.apache.rya.indexing.pcj.storage.PcjException;
+import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetStringConverter;
+import org.apache.rya.indexing.pcj.storage.accumulo.PcjTableNameFactory;
+import org.apache.rya.indexing.pcj.storage.accumulo.PcjTables;
+import org.apache.rya.indexing.pcj.storage.accumulo.ShiftVarOrderFactory;
+import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
 import org.openrdf.query.Binding;
 import org.openrdf.query.BindingSet;
 import org.openrdf.query.MalformedQueryException;
@@ -50,12 +56,6 @@ import org.openrdf.sail.SailException;
 import info.aduna.iteration.CloseableIteration;
 import io.fluo.api.client.FluoClient;
 import io.fluo.api.types.TypedTransaction;
-import mvm.rya.indexing.external.tupleSet.BindingSetStringConverter;
-import mvm.rya.indexing.external.tupleSet.PcjTables;
-import mvm.rya.indexing.external.tupleSet.PcjTables.PcjException;
-import mvm.rya.indexing.external.tupleSet.PcjTables.PcjTableNameFactory;
-import mvm.rya.indexing.external.tupleSet.PcjTables.ShiftVarOrderFactory;
-import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder;
 import mvm.rya.rdftriplestore.RyaSailRepository;
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/GetPcjMetadata.java
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/GetPcjMetadata.java b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/GetPcjMetadata.java
index 88c7930..e904afa 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/GetPcjMetadata.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/GetPcjMetadata.java
@@ -27,13 +27,13 @@ import java.util.Map;
 import org.apache.accumulo.core.client.Connector;
 import org.apache.rya.indexing.pcj.fluo.app.StringTypeLayer;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
+import org.apache.rya.indexing.pcj.storage.PcjException;
+import org.apache.rya.indexing.pcj.storage.PcjMetadata;
+import org.apache.rya.indexing.pcj.storage.accumulo.PcjTables;
 
 import io.fluo.api.client.FluoClient;
 import io.fluo.api.data.Bytes;
 import io.fluo.api.types.TypedSnapshot;
-import mvm.rya.indexing.external.tupleSet.PcjTables;
-import mvm.rya.indexing.external.tupleSet.PcjTables.PcjException;
-import mvm.rya.indexing.external.tupleSet.PcjTables.PcjMetadata;
 
 /**
  * Get {@link PcjMetadata} for queries that are managed by the Fluo app.

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.app/pom.xml
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/pom.xml b/extras/rya.pcj.fluo/pcj.fluo.app/pom.xml
index b591e07..54001b1 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/pom.xml
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/pom.xml
@@ -41,13 +41,7 @@ under the License.
         <!-- Rya Runtime Dependencies. -->
         <dependency>
             <groupId>org.apache.rya</groupId>
-            <artifactId>rya.indexing</artifactId>
-            <exclusions>
-                <exclusion>
-                    <artifactId>slf4j-log4j12</artifactId>
-                    <groupId>org.slf4j</groupId>
-                </exclusion>
-            </exclusions>
+            <artifactId>rya.indexing.pcj</artifactId>
         </dependency>
     
         <!-- 3rd Party Runtime Dependencies. -->

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FilterResultUpdater.java
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FilterResultUpdater.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FilterResultUpdater.java
index fc88a3c..8583eb5 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FilterResultUpdater.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FilterResultUpdater.java
@@ -25,6 +25,10 @@ import javax.annotation.ParametersAreNonnullByDefault;
 
 import org.apache.rya.indexing.pcj.fluo.app.query.FilterMetadata;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
+import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetStringConverter;
+import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSet;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetStringConverter;
 import org.openrdf.model.Resource;
 import org.openrdf.model.Statement;
 import org.openrdf.model.URI;
@@ -50,10 +54,6 @@ import io.fluo.api.data.Bytes;
 import io.fluo.api.data.Column;
 import io.fluo.api.types.Encoder;
 import io.fluo.api.types.StringEncoder;
-import mvm.rya.indexing.accumulo.VisibilityBindingSet;
-import mvm.rya.indexing.external.tupleSet.BindingSetStringConverter;
-import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder;
-import mvm.rya.indexing.external.tupleSet.VisibilityBindingSetStringConverter;
 
 /**
  * Updates the results of a Filter node when its child has added a new Binding

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/JoinResultUpdater.java
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/JoinResultUpdater.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/JoinResultUpdater.java
index 700d0fb..8439360 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/JoinResultUpdater.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/JoinResultUpdater.java
@@ -33,6 +33,11 @@ import javax.annotation.ParametersAreNonnullByDefault;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryMetadataDAO;
 import org.apache.rya.indexing.pcj.fluo.app.query.JoinMetadata;
+import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
+import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetStringConverter;
+import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSet;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetStringConverter;
 import org.openrdf.query.Binding;
 import org.openrdf.query.BindingSet;
 import org.openrdf.query.impl.MapBindingSet;
@@ -51,11 +56,6 @@ import io.fluo.api.iterator.ColumnIterator;
 import io.fluo.api.iterator.RowIterator;
 import io.fluo.api.types.Encoder;
 import io.fluo.api.types.StringEncoder;
-import mvm.rya.indexing.accumulo.VisibilityBindingSet;
-import mvm.rya.indexing.external.tupleSet.BindingSetConverter.BindingSetConversionException;
-import mvm.rya.indexing.external.tupleSet.BindingSetStringConverter;
-import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder;
-import mvm.rya.indexing.external.tupleSet.VisibilityBindingSetStringConverter;
 
 /**
  * Updates the results of a Join node when one of its children has added a

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/QueryResultUpdater.java
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/QueryResultUpdater.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/QueryResultUpdater.java
index 8e0a6fe..0c57985 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/QueryResultUpdater.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/QueryResultUpdater.java
@@ -25,6 +25,10 @@ import javax.annotation.ParametersAreNonnullByDefault;
 
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
 import org.apache.rya.indexing.pcj.fluo.app.query.QueryMetadata;
+import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetStringConverter;
+import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSet;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetStringConverter;
 import org.openrdf.query.Binding;
 import org.openrdf.query.impl.MapBindingSet;
 
@@ -33,10 +37,6 @@ import io.fluo.api.data.Bytes;
 import io.fluo.api.data.Column;
 import io.fluo.api.types.Encoder;
 import io.fluo.api.types.StringEncoder;
-import mvm.rya.indexing.accumulo.VisibilityBindingSet;
-import mvm.rya.indexing.external.tupleSet.BindingSetStringConverter;
-import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder;
-import mvm.rya.indexing.external.tupleSet.VisibilityBindingSetStringConverter;
 
 /**
  * Updates the results of a Query node when one of its children has added a

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/IncrementalResultExporter.java
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/IncrementalResultExporter.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/IncrementalResultExporter.java
index c2c031c..d93bae2 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/IncrementalResultExporter.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/IncrementalResultExporter.java
@@ -20,8 +20,9 @@ package org.apache.rya.indexing.pcj.fluo.app.export;
 
 import javax.annotation.ParametersAreNonnullByDefault;
 
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSet;
+
 import io.fluo.api.types.TypedTransactionBase;
-import mvm.rya.indexing.accumulo.VisibilityBindingSet;
 
 /**
  * Exports a single Binding Set that is a new result for a SPARQL query to some

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/rya/RyaResultExporter.java
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/rya/RyaResultExporter.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/rya/RyaResultExporter.java
index 5c8c719..f9af15c 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/rya/RyaResultExporter.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/rya/RyaResultExporter.java
@@ -25,12 +25,12 @@ import java.util.Collections;
 import org.apache.accumulo.core.client.Connector;
 import org.apache.rya.indexing.pcj.fluo.app.export.IncrementalResultExporter;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
+import org.apache.rya.indexing.pcj.storage.PcjException;
+import org.apache.rya.indexing.pcj.storage.accumulo.PcjTables;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSet;
 
 import io.fluo.api.data.Bytes;
 import io.fluo.api.types.TypedTransactionBase;
-import mvm.rya.indexing.accumulo.VisibilityBindingSet;
-import mvm.rya.indexing.external.tupleSet.PcjTables;
-import mvm.rya.indexing.external.tupleSet.PcjTables.PcjException;
 
 /**
  * Incrementally exports SPARQL query results to Accumulo PCJ tables as they are defined by Rya.

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/rya/RyaResultExporterFactory.java
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/rya/RyaResultExporterFactory.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/rya/RyaResultExporterFactory.java
index fd63314..6550f66 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/rya/RyaResultExporterFactory.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/rya/RyaResultExporterFactory.java
@@ -28,11 +28,11 @@ import org.apache.accumulo.core.client.ZooKeeperInstance;
 import org.apache.accumulo.core.client.security.tokens.PasswordToken;
 import org.apache.rya.indexing.pcj.fluo.app.export.IncrementalResultExporter;
 import org.apache.rya.indexing.pcj.fluo.app.export.IncrementalResultExporterFactory;
+import org.apache.rya.indexing.pcj.storage.accumulo.PcjTables;
 
 import com.google.common.base.Optional;
 
 import io.fluo.api.observer.Observer.Context;
-import mvm.rya.indexing.external.tupleSet.PcjTables;
 
 /**
  * Creates instances of {@link RyaResultExporter}.

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/BindingSetUpdater.java
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/BindingSetUpdater.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/BindingSetUpdater.java
index 9bd0148..06fca0a 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/BindingSetUpdater.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/BindingSetUpdater.java
@@ -31,6 +31,8 @@ import org.apache.rya.indexing.pcj.fluo.app.query.FilterMetadata;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryMetadataDAO;
 import org.apache.rya.indexing.pcj.fluo.app.query.JoinMetadata;
 import org.apache.rya.indexing.pcj.fluo.app.query.QueryMetadata;
+import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSet;
 
 import io.fluo.api.client.TransactionBase;
 import io.fluo.api.data.Bytes;
@@ -39,8 +41,6 @@ import io.fluo.api.types.Encoder;
 import io.fluo.api.types.StringEncoder;
 import io.fluo.api.types.TypedObserver;
 import io.fluo.api.types.TypedTransactionBase;
-import mvm.rya.indexing.accumulo.VisibilityBindingSet;
-import mvm.rya.indexing.external.tupleSet.BindingSetConverter.BindingSetConversionException;
 
 /**
  * Notified when the results of a node have been updated to include a new Binding

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/FilterObserver.java
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/FilterObserver.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/FilterObserver.java
index fb15934..ea1f3a0 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/FilterObserver.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/FilterObserver.java
@@ -24,12 +24,12 @@ import org.apache.rya.indexing.pcj.fluo.app.BindingSetRow;
 import org.apache.rya.indexing.pcj.fluo.app.query.FilterMetadata;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryMetadataDAO;
+import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSet;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetStringConverter;
 import org.openrdf.query.BindingSet;
 
 import io.fluo.api.client.TransactionBase;
-import mvm.rya.indexing.accumulo.VisibilityBindingSet;
-import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder;
-import mvm.rya.indexing.external.tupleSet.VisibilityBindingSetStringConverter;
 
 /**
  * Notified when the results of a Filter have been updated to include a new

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/JoinObserver.java
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/JoinObserver.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/JoinObserver.java
index a8cd0df..dbde885 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/JoinObserver.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/JoinObserver.java
@@ -24,12 +24,12 @@ import org.apache.rya.indexing.pcj.fluo.app.BindingSetRow;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryMetadataDAO;
 import org.apache.rya.indexing.pcj.fluo.app.query.JoinMetadata;
+import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSet;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetStringConverter;
 import org.openrdf.query.BindingSet;
 
 import io.fluo.api.client.TransactionBase;
-import mvm.rya.indexing.accumulo.VisibilityBindingSet;
-import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder;
-import mvm.rya.indexing.external.tupleSet.VisibilityBindingSetStringConverter;
 
 /**
  * Notified when the results of a Join have been updated to include a new

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/QueryResultObserver.java
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/QueryResultObserver.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/QueryResultObserver.java
index fe4dc56..bc9da29 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/QueryResultObserver.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/QueryResultObserver.java
@@ -29,6 +29,9 @@ import org.apache.rya.indexing.pcj.fluo.app.export.rya.RyaResultExporterFactory;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryMetadataDAO;
 import org.apache.rya.indexing.pcj.fluo.app.query.QueryMetadata;
+import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSet;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetStringConverter;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableSet;
@@ -39,9 +42,6 @@ import io.fluo.api.types.Encoder;
 import io.fluo.api.types.StringEncoder;
 import io.fluo.api.types.TypedObserver;
 import io.fluo.api.types.TypedTransactionBase;
-import mvm.rya.indexing.accumulo.VisibilityBindingSet;
-import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder;
-import mvm.rya.indexing.external.tupleSet.VisibilityBindingSetStringConverter;
 
 /**
  * Performs incremental result exporting to the configured destinations.

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/StatementPatternObserver.java
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/StatementPatternObserver.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/StatementPatternObserver.java
index 7b1e510..4694371 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/StatementPatternObserver.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/StatementPatternObserver.java
@@ -24,12 +24,12 @@ import org.apache.rya.indexing.pcj.fluo.app.BindingSetRow;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryMetadataDAO;
 import org.apache.rya.indexing.pcj.fluo.app.query.StatementPatternMetadata;
+import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSet;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetStringConverter;
 import org.openrdf.query.BindingSet;
 
 import io.fluo.api.client.TransactionBase;
-import mvm.rya.indexing.accumulo.VisibilityBindingSet;
-import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder;
-import mvm.rya.indexing.external.tupleSet.VisibilityBindingSetStringConverter;
 
 /**
  * Notified when the results of a Statement Pattern have been updated to include

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/TripleObserver.java
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/TripleObserver.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/TripleObserver.java
index 496c0ed..4feb752 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/TripleObserver.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/TripleObserver.java
@@ -31,6 +31,9 @@ import org.apache.rya.indexing.pcj.fluo.app.StringTypeLayer;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryMetadataDAO;
 import org.apache.rya.indexing.pcj.fluo.app.query.StatementPatternMetadata;
+import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSet;
+import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetStringConverter;
 
 import com.google.common.collect.Maps;
 
@@ -44,9 +47,6 @@ import io.fluo.api.types.Encoder;
 import io.fluo.api.types.StringEncoder;
 import io.fluo.api.types.TypedObserver;
 import io.fluo.api.types.TypedTransactionBase;
-import mvm.rya.indexing.accumulo.VisibilityBindingSet;
-import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder;
-import mvm.rya.indexing.external.tupleSet.VisibilityBindingSetStringConverter;
 
 /**
  * An observer that matches new Triples to the Statement Patterns that are part

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/14073a23/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/CommonNodeMetadata.java
----------------------------------------------------------------------
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/CommonNodeMetadata.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/CommonNodeMetadata.java
index b559037..aeace2c 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/CommonNodeMetadata.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/CommonNodeMetadata.java
@@ -24,11 +24,10 @@ import javax.annotation.ParametersAreNonnullByDefault;
 import javax.annotation.concurrent.Immutable;
 
 import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
 
 import com.google.common.base.Objects;
 
-import mvm.rya.indexing.external.tupleSet.PcjTables.VariableOrder;
-
 /**
  * Metadata that is common to all nodes that are part of a query.
  */