Fixes NPE issue in the union iterator
Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/5d75a299 Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/5d75a299 Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/5d75a299 Branch: refs/pull/30/head Commit: 5d75a2992475ab907b15e4a2f86ab50ae89a1e40 Parents: 9dd14f1 Author: Todd Nine <[email protected]> Authored: Mon Jan 20 18:18:15 2014 -0800 Committer: Todd Nine <[email protected]> Committed: Mon Jan 20 18:18:15 2014 -0800 ---------------------------------------------------------------------- .../query/ir/result/UnionIterator.java | 9 ++- .../query/ir/result/UnionIteratorTest.java | 70 ++++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5d75a299/stack/core/src/main/java/org/usergrid/persistence/query/ir/result/UnionIterator.java ---------------------------------------------------------------------- diff --git a/stack/core/src/main/java/org/usergrid/persistence/query/ir/result/UnionIterator.java b/stack/core/src/main/java/org/usergrid/persistence/query/ir/result/UnionIterator.java index efd4e3d..00e90b8 100644 --- a/stack/core/src/main/java/org/usergrid/persistence/query/ir/result/UnionIterator.java +++ b/stack/core/src/main/java/org/usergrid/persistence/query/ir/result/UnionIterator.java @@ -58,7 +58,14 @@ public class UnionIterator extends MultiIterator { super( pageSize ); this.id = id; - list = new SortedColumnList( pageSize, UUID_SERIALIZER.fromByteBuffer( minUuid ) ); + + UUID parseMinUuid = null; + + if(minUuid != null) { + parseMinUuid = UUID_SERIALIZER.fromByteBuffer( minUuid ); + } + + list = new SortedColumnList( pageSize, parseMinUuid ); } http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5d75a299/stack/core/src/test/java/org/usergrid/persistence/query/ir/result/UnionIteratorTest.java ---------------------------------------------------------------------- diff --git a/stack/core/src/test/java/org/usergrid/persistence/query/ir/result/UnionIteratorTest.java b/stack/core/src/test/java/org/usergrid/persistence/query/ir/result/UnionIteratorTest.java index 683f00d..8fd9ea8 100644 --- a/stack/core/src/test/java/org/usergrid/persistence/query/ir/result/UnionIteratorTest.java +++ b/stack/core/src/test/java/org/usergrid/persistence/query/ir/result/UnionIteratorTest.java @@ -16,6 +16,7 @@ package org.usergrid.persistence.query.ir.result; +import java.nio.ByteBuffer; import java.util.HashSet; import java.util.Set; import java.util.UUID; @@ -23,6 +24,8 @@ import java.util.UUID; import org.junit.Test; import org.usergrid.utils.UUIDUtils; +import me.prettyprint.cassandra.serializers.UUIDSerializer; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; @@ -295,6 +298,73 @@ public class UnionIteratorTest { } + @Test + public void nullCursorBytes() { + + UUID id1 = UUIDUtils.minTimeUUID( 1 ); + UUID id2 = UUIDUtils.minTimeUUID( 2 ); + UUID id3 = UUIDUtils.minTimeUUID( 3 ); + UUID id4 = UUIDUtils.minTimeUUID( 4 ); + UUID id5 = UUIDUtils.minTimeUUID( 5 ); + + + InOrderIterator second = new InOrderIterator( 100 ); + second.add( id1 ); + second.add( id2 ); + second.add( id3 ); + second.add( id4 ); + second.add( id5 ); + + UnionIterator union = new UnionIterator( 100, 1, null ); + + union.addIterator( second ); + + Set<ScanColumn> ids = union.next(); + + // now make sure it's right, only 1, 3 and 8 intersect + assertTrue( ids.contains( uuidColumn( id1 ) ) ); + assertTrue( ids.contains( uuidColumn( id2 ) ) ); + assertTrue( ids.contains( uuidColumn( id3 ) ) ); + assertTrue( ids.contains( uuidColumn( id4 ) ) ); + assertTrue( ids.contains( uuidColumn( id5 ) ) ); + } + + + @Test + public void validCursorBytes() { + + + ByteBuffer cursor = UUIDSerializer.get().toByteBuffer( UUIDUtils.minTimeUUID( 4 ) ); + + UUID id1 = UUIDUtils.minTimeUUID( 1 ); + UUID id2 = UUIDUtils.minTimeUUID( 2 ); + UUID id3 = UUIDUtils.minTimeUUID( 3 ); + UUID id4 = UUIDUtils.minTimeUUID( 4 ); + UUID id5 = UUIDUtils.minTimeUUID( 5 ); + + + InOrderIterator second = new InOrderIterator( 100 ); + second.add( id1 ); + second.add( id2 ); + second.add( id3 ); + second.add( id4 ); + second.add( id5 ); + + UnionIterator union = new UnionIterator( 100, 1, cursor ); + + union.addIterator( second ); + + Set<ScanColumn> ids = union.next(); + + // now make sure it's right, only 1, 3 and 8 intersect + assertFalse( ids.contains( uuidColumn( id1 ) ) ); + assertFalse( ids.contains( uuidColumn( id2 ) ) ); + assertFalse( ids.contains( uuidColumn( id3 ) ) ); + assertFalse( ids.contains( uuidColumn( id4 ) ) ); + assertTrue( ids.contains( uuidColumn( id5 ) ) ); + } + + private void reverse( UUID[] array ) { UUID temp = null;
