Return-Path: X-Original-To: apmail-asterixdb-commits-archive@minotaur.apache.org Delivered-To: apmail-asterixdb-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id E535118E00 for ; Tue, 25 Aug 2015 17:08:11 +0000 (UTC) Received: (qmail 48955 invoked by uid 500); 25 Aug 2015 17:08:11 -0000 Delivered-To: apmail-asterixdb-commits-archive@asterixdb.apache.org Received: (qmail 48923 invoked by uid 500); 25 Aug 2015 17:08:11 -0000 Mailing-List: contact commits-help@asterixdb.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@asterixdb.incubator.apache.org Delivered-To: mailing list commits@asterixdb.incubator.apache.org Received: (qmail 48914 invoked by uid 99); 25 Aug 2015 17:08:11 -0000 Received: from Unknown (HELO spamd3-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 25 Aug 2015 17:08:11 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id 3D2BC182344 for ; Tue, 25 Aug 2015 17:08:11 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 0.794 X-Spam-Level: X-Spam-Status: No, score=0.794 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, RP_MATCHES_RCVD=-0.006] autolearn=disabled Received: from mx1-us-east.apache.org ([10.40.0.8]) by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024) with ESMTP id 9YJhjM_-5hFd for ; Tue, 25 Aug 2015 17:07:56 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-us-east.apache.org (ASF Mail Server at mx1-us-east.apache.org) with SMTP id 7204B42B2E for ; Tue, 25 Aug 2015 17:07:55 +0000 (UTC) Received: (qmail 69568 invoked by uid 99); 25 Aug 2015 16:41:15 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 25 Aug 2015 16:41:15 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 322CBE35D0; Tue, 25 Aug 2015 16:41:15 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: imaxon@apache.org To: commits@asterixdb.incubator.apache.org Date: Tue, 25 Aug 2015 16:41:58 -0000 Message-Id: In-Reply-To: <339f74e1fc5c4aabb18d5e46ecf6ba11@git.apache.org> References: <339f74e1fc5c4aabb18d5e46ecf6ba11@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [45/51] [partial] incubator-asterixdb-hyracks git commit: Change folder structure for Java repackage http://git-wip-us.apache.org/repos/asf/incubator-asterixdb-hyracks/blob/9939b48e/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/UnnestMapOperator.java ---------------------------------------------------------------------- diff --git a/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/UnnestMapOperator.java b/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/UnnestMapOperator.java deleted file mode 100644 index b7a56be..0000000 --- a/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/UnnestMapOperator.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * 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 edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical; - -import java.util.List; - -import org.apache.commons.lang3.mutable.Mutable; - -import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalExpression; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalVariable; -import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment; -import edu.uci.ics.hyracks.algebricks.core.algebra.properties.VariablePropagationPolicy; -import edu.uci.ics.hyracks.algebricks.core.algebra.typing.ITypingContext; -import edu.uci.ics.hyracks.algebricks.core.algebra.typing.NonPropagatingTypeEnvironment; -import edu.uci.ics.hyracks.algebricks.core.algebra.visitors.ILogicalOperatorVisitor; - -/** - * This operator may go away after we add indexes to Algebricks. - */ -public class UnnestMapOperator extends AbstractUnnestOperator { - - private final List variableTypes; // TODO: get rid of this and deprecate UnnestMap - private boolean propagateInput; - - private List> additionalFilteringExpressions; - private List minFilterVars; - private List maxFilterVars; - - public UnnestMapOperator(List variables, Mutable expression, - List variableTypes, boolean propagateInput) { - super(variables, expression); - this.variableTypes = variableTypes; - this.propagateInput = propagateInput; - } - - @Override - public LogicalOperatorTag getOperatorTag() { - return LogicalOperatorTag.UNNEST_MAP; - } - - @Override - public R accept(ILogicalOperatorVisitor visitor, T arg) throws AlgebricksException { - return visitor.visitUnnestMapOperator(this, arg); - } - - /** - * UnnestMap doesn't propagate input variables, because currently it is only - * used to search indexes. In the future, it would be nice to have the - * choice to propagate input variables or not. - */ - @Override - public VariablePropagationPolicy getVariablePropagationPolicy() { - return new VariablePropagationPolicy() { - @Override - public void propagateVariables(IOperatorSchema target, IOperatorSchema... sources) - throws AlgebricksException { - if (propagateInput) { - target.addAllVariables(sources[0]); - } - for (LogicalVariable v : variables) { - target.addVariable(v); - } - } - }; - } - - public List getVariableTypes() { - return variableTypes; - } - - @Override - public IVariableTypeEnvironment computeOutputTypeEnvironment(ITypingContext ctx) throws AlgebricksException { - IVariableTypeEnvironment env = null; - if (propagateInput) { - env = createPropagatingAllInputsTypeEnvironment(ctx); - } else { - env = new NonPropagatingTypeEnvironment(ctx.getExpressionTypeComputer(), ctx.getMetadataProvider()); - } - int n = variables.size(); - for (int i = 0; i < n; i++) { - env.setVarType(variables.get(i), variableTypes.get(i)); - } - return env; - } - - public boolean propagatesInput() { - return propagateInput; - } - - public List getMinFilterVars() { - return minFilterVars; - } - - public void setMinFilterVars(List minFilterVars) { - this.minFilterVars = minFilterVars; - } - - public List getMaxFilterVars() { - return maxFilterVars; - } - - public void setMaxFilterVars(List maxFilterVars) { - this.maxFilterVars = maxFilterVars; - } - - public void setAdditionalFilteringExpressions(List> additionalFilteringExpressions) { - this.additionalFilteringExpressions = additionalFilteringExpressions; - } - - public List> getAdditionalFilteringExpressions() { - return additionalFilteringExpressions; - } - - /* - @Override - public boolean isMap() { - return !propagateInput; - } - */ -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-asterixdb-hyracks/blob/9939b48e/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/UnnestOperator.java ---------------------------------------------------------------------- diff --git a/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/UnnestOperator.java b/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/UnnestOperator.java deleted file mode 100644 index dba9e19..0000000 --- a/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/UnnestOperator.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * 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 edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical; - -import java.util.ArrayList; - -import org.apache.commons.lang3.mutable.Mutable; - -import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalExpression; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalVariable; -import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment; -import edu.uci.ics.hyracks.algebricks.core.algebra.properties.VariablePropagationPolicy; -import edu.uci.ics.hyracks.algebricks.core.algebra.typing.ITypingContext; -import edu.uci.ics.hyracks.algebricks.core.algebra.visitors.ILogicalOperatorVisitor; -import edu.uci.ics.hyracks.algebricks.runtime.base.IUnnestingPositionWriter; - -public class UnnestOperator extends AbstractUnnestOperator { - - private LogicalVariable positionalVariable; - - /** - * Used to set the position offset for positional variable - */ - private ILogicalExpression positionOffsetExpr; - - /** - * Specify the writer of the positional variable - */ - private IUnnestingPositionWriter positionWriter; - - /** - * Specify the type of the positional variable - */ - private Object positionalVariableType; - - public UnnestOperator(LogicalVariable variable, Mutable expression) { - super(makeSingletonList(variable), expression); - } - - public UnnestOperator(LogicalVariable variable, Mutable expression, - LogicalVariable positionalVariable, Object positionalVariableType, IUnnestingPositionWriter positionWriter) { - this(variable, expression); - this.setPositionalVariable(positionalVariable); - this.setPositionalVariableType(positionalVariableType); - this.setPositionWriter(positionWriter); - } - - @Override - public LogicalOperatorTag getOperatorTag() { - return LogicalOperatorTag.UNNEST; - } - - public LogicalVariable getVariable() { - return variables.get(0); - } - - public void setPositionalVariable(LogicalVariable positionalVariable) { - this.positionalVariable = positionalVariable; - } - - public LogicalVariable getPositionalVariable() { - return positionalVariable; - } - - public void setPositionWriter(IUnnestingPositionWriter positionWriter) { - this.positionWriter = positionWriter; - } - - public IUnnestingPositionWriter getPositionWriter() { - return positionalVariable != null ? positionWriter : null; - } - - public void setPositionalVariableType(Object positionalVariableType) { - this.positionalVariableType = positionalVariableType; - } - - public Object getPositionalVariableType() { - return positionalVariableType; - } - - public void setPositionOffsetExpr(ILogicalExpression posOffsetExpr) { - this.positionOffsetExpr = posOffsetExpr; - } - - public ILogicalExpression getPositionOffsetExpr() { - return this.positionOffsetExpr; - } - - @Override - public R accept(ILogicalOperatorVisitor visitor, T arg) throws AlgebricksException { - return visitor.visitUnnestOperator(this, arg); - } - - private static ArrayList makeSingletonList(E item) { - ArrayList array = new ArrayList(1); - array.add(item); - return array; - } - - @Override - public IVariableTypeEnvironment computeOutputTypeEnvironment(ITypingContext ctx) throws AlgebricksException { - IVariableTypeEnvironment env = createPropagatingAllInputsTypeEnvironment(ctx); - Object t = env.getType(expression.getValue()); - env.setVarType(variables.get(0), t); - if (positionalVariable != null) { - env.setVarType(positionalVariable, positionalVariableType); - } - return env; - } - - @Override - public VariablePropagationPolicy getVariablePropagationPolicy() { - return new VariablePropagationPolicy() { - - @Override - public void propagateVariables(IOperatorSchema target, IOperatorSchema... sources) - throws AlgebricksException { - if (sources.length > 0) { - target.addAllVariables(sources[0]); - } - for (LogicalVariable v : variables) { - target.addVariable(v); - } - if (positionalVariable != null) { - target.addVariable(positionalVariable); - } - } - }; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-asterixdb-hyracks/blob/9939b48e/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/UpdateOperator.java ---------------------------------------------------------------------- diff --git a/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/UpdateOperator.java b/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/UpdateOperator.java deleted file mode 100644 index 841f9c6..0000000 --- a/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/UpdateOperator.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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 edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical; - -import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; -import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment; -import edu.uci.ics.hyracks.algebricks.core.algebra.properties.VariablePropagationPolicy; -import edu.uci.ics.hyracks.algebricks.core.algebra.typing.ITypingContext; -import edu.uci.ics.hyracks.algebricks.core.algebra.visitors.ILogicalExpressionReferenceTransform; -import edu.uci.ics.hyracks.algebricks.core.algebra.visitors.ILogicalOperatorVisitor; - -public class UpdateOperator extends AbstractLogicalOperator { - - @Override - public void recomputeSchema() throws AlgebricksException { - // TODO Auto-generated method stub - - } - - @Override - public boolean acceptExpressionTransform(ILogicalExpressionReferenceTransform transform) throws AlgebricksException { - // TODO Auto-generated method stub - return false; - } - - @Override - public R accept(ILogicalOperatorVisitor visitor, T arg) throws AlgebricksException { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean isMap() { - // TODO Auto-generated method stub - return false; - } - - @Override - public VariablePropagationPolicy getVariablePropagationPolicy() { - // TODO Auto-generated method stub - return null; - } - - @Override - public LogicalOperatorTag getOperatorTag() { - // TODO Auto-generated method stub - return null; - } - - @Override - public IVariableTypeEnvironment computeOutputTypeEnvironment(ITypingContext ctx) throws AlgebricksException { - // TODO Auto-generated method stub - return null; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-asterixdb-hyracks/blob/9939b48e/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/WriteOperator.java ---------------------------------------------------------------------- diff --git a/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/WriteOperator.java b/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/WriteOperator.java deleted file mode 100644 index e1c1640..0000000 --- a/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/WriteOperator.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * 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 edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.lang3.mutable.Mutable; - -import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalExpression; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalVariable; -import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment; -import edu.uci.ics.hyracks.algebricks.core.algebra.metadata.IDataSink; -import edu.uci.ics.hyracks.algebricks.core.algebra.properties.VariablePropagationPolicy; -import edu.uci.ics.hyracks.algebricks.core.algebra.typing.ITypingContext; -import edu.uci.ics.hyracks.algebricks.core.algebra.visitors.ILogicalExpressionReferenceTransform; -import edu.uci.ics.hyracks.algebricks.core.algebra.visitors.ILogicalOperatorVisitor; - -public class WriteOperator extends AbstractLogicalOperator { - private List> expressions; - private IDataSink dataSink; - - public WriteOperator(List> expressions, IDataSink dataSink) { - this.expressions = expressions; - this.dataSink = dataSink; - } - - public List> getExpressions() { - return expressions; - } - - public IDataSink getDataSink() { - return dataSink; - } - - @Override - public LogicalOperatorTag getOperatorTag() { - return LogicalOperatorTag.WRITE; - } - - @Override - public R accept(ILogicalOperatorVisitor visitor, T arg) throws AlgebricksException { - return visitor.visitWriteOperator(this, arg); - } - - @Override - public boolean acceptExpressionTransform(ILogicalExpressionReferenceTransform visitor) throws AlgebricksException { - boolean modif = false; - for (int i = 0; i < expressions.size(); i++) { - boolean b = visitor.transform(expressions.get(i)); - if (b) { - modif = true; - } - } - return modif; - } - - @Override - public VariablePropagationPolicy getVariablePropagationPolicy() { - return VariablePropagationPolicy.ALL; - } - - @Override - public boolean isMap() { - return false; // actually depends on the physical op. - } - - @Override - public void recomputeSchema() { - schema = new ArrayList(); - schema.addAll(inputs.get(0).getValue().getSchema()); - } - - @Override - public IVariableTypeEnvironment computeOutputTypeEnvironment(ITypingContext ctx) throws AlgebricksException { - return createPropagatingAllInputsTypeEnvironment(ctx); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-asterixdb-hyracks/blob/9939b48e/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/WriteResultOperator.java ---------------------------------------------------------------------- diff --git a/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/WriteResultOperator.java b/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/WriteResultOperator.java deleted file mode 100644 index ba402bc..0000000 --- a/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/WriteResultOperator.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * 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 edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.lang3.mutable.Mutable; - -import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalExpression; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalVariable; -import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment; -import edu.uci.ics.hyracks.algebricks.core.algebra.metadata.IDataSource; -import edu.uci.ics.hyracks.algebricks.core.algebra.properties.VariablePropagationPolicy; -import edu.uci.ics.hyracks.algebricks.core.algebra.typing.ITypingContext; -import edu.uci.ics.hyracks.algebricks.core.algebra.visitors.ILogicalExpressionReferenceTransform; -import edu.uci.ics.hyracks.algebricks.core.algebra.visitors.ILogicalOperatorVisitor; - -public class WriteResultOperator extends AbstractLogicalOperator { - - private IDataSource dataSource; - private Mutable payloadExpr; - private List> keyExprs; - private List> additionalFilteringExpressions; - - public WriteResultOperator(IDataSource dataSource, Mutable payload, - List> keyExprs) { - this.dataSource = dataSource; - this.payloadExpr = payload; - this.keyExprs = keyExprs; - } - - public IDataSource getDataSource() { - return dataSource; - } - - public Mutable getPayloadExpression() { - return payloadExpr; - } - - public List> getKeyExpressions() { - return keyExprs; - } - - @Override - public LogicalOperatorTag getOperatorTag() { - return LogicalOperatorTag.WRITE_RESULT; - } - - @Override - public R accept(ILogicalOperatorVisitor visitor, T arg) throws AlgebricksException { - return visitor.visitWriteResultOperator(this, arg); - } - - @Override - public boolean acceptExpressionTransform(ILogicalExpressionReferenceTransform visitor) throws AlgebricksException { - boolean b = visitor.transform(payloadExpr); - for (int i = 0; i < keyExprs.size(); i++) { - if (visitor.transform(keyExprs.get(i))) { - b = true; - } - } - return b; - } - - @Override - public VariablePropagationPolicy getVariablePropagationPolicy() { - return VariablePropagationPolicy.ALL; - } - - @Override - public boolean isMap() { - return false; - } - - @Override - public void recomputeSchema() { - schema = new ArrayList(); - schema.addAll(inputs.get(0).getValue().getSchema()); - } - - @Override - public IVariableTypeEnvironment computeOutputTypeEnvironment(ITypingContext ctx) throws AlgebricksException { - return createPropagatingAllInputsTypeEnvironment(ctx); - } - - public void setAdditionalFilteringExpressions(List> additionalFilteringExpressions) { - this.additionalFilteringExpressions = additionalFilteringExpressions; - } - - public List> getAdditionalFilteringExpressions() { - return additionalFilteringExpressions; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-asterixdb-hyracks/blob/9939b48e/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/visitors/FDsAndEquivClassesVisitor.java ---------------------------------------------------------------------- diff --git a/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/visitors/FDsAndEquivClassesVisitor.java b/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/visitors/FDsAndEquivClassesVisitor.java deleted file mode 100644 index 1d7f134..0000000 --- a/algebricks/algebricks-core/src/main/java/edu/uci/ics/hyracks/algebricks/core/algebra/operators/logical/visitors/FDsAndEquivClassesVisitor.java +++ /dev/null @@ -1,763 +0,0 @@ -/* - * 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 edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.visitors; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.apache.commons.lang3.mutable.Mutable; - -import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException; -import edu.uci.ics.hyracks.algebricks.common.exceptions.NotImplementedException; -import edu.uci.ics.hyracks.algebricks.common.utils.Pair; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.EquivalenceClass; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalExpression; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalPlan; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.IOptimizationContext; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalExpressionTag; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; -import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalVariable; -import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression; -import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression.FunctionKind; -import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.UnnestingFunctionCallExpression; -import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.VariableReferenceExpression; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.AbstractUnnestOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.AggregateOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.AssignOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.DataSourceScanOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.DistinctOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.DistributeResultOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.EmptyTupleSourceOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.ExchangeOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.ExtensionOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.ExternalDataLookupOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.GroupByOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.IndexInsertDeleteOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.InnerJoinOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.InsertDeleteOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.LeftOuterJoinOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.LimitOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.SinkOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.UnnestMapOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.WriteOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.WriteResultOperator; -import edu.uci.ics.hyracks.algebricks.core.algebra.properties.FunctionalDependency; -import edu.uci.ics.hyracks.algebricks.core.algebra.properties.LocalGroupingProperty; -import edu.uci.ics.hyracks.algebricks.core.algebra.visitors.ILogicalOperatorVisitor; -import edu.uci.ics.hyracks.algebricks.core.config.AlgebricksConfig; - -public class FDsAndEquivClassesVisitor implements ILogicalOperatorVisitor { - - @Override - public Void visitAggregateOperator(AggregateOperator op, IOptimizationContext ctx) throws AlgebricksException { - ctx.putEquivalenceClassMap(op, new HashMap()); - ctx.putFDList(op, new ArrayList()); - return null; - } - - @Override - public Void visitAssignOperator(AssignOperator op, IOptimizationContext ctx) throws AlgebricksException { - ILogicalOperator inp1 = op.getInputs().get(0).getValue(); - Map eqClasses = getOrComputeEqClasses(inp1, ctx); - ctx.putEquivalenceClassMap(op, eqClasses); - - // Propagates equivalence classes that from expressions. - // Note that an equivalence class can also contain expression members. - propagateEquivalenceFromExpressionsToVariables(eqClasses, op.getExpressions(), op.getVariables()); - - // Generates FDs. - List used = new ArrayList(); - VariableUtilities.getUsedVariables(op, used); - List fds1 = getOrComputeFDs(inp1, ctx); - List eFds = new ArrayList(fds1.size()); - for (FunctionalDependency fd : fds1) { - if (fd.getTail().containsAll(used)) { - List hd = new ArrayList(fd.getHead()); - List tl = new ArrayList(fd.getTail()); - tl.addAll(op.getVariables()); - FunctionalDependency fd2 = new FunctionalDependency(hd, tl); - eFds.add(fd2); - } else { - eFds.add(fd); - } - } - ctx.putFDList(op, eFds); - return null; - } - - @Override - public Void visitDataScanOperator(DataSourceScanOperator op, IOptimizationContext ctx) throws AlgebricksException { - ILogicalOperator inp1 = op.getInputs().get(0).getValue(); - Map eqClasses = getOrCreateEqClasses(op, ctx); - Map propagatedEqClasses = getOrComputeEqClasses(inp1, ctx); - eqClasses.putAll(propagatedEqClasses); - ctx.putEquivalenceClassMap(op, eqClasses); - List fds = new ArrayList(getOrComputeFDs(inp1, ctx)); - ctx.putFDList(op, fds); - op.getDataSource().computeFDs(op.getVariables(), fds); - return null; - } - - @Override - public Void visitDistinctOperator(DistinctOperator op, IOptimizationContext ctx) throws AlgebricksException { - ILogicalOperator op0 = op.getInputs().get(0).getValue(); - List functionalDependencies = new ArrayList(); - ctx.putFDList(op, functionalDependencies); - for (FunctionalDependency inherited : getOrComputeFDs(op0, ctx)) { - boolean isCoveredByDistinctByVars = true; - for (LogicalVariable v : inherited.getHead()) { - if (!op.isDistinctByVar(v)) { - isCoveredByDistinctByVars = false; - } - } - if (isCoveredByDistinctByVars) { - List newTail = new ArrayList(); - for (LogicalVariable v2 : inherited.getTail()) { - if (op.isDistinctByVar(v2)) { - newTail.add(v2); - } - } - if (!newTail.isEmpty()) { - List newHead = new ArrayList(inherited.getHead()); - FunctionalDependency newFd = new FunctionalDependency(newHead, newTail); - functionalDependencies.add(newFd); - } - } - } - Set gbySet = new HashSet(); - List> expressions = op.getExpressions(); - for (Mutable pRef : expressions) { - ILogicalExpression p = pRef.getValue(); - if (p.getExpressionTag() == LogicalExpressionTag.VARIABLE) { - VariableReferenceExpression v = (VariableReferenceExpression) p; - gbySet.add(v.getVariableReference()); - } - } - LocalGroupingProperty lgp = new LocalGroupingProperty(gbySet); - - Map equivalenceClasses = getOrComputeEqClasses(op0, ctx); - ctx.putEquivalenceClassMap(op, equivalenceClasses); - - lgp.normalizeGroupingColumns(equivalenceClasses, functionalDependencies); - Set normSet = lgp.getColumnSet(); - List> newDistinctByList = new ArrayList>(); - for (Mutable p2Ref : expressions) { - ILogicalExpression p2 = p2Ref.getValue(); - if (p2.getExpressionTag() == LogicalExpressionTag.VARIABLE) { - VariableReferenceExpression var2 = (VariableReferenceExpression) p2; - LogicalVariable v2 = var2.getVariableReference(); - if (normSet.contains(v2)) { - newDistinctByList.add(p2Ref); - } - } else { - newDistinctByList.add(p2Ref); - } - } - expressions.clear(); - expressions.addAll(newDistinctByList); - return null; - } - - @Override - public Void visitEmptyTupleSourceOperator(EmptyTupleSourceOperator op, IOptimizationContext ctx) - throws AlgebricksException { - ctx.putEquivalenceClassMap(op, new HashMap()); - ctx.putFDList(op, new ArrayList()); - return null; - } - - @Override - public Void visitExchangeOperator(ExchangeOperator op, IOptimizationContext ctx) throws AlgebricksException { - propagateFDsAndEquivClasses(op, ctx); - return null; - } - - @Override - public Void visitGroupByOperator(GroupByOperator op, IOptimizationContext ctx) throws AlgebricksException { - Map equivalenceClasses = new HashMap(); - List functionalDependencies = new ArrayList(); - ctx.putEquivalenceClassMap(op, equivalenceClasses); - ctx.putFDList(op, functionalDependencies); - - List inheritedFDs = new ArrayList(); - for (ILogicalPlan p : op.getNestedPlans()) { - for (Mutable r : p.getRoots()) { - ILogicalOperator op2 = r.getValue(); - equivalenceClasses.putAll(getOrComputeEqClasses(op2, ctx)); - inheritedFDs.addAll(getOrComputeFDs(op2, ctx)); - } - } - - ILogicalOperator op0 = op.getInputs().get(0).getValue(); - inheritedFDs.addAll(getOrComputeFDs(op0, ctx)); - Map inheritedEcs = getOrComputeEqClasses(op0, ctx); - for (FunctionalDependency inherited : inheritedFDs) { - boolean isCoveredByGbyOrDecorVars = true; - List newHead = new ArrayList(inherited.getHead().size()); - for (LogicalVariable v : inherited.getHead()) { - LogicalVariable vnew = getNewGbyVar(op, v); - if (vnew == null) { - vnew = getNewDecorVar(op, v); - if (vnew == null) { - isCoveredByGbyOrDecorVars = false; - } - break; - } - newHead.add(vnew); - } - - if (isCoveredByGbyOrDecorVars) { - List newTail = new ArrayList(); - for (LogicalVariable v2 : inherited.getTail()) { - LogicalVariable v3 = getNewGbyVar(op, v2); - if (v3 != null) { - newTail.add(v3); - } - } - if (!newTail.isEmpty()) { - FunctionalDependency newFd = new FunctionalDependency(newHead, newTail); - functionalDependencies.add(newFd); - } - } - } - - List premiseGby = new LinkedList(); - List>> gByList = op.getGroupByList(); - for (Pair> p : gByList) { - premiseGby.add(p.first); - } - - List>> decorList = op.getDecorList(); - - LinkedList conclDecor = new LinkedList(); - for (Pair> p : decorList) { - conclDecor.add(GroupByOperator.getDecorVariable(p)); - } - if (!conclDecor.isEmpty()) { - functionalDependencies.add(new FunctionalDependency(premiseGby, conclDecor)); - } - - Set gbySet = new HashSet(); - for (Pair> p : gByList) { - ILogicalExpression expr = p.second.getValue(); - if (expr.getExpressionTag() == LogicalExpressionTag.VARIABLE) { - VariableReferenceExpression v = (VariableReferenceExpression) expr; - gbySet.add(v.getVariableReference()); - } - } - LocalGroupingProperty lgp = new LocalGroupingProperty(gbySet); - lgp.normalizeGroupingColumns(inheritedEcs, inheritedFDs); - Set normSet = lgp.getColumnSet(); - List>> newGbyList = new ArrayList>>(); - boolean changed = false; - for (Pair> p : gByList) { - ILogicalExpression expr = p.second.getValue(); - if (expr.getExpressionTag() == LogicalExpressionTag.VARIABLE) { - VariableReferenceExpression varRef = (VariableReferenceExpression) expr; - LogicalVariable v2 = varRef.getVariableReference(); - EquivalenceClass ec2 = inheritedEcs.get(v2); - LogicalVariable v3; - if (ec2 != null && !ec2.representativeIsConst()) { - v3 = ec2.getVariableRepresentative(); - } else { - v3 = v2; - } - if (normSet.contains(v3)) { - newGbyList.add(p); - } else { - changed = true; - decorList.add(p); - } - } else { - newGbyList.add(p); - } - } - if (changed) { - AlgebricksConfig.ALGEBRICKS_LOGGER.fine(">>>> Group-by list changed from " - + GroupByOperator.veListToString(gByList) + " to " + GroupByOperator.veListToString(newGbyList) - + ".\n"); - } - gByList.clear(); - gByList.addAll(newGbyList); - return null; - } - - @Override - public Void visitInnerJoinOperator(InnerJoinOperator op, IOptimizationContext ctx) throws AlgebricksException { - Map equivalenceClasses = new HashMap(); - List functionalDependencies = new ArrayList(); - ctx.putEquivalenceClassMap(op, equivalenceClasses); - ctx.putFDList(op, functionalDependencies); - ILogicalOperator op0 = op.getInputs().get(0).getValue(); - ILogicalOperator op1 = op.getInputs().get(1).getValue(); - functionalDependencies.addAll(getOrComputeFDs(op0, ctx)); - functionalDependencies.addAll(getOrComputeFDs(op1, ctx)); - equivalenceClasses.putAll(getOrComputeEqClasses(op0, ctx)); - equivalenceClasses.putAll(getOrComputeEqClasses(op1, ctx)); - ILogicalExpression expr = op.getCondition().getValue(); - expr.getConstraintsAndEquivClasses(functionalDependencies, equivalenceClasses); - return null; - } - - @Override - public Void visitLeftOuterJoinOperator(LeftOuterJoinOperator op, IOptimizationContext ctx) - throws AlgebricksException { - Map equivalenceClasses = new HashMap(); - List functionalDependencies = new ArrayList(); - ctx.putEquivalenceClassMap(op, equivalenceClasses); - ctx.putFDList(op, functionalDependencies); - ILogicalOperator opLeft = op.getInputs().get(0).getValue(); - ILogicalOperator opRight = op.getInputs().get(1).getValue(); - functionalDependencies.addAll(getOrComputeFDs(opLeft, ctx)); - functionalDependencies.addAll(getOrComputeFDs(opRight, ctx)); - equivalenceClasses.putAll(getOrComputeEqClasses(opLeft, ctx)); - equivalenceClasses.putAll(getOrComputeEqClasses(opRight, ctx)); - - Collection leftSideVars; - if (opLeft.getSchema() == null) { - leftSideVars = new LinkedList(); - VariableUtilities.getLiveVariables(opLeft, leftSideVars); - // actually, not all produced vars. are visible (due to projection) - // so using cached schema is better and faster - } else { - leftSideVars = opLeft.getSchema(); - } - ILogicalExpression expr = op.getCondition().getValue(); - expr.getConstraintsForOuterJoin(functionalDependencies, leftSideVars); - return null; - } - - @Override - public Void visitLimitOperator(LimitOperator op, IOptimizationContext ctx) throws AlgebricksException { - propagateFDsAndEquivClasses(op, ctx); - return null; - } - - @Override - public Void visitNestedTupleSourceOperator(NestedTupleSourceOperator op, IOptimizationContext ctx) - throws AlgebricksException { - AbstractLogicalOperator op1 = (AbstractLogicalOperator) op.getDataSourceReference().getValue(); - ILogicalOperator inp1 = op1.getInputs().get(0).getValue(); - Map eqClasses = getOrComputeEqClasses(inp1, ctx); - ctx.putEquivalenceClassMap(op, eqClasses); - List fds = new ArrayList(getOrComputeFDs(inp1, ctx)); - if (op1.getOperatorTag() == LogicalOperatorTag.GROUP) { - GroupByOperator gby = (GroupByOperator) op1; - LinkedList tail = new LinkedList(); - for (LogicalVariable v : gby.getGbyVarList()) { - tail.add(v); - // all values for gby vars. are the same - } - FunctionalDependency gbyfd = new FunctionalDependency(new LinkedList(), tail); - fds.add(gbyfd); - } - ctx.putFDList(op, fds); - return null; - } - - @Override - public Void visitOrderOperator(OrderOperator op, IOptimizationContext ctx) throws AlgebricksException { - propagateFDsAndEquivClasses(op, ctx); - return null; - } - - @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; - } - - @Override - public Void visitReplicateOperator(ReplicateOperator 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; - } - - @Override - public Void visitRunningAggregateOperator(RunningAggregateOperator op, IOptimizationContext ctx) - throws AlgebricksException { - ctx.putEquivalenceClassMap(op, new HashMap()); - ctx.putFDList(op, new ArrayList()); - return null; - } - - @Override - public Void visitScriptOperator(ScriptOperator op, IOptimizationContext ctx) throws AlgebricksException { - propagateFDsAndEquivClassesForUsedVars(op, ctx, op.getInputVariables()); - return null; - } - - @Override - public Void visitSelectOperator(SelectOperator op, IOptimizationContext ctx) throws AlgebricksException { - ILogicalOperator childOp = op.getInputs().get(0).getValue(); - Map equivalenceClasses = getOrComputeEqClasses(childOp, ctx); - ctx.putEquivalenceClassMap(op, equivalenceClasses); - - List functionalDependencies = new ArrayList(); - ctx.putFDList(op, functionalDependencies); - functionalDependencies.addAll(getOrComputeFDs(childOp, ctx)); - equivalenceClasses.putAll(getOrComputeEqClasses(childOp, ctx)); - ILogicalExpression expr = op.getCondition().getValue(); - expr.getConstraintsAndEquivClasses(functionalDependencies, equivalenceClasses); - return null; - } - - @Override - public Void visitSubplanOperator(SubplanOperator op, IOptimizationContext ctx) throws AlgebricksException { - Map equivalenceClasses = new HashMap(); - List functionalDependencies = new ArrayList(); - ctx.putEquivalenceClassMap(op, equivalenceClasses); - ctx.putFDList(op, functionalDependencies); - for (ILogicalPlan p : op.getNestedPlans()) { - for (Mutable r : p.getRoots()) { - ILogicalOperator op2 = r.getValue(); - equivalenceClasses.putAll(getOrComputeEqClasses(op2, ctx)); - functionalDependencies.addAll(getOrComputeFDs(op2, ctx)); - } - } - return null; - } - - @Override - public Void visitUnionOperator(UnionAllOperator op, IOptimizationContext ctx) throws AlgebricksException { - setEmptyFDsEqClasses(op, ctx); - return null; - } - - @Override - public Void visitUnnestMapOperator(UnnestMapOperator op, IOptimizationContext ctx) throws AlgebricksException { - fdsEqClassesForAbstractUnnestOperator(op, ctx); - return null; - } - - @Override - public Void visitUnnestOperator(UnnestOperator op, IOptimizationContext ctx) throws AlgebricksException { - fdsEqClassesForAbstractUnnestOperator(op, ctx); - return null; - } - - @Override - public Void visitWriteOperator(WriteOperator op, IOptimizationContext ctx) throws AlgebricksException { - // propagateFDsAndEquivClasses(op, ctx); - setEmptyFDsEqClasses(op, ctx); - return null; - } - - @Override - public Void visitDistributeResultOperator(DistributeResultOperator op, IOptimizationContext ctx) - throws AlgebricksException { - // propagateFDsAndEquivClasses(op, ctx); - setEmptyFDsEqClasses(op, ctx); - return null; - } - - @Override - public Void visitWriteResultOperator(WriteResultOperator op, IOptimizationContext ctx) throws AlgebricksException { - // propagateFDsAndEquivClasses(op, ctx); - setEmptyFDsEqClasses(op, ctx); - return null; - } - - @Override - public Void visitInsertDeleteOperator(InsertDeleteOperator op, IOptimizationContext ctx) throws AlgebricksException { - propagateFDsAndEquivClasses(op, ctx); - return null; - } - - @Override - public Void visitIndexInsertDeleteOperator(IndexInsertDeleteOperator op, IOptimizationContext ctx) - throws AlgebricksException { - propagateFDsAndEquivClasses(op, ctx); - return null; - } - - @Override - public Void visitTokenizeOperator(TokenizeOperator op, IOptimizationContext ctx) throws AlgebricksException { - setEmptyFDsEqClasses(op, ctx); - return null; - } - - @Override - public Void visitSinkOperator(SinkOperator op, IOptimizationContext ctx) throws AlgebricksException { - setEmptyFDsEqClasses(op, ctx); - return null; - } - - private void propagateFDsAndEquivClasses(ILogicalOperator op, IOptimizationContext ctx) throws AlgebricksException { - ILogicalOperator inp1 = op.getInputs().get(0).getValue(); - Map eqClasses = getOrComputeEqClasses(inp1, ctx); - ctx.putEquivalenceClassMap(op, eqClasses); - List fds = getOrComputeFDs(inp1, ctx); - ctx.putFDList(op, fds); - } - - private Map getOrComputeEqClasses(ILogicalOperator op, IOptimizationContext ctx) - throws AlgebricksException { - Map eqClasses = ctx.getEquivalenceClassMap(op); - if (eqClasses == null) { - op.accept(this, ctx); - eqClasses = ctx.getEquivalenceClassMap(op); - } - return eqClasses; - } - - private Map getOrCreateEqClasses(ILogicalOperator op, IOptimizationContext ctx) - throws AlgebricksException { - Map eqClasses = ctx.getEquivalenceClassMap(op); - if (eqClasses == null) { - eqClasses = new HashMap(); - ctx.putEquivalenceClassMap(op, eqClasses); - } - return eqClasses; - } - - private List getOrComputeFDs(ILogicalOperator op, IOptimizationContext ctx) - throws AlgebricksException { - List fds = ctx.getFDList(op); - if (fds == null) { - op.accept(this, ctx); - fds = ctx.getFDList(op); - } - return fds; - } - - /*** - * Propagated equivalent classes from the child to the current operator, based - * on the used variables of the current operator. - * - * @param op - * , the current operator - * @param ctx - * , the optimization context which keeps track of all equivalent classes. - * @param usedVariables - * , used variables. - * @throws AlgebricksException - */ - private void propagateFDsAndEquivClassesForUsedVars(ILogicalOperator op, IOptimizationContext ctx, - List usedVariables) throws AlgebricksException { - ILogicalOperator op2 = op.getInputs().get(0).getValue(); - Map eqClasses = getOrCreateEqClasses(op, ctx); - List fds = new ArrayList(); - ctx.putFDList(op, fds); - - Map chldClasses = getOrComputeEqClasses(op2, ctx); - - // Propagate equivalent classes that contain the used variables. - for (LogicalVariable v : usedVariables) { - EquivalenceClass ec = eqClasses.get(v); - if (ec == null) { - EquivalenceClass oc = chldClasses.get(v); - if (oc == null) { - continue; - } - List m = new LinkedList(); - for (LogicalVariable v2 : oc.getMembers()) { - if (usedVariables.contains(v2)) { - m.add(v2); - } - } - EquivalenceClass nc; - if (oc.representativeIsConst()) { - nc = new EquivalenceClass(m, oc.getConstRepresentative()); - } else if (m.contains(oc.getVariableRepresentative())) { - nc = new EquivalenceClass(m, oc.getVariableRepresentative()); - } else { - nc = new EquivalenceClass(m, v); - } - for (LogicalVariable v3 : m) { - eqClasses.put(v3, nc); - } - } - } - - // Propagates equivalent classes that contain expressions that use the used variables. - // Note that for the case variable $v is not in the used variables but it is - // equivalent to field-access($t, i) and $t is a used variable, the equivalent - // class should still be propagated (kept). - Set usedVarSet = new HashSet(usedVariables); - for (Entry entry : chldClasses.entrySet()) { - EquivalenceClass ec = entry.getValue(); - for (ILogicalExpression expr : ec.getExpressionMembers()) { - Set exprUsedVars = new HashSet(); - expr.getUsedVariables(exprUsedVars); - exprUsedVars.retainAll(usedVarSet); - // Check if the expression member uses a used variable. - if (!exprUsedVars.isEmpty()) { - for (LogicalVariable v : ec.getMembers()) { - eqClasses.put(v, ec); - // If variable members contain a used variable, the representative - // variable should be a used variable. - if (usedVarSet.contains(v)) { - ec.setVariableRepresentative(v); - } - } - } - } - } - - List chldFds = getOrComputeFDs(op2, ctx); - for (FunctionalDependency fd : chldFds) { - if (!usedVariables.containsAll(fd.getHead())) { - continue; - } - List tl = new LinkedList(); - for (LogicalVariable v : fd.getTail()) { - if (usedVariables.contains(v)) { - tl.add(v); - } - } - if (!tl.isEmpty()) { - FunctionalDependency newFd = new FunctionalDependency(fd.getHead(), tl); - fds.add(newFd); - } - } - } - - private void fdsEqClassesForAbstractUnnestOperator(AbstractUnnestOperator op, IOptimizationContext ctx) - throws AlgebricksException { - ILogicalOperator inp1 = op.getInputs().get(0).getValue(); - Map eqClasses = getOrCreateEqClasses(op, ctx); - Map propagatedEqClasses = getOrComputeEqClasses(inp1, ctx); - /** - * The original eq classes of unnest-map are only for produced variables, therefore - * eqClasses and propagatedEqClasses do not have overlaps. - */ - eqClasses.putAll(propagatedEqClasses); - ctx.putEquivalenceClassMap(op, eqClasses); - List fds = getOrComputeFDs(inp1, ctx); - ctx.putFDList(op, fds); - - ILogicalExpression expr = op.getExpressionRef().getValue(); - if (expr.getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) { - AbstractFunctionCallExpression afe = (AbstractFunctionCallExpression) expr; - if (afe.getKind() == FunctionKind.UNNEST && ((UnnestingFunctionCallExpression) afe).returnsUniqueValues()) { - List vars = new ArrayList(); - VariableUtilities.getLiveVariables(op, vars); - ArrayList h = new ArrayList(); - h.addAll(op.getVariables()); - FunctionalDependency fd = new FunctionalDependency(h, vars); - fds.add(fd); - } - } - } - - public static void setEmptyFDsEqClasses(ILogicalOperator op, IOptimizationContext ctx) { - Map eqClasses = new HashMap(); - ctx.putEquivalenceClassMap(op, eqClasses); - List fds = new ArrayList(); - ctx.putFDList(op, fds); - } - - private LogicalVariable getNewGbyVar(GroupByOperator g, LogicalVariable v) { - for (Pair> p : g.getGroupByList()) { - ILogicalExpression e = p.second.getValue(); - if (e.getExpressionTag() == LogicalExpressionTag.VARIABLE) { - LogicalVariable v2 = ((VariableReferenceExpression) e).getVariableReference(); - if (v2 == v) { - return p.first; - } - } - } - return null; - } - - private LogicalVariable getNewDecorVar(GroupByOperator g, LogicalVariable v) { - for (Pair> p : g.getDecorList()) { - ILogicalExpression e = p.second.getValue(); - if (e.getExpressionTag() == LogicalExpressionTag.VARIABLE) { - LogicalVariable v2 = ((VariableReferenceExpression) e).getVariableReference(); - if (v2 == v) { - return (p.first != null) ? p.first : v2; - } - } - } - return null; - } - - @Override - public Void visitExtensionOperator(ExtensionOperator op, IOptimizationContext ctx) throws AlgebricksException { - propagateFDsAndEquivClasses(op, ctx); - return null; - } - - @Override - public Void visitExternalDataLookupOperator(ExternalDataLookupOperator op, IOptimizationContext ctx) - throws AlgebricksException { - propagateFDsAndEquivClasses(op, ctx); - return null; - } - - /** - * Propagate equivalences that carried in expressions to the variables that - * they are assigned to. - * - * @param eqClasses - * an equivalent class map - * @param assignExprs - * expressions on the right-hand-side of assignments - * @param assignVars - * variables on the left-hand-side of assignments - */ - private void propagateEquivalenceFromExpressionsToVariables(Map eqClasses, - List> assignExprs, List assignVars) { - for (int assignVarIndex = 0; assignVarIndex < assignVars.size(); ++assignVarIndex) { - LogicalVariable var = assignVars.get(assignVarIndex); - ILogicalExpression expr = assignExprs.get(assignVarIndex).getValue(); - for (Entry entry : eqClasses.entrySet()) { - EquivalenceClass eqc = entry.getValue(); - // If the equivalence class contains the right-hand-side expression, - // the left-hand-side variable is added into the equivalence class. - if (eqc.contains(expr)) { - eqc.addMember(var); - } - } - } - } - -} \ No newline at end of file