Repository: geode Updated Branches: refs/heads/develop db81d9280 -> 9c4086813
GEODE-2967: ResultCollection instead of StructCollection * If we have one runtime iterator which is in case of self joins, ResultSet or ResultBags are created * Otherwise StructBag or StructSets are used Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/9c408681 Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/9c408681 Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/9c408681 Branch: refs/heads/develop Commit: 9c408681364973096cf4192255ec3f40d86b70bd Parents: db81d92 Author: nabarun <n...@pivotal.io> Authored: Mon May 22 11:34:52 2017 -0700 Committer: nabarun <n...@pivotal.io> Committed: Tue May 23 13:50:49 2017 -0700 ---------------------------------------------------------------------- .../geode/cache/query/internal/QueryUtils.java | 21 +++++---- .../query/internal/index/IndexUseJUnitTest.java | 47 +++++++++++++++++++- 2 files changed, 58 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/9c408681/geode-core/src/main/java/org/apache/geode/cache/query/internal/QueryUtils.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/cache/query/internal/QueryUtils.java b/geode-core/src/main/java/org/apache/geode/cache/query/internal/QueryUtils.java index bb0cbea..4d43729 100644 --- a/geode-core/src/main/java/org/apache/geode/cache/query/internal/QueryUtils.java +++ b/geode-core/src/main/java/org/apache/geode/cache/query/internal/QueryUtils.java @@ -23,6 +23,7 @@ import java.util.ListIterator; import java.util.Map; import java.util.Set; +import org.apache.geode.cache.query.internal.types.ObjectTypeImpl; import org.apache.logging.log4j.Logger; import org.apache.geode.cache.query.AmbiguousNameException; @@ -806,8 +807,6 @@ public class QueryUtils { * */ static StructType createStructTypeForRuntimeIterators(List runTimeIterators) { - Support.Assert(runTimeIterators.size() > 1, - "The number of Iterators passed should be greater than 1 to create a structSet"); int len = runTimeIterators.size(); String[] fieldNames = new String[len]; String[] indexAlternativeFieldNames = new String[len]; @@ -886,10 +885,9 @@ public class QueryUtils { } return null; } - - Index lhsIndx = lhsIndxData.getIndex(); - Index rhsIndx = rhsIndxData.getIndex(); - if (((IndexProtocol) lhsIndx).isValid() && ((IndexProtocol) rhsIndx).isValid()) { + IndexProtocol lhsIndx = lhsIndxData.getIndex(); + IndexProtocol rhsIndx = rhsIndxData.getIndex(); + if (lhsIndx.isValid() && rhsIndx.isValid()) { return new IndexData[] {lhsIndxData, rhsIndxData}; } return null; @@ -1463,10 +1461,15 @@ public class QueryUtils { } } } - Support.Assert(totalFinalList.size() > 1, - " Since we are in relationship index this itself means that we have atleast two RuntimeIterators"); + SelectResults returnSet; StructType stype = createStructTypeForRuntimeIterators(totalFinalList); - SelectResults returnSet = QueryUtils.createStructCollection(context, stype); + if (totalFinalList.size() == 1) { + returnSet = QueryUtils.createResultCollection(context, new ObjectTypeImpl(stype.getClass())); + } else { + returnSet = QueryUtils.createStructCollection(context, stype); + } + + RuntimeIterator[][] mappings = new RuntimeIterator[2][]; mappings[0] = ich1.indexFieldToItrsMapping; mappings[1] = ich2.indexFieldToItrsMapping; http://git-wip-us.apache.org/repos/asf/geode/blob/9c408681/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 c865347..c55f3f3 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 @@ -1367,7 +1367,7 @@ public class IndexUseJUnitTest { @Test public void testIndexUseSelfJoin() throws Exception { - String[] queries = {"SELECT DISTINCT * FROM /pos p1, /pos p2 where p1.status = p2.status", + 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", "SELECT DISTINCT * FROM /pos p1, /pos p2 where p1.P1.secId = p2.P1.secId", "SELECT DISTINCT * FROM /pos p1, /pos p2 where p1.status = p2.status and p1.status = 'active'", @@ -1407,6 +1407,51 @@ public class IndexUseJUnitTest { } @Test + public void testIndexUseSelfJoinUsingOneRegion() throws Exception { + String[] queries = {"SELECT DISTINCT * FROM /pos p1 where p1.status = p1.status", + "SELECT DISTINCT * FROM /pos p1 where p1.ID = p1.ID", + "SELECT DISTINCT * FROM /pos p1 where p1.P1.secId = p1.P1.secId", + "SELECT DISTINCT * FROM /pos p1 where p1.status = p1.status and p1.status = 'active'", + "SELECT DISTINCT * FROM /pos p1 where p1.ID = p1.ID and p1.ID < 2", + "SELECT * FROM /pos p1 where p1.ID = p1.ID", + "SELECT * FROM /pos p1 where p1.P1.secId = p1.P1.secId", + "SELECT * FROM /pos p1 where p1.status = p1.status and p1.status = 'active'", + "SELECT * FROM /pos p1 where p1.ID = p1.ID and p1.ID < 2", + "SELECT DISTINCT * FROM /pos p1 WHERE p1.ID IN (SELECT DISTINCT p1.ID FROM /pos p1)", + "SELECT * FROM /pos p1 WHERE p1.ID IN (SELECT DISTINCT p1.ID FROM /pos p1)", + "SELECT DISTINCT * FROM /pos p1 WHERE p1.ID IN (SELECT DISTINCT p2.ID FROM /pos p2)", + "SELECT * FROM /pos p1 WHERE p1.ID IN (SELECT DISTINCT p2.ID FROM /pos p2)"}; + + SelectResults[][] sr = new SelectResults[queries.length][2]; + for (int j = 0; j < queries.length; j++) { + Query q = qs.newQuery(queries[j]); + QueryObserverImpl observer = new QueryObserverImpl(); + QueryObserverHolder.setInstance(observer); + sr[j][0] = (SelectResults) q.execute(); + if (sr[j][0].size() == 0) { + fail("Query " + q.getQueryString() + " should have returned results"); + } + if (!observer.isIndexesUsed) { + fail("Index should have been used for query '" + q.getQueryString() + "'"); + } + } + qs.removeIndexes(); + for (int j = 0; j < queries.length; j++) { + Query q = qs.newQuery(queries[j]); + QueryObserverImpl observer = new QueryObserverImpl(); + QueryObserverHolder.setInstance(observer); + sr[j][1] = (SelectResults) q.execute(); + if (sr[j][1].size() == 0) { + fail("Query " + q.getQueryString() + " should have returned results"); + } + if (observer.isIndexesUsed) { + fail("Index should not be used for query '" + q.getQueryString() + "'"); + } + } + CacheUtils.compareResultsOfWithAndWithoutIndex(sr); + } + + @Test public void testUndefinedResultsAreReturnedWhenANotEqualsQueryIsExecuted() throws Exception { Portfolio p1 = new Portfolio(0); p1.position1 = null;