You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2015/07/30 19:19:41 UTC

[03/25] incubator-usergrid git commit: Added comparator chain so that we can merge correctly

Added comparator chain so that we can merge correctly


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/1fe69065
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/1fe69065
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/1fe69065

Branch: refs/heads/master
Commit: 1fe69065b299797e1c2b40b59fa2fc567ed1f5e6
Parents: aa31768
Author: Todd Nine <tn...@apigee.com>
Authored: Wed Jun 17 17:07:34 2015 -0600
Committer: Todd Nine <tn...@apigee.com>
Committed: Wed Jun 17 17:07:34 2015 -0600

----------------------------------------------------------------------
 .../persistence/cassandra/QueryProcessor.java   |  7 +-
 .../cassandra/RelationManagerImpl.java          | 30 +++++---
 .../index/DynamicCompositeComparator.java       | 43 +++++++++++
 .../DynamicCompositeForwardComparator.java      | 40 +++++++++++
 .../DynamicCompositeReverseComparator.java      | 39 ++++++++++
 .../index/IndexMultiBucketSetLoader.java        | 55 --------------
 .../cassandra/index/NoOpIndexScanner.java       |  7 +-
 .../persistence/geo/EntityLocationRef.java      | 21 ++++--
 .../persistence/query/ir/SearchVisitor.java     |  2 +-
 .../query/ir/result/AbstractScanColumn.java     | 42 ++++++++++-
 .../ir/result/ConnectionIndexSliceParser.java   | 10 +--
 .../result/ConnectionSearchVisitorFactory.java  |  2 +-
 .../query/ir/result/GatherIterator.java         | 76 +++++++++++++++++++-
 .../query/ir/result/GeoIterator.java            | 24 +++++++
 .../persistence/query/ir/result/ScanColumn.java | 23 +++++-
 .../ir/result/SearchCollectionVisitor.java      |  2 +-
 .../ir/result/SearchConnectionVisitor.java      |  2 +-
 .../ir/result/SecondaryIndexSliceParser.java    | 16 +++--
 .../query/ir/result/SliceParser.java            |  4 +-
 .../query/ir/result/StaticIdIterator.java       |  2 +-
 .../persistence/query/ir/result/UUIDColumn.java | 50 +++++++++++++
 .../query/ir/result/UUIDIndexSliceParser.java   | 13 ++--
 .../query/ir/result/UnionIterator.java          | 42 ++---------
 .../query/ir/result/AbstractScanColumnTest.java |  2 +-
 24 files changed, 411 insertions(+), 143 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/QueryProcessor.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/QueryProcessor.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/QueryProcessor.java
index 78392a4..f55aa67 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/QueryProcessor.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/QueryProcessor.java
@@ -267,11 +267,12 @@ public class QueryProcessor {
             return null;
         }
 
-        //use the gather iterator to collect all the
+        //use the gather iterator to collect all the          '
+        final int resultSetSize = Math.min( size, Query.MAX_LIMIT );
 
-        ResultIterator itr = new GatherIterator(rootNode, searchVisitorFactory.createVisitors()  );
+        ResultIterator itr = new GatherIterator(resultSetSize, rootNode, searchVisitorFactory.createVisitors()  );
 
-        List<ScanColumn> entityIds = new ArrayList<ScanColumn>( Math.min( size, Query.MAX_LIMIT ) );
+        List<ScanColumn> entityIds = new ArrayList<ScanColumn>( );
 
         CursorCache resultsCursor = new CursorCache();
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/RelationManagerImpl.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/RelationManagerImpl.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/RelationManagerImpl.java
index 0e5011f..977dad0 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/RelationManagerImpl.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/RelationManagerImpl.java
@@ -58,7 +58,9 @@ import org.apache.usergrid.persistence.geo.EntityLocationRef;
 import org.apache.usergrid.persistence.hector.CountingMutator;
 import org.apache.usergrid.persistence.query.ir.QuerySlice;
 import org.apache.usergrid.persistence.query.ir.result.CollectionResultsLoaderFactory;
+import org.apache.usergrid.persistence.query.ir.result.CollectionSearchVisitorFactory;
 import org.apache.usergrid.persistence.query.ir.result.ConnectionResultsLoaderFactory;
+import org.apache.usergrid.persistence.query.ir.result.ConnectionSearchVisitorFactory;
 import org.apache.usergrid.persistence.query.ir.result.ConnectionTypesIterator;
 import org.apache.usergrid.persistence.query.ir.result.SearchCollectionVisitor;
 import org.apache.usergrid.persistence.query.ir.result.SearchConnectionVisitor;
@@ -1720,9 +1722,11 @@ public class RelationManagerImpl implements RelationManager {
         // we have something to search with, visit our tree and evaluate the
         // results
         QueryProcessor qp = new QueryProcessor( query, collection, em, factory );
-        SearchCollectionVisitor visitor = new SearchCollectionVisitor( this, qp );
 
-        return qp.getResults( visitor );
+        CollectionSearchVisitorFactory collectionSearchVisitorFactory = new CollectionSearchVisitorFactory( cass, indexBucketLocator, qp, applicationId, headEntity, collectionName );
+//        SearchCollectionVisitor visitor = new SearchCollectionVisitor( this, qp );
+
+        return qp.getResults( collectionSearchVisitorFactory );
     }
 
 
@@ -1914,9 +1918,12 @@ public class RelationManagerImpl implements RelationManager {
         final ConnectionResultsLoaderFactory factory = new ConnectionResultsLoaderFactory( connectionRef );
 
         QueryProcessor qp = new QueryProcessor( query, null, em, factory );
-        SearchConnectionVisitor visitor = new SearchConnectionVisitor( this, qp, connectionRef, true );
 
-        return qp.getResults( visitor );
+        ConnectionSearchVisitorFactory collectionSearchVisitorFactory = new ConnectionSearchVisitorFactory( cass, indexBucketLocator, qp, applicationId, headEntity, connectionRef, true, "" );
+
+//        SearchConnectionVisitor visitor = new SearchConnectionVisitor( this, qp, connectionRef, true );
+
+        return qp.getResults( collectionSearchVisitorFactory );
     }
 
 
@@ -1956,9 +1963,13 @@ public class RelationManagerImpl implements RelationManager {
         final ConnectionResultsLoaderFactory factory = new ConnectionResultsLoaderFactory( connectionRef );
 
         QueryProcessor qp = new QueryProcessor( query, null, em, factory );
-        SearchConnectionVisitor visitor = new SearchConnectionVisitor( this, qp, connectionRef, false );
 
-        return qp.getResults( visitor );
+
+        ConnectionSearchVisitorFactory collectionSearchVisitorFactory = new ConnectionSearchVisitorFactory( cass, indexBucketLocator, qp, applicationId, headEntity, connectionRef, false, "" );
+
+//        SearchConnectionVisitor visitor = new SearchConnectionVisitor( this, qp, connectionRef, false );
+
+        return qp.getResults( collectionSearchVisitorFactory );
 	}
 
 
@@ -1995,9 +2006,12 @@ public class RelationManagerImpl implements RelationManager {
         final ConnectionResultsLoaderFactory factory = new ConnectionResultsLoaderFactory( connectionRef );
 
         QueryProcessor qp = new QueryProcessor( query, null, em, factory );
-        SearchConnectionVisitor visitor = new SearchConnectionVisitor( this, qp, connectionRef, true );
 
-        return qp.getResults( visitor );
+        ConnectionSearchVisitorFactory collectionSearchVisitorFactory = new ConnectionSearchVisitorFactory( cass, indexBucketLocator, qp, applicationId, headEntity, connectionRef, false, "" );
+
+//        SearchConnectionVisitor visitor = new SearchConnectionVisitor( this, qp, connectionRef, true );
+
+        return qp.getResults( collectionSearchVisitorFactory );
     }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/DynamicCompositeComparator.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/DynamicCompositeComparator.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/DynamicCompositeComparator.java
new file mode 100644
index 0000000..436c3fd
--- /dev/null
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/DynamicCompositeComparator.java
@@ -0,0 +1,43 @@
+/*
+ * 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.usergrid.persistence.cassandra.index;
+
+
+import java.nio.ByteBuffer;
+import java.util.Comparator;
+
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.db.marshal.TypeParser;
+
+import org.apache.usergrid.persistence.cassandra.ApplicationCF;
+
+
+public abstract class DynamicCompositeComparator implements Comparator<ByteBuffer> {
+    @SuppressWarnings("rawtypes")
+    protected final AbstractType dynamicComposite;
+
+
+    protected DynamicCompositeComparator( ApplicationCF cf ) {
+        // should never happen, this will blow up during development if this fails
+        try {
+            dynamicComposite = TypeParser.parse( cf.getComparator() );
+        }
+        catch ( Exception e ) {
+            throw new RuntimeException( e );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/DynamicCompositeForwardComparator.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/DynamicCompositeForwardComparator.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/DynamicCompositeForwardComparator.java
new file mode 100644
index 0000000..a61d422
--- /dev/null
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/DynamicCompositeForwardComparator.java
@@ -0,0 +1,40 @@
+/*
+ * 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.usergrid.persistence.cassandra.index;
+
+
+import java.nio.ByteBuffer;
+
+import org.apache.usergrid.persistence.cassandra.ApplicationCF;
+
+
+class DynamicCompositeForwardComparator extends DynamicCompositeComparator {
+
+    /**
+     * @param cf
+     */
+    protected DynamicCompositeForwardComparator( ApplicationCF cf ) {
+        super( cf );
+    }
+
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public int compare( ByteBuffer o1, ByteBuffer o2 ) {
+        return dynamicComposite.compare( o1, o2 );
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/DynamicCompositeReverseComparator.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/DynamicCompositeReverseComparator.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/DynamicCompositeReverseComparator.java
new file mode 100644
index 0000000..4ff333a
--- /dev/null
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/DynamicCompositeReverseComparator.java
@@ -0,0 +1,39 @@
+/*
+ * 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.usergrid.persistence.cassandra.index;
+
+
+import java.nio.ByteBuffer;
+
+import org.apache.usergrid.persistence.cassandra.ApplicationCF;
+
+
+class DynamicCompositeReverseComparator extends DynamicCompositeComparator {
+    /**
+     * @param cf
+     */
+    protected DynamicCompositeReverseComparator( ApplicationCF cf ) {
+        super( cf );
+    }
+
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public int compare( ByteBuffer o1, ByteBuffer o2 ) {
+        return dynamicComposite.compare( o2, o1 );
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/IndexMultiBucketSetLoader.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/IndexMultiBucketSetLoader.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/IndexMultiBucketSetLoader.java
index 30b54ba..a90f890 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/IndexMultiBucketSetLoader.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/IndexMultiBucketSetLoader.java
@@ -27,9 +27,6 @@ import java.util.UUID;
 import org.apache.usergrid.persistence.cassandra.ApplicationCF;
 import org.apache.usergrid.persistence.cassandra.CassandraService;
 
-import org.apache.cassandra.db.marshal.AbstractType;
-import org.apache.cassandra.db.marshal.TypeParser;
-
 import me.prettyprint.hector.api.beans.HColumn;
 
 
@@ -84,56 +81,4 @@ public class IndexMultiBucketSetLoader {
 
         return resultsTree;
     }
-
-
-    private static abstract class DynamicCompositeComparator implements Comparator<ByteBuffer> {
-        @SuppressWarnings("rawtypes")
-        protected final AbstractType dynamicComposite;
-
-
-        protected DynamicCompositeComparator( ApplicationCF cf ) {
-            // should never happen, this will blow up during development if this fails
-            try {
-                dynamicComposite = TypeParser.parse( cf.getComparator() );
-            }
-            catch ( Exception e ) {
-                throw new RuntimeException( e );
-            }
-        }
-    }
-
-
-    private static class DynamicCompositeForwardComparator extends DynamicCompositeComparator {
-
-        /**
-         * @param cf
-         */
-        protected DynamicCompositeForwardComparator( ApplicationCF cf ) {
-            super( cf );
-        }
-
-
-        @SuppressWarnings("unchecked")
-        @Override
-        public int compare( ByteBuffer o1, ByteBuffer o2 ) {
-            return dynamicComposite.compare( o1, o2 );
-        }
-    }
-
-
-    private static class DynamicCompositeReverseComparator extends DynamicCompositeComparator {
-        /**
-         * @param cf
-         */
-        protected DynamicCompositeReverseComparator( ApplicationCF cf ) {
-            super( cf );
-        }
-
-
-        @SuppressWarnings("unchecked")
-        @Override
-        public int compare( ByteBuffer o1, ByteBuffer o2 ) {
-            return dynamicComposite.compare( o2, o1 );
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/NoOpIndexScanner.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/NoOpIndexScanner.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/NoOpIndexScanner.java
index 3d1b9d7..01002d6 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/NoOpIndexScanner.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/index/NoOpIndexScanner.java
@@ -19,8 +19,7 @@ package org.apache.usergrid.persistence.cassandra.index;
 
 import java.nio.ByteBuffer;
 import java.util.Iterator;
-import java.util.NavigableSet;
-import java.util.Set;
+import java.util.List;
 
 import me.prettyprint.hector.api.beans.HColumn;
 
@@ -44,7 +43,7 @@ public class NoOpIndexScanner implements IndexScanner {
      * @see java.lang.Iterable#iterator()
      */
     @Override
-    public Iterator<Set<HColumn<ByteBuffer, ByteBuffer>>> iterator() {
+    public Iterator<List<HColumn<ByteBuffer, ByteBuffer>>> iterator() {
         return this;
     }
 
@@ -71,7 +70,7 @@ public class NoOpIndexScanner implements IndexScanner {
      * @see java.util.Iterator#next()
      */
     @Override
-    public NavigableSet<HColumn<ByteBuffer, ByteBuffer>> next() {
+    public List<HColumn<ByteBuffer, ByteBuffer>> next() {
         return null;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/geo/EntityLocationRef.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/geo/EntityLocationRef.java b/stack/core/src/main/java/org/apache/usergrid/persistence/geo/EntityLocationRef.java
index 59db1d9..05db619 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/geo/EntityLocationRef.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/geo/EntityLocationRef.java
@@ -30,7 +30,7 @@ import static org.apache.usergrid.utils.StringUtils.stringOrSubstringAfterLast;
 import static org.apache.usergrid.utils.StringUtils.stringOrSubstringBeforeFirst;
 
 
-public class EntityLocationRef implements EntityRef {
+public class EntityLocationRef implements EntityRef, Comparable<EntityLocationRef> {
 
     private UUID uuid;
 
@@ -45,10 +45,6 @@ public class EntityLocationRef implements EntityRef {
     private double distance;
 
 
-    public EntityLocationRef() {
-    }
-
-
     public EntityLocationRef( EntityRef entity, double latitude, double longitude ) {
         this( entity.getType(), entity.getUuid(), latitude, longitude );
     }
@@ -224,4 +220,19 @@ public class EntityLocationRef implements EntityRef {
         }
         return true;
     }
+
+
+    /**
+     * Compares 2 locations by comparing their distance
+     * @param other
+     * @return
+     */
+    @Override
+    public int compareTo( final EntityLocationRef other ) {
+        if(other == null){
+            return 1;
+        }
+
+        return Double.compare( distance, other.distance );
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/SearchVisitor.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/SearchVisitor.java b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/SearchVisitor.java
index 0512cb2..410b99f 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/SearchVisitor.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/SearchVisitor.java
@@ -162,7 +162,7 @@ public abstract class SearchVisitor implements NodeVisitor {
 
         final int nodeId = node.getId();
 
-        UnionIterator union = new UnionIterator( queryProcessor.getPageSizeHint( node ), nodeId, queryProcessor.getCursorCache(nodeId  ) );
+        UnionIterator union = new UnionIterator( queryProcessor.getPageSizeHint( node ), nodeId, queryProcessor.getCursorCache( nodeId ) );
 
         if ( left != null ) {
             union.addIterator( left );

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/AbstractScanColumn.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/AbstractScanColumn.java b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/AbstractScanColumn.java
index fc4a1d6..e4515fb 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/AbstractScanColumn.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/AbstractScanColumn.java
@@ -21,6 +21,8 @@ import java.nio.ByteBuffer;
 import java.util.UUID;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import org.apache.usergrid.persistence.cassandra.index.DynamicCompositeComparator;
+
 
 /**
  *
@@ -31,11 +33,14 @@ public abstract class AbstractScanColumn implements ScanColumn {
 
     private final UUID uuid;
     private final ByteBuffer buffer;
+    private final DynamicCompositeComparator cfComparator;
+    private ScanColumn child;
 
 
-    protected AbstractScanColumn( UUID uuid, ByteBuffer buffer ) {
+    protected AbstractScanColumn( final UUID uuid, final ByteBuffer columnNameBuffer, final DynamicCompositeComparator cfComparator ) {
         this.uuid = uuid;
-        this.buffer = buffer;
+        this.buffer = columnNameBuffer;
+        this.cfComparator = cfComparator;
     }
 
 
@@ -80,4 +85,37 @@ public abstract class AbstractScanColumn implements ScanColumn {
                 ", buffer=" + ByteBufferUtil.bytesToHex( buffer ) +
                 '}';
     }
+
+
+    @Override
+    public void setChild( final ScanColumn childColumn ) {
+      this.child = childColumn;
+    }
+
+
+    @Override
+    public ScanColumn getChild() {
+        return child;
+    }
+
+
+    @Override
+    public int compareTo( final ScanColumn otherScanColumn ) {
+
+        if(otherScanColumn == null){
+            return 1;
+        }
+
+
+        final int compare = cfComparator.compare( buffer, otherScanColumn.getCursorValue() );
+
+        //equal, recurse.  otherScanColumn is implicitly not null from above check
+        if(compare == 0 && child != null){
+            return child.compareTo( otherScanColumn.getChild() );
+        }
+
+
+        return 0;
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/ConnectionIndexSliceParser.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/ConnectionIndexSliceParser.java b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/ConnectionIndexSliceParser.java
index 33822f5..ae3b0b5 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/ConnectionIndexSliceParser.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/ConnectionIndexSliceParser.java
@@ -21,6 +21,7 @@ import java.nio.ByteBuffer;
 import java.util.UUID;
 
 import org.apache.usergrid.persistence.Schema;
+import org.apache.usergrid.persistence.cassandra.index.DynamicCompositeComparator;
 
 import me.prettyprint.hector.api.beans.DynamicComposite;
 
@@ -45,7 +46,7 @@ public class ConnectionIndexSliceParser implements SliceParser {
      * @see org.apache.usergrid.persistence.query.ir.result.SliceParser#parse(java.nio.ByteBuffer)
      */
     @Override
-    public ScanColumn parse( ByteBuffer buff ) {
+    public ScanColumn parse( ByteBuffer buff, final DynamicCompositeComparator cfComparator ) {
         DynamicComposite composite = DynamicComposite.fromByteBuffer( buff.duplicate() );
 
         String connectedType = ( String ) composite.get( 1 );
@@ -62,19 +63,20 @@ public class ConnectionIndexSliceParser implements SliceParser {
             return null;
         }
 
-        return new ConnectionColumn( ( UUID ) composite.get( 0 ), connectedType, buff );
+        return new ConnectionColumn( ( UUID ) composite.get( 0 ), connectedType, buff , cfComparator);
         //    return composite;
         //    return null;
     }
 
 
+
     public static class ConnectionColumn extends AbstractScanColumn {
 
         private final String connectedType;
 
 
-        public ConnectionColumn( UUID uuid, String connectedType, ByteBuffer column ) {
-            super( uuid, column );
+        public ConnectionColumn( UUID uuid, String connectedType, ByteBuffer column, final DynamicCompositeComparator cfComparator ) {
+            super( uuid, column, cfComparator );
             this.connectedType = connectedType;
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/ConnectionSearchVisitorFactory.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/ConnectionSearchVisitorFactory.java b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/ConnectionSearchVisitorFactory.java
index c1ec724..54eeb01 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/ConnectionSearchVisitorFactory.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/ConnectionSearchVisitorFactory.java
@@ -42,7 +42,7 @@ public class ConnectionSearchVisitorFactory implements SearchVisitorFactory {
     private final String[] prefix;
 
 
-    private ConnectionSearchVisitorFactory( final CassandraService cassandraService,
+    public ConnectionSearchVisitorFactory( final CassandraService cassandraService,
                                             final IndexBucketLocator indexBucketLocator,
                                             final QueryProcessor queryProcessor, final UUID applicationId,
                                             final EntityRef headEntity, ConnectionRefImpl connectionRef,

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/GatherIterator.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/GatherIterator.java b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/GatherIterator.java
index 48e2301..29912cc 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/GatherIterator.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/GatherIterator.java
@@ -3,9 +3,13 @@ package org.apache.usergrid.persistence.query.ir.result;
 
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.NoSuchElementException;
 import java.util.Set;
+import java.util.TreeSet;
 import java.util.UUID;
 
+import org.apache.usergrid.persistence.ResultsIterator;
 import org.apache.usergrid.persistence.cassandra.CursorCache;
 import org.apache.usergrid.persistence.query.ir.QueryNode;
 import org.apache.usergrid.persistence.query.ir.SearchVisitor;
@@ -19,9 +23,14 @@ public class GatherIterator implements ResultIterator {
 
     private final Collection<SearchVisitor> searchVisitors;
     private final QueryNode rootNode;
+    private final int pageSize;
 
 
-    public GatherIterator(  final QueryNode rootNode, final Collection<SearchVisitor> searchVisitors) {
+    private Set<ScanColumn> next;
+
+
+    public GatherIterator(final int pageSize, final QueryNode rootNode, final Collection<SearchVisitor> searchVisitors) {
+        this.pageSize = pageSize;
         this.rootNode = rootNode;
         this.searchVisitors = searchVisitors;
     }
@@ -47,12 +56,73 @@ public class GatherIterator implements ResultIterator {
 
     @Override
     public boolean hasNext() {
-        return false;
+
+        if(next() == null){
+            advance();
+        }
+
+        return next != null;
     }
 
 
     @Override
     public Set<ScanColumn> next() {
-        return null;
+        if(!hasNext()){
+            throw new NoSuchElementException( "No more elements" );
+        }
+
+        final Set<ScanColumn> results = next;
+        next = null;
+        return results;
+    }
+
+
+    /**
+     * Advance the iterator
+     */
+    private void advance(){
+        //TODO make this concurrent
+
+
+        final TreeSet<ScanColumn> results = new TreeSet<ScanColumn>(  );
+
+
+        for(SearchVisitor visitor: searchVisitors){
+              merge(results, visitor);
+        }
+
+        this.next = results;
+    }
+
+
+    /**
+     * Merge this interator into our final column results
+     * @param results
+     * @param visitor
+     */
+    private void merge(final TreeSet<ScanColumn> results, final SearchVisitor visitor){
+
+        final ResultIterator iterator = visitor.getResults();
+
+
+        //nothing to do, return
+        if( !iterator.hasNext()){
+            return;
+        }
+
+
+        final Iterator<ScanColumn> nextPage = iterator.next().iterator();
+
+
+        //only take from the iterator what we need to create a full page.
+        for(int i = 0 ; i < pageSize && nextPage.hasNext(); i ++){
+            results.add( nextPage.next() );
+
+            //results are too large, trim them
+            if(results.size() > pageSize){
+                results.pollLast();
+            }
+        }
+
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/GeoIterator.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/GeoIterator.java b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/GeoIterator.java
index 92f6f03..4ecbb5a 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/GeoIterator.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/GeoIterator.java
@@ -308,6 +308,7 @@ public class GeoIterator implements ResultIterator {
     private class LocationScanColumn implements ScanColumn {
 
         private final EntityLocationRef location;
+        private ScanColumn child;
 
 
         public LocationScanColumn( EntityLocationRef location ) {
@@ -329,6 +330,18 @@ public class GeoIterator implements ResultIterator {
 
 
         @Override
+        public void setChild( final ScanColumn childColumn ) {
+             this.child = childColumn;
+        }
+
+
+        @Override
+        public ScanColumn getChild() {
+            return this.child;
+        }
+
+
+        @Override
         public boolean equals( Object o ) {
             if ( this == o ) {
                 return true;
@@ -347,5 +360,16 @@ public class GeoIterator implements ResultIterator {
         public int hashCode() {
             return location.getUuid().hashCode();
         }
+
+
+        @Override
+        public int compareTo( final ScanColumn o ) {
+
+            if(!(o instanceof LocationScanColumn)){
+                throw new UnsupportedOperationException( "Cannot compare another ScanColumn that is not an instance of LocationScanColumn" );
+            }
+
+            return this.location.compareTo( ((LocationScanColumn)o).location );
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/ScanColumn.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/ScanColumn.java b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/ScanColumn.java
index 289fe86..18277e4 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/ScanColumn.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/ScanColumn.java
@@ -20,13 +20,30 @@ package org.apache.usergrid.persistence.query.ir.result;
 import java.nio.ByteBuffer;
 import java.util.UUID;
 
+import org.apache.usergrid.persistence.cassandra.index.DynamicCompositeComparator;
+
 
 /** An interface that represents a column */
-public interface ScanColumn {
+public interface ScanColumn extends Comparable<ScanColumn> {
 
     /** Get the uuid from the column */
-    public UUID getUUID();
+    UUID getUUID();
 
     /** Get the cursor value of this column */
-    public ByteBuffer getCursorValue();
+    ByteBuffer getCursorValue();
+
+    /**
+     * Append the child column used in tree iterator to this column, along with the comparator used to compare them
+     *
+     * for instance, a term search of A = 1 AND B = 2 would generate a ScanColumn of A-- child -> B
+     * @param childColumn
+     */
+    void setChild( final ScanColumn childColumn );
+
+    /**
+     * Returns the childl column if present, can return null
+     * @return
+     */
+    ScanColumn getChild();
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SearchCollectionVisitor.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SearchCollectionVisitor.java b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SearchCollectionVisitor.java
index 61315e4..20d303c 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SearchCollectionVisitor.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SearchCollectionVisitor.java
@@ -95,7 +95,7 @@ public class SearchCollectionVisitor extends SearchVisitor {
         UUID startId = null;
 
         if ( slice.hasCursor() ) {
-            startId = UUID_PARSER.parse( slice.getCursor() ).getUUID();
+            startId = UUID_PARSER.parse( slice.getCursor(), null ).getUUID();
         }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SearchConnectionVisitor.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SearchConnectionVisitor.java b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SearchConnectionVisitor.java
index da99cdf..74ff19f 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SearchConnectionVisitor.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SearchConnectionVisitor.java
@@ -82,7 +82,7 @@ public class SearchConnectionVisitor extends SearchVisitor {
         // operation
         queryProcessor.applyCursorAndSort( slice );
 
-        IndexScanner columns = null;
+        final IndexScanner columns;
 
         if ( slice.isComplete() ) {
             columns = new NoOpIndexScanner();

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SecondaryIndexSliceParser.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SecondaryIndexSliceParser.java b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SecondaryIndexSliceParser.java
index ea093e6..c13ac0d 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SecondaryIndexSliceParser.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SecondaryIndexSliceParser.java
@@ -20,6 +20,8 @@ package org.apache.usergrid.persistence.query.ir.result;
 import java.nio.ByteBuffer;
 import java.util.UUID;
 
+import org.apache.usergrid.persistence.cassandra.index.DynamicCompositeComparator;
+
 import me.prettyprint.hector.api.beans.DynamicComposite;
 
 
@@ -35,20 +37,22 @@ public class SecondaryIndexSliceParser implements SliceParser {
      * @see org.apache.usergrid.persistence.query.ir.result.SliceParser#parse(java.nio.ByteBuffer)
      */
     @Override
-    public ScanColumn parse( ByteBuffer buff ) {
+    public ScanColumn parse( ByteBuffer buff, final DynamicCompositeComparator cfComparator ) {
         DynamicComposite composite = DynamicComposite.fromByteBuffer( buff.duplicate() );
 
-        return new SecondaryIndexColumn( ( UUID ) composite.get( 2 ), composite.get( 1 ), buff );
+        return new SecondaryIndexColumn( ( UUID ) composite.get( 2 ), composite.get( 1 ), buff, cfComparator );
     }
 
 
+
+
     public static class SecondaryIndexColumn extends AbstractScanColumn {
 
         private final Object value;
 
 
-        public SecondaryIndexColumn( UUID uuid, Object value, ByteBuffer buff ) {
-            super( uuid, buff );
+        public SecondaryIndexColumn( final UUID uuid, final Object value, final ByteBuffer columnNameBuffer, final DynamicCompositeComparator cfComparator  ) {
+            super( uuid, columnNameBuffer, cfComparator );
             this.value = value;
         }
 
@@ -57,5 +61,9 @@ public class SecondaryIndexSliceParser implements SliceParser {
         public Object getValue() {
             return this.value;
         }
+
+
+
+
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SliceParser.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SliceParser.java b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SliceParser.java
index d1ce6a1..8e5bc53 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SliceParser.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/SliceParser.java
@@ -19,6 +19,8 @@ package org.apache.usergrid.persistence.query.ir.result;
 
 import java.nio.ByteBuffer;
 
+import org.apache.usergrid.persistence.cassandra.index.DynamicCompositeComparator;
+
 
 /**
  * Interface to parse and compare range slices
@@ -28,5 +30,5 @@ import java.nio.ByteBuffer;
 public interface SliceParser {
 
     /** Parse the slice and return it's parse type.  If null is returned, the column should be considered discarded */
-    public ScanColumn parse( ByteBuffer buff );
+    public ScanColumn parse(final  ByteBuffer columnNameBytes, final DynamicCompositeComparator cfComparator  );
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/StaticIdIterator.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/StaticIdIterator.java b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/StaticIdIterator.java
index e04ac6c..055839e 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/StaticIdIterator.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/StaticIdIterator.java
@@ -38,7 +38,7 @@ public class StaticIdIterator implements ResultIterator {
      *
      */
     public StaticIdIterator( UUID id ) {
-        final ScanColumn col = new UUIDIndexSliceParser.UUIDColumn( id, ByteBuffer.allocate( 0 ) );
+        final ScanColumn col = new UUIDColumn( id );
 
         ids = Collections.singleton( col );
     }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/UUIDColumn.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/UUIDColumn.java b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/UUIDColumn.java
new file mode 100644
index 0000000..ff05fe5
--- /dev/null
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/UUIDColumn.java
@@ -0,0 +1,50 @@
+package org.apache.usergrid.persistence.query.ir.result;
+
+
+import java.nio.ByteBuffer;
+import java.util.UUID;
+
+import org.apache.usergrid.utils.UUIDUtils;
+
+
+/**
+ * Used as a comparator for columns
+ */
+class UUIDColumn implements  ScanColumn{
+
+    private final UUID uuid;
+    private ScanColumn child;
+
+
+    UUIDColumn( final UUID uuid ) {this.uuid = uuid;}
+
+
+    @Override
+    public UUID getUUID() {
+        return uuid;
+    }
+
+
+    @Override
+    public ByteBuffer getCursorValue() {
+        return null;
+    }
+
+
+    @Override
+    public void setChild( final ScanColumn childColumn ) {
+        this.child = childColumn;
+    }
+
+
+    @Override
+    public ScanColumn getChild() {
+        return child;
+    }
+
+
+    @Override
+    public int compareTo( final ScanColumn other ) {
+        return UUIDUtils.compare( uuid, other.getUUID() );
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/UUIDIndexSliceParser.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/UUIDIndexSliceParser.java b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/UUIDIndexSliceParser.java
index 4b98cc7..d966cc8 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/UUIDIndexSliceParser.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/UUIDIndexSliceParser.java
@@ -20,6 +20,8 @@ package org.apache.usergrid.persistence.query.ir.result;
 import java.nio.ByteBuffer;
 import java.util.UUID;
 
+import org.apache.usergrid.persistence.cassandra.index.DynamicCompositeComparator;
+
 import static org.apache.usergrid.persistence.cassandra.Serializers.*;
 
 /**
@@ -33,15 +35,8 @@ public class UUIDIndexSliceParser implements SliceParser {
      * @see org.apache.usergrid.persistence.query.ir.result.SliceParser#parse(java.nio.ByteBuffer)
      */
     @Override
-    public ScanColumn parse( ByteBuffer buff ) {
-        return new UUIDColumn( ue.fromByteBuffer( buff.duplicate() ), buff );
+    public ScanColumn parse( ByteBuffer buff, final DynamicCompositeComparator cfComparator ) {
+        return new UUIDColumn( ue.fromByteBuffer( buff.duplicate() ) );
     }
 
-
-    public static class UUIDColumn extends AbstractScanColumn {
-
-        public UUIDColumn( UUID uuid, ByteBuffer buffer ) {
-            super( uuid, buffer );
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/UnionIterator.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/UnionIterator.java b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/UnionIterator.java
index ea7b3f6..916091c 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/UnionIterator.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/query/ir/result/UnionIterator.java
@@ -21,14 +21,12 @@ import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.UUID;
 
 import org.apache.usergrid.persistence.cassandra.CursorCache;
-import org.apache.usergrid.utils.UUIDUtils;
 
 import static org.apache.usergrid.persistence.cassandra.Serializers.*;
 
@@ -39,8 +37,6 @@ import static org.apache.usergrid.persistence.cassandra.Serializers.*;
  */
 public class UnionIterator extends MultiIterator {
 
-    private static final ScanColumnComparator COMP = new ScanColumnComparator();
-
     private SortedColumnList list;
 
     private final int id;
@@ -133,14 +129,11 @@ public class UnionIterator extends MultiIterator {
      */
     public static final class SortedColumnList {
 
-        private static final ScanColumnComparator COMP = new ScanColumnComparator();
-
         private final int maxSize;
 
         private final List<ScanColumn> list;
 
-
-        private ScanColumn min;
+        private UUIDColumn min;
 
 
         public SortedColumnList( final int maxSize, final UUID minUuid ) {
@@ -149,7 +142,7 @@ public class UnionIterator extends MultiIterator {
             this.maxSize = maxSize;
 
             if ( minUuid != null ) {
-                min = new AbstractScanColumn( minUuid, null ) {};
+                min = new UUIDColumn( minUuid) ;
             }
         }
 
@@ -159,11 +152,11 @@ public class UnionIterator extends MultiIterator {
          */
         public void add( ScanColumn col ) {
             //less than our min, don't add
-            if ( COMP.compare( min, col ) >= 0 ) {
+            if ( min != null && min.compareTo( col ) >= 0 ) {
                 return;
             }
 
-            int index = Collections.binarySearch( this.list, col, COMP );
+            int index = Collections.binarySearch( this.list, col );
 
             //already present
             if ( index > -1 ) {
@@ -221,7 +214,8 @@ public class UnionIterator extends MultiIterator {
                 return;
             }
 
-            min = this.list.get( size - 1 );
+            final UUID oldMin = this.list.get( size - 1 ).getUUID();
+            min = new UUIDColumn( oldMin );
         }
 
 
@@ -237,28 +231,4 @@ public class UnionIterator extends MultiIterator {
             this.min = null;
         }
     }
-
-
-    /**
-     * Simple comparator for comparing scan columns.  Orders them by time uuid
-     */
-    private static class ScanColumnComparator implements Comparator<ScanColumn> {
-
-        @Override
-        public int compare( final ScanColumn o1, final ScanColumn o2 ) {
-            if ( o1 == null ) {
-                if ( o2 == null ) {
-                    return 0;
-                }
-
-                return -1;
-            }
-
-            else if ( o2 == null ) {
-                return 1;
-            }
-
-            return UUIDUtils.compare( o1.getUUID(), o2.getUUID() );
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/1fe69065/stack/core/src/test/java/org/apache/usergrid/persistence/query/ir/result/AbstractScanColumnTest.java
----------------------------------------------------------------------
diff --git a/stack/core/src/test/java/org/apache/usergrid/persistence/query/ir/result/AbstractScanColumnTest.java b/stack/core/src/test/java/org/apache/usergrid/persistence/query/ir/result/AbstractScanColumnTest.java
index d478942..45e7f50 100644
--- a/stack/core/src/test/java/org/apache/usergrid/persistence/query/ir/result/AbstractScanColumnTest.java
+++ b/stack/core/src/test/java/org/apache/usergrid/persistence/query/ir/result/AbstractScanColumnTest.java
@@ -94,7 +94,7 @@ public class AbstractScanColumnTest {
     private class TestScanColumn extends AbstractScanColumn {
 
         protected TestScanColumn( final UUID uuid, final ByteBuffer buffer ) {
-            super( uuid, buffer );
+            super( uuid, buffer, cfComparator );
         }
     }
 }