Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 17BD1200B96 for ; Thu, 22 Sep 2016 01:48:12 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 164E4160ADB; Wed, 21 Sep 2016 23:48:12 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 2A3DD160ADE for ; Thu, 22 Sep 2016 01:48:11 +0200 (CEST) Received: (qmail 67849 invoked by uid 500); 21 Sep 2016 23:48:10 -0000 Mailing-List: contact commits-help@geode.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@geode.incubator.apache.org Delivered-To: mailing list commits@geode.incubator.apache.org Received: (qmail 67840 invoked by uid 99); 21 Sep 2016 23:48:10 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd2-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 21 Sep 2016 23:48:10 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd2-us-west.apache.org (ASF Mail Server at spamd2-us-west.apache.org) with ESMTP id B108E1A56B6 for ; Wed, 21 Sep 2016 23:48:09 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd2-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -4.646 X-Spam-Level: X-Spam-Status: No, score=-4.646 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-1.426] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd2-us-west.apache.org [10.40.0.9]) (amavisd-new, port 10024) with ESMTP id V8VUH0PWQwwX for ; Wed, 21 Sep 2016 23:48:08 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with SMTP id 082E15FE2A for ; Wed, 21 Sep 2016 23:48:06 +0000 (UTC) Received: (qmail 67727 invoked by uid 99); 21 Sep 2016 23:48:06 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 21 Sep 2016 23:48:06 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 0A312DFBA3; Wed, 21 Sep 2016 23:48:05 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: jasonhuynh@apache.org To: commits@geode.incubator.apache.org Date: Wed, 21 Sep 2016 23:48:06 -0000 Message-Id: <4eefb56b765e417c900bc9ae38fa865d@git.apache.org> In-Reply-To: <35635e84807540f8afc8efee8197d298@git.apache.org> References: <35635e84807540f8afc8efee8197d298@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/2] incubator-geode git commit: GEODE-1864: Remove old keys correctly from Compact Map Range Index archived-at: Wed, 21 Sep 2016 23:48:12 -0000 GEODE-1864: Remove old keys correctly from Compact Map Range Index Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/8c7932e7 Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/8c7932e7 Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/8c7932e7 Branch: refs/heads/develop Commit: 8c7932e763d824e8704dbf0b073d0e5f52ff94fa Parents: 4a9e23a Author: Jason Huynh Authored: Mon Sep 19 11:03:05 2016 -0700 Committer: Jason Huynh Committed: Wed Sep 21 16:21:03 2016 -0700 ---------------------------------------------------------------------- .../internal/index/CompactMapRangeIndex.java | 24 ++- .../MapRangeIndexMaintenanceJUnitTest.java | 171 +++++++++++++++++++ 2 files changed, 194 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8c7932e7/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/CompactMapRangeIndex.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/CompactMapRangeIndex.java b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/CompactMapRangeIndex.java index ce1ea08..234dfae 100644 --- a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/CompactMapRangeIndex.java +++ b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/CompactMapRangeIndex.java @@ -16,9 +16,14 @@ */ package org.apache.geode.cache.query.internal.index; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + import org.apache.geode.cache.Region; import org.apache.geode.cache.RegionAttributes; import org.apache.geode.cache.query.IndexStatistics; @@ -110,6 +115,7 @@ public class CompactMapRangeIndex extends AbstractMapIndex Object indexKey = mapEntry.getValue(); this.saveIndexAddition(mapKey, indexKey, value, entry); } + removeOldMappings(((Map) key).keySet(), entry); } else { for (Object mapKey : mapKeys) { @@ -121,7 +127,23 @@ public class CompactMapRangeIndex extends AbstractMapIndex } } } - + + private void removeOldMappings(Collection presentKeys, RegionEntry entry) throws IMQException { + Map oldKeysAndValuesForEntry = entryToMapKeyIndexKeyMap.get(entry); + if (oldKeysAndValuesForEntry == null) { + oldKeysAndValuesForEntry = Collections.EMPTY_MAP; + } + Set removedKeyValueEntries = oldKeysAndValuesForEntry != null ? oldKeysAndValuesForEntry.entrySet() : Collections.EMPTY_SET; + for (Map.Entry keyValue : removedKeyValueEntries) { + Object indexKey = keyValue.getKey() == null ? IndexManager.NULL : keyValue.getKey(); + if (!presentKeys.contains(indexKey)) { + CompactRangeIndex rg = (CompactRangeIndex) this.mapKeyToValueIndex.get(keyValue.getKey()); + rg.removeMapping(keyValue.getValue(), entry); + } + } + } + + protected void doIndexAddition(Object mapKey, Object indexKey, Object value, RegionEntry entry) throws IMQException { http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8c7932e7/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/MapRangeIndexMaintenanceJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/MapRangeIndexMaintenanceJUnitTest.java b/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/MapRangeIndexMaintenanceJUnitTest.java index 9833e43..f79e10b 100644 --- a/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/MapRangeIndexMaintenanceJUnitTest.java +++ b/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/MapRangeIndexMaintenanceJUnitTest.java @@ -362,6 +362,177 @@ public class MapRangeIndexMaintenanceJUnitTest{ assertEquals(1, result.size()); } + @Test + public void updatingAMapFieldWithDifferentKeysShouldRemoveOldKeysThatAreNoLongerPresent() throws Exception { + //Create Partition Region + AttributesFactory af = new AttributesFactory(); + af.setScope(Scope.LOCAL); + + Portfolio p = new Portfolio(1, 1); + HashMap map1 = new HashMap(); + map1.put("SUN", 1); + map1.put("IBM", 2); + p.positions = map1; + region = CacheUtils.createRegion("portfolio", af.create(), false); + region.put(1, p); + qs = CacheUtils.getQueryService(); + + keyIndex1 = (IndexProtocol) qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio"); + + assertTrue(keyIndex1 instanceof CompactMapRangeIndex); + + Portfolio p2 = new Portfolio(1, 1); + HashMap map2 = new HashMap(); + p2.positions = map2; + map2.put("NEW_KEY", 1); + region.put(1, p2); + + SelectResults results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1 OR p.positions['IBM'] = 2") + .execute(); + assertEquals(0, results.size()); + } + + @Test + public void updatingAMapFieldSameKeysShouldUpdateCorrectly() throws Exception { + //Create Partition Region + AttributesFactory af = new AttributesFactory(); + af.setScope(Scope.LOCAL); + + Portfolio p = new Portfolio(1, 1); + HashMap map1 = new HashMap(); + map1.put("SUN", 1); + map1.put("IBM", 2); + p.positions = map1; + region = CacheUtils.createRegion("portfolio", af.create(), false); + region.put(1, p); + qs = CacheUtils.getQueryService(); + + keyIndex1 = (IndexProtocol) qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio"); + + assertTrue(keyIndex1 instanceof CompactMapRangeIndex); + + Portfolio p2 = new Portfolio(1, 1); + HashMap map2 = new HashMap(); + p2.positions = map2; + map2.put("NEW_KEY", 1); + region.put(1, p2); + + SelectResults results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1 OR p.positions['IBM'] = 2") + .execute(); + assertEquals(0, results.size()); + } + + @Test + public void updatingAMapFieldWithNoKeysShouldRemoveOldKeysThatAreNoLongerPresent() throws Exception { + //Create Partition Region + AttributesFactory af = new AttributesFactory(); + af.setScope(Scope.LOCAL); + + Portfolio p = new Portfolio(1, 1); + HashMap map1 = new HashMap(); + map1.put("SUN", 1); + map1.put("IBM", 2); + p.positions = map1; + region = CacheUtils.createRegion("portfolio", af.create(), false); + region.put(1, p); + qs = CacheUtils.getQueryService(); + + keyIndex1 = (IndexProtocol) qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio"); + + Portfolio p2 = new Portfolio(1, 1); + HashMap map2 = new HashMap(); + p2.positions = map2; + region.put(1, p2); + + SelectResults results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1 OR p.positions['IBM'] = 2") + .execute(); + assertEquals(0, results.size()); + } + + @Test + public void updatingEmptyMapToMapWithKeysShouldIndexNewKeysCorrectly() throws Exception { + //Create Partition Region + AttributesFactory af = new AttributesFactory(); + af.setScope(Scope.LOCAL); + + Portfolio p = new Portfolio(1, 1); + HashMap map1 = new HashMap(); + p.positions = map1; + region = CacheUtils.createRegion("portfolio", af.create(), false); + region.put(1, p); + qs = CacheUtils.getQueryService(); + + keyIndex1 = (IndexProtocol) qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio"); + + Portfolio p2 = new Portfolio(1, 1); + HashMap map2 = new HashMap(); + p2.positions = map2; + map2.put("SUN", 1); + map2.put("IBM", 2); + region.put(1, p2); + + SelectResults results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1 OR p.positions['IBM'] = 2") + .execute(); + assertEquals(1, results.size()); + } + + @Test + public void testUpdateWithSameKeysSameValuesShouldRetainIndexMappings() throws Exception { + AttributesFactory af = new AttributesFactory(); + af.setScope(Scope.LOCAL); + + Portfolio p = new Portfolio(1, 1); + HashMap map1 = new HashMap(); + map1.put("SUN", 1); + map1.put("IBM", 2); + p.positions = map1; + region = CacheUtils.createRegion("portfolio", af.create(), false); + region.put(1, p); + qs = CacheUtils.getQueryService(); + + keyIndex1 = (IndexProtocol) qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio"); + region.put(1, p); + + SelectResults results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1") + .execute(); + assertEquals(1, results.size()); + } + + + @Test + public void testUpdateWithSameKeysDifferentValuesShouldRetainIndexMappings() throws Exception { + AttributesFactory af = new AttributesFactory(); + af.setScope(Scope.LOCAL); + + Portfolio p = new Portfolio(1, 1); + HashMap map1 = new HashMap(); + map1.put("SUN", 1); + map1.put("IBM", 2); + p.positions = map1; + region = CacheUtils.createRegion("portfolio", af.create(), false); + region.put(1, p); + qs = CacheUtils.getQueryService(); + + keyIndex1 = (IndexProtocol) qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio"); + Portfolio p2 = new Portfolio(1, 1); + HashMap map2 = new HashMap(); + p2.positions = map2; + map2.put("SUN",3); + map2.put("IBM",4); + region.put(1, p2); + + SelectResults results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1") + .execute(); + assertEquals(0, results.size()); + + results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 3") + .execute(); + assertEquals(1, results.size()); + } + + + + /** * TestObject with wrong comareTo() implementation implementation. * Which throws NullPointer while removing mapping from a MapRangeIndex.