You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2021/08/31 10:47:13 UTC
[iotdb] branch nested-operations updated: struct of DAGBuilder &
TransformerBuilder
This is an automated email from the ASF dual-hosted git repository.
rong pushed a commit to branch nested-operations
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/nested-operations by this push:
new 1c36448 struct of DAGBuilder & TransformerBuilder
1c36448 is described below
commit 1c36448d5584e715d4aa151fc3c1d6f1f1f88a35
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Tue Aug 31 18:46:34 2021 +0800
struct of DAGBuilder & TransformerBuilder
---
.../apache/iotdb/db/query/dataset/UDTFDataSet.java | 34 ++++++----
.../iotdb/db/query/expression/Expression.java | 45 +++++++++++--
.../iotdb/db/query/expression/ResultColumn.java | 2 +-
.../query/expression/binary/BinaryExpression.java | 20 +++++-
.../query/expression/unary/FunctionExpression.java | 27 ++++++--
.../query/expression/unary/NegationExpression.java | 18 +++++-
.../query/expression/unary/TimeSeriesOperand.java | 12 +++-
.../db/query/udf/core/builder/DAGBuilder.java | 73 ++++++++++++++++++++++
.../core/builder/TransformerBuilder.java} | 30 ++++-----
9 files changed, 216 insertions(+), 45 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java
index 670f2c9..b7741ef 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java
@@ -200,7 +200,7 @@ public abstract class UDTFDataSet extends QueryDataSet {
transformers[columnIndex] =
new ArithmeticNegationTransformer(
constructPointReaderBySeriesName(
- ((NegationExpression) expression).getExpression().toString()));
+ ((NegationExpression) expression).getExpression().getExpressionString()));
return;
}
@@ -209,30 +209,40 @@ public abstract class UDTFDataSet extends QueryDataSet {
if (binaryExpression instanceof AdditionExpression) {
transformers[columnIndex] =
new ArithmeticAdditionTransformer(
- constructPointReaderBySeriesName(binaryExpression.getLeftExpression().toString()),
- constructPointReaderBySeriesName(binaryExpression.getRightExpression().toString()));
+ constructPointReaderBySeriesName(
+ binaryExpression.getLeftExpression().getExpressionString()),
+ constructPointReaderBySeriesName(
+ binaryExpression.getRightExpression().getExpressionString()));
} else if (binaryExpression instanceof SubtractionExpression) {
transformers[columnIndex] =
new ArithmeticSubtractionTransformer(
- constructPointReaderBySeriesName(binaryExpression.getLeftExpression().toString()),
- constructPointReaderBySeriesName(binaryExpression.getRightExpression().toString()));
+ constructPointReaderBySeriesName(
+ binaryExpression.getLeftExpression().getExpressionString()),
+ constructPointReaderBySeriesName(
+ binaryExpression.getRightExpression().getExpressionString()));
} else if (binaryExpression instanceof MultiplicationExpression) {
transformers[columnIndex] =
new ArithmeticMultiplicationTransformer(
- constructPointReaderBySeriesName(binaryExpression.getLeftExpression().toString()),
- constructPointReaderBySeriesName(binaryExpression.getRightExpression().toString()));
+ constructPointReaderBySeriesName(
+ binaryExpression.getLeftExpression().getExpressionString()),
+ constructPointReaderBySeriesName(
+ binaryExpression.getRightExpression().getExpressionString()));
} else if (binaryExpression instanceof DivisionExpression) {
transformers[columnIndex] =
new ArithmeticDivisionTransformer(
- constructPointReaderBySeriesName(binaryExpression.getLeftExpression().toString()),
- constructPointReaderBySeriesName(binaryExpression.getRightExpression().toString()));
+ constructPointReaderBySeriesName(
+ binaryExpression.getLeftExpression().getExpressionString()),
+ constructPointReaderBySeriesName(
+ binaryExpression.getRightExpression().getExpressionString()));
} else if (binaryExpression instanceof ModuloExpression) {
transformers[columnIndex] =
new ArithmeticModuloTransformer(
- constructPointReaderBySeriesName(binaryExpression.getLeftExpression().toString()),
- constructPointReaderBySeriesName(binaryExpression.getRightExpression().toString()));
+ constructPointReaderBySeriesName(
+ binaryExpression.getLeftExpression().getExpressionString()),
+ constructPointReaderBySeriesName(
+ binaryExpression.getRightExpression().getExpressionString()));
} else {
- throw new UnsupportedOperationException(binaryExpression.toString());
+ throw new UnsupportedOperationException(binaryExpression.getExpressionString());
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java
index f610c5a..43f792a 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java
@@ -22,24 +22,57 @@ package org.apache.iotdb.db.query.expression;
import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
import org.apache.iotdb.db.metadata.PartialPath;
import org.apache.iotdb.db.qp.utils.WildcardsRemover;
+import org.apache.iotdb.db.query.udf.core.builder.TransformerBuilder;
import java.util.List;
+import java.util.Map;
import java.util.Set;
-public interface Expression {
+public abstract class Expression {
- default boolean isAggregationFunctionExpression() {
+ private String expressionString;
+
+ public boolean isAggregationFunctionExpression() {
return false;
}
- default boolean isTimeSeriesGeneratingFunctionExpression() {
+ public boolean isTimeSeriesGeneratingFunctionExpression() {
return false;
}
- void concat(List<PartialPath> prefixPaths, List<Expression> resultExpressions);
+ public abstract void concat(List<PartialPath> prefixPaths, List<Expression> resultExpressions);
- void removeWildcards(WildcardsRemover wildcardsRemover, List<Expression> resultExpressions)
+ public abstract void removeWildcards(
+ WildcardsRemover wildcardsRemover, List<Expression> resultExpressions)
throws LogicalOptimizeException;
- void collectPaths(Set<PartialPath> pathSet);
+ public abstract void collectPaths(Set<PartialPath> pathSet);
+
+ public abstract void constructTransformerBuilder(
+ Map<Expression, TransformerBuilder> expressionTransformerBuilderMap);
+
+ public String getExpressionString() {
+ if (expressionString == null) {
+ expressionString = toString();
+ }
+ return expressionString;
+ }
+
+ @Override
+ public int hashCode() {
+ return getExpressionString().hashCode();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ if (!(o instanceof Expression)) {
+ return false;
+ }
+
+ return getExpressionString().equals(((Expression) o).getExpressionString());
+ }
}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/ResultColumn.java b/server/src/main/java/org/apache/iotdb/db/query/expression/ResultColumn.java
index 2cd6269..9c50cc0 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/ResultColumn.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/ResultColumn.java
@@ -134,6 +134,6 @@ public class ResultColumn {
}
public String getResultColumnName() {
- return alias != null ? alias : expression.toString();
+ return alias != null ? alias : expression.getExpressionString();
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java
index 48f94f8..36e31d5 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java
@@ -23,12 +23,14 @@ import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
import org.apache.iotdb.db.metadata.PartialPath;
import org.apache.iotdb.db.qp.utils.WildcardsRemover;
import org.apache.iotdb.db.query.expression.Expression;
+import org.apache.iotdb.db.query.udf.core.builder.TransformerBuilder;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.Set;
-public abstract class BinaryExpression implements Expression {
+public abstract class BinaryExpression extends Expression {
protected final Expression leftExpression;
protected final Expression rightExpression;
@@ -102,6 +104,22 @@ public abstract class BinaryExpression implements Expression {
rightExpression.collectPaths(pathSet);
}
+ @Override
+ public void constructTransformerBuilder(
+ Map<Expression, TransformerBuilder> expressionTransformerBuilderMap) {
+ if (expressionTransformerBuilderMap.containsKey(this)) {
+ return;
+ }
+
+ leftExpression.constructTransformerBuilder(expressionTransformerBuilderMap);
+ rightExpression.constructTransformerBuilder(expressionTransformerBuilderMap);
+
+ TransformerBuilder transformerBuilder = new TransformerBuilder(this);
+ transformerBuilder.addDependentExpression(leftExpression);
+ transformerBuilder.addDependentExpression(rightExpression);
+ expressionTransformerBuilderMap.put(this, transformerBuilder);
+ }
+
public Expression getLeftExpression() {
return leftExpression;
}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
index 01d8686..2bb05b0 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.db.qp.constant.SQLConstant;
import org.apache.iotdb.db.qp.strategy.optimizer.ConcatPathOptimizer;
import org.apache.iotdb.db.qp.utils.WildcardsRemover;
import org.apache.iotdb.db.query.expression.Expression;
+import org.apache.iotdb.db.query.udf.core.builder.TransformerBuilder;
import java.util.ArrayList;
import java.util.Iterator;
@@ -34,7 +35,7 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
-public class FunctionExpression implements Expression {
+public class FunctionExpression extends Expression {
/**
* true: aggregation function<br>
@@ -54,7 +55,6 @@ public class FunctionExpression implements Expression {
private List<PartialPath> paths;
- private String expressionString;
private String parametersString;
public FunctionExpression(String functionName) {
@@ -143,6 +143,24 @@ public class FunctionExpression implements Expression {
}
}
+ @Override
+ public void constructTransformerBuilder(
+ Map<Expression, TransformerBuilder> expressionTransformerBuilderMap) {
+ if (expressionTransformerBuilderMap.containsKey(this)) {
+ return;
+ }
+
+ for (Expression expression : expressions) {
+ expression.constructTransformerBuilder(expressionTransformerBuilderMap);
+ }
+
+ TransformerBuilder transformerBuilder = new TransformerBuilder(this);
+ for (Expression expression : expressions) {
+ transformerBuilder.addDependentExpression(expression);
+ }
+ expressionTransformerBuilderMap.put(this, transformerBuilder);
+ }
+
public List<PartialPath> getPaths() {
if (paths == null) {
paths = new ArrayList<>();
@@ -158,10 +176,7 @@ public class FunctionExpression implements Expression {
@Override
public String toString() {
- if (expressionString == null) {
- expressionString = functionName + "(" + getParametersString() + ")";
- }
- return expressionString;
+ return functionName + "(" + getParametersString() + ")";
}
/**
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java
index 675adb9..2c6fb45 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java
@@ -23,12 +23,14 @@ import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
import org.apache.iotdb.db.metadata.PartialPath;
import org.apache.iotdb.db.qp.utils.WildcardsRemover;
import org.apache.iotdb.db.query.expression.Expression;
+import org.apache.iotdb.db.query.udf.core.builder.TransformerBuilder;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.Set;
-public class NegationExpression implements Expression {
+public class NegationExpression extends Expression {
protected Expression expression;
@@ -70,6 +72,20 @@ public class NegationExpression implements Expression {
}
@Override
+ public void constructTransformerBuilder(
+ Map<Expression, TransformerBuilder> expressionTransformerBuilderMap) {
+ if (expressionTransformerBuilderMap.containsKey(this)) {
+ return;
+ }
+
+ expression.constructTransformerBuilder(expressionTransformerBuilderMap);
+
+ TransformerBuilder transformerBuilder = new TransformerBuilder(this);
+ transformerBuilder.addDependentExpression(expression);
+ expressionTransformerBuilderMap.put(this, transformerBuilder);
+ }
+
+ @Override
public String toString() {
return "-" + expression.toString();
}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
index 232d031..478e214 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
@@ -23,12 +23,14 @@ import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
import org.apache.iotdb.db.metadata.PartialPath;
import org.apache.iotdb.db.qp.utils.WildcardsRemover;
import org.apache.iotdb.db.query.expression.Expression;
+import org.apache.iotdb.db.query.udf.core.builder.TransformerBuilder;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import java.util.List;
+import java.util.Map;
import java.util.Set;
-public class TimeSeriesOperand implements Expression {
+public class TimeSeriesOperand extends Expression {
protected PartialPath path;
protected TSDataType dataType;
@@ -66,6 +68,14 @@ public class TimeSeriesOperand implements Expression {
}
@Override
+ public void constructTransformerBuilder(
+ Map<Expression, TransformerBuilder> expressionTransformerBuilderMap) {
+ if (!expressionTransformerBuilderMap.containsKey(this)) {
+ expressionTransformerBuilderMap.put(this, new TransformerBuilder(this));
+ }
+ }
+
+ @Override
public String toString() {
return path.isMeasurementAliasExists() ? path.getFullPathWithAlias() : path.getFullPath();
}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/builder/DAGBuilder.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/builder/DAGBuilder.java
new file mode 100644
index 0000000..eaaaa14
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/builder/DAGBuilder.java
@@ -0,0 +1,73 @@
+/*
+ * 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.iotdb.db.query.udf.core.builder;
+
+import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
+import org.apache.iotdb.db.query.expression.Expression;
+import org.apache.iotdb.db.query.expression.ResultColumn;
+import org.apache.iotdb.db.query.udf.core.transformer.Transformer;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class DAGBuilder {
+
+ // input
+ private final List<Expression> resultColumnExpressions;
+ // output
+ private final Transformer[] resultColumnTransformers;
+
+ // all result column expressions will be split into several sub-expressions, each expression has
+ // its own transformer. different result column expressions may have the same sub-expressions,
+ // but they can share the same transformer. we cache the transformer builder here to make sure
+ // that only one transformer will be built for one expression.
+ private final Map<Expression, TransformerBuilder> expressionTransformerBuilderMap;
+
+ public DAGBuilder(UDTFPlan udtfPlan) {
+ resultColumnExpressions = new ArrayList<>();
+ for (ResultColumn resultColumn : udtfPlan.getResultColumns()) {
+ resultColumnExpressions.add(resultColumn.getExpression());
+ }
+ resultColumnTransformers = new Transformer[resultColumnExpressions.size()];
+ expressionTransformerBuilderMap = new HashMap<>();
+ }
+
+ public void build() {
+ constructTransformerBuilder();
+ buildTransformer();
+ buildDAG();
+ }
+
+ private void constructTransformerBuilder() {
+ for (Expression resultColumnExpression : resultColumnExpressions) {
+ resultColumnExpression.constructTransformerBuilder(expressionTransformerBuilderMap);
+ }
+ }
+
+ private void buildTransformer() {}
+
+ private void buildDAG() {}
+
+ public Transformer[] getResultColumnTransformers() {
+ return resultColumnTransformers;
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/builder/TransformerBuilder.java
similarity index 55%
copy from server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java
copy to server/src/main/java/org/apache/iotdb/db/query/udf/core/builder/TransformerBuilder.java
index f610c5a..f365876 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/builder/TransformerBuilder.java
@@ -17,29 +17,25 @@
* under the License.
*/
-package org.apache.iotdb.db.query.expression;
+package org.apache.iotdb.db.query.udf.core.builder;
-import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
-import org.apache.iotdb.db.metadata.PartialPath;
-import org.apache.iotdb.db.qp.utils.WildcardsRemover;
+import org.apache.iotdb.db.query.expression.Expression;
+import java.util.LinkedList;
import java.util.List;
-import java.util.Set;
-public interface Expression {
+public class TransformerBuilder {
- default boolean isAggregationFunctionExpression() {
- return false;
- }
-
- default boolean isTimeSeriesGeneratingFunctionExpression() {
- return false;
- }
+ private final Expression expression;
- void concat(List<PartialPath> prefixPaths, List<Expression> resultExpressions);
+ private final List<Expression> dependencies;
- void removeWildcards(WildcardsRemover wildcardsRemover, List<Expression> resultExpressions)
- throws LogicalOptimizeException;
+ public TransformerBuilder(Expression expression) {
+ this.expression = expression;
+ dependencies = new LinkedList<>();
+ }
- void collectPaths(Set<PartialPath> pathSet);
+ public void addDependentExpression(Expression dependentExpression) {
+ dependencies.add(dependentExpression);
+ }
}