[
https://issues.apache.org/jira/browse/GEODE-9004?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17298407#comment-17298407
]
ASF GitHub Bot commented on GEODE-9004:
---------------------------------------
DonalEvans commented on a change in pull request #6096:
URL: https://github.com/apache/geode/pull/6096#discussion_r590790779
##########
File path:
geode-core/src/integrationTest/java/org/apache/geode/cache/query/internal/index/MapRangeIndexMaintenanceJUnitTest.java
##########
@@ -341,6 +341,155 @@ public void
testNullMapValuesInIndexOnLocalRegionForCompactMap() throws Exceptio
assertEquals(1, result.size());
}
+ @Test
+ public void testQueriesForValueInMapFieldWithoutIndex() throws Exception {
+ region =
+
CacheUtils.getCache().createRegionFactory(RegionShortcut.REPLICATE).create("portfolio");
+ qs = CacheUtils.getQueryService();
+ testQueriesForValueInMapField(region, qs);
+ }
+
+ @Test
+ public void testQueriesForValueInMapFieldWithMapIndexWithOneKey() throws
Exception {
+ region =
+
CacheUtils.getCache().createRegionFactory(RegionShortcut.REPLICATE).create("portfolio");
+ qs = CacheUtils.getQueryService();
+
+ keyIndex1 = qs.createIndex(INDEX_NAME, "positions['SUN']", SEPARATOR +
"portfolio ");
+ assertTrue(keyIndex1 instanceof CompactMapRangeIndex);
+ testQueriesForValueInMapField(region, qs);
+
+ long keys = ((CompactMapRangeIndex)
keyIndex1).internalIndexStats.getNumberOfKeys();
+ long mapIndexKeys =
+ ((CompactMapRangeIndex)
keyIndex1).internalIndexStats.getNumberOfMapIndexKeys();
+ long values =
+ ((CompactMapRangeIndex)
keyIndex1).internalIndexStats.getNumberOfValues();
+ assertEquals(3, keys);
+ assertEquals(1, mapIndexKeys);
+ assertEquals(3, values);
+ }
+
+ @Test
+ public void testQueriesForValueInMapFieldWithMapIndexWithSeveralKeys()
throws Exception {
+ region =
+
CacheUtils.getCache().createRegionFactory(RegionShortcut.REPLICATE).create("portfolio");
+ qs = CacheUtils.getQueryService();
+
+ keyIndex1 =
+ qs.createIndex(INDEX_NAME, "positions['SUN', 'ERICSSON']", SEPARATOR +
"portfolio ");
+ assertTrue(keyIndex1 instanceof CompactMapRangeIndex);
+ testQueriesForValueInMapField(region, qs);
+
+ long keys = ((CompactMapRangeIndex)
keyIndex1).internalIndexStats.getNumberOfKeys();
+ long mapIndexKeys =
+ ((CompactMapRangeIndex)
keyIndex1).internalIndexStats.getNumberOfMapIndexKeys();
+ long values =
+ ((CompactMapRangeIndex)
keyIndex1).internalIndexStats.getNumberOfValues();
+ assertEquals(3, keys);
+ assertEquals(1, mapIndexKeys);
+ assertEquals(3, values);
+ }
+
+ @Test
+ public void testQueriesForValueInMapFieldWithMapIndexWithStar() throws
Exception {
+ region =
+
CacheUtils.getCache().createRegionFactory(RegionShortcut.REPLICATE).create("portfolio");
+ qs = CacheUtils.getQueryService();
+
+ keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", SEPARATOR +
"portfolio ");
+ assertTrue(keyIndex1 instanceof CompactMapRangeIndex);
+ testQueriesForValueInMapField(region, qs);
+
+ long keys = ((CompactMapRangeIndex)
keyIndex1).internalIndexStats.getNumberOfKeys();
+ long mapIndexKeys =
+ ((CompactMapRangeIndex)
keyIndex1).internalIndexStats.getNumberOfMapIndexKeys();
+ long values =
+ ((CompactMapRangeIndex)
keyIndex1).internalIndexStats.getNumberOfValues();
+ assertEquals(5, keys);
+ assertEquals(4, mapIndexKeys);
+ assertEquals(5, values);
+ }
+
+ public void testQueriesForValueInMapField(Region region, QueryService qs)
throws Exception {
+ // Empty map
+ Portfolio p = new Portfolio(1, 1);
+ p.positions = new HashMap();
Review comment:
It looks like this use of the raw class instead of the parameterized one
got missed in the last set of changes.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> Issues with queries targeting a map field
> -----------------------------------------
>
> Key: GEODE-9004
> URL: https://issues.apache.org/jira/browse/GEODE-9004
> Project: Geode
> Issue Type: Bug
> Components: querying
> Reporter: Alberto Gomez
> Assignee: Alberto Gomez
> Priority: Major
> Labels: pull-request-available
>
> When defining indexes on a map field several issues have been found:
> * If the index is defined for one specific key in the map, e.g.
> positions['SUN'], then an index entry is created for every entry, no matter
> if the entry contains the 'SUN' key in its map or not. This makes the index
> take a lot of memory (unnecessarily?).
> * If the index is specified for more than one key in the map or for all
> ('*'), then queries in which the "where" contains a != condition for the map,
> e.g. "p.positions['SUN'] != '3'" return less values than those returned when
> the query is run without the index.
> * If the index is specified for more than one key in the map or for all
> ('*'), then queries in which the "where" contains a "= null" condition for
> the map, e.g. "p.positions['SUN'] = null" return less values than those
> returned when the query is run without the index.
> * If the index is defined for one specific key in the map, e.g.
> positions['SUN'], queries in which the "where" contains a "!=" condition for
> the map or a " = null" condition sometimes return less values than those
> returned when the query is run without the index.
> Apart from the above, looking at the indexes documentation, it seems that Map
> indexes are only those indexes for which more than one key or '*' is
> specified for the Map. But if just one key is specified for the Map in the
> index, then the index is not a Map index but a range index. This should be
> clarified.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)