This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch TreeToTableView
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/TreeToTableView by this push:
new c34ea18e34a Add indexScan and fetchSchema hack
c34ea18e34a is described below
commit c34ea18e34a111992c1197ced585a43c02ea49d1
Author: JackieTien97 <[email protected]>
AuthorDate: Tue Dec 31 17:43:23 2024 +0800
Add indexScan and fetchSchema hack
---
.../plan/planner/TableOperatorGenerator.java | 2 +-
.../relational/metadata/TableMetadataImpl.java | 15 ++++++++++
.../relational/metadata/TreeDeviceViewSchema.java | 6 ++--
.../metadata/fetcher/TableDeviceSchemaFetcher.java | 23 +++++++++++++++
.../distribute/TableDistributedPlanGenerator.java | 33 ++++++++++++++++++++--
.../optimizations/PushPredicateIntoTableScan.java | 9 ++++--
6 files changed, 80 insertions(+), 8 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
index dc7d416662f..9a7ef7d8c62 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
@@ -333,7 +333,7 @@ public class TableOperatorGenerator extends
PlanVisitor<Operator, LocalExecution
"view for non aligned devices in tree is not supported");
}
- private IDeviceID.TreeDeviceIdColumnValueExtractor
createTreeDeviceIdColumnValueExtractor(
+ public static IDeviceID.TreeDeviceIdColumnValueExtractor
createTreeDeviceIdColumnValueExtractor(
String treeDBName) {
try {
PartialPath db = new PartialPath(treeDBName);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
index e544c212a28..a0fe2df16cb 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.commons.partition.DataPartition;
import org.apache.iotdb.commons.partition.DataPartitionQueryParam;
import org.apache.iotdb.commons.partition.SchemaPartition;
import org.apache.iotdb.commons.schema.table.TsTable;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
import
org.apache.iotdb.commons.udf.builtin.relational.TableBuiltinAggregationFunction;
import
org.apache.iotdb.commons.udf.builtin.relational.TableBuiltinScalarFunction;
import org.apache.iotdb.commons.udf.utils.TableUDFUtils;
@@ -61,6 +62,7 @@ import org.apache.tsfile.read.common.type.StringType;
import org.apache.tsfile.read.common.type.Type;
import org.apache.tsfile.read.common.type.TypeFactory;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
@@ -95,6 +97,19 @@ public class TableMetadataImpl implements Metadata {
@Override
public Optional<TableSchema> getTableSchema(
final SessionInfo session, final QualifiedObjectName name) {
+
+ // TODO remove me
+ if ("tree_view".equals(name.getDatabaseName())) {
+ List<ColumnSchema> columns = new ArrayList<>();
+ columns.add(new ColumnSchema("time", TIMESTAMP, false,
TsTableColumnCategory.TIME));
+ columns.add(new ColumnSchema("tag_1", STRING, false,
TsTableColumnCategory.ID));
+ columns.add(new ColumnSchema("tag_2", STRING, false,
TsTableColumnCategory.ID));
+ columns.add(new ColumnSchema("s_1", DOUBLE, false,
TsTableColumnCategory.MEASUREMENT));
+ columns.add(new ColumnSchema("s_2", DOUBLE, false,
TsTableColumnCategory.MEASUREMENT));
+
+ return Optional.of(new TreeDeviceViewSchema(name.getObjectName(),
columns));
+ }
+
final TsTable table = tableCache.getTable(name.getDatabaseName(),
name.getObjectName());
return Objects.isNull(table)
? Optional.empty()
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TreeDeviceViewSchema.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TreeDeviceViewSchema.java
index 362b696c97a..08f88d7629c 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TreeDeviceViewSchema.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TreeDeviceViewSchema.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.db.queryengine.plan.relational.metadata;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -28,12 +29,11 @@ public class TreeDeviceViewSchema extends TableSchema {
super(tableName, columns);
}
- // TODO
public String getTreeDBName() {
- return null;
+ return "root.tree";
}
public Map<String, String> getMeasurementColumnNameMap() {
- return null;
+ return Collections.emptyMap();
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
index 91ff285780b..b72c470ea15 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
@@ -56,6 +56,7 @@ import org.apache.tsfile.utils.Pair;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
@@ -171,6 +172,28 @@ public class TableDeviceSchemaFetcher {
final List<Expression> expressionList,
final List<String> attributeColumns,
final MPPQueryContext queryContext) {
+
+ // TODO remove me
+ if ("tree_view".equals(database)) {
+ List<DeviceEntry> deviceEntries = new ArrayList<>(4);
+ deviceEntries.add(
+ new AlignedDeviceEntry(
+ IDeviceID.Factory.DEFAULT_FACTORY.create("root.tree.a_1.b_1"),
+ Collections.emptyList()));
+ deviceEntries.add(
+ new AlignedDeviceEntry(
+ IDeviceID.Factory.DEFAULT_FACTORY.create("root.tree.a_1.b_2"),
+ Collections.emptyList()));
+ deviceEntries.add(
+ new AlignedDeviceEntry(
+ IDeviceID.Factory.DEFAULT_FACTORY.create("root.tree.a_2"),
Collections.emptyList()));
+ deviceEntries.add(
+ new AlignedDeviceEntry(
+ IDeviceID.Factory.DEFAULT_FACTORY.create("root.tree.a_2.b_2"),
+ Collections.emptyList()));
+ return deviceEntries;
+ }
+
final List<DeviceEntry> deviceEntryList = new ArrayList<>();
final ShowDevice statement = new ShowDevice(database, table);
final TsTable tableInstance =
DataNodeTableCache.getInstance().getTable(database, table);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
index bc0e269f468..7eb324be575 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.commons.partition.SchemaPartition;
import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
import org.apache.iotdb.db.queryengine.common.QueryId;
+import org.apache.iotdb.db.queryengine.plan.planner.TableOperatorGenerator;
import
org.apache.iotdb.db.queryengine.plan.planner.distribution.NodeDistribution;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
@@ -96,6 +97,7 @@ import java.util.stream.IntStream;
import static com.google.common.collect.ImmutableList.toImmutableList;
import static org.apache.iotdb.commons.partition.DataPartition.NOT_ASSIGNED;
import static
org.apache.iotdb.commons.udf.builtin.relational.TableBuiltinScalarFunction.DATE_BIN;
+import static
org.apache.iotdb.db.queryengine.plan.planner.TableOperatorGenerator.createTreeDeviceIdColumnValueExtractor;
import static
org.apache.iotdb.db.queryengine.plan.relational.planner.SymbolAllocator.GROUP_KEY_SUFFIX;
import static
org.apache.iotdb.db.queryengine.plan.relational.planner.SymbolAllocator.SEPARATOR;
import static
org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationNode.Step.SINGLE;
@@ -948,6 +950,8 @@ public class TableDistributedPlanGenerator
return;
}
+ Optional<IDeviceID.TreeDeviceIdColumnValueExtractor> extractor =
+ createTreeDeviceIdColumnValueExtractor(deviceTableScanNode);
final List<Function<DeviceEntry, String>> orderingRules = new
ArrayList<>();
for (final Symbol symbol : newOrderingSymbols) {
final Integer idx =
deviceTableScanNode.getIdAndAttributeIndexMap().get(symbol);
@@ -957,8 +961,18 @@ public class TableDistributedPlanGenerator
}
if (deviceTableScanNode.getAssignments().get(symbol).getColumnCategory()
== TsTableColumnCategory.ID) {
- // segments[0] is always tableName
- orderingRules.add(deviceEntry -> (String)
deviceEntry.getNthSegment(idx + 1));
+
+ Function<DeviceEntry, String> iDColumnFunction =
+ extractor
+ .<Function<DeviceEntry, String>>map(
+ treeDeviceIdColumnValueExtractor ->
+ deviceEntry ->
+ (String)
+ treeDeviceIdColumnValueExtractor.extract(
+ deviceEntry.getDeviceID(), idx))
+ .orElseGet(() -> deviceEntry -> (String)
deviceEntry.getNthSegment(idx + 1));
+ // segments[0] is always tableName for table model
+ orderingRules.add(iDColumnFunction);
} else {
orderingRules.add(
deviceEntry ->
@@ -1030,6 +1044,21 @@ public class TableDistributedPlanGenerator
}
}
+ private Optional<IDeviceID.TreeDeviceIdColumnValueExtractor>
+ createTreeDeviceIdColumnValueExtractor(DeviceTableScanNode node) {
+ if (node instanceof TreeDeviceViewScanNode) {
+ return Optional.of(
+ TableOperatorGenerator.createTreeDeviceIdColumnValueExtractor(
+ ((TreeDeviceViewScanNode) node).getTreeDBName()));
+ } else if (node instanceof AggregationTreeDeviceViewScanNode) {
+ return Optional.of(
+ TableOperatorGenerator.createTreeDeviceIdColumnValueExtractor(
+ ((AggregationTreeDeviceViewScanNode) node).getTreeDBName()));
+ } else {
+ return Optional.empty();
+ }
+ }
+
private Optional<OrderingScheme> tableScanOrderingSchema(
Map<Symbol, ColumnSchema> tableColumnSchema,
List<Symbol> newOrderingSymbols,
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
index 2a208226653..994d42e19d3 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
@@ -52,6 +52,7 @@ import
org.apache.iotdb.db.queryengine.plan.relational.planner.node.FilterNode;
import org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinNode;
import
org.apache.iotdb.db.queryengine.plan.relational.planner.node.ProjectNode;
import org.apache.iotdb.db.queryengine.plan.relational.planner.node.SortNode;
+import
org.apache.iotdb.db.queryengine.plan.relational.planner.node.TreeDeviceViewScanNode;
import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ComparisonExpression;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Expression;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.FunctionCall;
@@ -478,7 +479,10 @@ public class PushPredicateIntoTableScan implements
PlanOptimizer {
startTime = System.nanoTime();
final DataPartition dataPartition =
fetchDataPartitionByDevices(
- tableScanNode.getQualifiedObjectName().getDatabaseName(),
+ // for tree view, we need to pass actual tree db name to this
method
+ tableScanNode instanceof TreeDeviceViewScanNode
+ ? ((TreeDeviceViewScanNode) tableScanNode).getTreeDBName()
+ : tableScanNode.getQualifiedObjectName().getDatabaseName(),
deviceEntries,
timeFilter);
@@ -759,7 +763,8 @@ public class PushPredicateIntoTableScan implements
PlanOptimizer {
}
private DataPartition fetchDataPartitionByDevices(
- final String database,
+ final String
+ database, // for tree view, database should be the real tree db
name with `root.` prefix
final List<DeviceEntry> deviceEntries,
final Filter globalTimeFilter) {
final Pair<List<TTimePartitionSlot>, Pair<Boolean, Boolean>> res =