ignite-sprint-3 - map query sort limit fix (IGNITE-682)
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/2f34c46a Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/2f34c46a Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/2f34c46a Branch: refs/heads/ignite-639 Commit: 2f34c46a695ed93f39cbc9f32b790f443fe0596b Parents: 88268bf Author: S.Vladykin <svlady...@gridgain.com> Authored: Mon Apr 6 17:41:17 2015 +0300 Committer: S.Vladykin <svlady...@gridgain.com> Committed: Mon Apr 6 17:41:17 2015 +0300 ---------------------------------------------------------------------- .../query/h2/sql/GridSqlQuerySplitter.java | 22 ++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2f34c46a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuerySplitter.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuerySplitter.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuerySplitter.java index 77e0cc8..b3deea3 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuerySplitter.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuerySplitter.java @@ -77,8 +77,10 @@ public class GridSqlQuerySplitter { Set<String> colNames = new HashSet<>(); + boolean aggregateFound = false; + for (int i = 0, len = mapExps.size(); i < len; i++) // Remember len because mapExps list can grow. - splitSelectExpression(mapExps, rdcExps, colNames, i); + aggregateFound |= splitSelectExpression(mapExps, rdcExps, colNames, i); // Fill select expressions. mapQry.clearSelect(); @@ -110,15 +112,20 @@ public class GridSqlQuerySplitter { // -- ORDER BY if (!srcQry.sort().isEmpty()) { - mapQry.clearSort(); + if (aggregateFound) // Ordering over aggregates does not make sense. + mapQry.clearSort(); // Otherwise map sort will be used by offset-limit. for (GridSqlSortColumn sortCol : srcQry.sort().values()) rdcQry.addSort(column(((GridSqlAlias)mapExps.get(sortCol.column())).alias()), sortCol); } // -- LIMIT - if (srcQry.limit() != null) + if (srcQry.limit() != null) { + if (aggregateFound) + mapQry.limit(null); + rdcQry.limit(srcQry.limit()); + } // -- OFFSET if (srcQry.offset() != null) { @@ -209,19 +216,24 @@ public class GridSqlQuerySplitter { * @param rdcSelect Selects for reduce query. * @param colNames Set of unique top level column names. * @param idx Index. + * @return {@code true} If aggregate was found. */ - private static void splitSelectExpression(List<GridSqlElement> mapSelect, GridSqlElement[] rdcSelect, + private static boolean splitSelectExpression(List<GridSqlElement> mapSelect, GridSqlElement[] rdcSelect, Set<String> colNames, int idx) { GridSqlElement el = mapSelect.get(idx); GridSqlAlias alias = null; + boolean aggregateFound = false; + if (el instanceof GridSqlAlias) { // Unwrap from alias. alias = (GridSqlAlias)el; el = alias.child(); } if (el instanceof GridSqlAggregateFunction) { + aggregateFound = true; + GridSqlAggregateFunction agg = (GridSqlAggregateFunction)el; GridSqlElement mapAgg, rdcAgg; @@ -322,6 +334,8 @@ public class GridSqlQuerySplitter { rdcSelect[idx] = rdcEl; } } + + return aggregateFound; } /**