Done.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/dd70a846 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/dd70a846 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/dd70a846 Branch: refs/heads/ignite-6022-proto Commit: dd70a84606185d575a1a9339d2a51cfd1993648a Parents: 5d99beb Author: devozerov <[email protected]> Authored: Mon Dec 18 12:11:18 2017 +0300 Committer: devozerov <[email protected]> Committed: Mon Dec 18 12:11:18 2017 +0300 ---------------------------------------------------------------------- .../query/h2/DmlStatementsProcessor.java | 44 +--------- .../processors/query/h2/dml/UpdatePlan.java | 84 ++++++++++---------- 2 files changed, 46 insertions(+), 82 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/dd70a846/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java index 7f1f5d5..9a6b0af 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java @@ -48,14 +48,11 @@ import org.apache.ignite.internal.processors.query.GridQueryCancel; import org.apache.ignite.internal.processors.query.GridQueryFieldsResult; import org.apache.ignite.internal.processors.query.GridQueryFieldsResultAdapter; import org.apache.ignite.internal.processors.query.IgniteSQLException; -import org.apache.ignite.internal.processors.query.h2.dml.DmlArgument; import org.apache.ignite.internal.processors.query.h2.dml.DmlBatchSender; import org.apache.ignite.internal.processors.query.h2.dml.DmlDistributedPlanInfo; -import org.apache.ignite.internal.processors.query.h2.dml.DmlUtils; import org.apache.ignite.internal.processors.query.h2.dml.UpdateMode; import org.apache.ignite.internal.processors.query.h2.dml.UpdatePlan; import org.apache.ignite.internal.processors.query.h2.dml.UpdatePlanBuilder; -import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowDescriptor; import org.apache.ignite.internal.processors.query.h2.sql.GridSqlQueryParser; import org.apache.ignite.internal.util.GridBoundedConcurrentLinkedHashMap; import org.apache.ignite.internal.util.lang.IgniteSingletonIterator; @@ -282,7 +279,7 @@ public class DmlStatementsProcessor { it = res.iterator(); } else - it = planToRows(plan, U.firstNotNull(args, X.EMPTY_OBJECT_ARRAY)).iterator(); + it = plan.createRows(U.firstNotNull(args, X.EMPTY_OBJECT_ARRAY)).iterator(); return new GridQueryCacheObjectsIterator(it, idx.objectContext(), cctx.keepBinary()); } @@ -379,7 +376,9 @@ public class DmlStatementsProcessor { cur = idx.queryDistributedSqlFields(schemaName, newFieldsQry, true, cancel, mainCacheId, true).get(0); } - else if (F.isEmpty(plan.rows())) { + else if (plan.hasRows()) + cur = plan.createRows(fieldsQry.getArgs()); + else { final GridQueryFieldsResult res = idx.queryLocalSqlFields(schemaName, plan.selectQuery(), F.asList(fieldsQry.getArgs()), filters, fieldsQry.isEnforceJoinOrder(), fieldsQry.getTimeout(), cancel); @@ -394,8 +393,6 @@ public class DmlStatementsProcessor { } }, cancel); } - else - cur = planToRows(plan, fieldsQry.getArgs()); int pageSize = loc ? 0 : fieldsQry.getPageSize(); @@ -403,39 +400,6 @@ public class DmlStatementsProcessor { } /** - * Extract rows from plan without performing any query. - * @param plan Plan. - * @param args Original query arguments. - * @return Rows from plan. - * @throws IgniteCheckedException if failed. - */ - private List<List<?>> planToRows(UpdatePlan plan, Object[] args) throws IgniteCheckedException { - assert plan.rowCount() > 0 && !F.isEmpty(plan.columnNames()); - - List<List<?>> rows = new ArrayList<>(plan.rowCount()); - - GridH2RowDescriptor desc = plan.table().rowDescriptor(); - - for (List<DmlArgument> argRow : plan.rows()) { - List<Object> row = new ArrayList<>(); - - for (int j = 0; j < plan.columnNames().length; j++) { - Object colVal = argRow.get(j).get(args); - - if (j == plan.keyColumnIndex() || j == plan.valueColumnIndex()) - colVal = DmlUtils.convert(colVal, desc, j == plan.keyColumnIndex() ? desc.type().keyClass() : - desc.type().valueClass(), plan.columnTypes()[j]); - - row.add(colVal); - } - - rows.add(row); - } - - return rows; - } - - /** * @param cctx Cache context. * @param plan Update plan. * @param cursor Cursor over select results. http://git-wip-us.apache.org/repos/asf/ignite/blob/dd70a846/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlan.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlan.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlan.java index 10e7519..6a45c3c 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlan.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlan.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.query.h2.dml; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -360,6 +361,47 @@ public final class UpdatePlan { } /** + * @return {@code True} if predefined rows exist. + */ + public boolean hasRows() { + return !F.isEmpty(rows); + } + + /** + * Extract rows from plan without performing any query. + * @param args Original query arguments. + * @return Rows from plan. + * @throws IgniteCheckedException if failed. + */ + public List<List<?>> createRows(Object[] args) throws IgniteCheckedException { + assert rowsNum > 0 && !F.isEmpty(colNames); + + List<List<?>> res = new ArrayList<>(rowsNum); + + GridH2RowDescriptor desc = tbl.rowDescriptor(); + + for (List<DmlArgument> row : rows) { + List<Object> resRow = new ArrayList<>(); + + for (int j = 0; j < colNames.length; j++) { + Object colVal = row.get(j).get(args); + + if (j == keyColIdx || j == valColIdx) { + Class<?> colCls = j == keyColIdx ? desc.type().keyClass() : desc.type().valueClass(); + + colVal = DmlUtils.convert(colVal, desc, colCls, colTypes[j]); + } + + resRow.add(colVal); + } + + res.add(resRow); + } + + return res; + } + + /** * @return Update mode. */ public UpdateMode mode() { @@ -400,46 +442,4 @@ public final class UpdatePlan { @Nullable public boolean isLocalSubquery() { return isLocSubqry; } - - /** - * @return Names of affected columns. - */ - public String[] columnNames() { - return colNames; - } - - /** - * @return Types of affected columns. - */ - public int[] columnTypes() { - return colTypes; - } - - /** - * @return Rows for query-less MERGE or INSERT. - */ - public List<List<DmlArgument>> rows() { - return rows; - } - - /** - * @return Key column index. - */ - public int keyColumnIndex() { - return keyColIdx; - } - - /** - * @return Value column index. - */ - public int valueColumnIndex() { - return valColIdx; - } - - /** - * @return Target table. - */ - public GridH2Table table() { - return tbl; - } }
