Merge pull request #16 from usergrid/USERGRID-2855-pagingtesting

Usergrid 2855 pagingtesting
diff --git a/stack/core/src/main/java/org/usergrid/persistence/cassandra/RelationManagerImpl.java b/stack/core/src/main/java/org/usergrid/persistence/cassandra/RelationManagerImpl.java
index f77590a..4f565c7 100644
--- a/stack/core/src/main/java/org/usergrid/persistence/cassandra/RelationManagerImpl.java
+++ b/stack/core/src/main/java/org/usergrid/persistence/cassandra/RelationManagerImpl.java
@@ -1997,7 +1997,6 @@
      * @param targetEntity The target entity to search edges in
      * @param connectionType The type of connection.  If not specified, all connections are returned
      * @param connectedEntityType The connected entity type, if not specified all types are returned
-     * @param resultsLevel The results level to return
      * @param count result limit
      */
 	private Results getConnectingEntities(EntityRef targetEntity,
diff --git a/stack/core/src/main/java/org/usergrid/persistence/cassandra/index/IndexScanner.java b/stack/core/src/main/java/org/usergrid/persistence/cassandra/index/IndexScanner.java
index 96e162f..d87f37a 100644
--- a/stack/core/src/main/java/org/usergrid/persistence/cassandra/index/IndexScanner.java
+++ b/stack/core/src/main/java/org/usergrid/persistence/cassandra/index/IndexScanner.java
@@ -35,4 +35,5 @@
     public void reset();
 
     public int getPageSize();
+
 }
diff --git a/stack/core/src/main/java/org/usergrid/persistence/query/ir/result/SliceIterator.java b/stack/core/src/main/java/org/usergrid/persistence/query/ir/result/SliceIterator.java
index 205e8f4..6cc833d 100644
--- a/stack/core/src/main/java/org/usergrid/persistence/query/ir/result/SliceIterator.java
+++ b/stack/core/src/main/java/org/usergrid/persistence/query/ir/result/SliceIterator.java
@@ -49,16 +49,26 @@
     private final int pageSize;
     private final boolean skipFirst;
 
-    /** Pointer to the uuid set until it's returned */
+    /**
+     * Pointer to the uuid set until it's returned
+     */
     private Set<ScanColumn> lastResult;
 
-    /** The pointer to the last set of parsed columns */
+    /**
+     * The pointer to the last set of parsed columns
+     */
     private Set<ScanColumn> parsedCols;
 
-    /** counter that's incremented as we load pages. If pages loaded = 1 when reset,
-     * we don't have to reload from cass */
+    /**
+     * counter that's incremented as we load pages. If pages loaded = 1 when reset, we don't have to reload from cass
+     */
     private int pagesLoaded = 0;
 
+    /**
+     * Pointer to the last column we parsed
+     */
+    private ScanColumn last;
+
 
     /**
      * @param scanner The scanner to use to read the cols
@@ -132,6 +142,7 @@
                 continue;
             }
 
+            last = parsed;
             cols.put( parsed.getUUID(), parsed );
             parsedCols.add( parsed );
         }
@@ -195,14 +206,41 @@
     public void finalizeCursor( CursorCache cache, UUID lastLoaded ) {
         final int sliceHash = slice.hashCode();
 
-        final ScanColumn col = cols.get( lastLoaded );
+        ByteBuffer bytes = null;
 
-        if(col == null){
-            logger.error( "An iterator attempted to access a slice that was not iterated over.  This will result in the cursor construction failing" );
-            throw new QueryIterationException( "An iterator attempted to access a slice that was not iterated over.  This will result in the cursor construction failing" );
+        ScanColumn col = cols.get( lastLoaded );
+
+
+        //the column came from the current page
+        if ( col != null ) {
+            bytes = col.getCursorValue();
+        }
+        else {
+
+            //check if we reached the end of our iterator.  If we did, set the last value into the cursor.  Otherwise
+            //this is a bug
+            if ( scanner.hasNext() ) {
+                logger.error(
+                        "An iterator attempted to access a slice that was not iterated over.  This will result in the" +
+                                " cursor construction failing" );
+                throw new QueryIterationException(
+                        "An iterator attempted to access a slice that was not iterated over.  This will result in the" +
+                                " cursor construction failing" );
+            }
+
+            final ByteBuffer sliceCursor = slice.getCursor();
+
+            //we've never loaded anything, just re-use the existing slice
+            if (last == null && sliceCursor != null ) {
+                bytes = sliceCursor;
+            }
+
+            //use the last column we loaded.  This way our scan returns nothing next time since start == finish
+            else if(last != null) {
+                bytes = last.getCursorValue();
+            }
         }
 
-        final ByteBuffer bytes = col.getCursorValue();
 
         if ( bytes == null ) {
             return;
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/AbstractIteratingQueryIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/AbstractIteratingQueryIT.java
index b06539e..d1aed3a 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/AbstractIteratingQueryIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/AbstractIteratingQueryIT.java
@@ -1200,7 +1200,7 @@
      *
      * @author tnine
      */
-    private interface IoHelper {
+    public static interface IoHelper {
         /** Perform any setup required */
         public void doSetup() throws Exception;
 
@@ -1222,7 +1222,16 @@
     }
 
 
-    class CollectionIoHelper implements IoHelper {
+    public static  class CollectionIoHelper implements IoHelper {
+
+        protected final CoreApplication app;
+
+
+        public CollectionIoHelper( final CoreApplication app ) {
+            this.app = app;
+        }
+
+
         @Override
         public void doSetup() throws Exception {
         }
@@ -1241,7 +1250,7 @@
     }
 
 
-    class ConnectionHelper extends CollectionIoHelper {
+    public static class ConnectionHelper extends CollectionIoHelper {
 
         /**
          *
@@ -1250,6 +1259,11 @@
         protected Entity rootEntity;
 
 
+        public ConnectionHelper( final CoreApplication app) {
+            super( app );
+        }
+
+
         @Override
         public void doSetup() throws Exception {
             Map<String, Object> data = new HashMap<String, Object>();
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/AllInCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/AllInCollectionIT.java
index a191804..3c11727 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/AllInCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/AllInCollectionIT.java
@@ -23,6 +23,6 @@
 public class AllInCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void allInCollection() throws Exception {
-        allIn( new CollectionIoHelper() );
+        allIn( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/AllInConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/AllInConnectionIT.java
index aec4b38..f01323a 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/AllInConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/AllInConnectionIT.java
@@ -23,6 +23,6 @@
 public class AllInConnectionIT extends AbstractIteratingQueryIT {
     @Test
     public void allInConnection() throws Exception {
-        allIn( new ConnectionHelper() );
+        allIn( new ConnectionHelper(app) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/AllInConnectionNoTypeIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/AllInConnectionNoTypeIT.java
index a31bc51..07d4c46 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/AllInConnectionNoTypeIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/AllInConnectionNoTypeIT.java
@@ -17,6 +17,7 @@
 
 
 import org.junit.Test;
+import org.usergrid.CoreApplication;
 import org.usergrid.persistence.Query;
 import org.usergrid.persistence.Results;
 
@@ -25,19 +26,24 @@
 public class AllInConnectionNoTypeIT extends AbstractIteratingQueryIT {
     @Test
     public void allInConnectionNoType() throws Exception {
-        allIn( new ConnectionNoTypeHelper() );
+        allIn( new ConnectionNoTypeHelper(app) );
     }
 
 
     class ConnectionNoTypeHelper extends ConnectionHelper {
 
+        public ConnectionNoTypeHelper( final CoreApplication app ) {
+            super( app );
+        }
+
+
         /*
-         * (non-Javadoc)
-         *
-         * @see
-         * org.usergrid.persistence.query.SingleOrderByMaxLimitCollection.ConnectionHelper#getResults
-         * (org.usergrid.persistence.Query)
-         */
+                 * (non-Javadoc)
+                 *
+                 * @see
+                 * org.usergrid.persistence.query.SingleOrderByMaxLimitCollection.ConnectionHelper#getResults
+                 * (org.usergrid.persistence.Query)
+                 */
         @Override
         public Results getResults( Query query ) throws Exception {
             query.setConnectionType( CONNECTION );
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/IntersectionUnionPagingIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/IntersectionUnionPagingIT.java
new file mode 100644
index 0000000..5f554d3
--- /dev/null
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/IntersectionUnionPagingIT.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright 2012 Apigee Corporation
+ *
+ * Licensed 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.usergrid.persistence.query;
+
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.usergrid.persistence.Query;
+import org.usergrid.persistence.Results;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+
+/**
+ * @author tnine
+ */
+public class IntersectionUnionPagingIT extends AbstractIteratingQueryIT {
+
+    private static final Logger LOG = LoggerFactory.getLogger( IntersectionUnionPagingIT.class );
+
+    private static final String unionScan =
+            "select * where (field1Or > '00000000' OR field2Or > '00000000') AND fieldDate = '0000-00-00'";
+    private static final String scanUnion =
+            "select * where fieldDate = '0000-00-00' AND (field1Or > '00000000' OR field2Or > '00000000') ";
+    private static final int PAGE_SIZE = 100;
+
+
+    @Test
+    public void testUnionPagingCollection() throws Exception {
+
+
+        final CollectionIoHelper collectionIoHelper = new CollectionIoHelper( app );
+
+        Set<String> created = performSetup( collectionIoHelper );
+
+
+        testUnionPaging( collectionIoHelper, unionScan, created );
+        testUnionPaging( collectionIoHelper, scanUnion, created );
+    }
+
+
+    @Test
+    public void testUnionPagingConnection() throws Exception {
+
+        final ConnectionHelper connectionHelper = new ConnectionHelper( app );
+
+        Set<String> created = performSetup( connectionHelper );
+
+
+        testUnionPaging( connectionHelper, unionScan, created );
+        testUnionPaging( connectionHelper, scanUnion, created );
+    }
+
+
+    private Set<String> performSetup( final IoHelper io ) throws Exception {
+        io.doSetup();
+
+        int size = 500;
+
+        long start = System.currentTimeMillis();
+
+        LOG.info( "Writing {} entities.", size );
+
+        final String zeros = String.format( "%08d", 0 );
+
+        Set<String> names = new HashSet<String>( size );
+
+        for ( int i = 0; i < size; i++ ) {
+            Map<String, Object> entity = new HashMap<String, Object>();
+            final String name = String.valueOf( i );
+            entity.put( "name", name );
+            entity.put( "fieldDate", "0000-00-00" );
+
+            String field1;
+            String field2;
+
+            //use a value slightly smaller than page size, since we want to simulate
+            //the cursor issues with union queries
+            if ( i < PAGE_SIZE - 10 ) {
+                field1 = String.format( "%08d", i + 1 );
+                field2 = zeros;
+            }
+            else {
+                field1 = zeros;
+                field2 = String.format( "%08d", i + 1 );
+            }
+
+            names.add( name );
+
+            entity.put( "field1Or", field1 );
+            entity.put( "field2Or", field2 );
+
+            io.writeEntity( entity );
+        }
+
+        long stop = System.currentTimeMillis();
+
+        LOG.info( "Writes took {} ms", stop - start );
+
+        return Collections.unmodifiableSet( names );
+    }
+
+
+    private void testUnionPaging( final IoHelper io, final String queryString, final Set<String> expectedResults )
+            throws Exception {
+
+
+        Set<String> newSets = new HashSet<String>( expectedResults );
+
+        //our field1Or has a result size < our page size, so it shouldn't blow up when the cursor is getting created
+        //the leaf iterator should insert it's own "no value left" into the cursor
+        Query query = Query.fromQL( queryString );
+        query.setLimit( PAGE_SIZE );
+
+        Results results;
+
+        long start = System.currentTimeMillis();
+
+        do {
+
+            // now do simple ordering, should be returned in order
+            results = io.getResults( query );
+
+            for ( int i = 0; i < results.size(); i++ ) {
+                final String name = results.getEntities().get( i ).getName();
+
+                assertTrue( "Value should not be returned twice", newSets.contains( name ) );
+
+                newSets.remove( name );
+            }
+
+            query.setCursor( results.getCursor() );
+        }
+        while ( results.getCursor() != null );
+
+        long stop = System.currentTimeMillis();
+
+        LOG.info( "Query took {} ms to return {} entities", stop - start, expectedResults.size() );
+
+        assertEquals( "All names returned", 0, newSets.size() );
+    }
+}
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByCollectionIT.java
index 8a6ae17..acb78e8 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByCollectionIT.java
@@ -23,6 +23,6 @@
 public class MultiOrderByCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void multiOrderByCollection() throws Exception {
-        multiOrderBy( new CollectionIoHelper() );
+        multiOrderBy( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByComplexUnionCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByComplexUnionCollectionIT.java
index 6357a4c..93e4426 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByComplexUnionCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByComplexUnionCollectionIT.java
@@ -23,6 +23,6 @@
 public class MultiOrderByComplexUnionCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void multiOrderByComplexUnionCollection() throws Exception {
-        multiOrderByComplexUnion( new CollectionIoHelper() );
+        multiOrderByComplexUnion( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByComplexUnionConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByComplexUnionConnectionIT.java
index fd001b8..323a2ca 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByComplexUnionConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByComplexUnionConnectionIT.java
@@ -23,6 +23,6 @@
 public class MultiOrderByComplexUnionConnectionIT extends AbstractIteratingQueryIT {
     @Test
     public void multiOrderByComplexUnionConnection() throws Exception {
-        multiOrderByComplexUnion( new CollectionIoHelper() );
+        multiOrderByComplexUnion( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByConnectionIT.java
index c083f0c..b0f6905 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/MultiOrderByConnectionIT.java
@@ -26,6 +26,6 @@
 
     @Test
     public void multOrderByConnection() throws Exception {
-        multiOrderBy( new ConnectionHelper() );
+        multiOrderBy( new ConnectionHelper(app) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/NotOrderByCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/NotOrderByCollectionIT.java
index 24a0f2c..f3a0522 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/NotOrderByCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/NotOrderByCollectionIT.java
@@ -23,6 +23,6 @@
 public class NotOrderByCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void orderByWithNot() throws Exception {
-        notOrderBy( new CollectionIoHelper() );
+        notOrderBy( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/NotOrderByConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/NotOrderByConnectionIT.java
index 6ea23c8..7b4527e 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/NotOrderByConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/NotOrderByConnectionIT.java
@@ -23,6 +23,6 @@
 public class NotOrderByConnectionIT extends AbstractIteratingQueryIT {
     @Test
     public void orderByWithNot() throws Exception {
-        notOrderBy( new ConnectionHelper() );
+        notOrderBy( new ConnectionHelper(app) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanAscCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanAscCollectionIT.java
index 00f26b4..f5cb284 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanAscCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanAscCollectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderByBoundRangeScanAscCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderByBoundRangeScanAscCollection() throws Exception {
-        singleOrderByBoundRangeScanAsc( new CollectionIoHelper() );
+        singleOrderByBoundRangeScanAsc( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanAscConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanAscConnectionIT.java
index 5c66ff1..786b1e2 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanAscConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanAscConnectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderByBoundRangeScanAscConnectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderByBoundRangeScanAscConnection() throws Exception {
-        singleOrderByBoundRangeScanAsc( new ConnectionHelper() );
+        singleOrderByBoundRangeScanAsc( new ConnectionHelper(app) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanDescCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanDescCollectionIT.java
index df49484..e5fca7b 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanDescCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanDescCollectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderByBoundRangeScanDescCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderByBoundRangeScanDescCollection() throws Exception {
-        singleOrderByBoundRangeScanDesc( new CollectionIoHelper() );
+        singleOrderByBoundRangeScanDesc( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanDescConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanDescConnectionIT.java
index 388cbb8..a66edbf 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanDescConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByBoundRangeScanDescConnectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderByBoundRangeScanDescConnectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderByBoundRangeScanDescConnection() throws Exception {
-        singleOrderByBoundRangeScanDesc( new ConnectionHelper() );
+        singleOrderByBoundRangeScanDesc( new ConnectionHelper(app) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexIntersectionCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexIntersectionCollectionIT.java
index 3773832..5556112 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexIntersectionCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexIntersectionCollectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderByComplexIntersectionCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderByComplexIntersectionCollection() throws Exception {
-        singleOrderByComplexIntersection( new CollectionIoHelper() );
+        singleOrderByComplexIntersection( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexIntersectionConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexIntersectionConnectionIT.java
index 044adc3..7b04ffd 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexIntersectionConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexIntersectionConnectionIT.java
@@ -24,6 +24,6 @@
 
     @Test
     public void singleOrderByComplexIntersectionConnection() throws Exception {
-        singleOrderByComplexIntersection( new ConnectionHelper() );
+        singleOrderByComplexIntersection( new ConnectionHelper(app) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexUnionCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexUnionCollectionIT.java
index e7a215c..0c6f66a 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexUnionCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexUnionCollectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderByComplexUnionCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderByComplexUnionCollection() throws Exception {
-        singleOrderByComplexUnion( new CollectionIoHelper() );
+        singleOrderByComplexUnion( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexUnionConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexUnionConnectionIT.java
index 0c867c1..372eeb1 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexUnionConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByComplexUnionConnectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderByComplexUnionConnectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderByComplexUnionConnection() throws Exception {
-        singleOrderByComplexUnion( new ConnectionHelper() );
+        singleOrderByComplexUnion( new ConnectionHelper(app) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByIntersectionCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByIntersectionCollectionIT.java
index 5718274..1d2bb8d 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByIntersectionCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByIntersectionCollectionIT.java
@@ -25,6 +25,6 @@
 public class SingleOrderByIntersectionCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderByIntersectionCollection() throws Exception {
-        singleOrderByIntersection( new CollectionIoHelper() );
+        singleOrderByIntersection( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByIntersectionConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByIntersectionConnectionIT.java
index 6b64024..fafe52b 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByIntersectionConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByIntersectionConnectionIT.java
@@ -25,6 +25,6 @@
 public class SingleOrderByIntersectionConnectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderByIntersectionConnection() throws Exception {
-        singleOrderByIntersection( new ConnectionHelper() );
+        singleOrderByIntersection( new ConnectionHelper(app) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByLessThanLimitCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByLessThanLimitCollectionIT.java
index 998a7b5..f8de38c 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByLessThanLimitCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByLessThanLimitCollectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderByLessThanLimitCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderByLessThanLimitCollection() throws Exception {
-        singleOrderByLessThanLimit( new CollectionIoHelper() );
+        singleOrderByLessThanLimit( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByLessThanLimitConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByLessThanLimitConnectionIT.java
index cc325b1..6f74276 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByLessThanLimitConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByLessThanLimitConnectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderByLessThanLimitConnectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderByLessThanLimitConnection() throws Exception {
-        singleOrderByLessThanLimit( new ConnectionHelper() );
+        singleOrderByLessThanLimit( new ConnectionHelper(app) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByMaxLimitCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByMaxLimitCollectionIT.java
index 952e2ce..9f83b64 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByMaxLimitCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByMaxLimitCollectionIT.java
@@ -24,6 +24,6 @@
 
     @Test
     public void singleOrderByMaxLimitCollection() throws Exception {
-        singleOrderByMaxLimit( new CollectionIoHelper() );
+        singleOrderByMaxLimit( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByMaxLimitConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByMaxLimitConnectionIT.java
index 21a76c2..6233fed 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByMaxLimitConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByMaxLimitConnectionIT.java
@@ -24,6 +24,6 @@
 
     @Test
     public void singleOrderByMaxLimitConnection() throws Exception {
-        singleOrderByMaxLimit( new ConnectionHelper() );
+        singleOrderByMaxLimit( new ConnectionHelper(app) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNoIntersectionCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNoIntersectionCollectionIT.java
index 376f204..6d3a71f 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNoIntersectionCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNoIntersectionCollectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderByNoIntersectionCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderByNoIntersectionCollection() throws Exception {
-        singleOrderByNoIntersection( new CollectionIoHelper() );
+        singleOrderByNoIntersection( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNoIntersectionConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNoIntersectionConnectionIT.java
index 307bd06..468e2f6 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNoIntersectionConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNoIntersectionConnectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderByNoIntersectionConnectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderByNoIntersectionConnection() throws Exception {
-        singleOrderByNoIntersection( new CollectionIoHelper() );
+        singleOrderByNoIntersection( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNotCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNotCollectionIT.java
index d2e4ac6..0d4fafa 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNotCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNotCollectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderByNotCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderByNotCollection() throws Exception {
-        singleOrderByNot( new CollectionIoHelper() );
+        singleOrderByNot( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNotConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNotConnectionIT.java
index d71a352..7c6b2da 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNotConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderByNotConnectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderByNotConnectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderByNotConnection() throws Exception {
-        singleOrderByNot( new ConnectionHelper() );
+        singleOrderByNot( new ConnectionHelper(app) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanGreaterCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanGreaterCollectionIT.java
index afece0a..ba6610c 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanGreaterCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanGreaterCollectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderBySameRangeScanGreaterCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderBySameRangeScanGreaterCollection() throws Exception {
-        singleOrderBySameRangeScanGreater( new CollectionIoHelper() );
+        singleOrderBySameRangeScanGreater( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanGreaterConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanGreaterConnectionIT.java
index a7ed965..eab1d2a 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanGreaterConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanGreaterConnectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderBySameRangeScanGreaterConnectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderBySameRangeScanGreaterConnection() throws Exception {
-        singleOrderBySameRangeScanGreater( new ConnectionHelper() );
+        singleOrderBySameRangeScanGreater( new ConnectionHelper(app) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanGreaterThanEqualCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanGreaterThanEqualCollectionIT.java
index f9b3dc8..1ef811d 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanGreaterThanEqualCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanGreaterThanEqualCollectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderBySameRangeScanGreaterThanEqualCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderBySameRangeScanGreaterThanEqualCollection() throws Exception {
-        singleOrderBySameRangeScanGreaterThanEqual( new CollectionIoHelper() );
+        singleOrderBySameRangeScanGreaterThanEqual( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessCollectionIT.java
index 80db67a..26bfe45 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessCollectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderBySameRangeScanLessCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderBySameRangeScanLessCollection() throws Exception {
-        singleOrderBySameRangeScanLessEqual( new CollectionIoHelper() );
+        singleOrderBySameRangeScanLessEqual( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessConnectionIT.java
index e85f7f1..1fc0a4d 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessConnectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderBySameRangeScanLessConnectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderBySameRangeScanLessConnection() throws Exception {
-        singleOrderBySameRangeScanLessEqual( new ConnectionHelper() );
+        singleOrderBySameRangeScanLessEqual( new ConnectionHelper(app) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessThanEqualCollectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessThanEqualCollectionIT.java
index e54cfc7..0317d6f 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessThanEqualCollectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessThanEqualCollectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderBySameRangeScanLessThanEqualCollectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderBySameRangeScanLessThanEqualCollection() throws Exception {
-        singleOrderBySameRangeScanLessThanEqual( new CollectionIoHelper() );
+        singleOrderBySameRangeScanLessThanEqual( new CollectionIoHelper( app ) );
     }
 }
diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessThanEqualConnectionIT.java b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessThanEqualConnectionIT.java
index 375ba86..54ba8f8 100644
--- a/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessThanEqualConnectionIT.java
+++ b/stack/core/src/test/java/org/usergrid/persistence/query/SingleOrderBySameRangeScanLessThanEqualConnectionIT.java
@@ -23,6 +23,6 @@
 public class SingleOrderBySameRangeScanLessThanEqualConnectionIT extends AbstractIteratingQueryIT {
     @Test
     public void singleOrderBySameRangeScanLessThanEqualConnection() throws Exception {
-        singleOrderBySameRangeScanLessThanEqual( new ConnectionHelper() );
+        singleOrderBySameRangeScanLessThanEqual( new ConnectionHelper(app) );
     }
 }