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/10/28 20:24:04 UTC

[10/51] [partial] incubator-rya git commit: now including the actual project

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/osgi/sesame-runtime-osgi/pom.xml
----------------------------------------------------------------------
diff --git a/osgi/sesame-runtime-osgi/pom.xml b/osgi/sesame-runtime-osgi/pom.xml
new file mode 100644
index 0000000..db1a4bb
--- /dev/null
+++ b/osgi/sesame-runtime-osgi/pom.xml
@@ -0,0 +1,116 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+		<groupId>mvm.rya</groupId>
+    	<artifactId>rya.osgi</artifactId>
+    	<version>3.0.4-SNAPSHOT</version>
+	</parent>
+    <artifactId>sesame-runtime-osgi</artifactId>
+    <version>2.6.4</version>
+    <packaging>pom</packaging>
+    <name>${project.groupId}.${project.artifactId}</name>
+    <dependencies>
+        <dependency>
+            <groupId>org.openrdf.sesame</groupId>
+            <artifactId>sesame-runtime-osgi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>biz.aQute</groupId>
+            <artifactId>bnd</artifactId>
+            <version>0.0.397</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>org.openrdf.sesame</groupId>
+                                    <artifactId>sesame-runtime-osgi</artifactId>
+                                    <version>${project.version}</version>
+                                    <outputDirectory>${project.build.directory}</outputDirectory>
+                                    <destFileName>sesame-runtime-osgi.jar</destFileName>
+                                </artifactItem>
+                                <artifactItem>
+                                    <groupId>biz.aQute</groupId>
+                                    <artifactId>bnd</artifactId>
+                                    <version>0.0.397</version>
+                                    <outputDirectory>${project.build.directory}</outputDirectory>
+                                    <destFileName>bnd.jar</destFileName>
+                                </artifactItem>
+                            </artifactItems>
+                            <!-- other configurations here -->
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>exec-maven-plugin</artifactId>
+                <version>1.1</version>
+                <executions>
+                    <execution>
+                        <phase>process-resources</phase>
+                        <goals>
+                            <goal>exec</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <executable>java</executable>
+                    <arguments>
+                        <argument>-jar</argument>
+                        <argument>target/bnd.jar</argument>
+                        <argument>build</argument>
+                        <argument>openrdf-sesame-osgi.bnd</argument>
+                    </arguments>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin
+                </artifactId>
+                <version>1.7</version>
+                <executions>
+                    <execution>
+                        <id>attach-artifacts</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>attach-artifact</goal>
+                        </goals>
+                        <configuration>
+                            <artifacts>
+                                <artifact>
+                                    <file>${project.build.directory}/sesame-runtime-osgi-${project.version}.jar</file>
+                                </artifact>
+                            </artifacts>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+    <repositories>
+        <repository>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <id>bndrepo</id>
+            <name>aQute BND Repo</name>
+            <url>http://www.aqute.biz/repo</url>
+        </repository>
+    </repositories>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/partition/common-query-ext/pom.xml
----------------------------------------------------------------------
diff --git a/partition/common-query-ext/pom.xml b/partition/common-query-ext/pom.xml
new file mode 100644
index 0000000..4fb0aee
--- /dev/null
+++ b/partition/common-query-ext/pom.xml
@@ -0,0 +1,71 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!--<parent>-->
+    <!--<groupId>sitestore</groupId>-->
+    <!--<artifactId>sitestore</artifactId>-->
+    <!--<version>2.0.0-SNAPSHOT</version>-->
+    <!--</parent>-->
+
+    <parent>
+        <groupId>mvm.rya</groupId>
+        <artifactId>parent</artifactId>
+        <version>2.0.0-SNAPSHOT</version>
+    </parent>
+
+    <groupId>sitestore.common</groupId>
+    <artifactId>common-query-ext</artifactId>
+    <name>common-query (${project.version})</name>
+    <version>1.0.0-SNAPSHOT</version>
+    <description>A set of filters and iterators for cloudbase queries</description>
+
+    <properties>
+        <skipTests>true</skipTests>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.1.2</version>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <phase>install</phase>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.7.2</version>
+                <configuration>
+                    <skipTests>${skipTests}</skipTests>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <!--<scm>-->
+    <!--<connection>${scmLocation}/tto/ss/common/trunk/common-query</connection>-->
+    <!--</scm>-->
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>sitestore.common</groupId>
+            <artifactId>common-query</artifactId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>cloudbase</groupId>
+            <artifactId>cloudbase-core</artifactId>
+        </dependency>
+    </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/partition/common-query-ext/src/main/java/ss/cloudbase/core/iterators/ext/EncodedSortedRangeIterator.java
----------------------------------------------------------------------
diff --git a/partition/common-query-ext/src/main/java/ss/cloudbase/core/iterators/ext/EncodedSortedRangeIterator.java b/partition/common-query-ext/src/main/java/ss/cloudbase/core/iterators/ext/EncodedSortedRangeIterator.java
new file mode 100644
index 0000000..fb59102
--- /dev/null
+++ b/partition/common-query-ext/src/main/java/ss/cloudbase/core/iterators/ext/EncodedSortedRangeIterator.java
@@ -0,0 +1,44 @@
+package ss.cloudbase.core.iterators.ext;
+
+import cloudbase.core.data.Key;
+import cloudbase.core.data.Value;
+import cloudbase.core.iterators.IteratorEnvironment;
+import cloudbase.core.iterators.SortedKeyValueIterator;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.hadoop.io.Text;
+import ss.cloudbase.core.iterators.SortedRangeIterator;
+
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ * Class EncodedSortedRangeIterator
+ * Date: Aug 10, 2011
+ * Time: 10:37:28 AM
+ */
+public class EncodedSortedRangeIterator extends SortedRangeIterator {
+
+    @Override
+    public void init(SortedKeyValueIterator<Key, Value> source, Map<String, String> options, IteratorEnvironment env) throws IOException {
+        super.init(source, options, env);
+        if (options.containsKey(OPTION_LOWER_BOUND)) {
+            lower = new Text(decode(options.get(OPTION_LOWER_BOUND)));
+        } else {
+            lower = new Text("\u0000");
+        }
+
+        if (options.containsKey(OPTION_UPPER_BOUND)) {
+            upper = new Text(decode(options.get(OPTION_UPPER_BOUND)));
+        } else {
+            upper = new Text("\u0000");
+        }
+    }
+
+    public static String encode(String str) {
+        return new String(Base64.encodeBase64(str.getBytes()));
+    }
+
+    public static String decode(String str) {
+        return new String(Base64.decodeBase64(str.getBytes()));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/partition/common-query-ext/src/test/java/GVDateFilterTest.java
----------------------------------------------------------------------
diff --git a/partition/common-query-ext/src/test/java/GVDateFilterTest.java b/partition/common-query-ext/src/test/java/GVDateFilterTest.java
new file mode 100644
index 0000000..8ea5578
--- /dev/null
+++ b/partition/common-query-ext/src/test/java/GVDateFilterTest.java
@@ -0,0 +1,156 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.Map.Entry;
+
+import org.apache.hadoop.io.Text;
+import org.junit.Test;
+
+import ss.cloudbase.core.iterators.GMDenIntersectingIterator;
+import ss.cloudbase.core.iterators.filter.general.GVDateFilter;
+
+import cloudbase.core.client.Connector;
+import cloudbase.core.client.Scanner;
+import cloudbase.core.client.TableNotFoundException;
+import cloudbase.core.data.Key;
+import cloudbase.core.data.Range;
+import cloudbase.core.data.Value;
+import cloudbase.core.iterators.FilteringIterator;
+import cloudbase.core.security.Authorizations;
+
+/**
+ *
+ * @author rashah
+ */
+public class GVDateFilterTest
+{
+
+  private Connector cellLevelConn;
+  private Connector serializedConn;
+  private static final String TABLE = "partition";
+  private static final Authorizations AUTHS = new Authorizations("ALPHA,BETA,GAMMA".split(","));
+
+
+
+  protected Connector getSerializedConnector()
+  {
+    if (serializedConn == null)
+    {
+      serializedConn = SampleGVData.initConnector();
+      SampleGVData.writeDenSerialized(serializedConn, SampleGVData.sampleData());
+    }
+    return serializedConn;
+  }
+
+
+
+  protected Scanner getSerializedScanner()
+  {
+    Connector c = getSerializedConnector();
+    try
+    {
+      return c.createScanner(TABLE, AUTHS);
+    }
+    catch (TableNotFoundException e)
+    {
+      return null;
+    }
+  }
+
+  protected Scanner setUpGVDFFilter(Scanner s, String timesta)
+  {
+    try
+    {
+  
+      s.setScanIterators(50, FilteringIterator.class.getName(), "gvdf");
+      s.setScanIteratorOption("gvdf", "0", GVDateFilter.class.getName());
+      s.setScanIteratorOption("gvdf", "0." + GVDateFilter.OPTIONInTimestamp, timesta);
+
+    }
+    catch (IOException e)
+    {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+    }
+    return s;
+  }
+
+  protected String checkSerialized(Scanner s)
+  {
+    StringBuilder sb = new StringBuilder();
+    boolean first = true;
+    for (Entry<Key, Value> e : s)
+    {
+
+      if (!first)
+      {
+        sb.append(",");
+      }
+      else
+      {
+        first = false;
+      }
+
+      String colq = e.getKey().getColumnQualifier().toString();
+
+      sb.append(colq);
+    }
+    return sb.toString();
+  }
+
+
+  @Test
+  public void testNoResults()
+  {
+
+    Scanner s = setUpGVDFFilter(getSerializedScanner(), "2008-03-03T20:44:28.633Z");
+    s.setRange(new Range());
+
+    assertTrue(checkSerialized(s).equals(""));
+  }
+
+
+  @Test
+  public void testOneResult()
+  {
+
+    Scanner s = setUpGVDFFilter(getSerializedScanner(), "2011-03-03T20:44:28.633Z");
+    s.setRange(new Range());
+
+    System.out.println(checkSerialized(s));
+
+    assertTrue(checkSerialized(s).equals("03"));
+  }
+
+  @Test
+  public void testTwoResults()
+  {
+
+    Scanner s = setUpGVDFFilter(getSerializedScanner(), "2009-03-03T20:44:28.633Z");
+    s.setRange(new Range());
+
+    assertTrue(checkSerialized(s).equals("04,01"));
+  }
+
+    @Test
+  public void testThreeResults()
+  {
+
+    Scanner s = setUpGVDFFilter(getSerializedScanner(), "2010-03-01T20:44:28.633Z");
+    s.setRange(new Range());
+
+    assertTrue(checkSerialized(s).equals("04,01,03"));
+  }
+
+  @Test
+  public void testDummyTest()
+  {
+    assertTrue(true);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/partition/common-query-ext/src/test/java/GVFrequencyFilterTest.java
----------------------------------------------------------------------
diff --git a/partition/common-query-ext/src/test/java/GVFrequencyFilterTest.java b/partition/common-query-ext/src/test/java/GVFrequencyFilterTest.java
new file mode 100644
index 0000000..25c602a
--- /dev/null
+++ b/partition/common-query-ext/src/test/java/GVFrequencyFilterTest.java
@@ -0,0 +1,144 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.Map.Entry;
+
+import org.apache.hadoop.io.Text;
+import org.junit.Test;
+
+import ss.cloudbase.core.iterators.GMDenIntersectingIterator;
+import ss.cloudbase.core.iterators.filter.general.GVFrequencyFilter;
+
+import cloudbase.core.client.Connector;
+import cloudbase.core.client.Scanner;
+import cloudbase.core.client.TableNotFoundException;
+import cloudbase.core.data.Key;
+import cloudbase.core.data.Range;
+import cloudbase.core.data.Value;
+import cloudbase.core.iterators.FilteringIterator;
+import cloudbase.core.security.Authorizations;
+
+/**
+ *
+ * @author rashah
+ */
+public class GVFrequencyFilterTest
+{
+
+  private Connector cellLevelConn;
+  private Connector serializedConn;
+  private static final String TABLE = "partition";
+  private static final Authorizations AUTHS = new Authorizations("ALPHA,BETA,GAMMA".split(","));
+
+
+
+  protected Connector getSerializedConnector()
+  {
+    if (serializedConn == null)
+    {
+      serializedConn = SampleGVData.initConnector();
+      SampleGVData.writeDenSerialized(serializedConn, SampleGVData.sampleData());
+    }
+    return serializedConn;
+  }
+
+
+
+  protected Scanner getSerializedScanner()
+  {
+    Connector c = getSerializedConnector();
+    try
+    {
+      return c.createScanner(TABLE, AUTHS);
+    }
+    catch (TableNotFoundException e)
+    {
+      return null;
+    }
+  }
+
+  protected Scanner setUpGVDFFilter(Scanner s, String Frequency)
+  {
+    try
+    {
+      s.clearScanIterators();
+  
+      s.setScanIterators(50, FilteringIterator.class.getName(), "gvff");
+      s.setScanIteratorOption("gvff", "0", GVFrequencyFilter.class.getName());
+      s.setScanIteratorOption("gvff", "0." + GVFrequencyFilter.OPTIONFrequency, Frequency);
+
+    }
+    catch (IOException e)
+    {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+    }
+    return s;
+  }
+
+  protected String checkSerialized(Scanner s)
+  {
+    StringBuilder sb = new StringBuilder();
+    boolean first = true;
+    for (Entry<Key, Value> e : s)
+    {
+
+      if (!first)
+      {
+        sb.append(",");
+      }
+      else
+      {
+        first = false;
+      }
+
+      String colq = e.getKey().getColumnQualifier().toString();
+
+      //System.out.println(e.getKey()+"\t"+e.getValue());
+
+      sb.append(colq);
+    }
+    return sb.toString();
+  }
+
+  @Test
+  public void testNoMatch()
+  {
+
+    Scanner s = setUpGVDFFilter(getSerializedScanner(), "2000000000");
+    s.setRange(new Range());
+
+    assertTrue(checkSerialized(s).isEmpty());
+  }
+
+  @Test
+  public void testSingleMatch()
+  {
+    Scanner s = setUpGVDFFilter(getSerializedScanner(), "1500000000");
+    s.setRange(new Range());
+
+    assertTrue(checkSerialized(s).equals("01"));
+  }
+
+
+  @Test
+  public void testDoubleMatch()
+  {
+    Scanner s = setUpGVDFFilter(getSerializedScanner(), "1200000000");
+    s.setRange(new Range());
+
+    assertTrue(checkSerialized(s).equals("01,03"));
+  }
+
+  @Test
+  public void testDummyTest()
+  {
+    assertTrue(true);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/partition/common-query-ext/src/test/java/IteratorTest.java
----------------------------------------------------------------------
diff --git a/partition/common-query-ext/src/test/java/IteratorTest.java b/partition/common-query-ext/src/test/java/IteratorTest.java
new file mode 100644
index 0000000..1b5cf14
--- /dev/null
+++ b/partition/common-query-ext/src/test/java/IteratorTest.java
@@ -0,0 +1,554 @@
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.hadoop.io.Text;
+import org.junit.Test;
+
+import ss.cloudbase.core.iterators.CellLevelFilteringIterator;
+import ss.cloudbase.core.iterators.CellLevelRecordIterator;
+import ss.cloudbase.core.iterators.ConversionIterator;
+import ss.cloudbase.core.iterators.GMDenIntersectingIterator;
+import ss.cloudbase.core.iterators.SortedMinIterator;
+import ss.cloudbase.core.iterators.SortedRangeIterator;
+import ss.cloudbase.core.iterators.UniqueIterator;
+import ss.cloudbase.core.iterators.filter.CBConverter;
+import cloudbase.core.client.Connector;
+import cloudbase.core.client.Scanner;
+import cloudbase.core.client.TableNotFoundException;
+import cloudbase.core.data.Key;
+import cloudbase.core.data.PartialKey;
+import cloudbase.core.data.Range;
+import cloudbase.core.data.Value;
+import cloudbase.core.security.Authorizations;
+
+public class IteratorTest {
+	private Connector cellLevelConn;
+	private Connector serializedConn;
+	
+	private static final String TABLE = "partition";
+	private static final Authorizations AUTHS = new Authorizations("ALPHA,BETA,GAMMA".split(","));
+	
+	public IteratorTest() {
+		
+	}
+	
+	protected Connector getCellLevelConnector() {
+		if (cellLevelConn == null) {
+			cellLevelConn = SampleData.initConnector();
+			SampleData.writeDenCellLevel(cellLevelConn, SampleData.sampleData());
+		}
+		return cellLevelConn;
+	}
+	
+	protected Connector getSerializedConnector() {
+		if (serializedConn == null) {
+			serializedConn = SampleData.initConnector();
+			SampleData.writeDenSerialized(serializedConn, SampleData.sampleData());
+			SampleData.writeDenProvenance(serializedConn);
+			SampleData.writeMinIndexes(serializedConn);
+		}
+		return serializedConn;
+	}
+	
+	protected Scanner getProvenanceScanner() {
+		Connector c = getSerializedConnector();
+		try {
+			return c.createScanner("provenance", AUTHS);
+		} catch (TableNotFoundException e) {
+			return null;
+		}
+	}
+	
+	protected Scanner getCellLevelScanner() {
+		Connector c = getCellLevelConnector();
+		try {
+			return c.createScanner(TABLE, AUTHS);
+		} catch (TableNotFoundException e) {
+			return null;
+		}
+	}
+	
+	protected Scanner getSerializedScanner() {
+		Connector c = getSerializedConnector();
+		try {
+			return c.createScanner(TABLE, AUTHS);
+		} catch (TableNotFoundException e) {
+			return null;
+		}
+	}
+	
+	protected Scanner setUpIntersectingIterator(Scanner s, Text[] terms, boolean multiDoc) {
+		try {
+			s.setScanIterators(50, GMDenIntersectingIterator.class.getName(), "ii");
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		s.setScanIteratorOption("ii", GMDenIntersectingIterator.indexFamilyOptionName, "index");
+		s.setScanIteratorOption("ii", GMDenIntersectingIterator.docFamilyOptionName, "event");
+		s.setScanIteratorOption("ii", GMDenIntersectingIterator.OPTION_MULTI_DOC, "" + multiDoc);
+		s.setScanIteratorOption("ii", GMDenIntersectingIterator.columnFamiliesOptionName, GMDenIntersectingIterator.encodeColumns(terms));
+		return s;
+	}
+	
+	protected String checkSerialized(Scanner s) {
+		StringBuilder sb = new StringBuilder();
+		boolean first = true;
+		for (Entry<Key, Value> e: s) {
+			if (!first) {
+				sb.append(",");
+			} else {
+				first = false;
+			}
+			
+			String colq = e.getKey().getColumnQualifier().toString();
+			
+			sb.append(colq);
+		}
+		return sb.toString();
+	}
+	
+	protected String checkCellLevel(Scanner s) {
+		StringBuilder sb = new StringBuilder();
+		boolean first = true;
+		for (Entry<Key, Value> e: s) {
+			String colq = e.getKey().getColumnQualifier().toString();
+			int i = colq.indexOf("\u0000");
+			if (i > -1) {
+				if (!first) {
+					sb.append(",");
+				} else {
+					first = false;
+				}
+				sb.append(colq.substring(0, i));
+				sb.append(".");
+				sb.append(colq.substring(i + 1));
+				sb.append("=");
+				sb.append(e.getValue().toString());
+			}
+		}
+		return sb.toString();
+	}
+	
+	@Test
+	public void testSerializedSingleDuplicate() {
+		Text[] terms = new Text[] {
+			new Text("A"),
+			new Text("A")
+		};
+		
+		String test = "01";
+		Scanner s = setUpIntersectingIterator(getSerializedScanner(), terms, false);
+		s.setRange(new Range());
+		assertTrue(test.equals(checkSerialized(s)));
+	}
+	
+	@Test
+	public void testCellLevelSingleDuplicate() {
+		Text[] terms = new Text[] {
+			new Text("A"),
+			new Text("A")
+		};
+		String test = "01.field0=A,01.field1=B,01.field2=C,01.field3=D,01.field4=E";
+		Scanner s = setUpIntersectingIterator(getCellLevelScanner(), terms, true);
+		s.setRange(new Range());
+		assertTrue(test.equals(checkCellLevel(s)));
+	}
+	
+	@Test
+	public void testSerializedTwoTerms() {
+		Text[] terms = new Text[] {
+			new Text("C"),
+			new Text("D")
+		};
+		// all the evens will come first
+		String test = "02,01,03";
+		Scanner s = setUpIntersectingIterator(getSerializedScanner(), terms, false);
+		s.setRange(new Range());
+		assertTrue(test.equals(checkSerialized(s)));
+	}
+	
+	@Test
+	public void testCellLevelTwoTerms() {
+		Text[] terms = new Text[] {
+			new Text("C"),
+			new Text("D")
+		};
+		
+		String test = "02.field0=B,02.field1=C,02.field2=D,02.field3=E,02.field4=F,"
+			+ "01.field0=A,01.field1=B,01.field2=C,01.field3=D,01.field4=E,"
+			+ "03.field0=C,03.field1=D,03.field2=E,03.field3=F,03.field4=G";
+		Scanner s = setUpIntersectingIterator(getCellLevelScanner(), terms, true);
+		s.setRange(new Range());
+		assertTrue(test.equals(checkCellLevel(s)));
+	}
+	
+	@Test
+	public void testSerializedTwoTermsWithRange() {
+		Text[] terms = new Text[] {
+			new Text("C"),
+			new Text("D")
+		};
+		
+		String test = "02";
+		Scanner s = setUpIntersectingIterator(getSerializedScanner(), terms, false);
+		s.setRange(new Range(new Key(new Text("0")), true, new Key(new Text("1")), false));
+		assertTrue(test.equals(checkSerialized(s)));
+	}
+	
+	@Test
+	public void testCellLevelTwoTermsWithRange() {
+		Text[] terms = new Text[] {
+			new Text("C"),
+			new Text("D")
+		};
+		
+		String test = "02.field0=B,02.field1=C,02.field2=D,02.field3=E,02.field4=F";
+		Scanner s = setUpIntersectingIterator(getCellLevelScanner(), terms, true);
+		s.setRange(new Range(new Key(new Text("0")), true, new Key(new Text("1")), false));
+		assertTrue(test.equals(checkCellLevel(s)));
+	}
+	
+	@Test
+	public void testSerializedSingleRange() {
+		Text[] terms = new Text[] {
+			new Text(GMDenIntersectingIterator.getRangeTerm("index", "A", true, "B", true)),
+			new Text(GMDenIntersectingIterator.getRangeTerm("index", "A", true, "B", true))
+		};
+		
+		String test = "02,01";
+		Scanner s = setUpIntersectingIterator(getSerializedScanner(), terms, false);
+		s.setRange(new Range());
+		assertTrue(test.equals(checkSerialized(s)));
+	}
+	
+	@Test
+	public void testSerializedMultiRange() {
+		Text[] terms = new Text[] {
+			new Text(GMDenIntersectingIterator.getRangeTerm("index", "A", true, "B", true)),
+			new Text(GMDenIntersectingIterator.getRangeTerm("index", "B", true, "C", true))
+		};
+		
+		String test = "02,01";
+		Scanner s = setUpIntersectingIterator(getSerializedScanner(), terms, false);
+		s.setRange(new Range());
+		assertTrue(test.equals(checkSerialized(s)));
+	}
+	
+	@Test
+	public void testSerializedTermAndRange() {
+		Text[] terms = new Text[] {
+			new Text("B"),
+			new Text(GMDenIntersectingIterator.getRangeTerm("index", "A", true, "E", true))
+		};
+		
+		String test = "02,01";
+		Scanner s = setUpIntersectingIterator(getSerializedScanner(), terms, false);
+		s.setRange(new Range());
+		assertTrue(test.equals(checkSerialized(s)));
+	}
+	
+	protected Scanner setUpSortedRangeIterator(Scanner s, boolean multiDoc) {
+		try {
+			s.setScanIterators(50, SortedRangeIterator.class.getName(), "ri");
+			s.setScanIteratorOption("ri", SortedRangeIterator.OPTION_COLF, "index");
+			s.setScanIteratorOption("ri", SortedRangeIterator.OPTION_DOC_COLF, "event");
+			s.setScanIteratorOption("ri", SortedRangeIterator.OPTION_LOWER_BOUND, "A");
+			s.setScanIteratorOption("ri", SortedRangeIterator.OPTION_UPPER_BOUND, "C");
+			s.setScanIteratorOption("ri", SortedRangeIterator.OPTION_START_INCLUSIVE, "true");
+			s.setScanIteratorOption("ri", SortedRangeIterator.OPTION_END_INCLUSIVE, "true");
+			s.setScanIteratorOption("ri", SortedRangeIterator.OPTION_MULTI_DOC, "" + multiDoc);
+			return s;
+		} catch (IOException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+	
+	@Test
+	public void testSerializedSortedRangeIterator() {
+		Scanner s = setUpSortedRangeIterator(getSerializedScanner(), false);
+		String test = "02,01,03";
+		s.setRange(new Range());
+		assertTrue(test.equals(checkSerialized(s)));
+	}
+	
+	@Test
+	public void testCellLevelSortedRangeIterator() {
+		Scanner s = setUpSortedRangeIterator(getCellLevelScanner(), true);
+		String test = "02.field0=B,02.field1=C,02.field2=D,02.field3=E,02.field4=F,"
+			+ "01.field0=A,01.field1=B,01.field2=C,01.field3=D,01.field4=E,"
+			+ "03.field0=C,03.field1=D,03.field2=E,03.field3=F,03.field4=G";
+		s.setRange(new Range());
+		assertTrue(test.equals(checkCellLevel(s)));
+	}
+	
+	@Test
+	public void testUniqueIterator() {
+		Scanner s = getProvenanceScanner();
+		try {
+			s.setScanIterators(50, UniqueIterator.class.getName(), "skipper");
+			Key start = new Key(new Text("sid1"));
+			s.setRange(new Range(start, start.followingKey(PartialKey.ROW)));
+			
+			int count = 0;
+			for (Entry<Key, Value> e: s) {
+				count++;
+			}
+			
+			assertEquals(count, 3);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	protected Scanner setUpConversionIterator(Scanner s) {
+		String[] conversions = new String[] {
+			"field0 + 10",
+			"field1 - 10",
+			"field2 * 10",
+			"field3 / 10",
+			"field4 % 10"
+		};
+		
+		try {
+			s.setScanIterators(50, ConversionIterator.class.getName(), "ci");
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		s.setScanIteratorOption("ci", ConversionIterator.OPTION_CONVERSIONS, ConversionIterator.encodeConversions(conversions));
+		Key start = new Key(new Text("1"), new Text("event"), new Text("01"));
+		s.setRange(new Range(start, true, start.followingKey(PartialKey.ROW_COLFAM_COLQUAL), false));
+		
+		return s;
+	}
+	
+	@Test
+	public void testConversionIteratorSerialized() {
+		Scanner s = getSerializedScanner();
+		s = setUpConversionIterator(s);
+		
+		CBConverter c = new CBConverter();
+		
+		boolean test = true;
+		Map<String, Double> expected = new HashMap<String, Double>();
+		
+		expected.put("field0", 20.0);
+		expected.put("field1", 1.0);
+		expected.put("field2", 120.0);
+		expected.put("field3", 1.3);
+		expected.put("field4", 4.0);
+		
+		Map<String, String> record;
+		
+		for (Entry<Key, Value> e: s) {
+			record = c.toMap(e.getKey(), e.getValue());
+			
+			for (Entry<String, String> pair: record.entrySet()) {
+				test = test && expected.get(pair.getKey()).equals(new Double(Double.parseDouble(record.get(pair.getKey()))));
+			}
+		}
+		
+		assertTrue(test);
+	}
+	
+	@Test
+	public void testConversionIteratorCellLevel() {
+		Scanner s = getCellLevelScanner();
+		s = setUpConversionIterator(s);
+		s.setScanIteratorOption("ci", ConversionIterator.OPTION_MULTI_DOC, "true");
+		
+		boolean test = true;
+		Map<String, Double> expected = new HashMap<String, Double>();
+		
+		expected.put("field0", 20.0);
+		expected.put("field1", 1.0);
+		expected.put("field2", 120.0);
+		expected.put("field3", 1.3);
+		expected.put("field4", 4.0);
+		
+		for (Entry<Key, Value> e: s) {
+			String field = getField(e.getKey());
+			if (field != null) {
+				test = test && expected.get(field).equals(new Double(Double.parseDouble(e.getValue().toString())));
+			}
+		}
+		
+		assertTrue(test);
+	}
+	
+	protected String getField(Key key) {
+		String colq = key.getColumnQualifier().toString();
+		int start = colq.indexOf("\u0000");
+		if (start == -1) {
+			return null;
+		}
+		
+		int end = colq.indexOf("\u0000", start + 1);
+		if (end == -1) {
+			end = colq.length();
+		}
+		
+		return colq.substring(start + 1, end);
+	}
+	
+	@Test
+	public void testCellLevelOGCFilter() {
+		Scanner s = getCellLevelScanner();
+		s.fetchColumnFamily(new Text("event"));
+		
+		try {
+			s.setScanIterators(60, CellLevelFilteringIterator.class.getName(), "fi");
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		
+		s.setScanIteratorOption("fi", CellLevelFilteringIterator.OPTION_FILTER, "<PropertyIsBetween><PropertyName>field0</PropertyName>"
+			+ "<LowerBoundary><Literal>A</Literal></LowerBoundary>"
+			+ "<UpperBoundary><Literal>C</Literal></UpperBoundary>"
+			+ "</PropertyIsBetween>");
+		
+		String test = "02.field0=B,02.field1=C,02.field2=D,02.field3=E,02.field4=F,"
+			+ "01.field0=A,01.field1=B,01.field2=C,01.field3=D,01.field4=E,"
+			+ "03.field0=C,03.field1=D,03.field2=E,03.field3=F,03.field4=G";
+		assertTrue(test.equals(checkCellLevel(s)));
+	}
+	
+	@Test
+	public void testMultiLevelIterator() {
+		Scanner s = getCellLevelScanner();
+		Text[] terms = new Text[] {
+			new Text("C"),
+			new Text("D")
+		};
+		
+		s = setUpIntersectingIterator(s, terms, true);
+		
+		try {
+			s.setScanIterators(60, CellLevelFilteringIterator.class.getName(), "fi");
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		
+		s.setScanIteratorOption("fi", CellLevelFilteringIterator.OPTION_FILTER, "<PropertyIsEqualTo><PropertyName>field0</PropertyName>"
+			+ "<Literal>A</Literal>"
+			+ "</PropertyIsEqualTo>");
+		
+		String test = "01.field0=A,01.field1=B,01.field2=C,01.field3=D,01.field4=E";
+		assertTrue(test.equals(checkCellLevel(s)));
+	}
+	
+	@Test
+	public void testMultiLevelIterator2() {
+		Scanner s = getCellLevelScanner();
+		s = setUpSortedRangeIterator(s, true);
+		try {
+			s.setScanIterators(60, CellLevelFilteringIterator.class.getName(), "fi");
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		s.setScanIteratorOption("fi", CellLevelFilteringIterator.OPTION_FILTER, "<PropertyIsEqualTo><PropertyName>field0</PropertyName>"
+			+ "<Literal>A</Literal>"
+			+ "</PropertyIsEqualTo>");
+		
+		String test = "01.field0=A,01.field1=B,01.field2=C,01.field3=D,01.field4=E";
+		assertTrue(test.equals(checkCellLevel(s)));
+	}
+	
+	@Test
+	public void testCellLevelRecordIterator() {
+		Scanner s = getCellLevelScanner();
+		s = setUpSortedRangeIterator(s, true);
+		try {
+			s.setScanIterators(60, CellLevelRecordIterator.class.getName(), "recordItr");
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		
+//		for (Entry<Key, Value> e: s) {
+//			String v = e.getValue().toString();
+//			v = v.replaceAll("\\u0000", ",");
+//			v = v.replaceAll("\\uFFFD", "=");
+//			System.out.println(e.getKey() + "\t" + v);
+//		}
+		String test = "02,01,03";
+		assertTrue(test.equals(checkSerialized(s)));
+	}
+	
+	@Test
+	public void testIntersectionWithoutDocLookup() {
+		Text[] terms = new Text[] {
+			new Text("C"),
+			new Text("D")
+		};
+		// all the evens will come first
+		String test = "\u000002,\u000001,\u000003";
+		Scanner s = setUpIntersectingIterator(getSerializedScanner(), terms, false);
+		s.setScanIteratorOption("ii", GMDenIntersectingIterator.OPTION_DOC_LOOKUP, "false");
+		s.setRange(new Range());
+		assertTrue(test.equals(checkSerialized(s)));
+	}
+	
+	@Test
+	public void testSimpleNot() {
+		Text[] terms = new Text[] {
+			new Text("B"),
+			new Text("F")
+		};
+		
+		boolean[] nots = new boolean[] {
+			false,
+			true
+		};
+		
+		String test="01";
+		Scanner s = setUpIntersectingIterator(getSerializedScanner(), terms, false);
+		s.setScanIteratorOption("ii", GMDenIntersectingIterator.notFlagOptionName, GMDenIntersectingIterator.encodeBooleans(nots));
+		s.setRange(new Range());
+		
+		assertTrue(test.equals(checkSerialized(s)));
+	}
+	
+	@Test
+	public void testRangeNot() {
+		Text[] terms = new Text[] {
+			new Text("B"),
+			new Text(GMDenIntersectingIterator.getRangeTerm("index", "F", true, "H", true))
+		};
+		
+		boolean[] nots = new boolean[] {
+			false,
+			true
+		};
+		
+		String test = "01";
+		Scanner s = setUpIntersectingIterator(getSerializedScanner(), terms, false);
+		s.setScanIteratorOption("ii", GMDenIntersectingIterator.notFlagOptionName, GMDenIntersectingIterator.encodeBooleans(nots));
+		s.setRange(new Range());
+		
+		assertTrue(test.equals(checkSerialized(s)));
+	}
+	
+	@Test
+	public void testMinIteratorOnLastKeys() {
+		Scanner s = getSerializedScanner();
+		try {
+			s.setScanIterators(50, SortedMinIterator.class.getName(), "min");
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		s.setScanIteratorOption("min", SortedMinIterator.OPTION_PREFIX, "z");
+		s.setRange(new Range());
+		
+		String test = "02,04,06,08,10,01,03,05,07,09";
+		assertTrue(test.equals(checkSerialized(s)));
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/partition/common-query-ext/src/test/java/JTSFilterTest.java
----------------------------------------------------------------------
diff --git a/partition/common-query-ext/src/test/java/JTSFilterTest.java b/partition/common-query-ext/src/test/java/JTSFilterTest.java
new file mode 100644
index 0000000..8224f64
--- /dev/null
+++ b/partition/common-query-ext/src/test/java/JTSFilterTest.java
@@ -0,0 +1,181 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.Map.Entry;
+
+import org.apache.hadoop.io.Text;
+import org.junit.Test;
+
+import ss.cloudbase.core.iterators.GMDenIntersectingIterator;
+import ss.cloudbase.core.iterators.filter.jts.JTSFilter;
+
+import cloudbase.core.client.Connector;
+import cloudbase.core.client.Scanner;
+import cloudbase.core.client.TableNotFoundException;
+import cloudbase.core.data.Key;
+import cloudbase.core.data.Range;
+import cloudbase.core.data.Value;
+import cloudbase.core.iterators.FilteringIterator;
+import cloudbase.core.security.Authorizations;
+
+/**
+ *
+ * @author rashah
+ */
+public class JTSFilterTest
+{
+
+  private Connector cellLevelConn;
+  private Connector serializedConn;
+  private static final String TABLE = "partition";
+  private static final Authorizations AUTHS = new Authorizations("ALPHA,BETA,GAMMA".split(","));
+
+
+
+  protected Connector getSerializedConnector()
+  {
+    if (serializedConn == null)
+    {
+      serializedConn = SampleJTSData.initConnector();
+      SampleJTSData.writeDenSerialized(serializedConn, SampleJTSData.sampleData());
+    }
+    return serializedConn;
+  }
+
+
+
+  protected Scanner getSerializedScanner()
+  {
+    Connector c = getSerializedConnector();
+    try
+    {
+      return c.createScanner(TABLE, AUTHS);
+    }
+    catch (TableNotFoundException e)
+    {
+      return null;
+    }
+  }
+
+  protected Scanner setUpJTSFilter(Scanner s, String latitude, String longitude, boolean change_name)
+  {
+    try
+    {
+  
+      s.setScanIterators(50, FilteringIterator.class.getName(), "gvdf");
+      s.setScanIteratorOption("gvdf", "0", JTSFilter.class.getName());
+      s.setScanIteratorOption("gvdf", "0." + JTSFilter.OPTIONCenterPointLat, latitude);
+      s.setScanIteratorOption("gvdf", "0." + JTSFilter.OPTIONCenterPointLon, longitude);
+      if (change_name)
+          s.setScanIteratorOption("gvdf", "0." + JTSFilter.OPTIONGeometryKeyName, "beam-footprint");
+
+
+    }
+    catch (IOException e)
+    {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+    }
+    return s;
+  }
+
+  protected String checkSerialized(Scanner s)
+  {
+    StringBuilder sb = new StringBuilder();
+    boolean first = true;
+    for (Entry<Key, Value> e : s)
+    {
+
+      if (!first)
+      {
+        sb.append(",");
+      }
+      else
+      {
+        first = false;
+      }
+
+      String colq = e.getKey().getColumnQualifier().toString();
+
+      sb.append(colq);
+    }
+    return sb.toString();
+  }
+
+
+  @Test
+  public void testNoResults()
+  {
+    //London is in niether - 51°30'0.00"N   0° 7'0.00"W
+    String latitude = "51.5";
+    String longitude = "0.11";
+
+    Scanner s = setUpJTSFilter(getSerializedScanner(), latitude, longitude, false);
+    s.setRange(new Range());
+
+//    System.out.println("{" + checkSerialized(s) + "}");
+    assertTrue(checkSerialized(s).isEmpty());
+  }
+
+
+  @Test
+  public void testOneResultAmerica()
+  {
+    //This is North America
+    //Points  39°44'21.00"N 104°59'3.00"W (Denver) are in the footprint
+    String latitude = "33";
+    String longitude = "-93.0";
+
+    Scanner s = setUpJTSFilter(getSerializedScanner(), latitude, longitude, false);
+    s.setRange(new Range());
+
+    System.out.println("{" + checkSerialized(s) + "}");
+    assertTrue(checkSerialized(s).equals("02"));
+  }
+
+
+  @Test
+  public void testOneResultAustralia()
+  {
+    //This is Australia
+    //Points like 22S 135E are in the beam
+    String latitude = "-9";
+    String longitude = "100.0";
+
+    Scanner s = setUpJTSFilter(getSerializedScanner(), latitude, longitude, false);
+    s.setRange(new Range());
+
+    System.out.println("{" + checkSerialized(s) + "}");
+    assertTrue(checkSerialized(s).equals("01"));
+  }
+
+  @Test
+  public void testOneResultHawaii()
+  {
+    // -164 40 - somewhere near hawaii
+
+    //This is Australia
+    //Points like 22S 135E are in the beam
+    String latitude = "40";
+    String longitude = "-164.0";
+
+    Scanner s = setUpJTSFilter(getSerializedScanner(), latitude, longitude, true);
+    s.setRange(new Range());
+
+    System.out.println("{" + checkSerialized(s) + "}");
+    assertTrue(checkSerialized(s).equals("03"));
+  }
+
+
+  @Test
+  public void testDummyTest()
+  {
+    assertTrue(true);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/partition/common-query-ext/src/test/java/OGCFilterTest.java
----------------------------------------------------------------------
diff --git a/partition/common-query-ext/src/test/java/OGCFilterTest.java b/partition/common-query-ext/src/test/java/OGCFilterTest.java
new file mode 100644
index 0000000..fd54945
--- /dev/null
+++ b/partition/common-query-ext/src/test/java/OGCFilterTest.java
@@ -0,0 +1,163 @@
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.hadoop.io.Text;
+import org.junit.Test;
+
+import cloudbase.core.data.Key;
+import cloudbase.core.data.Value;
+import ss.cloudbase.core.iterators.filter.ogc.OGCFilter;
+
+import static org.junit.Assert.*;
+
+public class OGCFilterTest {
+	private Key testKey = new Key(new Text("row"), new Text("colf"), new Text("colq"));
+	private Value testValue = new Value("uuid~event\uFFFDmy-event-hash-1\u0000date\uFFFD20100819\u0000time~dss\uFFFD212706.000\u0000frequency\uFFFD3.368248181443644E8\u0000latitude\uFFFD48.74571142707959\u0000longitude\uFFFD13.865561564126812\u0000altitude\uFFFD1047.0\u0000datetime\uFFFD2010-08-19T21:27:06.000Z\u0000test~key\uFFFD\u0000key\uFFFDa\uFFFDb".getBytes());
+
+	public OGCFilterTest() {
+
+	}
+
+	private OGCFilter getFilter(String filter) {
+		OGCFilter f = new OGCFilter();
+		Map<String, String> options = new HashMap<String, String>();
+		options.put(OGCFilter.OPTION_FILTER, filter);
+		f.init(options);
+		return f;
+	}
+
+	@Test
+	public void testBBOX() {
+		OGCFilter f = getFilter("<BBOX><gml:Envelope>"
+			+ "<gml:LowerCorner>13 48</gml:LowerCorner>"
+			+ "<gml:UpperCorner>14 49</gml:UpperCorner>"
+			+ "</gml:Envelope></BBOX>");
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testBetweenStr() {
+		OGCFilter f = getFilter("<PropertyIsBetween><PropertyName>datetime</PropertyName>"
+			+ "<LowerBoundary><Literal>2010-08-19</Literal></LowerBoundary>"
+			+ "<UpperBoundary><Literal>2010-08-20</Literal></UpperBoundary>"
+			+ "</PropertyIsBetween>");
+
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testBetweenNum() {
+		OGCFilter f = getFilter("<PropertyIsBetween><PropertyName>frequency</PropertyName>"
+			+ "<LowerBoundary><Literal>330000000</Literal></LowerBoundary>"
+			+ "<UpperBoundary><Literal>340000000</Literal></UpperBoundary>"
+			+ "</PropertyIsBetween>");
+
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testEqualStr() {
+		OGCFilter f = getFilter("<PropertyIsEqualTo><PropertyName>uuid~event</PropertyName><Literal>my-event-hash-1</Literal></PropertyIsEqualTo>");
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testEqualNum() {
+		OGCFilter f = getFilter("<PropertyIsEqualTo><PropertyName>altitude</PropertyName><Literal>1047</Literal></PropertyIsEqualTo>");
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testGreaterThanStr() {
+		OGCFilter f = getFilter("<PropertyIsGreaterThan><PropertyName>datetime</PropertyName><Literal>2010-08-15</Literal></PropertyIsGreaterThan>");
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testGreaterThanNum() {
+		OGCFilter f = getFilter("<PropertyIsGreaterThan><PropertyName>altitude</PropertyName><Literal>1000</Literal></PropertyIsGreaterThan>");
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testLessThanStr() {
+		OGCFilter f = getFilter("<PropertyIsLessThan><PropertyName>datetime</PropertyName><Literal>2010-08-20</Literal></PropertyIsLessThan>");
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testLessThanNum() {
+		OGCFilter f = getFilter("<PropertyIsLessThan><PropertyName>altitude</PropertyName><Literal>1200</Literal></PropertyIsLessThan>");
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testLike() {
+		OGCFilter f = getFilter("<PropertyIsLike><PropertyName>uuid~event</PropertyName><Literal>*event*</Literal></PropertyIsLike>");
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testNotEqualNum() {
+		OGCFilter f = getFilter("<PropertyIsNotEqualTo><PropertyName>altitude</PropertyName><Literal>1046</Literal></PropertyIsNotEqualTo>");
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testNull() {
+		OGCFilter f = getFilter("<PropertyIsNull><PropertyName>test~key</PropertyName></PropertyIsNull>");
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testNot() {
+		OGCFilter f = getFilter("<Not><PropertyIsEqualTo><PropertyName>altitude</PropertyName><Literal>1047</Literal></PropertyIsEqualTo></Not>");
+		assertFalse(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testAnd() {
+		OGCFilter f = getFilter("<And>"
+			+ "<PropertyIsEqualTo><PropertyName>altitude</PropertyName><Literal>1047</Literal></PropertyIsEqualTo>"
+			+ "<PropertyIsNull><PropertyName>test~key</PropertyName></PropertyIsNull>"
+			+ "</And>");
+
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testOr() {
+		OGCFilter f = getFilter("<Or>"
+			+ "<PropertyIsLike><PropertyName>uuid~event</PropertyName><Literal>*event*</Literal></PropertyIsLike>"
+			+ "<PropertyIsNull><PropertyName>uuid~event</PropertyName></PropertyIsNull>"
+			+ "</Or>");
+
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testNand() {
+		OGCFilter f = getFilter("<Not><And>"
+			+ "<PropertyIsNull><PropertyName>uuid~event</PropertyName></PropertyIsNull>"
+			+ "<PropertyIsNull><PropertyName>test~key</PropertyName></PropertyIsNull>"
+			+ "</And></Not>");
+
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testNor() {
+		OGCFilter f = getFilter("<Not>"
+			+ "<PropertyIsNull><PropertyName>uuid~event</PropertyName></PropertyIsNull>"
+			+ "<PropertyIsNull><PropertyName>altitude</PropertyName></PropertyIsNull>"
+			+ "</Not>");
+
+		assertTrue(f.accept(testKey, testValue));
+	}
+
+	@Test
+	public void testParse() {
+		OGCFilter f = getFilter("<PropertyIsEqualTo><PropertyName>key</PropertyName><Literal>a</Literal></PropertyIsEqualTo>");
+		assertTrue(f.accept(testKey, testValue));
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/partition/common-query-ext/src/test/java/SampleData.java
----------------------------------------------------------------------
diff --git a/partition/common-query-ext/src/test/java/SampleData.java b/partition/common-query-ext/src/test/java/SampleData.java
new file mode 100644
index 0000000..071076b
--- /dev/null
+++ b/partition/common-query-ext/src/test/java/SampleData.java
@@ -0,0 +1,228 @@
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.hadoop.io.Text;
+
+import cloudbase.core.client.BatchWriter;
+import cloudbase.core.client.CBException;
+import cloudbase.core.client.CBSecurityException;
+import cloudbase.core.client.Connector;
+import cloudbase.core.client.Instance;
+import cloudbase.core.client.MultiTableBatchWriter;
+import cloudbase.core.client.TableExistsException;
+import cloudbase.core.client.TableNotFoundException;
+import cloudbase.core.client.mock.MockInstance;
+import cloudbase.core.data.Mutation;
+import cloudbase.core.security.Authorizations;
+
+
+public class SampleData {
+	public static int NUM_PARTITIONS = 2;
+	public static int NUM_SAMPLES = 10;
+	
+	public static Connector initConnector() {
+		Instance instance = new MockInstance();
+		
+		try {
+			Connector connector = instance.getConnector("root", "password".getBytes());
+			
+			// set up table
+			connector.tableOperations().create("partition");
+			connector.tableOperations().create("provenance");
+			
+			// set up root's auths
+			connector.securityOperations().changeUserAuthorizations("root", new Authorizations("ALPHA,BETA,GAMMA".split(",")));
+			
+			return connector;
+		} catch (CBException e) {
+			e.printStackTrace();
+		} catch (CBSecurityException e) {
+			e.printStackTrace();
+		} catch (TableExistsException e) {
+			e.printStackTrace();
+		}
+		
+		return null;
+	}
+	
+	public static Collection<Map<String, String>> sampleData() {
+		List<Map<String, String>> list = new ArrayList<Map<String, String>>();
+		Map<String, String> item;
+		
+		for (int i = 0; i < NUM_SAMPLES; i++) {
+			item = new HashMap<String, String>();
+			for (int j = 0; j < 5; j++) {
+				item.put("field" + j , new String(new char[] {(char) ('A' + ((j + i) % 26))}));
+			}
+			list.add(item);
+		}
+		return list;
+	}
+	
+	public static void writeDenCellLevel(Connector connector, Collection<Map<String, String>> data) {
+		// write sample data
+		MultiTableBatchWriter mtbw = connector.createMultiTableBatchWriter(200000, 10000, 1);
+		try {
+			BatchWriter writer;
+			if (mtbw != null) {
+				writer = mtbw.getBatchWriter("partition");
+			} else {
+				writer = connector.createBatchWriter("partition", 200000, 10000, 1);
+			}
+			int count = 0;
+			Mutation m;
+			for (Map<String, String> object: data) {
+				count++;
+				String id = (count < 10 ? "0" + count: "" + count);
+				Text partition = new Text("" + (count % NUM_PARTITIONS));
+				
+				// write dummy record
+				m = new Mutation(partition);
+				m.put("event", id, "");
+				writer.addMutation(m);
+				
+				for (Entry<String, String> entry: object.entrySet()) {
+					// write the event mutation
+					m = new Mutation(partition);
+					m.put("event", id + "\u0000" + entry.getKey(), entry.getValue());
+					writer.addMutation(m);
+					
+					// write the general index mutation
+					m = new Mutation(partition);
+					m.put("index", entry.getValue() + "\u0000" + id, "");
+					writer.addMutation(m);
+					
+					// write the specific index mutation
+					m = new Mutation(partition);
+					m.put("index", entry.getKey() + "//" + entry.getValue() + "\u0000" + id, "");
+					writer.addMutation(m);
+				}
+			}
+			writer.close();
+		} catch (CBException e) {
+			e.printStackTrace();
+		} catch (CBSecurityException e) {
+			e.printStackTrace();
+		} catch (TableNotFoundException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	public static void writeDenSerialized(Connector connector, Collection<Map<String, String>> data) {
+		// write sample data
+		MultiTableBatchWriter mtbw = connector.createMultiTableBatchWriter(200000, 10000, 1);
+		try {
+			BatchWriter writer;
+			if (mtbw != null) {
+				writer = mtbw.getBatchWriter("partition");
+			} else {
+				writer = connector.createBatchWriter("partition", 200000, 10000, 1);
+			}
+			int count = 0;
+			Mutation m;
+			for (Map<String, String> object: data) {
+				count++;
+				String id = (count < 10 ? "0" + count: "" + count);
+				Text partition = new Text("" + (count % NUM_PARTITIONS));
+				
+				StringBuilder value = new StringBuilder();
+				boolean first = true;
+				for (Entry<String, String> entry: object.entrySet()) {
+					if (!first) {
+						value.append("\u0000");
+					} else {
+						first = false;
+					}
+					value.append(entry.getKey());
+					value.append("\uFFFD");
+					value.append(entry.getValue());
+					
+					// write the general index mutation
+					m = new Mutation(partition);
+					m.put("index", entry.getValue() + "\u0000" + id, "");
+					writer.addMutation(m);
+					
+					// write the specific index mutation
+					m = new Mutation(partition);
+					m.put("index", entry.getKey() + "//" + entry.getValue() + "\u0000" + id, "");
+					writer.addMutation(m);
+				}
+				
+				// write the event mutation
+				m = new Mutation(partition);
+				m.put("event", id, value.toString());
+				writer.addMutation(m);
+			}
+			writer.close();
+		} catch (CBException e) {
+			e.printStackTrace();
+		} catch (CBSecurityException e) {
+			e.printStackTrace();
+		} catch (TableNotFoundException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	public static void writeDenProvenance(Connector connector) {
+		// write sample data
+		MultiTableBatchWriter mtbw = connector.createMultiTableBatchWriter(200000, 10000, 1);
+		try {
+			BatchWriter writer;
+			if (mtbw != null) {
+				writer = mtbw.getBatchWriter("provenance");
+			} else {
+				writer = connector.createBatchWriter("provenance", 200000, 10000, 1);
+			}
+			Mutation m;
+			for (int sid = 1; sid <= 2; sid++) {
+				for (int time = 1; time <= 3; time++) {
+					for (int uuid = 1; uuid <= (6 + 2 * time); uuid++) {
+						m = new Mutation(new Text("sid" + sid));
+						m.put("time" + time, "uuid-" + Integer.toHexString(uuid), "");
+						writer.addMutation(m);
+					}
+				}
+			}
+			writer.close();
+		} catch (CBException e) {
+			e.printStackTrace();
+		} catch (CBSecurityException e) {
+			e.printStackTrace();
+		} catch (TableNotFoundException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	public static void writeMinIndexes(Connector connector) {
+		// write sample data
+		MultiTableBatchWriter mtbw = connector.createMultiTableBatchWriter(200000, 10000, 1);
+		try {
+			BatchWriter writer;
+			if (mtbw != null) {
+				writer = mtbw.getBatchWriter("partition");
+			} else {
+				writer = connector.createBatchWriter("partition", 200000, 10000, 1);
+			}
+			Mutation m;
+			for (int i = 1; i <= NUM_SAMPLES; i++) {
+				m = new Mutation(new Text("" + (i % NUM_PARTITIONS)));
+				
+				String id = (i < 10 ? "0" + i: "" + i);
+				
+				m.put("index", "z_" + id + "_rdate\u0000" + id, "");
+				writer.addMutation(m);
+			}
+			writer.close();
+		} catch (CBException e) {
+			e.printStackTrace();
+		} catch (CBSecurityException e) {
+			e.printStackTrace();
+		} catch (TableNotFoundException e) {
+			e.printStackTrace();
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/partition/common-query-ext/src/test/java/SampleGVData.java
----------------------------------------------------------------------
diff --git a/partition/common-query-ext/src/test/java/SampleGVData.java b/partition/common-query-ext/src/test/java/SampleGVData.java
new file mode 100644
index 0000000..d8168de
--- /dev/null
+++ b/partition/common-query-ext/src/test/java/SampleGVData.java
@@ -0,0 +1,182 @@
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.hadoop.io.Text;
+
+import cloudbase.core.client.BatchWriter;
+import cloudbase.core.client.CBException;
+import cloudbase.core.client.CBSecurityException;
+import cloudbase.core.client.Connector;
+import cloudbase.core.client.Instance;
+import cloudbase.core.client.MultiTableBatchWriter;
+import cloudbase.core.client.TableExistsException;
+import cloudbase.core.client.TableNotFoundException;
+import cloudbase.core.client.mock.MockInstance;
+import cloudbase.core.data.Mutation;
+import cloudbase.core.security.Authorizations;
+
+// For use in testing the Date Filter and Frequency Filter classes
+public class SampleGVData
+{
+
+  public static int NUM_PARTITIONS = 2;
+
+
+  public static Connector initConnector()
+  {
+    Instance instance = new MockInstance();
+
+    try
+    {
+      Connector connector = instance.getConnector("root", "password".getBytes());
+
+      // set up table
+      connector.tableOperations().create("partition");
+
+      // set up root's auths
+      connector.securityOperations().changeUserAuthorizations("root", new Authorizations("ALPHA,BETA,GAMMA".split(",")));
+
+      return connector;
+    }
+    catch (CBException e)
+    {
+      e.printStackTrace();
+    }
+    catch (CBSecurityException e)
+    {
+      e.printStackTrace();
+    }
+    catch (TableExistsException e)
+    {
+      e.printStackTrace();
+    }
+
+    return null;
+  }
+
+  public static Collection<Map<String, String>> sampleData()
+  {
+    List<Map<String, String>> list = new ArrayList<Map<String, String>>();
+    Map<String, String> item;
+
+    item = new HashMap<String, String>();
+    item.put("a",  "a");
+    item.put("b",  "b");
+
+    //This one is like RB
+    item.put("date-start",  "2009-01-01");
+    item.put("date-end",    "2011-02-24");
+    item.put("date-update", "2011-02-24T00:00:00Z");
+    item.put("frequency",  "1250000000");
+    item.put("bandwidth",   "500000000");
+    item.put("version",     "1");
+    list.add(item);
+
+    item = new HashMap<String, String>();
+    item.put("a",  "a");
+    item.put("b",  "b");
+    list.add(item);
+
+    //This one is like GV
+    item = new HashMap<String, String>();
+    item.put("a",  "a");
+    item.put("b",  "b");
+    item.put("date-start",  "2010-01-01");
+    item.put("date-update", "2010-01-23");
+    item.put("frequency",  "1150000000");
+    item.put("bandwidth",   "300000000");
+    list.add(item);
+
+    item = new HashMap<String, String>();
+    item.put("a",  "a");
+    item.put("b",  "b");
+    item.put("date-start",  "2009-01-01");
+    item.put("date-end",    "2011-02-24");
+    item.put("date-update", "2008-01-23");
+    list.add(item);
+
+    item = new HashMap<String, String>();
+    item.put("a",  "a");
+    item.put("b",  "b");
+    list.add(item);
+
+    return list;
+  }
+
+
+  public static void writeDenSerialized(Connector connector, Collection<Map<String, String>> data)
+  {
+    // write sample data
+    MultiTableBatchWriter mtbw = connector.createMultiTableBatchWriter(200000, 10000, 1);
+    try
+    {
+      BatchWriter writer;
+      if (mtbw != null)
+      {
+        writer = mtbw.getBatchWriter("partition");
+      }
+      else
+      {
+        writer = connector.createBatchWriter("partition", 200000, 10000, 1);
+      }
+      int count = 0;
+      Mutation m;
+      for (Map<String, String> object : data)
+      {
+        count++;
+        String id = (count < 10 ? "0" + count : "" + count);
+        Text partition = new Text("" + (count % NUM_PARTITIONS));
+
+        StringBuilder value = new StringBuilder();
+        boolean first = true;
+        for (Entry<String, String> entry : object.entrySet())
+        {
+          if (!first)
+          {
+            value.append("\u0000");
+          }
+          else
+          {
+            first = false;
+          }
+          value.append(entry.getKey());
+          value.append("\uFFFD");
+          value.append(entry.getValue());
+
+          // write the general index mutation
+          m = new Mutation(partition);
+          m.put("index", entry.getValue() + "\u0000" + id, "");
+          writer.addMutation(m);
+
+          // write the specific index mutation
+          m = new Mutation(partition);
+          m.put("index", entry.getKey() + "//" + entry.getValue() + "\u0000" + id, "");
+          writer.addMutation(m);
+        }
+
+        // write the event mutation
+        m = new Mutation(partition);
+        m.put("event", id, value.toString());
+        writer.addMutation(m);
+      }
+      writer.close();
+    }
+    catch (CBException e)
+    {
+      e.printStackTrace();
+    }
+    catch (CBSecurityException e)
+    {
+      e.printStackTrace();
+    }
+    catch (TableNotFoundException e)
+    {
+      e.printStackTrace();
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/partition/common-query-ext/src/test/java/SampleJTSData.java
----------------------------------------------------------------------
diff --git a/partition/common-query-ext/src/test/java/SampleJTSData.java b/partition/common-query-ext/src/test/java/SampleJTSData.java
new file mode 100644
index 0000000..41df658
--- /dev/null
+++ b/partition/common-query-ext/src/test/java/SampleJTSData.java
@@ -0,0 +1,171 @@
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.hadoop.io.Text;
+
+import cloudbase.core.client.BatchWriter;
+import cloudbase.core.client.CBException;
+import cloudbase.core.client.CBSecurityException;
+import cloudbase.core.client.Connector;
+import cloudbase.core.client.Instance;
+import cloudbase.core.client.MultiTableBatchWriter;
+import cloudbase.core.client.TableExistsException;
+import cloudbase.core.client.TableNotFoundException;
+import cloudbase.core.client.mock.MockInstance;
+import cloudbase.core.data.Mutation;
+import cloudbase.core.security.Authorizations;
+
+// For use in testing the Date Filter and Frequency Filter classes
+public class SampleJTSData
+{
+
+  public static int NUM_PARTITIONS = 2;
+
+
+  public static Connector initConnector()
+  {
+    Instance instance = new MockInstance();
+
+    try
+    {
+      Connector connector = instance.getConnector("root", "password".getBytes());
+
+      // set up table
+      connector.tableOperations().create("partition");
+
+      // set up root's auths
+      connector.securityOperations().changeUserAuthorizations("root", new Authorizations("ALPHA,BETA,GAMMA".split(",")));
+
+      return connector;
+    }
+    catch (CBException e)
+    {
+      e.printStackTrace();
+    }
+    catch (CBSecurityException e)
+    {
+      e.printStackTrace();
+    }
+    catch (TableExistsException e)
+    {
+      e.printStackTrace();
+    }
+
+    return null;
+  }
+
+  public static Collection<Map<String, String>> sampleData()
+  {
+    List<Map<String, String>> list = new ArrayList<Map<String, String>>();
+    Map<String, String> item;
+
+    item = new HashMap<String, String>();
+    item.put("geometry-contour",  "SDO_GEOMETRY(2007, 8307, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(91.985, -12.108, 94.657, -12.059, 98.486, -11.988, 101.385, -12.296, 102.911, -12.569, 103.93, -12.852, 105.005, -12.531, 106.37, -12.204, 108.446, -11.503, 109.585, -10.88, 110.144, -10.207, 108.609, -9.573, 106.05, -8.535, 104.145, -7.606, 102.191, -7.522, 99.522, -7.691, 97.64, -7.606, 95.482, -7.947, 94.546, -8.084, 92.465, -8.605, 90.554, -9.366, 90.197, -10.436, 89.84, -11.729, 90.554, -12.175, 91.985, -12.108))");
+    item.put("beam-name",    "OPTUS D1 Ku-BAND NATIONAL A & B AUSTRALIA Downlink");
+    list.add(item);
+    //This is Australia
+    //Points like 22S 135E are in the beam
+
+    //This one is like GV
+    item = new HashMap<String, String>();
+    item.put("beam-name",  "AMC 1 Ku-BAND ZONAL NORTH AMERICA Down HV");
+    item.put("geometry-contour",   "SDO_GEOMETRY(2007, 8307, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(-70.838, 39.967, -70.506, 40.331, -70.698, 41.679, -71.179, 42.401, -71.578, 42.38, -72.994, 42.924, -74.353, 43.242, -75.715, 43.26, -77.318, 42.981, -78.684, 42.774, -80.05, 42.491, -82.005, 42.517, -83.608, 42.312, -84.977, 41.805, -86.58, 41.525, -88.127, 41.02, -89.731, 40.741, -90.905, 41.582, -92.264, 41.9, -93.861, 42.147, -95.411, 41.341, -96.257, 40.076, -97.222, 38.737, -98.011, 37.17, -98.031, 35.593, -97.691, 34.312, -96.875, 33.25, -97.307, 31.904, -97.916, 30.561, -98.702, 29.295, -99.134, 27.949, -98.14, 26.884, -97.205, 25.821, -95.842, 25.803, -94.42, 25.784, -92.876, 26.064, -91.277, 26.043, -90.085, 26.553, -88.729, 26.01, -87.38, 24.941, -86.031, 23.797, -84.616, 23.253, -83.256, 23.01, -81.887, 23.517, -80.866, 24.555, -80.254, 26.124, -79.642, 27.693, -78.444, 28.728, -77.486, 29.542, -76.463, 30.805, -76.088, 32.377, -75.656, 33.723, -76.051,
  35.305, -75.442, 36.649, -74.426, 37.386, -73.228, 38.422, -72.032, 39.232, -70.838, 39.967))");
+    list.add(item);
+    //This is North America
+    //Points  39°44'21.00"N 104°59'3.00"W (Denver) are in the footprint
+
+    item = new HashMap<String, String>();
+    item.put("beam-name",  "testa");
+    item.put("beam-footprint",   "MULTIPOLYGON (((-169.286 40.431, -164.971 39.992, -155.397 38.482, -146.566 36.233, -136.975 32.539, -128.124 27.742, -121.946 24.548, -116.849 21.339, -112.156 17.479, -109.391 14.206, -107.301 11.715, -105.274 9.477, -103.443 8.229, -102.108 7.7, -99.109 7.428, -96.681 7.745, -93.894 8.843, -89.917 11.687, -85.953 15.017, -81.148 17.266, -78.145 17.986, -75.582 17.887, -68.1 17.987, -64.696 18.493, -61.445 19.38, -60.094 20.288, -59.315 21.564, -57.026 26.51, -55.089 30.962, -53.59 33.657, -52.495 34.691, -50.468 36.204, -46.146 38.672, -41.684 40.663, -37.914 42.055, -33.806 43.082, -27.523 44.149, -21.645 44.96, -16.578 45.406, -13.807 45.771, -14.929 50.108, -16.186 53.919, -17.051 56.0, -18.388 58.824, -19.861 61.567, -21.807 64.188, -23.104 65.742, -25.28 67.904, -27.699 69.823, -28.955 70.728, -32.415 72.768, -34.968 73.998, -38.468 75.309, -48.292 73.025, -56.545 71.12, -64.023 70.474, -72.753 70.357, -78.41 70.827, -80.466 71.093, -82.412 
 71.876, -83.02 72.944, -83.175 74.04, -82.493 74.782, -82.412 75.552, -82.697 76.778, -84.041 78.398, -86.316 81.078, -104.098 80.819, -110.861 80.482, -115.73 80.17, -120.936 79.669, -125.84 79.176, -126.696 79.02, -134.316 77.732, -139.505 76.478, -144.823 74.826, -148.231 73.417, -151.517 71.687, -153.87 70.165, -154.536 69.672, -155.868 68.678, -156.482 68.098, -158.281 66.421, -159.716 64.804, -160.996 63.126, -161.878 61.786, -163.046 59.875, -164.369 57.254, -165.563 54.479, -166.73 51.089, -167.811 47.267, -168.581 44.041, -169.286 40.431)), ((-171.333 23.244, -171.523 18.894, -170.127 18.986, -161.559 18.555, -156.977 18.134, -153.574 18.116, -151.108 18.324, -149.947 18.45, -149.018 18.957, -148.515 19.822, -148.524 20.914, -149.018 21.766, -149.947 22.272, -152.185 23.054, -155.563 23.434, -158.075 23.75, -160.272 24.034, -162.184 24.008, -163.514 23.99, -164.595 23.976, -166.52 23.687, -169.159 23.18, -171.333 23.244)))");
+    list.add(item);
+// this point should be in there...
+    // -164 40 - somewhere near hawaii
+
+    item = new HashMap<String, String>();
+    item.put("beam-name",  "testb");
+    item.put("beam-footprint",   "POLYGON ((-140.153 34.772, -140.341 33.272, -137.024 33.026, -132.723 32.369, -130.947 31.916, -128.664 31.225, -125.293 29.612, -121.813 27.871, -118.699 25.892, -115.589 23.79, -112.593 21.875, -109.136 19.335, -106.939 16.701, -105.006 14.97, -104.195 14.407, -103.049 13.659, -100.363 12.717, -98.063 12.288, -94.299 11.612, -90.825 11.097, -87.997 11.584, -86.815 12.109, -86.163 12.893, -85.014 14.342, -83.804 15.788, -82.104 16.998, -80.413 17.269, -78.005 16.574, -76.181 16.531, -74.65 16.68, -73.552 17.392, -72.957 18.3, -72.917 19.651, -73.526 21.325, -74.913 23.018, -76.036 24.519, -76.159 26.428, -75.741 28.447, -74.257 30.072, -72.771 31.331, -70.517 34.328, -69.638 36.04, -68.624 39.467, -68.015 41.851, -67.607 43.501, -67.548 45.528, -67.586 47.308, -68.601 49.066, -69.868 50.07, -71.621 50.778, -73.285 50.888, -74.9 50.926, -76.994 50.975, -79.332 50.846, -81.066 50.887, -83.842 51.136, -86.569 51.016, -87.95 50.864, -90.831 50.563, -94
 .27 50.644, -98.068 50.733, -102.937 51.032, -106.455 51.484, -109.973 51.936, -114.119 52.402, -117.363 53.031, -119.899 53.276, -123.243 53.539, -127.017 54.427, -130.519 55.431, -133.643 56.058, -134.826 56.279, -135.354 55.029, -135.792 53.864, -136.168965072136 52.8279962761917, -136.169 52.828, -136.169497186166 52.8264970826432, -136.192 52.763, -136.556548517884 51.6453176911637, -136.703232746756 51.2152965828266, -136.781220290925 50.9919311116929, -136.793 50.959, -136.80274055379 50.9259886895048, -136.992 50.295, -137.200898649547 49.5808675274021, -137.202 49.581, -137.200962495599 49.5806459535167, -137.360714473458 49.0197683891632, -137.459 48.677, -137.462166719028 48.6649126473121, -137.471 48.634, -137.515105536699 48.4619710228524, -137.74710368039 47.5528216167105, -137.793718522461 47.3758260237407, -137.854 47.152, -137.977773277882 46.6610808974241, -138.044 46.403, -138.330834102374 45.1674736036557, -138.365 45.019, -138.38180854655 44.9421315900087, -138.
 449801069917 44.6389849661384, -138.485 44.484, -138.497077239724 44.4262941289417, -138.536 44.25, -138.622787032392 43.8206200438395, -138.743816168807 43.232032787661, -138.981390224617 42.0843314825185, -138.989 42.048, -138.990605533614 42.0389442888447, -138.991 42.037, -138.997785044232 41.9994454595406, -139.004 41.969, -139.035645873997 41.7890661698517, -139.061212567475 41.6462082823816, -139.428 39.584, -139.673 38.073, -139.713116752585 37.8001474769807, -139.766 37.457, -139.764942047737 37.4567768906428, -139.898 36.573, -139.897723683259 36.5729429963606, -139.986 35.994, -140.04777653037 35.5462970502163, -140.094 35.232, -140.090797568766 35.2315144621917, -140.153 34.772))");
+    list.add(item);
+
+
+
+    //London is in niether - 51°30'0.00"N   0° 7'0.00"W
+    return list;
+  }
+
+
+  public static void writeDenSerialized(Connector connector, Collection<Map<String, String>> data)
+  {
+    // write sample data
+    MultiTableBatchWriter mtbw = connector.createMultiTableBatchWriter(200000, 10000, 1);
+    try
+    {
+      BatchWriter writer;
+      if (mtbw != null)
+      {
+        writer = mtbw.getBatchWriter("partition");
+      }
+      else
+      {
+        writer = connector.createBatchWriter("partition", 200000, 10000, 1);
+      }
+      int count = 0;
+      Mutation m;
+      for (Map<String, String> object : data)
+      {
+        count++;
+        String id = (count < 10 ? "0" + count : "" + count);
+        Text partition = new Text("" + (count % NUM_PARTITIONS));
+
+        StringBuilder value = new StringBuilder();
+        boolean first = true;
+        for (Entry<String, String> entry : object.entrySet())
+        {
+          if (!first)
+          {
+            value.append("\u0000");
+          }
+          else
+          {
+            first = false;
+          }
+          value.append(entry.getKey());
+          value.append("\uFFFD");
+          value.append(entry.getValue());
+
+          // write the general index mutation
+          m = new Mutation(partition);
+          m.put("index", entry.getValue() + "\u0000" + id, "");
+          writer.addMutation(m);
+
+          // write the specific index mutation
+          m = new Mutation(partition);
+          m.put("index", entry.getKey() + "//" + entry.getValue() + "\u0000" + id, "");
+          writer.addMutation(m);
+        }
+
+        // write the event mutation
+        m = new Mutation(partition);
+        m.put("event", id, value.toString());
+        writer.addMutation(m);
+      }
+      writer.close();
+    }
+    catch (CBException e)
+    {
+      e.printStackTrace();
+    }
+    catch (CBSecurityException e)
+    {
+      e.printStackTrace();
+    }
+    catch (TableNotFoundException e)
+    {
+      e.printStackTrace();
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/partition/common-query/pom.xml
----------------------------------------------------------------------
diff --git a/partition/common-query/pom.xml b/partition/common-query/pom.xml
new file mode 100644
index 0000000..6db84bf
--- /dev/null
+++ b/partition/common-query/pom.xml
@@ -0,0 +1,103 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!--<parent>-->
+    <!--<groupId>sitestore</groupId>-->
+    <!--<artifactId>sitestore</artifactId>-->
+    <!--<version>2.0.0-SNAPSHOT</version>-->
+    <!--</parent>-->
+
+    <parent>
+        <groupId>mvm.rya</groupId>
+        <artifactId>parent</artifactId>
+        <version>2.0.0-SNAPSHOT</version>
+    </parent>
+
+    <groupId>sitestore.common</groupId>
+    <artifactId>common-query</artifactId>
+    <name>common-query (${project.version})</name>
+    <version>2.0.0-SNAPSHOT</version>
+    <description>A set of filters and iterators for cloudbase queries</description>
+
+    <properties>
+        <skipTests>true</skipTests>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.1.2</version>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <phase>install</phase>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.7.2</version>
+                <configuration>
+                    <skipTests>${skipTests}</skipTests>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <!--<scm>-->
+    <!--<connection>${scmLocation}/tto/ss/common/trunk/common-query</connection>-->
+    <!--</scm>-->
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.14</version>
+        </dependency>
+        <dependency>
+            <groupId>cloudbase</groupId>
+            <artifactId>cloudbase-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+            <version>1.0.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cloudbase</groupId>
+            <artifactId>cloudbase-start</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.thrift</groupId>
+            <artifactId>thrift</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.vividsolutions</groupId>
+            <artifactId>jts</artifactId>
+            <version>1.11</version>
+        </dependency>
+        <dependency>
+            <groupId>xerces</groupId>
+            <artifactId>xercesImpl</artifactId>
+            <version>2.8.1</version>
+        </dependency>
+    </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/partition/common-query/src/main/java/ss/cloudbase/core/iterators/CellLevelFilteringIterator.java
----------------------------------------------------------------------
diff --git a/partition/common-query/src/main/java/ss/cloudbase/core/iterators/CellLevelFilteringIterator.java b/partition/common-query/src/main/java/ss/cloudbase/core/iterators/CellLevelFilteringIterator.java
new file mode 100644
index 0000000..e0126fa
--- /dev/null
+++ b/partition/common-query/src/main/java/ss/cloudbase/core/iterators/CellLevelFilteringIterator.java
@@ -0,0 +1,163 @@
+package ss.cloudbase.core.iterators;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.hadoop.io.Text;
+
+import ss.cloudbase.core.iterators.filter.ogc.OGCFilter;
+import cloudbase.core.data.ByteSequence;
+import cloudbase.core.data.Key;
+import cloudbase.core.data.Range;
+import cloudbase.core.data.Value;
+import cloudbase.core.iterators.IteratorEnvironment;
+import cloudbase.core.iterators.SortedKeyValueIterator;
+import cloudbase.core.iterators.WrappingIterator;
+
+public class CellLevelFilteringIterator extends WrappingIterator {
+	private static final Collection<ByteSequence> EMPTY_SET = Collections.emptySet();
+	
+	/** The OGC Filter string **/
+	public static final String OPTION_FILTER = "filter";
+	
+	/** The character or characters that defines the end of the field in the column qualifier. Defaults to '@' **/
+	public static final String OPTION_FIELD_END = "fieldEnd";
+	
+	protected SortedKeyValueIterator<Key, Value> checkSource;
+	
+	protected Map<String, Boolean> cache = new HashMap<String, Boolean>();
+	
+	protected OGCFilter filter;
+	
+	protected String fieldEnd = "@";
+
+	public CellLevelFilteringIterator() {}
+	
+	public CellLevelFilteringIterator(CellLevelFilteringIterator other, IteratorEnvironment env) {
+		setSource(other.getSource().deepCopy(env));
+		checkSource = other.checkSource.deepCopy(env);
+		cache = other.cache;
+		fieldEnd = other.fieldEnd;
+	}
+	
+	@Override
+	public CellLevelFilteringIterator deepCopy(IteratorEnvironment env) {
+		return new CellLevelFilteringIterator(this, env);
+	}
+
+	@Override
+	public void init(SortedKeyValueIterator<Key, Value> source, Map<String, String> options, IteratorEnvironment env) throws IOException {
+		super.init(source, options, env);
+		if (source instanceof GMDenIntersectingIterator) {
+			checkSource = ((GMDenIntersectingIterator) source).docSource.deepCopy(env);
+		} else if (source instanceof SortedRangeIterator) {
+			checkSource = ((SortedRangeIterator) source).docSource.deepCopy(env);
+		} else {
+			checkSource = source.deepCopy(env);
+		}
+		filter = new OGCFilter();
+		filter.init(options);
+		
+		if (options.containsKey(OPTION_FIELD_END)) {
+			fieldEnd = options.get(OPTION_FIELD_END);
+		}
+	}
+
+	@Override
+	public void next() throws IOException {
+		getSource().next();
+		findTop();
+	}
+	
+	protected String getDocId(Key key) {
+		String colq = key.getColumnQualifier().toString();
+		int i = colq.indexOf("\u0000");
+		if (i == -1) {
+			i = colq.length();	
+		}
+		return colq.substring(0, i);
+	}
+	
+	protected Key getRecordStartKey(Key key, String docId) {
+		return new Key(key.getRow(), key.getColumnFamily(), new Text(docId + "\u0000"));
+	}
+	
+	protected Key getRecordEndKey(Key key, String docId) {
+		return new Key(key.getRow(), key.getColumnFamily(), new Text(docId + "\u0000\uFFFD"));
+	}
+	
+	protected String getField(Key key, Value value) {
+		String colq = key.getColumnQualifier().toString();
+		int i = colq.indexOf("\u0000");
+		if (i == -1) {
+			return null;
+		}
+		
+		int j = colq.indexOf(fieldEnd, i + 1);
+		if (j == -1) {
+			j = colq.length();
+		}
+		
+		return colq.substring(i + 1, j);
+	}
+	
+	protected String getValue(Key key, Value value) {
+		return value.toString();
+	}
+	
+	protected void findTop() throws IOException {
+		boolean goodKey;
+		String docId;
+		Map<String, String> record = new HashMap<String, String>();
+		
+		while (getSource().hasTop()) {
+			docId = getDocId(getSource().getTopKey());
+			
+			// if the document is in the cache, then we have already scanned it
+			if (cache.containsKey(docId)) {
+				goodKey = cache.get(docId);
+			} else {
+				// we need to scan the whole record into a map and evaluate the filter
+				
+				// seek the check source to the beginning of the record
+				Range range = new Range(
+					getRecordStartKey(getSource().getTopKey(), docId),
+					true,
+					getRecordEndKey(getSource().getTopKey(), docId),
+					true
+				);
+				
+				checkSource.seek(range, EMPTY_SET, false);
+				
+				// read in the record to the map
+				record.clear();
+				while (checkSource.hasTop()) {
+					String field = getField(checkSource.getTopKey(), checkSource.getTopValue());
+					if (field != null) {
+						record.put(field, getValue(checkSource.getTopKey(), checkSource.getTopValue()));
+					}
+					checkSource.next();
+				}
+				
+				// evaluate the filter
+				goodKey = filter.accept(record);
+				
+				// cache the result so that we don't do this for every cell
+				cache.put(docId, goodKey);
+			}
+			
+			if (goodKey==true)
+				return;
+			getSource().next();
+		}
+	}
+
+	@Override
+	public void seek(Range range, Collection<ByteSequence> columnFamilies, boolean inclusive) throws IOException {
+		getSource().seek(range, columnFamilies, inclusive);
+		findTop();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/92ddfa59/partition/common-query/src/main/java/ss/cloudbase/core/iterators/CellLevelRecordIterator.java
----------------------------------------------------------------------
diff --git a/partition/common-query/src/main/java/ss/cloudbase/core/iterators/CellLevelRecordIterator.java b/partition/common-query/src/main/java/ss/cloudbase/core/iterators/CellLevelRecordIterator.java
new file mode 100644
index 0000000..1f59882
--- /dev/null
+++ b/partition/common-query/src/main/java/ss/cloudbase/core/iterators/CellLevelRecordIterator.java
@@ -0,0 +1,144 @@
+package ss.cloudbase.core.iterators;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.hadoop.io.Text;
+
+import ss.cloudbase.core.iterators.filter.CBConverter;
+
+import cloudbase.core.data.Key;
+import cloudbase.core.data.Range;
+import cloudbase.core.data.Value;
+import cloudbase.core.iterators.IteratorEnvironment;
+import cloudbase.core.iterators.SkippingIterator;
+import cloudbase.core.iterators.SortedKeyValueIterator;
+
+public class CellLevelRecordIterator extends SkippingIterator {
+	public static final String OPTION_FIELD_END = "fieldEnd";
+	public static final String OPTION_MULTIPLE_DELIMITER = "multipleDelimiter";
+	
+	protected String multipleDelimiter = ",";
+	
+	protected Key topKey;
+	protected Value topValue;
+	protected String fieldEnd = "@";
+	protected String docId = null;
+	protected CBConverter converter = new CBConverter();
+	
+	@Override
+	public SortedKeyValueIterator<Key, Value> deepCopy(IteratorEnvironment env) {
+		CellLevelRecordIterator itr = new CellLevelRecordIterator();
+		itr.setSource(this.getSource().deepCopy(env));
+		itr.fieldEnd = this.fieldEnd;
+		return itr;
+	}
+	
+	@Override
+	public void init(SortedKeyValueIterator<Key, Value> source, Map<String, String> options, IteratorEnvironment env) throws IOException {
+		super.init(source, options, env);
+        converter.init(options);
+		if (options.containsKey(OPTION_FIELD_END)) {
+			fieldEnd = options.get(OPTION_FIELD_END);
+		}
+		
+		if (options.containsKey(OPTION_MULTIPLE_DELIMITER)) {
+			multipleDelimiter = options.get(OPTION_MULTIPLE_DELIMITER);
+		}
+	}
+
+	@Override
+	public void next() throws IOException {
+		consume();
+	}
+
+	@Override
+	public boolean hasTop() {
+		return getSource().hasTop() || topKey != null || topValue != null;
+	}
+
+	@Override
+	public Key getTopKey() {
+		return topKey;
+	}
+
+	@Override
+	public Value getTopValue() {
+		return topValue;
+	}
+	
+	protected String getDocId(Key key) {
+		String colq = key.getColumnQualifier().toString();
+		int i = colq.indexOf("\u0000");
+		if (i == -1) {
+			i = colq.length();	
+		}
+		return colq.substring(0, i);
+	}
+
+	protected Key buildTopKey(Key key, String docId) {
+		return new Key(key.getRow(), key.getColumnFamily(), new Text(docId), key.getColumnVisibility(), key.getTimestamp());
+	}
+	
+	protected String getField(Key key, Value value) {
+		String colq = key.getColumnQualifier().toString();
+		int i = colq.indexOf("\u0000");
+		if (i == -1) {
+			return null;
+		}
+		
+		int j = colq.indexOf(fieldEnd, i + 1);
+		if (j == -1) {
+			j = colq.length();
+		}
+		
+		return colq.substring(i + 1, j);
+	}
+	
+	protected String getValue(Key key, Value value) {
+		return value.toString();
+	}
+	
+	protected Key getRecordStartKey(Key key, String docId) {
+		return new Key(key.getRow(), key.getColumnFamily(), new Text(docId));
+	}
+	
+	protected Key getRecordEndKey(Key key, String docId) {
+		return new Key(key.getRow(), key.getColumnFamily(), new Text(docId + "\u0000\uFFFD"));
+	}
+
+	@Override
+	protected void consume() throws IOException {
+		// build the top key
+		if (getSource().hasTop()) {
+			docId = getDocId(getSource().getTopKey());
+			topKey = buildTopKey(getSource().getTopKey(), docId);
+			
+			Range range = new Range(
+				getRecordStartKey(getSource().getTopKey(), docId),
+				true,
+				getRecordEndKey(getSource().getTopKey(), docId),
+				true
+			);
+			
+			Map<String, String> record = new HashMap<String, String>();
+			while (getSource().hasTop() && range.contains(getSource().getTopKey())) {
+				String field = getField(getSource().getTopKey(), getSource().getTopValue());
+				if (field != null) {
+					if (record.get(field) == null) {
+						record.put(field, getValue(getSource().getTopKey(), getSource().getTopValue()));
+					} else {
+						record.put(field, record.get(field) + multipleDelimiter + getValue(getSource().getTopKey(), getSource().getTopValue()));
+					}
+				}
+				getSource().next();
+			}
+			
+			topValue = converter.toValue(record);  
+		} else {
+			topKey = null;
+			topValue = null;
+		}
+	}
+}