Steven Jacobs has submitted this change and it was merged. Change subject: [ASTERIXDB-2402][COMP] Allow AND for IsMissing in Groupby ......................................................................
[ASTERIXDB-2402][COMP] Allow AND for IsMissing in Groupby AccessMethodUtils.findLOJIsMissingFuncInGroupBy() looks for the not(is-missing($VAR)) pattern in a group by, but failed to detect it if it is part of an and, e.g. and(not(is-missing($VAR1)),not(is-missing($VAR2))) This changes fixes this and adds a test case Change-Id: I9547fba5e4ba02226b5b2c2504080b091d3b8d5e Reviewed-on: https://asterix-gerrit.ics.uci.edu/2735 Tested-by: Jenkins <[email protected]> Contrib: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Reviewed-by: Dmitry Lychagin <[email protected]> --- M asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java M asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java A asterixdb/asterix-app/src/test/resources/optimizerts/queries/ASTERIXDB-2402.sqlpp A asterixdb/asterix-app/src/test/resources/optimizerts/results/ASTERIXDB-2402.plan 4 files changed, 392 insertions(+), 34 deletions(-) Approvals: Anon. E. Moose #1000171: Jenkins: Verified; ; Verified Dmitry Lychagin: Looks good to me, approved Objections: Jenkins: Violations found diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java index 6368058..728aef6 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java @@ -64,6 +64,7 @@ import org.apache.hyracks.algebricks.common.utils.Triple; import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression; import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator; +import org.apache.hyracks.algebricks.core.algebra.base.ILogicalPlan; import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext; import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag; import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; @@ -81,6 +82,7 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractDataSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator.ExecutionMode; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractOperatorWithNestedPlans; import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractUnnestMapOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.AggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.AssignOperator; @@ -1483,44 +1485,84 @@ return createRectangleExpr; } - public static ScalarFunctionCallExpression findLOJIsMissingFuncInGroupBy(GroupByOperator lojGroupbyOp) - throws AlgebricksException { - //find IS_MISSING function of which argument has the nullPlaceholder variable in the nested plan of groupby. - ALogicalPlanImpl subPlan = (ALogicalPlanImpl) lojGroupbyOp.getNestedPlans().get(0); - Mutable<ILogicalOperator> subPlanRootOpRef = subPlan.getRoots().get(0); - AbstractLogicalOperator subPlanRootOp = (AbstractLogicalOperator) subPlanRootOpRef.getValue(); - boolean foundSelectNonMissing = false; - ScalarFunctionCallExpression isMissingFuncExpr = null; - AbstractLogicalOperator inputOp = subPlanRootOp; - while (inputOp != null) { - if (inputOp.getOperatorTag() == LogicalOperatorTag.SELECT) { - SelectOperator selectOp = (SelectOperator) inputOp; - if (selectOp.getCondition().getValue().getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) { - if (((AbstractFunctionCallExpression) selectOp.getCondition().getValue()).getFunctionIdentifier() - .equals(AlgebricksBuiltinFunctions.NOT)) { - ScalarFunctionCallExpression notFuncExpr = - (ScalarFunctionCallExpression) selectOp.getCondition().getValue(); - if (notFuncExpr.getArguments().get(0).getValue() - .getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) { - if (((AbstractFunctionCallExpression) notFuncExpr.getArguments().get(0).getValue()) - .getFunctionIdentifier().equals(AlgebricksBuiltinFunctions.IS_MISSING)) { - isMissingFuncExpr = - (ScalarFunctionCallExpression) notFuncExpr.getArguments().get(0).getValue(); - if (isMissingFuncExpr.getArguments().get(0).getValue() - .getExpressionTag() == LogicalExpressionTag.VARIABLE) { - foundSelectNonMissing = true; - break; - } - } + private static ScalarFunctionCallExpression getNestedIsMissingCall(AbstractFunctionCallExpression call, + OptimizableOperatorSubTree rightSubTree) throws AlgebricksException { + ScalarFunctionCallExpression isMissingFuncExpr; + if (call.getFunctionIdentifier().equals(AlgebricksBuiltinFunctions.NOT)) { + if (call.getArguments().get(0).getValue().getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) { + if (((AbstractFunctionCallExpression) call.getArguments().get(0).getValue()).getFunctionIdentifier() + .equals(AlgebricksBuiltinFunctions.IS_MISSING)) { + isMissingFuncExpr = (ScalarFunctionCallExpression) call.getArguments().get(0).getValue(); + if (isMissingFuncExpr.getArguments().get(0).getValue() + .getExpressionTag() == LogicalExpressionTag.VARIABLE) { + LogicalVariable var = + ((VariableReferenceExpression) isMissingFuncExpr.getArguments().get(0).getValue()) + .getVariableReference(); + List<LogicalVariable> liveSubplanVars = new ArrayList<>(); + VariableUtilities.getSubplanLocalLiveVariables(rightSubTree.getRoot(), liveSubplanVars); + if (liveSubplanVars.contains(var)) { + return isMissingFuncExpr; } } } } - inputOp = inputOp.getInputs().size() > 0 ? (AbstractLogicalOperator) inputOp.getInputs().get(0).getValue() - : null; } + return null; + } - if (!foundSelectNonMissing) { + public static ScalarFunctionCallExpression findIsMissingInSubplan(AbstractLogicalOperator inputOp, + OptimizableOperatorSubTree rightSubTree) throws AlgebricksException { + ScalarFunctionCallExpression isMissingFuncExpr = null; + AbstractLogicalOperator currentOp = inputOp; + while (currentOp != null) { + if (currentOp.getOperatorTag() == LogicalOperatorTag.SELECT) { + SelectOperator selectOp = (SelectOperator) currentOp; + if (selectOp.getCondition().getValue().getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) { + AbstractFunctionCallExpression call = + (AbstractFunctionCallExpression) (selectOp).getCondition().getValue(); + if (call.getFunctionIdentifier().equals(AlgebricksBuiltinFunctions.AND)) { + for (Mutable<ILogicalExpression> mexpr : call.getArguments()) { + if (mexpr.getValue().getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) { + isMissingFuncExpr = getNestedIsMissingCall( + (AbstractFunctionCallExpression) mexpr.getValue(), rightSubTree); + if (isMissingFuncExpr != null) { + return isMissingFuncExpr; + } + } + } + } + isMissingFuncExpr = getNestedIsMissingCall(call, rightSubTree); + if (isMissingFuncExpr != null) { + return isMissingFuncExpr; + } + } + } else if (currentOp.hasNestedPlans()) { + AbstractOperatorWithNestedPlans nestedPlanOp = (AbstractOperatorWithNestedPlans) currentOp; + for (ILogicalPlan nestedPlan : nestedPlanOp.getNestedPlans()) { + for (Mutable<ILogicalOperator> root : nestedPlan.getRoots()) { + isMissingFuncExpr = + findIsMissingInSubplan((AbstractLogicalOperator) root.getValue(), rightSubTree); + if (isMissingFuncExpr != null) { + return isMissingFuncExpr; + } + } + } + } + currentOp = currentOp.getInputs().isEmpty() ? null + : (AbstractLogicalOperator) currentOp.getInputs().get(0).getValue(); + } + return isMissingFuncExpr; + } + + public static ScalarFunctionCallExpression findLOJIsMissingFuncInGroupBy(GroupByOperator lojGroupbyOp, + OptimizableOperatorSubTree rightSubTree) throws AlgebricksException { + //find IS_MISSING function of which argument has the nullPlaceholder variable in the nested plan of groupby. + ALogicalPlanImpl subPlan = (ALogicalPlanImpl) lojGroupbyOp.getNestedPlans().get(0); + Mutable<ILogicalOperator> subPlanRootOpRef = subPlan.getRoots().get(0); + AbstractLogicalOperator subPlanRootOp = (AbstractLogicalOperator) subPlanRootOpRef.getValue(); + ScalarFunctionCallExpression isMissingFuncExpr = findIsMissingInSubplan(subPlanRootOp, rightSubTree); + + if (isMissingFuncExpr == null) { throw CompilationException.create(ErrorCode.CANNOT_FIND_NON_MISSING_SELECT_OPERATOR, lojGroupbyOp.getSourceLocation()); } diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java index bc73199..324668d 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java @@ -380,8 +380,8 @@ // in GroupByOp. if (isThisOpLeftOuterJoin && isParentOpGroupBy) { analysisCtx.setLOJGroupbyOpRef(opRef); - ScalarFunctionCallExpression isNullFuncExpr = - AccessMethodUtils.findLOJIsMissingFuncInGroupBy((GroupByOperator) opRef.getValue()); + ScalarFunctionCallExpression isNullFuncExpr = AccessMethodUtils + .findLOJIsMissingFuncInGroupBy((GroupByOperator) opRef.getValue(), rightSubTree); analysisCtx.setLOJIsMissingFuncInGroupBy(isNullFuncExpr); } diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/ASTERIXDB-2402.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/ASTERIXDB-2402.sqlpp new file mode 100644 index 0000000..366540e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/ASTERIXDB-2402.sqlpp @@ -0,0 +1,119 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +drop dataverse channels if exists; +create dataverse channels; +use channels; + +create type UserLocation as { + location: circle, + userName: string, + timeStamp: datetime +}; + + +create type UserLocationFeedType as { + location: circle, + userName: string +}; + +create type EmergencyReport as { + reportId: uuid, + Etype: string, + location: circle, + timeStamp: datetime +}; + +create type EmergencyReportFeedType as { + Etype: string, + location: circle +}; + + +create type EmergencyShelter as { + shelterName: string, + location: point +}; + +create dataset UserLocations(UserLocation) +primary key userName; +create dataset Shelters(EmergencyShelter) +primary key shelterName; +create dataset Reports(EmergencyReport) +primary key reportId autogenerated; + +create index location_time on UserLocations(timeStamp); +create index u_location on UserLocations(location) type RTREE; +create index s_location on Shelters(location) type RTREE; +create index report_time on Reports(timeStamp); + +create function EmergenciesNearMe(userName) { + ( + select report, shelters from + ( select value r from Reports r where r.timeStamp > + current_datetime() - day_time_duration("PT10S"))report, + UserLocations u + let shelters = (select s.location from Shelters s where spatial_intersect(s.location,u.location)) + where u.userName = userName + and spatial_intersect(report.location,u.location) + ) +}; + +create type result as { + resultId:uuid +}; +create type channelSub as { + channelSubId:uuid +}; +create type brokerSub as { + channelSubId:uuid, + brokerSubId:uuid +}; +create type broke as { + DataverseName: string, + BrokerName: string, + BrokerEndpoint: string +}; + +create dataset EmergenciesNearMeChannelResults(result) primary key resultId autogenerated; +create dataset EmergenciesNearMeChannelChannelSubscriptions(channelSub) primary key channelSubId; +create dataset EmergenciesNearMeChannelBrokerSubscriptions(brokerSub) primary key channelSubId,brokerSubId; +create dataset Broker(broke) primary key DataverseName,BrokerName; + + + +SET inline_with "false"; +insert into channels.EmergenciesNearMeChannelResults as a ( +with channelExecutionTime as current_datetime() +select result, channelExecutionTime, sub.channelSubId as channelSubId,current_datetime() as deliveryTime, +(select b.BrokerEndPoint, bs.brokerSubId from +channels.EmergenciesNearMeChannelBrokerSubscriptions bs, +channels.Broker b +where bs.BrokerName = b.BrokerName +and bs.DataverseName = b.DataverseName +and bs.channelSubId = sub.channelSubId +) as brokerSubIds +from channels.EmergenciesNearMeChannelChannelSubscriptions sub, +channels.EmergenciesNearMe(sub.param0) result +) returning +(select +a.channelExecutionTime, a.result, sub.BrokerEndpoint +from (select sub from a.brokerSubIds sub) sub +group by sub.BrokerEndpoint +); \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/ASTERIXDB-2402.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/ASTERIXDB-2402.plan new file mode 100644 index 0000000..fced7a9 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/ASTERIXDB-2402.plan @@ -0,0 +1,197 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- SUBPLAN |PARTITIONED| + { + -- AGGREGATE |LOCAL| + -- ASSIGN |LOCAL| + -- MICRO_PRE_CLUSTERED_GROUP_BY[$$183] |LOCAL| + { + -- AGGREGATE |LOCAL| + -- NESTED_TUPLE_SOURCE |LOCAL| + } + -- IN_MEMORY_STABLE_SORT [$$183(ASC)] |LOCAL| + -- ASSIGN |LOCAL| + -- UNNEST |LOCAL| + -- SUBPLAN |LOCAL| + { + -- AGGREGATE |LOCAL| + -- ASSIGN |LOCAL| + -- UNNEST |LOCAL| + -- NESTED_TUPLE_SOURCE |LOCAL| + } + -- NESTED_TUPLE_SOURCE |LOCAL| + } + -- STREAM_PROJECT |PARTITIONED| + -- COMMIT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- INSERT_DELETE |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$167] |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- PRE_CLUSTERED_GROUP_BY[$$221] |PARTITIONED| + { + -- AGGREGATE |LOCAL| + -- STREAM_SELECT |LOCAL| + -- NESTED_TUPLE_SOURCE |LOCAL| + } + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$221(ASC)] |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$221] |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- HYBRID_HASH_JOIN [$$267][$$190] |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$267] |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- UNNEST |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- PRE_CLUSTERED_GROUP_BY[$$275] |PARTITIONED| + { + -- AGGREGATE |LOCAL| + -- MICRO_PRE_CLUSTERED_GROUP_BY[$$277, $$279] |LOCAL| + { + -- AGGREGATE |LOCAL| + -- STREAM_SELECT |LOCAL| + -- NESTED_TUPLE_SOURCE |LOCAL| + } + -- STREAM_SELECT |LOCAL| + -- NESTED_TUPLE_SOURCE |LOCAL| + } + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$275(ASC), $$277(ASC), $$279(ASC)] |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$275] |PARTITIONED| + -- UNION_ALL |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- SPLIT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- RTREE_SEARCH |PARTITIONED| + -- BROADCAST_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$289(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- RTREE_SEARCH |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- NESTED_LOOP |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- BROADCAST_EXCHANGE |PARTITIONED| + -- ASSIGN |UNPARTITIONED| + -- EMPTY_TUPLE_SOURCE |UNPARTITIONED| + -- BROADCAST_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$228(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- SPLIT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- RTREE_SEARCH |PARTITIONED| + -- BROADCAST_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$289(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- RTREE_SEARCH |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- NESTED_LOOP |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- BROADCAST_EXCHANGE |PARTITIONED| + -- ASSIGN |UNPARTITIONED| + -- EMPTY_TUPLE_SOURCE |UNPARTITIONED| + -- BROADCAST_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$228(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$190] |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- HYBRID_HASH_JOIN [$$198, $$200][$$192, $$193] |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$198, $$200] |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file -- To view, visit https://asterix-gerrit.ics.uci.edu/2735 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: I9547fba5e4ba02226b5b2c2504080b091d3b8d5e Gerrit-PatchSet: 13 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Steven Jacobs <[email protected]> Gerrit-Reviewer: Anon. E. Moose #1000171 Gerrit-Reviewer: Dmitry Lychagin <[email protected]> Gerrit-Reviewer: Jenkins <[email protected]> Gerrit-Reviewer: Steven Jacobs <[email protected]> Gerrit-Reviewer: Xikui Wang <[email protected]>
