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 =

Reply via email to