Repository: incubator-geode Updated Branches: refs/heads/develop 71c863b5c -> 4f2a51acc
GEODE-1881: Support null map keys in CompactMapRangeIndex Allow indexing maps with null keys by storing the keys as IndexManager.NULL. Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/4f2a51ac Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/4f2a51ac Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/4f2a51ac Branch: refs/heads/develop Commit: 4f2a51acc660f1d49400c8d90471e10e91b09fb8 Parents: 71c863b Author: Dan Smith <[email protected]> Authored: Fri Sep 9 15:37:00 2016 -0700 Committer: Dan Smith <[email protected]> Committed: Mon Sep 12 14:35:26 2016 -0700 ---------------------------------------------------------------------- .../internal/index/CompactMapRangeIndex.java | 11 +++++ .../index/CompactRangeIndexJUnitTest.java | 48 +++++++++++++++++++- 2 files changed, 58 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/4f2a51ac/geode-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/CompactMapRangeIndex.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/CompactMapRangeIndex.java b/geode-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/CompactMapRangeIndex.java index c374a10..a089853 100644 --- a/geode-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/CompactMapRangeIndex.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/CompactMapRangeIndex.java @@ -125,6 +125,13 @@ public class CompactMapRangeIndex extends AbstractMapIndex protected void doIndexAddition(Object mapKey, Object indexKey, Object value, RegionEntry entry) throws IMQException { + if (indexKey == null) { + indexKey = IndexManager.NULL; + } + if(mapKey == null) { + mapKey = IndexManager.NULL; + } + boolean isPr = this.region instanceof BucketRegion; // Get RangeIndex for it or create it if absent CompactRangeIndex rg = (CompactRangeIndex)this.mapKeyToValueIndex.get(mapKey); @@ -168,6 +175,10 @@ public class CompactMapRangeIndex extends AbstractMapIndex if (indexKey == null) { indexKey = IndexManager.NULL; } + if(mapKey == null) { + mapKey = IndexManager.NULL; + } + boolean isPr = this.region instanceof BucketRegion; // Get RangeIndex for it or create it if absent CompactRangeIndex rg = (CompactRangeIndex) this.mapKeyToValueIndex.get(mapKey); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/4f2a51ac/geode-core/src/test/java/com/gemstone/gemfire/cache/query/internal/index/CompactRangeIndexJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/com/gemstone/gemfire/cache/query/internal/index/CompactRangeIndexJUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/cache/query/internal/index/CompactRangeIndexJUnitTest.java index f01f925..67fa553 100644 --- a/geode-core/src/test/java/com/gemstone/gemfire/cache/query/internal/index/CompactRangeIndexJUnitTest.java +++ b/geode-core/src/test/java/com/gemstone/gemfire/cache/query/internal/index/CompactRangeIndexJUnitTest.java @@ -86,7 +86,7 @@ public class CompactRangeIndexJUnitTest { public void testNullKeyCompactRangeIndex() throws Exception { index = utils.createIndex("indexName", "status", "/exampleRegion"); Region region = utils.getCache().getRegion("exampleRegion"); - + //create objects int numObjects = 10; for (int i = 1; i <= numObjects; i++) { @@ -101,6 +101,52 @@ public class CompactRangeIndexJUnitTest { } /** + * Tests adding entries to compact range index where the the key + * of an indexed map field is null. + */ + @Test + public void testNullMapKeyCompactRangeIndex() throws Exception { + index = utils.createIndex("indexName", "positions[*]", "/exampleRegion"); + Region region = utils.getCache().getRegion("exampleRegion"); + + //create objects + int numObjects = 10; + for (int i = 1; i <= numObjects; i++) { + Portfolio p = new Portfolio(i); + p.status = null; + p.getPositions().put(null, "something"); + region.put("KEY-"+ i, p); + } + //execute query and check result size + QueryService qs = utils.getCache().getQueryService(); + SelectResults results = (SelectResults) qs.newQuery("Select * from /exampleRegion r where r.position[null] = something").execute(); + assertEquals("Null matched Results expected", numObjects, results.size()); + } + + /** + * Tests adding entries to compact range index where the the key + * of an indexed map field is null. + */ + @Test + public void testNullMapKeyCompactRangeIndexCreateIndexLater() throws Exception { + Region region = utils.getCache().getRegion("exampleRegion"); + + //create objects + int numObjects = 10; + for (int i = 1; i <= numObjects; i++) { + Portfolio p = new Portfolio(i); + p.status = null; + p.getPositions().put(null, "something"); + region.put("KEY-"+ i, p); + } + index = utils.createIndex("indexName", "positions[*]", "/exampleRegion"); + //execute query and check result size + QueryService qs = utils.getCache().getQueryService(); + SelectResults results = (SelectResults) qs.newQuery("Select * from /exampleRegion r where r.position[null] = something").execute(); + assertEquals("Null matched Results expected", numObjects, results.size()); + } + + /** * Tests race condition where we possibly were missing remove calls due to transitioning * to an empty index elem before adding the entries * the fix is to add the entries to the elem and then transition to that elem
