blob: 62952078f1ad951b7ab26118b5265f46e3f9887e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You 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.apache.geode.cache.query.internal.index;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Collection;
import java.util.HashMap;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.geode.cache.AttributesFactory;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.RegionShortcut;
import org.apache.geode.cache.Scope;
import org.apache.geode.cache.query.CacheUtils;
import org.apache.geode.cache.query.Index;
import org.apache.geode.cache.query.Query;
import org.apache.geode.cache.query.QueryService;
import org.apache.geode.cache.query.SelectResults;
import org.apache.geode.cache.query.data.Instrument;
import org.apache.geode.cache.query.data.Portfolio;
import org.apache.geode.cache.query.internal.IndexTrackingQueryObserver;
import org.apache.geode.cache.query.internal.QueryObserverHolder;
import org.apache.geode.test.junit.categories.OQLIndexTest;
@Category({OQLIndexTest.class})
public class MapRangeIndexMaintenanceJUnitTest {
private static final String INDEX_NAME = "keyIndex1";
private static QueryService qs;
private static Region region;
private static Index keyIndex1;
@Before
public void setUp() throws Exception {
CacheUtils.startCache();
}
@After
public void tearDown() throws Exception {
CacheUtils.closeCache();
IndexManager.TEST_RANGEINDEX_ONLY = false;
}
@Test
public void testNullMapAsValueOnIndexInitDoesNotThrowException() throws Exception {
region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.REPLICATE).create("portfolio");
qs = CacheUtils.getQueryService();
Portfolio p = new Portfolio(1, 1);
p.positions = null;
region.put(1, p);
keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio ");
SelectResults result = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['SUN'] = null").execute();
assertEquals(0, result.size());
}
@Test
public void testMapIndexIsUsedWithBindKeyParameter() throws Exception {
// Create Region
region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.REPLICATE).create("instrument");
// Initialize observer
MyQueryObserverAdapter observer = new MyQueryObserverAdapter();
QueryObserverHolder.setInstance(observer);
// Create map index
qs = CacheUtils.getQueryService();
qs.createIndex(INDEX_NAME, "tl.alternateReferences['SOME_KEY', 'SOME_OTHER_KEY']",
"/instrument i, i.tradingLines tl");
// Add instruments
int numInstruments = 20;
for (int i = 0; i < numInstruments; i++) {
String key = String.valueOf(i);
Object value = Instrument.getInstrument(key);
region.put(key, value);
}
// Execute query
Query query = qs.newQuery(
"<trace> select distinct i from /instrument i, i.tradingLines t where t.alternateReferences[$1]='SOME_VALUE'");
SelectResults results = (SelectResults) query.execute(new Object[] {"SOME_KEY"});
// Verify index was used
assertTrue(observer.indexUsed);
// Verify the results size
assertEquals(numInstruments, results.size());
}
@Test
public void testNullMapKeysInIndexOnLocalRegionForCompactMap() throws Exception {
// Create Partition Region
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
if (region.size() == 0) {
for (int i = 1; i <= 100; i++) {
region.put(Integer.toString(i), new Portfolio(i, i));
}
}
assertEquals(100, region.size());
qs = CacheUtils.getQueryService();
keyIndex1 = qs.createIndex(INDEX_NAME, "positions['SUN', 'IBM']", "/portfolio p");
assertTrue(keyIndex1 instanceof CompactMapRangeIndex);
// Let MapRangeIndex remove values for key 1.
Portfolio p = new Portfolio(1, 1);
p.positions = new HashMap();
region.put(1, p);
// Now mapkeys are null for key 1
region.invalidate(1);
// Now mapkeys are null for key 1
region.destroy(1);
}
@Test
public void testNullMapKeysInIndexOnLocalRegion() throws Exception {
IndexManager.TEST_RANGEINDEX_ONLY = true;
// Create Partition Region
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
if (region.size() == 0) {
for (int i = 1; i <= 100; i++) {
region.put(Integer.toString(i), new Portfolio(i, i));
}
}
assertEquals(100, region.size());
qs = CacheUtils.getQueryService();
keyIndex1 = qs.createIndex(INDEX_NAME, "positions['SUN', 'IBM']", "/portfolio ");
assertTrue(keyIndex1 instanceof MapRangeIndex);
// Let MapRangeIndex remove values for key 1.
Portfolio p = new Portfolio(1, 1);
p.positions = new HashMap();
region.put(1, p);
// Now mapkeys are null for key 1
region.invalidate(1);
// Now mapkeys are null for key 1
region.destroy(1);
}
/**
* Test index object's comapreTo Function implementation correctness for indexes.
*/
@Test
public void testDuplicateKeysInCompactRangeIndexOnLocalRegion() 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", new TestObject("SUN", 1));
map1.put("IBM", new TestObject("IBM", 2));
p.positions = map1;
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
assertTrue(keyIndex1 instanceof CompactMapRangeIndex);
// Put duplicate TestObject with "IBM" name.
region.put(Integer.toString(1), p);
Portfolio p2 = new Portfolio(2, 2);
HashMap map2 = new HashMap();
map2.put("YHOO", new TestObject("YHOO", 3));
map2.put("IBM", new TestObject("IBM", 2));
p2.positions = map2;
region.put(Integer.toString(2), p2);
// Following destroy fails if fix for 44123 is not there.
region.destroy(Integer.toString(1));
}
/**
* Test index object's comapreTo Function implementation correctness for indexes.
*/
@Test
public void testDuplicateKeysInRangeIndexOnLocalRegion() throws Exception {
IndexManager.TEST_RANGEINDEX_ONLY = true;
// Create Partition Region
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
Portfolio p = new Portfolio(1, 1);
HashMap map1 = new HashMap();
map1.put("SUN", new TestObject("SUN", 1));
map1.put("IBM", new TestObject("IBM", 2));
p.positions = map1;
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
assertTrue(keyIndex1 instanceof MapRangeIndex);
// Put duplicate TestObject with "IBM" name.
region.put(Integer.toString(1), p);
Portfolio p2 = new Portfolio(2, 2);
HashMap map2 = new HashMap();
map2.put("YHOO", new TestObject("YHOO", 3));
map2.put("IBM", new TestObject("IBM", 2));
p2.positions = map2;
region.put(Integer.toString(2), p2);
// Following destroy fails if fix for 44123 is not there.
region.destroy(Integer.toString(1));
}
@Test
public void testUndefinedForMapRangeIndex() throws Exception {
IndexManager.TEST_RANGEINDEX_ONLY = true;
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
keyIndex1 = qs.createIndex(INDEX_NAME, "positions['SUN', 'IBM']", "/portfolio ");
assertTrue("Index should be a MapRangeIndex ", keyIndex1 instanceof MapRangeIndex);
if (region.size() == 0) {
for (int i = 1; i <= 100; i++) {
// add some string objects generating UNDEFINEDs as index keys
if (i % 2 == 0) {
region.put(Integer.toString(i), "Portfolio-" + i);
} else {
region.put(Integer.toString(i), new Portfolio(i, i));
}
}
}
assertEquals(100, region.size());
qs.removeIndexes();
// recreate index to verify they get updated correctly
keyIndex1 = qs.createIndex(INDEX_NAME, "positions['SUN', 'IBM']", "/portfolio ");
assertTrue("Index should be a MapRangeIndex ", keyIndex1 instanceof MapRangeIndex);
}
@Test
public void testUndefinedForCompactMapRangeIndex() throws Exception {
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
keyIndex1 = qs.createIndex(INDEX_NAME, "positions['SUN', 'IBM']", "/portfolio ");
assertTrue("Index should be a CompactMapRangeIndex ",
keyIndex1 instanceof CompactMapRangeIndex);
if (region.size() == 0) {
for (int i = 1; i <= 100; i++) {
// add some string objects generating UNDEFINEDs as index keys
if (i % 2 == 0) {
region.put(Integer.toString(i), "Portfolio-" + i);
} else {
region.put(Integer.toString(i), new Portfolio(i, i));
}
}
}
assertEquals(100, region.size());
qs.removeIndexes();
// recreate index to verify they get updated correctly
keyIndex1 = qs.createIndex(INDEX_NAME, "positions['SUN', 'IBM']", "/portfolio ");
assertTrue("Index should be a CompactMapRangeIndex ",
keyIndex1 instanceof CompactMapRangeIndex);
}
@Test
public void testNullMapValuesInIndexOnLocalRegionForCompactMap() throws Exception {
region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.REPLICATE).create("portfolio");
qs = CacheUtils.getQueryService();
keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio ");
Portfolio p = new Portfolio(1, 1);
p.positions = new HashMap();
region.put(1, p);
Portfolio p2 = new Portfolio(2, 2);
p2.positions = null;
region.put(2, p2);
Portfolio p3 = new Portfolio(3, 3);
p3.positions = new HashMap();
p3.positions.put("IBM", "something");
p3.positions.put("SUN", null);
region.put(3, p3);
region.put(3, p3);
SelectResults result = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['SUN'] = null").execute();
assertEquals(1, result.size());
}
@Test
public void testNullMapValuesInIndexOnLocalRegionForMap() throws Exception {
IndexManager.TEST_RANGEINDEX_ONLY = true;
region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.REPLICATE).create("portfolio");
qs = CacheUtils.getQueryService();
keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio ");
Portfolio p = new Portfolio(1, 1);
p.positions = new HashMap();
region.put(1, p);
Portfolio p2 = new Portfolio(2, 2);
p2.positions = null;
region.put(2, p2);
Portfolio p3 = new Portfolio(3, 3);
p3.positions = new HashMap();
p3.positions.put("SUN", null);
region.put(3, p3);
SelectResults result = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['SUN'] = null").execute();
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 = 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 updatingAMapFieldSameKeysSameValuesShouldUpdateCorrectly() 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 = 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("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 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 = 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 = 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 = 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 updatingWithSameKeysDifferentValuesShouldRetainIndexMappings() 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 = 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());
}
@Test
public void updatingWithSameKeysDifferentValuesAfterRemovingShouldReinsertIndexMappings()
throws Exception {
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
Index keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
Portfolio p1 = new Portfolio(1, 1);
HashMap map1 = new HashMap();
map1.put("SUN", 1);
map1.put("IBM", 2);
p1.positions = map1;
region.put(1, p1);
Portfolio p2 = new Portfolio(1, 1);
HashMap map2 = new HashMap();
p2.positions = map2;
map2.put("GOOG", 1);
region.put(1, p2);
SelectResults results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['SUN'] = 1").execute();
assertEquals(0, results.size());
Portfolio p3 = new Portfolio(1, 1);
HashMap map3 = new HashMap();
p3.positions = map3;
map3.put("SUN", 3);
map3.put("IBM", 4);
region.put(1, p3);
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());
results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['GOOG'] = 1").execute();
assertEquals(0, results.size());
}
@Test
public void updatingWithSameKeysDifferentValuesAfterRemovingUsingRegionDestroyShouldReinsertIndexMappings()
throws Exception {
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
Index keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
Portfolio p1 = new Portfolio(1, 1);
HashMap map1 = new HashMap();
map1.put("SUN", 1);
map1.put("IBM", 2);
p1.positions = map1;
region.put(1, p1);
SelectResults results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['SUN'] = 1").execute();
assertEquals(1, results.size());
region.destroy(1);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(0, results.size());
Portfolio p3 = new Portfolio(1, 1);
HashMap map3 = new HashMap();
p3.positions = map3;
map3.put("SUN", 3);
map3.put("IBM", 4);
region.put(1, p3);
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());
results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['GOOG'] = 1").execute();
assertEquals(0, results.size());
}
@Test
public void updatingWithSameKeysDifferentValuesAfterRemovingUsingInplaceModificationShouldReinsertIndexMappings()
throws Exception {
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
Index keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
Portfolio p1 = new Portfolio(1, 1);
HashMap map1 = new HashMap();
map1.put("SUN", 1);
map1.put("IBM", 2);
p1.positions = map1;
region.put(1, p1);
SelectResults results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['SUN'] = 1").execute();
assertEquals(1, results.size());
map1.remove("SUN");
map1.remove("IBM");
map1.put("GOOG", 1);
region.put(1, p1);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(0, results.size());
Portfolio p3 = new Portfolio(1, 1);
HashMap map3 = new HashMap();
p3.positions = map3;
map3.put("SUN", 3);
map3.put("IBM", 4);
region.put(1, p3);
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());
results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['GOOG'] = 1").execute();
assertEquals(0, results.size());
}
@Test
public void updatingWithSameKeysSameValuesAfterRemovingShouldReinsertIndexMappings()
throws Exception {
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
Index keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
Portfolio p1 = new Portfolio(1, 1);
HashMap map1 = new HashMap();
map1.put("SUN", 1);
map1.put("IBM", 2);
p1.positions = map1;
region.put(1, p1);
SelectResults results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['SUN'] = 1").execute();
assertEquals(1, results.size());
Portfolio p2 = new Portfolio(1, 1);
HashMap map2 = new HashMap();
p2.positions = map2;
map2.put("GOOG", 1);
region.put(1, p2);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(0, results.size());
Portfolio p3 = new Portfolio(1, 1);
HashMap map3 = new HashMap();
p3.positions = map3;
map3.put("SUN", 1);
map3.put("IBM", 2);
region.put(1, p3);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(1, results.size());
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['IBM'] = 2")
.execute();
assertEquals(1, results.size());
}
@Test
public void updatingWithSameKeysSameValuesAfterRemovingUsingRegionDestroyShouldReinsertIndexMappings()
throws Exception {
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
Index keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
Portfolio p1 = new Portfolio(1, 1);
HashMap map1 = new HashMap();
map1.put("SUN", 1);
map1.put("IBM", 2);
p1.positions = map1;
region.put(1, p1);
SelectResults results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['SUN'] = 1").execute();
assertEquals(1, results.size());
region.destroy(1);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(0, results.size());
Portfolio p3 = new Portfolio(1, 1);
HashMap map3 = new HashMap();
p3.positions = map3;
map3.put("SUN", 1);
map3.put("IBM", 2);
region.put(1, p3);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(1, results.size());
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['IBM'] = 2")
.execute();
assertEquals(1, results.size());
}
@Test
public void updatingWithSameKeysSameValuesAfterRemovingUsingInPlaceModificationShouldReinsertIndexMappings()
throws Exception {
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
Index keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
Portfolio p1 = new Portfolio(1, 1);
HashMap map1 = new HashMap();
map1.put("SUN", 1);
map1.put("IBM", 2);
p1.positions = map1;
region.put(1, p1);
SelectResults results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['SUN'] = 1").execute();
assertEquals(1, results.size());
map1.remove("SUN");
map1.remove("IBM");
map1.put("GOOG", 2);
region.put(1, p1);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(0, results.size());
Portfolio p3 = new Portfolio(1, 1);
HashMap map3 = new HashMap();
p3.positions = map3;
map3.put("SUN", 1);
map3.put("IBM", 2);
region.put(1, p3);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(1, results.size());
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['IBM'] = 2")
.execute();
assertEquals(1, results.size());
}
@Test
public void updatingWithSameKeysSameValuesAfterRemovingShouldReinsertIndexMappingsWithTwoRegionPuts()
throws Exception {
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
Index keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
Portfolio p1 = new Portfolio(1, 1);
HashMap map1 = new HashMap();
map1.put("SUN", 1);
map1.put("IBM", 2);
p1.positions = map1;
region.put(1, p1);
Portfolio p2 = new Portfolio(1, 1);
HashMap map2 = new HashMap();
map2.put("SUN", 1);
map2.put("IBM", 2);
p2.positions = map1;
region.put(2, p2);
SelectResults results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['SUN'] = 1").execute();
assertEquals(2, results.size());
Portfolio p3 = new Portfolio(1, 1);
HashMap map3 = new HashMap();
p3.positions = map3;
map2.put("GOOG", 1);
region.put(1, p3);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(1, results.size());
Portfolio p4 = new Portfolio(1, 1);
HashMap map4 = new HashMap();
p4.positions = map4;
map4.put("SUN", 1);
map4.put("IBM", 2);
region.put(1, p4);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(2, results.size());
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['IBM'] = 2")
.execute();
assertEquals(2, results.size());
}
@Test
public void updatingWithSameKeysSameValuesAfterRemovingUsingRegionDestroyShouldReinsertIndexMappingsWithTwoRegionPuts()
throws Exception {
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
Index keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
Portfolio p1 = new Portfolio(1, 1);
HashMap map1 = new HashMap();
map1.put("SUN", 1);
map1.put("IBM", 2);
p1.positions = map1;
region.put(1, p1);
Portfolio p2 = new Portfolio(1, 1);
HashMap map2 = new HashMap();
map2.put("SUN", 1);
map2.put("IBM", 2);
p2.positions = map1;
region.put(2, p2);
SelectResults results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['SUN'] = 1").execute();
assertEquals(2, results.size());
region.destroy(1);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(1, results.size());
Portfolio p3 = new Portfolio(1, 1);
HashMap map3 = new HashMap();
p3.positions = map3;
map3.put("SUN", 1);
map3.put("IBM", 2);
region.put(1, p3);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(2, results.size());
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['IBM'] = 2")
.execute();
assertEquals(2, results.size());
}
@Test
public void updatingWithSameKeysSameValuesAfterRemovingUsingInPlaceModificationShouldReinsertIndexMappingsWithTwoRegionPuts()
throws Exception {
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
Index keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
Portfolio p1 = new Portfolio(1, 1);
HashMap map1 = new HashMap();
map1.put("SUN", 1);
map1.put("IBM", 2);
p1.positions = map1;
region.put(1, p1);
Portfolio p2 = new Portfolio(1, 1);
HashMap map2 = new HashMap();
map2.put("SUN", 1);
map2.put("IBM", 2);
p2.positions = map2;
region.put(2, p2);
SelectResults results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['SUN'] = 1").execute();
assertEquals(2, results.size());
map1.remove("SUN");
map1.remove("IBM");
map1.put("GOOG", 2);
region.put(1, p1);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(1, results.size());
Portfolio p3 = new Portfolio(1, 1);
HashMap map3 = new HashMap();
p3.positions = map3;
map3.put("SUN", 1);
map3.put("IBM", 2);
region.put(1, p3);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(2, results.size());
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['IBM'] = 2")
.execute();
assertEquals(2, results.size());
}
@Test
public void updatingWithSameKeysDifferentValuesAfterRemovingShouldReinsertIndexMappingsWithTwoRegionPuts()
throws Exception {
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
Index keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
Portfolio p1 = new Portfolio(1, 1);
HashMap map1 = new HashMap();
map1.put("SUN", 1);
map1.put("IBM", 2);
p1.positions = map1;
region.put(1, p1);
Portfolio p3 = new Portfolio(1, 1);
HashMap map3 = new HashMap();
p3.positions = map3;
map3.put("SUN", 5);
map3.put("IBM", 6);
region.put(2, p3);
Portfolio p2 = new Portfolio(1, 1);
HashMap map2 = new HashMap();
p2.positions = map2;
map2.put("GOOG", 1);
region.put(1, p2);
SelectResults results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['SUN'] = 1").execute();
assertEquals(0, results.size());
Portfolio p4 = new Portfolio(1, 1);
HashMap map4 = new HashMap();
p4.positions = map4;
map4.put("SUN", 3);
map4.put("IBM", 4);
region.put(1, p4);
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());
results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['GOOG'] = 1").execute();
assertEquals(0, results.size());
}
@Test
public void updatingWithSameKeysDifferentValuesAfterRemovingUsingRegionDestroyShouldReinsertIndexMappingsWithTwoRegionPuts()
throws Exception {
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
Index keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
Portfolio p1 = new Portfolio(1, 1);
HashMap map1 = new HashMap();
map1.put("SUN", 1);
map1.put("IBM", 2);
p1.positions = map1;
region.put(1, p1);
Portfolio p2 = new Portfolio(1, 1);
HashMap map2 = new HashMap();
map2.put("SUN", 5);
map2.put("IBM", 6);
p2.positions = map2;
region.put(2, p2);
SelectResults results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['SUN'] = 1").execute();
assertEquals(1, results.size());
region.destroy(1);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(0, results.size());
Portfolio p3 = new Portfolio(1, 1);
HashMap map3 = new HashMap();
p3.positions = map3;
map3.put("SUN", 3);
map3.put("IBM", 4);
region.put(1, p3);
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());
results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['GOOG'] = 1").execute();
assertEquals(0, results.size());
}
@Test
public void updatingWithSameKeysDifferentValuesAfterRemovingUsingInplaceModificationShouldReinsertIndexMappingsWithTwoRegionPuts()
throws Exception {
AttributesFactory af = new AttributesFactory();
af.setScope(Scope.LOCAL);
region = CacheUtils.createRegion("portfolio", af.create(), false);
qs = CacheUtils.getQueryService();
Index keyIndex1 = qs.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
Portfolio p1 = new Portfolio(1, 1);
HashMap map1 = new HashMap();
map1.put("SUN", 1);
map1.put("IBM", 2);
p1.positions = map1;
region.put(1, p1);
Portfolio p2 = new Portfolio(1, 1);
HashMap map2 = new HashMap();
map2.put("SUN", 5);
map2.put("IBM", 6);
p2.positions = map2;
region.put(2, p2);
SelectResults results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['SUN'] = 1").execute();
assertEquals(1, results.size());
map1.remove("SUN");
map1.remove("IBM");
map1.put("GOOG", 1);
region.put(1, p1);
results = (SelectResults) qs.newQuery("select * from /portfolio p where p.positions['SUN'] = 1")
.execute();
assertEquals(0, results.size());
Portfolio p3 = new Portfolio(1, 1);
HashMap map3 = new HashMap();
p3.positions = map3;
map3.put("SUN", 3);
map3.put("IBM", 4);
region.put(1, p3);
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());
results = (SelectResults) qs
.newQuery("select * from /portfolio p where p.positions['GOOG'] = 1").execute();
assertEquals(0, results.size());
}
/**
* TestObject with wrong comareTo() implementation implementation. Which throws NullPointer while
* removing mapping from a MapRangeIndex.
*/
private static class TestObject implements Cloneable, Comparable {
String name;
int id;
public TestObject(String name, int id) {
this.name = name;
this.id = id;
}
@Override
public int compareTo(Object o) {
if (id == ((TestObject) o).id) {
return 0;
} else {
return id > ((TestObject) o).id ? -1 : 1;
}
}
}
private static class MyQueryObserverAdapter extends IndexTrackingQueryObserver {
public boolean indexUsed = false;
@Override
public void afterIndexLookup(Collection results) {
super.afterIndexLookup(results);
indexUsed = true;
}
}
}