Return-Path: X-Original-To: apmail-ignite-commits-archive@minotaur.apache.org Delivered-To: apmail-ignite-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id C9F9217E97 for ; Wed, 8 Apr 2015 21:27:04 +0000 (UTC) Received: (qmail 79458 invoked by uid 500); 8 Apr 2015 21:26:59 -0000 Delivered-To: apmail-ignite-commits-archive@ignite.apache.org Received: (qmail 79401 invoked by uid 500); 8 Apr 2015 21:26:59 -0000 Mailing-List: contact commits-help@ignite.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.incubator.apache.org Delivered-To: mailing list commits@ignite.incubator.apache.org Received: (qmail 79362 invoked by uid 99); 8 Apr 2015 21:26:59 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 08 Apr 2015 21:26:59 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED,T_RP_MATCHES_RCVD X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO mail.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with SMTP; Wed, 08 Apr 2015 21:26:56 +0000 Received: (qmail 78131 invoked by uid 99); 8 Apr 2015 21:26:36 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 08 Apr 2015 21:26:36 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id CDBE2E17FB; Wed, 8 Apr 2015 21:26:35 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: vkulichenko@apache.org To: commits@ignite.incubator.apache.org Date: Wed, 08 Apr 2015 21:26:43 -0000 Message-Id: In-Reply-To: <105292ce6da245afa4436d56379d56ec@git.apache.org> References: <105292ce6da245afa4436d56379d56ec@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [09/50] [abbrv] incubator-ignite git commit: ignite-624 X-Virus-Checked: Checked by ClamAV on apache.org ignite-624 Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/25f900ed Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/25f900ed Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/25f900ed Branch: refs/heads/ignite-471 Commit: 25f900edac7d3a213ec30de673251777739848a5 Parents: 71fa3a2 Author: S.Vladykin Authored: Tue Apr 7 09:54:56 2015 +0300 Committer: S.Vladykin Committed: Tue Apr 7 09:54:56 2015 +0300 ---------------------------------------------------------------------- .../processors/query/h2/sql/GridSqlQuery.java | 103 +++++++++---------- .../query/h2/sql/GridSqlQueryParser.java | 41 +++++--- .../query/h2/sql/GridSqlQuerySplitter.java | 96 ++++++++++++----- .../processors/query/h2/sql/GridSqlSelect.java | 72 ++++++++----- .../processors/query/h2/sql/GridSqlUnion.java | 42 +------- 5 files changed, 192 insertions(+), 162 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/25f900ed/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuery.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuery.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuery.java index db1dcbf..5953d5e 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuery.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuery.java @@ -17,6 +17,9 @@ package org.apache.ignite.internal.processors.query.h2.sql; +import org.apache.ignite.*; +import org.h2.util.*; + import java.util.*; /** @@ -27,13 +30,7 @@ public abstract class GridSqlQuery implements Cloneable { protected boolean distinct; /** */ - protected List allExprs; - - /** */ - protected List select = new ArrayList<>(); - - /** */ - protected Map sort = new LinkedHashMap<>(); + protected List sort = new ArrayList<>(); /** */ protected GridSqlElement offset; @@ -89,66 +86,66 @@ public abstract class GridSqlQuery implements Cloneable { public abstract String getSQL(); /** - * @param expression Expression. - */ - public void addExpression(GridSqlElement expression) { - if (allExprs == null) - allExprs = new ArrayList<>(); - - allExprs.add(expression); - } - - /** - * @return All expressions in select, group by, order by. + * @return Sort. */ - public List allExpressions() { - return allExprs; + public List sort() { + return sort; } /** - * @return Expressions. + * */ - public List select() { - return select; + public void clearSort() { + sort = new ArrayList<>(); } /** - * Clears select list. + * @param sortCol The sort column. */ - public void clearSelect() { - select = new ArrayList<>(); + public void addSort(GridSqlSortColumn sortCol) { + sort.add(sortCol); } /** - * @param expression Expression. + * @param buff Statement builder. */ - public void addSelectExpression(GridSqlElement expression) { - if (expression == null) - throw new NullPointerException(); - - select.add(expression); - } + protected void getSortLimitSQL(StatementBuilder buff) { + if (!sort.isEmpty()) { + buff.append("\nORDER BY "); + + boolean first = true; + + for (GridSqlSortColumn col : sort) { + if (first) + first = false; + else + buff.append(", "); + + int idx = col.column(); + + if (idx >= 0) + buff.append(idx + 1); + else { + throw new IgniteException("Failed to generate query: " + buff); +// buff.append('=').append(StringUtils.unEnclose(entry.getKey().getSQL())); + } + + if (!col.asc()) + buff.append(" DESC"); + + if (col.nullsFirst()) + buff.append(" NULLS FIRST"); + else if (col.nullsLast()) + buff.append(" NULLS LAST"); + } + } - /** - * @return Sort. - */ - public Map sort() { - return sort; - } + if (limit != null) + buff.append(" LIMIT ").append(StringUtils.unEnclose(limit.getSQL())); - /** - * - */ - public void clearSort() { - sort = new LinkedHashMap<>(); - } + if (offset != null) + buff.append(" OFFSET ").append(StringUtils.unEnclose(offset.getSQL())); - /** - * @param expression Expression. - * @param sortType The sort type bit mask (SortOrder.DESCENDING, SortOrder.NULLS_FIRST, SortOrder.NULLS_LAST). - */ - public void addSort(GridSqlElement expression, GridSqlSortColumn sortType) { - sort.put(expression, sortType); } /** {@inheritDoc} */ @@ -157,9 +154,7 @@ public abstract class GridSqlQuery implements Cloneable { try { GridSqlQuery res = (GridSqlQuery)super.clone(); - res.select = new ArrayList<>(select); - res.sort = new LinkedHashMap<>(sort); - res.allExprs = null; + res.sort = new ArrayList<>(sort); return res; } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/25f900ed/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java index fb341c1..ea3628f 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java @@ -293,22 +293,7 @@ public class GridSqlQueryParser { for (int i = 0; i < select.getColumnCount(); i++) res.addSelectExpression(parseExpression(expressions.get(i))); - SortOrder sortOrder = select.getSortOrder(); - - if (sortOrder != null) { - int[] indexes = sortOrder.getQueryColumnIndexes(); - int[] sortTypes = sortOrder.getSortTypes(); - - for (int i = 0; i < indexes.length; i++) { - int colIdx = indexes[i]; - int type = sortTypes[i]; - - res.addSort(parseExpression(expressions.get(colIdx)), new GridSqlSortColumn(colIdx, - (type & SortOrder.DESCENDING) == 0, - (type & SortOrder.NULLS_FIRST) != 0, - (type & SortOrder.NULLS_LAST) != 0)); - } - } + processSortOrder(select.getSortOrder(), res); res.limit(parseExpression(select.getLimit())); res.offset(parseExpression(select.getOffset())); @@ -317,6 +302,28 @@ public class GridSqlQueryParser { } /** + * @param sortOrder Sort order. + * @param qry Query. + */ + private void processSortOrder(SortOrder sortOrder, GridSqlQuery qry) { + if (sortOrder == null) + return; + + int[] indexes = sortOrder.getQueryColumnIndexes(); + int[] sortTypes = sortOrder.getSortTypes(); + + for (int i = 0; i < indexes.length; i++) { + int colIdx = indexes[i]; + int type = sortTypes[i]; + + qry.addSort(new GridSqlSortColumn(colIdx, + (type & SortOrder.DESCENDING) == 0, + (type & SortOrder.NULLS_FIRST) != 0, + (type & SortOrder.NULLS_LAST) != 0)); + } + } + + /** * @param qry Select. */ public GridSqlQuery parse(Query qry) { @@ -348,7 +355,7 @@ public class GridSqlQueryParser { res.limit(parseExpression(union.getLimit())); res.offset(parseExpression(union.getOffset())); - assert UNION_SORT.get(union) == null; // todo IGNITE-624 + processSortOrder(UNION_SORT.get(union), res); h2ObjToGridObj.put(union, res); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/25f900ed/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 f343b01..05928c2 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 @@ -57,6 +57,17 @@ public class GridSqlQuerySplitter { } /** + * @param qry Query. + * @return Leftest simple query if this is UNION. + */ + private static GridSqlSelect leftest(GridSqlQuery qry) { + if (qry instanceof GridSqlUnion) + return leftest(((GridSqlUnion)qry).left()); + + return (GridSqlSelect)qry; + } + + /** * @param stmt Prepared statement. * @param params Parameters. * @return Two step query. @@ -65,21 +76,58 @@ public class GridSqlQuerySplitter { if (params == null) params = GridCacheSqlQuery.EMPTY_PARAMS; - GridSqlQuery srcQry = GridSqlQueryParser.parse(stmt); + GridSqlQuery qry0 = GridSqlQueryParser.parse(stmt); + + GridSqlSelect srcQry; + + if (qry0 instanceof GridSqlSelect) + srcQry = (GridSqlSelect)qry0; + else { + srcQry = new GridSqlSelect().from(new GridSqlSubquery(qry0)); + + GridSqlSelect left = leftest(qry0); + + int c = 0; + + for (GridSqlElement expr : left.select()) { + String colName; + + if (expr instanceof GridSqlAlias) + colName = ((GridSqlAlias)expr).alias(); + else if (expr instanceof GridSqlColumn) + colName = ((GridSqlColumn)expr).columnName(); + else { + colName = columnName(c); - if (!(srcQry instanceof GridSqlSelect)) - throw new UnsupportedOperationException(); // todo IGNITE-624 Support UNION, + expr = alias(colName, expr); - GridSqlSelect srcSelect = (GridSqlSelect)srcQry; + // Set generated alias to the expression. + left.select().set(c, expr); + left.allExpressions().set(c, expr); + } + + srcQry.addSelectExpression(column(colName)); + + qry0.sort(); + + c++; + } + + // ORDER BY + if (!qry0.sort().isEmpty()) { + for (GridSqlSortColumn col : qry0.sort()) + srcQry.addSort(col); + } + } final String mergeTable = TABLE_FUNC_NAME + "()"; // table(0); TODO - GridSqlSelect mapQry = srcSelect.clone(); + GridSqlSelect mapQry = srcQry.clone(); GridSqlSelect rdcQry = new GridSqlSelect().from(new GridSqlFunction("PUBLIC", TABLE_FUNC_NAME)); // table(mergeTable)); TODO // Split all select expressions into map-reduce parts. - List mapExps = new ArrayList<>(srcSelect.allExpressions()); - GridSqlElement[] rdcExps = new GridSqlElement[srcSelect.select().size()]; + List mapExps = new ArrayList<>(srcQry.allExpressions()); + GridSqlElement[] rdcExps = new GridSqlElement[srcQry.select().size()]; Set colNames = new HashSet<>(); @@ -98,31 +146,31 @@ public class GridSqlQuerySplitter { rdcQry.addSelectExpression(rdcExp); // -- GROUP BY - if (!srcSelect.groups().isEmpty()) { + if (!srcQry.groups().isEmpty()) { mapQry.clearGroups(); - for (int col : srcSelect.groupColumns()) + for (int col : srcQry.groupColumns()) mapQry.addGroupExpression(column(((GridSqlAlias)mapExps.get(col)).alias())); - for (int col : srcSelect.groupColumns()) + for (int col : srcQry.groupColumns()) rdcQry.addGroupExpression(column(((GridSqlAlias)mapExps.get(col)).alias())); } // -- HAVING - if (srcSelect.having() != null) { + if (srcQry.having() != null) { // TODO Find aggregate functions in HAVING clause. - rdcQry.whereAnd(column(columnName(srcSelect.havingColumn()))); + rdcQry.whereAnd(column(columnName(srcQry.havingColumn()))); mapQry.having(null); } // -- ORDER BY - if (!srcSelect.sort().isEmpty()) { + if (!srcQry.sort().isEmpty()) { if (aggregateFound) // Ordering over aggregates does not make sense. mapQry.clearSort(); // Otherwise map sort will be used by offset-limit. - for (GridSqlSortColumn sortCol : srcSelect.sort().values()) - rdcQry.addSort(column(((GridSqlAlias)mapExps.get(sortCol.column())).alias()), sortCol); + for (GridSqlSortColumn sortCol : srcQry.sort()) + rdcQry.addSort(sortCol); } // -- LIMIT @@ -134,14 +182,14 @@ public class GridSqlQuerySplitter { } // -- OFFSET - if (srcSelect.offset() != null) { + if (srcQry.offset() != null) { mapQry.offset(null); - rdcQry.offset(srcSelect.offset()); + rdcQry.offset(srcQry.offset()); } // -- DISTINCT - if (srcSelect.distinct()) { + if (srcQry.distinct()) { mapQry.distinct(false); rdcQry.distinct(true); } @@ -166,7 +214,12 @@ public class GridSqlQuerySplitter { if (qry instanceof GridSqlSelect) return findParams((GridSqlSelect)qry, params, target); - throw new UnsupportedOperationException(); // todo IGNITE-624 + GridSqlUnion union = (GridSqlUnion)qry; + + findParams(union.left(), params, target); + findParams(union.right(), params, target); + + return target; } /** @@ -179,7 +232,7 @@ public class GridSqlQuerySplitter { if (params.length == 0) return target; - for (GridSqlElement el : qry.select()) + for (GridSqlElement el : qry.allExpressions()) findParams(el, params, target); findParams(qry.from(), params, target); @@ -190,9 +243,6 @@ public class GridSqlQuerySplitter { findParams(qry.having(), params, target); - for (GridSqlElement el : qry.sort().keySet()) - findParams(el, params, target); - findParams(qry.limit(), params, target); findParams(qry.offset(), params, target); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/25f900ed/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlSelect.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlSelect.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlSelect.java index 272f8b4..154659b 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlSelect.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlSelect.java @@ -26,6 +26,12 @@ import java.util.*; */ public class GridSqlSelect extends GridSqlQuery { /** */ + private List allExprs; + + /** */ + private List select = new ArrayList<>(); + + /** */ private List groups = new ArrayList<>(); /** */ @@ -79,42 +85,50 @@ public class GridSqlSelect extends GridSqlQuery { if (having != null) buff.append("\nHAVING ").append(StringUtils.unEnclose(having.getSQL())); - if (!sort.isEmpty()) { - buff.append("\nORDER BY "); - - buff.resetCount(); - - for (Map.Entry entry : sort.entrySet()) { - buff.appendExceptFirst(", "); - - GridSqlElement expression = entry.getKey(); + getSortLimitSQL(buff); - int idx = select.indexOf(expression); + return buff.toString(); + } - if (idx >= 0) - buff.append(idx + 1); - else - buff.append('=').append(StringUtils.unEnclose(expression.getSQL())); + /** + * @param expression Expression. + */ + public void addExpression(GridSqlElement expression) { + if (allExprs == null) + allExprs = new ArrayList<>(); - GridSqlSortColumn type = entry.getValue(); + allExprs.add(expression); + } - if (!type.asc()) - buff.append(" DESC"); + /** + * @return All expressions in select, group by, order by. + */ + public List allExpressions() { + return allExprs; + } - if (type.nullsFirst()) - buff.append(" NULLS FIRST"); - else if (type.nullsLast()) - buff.append(" NULLS LAST"); - } - } + /** + * @return Expressions. + */ + public List select() { + return select; + } - if (limit != null) - buff.append(" LIMIT ").append(StringUtils.unEnclose(limit.getSQL())); + /** + * Clears select list. + */ + public void clearSelect() { + select = new ArrayList<>(); + } - if (offset != null) - buff.append(" OFFSET ").append(StringUtils.unEnclose(offset.getSQL())); + /** + * @param expression Expression. + */ + public void addSelectExpression(GridSqlElement expression) { + if (expression == null) + throw new NullPointerException(); - return buff.toString(); + select.add(expression); } /** @@ -237,6 +251,8 @@ public class GridSqlSelect extends GridSqlQuery { res.groups = new ArrayList<>(groups); res.grpCols = grpCols == null ? null : grpCols.clone(); + res.select = new ArrayList<>(select); + res.allExprs = null; return res; } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/25f900ed/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlUnion.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlUnion.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlUnion.java index 1eae1ef..6fe3f19 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlUnion.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlUnion.java @@ -18,11 +18,9 @@ package org.apache.ignite.internal.processors.query.h2.sql; import org.h2.command.dml.*; -import org.h2.message.*; import org.h2.util.*; import javax.cache.*; -import java.util.*; /** * @@ -39,7 +37,7 @@ public class GridSqlUnion extends GridSqlQuery { /** {@inheritDoc} */ @Override public String getSQL() { - StringBuilder buff = new StringBuilder(); + StatementBuilder buff = new StatementBuilder(); buff.append('(').append(left.getSQL()).append(')'); @@ -66,43 +64,7 @@ public class GridSqlUnion extends GridSqlQuery { buff.append('(').append(right.getSQL()).append(')'); - if (!sort.isEmpty()) { - buff.append("\nORDER BY "); - - boolean first = true; - - for (Map.Entry entry : sort.entrySet()) { - if (first) - first = false; - else - buff.append(", "); - - GridSqlElement expression = entry.getKey(); - - int idx = select.indexOf(expression); - - if (idx >= 0) - buff.append(idx + 1); - else - buff.append('=').append(StringUtils.unEnclose(expression.getSQL())); - - GridSqlSortColumn type = entry.getValue(); - - if (!type.asc()) - buff.append(" DESC"); - - if (type.nullsFirst()) - buff.append(" NULLS FIRST"); - else if (type.nullsLast()) - buff.append(" NULLS LAST"); - } - } - - if (limit != null) - buff.append(" LIMIT ").append(StringUtils.unEnclose(limit.getSQL())); - - if (offset != null) - buff.append(" OFFSET ").append(StringUtils.unEnclose(offset.getSQL())); + getSortLimitSQL(buff); return buff.toString(); }