This is an automated email from the ASF dual-hosted git repository.
caogaofei pushed a commit to branch beyyes/multi_devices_fe
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/beyyes/multi_devices_fe by
this push:
new c56979fe171 fix analyzeSelect - analyzeExpressionTypes
c56979fe171 is described below
commit c56979fe171a6430589ebb90657d3a397f0f279f
Author: Beyyes <[email protected]>
AuthorDate: Mon Nov 6 21:58:25 2023 +0800
fix analyzeSelect - analyzeExpressionTypes
---
.../apache/iotdb/db/queryengine/plan/analyze/Analysis.java | 11 +++++++++--
.../queryengine/plan/analyze/ExpressionTypeAnalyzer.java | 9 +++++++++
.../queryengine/plan/analyze/TemplatedDeviceAnalyze.java | 14 ++++++++------
3 files changed, 26 insertions(+), 8 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
index fcb14e4626c..fd13b2a89f3 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
@@ -32,6 +32,7 @@ import
org.apache.iotdb.db.queryengine.common.header.DatasetHeader;
import org.apache.iotdb.db.queryengine.common.schematree.ISchemaTree;
import org.apache.iotdb.db.queryengine.plan.expression.Expression;
import org.apache.iotdb.db.queryengine.plan.expression.ExpressionType;
+import org.apache.iotdb.db.queryengine.plan.expression.leaf.TimeSeriesOperand;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.DeviceViewIntoPathDescriptor;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.FillDescriptor;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.GroupByParameter;
@@ -357,8 +358,10 @@ public class Analysis {
return null;
}
- // TODO add template optimization
- // expression.get
+ if (templateTypes != null) {
+ TimeSeriesOperand seriesOperand = (TimeSeriesOperand) expression;
+ return
templateTypes.getSchemaMap().get(seriesOperand.getPath().getMeasurement()).getType();
+ }
TSDataType type = expressionTypes.get(NodeRef.of(expression));
checkArgument(type != null, "Expression is not analyzed: %s", expression);
@@ -686,6 +689,10 @@ public class Analysis {
return this.templateTypes;
}
+ public void setTemplateTypes(Template template) {
+ this.templateTypes = template;
+ }
+
public void setOrderByExpressions(Set<Expression> orderByExpressions) {
this.orderByExpressions = orderByExpressions;
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionTypeAnalyzer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionTypeAnalyzer.java
index 18eb59894b7..343122e12bf 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionTypeAnalyzer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionTypeAnalyzer.java
@@ -59,6 +59,15 @@ public class ExpressionTypeAnalyzer {
private ExpressionTypeAnalyzer() {}
public static TSDataType analyzeExpression(Analysis analysis, Expression
expression) {
+ if (analysis.getTemplateTypes() != null) {
+ TimeSeriesOperand seriesOperand = (TimeSeriesOperand) expression;
+ return analysis
+ .getTemplateTypes()
+ .getSchemaMap()
+ .get(seriesOperand.getPath().getMeasurement())
+ .getType();
+ }
+
if (!analysis.getExpressionTypes().containsKey(NodeRef.of(expression))) {
ExpressionTypeAnalyzer analyzer = new ExpressionTypeAnalyzer();
analyzer.analyze(expression);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedDeviceAnalyze.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedDeviceAnalyze.java
index fc5cd296c75..bdb421c47d7 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedDeviceAnalyze.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedDeviceAnalyze.java
@@ -74,7 +74,6 @@ import static
org.apache.iotdb.db.queryengine.plan.analyze.ExpressionAnalyzer.ge
import static
org.apache.iotdb.db.queryengine.plan.analyze.ExpressionAnalyzer.normalizeExpression;
import static
org.apache.iotdb.db.queryengine.plan.analyze.ExpressionAnalyzer.searchAggregationExpressions;
import static
org.apache.iotdb.db.queryengine.plan.analyze.ExpressionAnalyzer.searchSourceExpressions;
-import static
org.apache.iotdb.db.queryengine.plan.analyze.ExpressionTypeAnalyzer.analyzeExpression;
import static
org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.canPushDownLimitOffsetInGroupByTimeForDevice;
import static
org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.pushDownLimitOffsetInGroupByTimeForDevice;
@@ -125,6 +124,10 @@ public class TemplatedDeviceAnalyze {
.get(0)
.getExpression()
.getOutputSymbol())) {
+
+ Template template =
ClusterTemplateManager.getInstance().getAllTemplates().get(0);
+ analysis.setTemplateTypes(template);
+
isWildCardQuery = true;
}
}
@@ -279,18 +282,17 @@ public class TemplatedDeviceAnalyze {
ISchemaTree schemaTree,
List<PartialPath> deviceList) {
- Template template =
ClusterTemplateManager.getInstance().getAllTemplates().get(0);
-
List<Pair<Expression, String>> outputExpressions = new ArrayList<>();
Map<String, Set<Expression>> deviceToSelectExpressions = new HashMap<>();
- for (Map.Entry<String, IMeasurementSchema> entry :
template.getSchemaMap().entrySet()) {
+ for (Map.Entry<String, IMeasurementSchema> entry :
+ analysis.getTemplateTypes().getSchemaMap().entrySet()) {
String measurementName = entry.getKey();
IMeasurementSchema measurementSchema = entry.getValue();
TimeSeriesOperand measurementPath =
new TimeSeriesOperand(
new MeasurementPath(new String[] {measurementName},
measurementSchema));
- analyzeExpression(analysis, measurementPath);
+ // analyzeExpression(analysis, measurementPath);
outputExpressions.add(new Pair<>(measurementPath, null));
for (PartialPath devicePath : deviceList) {
// TODO how to determine whether a device is aligned device
@@ -298,7 +300,7 @@ public class TemplatedDeviceAnalyze {
new TimeSeriesOperand(
new MeasurementPath(
devicePath.concatNode(measurementName), measurementSchema,
true));
- analyzeExpression(analysis, fullPath);
+ // analyzeExpression(analysis, fullPath);
deviceToSelectExpressions
.computeIfAbsent(devicePath.getFullPath(), k -> new
LinkedHashSet<>())
.add(fullPath);