You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ja...@apache.org on 2017/10/05 23:01:57 UTC
[geode] 01/03: GEODE-3736: CompactRangeIndex getSizeEstimate should
not throw ClassCastExceptions
This is an automated email from the ASF dual-hosted git repository.
jasonhuynh pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git
commit 13143fb481b9b6fd66da73a3787684cc555ba1ad
Author: Jason Huynh <hu...@gmail.com>
AuthorDate: Wed Oct 4 11:08:47 2017 -0700
GEODE-3736: CompactRangeIndex getSizeEstimate should not throw ClassCastExceptions
* Minor refactor of CorruptedIndexIntegrationTest
* Refactored CompactRangeIndexQueryIntegrationTest to use ServerStarterRule
---
.../query/internal/index/CompactRangeIndex.java | 5 +++
.../query/dunit/CorruptedIndexIntegrationTest.java | 29 ++-------------
.../CompactRangeIndexQueryIntegrationTest.java | 41 ++++++++++++++++++++--
3 files changed, 45 insertions(+), 30 deletions(-)
diff --git a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/CompactRangeIndex.java b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/CompactRangeIndex.java
index ad4f3a1..2cb7857 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/CompactRangeIndex.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/CompactRangeIndex.java
@@ -429,6 +429,11 @@ public class CompactRangeIndex extends AbstractIndex {
}
break;
}
+ } catch (ClassCastException e) {
+ //no values will match in this index because the key types are not the same
+ //This means that there will be 0 results and it will be fast to use this index
+ //because it has filtered everything out
+ return 0;
} catch (EntryDestroyedException ignore) {
return Integer.MAX_VALUE;
} finally {
diff --git a/geode-core/src/test/java/org/apache/geode/cache/query/dunit/CorruptedIndexIntegrationTest.java b/geode-core/src/test/java/org/apache/geode/cache/query/dunit/CorruptedIndexIntegrationTest.java
index b7a3742..64ff11e 100644
--- a/geode-core/src/test/java/org/apache/geode/cache/query/dunit/CorruptedIndexIntegrationTest.java
+++ b/geode-core/src/test/java/org/apache/geode/cache/query/dunit/CorruptedIndexIntegrationTest.java
@@ -63,14 +63,11 @@ public class CorruptedIndexIntegrationTest extends JUnit4CacheTestCase {
IntStream.rangeClosed(1, 3).forEach(i -> region.put(i, new Portfolio(i)));
-
assertEquals("Uncorrupted index must have all the entries", 3,
idIndex.getStatistics().getNumberOfValues());
assertEquals("Corrupted index should not have indexed any entries", 0,
exceptionIndex.getStatistics().getNumberOfValues());
-
SelectResults results = (SelectResults) queryService.newQuery(queryString).execute();
-
assertEquals("Query execution must be successful ", 1, results.size());
}
@@ -100,9 +97,7 @@ public class CorruptedIndexIntegrationTest extends JUnit4CacheTestCase {
assertEquals("Uncorrupted index must have all the entries ", 3,
idIndex.getStatistics().getNumberOfValues());
-
SelectResults results = (SelectResults) queryService.newQuery(queryString).execute();
-
assertEquals("Query execution must be successful ", 1, results.size());
}
@@ -155,12 +150,9 @@ public class CorruptedIndexIntegrationTest extends JUnit4CacheTestCase {
map2.put("APPL", 3);
map2.put("AOL", "hello");
p2.positions = map2;
-
region.put(2, p2);
assertEquals("Put must be successful", 2, region.size());
-
-
assertEquals("Index must be invalid at this point ", false, keyIndex1.isValid());
QueryObserverImpl observer = new QueryObserverImpl();
@@ -170,12 +162,9 @@ public class CorruptedIndexIntegrationTest extends JUnit4CacheTestCase {
.newQuery(
"select * from /portfolio p where p.positions['AOL'] = 'hello' OR p.positions['IBM'] = 2")
.execute();
-
assertEquals("Correct results expected from the query execution ", 2, results.size());
-
assertEquals("No index must be used while executing the query ", 0,
observer.indexesUsed.size());
-
}
@Test
@@ -203,7 +192,6 @@ public class CorruptedIndexIntegrationTest extends JUnit4CacheTestCase {
map2.put("APPL", 3);
map2.put("AOL", "hello");
p2.positions = map2;
-
region.put(2, p2);
assertEquals("Put must be successful", 2, region.size());
@@ -226,12 +214,9 @@ public class CorruptedIndexIntegrationTest extends JUnit4CacheTestCase {
.newQuery(
"select * from /portfolio p where p.positions['AOL'] = 'hello' OR p.positions['IBM'] = 2")
.execute();
-
assertEquals("Current results expected from the query execution ", 2, results.size());
-
assertEquals("No index must be used while executing the query ", 0,
observer.indexesUsed.size());
-
}
@Test
@@ -240,7 +225,6 @@ public class CorruptedIndexIntegrationTest extends JUnit4CacheTestCase {
String regionName = "portfolio";
String INDEX_NAME = "key_index1";
-
Cache cache = getCache();
Region region =
cache.createRegionFactory().setDataPolicy(DataPolicy.PARTITION).create(regionName);
@@ -258,19 +242,13 @@ public class CorruptedIndexIntegrationTest extends JUnit4CacheTestCase {
map2.put("APPL", 3);
map2.put("AOL", "hello");
p2.positions = map2;
-
region.put(2, p2);
assertEquals("Put must be successful", 2, region.size());
QueryService queryService = cache.getQueryService();
-
- try {
- Index keyIndex1 = queryService.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
- assertEquals("Index must be valid", true, keyIndex1.isValid());
- } catch (Exception exception) {
- fail();
- }
+ Index keyIndex1 = queryService.createIndex(INDEX_NAME, "positions[*]", "/portfolio");
+ assertEquals("Index must be valid", true, keyIndex1.isValid());
QueryObserverImpl observer = new QueryObserverImpl();
QueryObserverHolder.setInstance(observer);
@@ -279,11 +257,8 @@ public class CorruptedIndexIntegrationTest extends JUnit4CacheTestCase {
.newQuery(
"select * from /portfolio p where p.positions['AOL'] = 'hello' OR p.positions['IBM'] = 2")
.execute();
-
assertEquals("Current results expected from the query execution ", 2, results.size());
-
assertEquals("Index must be used while executing the query ", 2, observer.indexesUsed.size());
-
}
diff --git a/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/CompactRangeIndexQueryIntegrationTest.java b/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/CompactRangeIndexQueryIntegrationTest.java
index 15a8c55..e970e7d 100644
--- a/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/CompactRangeIndexQueryIntegrationTest.java
+++ b/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/CompactRangeIndexQueryIntegrationTest.java
@@ -19,10 +19,12 @@ import static org.junit.Assert.*;
import java.util.HashMap;
import java.util.Map;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.geode.cache.Cache;
+import org.apache.geode.cache.DataPolicy;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.RegionShortcut;
import org.apache.geode.cache.client.internal.Op;
@@ -31,8 +33,11 @@ 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.Portfolio;
import org.apache.geode.cache.query.data.PortfolioPdx;
+import org.apache.geode.cache.query.dunit.CorruptedIndexIntegrationTest;
+import org.apache.geode.cache.query.internal.QueryObserverHolder;
import org.apache.geode.cache.query.internal.index.CompactRangeIndex;
import org.apache.geode.cache.query.internal.index.IndexProtocol;
import org.apache.geode.internal.cache.LocalRegion;
@@ -44,14 +49,18 @@ import org.apache.geode.test.dunit.VM;
import org.apache.geode.test.dunit.cache.internal.JUnit4CacheTestCase;
import org.apache.geode.test.junit.categories.DistributedTest;
import org.apache.geode.test.junit.categories.IntegrationTest;
+import org.apache.geode.test.junit.rules.ServerStarterRule;
@Category(IntegrationTest.class)
public class CompactRangeIndexQueryIntegrationTest {
+ @Rule
+ public ServerStarterRule serverStarterRule = new ServerStarterRule().withAutoStart();
+
@Test
public void multipleNotEqualsClausesOnAPartitionedRegionShouldReturnCorrectResults()
throws Exception {
- Cache cache = CacheUtils.getCache();
+ Cache cache = serverStarterRule.getCache();
Region region = cache.createRegionFactory(RegionShortcut.PARTITION).create("portfolios");
int numMatching = 10;
QueryService qs = cache.getQueryService();
@@ -73,8 +82,7 @@ public class CompactRangeIndexQueryIntegrationTest {
@Test
public void whenAuxFilterWithAnIterableFilterShouldNotCombineFiltersIntoAndJunction()
throws Exception {
- CacheUtils.startCache();
- Cache cache = CacheUtils.getCache();
+ Cache cache = serverStarterRule.getCache();
Region region = cache.createRegionFactory(RegionShortcut.PARTITION).create("ExampleRegion");
QueryService qs = cache.getQueryService();
qs.createIndex("ExampleRegionIndex", "er['codeNumber','origin']", "/ExampleRegion er");
@@ -98,4 +106,31 @@ public class CompactRangeIndexQueryIntegrationTest {
SelectResults rs = (SelectResults) q.execute();
assertEquals(4, rs.size());
}
+
+ @Test
+ public void getSizeEstimateShouldNotThrowClassCastException()
+ throws Exception {
+ String regionName = "portfolio";
+
+ Cache cache = serverStarterRule.getCache();
+ assertNotNull(cache);
+ Region region = cache.createRegionFactory().setDataPolicy(DataPolicy.REPLICATE).create(regionName);
+
+ Portfolio p = new Portfolio(1, 2);
+ region.put(1, p);
+
+ Portfolio p2 = new Portfolio(3, 4);
+ region.put(2, p2);
+
+ QueryService queryService = cache.getQueryService();
+ CompactRangeIndex statusIndex = (CompactRangeIndex)queryService.createIndex("statusIndex", "status", "/portfolio");
+ CompactRangeIndex idIndex = (CompactRangeIndex)queryService.createIndex("idIndex", "ID", "/portfolio");
+
+ SelectResults results = (SelectResults) queryService
+ .newQuery(
+ "select * from /portfolio where status = 4 AND ID = 'StringID'")
+ .execute();
+
+ assertNotNull(results);
+ }
}
--
To stop receiving notification emails like this one, please contact
"commits@geode.apache.org" <co...@geode.apache.org>.