GEODE-2961: Fixed distinct multiple OR query returning partial results
Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/456ee157 Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/456ee157 Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/456ee157 Branch: refs/heads/feature/GEODE-2632-17 Commit: 456ee15768fb08c8e1c8c5836479d27e1bc61835 Parents: 9c40868 Author: David Anuta <david.r.an...@gmail.com> Authored: Tue May 23 13:53:19 2017 -0700 Committer: nabarun <n...@pivotal.io> Committed: Tue May 23 14:05:41 2017 -0700 ---------------------------------------------------------------------- .../internal/AbstractGroupOrRangeJunction.java | 2 +- .../query/internal/index/IndexUseJUnitTest.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/456ee157/geode-core/src/main/java/org/apache/geode/cache/query/internal/AbstractGroupOrRangeJunction.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/cache/query/internal/AbstractGroupOrRangeJunction.java b/geode-core/src/main/java/org/apache/geode/cache/query/internal/AbstractGroupOrRangeJunction.java index 5ed4d86..35f0290 100644 --- a/geode-core/src/main/java/org/apache/geode/cache/query/internal/AbstractGroupOrRangeJunction.java +++ b/geode-core/src/main/java/org/apache/geode/cache/query/internal/AbstractGroupOrRangeJunction.java @@ -325,7 +325,7 @@ public abstract class AbstractGroupOrRangeJunction extends AbstractCompiledValue if (intermediateResults == null) { intermediateResults = filterResults; } else if (isDistinct && !isConditioningNeeded) { - intermediateResults = filterResults; + intermediateResults.addAll(filterResults); } else { intermediateResults = QueryUtils.union(intermediateResults, filterResults, context); } http://git-wip-us.apache.org/repos/asf/geode/blob/456ee157/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/IndexUseJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/IndexUseJUnitTest.java b/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/IndexUseJUnitTest.java index c55f3f3..9c8756c 100644 --- a/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/IndexUseJUnitTest.java +++ b/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/IndexUseJUnitTest.java @@ -1366,6 +1366,22 @@ public class IndexUseJUnitTest { } @Test + public void queryWithOrClauseShouldReturnCorrectResultSet() throws Exception { + String query = + "SELECT DISTINCT p1.ID FROM /pos p1 where p1.ID IN SET (0,1) OR p1.status = 'active'"; + + Query q = qs.newQuery(query); + QueryObserverImpl observer = new QueryObserverImpl(); + QueryObserverHolder.setInstance(observer); + SelectResults sr = (SelectResults) q.execute(); + if (!observer.isIndexesUsed) + fail("Index should have been used for query '" + q.getQueryString() + "'"); + + assertEquals(sr.size(), 3); + qs.removeIndexes(); + } + + @Test public void testIndexUseSelfJoin() throws Exception { String[] queries = {"SELECT DISTINCT * FROM /pos p1, /pos p2 where p1.status = p1.status", "SELECT DISTINCT * FROM /pos p1, /pos p2 where p1.ID = p2.ID",