Index-only plan step 2: Added SplitOperator - Introduced SplitOperator that sends a tuple to only one output frame unlike the ReplicateOperator that propagates a tuple into all outputs frames. - Removed PartitioningSplitOperator and PartitioningSplitOperatorDescriptor that are not functional (lacking physical operator) - Added a unit test case of SplitOperatorDescriptor in PushRuntimeTest.
Change-Id: Ice190827513cd8632764b52c9d0338d65c830740 Reviewed-on: https://asterix-gerrit.ics.uci.edu/1196 Tested-by: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Reviewed-by: Yingyi Bu <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/76a4f9e3 Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/76a4f9e3 Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/76a4f9e3 Branch: refs/heads/master Commit: 76a4f9e36e841d9325bedb3bb96e7e68c1d3f065 Parents: db1c115 Author: Taewoo Kim <[email protected]> Authored: Tue Oct 11 14:16:35 2016 -0700 Committer: Taewoo Kim <[email protected]> Committed: Tue Oct 11 17:08:54 2016 -0700 ---------------------------------------------------------------------- .../SweepIllegalNonfunctionalFunctions.java | 11 +- .../subplan/InlineAllNtsInSubplanVisitor.java | 11 +- ...neLeftNtsInSubplanJoinFlatteningVisitor.java | 7 +- .../SubplanSpecialFlatteningCheckVisitor.java | 10 +- .../core/algebra/base/LogicalOperatorTag.java | 2 +- .../core/algebra/base/PhysicalOperatorTag.java | 4 +- .../logical/AbstractReplicateOperator.java | 103 ++++++++ .../logical/PartitioningSplitOperator.java | 119 ---------- .../operators/logical/ReplicateOperator.java | 70 +----- .../operators/logical/SplitOperator.java | 65 ++++++ .../visitors/CardinalityInferenceVisitor.java | 6 +- .../visitors/FDsAndEquivClassesVisitor.java | 15 +- .../visitors/IsomorphismOperatorVisitor.java | 19 +- .../IsomorphismVariableMappingVisitor.java | 9 +- ...OperatorDeepCopyWithNewVariablesVisitor.java | 19 +- .../visitors/LogicalPropertiesVisitor.java | 14 +- .../visitors/OperatorDeepCopyVisitor.java | 15 +- .../visitors/PrimaryKeyVariablesVisitor.java | 7 +- .../visitors/ProducedVariableVisitor.java | 14 +- .../logical/visitors/SchemaVariableVisitor.java | 16 +- .../visitors/SubstituteVariableVisitor.java | 21 +- .../logical/visitors/UsedVariableVisitor.java | 18 +- .../physical/AbstractReplicatePOperator.java | 68 ++++++ .../operators/physical/ReplicatePOperator.java | 47 +--- .../operators/physical/SplitPOperator.java | 68 ++++++ .../LogicalOperatorPrettyPrintVisitor.java | 20 +- .../visitors/ILogicalOperatorVisitor.java | 8 +- ...placeNtsWithSubplanInputOperatorVisitor.java | 7 +- .../PartitioningSplitOperatorDescriptor.java | 217 ----------------- .../operators/std/SplitOperatorDescriptor.java | 188 +++++++++++++++ .../data/simple/int-string-part1-split-0.tbl | 4 + .../data/simple/int-string-part1-split-1.tbl | 3 + .../data/simple/int-string-part1.tbl | 7 + .../tests/pushruntime/PushRuntimeTest.java | 73 +++++- .../AbstractReplicateOperatorDescriptor.java | 233 +++++++++++++++++++ .../std/misc/ReplicateOperatorDescriptor.java | 36 +++ .../std/misc/SplitOperatorDescriptor.java | 231 ------------------ .../integration/ReplicateOperatorTest.java | 115 +++++++++ .../tests/integration/SplitOperatorTest.java | 116 --------- 39 files changed, 1083 insertions(+), 933 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SweepIllegalNonfunctionalFunctions.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SweepIllegalNonfunctionalFunctions.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SweepIllegalNonfunctionalFunctions.java index e04be6f..4a79387 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SweepIllegalNonfunctionalFunctions.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SweepIllegalNonfunctionalFunctions.java @@ -44,19 +44,19 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.InsertDelete import org.apache.hyracks.algebricks.core.algebra.operators.logical.IntersectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterJoinOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestMapOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SinkOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; @@ -197,15 +197,12 @@ public class SweepIllegalNonfunctionalFunctions extends AbstractExtractExprRule } @Override - public Void visitPartitioningSplitOperator(PartitioningSplitOperator op, Void arg) throws AlgebricksException { - for (Mutable<ILogicalExpression> expr : op.getExpressions()) { - sweepExpression(expr.getValue(), op); - } + public Void visitReplicateOperator(ReplicateOperator op, Void arg) throws AlgebricksException { return null; } @Override - public Void visitReplicateOperator(ReplicateOperator op, Void arg) throws AlgebricksException { + public Void visitSplitOperator(SplitOperator op, Void arg) throws AlgebricksException { return null; } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java index 143cf0b..874cc7c 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java @@ -26,8 +26,8 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; +import java.util.Set; import org.apache.asterix.lang.common.util.FunctionUtil; import org.apache.asterix.om.base.AString; @@ -67,18 +67,18 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperato import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestMapOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.LogicalOperatorDeepCopyWithNewVariablesVisitor; import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities; import org.apache.hyracks.algebricks.core.algebra.plan.ALogicalPlanImpl; @@ -508,13 +508,12 @@ class InlineAllNtsInSubplanVisitor implements IQueryOperatorVisitor<ILogicalOper } @Override - public ILogicalOperator visitPartitioningSplitOperator(PartitioningSplitOperator op, Void arg) - throws AlgebricksException { + public ILogicalOperator visitReplicateOperator(ReplicateOperator op, Void arg) throws AlgebricksException { return visitSingleInputOperator(op); } @Override - public ILogicalOperator visitReplicateOperator(ReplicateOperator op, Void arg) throws AlgebricksException { + public ILogicalOperator visitSplitOperator(SplitOperator op, Void arg) throws AlgebricksException { return visitSingleInputOperator(op); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineLeftNtsInSubplanJoinFlatteningVisitor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineLeftNtsInSubplanJoinFlatteningVisitor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineLeftNtsInSubplanJoinFlatteningVisitor.java index c7b927e..eeb2c2a 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineLeftNtsInSubplanJoinFlatteningVisitor.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineLeftNtsInSubplanJoinFlatteningVisitor.java @@ -53,12 +53,12 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeO import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; @@ -276,13 +276,12 @@ class InlineLeftNtsInSubplanJoinFlatteningVisitor implements IQueryOperatorVisit } @Override - public ILogicalOperator visitPartitioningSplitOperator(PartitioningSplitOperator op, Void arg) - throws AlgebricksException { + public ILogicalOperator visitReplicateOperator(ReplicateOperator op, Void arg) throws AlgebricksException { return visitSingleInputOperator(op); } @Override - public ILogicalOperator visitReplicateOperator(ReplicateOperator op, Void arg) throws AlgebricksException { + public ILogicalOperator visitSplitOperator(SplitOperator op, Void arg) throws AlgebricksException { return visitSingleInputOperator(op); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/SubplanSpecialFlatteningCheckVisitor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/SubplanSpecialFlatteningCheckVisitor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/SubplanSpecialFlatteningCheckVisitor.java index ef0f9da..ccf0aeb 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/SubplanSpecialFlatteningCheckVisitor.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/SubplanSpecialFlatteningCheckVisitor.java @@ -33,17 +33,17 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.InnerJoinOpe import org.apache.hyracks.algebricks.core.algebra.operators.logical.IntersectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterJoinOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestMapOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; @@ -153,12 +153,12 @@ class SubplanSpecialFlatteningCheckVisitor implements IQueryOperatorVisitor<Bool } @Override - public Boolean visitPartitioningSplitOperator(PartitioningSplitOperator op, Void arg) throws AlgebricksException { - return false; + public Boolean visitReplicateOperator(ReplicateOperator op, Void arg) throws AlgebricksException { + return visitInputs(op); } @Override - public Boolean visitReplicateOperator(ReplicateOperator op, Void arg) throws AlgebricksException { + public Boolean visitSplitOperator(SplitOperator op, Void arg) throws AlgebricksException { return visitInputs(op); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalOperatorTag.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalOperatorTag.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalOperatorTag.java index d39a8c8..cc7a75f 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalOperatorTag.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalOperatorTag.java @@ -38,13 +38,13 @@ public enum LogicalOperatorTag { MATERIALIZE, NESTEDTUPLESOURCE, ORDER, - PARTITIONINGSPLIT, PROJECT, REPLICATE, RUNNINGAGGREGATE, SCRIPT, SELECT, SINK, + SPLIT, SUBPLAN, TOKENIZE, UNIONALL, http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/PhysicalOperatorTag.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/PhysicalOperatorTag.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/PhysicalOperatorTag.java index 893fb32..1d20e08 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/PhysicalOperatorTag.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/PhysicalOperatorTag.java @@ -46,13 +46,13 @@ public enum PhysicalOperatorTag { NESTED_LOOP, NESTED_TUPLE_SOURCE, ONE_TO_ONE_EXCHANGE, - PARTITIONINGSPLIT, PRE_CLUSTERED_GROUP_BY, PRE_SORTED_DISTINCT_BY, RANDOM_PARTITION_EXCHANGE, RANDOM_MERGE_EXCHANGE, RANGE_PARTITION_EXCHANGE, RANGE_PARTITION_MERGE_EXCHANGE, + REPLICATE, RTREE_SEARCH, RUNNING_AGGREGATE, SINGLE_PARTITION_INVERTED_INDEX_SEARCH, @@ -60,7 +60,7 @@ public enum PhysicalOperatorTag { SINK_WRITE, SORT_GROUP_BY, SORT_MERGE_EXCHANGE, - REPLICATE, + SPLIT, STABLE_SORT, STATS, STREAM_LIMIT, http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractReplicateOperator.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractReplicateOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractReplicateOperator.java new file mode 100644 index 0000000..f883687 --- /dev/null +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractReplicateOperator.java @@ -0,0 +1,103 @@ +/* + * 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. + */ +package org.apache.hyracks.algebricks.core.algebra.operators.logical; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.mutable.Mutable; +import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; +import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator; +import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable; +import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment; +import org.apache.hyracks.algebricks.core.algebra.properties.VariablePropagationPolicy; +import org.apache.hyracks.algebricks.core.algebra.typing.ITypingContext; +import org.apache.hyracks.algebricks.core.algebra.visitors.ILogicalExpressionReferenceTransform; + +/** + * Abstract class for two replication related operator - replicate and split + * Replicate operator propagates all frames to all output branches. + * That is, each tuple will be propagated to all output branches. + * Split operator propagates each tuple in a frame to one output branch only. + */ +public abstract class AbstractReplicateOperator extends AbstractLogicalOperator { + + private int outputArity; + protected boolean[] outputMaterializationFlags; + private List<Mutable<ILogicalOperator>> outputs; + + public AbstractReplicateOperator(int outputArity) { + this.outputArity = outputArity; + this.outputMaterializationFlags = new boolean[outputArity]; + this.outputs = new ArrayList<>(); + } + + public AbstractReplicateOperator(int outputArity, boolean[] outputMaterializationFlags) { + this.outputArity = outputArity; + this.outputMaterializationFlags = outputMaterializationFlags; + this.outputs = new ArrayList<>(); + } + + @Override + public boolean acceptExpressionTransform(ILogicalExpressionReferenceTransform transform) + throws AlgebricksException { + return false; + } + + @Override + public VariablePropagationPolicy getVariablePropagationPolicy() { + return VariablePropagationPolicy.ALL; + } + + @Override + public boolean isMap() { + return true; + } + + @Override + public void recomputeSchema() { + schema = new ArrayList<LogicalVariable>(inputs.get(0).getValue().getSchema()); + } + + public void substituteVar(LogicalVariable v1, LogicalVariable v2) { + // do nothing + } + + public int getOutputArity() { + return outputArity; + } + + public void setOutputMaterializationFlags(boolean[] outputMaterializationFlags) { + this.outputMaterializationFlags = outputMaterializationFlags; + } + + public boolean[] getOutputMaterializationFlags() { + return outputMaterializationFlags; + } + + public List<Mutable<ILogicalOperator>> getOutputs() { + return outputs; + } + + @Override + public IVariableTypeEnvironment computeOutputTypeEnvironment(ITypingContext ctx) throws AlgebricksException { + return createPropagatingAllInputsTypeEnvironment(ctx); + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/PartitioningSplitOperator.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/PartitioningSplitOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/PartitioningSplitOperator.java deleted file mode 100644 index 1c5f324..0000000 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/PartitioningSplitOperator.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * 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. - */ -package org.apache.hyracks.algebricks.core.algebra.operators.logical; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.lang3.mutable.Mutable; - -import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; -import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression; -import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; -import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable; -import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment; -import org.apache.hyracks.algebricks.core.algebra.properties.VariablePropagationPolicy; -import org.apache.hyracks.algebricks.core.algebra.typing.ITypingContext; -import org.apache.hyracks.algebricks.core.algebra.visitors.ILogicalExpressionReferenceTransform; -import org.apache.hyracks.algebricks.core.algebra.visitors.ILogicalOperatorVisitor; -import org.apache.hyracks.algebricks.runtime.operators.std.PartitioningSplitOperatorDescriptor; - -/** - * Partitions it's input based on a given list of expressions. - * Each expression is assumed to return true/false, - * and there is exactly one output branch per expression (optionally, plus one default branch). - * For each input tuple, the expressions are evaluated one-by-one, - * and the tuple is written to first output branch whose corresponding - * expression evaluates to true. - * If all expressions evaluate to false, then - * the tuple is written to the default output branch, if any was given. - * If no output branch was given, then such tuples are simply dropped. - * Given N expressions there may be N or N+1 output branches because the default output branch may be separate from the regular output branches. - */ -public class PartitioningSplitOperator extends AbstractLogicalOperator { - - private final List<Mutable<ILogicalExpression>> expressions; - private final int defaultBranchIndex; - - public PartitioningSplitOperator(List<Mutable<ILogicalExpression>> expressions, int defaultBranchIndex) throws AlgebricksException { - this.expressions = expressions; - this.defaultBranchIndex = defaultBranchIndex; - // Check that the default output branch index is in [0, N], where N is the number of expressions. - if (defaultBranchIndex != PartitioningSplitOperatorDescriptor.NO_DEFAULT_BRANCH - && defaultBranchIndex > expressions.size()) { - throw new AlgebricksException("Default branch index out of bounds. Number of exprs given: " - + expressions.size() + ". The maximum default branch index may therefore be: " + expressions.size()); - } - } - - public List<Mutable<ILogicalExpression>> getExpressions() { - return expressions; - } - - public int getDefaultBranchIndex() { - return defaultBranchIndex; - } - - public int getNumOutputBranches() { - return (defaultBranchIndex == expressions.size()) ? expressions.size() + 1 : expressions.size(); - } - - @Override - public LogicalOperatorTag getOperatorTag() { - return LogicalOperatorTag.PARTITIONINGSPLIT; - } - - @Override - public void recomputeSchema() { - schema = new ArrayList<LogicalVariable>(); - schema.addAll(inputs.get(0).getValue().getSchema()); - } - - @Override - public VariablePropagationPolicy getVariablePropagationPolicy() { - return VariablePropagationPolicy.ALL; - } - - @Override - public boolean acceptExpressionTransform(ILogicalExpressionReferenceTransform visitor) throws AlgebricksException { - boolean b = false; - for (int i = 0; i < expressions.size(); i++) { - if (visitor.transform(expressions.get(i))) { - b = true; - } - } - return b; - } - - @Override - public <R, T> R accept(ILogicalOperatorVisitor<R, T> visitor, T arg) throws AlgebricksException { - return visitor.visitPartitioningSplitOperator(this, arg); - } - - @Override - public boolean isMap() { - return false; - } - - @Override - public IVariableTypeEnvironment computeOutputTypeEnvironment(ITypingContext ctx) throws AlgebricksException { - return createPropagatingAllInputsTypeEnvironment(ctx); - } - -} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/ReplicateOperator.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/ReplicateOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/ReplicateOperator.java index 834107c..2d2fd0f 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/ReplicateOperator.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/ReplicateOperator.java @@ -18,36 +18,18 @@ */ package org.apache.hyracks.algebricks.core.algebra.operators.logical; -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.lang3.mutable.Mutable; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; -import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator; import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; -import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable; -import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment; -import org.apache.hyracks.algebricks.core.algebra.properties.VariablePropagationPolicy; -import org.apache.hyracks.algebricks.core.algebra.typing.ITypingContext; -import org.apache.hyracks.algebricks.core.algebra.visitors.ILogicalExpressionReferenceTransform; import org.apache.hyracks.algebricks.core.algebra.visitors.ILogicalOperatorVisitor; -public class ReplicateOperator extends AbstractLogicalOperator { - - private int outputArity; - private boolean[] outputMaterializationFlags; - private List<Mutable<ILogicalOperator>> outputs; +public class ReplicateOperator extends AbstractReplicateOperator { public ReplicateOperator(int outputArity) { - this.outputArity = outputArity; - this.outputMaterializationFlags = new boolean[outputArity]; - this.outputs = new ArrayList<>(); + super(outputArity); } public ReplicateOperator(int outputArity, boolean[] outputMaterializationFlags) { - this.outputArity = outputArity; - this.outputMaterializationFlags = outputMaterializationFlags; - this.outputs = new ArrayList<>(); + super(outputArity, outputMaterializationFlags); } @Override @@ -60,52 +42,6 @@ public class ReplicateOperator extends AbstractLogicalOperator { return visitor.visitReplicateOperator(this, arg); } - @Override - public boolean acceptExpressionTransform(ILogicalExpressionReferenceTransform transform) - throws AlgebricksException { - return false; - } - - @Override - public VariablePropagationPolicy getVariablePropagationPolicy() { - return VariablePropagationPolicy.ALL; - } - - @Override - public boolean isMap() { - return true; - } - - @Override - public void recomputeSchema() { - schema = new ArrayList<LogicalVariable>(inputs.get(0).getValue().getSchema()); - } - - public void substituteVar(LogicalVariable v1, LogicalVariable v2) { - // do nothing - } - - public int getOutputArity() { - return outputArity; - } - - public void setOutputMaterializationFlags(boolean[] outputMaterializationFlags) { - this.outputMaterializationFlags = outputMaterializationFlags; - } - - public boolean[] getOutputMaterializationFlags() { - return outputMaterializationFlags; - } - - public List<Mutable<ILogicalOperator>> getOutputs() { - return outputs; - } - - @Override - public IVariableTypeEnvironment computeOutputTypeEnvironment(ITypingContext ctx) throws AlgebricksException { - return createPropagatingAllInputsTypeEnvironment(ctx); - } - public boolean isBlocker() { for (boolean requiresMaterialization : outputMaterializationFlags) { if (requiresMaterialization) { http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/SplitOperator.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/SplitOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/SplitOperator.java new file mode 100644 index 0000000..a996673 --- /dev/null +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/SplitOperator.java @@ -0,0 +1,65 @@ +/* + * Copyright 2009-2013 by The Regents of the University of California + * Licensed 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 from + * + * 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. + */ +package org.apache.hyracks.algebricks.core.algebra.operators.logical; + +import org.apache.commons.lang3.mutable.Mutable; +import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; +import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression; +import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; +import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable; +import org.apache.hyracks.algebricks.core.algebra.visitors.ILogicalExpressionReferenceTransform; +import org.apache.hyracks.algebricks.core.algebra.visitors.ILogicalOperatorVisitor; + +/** + * Split Operator receives an expression. This expression will be evaluated to an integer value during the runtime. + * Based on its value, it propagates each tuple to the corresponding output frame. (e.g., first output = 0, ...) + * Thus, unlike Replicate operator that does unconditional propagation to all outputs, + * this does a conditional propagate operation. + */ +public class SplitOperator extends AbstractReplicateOperator { + + // Expression that keeps the output branch information for each tuple + private final Mutable<ILogicalExpression> branchingExpression; + + public SplitOperator(int outputArity, Mutable<ILogicalExpression> branchingExpression) { + super(outputArity); + this.branchingExpression = branchingExpression; + } + + @Override + public LogicalOperatorTag getOperatorTag() { + return LogicalOperatorTag.SPLIT; + } + + @Override + public <R, T> R accept(ILogicalOperatorVisitor<R, T> visitor, T arg) throws AlgebricksException { + return visitor.visitSplitOperator(this, arg); + } + + public Mutable<ILogicalExpression> getBranchingExpression() { + return branchingExpression; + } + + @Override + public boolean acceptExpressionTransform(ILogicalExpressionReferenceTransform visitor) throws AlgebricksException { + return visitor.transform(branchingExpression); + } + + @Override + public void substituteVar(LogicalVariable v1, LogicalVariable v2) { + getBranchingExpression().getValue().substituteVar(v1, v2); + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/CardinalityInferenceVisitor.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/CardinalityInferenceVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/CardinalityInferenceVisitor.java index b999493..d278078 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/CardinalityInferenceVisitor.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/CardinalityInferenceVisitor.java @@ -48,13 +48,13 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperato import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SinkOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; @@ -175,12 +175,12 @@ public class CardinalityInferenceVisitor implements ILogicalOperatorVisitor<Long } @Override - public Long visitPartitioningSplitOperator(PartitioningSplitOperator op, Void arg) throws AlgebricksException { + public Long visitReplicateOperator(ReplicateOperator op, Void arg) throws AlgebricksException { return op.getInputs().get(0).getValue().accept(this, arg); } @Override - public Long visitReplicateOperator(ReplicateOperator op, Void arg) throws AlgebricksException { + public Long visitSplitOperator(SplitOperator op, Void arg) throws AlgebricksException { return op.getInputs().get(0).getValue().accept(this, arg); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/FDsAndEquivClassesVisitor.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/FDsAndEquivClassesVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/FDsAndEquivClassesVisitor.java index 5e2a041..b259869 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/FDsAndEquivClassesVisitor.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/FDsAndEquivClassesVisitor.java @@ -30,7 +30,6 @@ import java.util.Set; import org.apache.commons.lang3.mutable.Mutable; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; -import org.apache.hyracks.algebricks.common.exceptions.NotImplementedException; import org.apache.hyracks.algebricks.common.utils.ListSet; import org.apache.hyracks.algebricks.common.utils.Pair; import org.apache.hyracks.algebricks.core.algebra.base.EquivalenceClass; @@ -67,13 +66,13 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperato import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SinkOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; @@ -405,12 +404,6 @@ public class FDsAndEquivClassesVisitor implements ILogicalOperatorVisitor<Void, } @Override - public Void visitPartitioningSplitOperator(PartitioningSplitOperator op, IOptimizationContext ctx) - throws AlgebricksException { - throw new NotImplementedException(); - } - - @Override public Void visitProjectOperator(ProjectOperator op, IOptimizationContext ctx) throws AlgebricksException { propagateFDsAndEquivClassesForUsedVars(op, ctx, op.getVariables()); return null; @@ -423,6 +416,12 @@ public class FDsAndEquivClassesVisitor implements ILogicalOperatorVisitor<Void, } @Override + public Void visitSplitOperator(SplitOperator op, IOptimizationContext ctx) throws AlgebricksException { + propagateFDsAndEquivClasses(op, ctx); + return null; + } + + @Override public Void visitMaterializeOperator(MaterializeOperator op, IOptimizationContext ctx) throws AlgebricksException { propagateFDsAndEquivClasses(op, ctx); return null; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java index c0e8b34..7f34e8b 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java @@ -55,13 +55,13 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeO import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SinkOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; @@ -277,24 +277,23 @@ public class IsomorphismOperatorVisitor implements ILogicalOperatorVisitor<Boole } @Override - public Boolean visitPartitioningSplitOperator(PartitioningSplitOperator op, ILogicalOperator arg) - throws AlgebricksException { + public Boolean visitReplicateOperator(ReplicateOperator op, ILogicalOperator arg) throws AlgebricksException { AbstractLogicalOperator aop = (AbstractLogicalOperator) arg; - if (aop.getOperatorTag() != LogicalOperatorTag.PARTITIONINGSPLIT) { + if (aop.getOperatorTag() != LogicalOperatorTag.REPLICATE) { return Boolean.FALSE; } - PartitioningSplitOperator partitionOpArg = (PartitioningSplitOperator) copyAndSubstituteVar(op, arg); - boolean isomorphic = compareExpressions(op.getExpressions(), partitionOpArg.getExpressions()); - return isomorphic; + return Boolean.TRUE; } @Override - public Boolean visitReplicateOperator(ReplicateOperator op, ILogicalOperator arg) throws AlgebricksException { + public Boolean visitSplitOperator(SplitOperator op, ILogicalOperator arg) throws AlgebricksException { AbstractLogicalOperator aop = (AbstractLogicalOperator) arg; - if (aop.getOperatorTag() != LogicalOperatorTag.REPLICATE) { + if (aop.getOperatorTag() != LogicalOperatorTag.SPLIT) { return Boolean.FALSE; } - return Boolean.TRUE; + SplitOperator sOpArg = (SplitOperator) copyAndSubstituteVar(op, arg); + boolean isomorphic = op.getBranchingExpression().getValue().equals(sOpArg.getBranchingExpression().getValue()); + return isomorphic; } @Override http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismVariableMappingVisitor.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismVariableMappingVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismVariableMappingVisitor.java index 965008c..58b31f8 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismVariableMappingVisitor.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismVariableMappingVisitor.java @@ -22,8 +22,8 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; +import java.util.Set; import org.apache.commons.lang3.mutable.Mutable; import org.apache.commons.lang3.mutable.MutableObject; @@ -57,13 +57,13 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperato import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SinkOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; @@ -165,14 +165,13 @@ public class IsomorphismVariableMappingVisitor implements ILogicalOperatorVisito } @Override - public Void visitPartitioningSplitOperator(PartitioningSplitOperator op, ILogicalOperator arg) - throws AlgebricksException { + public Void visitReplicateOperator(ReplicateOperator op, ILogicalOperator arg) throws AlgebricksException { mapVariablesStandard(op, arg); return null; } @Override - public Void visitReplicateOperator(ReplicateOperator op, ILogicalOperator arg) throws AlgebricksException { + public Void visitSplitOperator(SplitOperator op, ILogicalOperator arg) throws AlgebricksException { mapVariablesStandard(op, arg); return null; } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalOperatorDeepCopyWithNewVariablesVisitor.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalOperatorDeepCopyWithNewVariablesVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalOperatorDeepCopyWithNewVariablesVisitor.java index 4241d84..f4b3195 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalOperatorDeepCopyWithNewVariablesVisitor.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalOperatorDeepCopyWithNewVariablesVisitor.java @@ -52,18 +52,18 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperato import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestMapOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; import org.apache.hyracks.algebricks.core.algebra.plan.ALogicalPlanImpl; import org.apache.hyracks.algebricks.core.algebra.properties.FunctionalDependency; import org.apache.hyracks.algebricks.core.algebra.typing.ITypingContext; @@ -384,14 +384,6 @@ public class LogicalOperatorDeepCopyWithNewVariablesVisitor } @Override - public ILogicalOperator visitPartitioningSplitOperator(PartitioningSplitOperator op, ILogicalOperator arg) - throws AlgebricksException { - PartitioningSplitOperator opCopy = new PartitioningSplitOperator( - exprDeepCopyVisitor.deepCopyExpressionReferenceList(op.getExpressions()), op.getDefaultBranchIndex()); - return opCopy; - } - - @Override public ILogicalOperator visitProjectOperator(ProjectOperator op, ILogicalOperator arg) throws AlgebricksException { ProjectOperator opCopy = new ProjectOperator(deepCopyVariableList(op.getVariables())); deepCopyInputsAnnotationsAndExecutionMode(op, arg, opCopy); @@ -410,6 +402,13 @@ public class LogicalOperatorDeepCopyWithNewVariablesVisitor } @Override + public ILogicalOperator visitSplitOperator(SplitOperator op, ILogicalOperator arg) throws AlgebricksException { + SplitOperator opCopy = new SplitOperator(op.getOutputArity(), op.getBranchingExpression()); + deepCopyInputsAnnotationsAndExecutionMode(op, arg, opCopy); + return opCopy; + } + + @Override public ILogicalOperator visitMaterializeOperator(MaterializeOperator op, ILogicalOperator arg) throws AlgebricksException { MaterializeOperator opCopy = new MaterializeOperator(); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalPropertiesVisitor.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalPropertiesVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalPropertiesVisitor.java index 8d3644d..7e92869 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalPropertiesVisitor.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalPropertiesVisitor.java @@ -47,13 +47,13 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperato import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SinkOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; @@ -174,13 +174,6 @@ public class LogicalPropertiesVisitor implements ILogicalOperatorVisitor<Void, I } @Override - public Void visitPartitioningSplitOperator(PartitioningSplitOperator op, IOptimizationContext arg) - throws AlgebricksException { - // TODO Auto-generated method stub - return null; - } - - @Override public Void visitProjectOperator(ProjectOperator op, IOptimizationContext context) throws AlgebricksException { propagateCardinalityAndFrameNumber(op, context); return null; @@ -193,6 +186,11 @@ public class LogicalPropertiesVisitor implements ILogicalOperatorVisitor<Void, I } @Override + public Void visitSplitOperator(SplitOperator op, IOptimizationContext arg) throws AlgebricksException { + return null; + } + + @Override public Void visitMaterializeOperator(MaterializeOperator op, IOptimizationContext arg) throws AlgebricksException { // TODO Auto-generated method stub return null; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/OperatorDeepCopyVisitor.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/OperatorDeepCopyVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/OperatorDeepCopyVisitor.java index fde6a28..442899f 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/OperatorDeepCopyVisitor.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/OperatorDeepCopyVisitor.java @@ -52,13 +52,14 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperato import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SinkOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; @@ -66,7 +67,6 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestMapOpe import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.WriteOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.WriteResultOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; import org.apache.hyracks.algebricks.core.algebra.util.OperatorManipulationUtil; import org.apache.hyracks.algebricks.core.algebra.visitors.ILogicalOperatorVisitor; @@ -167,16 +167,13 @@ public class OperatorDeepCopyVisitor implements ILogicalOperatorVisitor<ILogical } @Override - public ILogicalOperator visitPartitioningSplitOperator(PartitioningSplitOperator op, Void arg) - throws AlgebricksException { - ArrayList<Mutable<ILogicalExpression>> newExpressions = new ArrayList<>(); - deepCopyExpressionRefs(newExpressions, op.getExpressions()); - return new PartitioningSplitOperator(newExpressions, op.getDefaultBranchIndex()); + public ILogicalOperator visitReplicateOperator(ReplicateOperator op, Void arg) throws AlgebricksException { + return new ReplicateOperator(op.getOutputArity()); } @Override - public ILogicalOperator visitReplicateOperator(ReplicateOperator op, Void arg) throws AlgebricksException { - return new ReplicateOperator(op.getOutputArity()); + public ILogicalOperator visitSplitOperator(SplitOperator op, Void arg) throws AlgebricksException { + return new SplitOperator(op.getOutputArity(), op.getBranchingExpression()); } @Override http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/PrimaryKeyVariablesVisitor.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/PrimaryKeyVariablesVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/PrimaryKeyVariablesVisitor.java index f01b20f..9f1acea 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/PrimaryKeyVariablesVisitor.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/PrimaryKeyVariablesVisitor.java @@ -49,13 +49,13 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperato import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SinkOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; @@ -174,13 +174,12 @@ public class PrimaryKeyVariablesVisitor implements ILogicalOperatorVisitor<Void, } @Override - public Void visitPartitioningSplitOperator(PartitioningSplitOperator op, IOptimizationContext ctx) - throws AlgebricksException { + public Void visitReplicateOperator(ReplicateOperator op, IOptimizationContext ctx) throws AlgebricksException { return null; } @Override - public Void visitReplicateOperator(ReplicateOperator op, IOptimizationContext ctx) throws AlgebricksException { + public Void visitSplitOperator(SplitOperator op, IOptimizationContext arg) throws AlgebricksException { return null; } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/ProducedVariableVisitor.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/ProducedVariableVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/ProducedVariableVisitor.java index 10659b1..3645aff 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/ProducedVariableVisitor.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/ProducedVariableVisitor.java @@ -48,18 +48,18 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.InsertDelete import org.apache.hyracks.algebricks.core.algebra.operators.logical.IntersectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterJoinOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestMapOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SinkOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; @@ -156,11 +156,6 @@ public class ProducedVariableVisitor implements ILogicalOperatorVisitor<Void, Vo } @Override - public Void visitPartitioningSplitOperator(PartitioningSplitOperator op, Void arg) throws AlgebricksException { - return null; - } - - @Override public Void visitProjectOperator(ProjectOperator op, Void arg) throws AlgebricksException { return null; } @@ -255,6 +250,11 @@ public class ProducedVariableVisitor implements ILogicalOperatorVisitor<Void, Vo } @Override + public Void visitSplitOperator(SplitOperator op, Void arg) throws AlgebricksException { + return null; + } + + @Override public Void visitMaterializeOperator(MaterializeOperator op, Void arg) throws AlgebricksException { return null; } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/SchemaVariableVisitor.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/SchemaVariableVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/SchemaVariableVisitor.java index d35153a..a746cf2 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/SchemaVariableVisitor.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/SchemaVariableVisitor.java @@ -46,18 +46,18 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.InsertDelete import org.apache.hyracks.algebricks.core.algebra.operators.logical.IntersectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterJoinOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestMapOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SinkOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; @@ -179,12 +179,6 @@ public class SchemaVariableVisitor implements ILogicalOperatorVisitor<Void, Void } @Override - public Void visitPartitioningSplitOperator(PartitioningSplitOperator op, Void arg) throws AlgebricksException { - standardLayout(op); - return null; - } - - @Override public Void visitProjectOperator(ProjectOperator op, Void arg) throws AlgebricksException { schemaVariables.addAll(op.getVariables()); return null; @@ -288,6 +282,12 @@ public class SchemaVariableVisitor implements ILogicalOperatorVisitor<Void, Void } @Override + public Void visitSplitOperator(SplitOperator op, Void arg) throws AlgebricksException { + standardLayout(op); + return null; + } + + @Override public Void visitMaterializeOperator(MaterializeOperator op, Void arg) throws AlgebricksException { standardLayout(op); return null; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/SubstituteVariableVisitor.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/SubstituteVariableVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/SubstituteVariableVisitor.java index f2da7c4..7345928 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/SubstituteVariableVisitor.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/SubstituteVariableVisitor.java @@ -46,19 +46,19 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.InsertDelete import org.apache.hyracks.algebricks.core.algebra.operators.logical.IntersectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterJoinOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestMapOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SinkOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; @@ -219,16 +219,6 @@ public class SubstituteVariableVisitor } @Override - public Void visitPartitioningSplitOperator(PartitioningSplitOperator op, - Pair<LogicalVariable, LogicalVariable> pair) throws AlgebricksException { - for (Mutable<ILogicalExpression> e : op.getExpressions()) { - e.getValue().substituteVar(pair.first, pair.second); - } - substVarTypes(op, pair); - return null; - } - - @Override public Void visitProjectOperator(ProjectOperator op, Pair<LogicalVariable, LogicalVariable> pair) throws AlgebricksException { List<LogicalVariable> usedVariables = op.getVariables(); @@ -414,6 +404,13 @@ public class SubstituteVariableVisitor } @Override + public Void visitSplitOperator(SplitOperator op, Pair<LogicalVariable, LogicalVariable> arg) + throws AlgebricksException { + op.substituteVar(arg.first, arg.second); + return null; + } + + @Override public Void visitMaterializeOperator(MaterializeOperator op, Pair<LogicalVariable, LogicalVariable> arg) throws AlgebricksException { return null; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/UsedVariableVisitor.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/UsedVariableVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/UsedVariableVisitor.java index 0d50dc2..cfe2a37 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/UsedVariableVisitor.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/UsedVariableVisitor.java @@ -52,13 +52,13 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeO import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SinkOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; @@ -232,14 +232,6 @@ public class UsedVariableVisitor implements ILogicalOperatorVisitor<Void, Void> } @Override - public Void visitPartitioningSplitOperator(PartitioningSplitOperator op, Void arg) { - for (Mutable<ILogicalExpression> e : op.getExpressions()) { - e.getValue().getUsedVariables(usedVariables); - } - return null; - } - - @Override public Void visitProjectOperator(ProjectOperator op, Void arg) { List<LogicalVariable> parameterVariables = op.getVariables(); for (LogicalVariable v : parameterVariables) { @@ -443,6 +435,14 @@ public class UsedVariableVisitor implements ILogicalOperatorVisitor<Void, Void> } @Override + public Void visitSplitOperator(SplitOperator op, Void arg) throws AlgebricksException { + for (Mutable<ILogicalOperator> outputOp : op.getOutputs()) { + VariableUtilities.getUsedVariables(outputOp.getValue(), usedVariables); + } + return null; + } + + @Override public Void visitMaterializeOperator(MaterializeOperator op, Void arg) throws AlgebricksException { return null; } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/76a4f9e3/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractReplicatePOperator.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractReplicatePOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractReplicatePOperator.java new file mode 100644 index 0000000..1d13163 --- /dev/null +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractReplicatePOperator.java @@ -0,0 +1,68 @@ +/* + * 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. + */ +package org.apache.hyracks.algebricks.core.algebra.operators.physical; + +import org.apache.hyracks.algebricks.common.utils.Pair; +import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator; +import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractReplicateOperator; +import org.apache.hyracks.algebricks.core.algebra.properties.IPhysicalPropertiesVector; +import org.apache.hyracks.algebricks.core.algebra.properties.PhysicalRequirements; +import org.apache.hyracks.algebricks.core.algebra.properties.StructuralPropertiesVector; + +public abstract class AbstractReplicatePOperator extends AbstractPhysicalOperator { + + @Override + public boolean isMicroOperator() { + return false; + } + + @Override + public PhysicalRequirements getRequiredPropertiesForChildren(ILogicalOperator op, + IPhysicalPropertiesVector reqdByParent, IOptimizationContext context) { + return emptyUnaryRequirements(); + } + + @Override + public void computeDeliveredProperties(ILogicalOperator op, IOptimizationContext context) { + AbstractLogicalOperator op2 = (AbstractLogicalOperator) op.getInputs().get(0).getValue(); + deliveredProperties = (StructuralPropertiesVector) op2.getDeliveredPhysicalProperties().clone(); + } + + @Override + public Pair<int[], int[]> getInputOutputDependencyLabels(ILogicalOperator op) { + int[] inputDependencyLabels = new int[] { 0 }; + AbstractReplicateOperator rop = (AbstractReplicateOperator) op; + int[] outputDependencyLabels = new int[rop.getOutputArity()]; + // change the labels of outputs that requires materialization to 1 + boolean[] outputMaterializationFlags = rop.getOutputMaterializationFlags(); + for (int i = 0; i < rop.getOutputArity(); i++) { + if (outputMaterializationFlags[i]) { + outputDependencyLabels[i] = 1; + } + } + return new Pair<>(inputDependencyLabels, outputDependencyLabels); + } + + @Override + public boolean expensiveThanMaterialization() { + return false; + } +}
