diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java index e82ed9220459..0ef64674d11d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java @@ -56,6 +56,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.pipe.PipeEnrichedNonWritePlanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.pipe.PipeEnrichedWritePlanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.pipe.PipeOperateSchemaQueueNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.CreateTableDeviceNode; import org.apache.iotdb.db.schemaengine.schemaregion.ISchemaRegion; import org.apache.iotdb.db.schemaengine.schemaregion.write.req.ICreateAlignedTimeSeriesPlan; import org.apache.iotdb.db.schemaengine.schemaregion.write.req.ICreateTimeSeriesPlan; @@ -525,6 +526,22 @@ public TSStatus visitDeleteLogicalView(DeleteLogicalViewNode node, ISchemaRegion } } + @Override + public TSStatus visitCreateTableDevice(CreateTableDeviceNode node, ISchemaRegion schemaRegion) { + try { + // todo implement storage for device of diverse data types + schemaRegion.createTableDevice( + node.getTableName(), + node.getDeviceIdList(), + node.getAttributeNameList(), + node.getAttributeValueList()); + return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS); + } catch (MetadataException e) { + logger.error(e.getMessage(), e); + return RpcUtils.getStatus(e.getErrorCode(), e.getMessage()); + } + } + @Override public TSStatus visitPipeEnrichedWritePlanNode( final PipeEnrichedWritePlanNode node, final ISchemaRegion schemaRegion) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ClusterPartitionFetcher.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ClusterPartitionFetcher.java index 1f9a47e6c107..eb6db8e60514 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ClusterPartitionFetcher.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ClusterPartitionFetcher.java @@ -293,6 +293,25 @@ public void invalidAllCache() { partitionCache.invalidAllCache(); } + @Override + public SchemaPartition getOrCreateSchemaPartition( + String database, List deviceIDList, String userName) { + // todo implement related logic @Potato + throw new UnsupportedOperationException("Unsupported schema partition operation"); + } + + @Override + public SchemaPartition getSchemaPartition(String database, List deviceIDList) { + // todo implement related logic @Potato + throw new UnsupportedOperationException("Unsupported schema partition operation"); + } + + @Override + public SchemaPartition getSchemaPartition(String database) { + // todo implement related logic @Potato + throw new UnsupportedOperationException("Unsupported schema partition operation"); + } + /** split data partition query param by database */ private Map> splitDataPartitionQueryParam( List dataPartitionQueryParams, diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IAnalysis.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IAnalysis.java index 4adcd7e298ce..70cff5c07790 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IAnalysis.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IAnalysis.java @@ -51,6 +51,8 @@ public interface IAnalysis { SchemaPartition getSchemaPartitionInfo(); + void setSchemaPartitionInfo(SchemaPartition schemaPartition); + DataPartition getDataPartitionInfo(); void setRedirectNodeList(List redirectNodeList); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IPartitionFetcher.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IPartitionFetcher.java index ecd88a9c6471..2fddd3562296 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IPartitionFetcher.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/IPartitionFetcher.java @@ -26,6 +26,8 @@ import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.mpp.rpc.thrift.TRegionRouteReq; +import org.apache.tsfile.file.metadata.IDeviceID; + import java.util.List; import java.util.Map; @@ -90,4 +92,34 @@ SchemaNodeManagementPartition getSchemaNodeManagementPartitionWithLevel( /** Invalid all partition cache */ void invalidAllCache(); + + // ======================== Table Model Schema Partition Interface ======================== + /** + * Get or create schema partition, used in data insertion with enable_auto_create_schema is true. + * if schemaPartition does not exist, then automatically create. + * + *

The database shall start with "root.". Concat this to a user-provided db name if necessary. + * + *

The device id shall be [table, seg1, ....] + */ + SchemaPartition getOrCreateSchemaPartition( + String database, List deviceIDList, String userName); + + /** + * For data query with completed id. + * + *

The database shall start with "root.". Concat this to a user-provided db name if necessary. + * + *

The device id shall be [table, seg1, ....] + */ + SchemaPartition getSchemaPartition(String database, List deviceIDList); + + /** + * For data query with partial device id conditions. + * + *

The database shall start with "root.". Concat this to a user-provided db name if necessary. + * + *

The device id shall be [table, seg1, ....] + */ + SchemaPartition getSchemaPartition(String database); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java index 2e5a61b7a83e..11d504b4cc4d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java @@ -112,6 +112,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowsNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowsOfOneDeviceNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertTabletNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.CreateTableDeviceNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.MergeSortNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.TableScanNode; @@ -484,6 +485,10 @@ public R visitAlterLogicalView(AlterLogicalViewNode node, C context) { return visitPlan(node, context); } + public R visitCreateTableDevice(CreateTableDeviceNode node, C context) { + return visitPlan(node, context); + } + ///////////////////////////////////////////////////////////////////////////////////////////////// // Data Write Node ///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java index 4d019248d866..749e40a3abfa 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java @@ -158,6 +158,8 @@ public class Analysis implements IAnalysis { private DataPartition dataPartition; + private SchemaPartition schemaPartition; + private DatasetHeader respDatasetHeader; private boolean finishQueryAfterAnalyze; @@ -653,7 +655,12 @@ public String getStatementType() { @Override public SchemaPartition getSchemaPartitionInfo() { - throw new UnsupportedOperationException(); + return schemaPartition; + } + + @Override + public void setSchemaPartitionInfo(SchemaPartition schemaPartition) { + this.schemaPartition = schemaPartition; } @Override @@ -673,7 +680,7 @@ public void addEndPointToRedirectNodeList(TEndPoint endPoint) { @Override public TimePredicate getCovertedTimePredicate() { - throw new UnsupportedOperationException(); + return null; } public static final class AccessControlInfo { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java index 1fcc4e89024f..25bf3cd5f830 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java @@ -36,6 +36,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.AllRows; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.AstVisitor; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CreateDB; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CreateDevice; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CreateIndex; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CreateTable; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Delete; @@ -231,6 +232,9 @@ private Visitor( @Override public Scope process(Node node, Optional scope) { Scope returnScope = super.process(node, scope); + if (node instanceof CreateDevice) { + return returnScope; + } checkState( returnScope.getOuterQueryParent().equals(outerQueryScope), "result scope should have outer query scope equal with parameter outer query scope"); @@ -2420,6 +2424,11 @@ private Scope.Builder scopeBuilder(Optional parentScope) { return scopeBuilder; } + + @Override + protected Scope visitCreateDevice(CreateDevice node, Optional context) { + return null; + } } private static boolean hasScopeAsLocalParent(Scope root, Scope parent) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java index dc66581b74c2..b369347bdff0 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java @@ -19,6 +19,7 @@ package org.apache.iotdb.db.queryengine.plan.relational.metadata; +import org.apache.iotdb.commons.partition.SchemaPartition; import org.apache.iotdb.db.queryengine.common.MPPQueryContext; import org.apache.iotdb.db.queryengine.common.SessionInfo; import org.apache.iotdb.db.queryengine.plan.relational.function.OperatorType; @@ -27,6 +28,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.type.TypeNotFoundException; import org.apache.iotdb.db.queryengine.plan.relational.type.TypeSignature; +import org.apache.tsfile.file.metadata.IDeviceID; import org.apache.tsfile.read.common.type.Type; import java.util.List; @@ -97,4 +99,34 @@ TableSchema validateTableHeaderSchema( *

If validation failed, a SemanticException will be thrown. */ void validateDeviceSchema(ITableDeviceSchemaValidation schemaValidation, MPPQueryContext context); + + // ======================== Table Model Schema Partition Interface ======================== + /** + * Get or create schema partition, used in data insertion with enable_auto_create_schema is true. + * if schemaPartition does not exist, then automatically create. + * + *

The database shall start with "root.". Concat this to a user-provided db name if necessary. + * + *

The device id shall be [table, seg1, ....] + */ + SchemaPartition getOrCreateSchemaPartition( + String database, List deviceIDList, String userName); + + /** + * For data query with completed id. + * + *

The database is a user-provided db name. + * + *

The device id shall be [table, seg1, ....] + */ + SchemaPartition getSchemaPartition(String database, List deviceIDList); + + /** + * For data query with partial device id conditions. + * + *

The database is a user-provided db name. + * + *

The device id shall be [table, seg1, ....] + */ + SchemaPartition getSchemaPartition(String database); } 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 f3ff0b59834f..ea7c031b5fff 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 @@ -19,11 +19,14 @@ package org.apache.iotdb.db.queryengine.plan.relational.metadata; +import org.apache.iotdb.commons.partition.SchemaPartition; import org.apache.iotdb.commons.udf.builtin.BuiltinAggregationFunction; import org.apache.iotdb.commons.udf.builtin.BuiltinScalarFunction; import org.apache.iotdb.db.exception.sql.SemanticException; import org.apache.iotdb.db.queryengine.common.MPPQueryContext; import org.apache.iotdb.db.queryengine.common.SessionInfo; +import org.apache.iotdb.db.queryengine.plan.analyze.ClusterPartitionFetcher; +import org.apache.iotdb.db.queryengine.plan.analyze.IPartitionFetcher; import org.apache.iotdb.db.queryengine.plan.relational.function.OperatorType; import org.apache.iotdb.db.queryengine.plan.relational.security.AccessControl; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Expression; @@ -43,6 +46,8 @@ import java.util.Locale; import java.util.Optional; +import static org.apache.iotdb.commons.conf.IoTDBConstant.PATH_ROOT; +import static org.apache.iotdb.commons.conf.IoTDBConstant.PATH_SEPARATOR; import static org.apache.tsfile.read.common.type.BinaryType.TEXT; import static org.apache.tsfile.read.common.type.BooleanType.BOOLEAN; import static org.apache.tsfile.read.common.type.DoubleType.DOUBLE; @@ -54,6 +59,8 @@ public class TableMetadataImpl implements Metadata { private final TypeManager typeManager = new InternalTypeManager(); + private final IPartitionFetcher partitionFetcher = ClusterPartitionFetcher.getInstance(); + @Override public boolean tableExists(QualifiedObjectName name) { return false; @@ -288,6 +295,23 @@ public void validateDeviceSchema( throw new UnsupportedOperationException(); } + @Override + public SchemaPartition getOrCreateSchemaPartition( + String database, List deviceIDList, String userName) { + return partitionFetcher.getOrCreateSchemaPartition( + PATH_ROOT + PATH_SEPARATOR + database, deviceIDList, userName); + } + + @Override + public SchemaPartition getSchemaPartition(String database, List deviceIDList) { + return partitionFetcher.getSchemaPartition(PATH_ROOT + PATH_SEPARATOR + database, deviceIDList); + } + + @Override + public SchemaPartition getSchemaPartition(String database) { + return partitionFetcher.getSchemaPartition(PATH_ROOT + PATH_SEPARATOR + database); + } + public static boolean isTwoNumericType(List argumentTypes) { return argumentTypes.size() == 2 && isNumericType(argumentTypes.get(0)) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java index a7537c4e6800..b4e63779f125 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java @@ -14,18 +14,21 @@ package org.apache.iotdb.db.queryengine.plan.relational.planner; +import org.apache.iotdb.commons.partition.SchemaPartition; import org.apache.iotdb.db.queryengine.common.MPPQueryContext; import org.apache.iotdb.db.queryengine.common.SessionInfo; import org.apache.iotdb.db.queryengine.common.header.ColumnHeader; import org.apache.iotdb.db.queryengine.common.header.DatasetHeader; import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector; import org.apache.iotdb.db.queryengine.plan.analyze.IPartitionFetcher; +import org.apache.iotdb.db.queryengine.plan.analyze.QueryType; import org.apache.iotdb.db.queryengine.plan.planner.plan.LogicalQueryPlan; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode; import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis; import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Field; import org.apache.iotdb.db.queryengine.plan.relational.analyzer.RelationType; import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.CreateTableDeviceNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.OutputNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.FilterScanCombine; import org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.IndexScan; @@ -33,6 +36,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.RelationalPlanOptimizer; import org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.RemoveRedundantIdentityProjections; import org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.SimplifyExpressions; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CreateDevice; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Explain; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Query; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement; @@ -96,6 +100,9 @@ public LogicalQueryPlan plan(Analysis analysis) { } private PlanNode planStatement(Analysis analysis, Statement statement) { + if (statement instanceof CreateDevice) { + return planCreateDevice((CreateDevice) statement, analysis); + } return createOutputPlan(planStatementWithoutOutput(analysis, statement), analysis); } @@ -181,4 +188,27 @@ private enum Stage { OPTIMIZED, OPTIMIZED_AND_VALIDATED } + + private PlanNode planCreateDevice(CreateDevice statement, Analysis analysis) { + context.setQueryType(QueryType.WRITE); + + CreateTableDeviceNode node = + new CreateTableDeviceNode( + context.getQueryId().genPlanNodeId(), + statement.getDatabase(), + statement.getTable(), + statement.getDeviceIdList(), + statement.getAttributeNameList(), + statement.getAttributeValueList()); + + analysis.setStatement(statement); + SchemaPartition partition = + metadata.getOrCreateSchemaPartition( + statement.getDatabase(), + node.getPartitionKeyList(), + context.getSession().getUserName()); + analysis.setSchemaPartitionInfo(partition); + + return node; + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/CreateTableDeviceNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/CreateTableDeviceNode.java new file mode 100644 index 000000000000..13209c2274f3 --- /dev/null +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/CreateTableDeviceNode.java @@ -0,0 +1,316 @@ +/* + * 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.queryengine.plan.relational.planner.node; + +import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet; +import org.apache.iotdb.db.queryengine.plan.analyze.IAnalysis; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.WritePlanNode; + +import org.apache.tsfile.file.metadata.IDeviceID; +import org.apache.tsfile.utils.ReadWriteIOUtils; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import static org.apache.iotdb.commons.conf.IoTDBConstant.PATH_ROOT; +import static org.apache.iotdb.commons.conf.IoTDBConstant.PATH_SEPARATOR; + +public class CreateTableDeviceNode extends WritePlanNode { + + private final String database; + + private final String tableName; + + private final List deviceIdList; + + private final List attributeNameList; + + private final List attributeValueList; + + private TRegionReplicaSet regionReplicaSet; + + private transient List partitionKeyList; + + public CreateTableDeviceNode( + PlanNodeId id, + String database, + String tableName, + List deviceIdList, + List attributeNameList, + List attributeValueList) { + super(id); + this.database = database; + this.tableName = tableName; + this.deviceIdList = deviceIdList; + this.attributeNameList = attributeNameList; + this.attributeValueList = attributeValueList; + } + + public CreateTableDeviceNode( + PlanNodeId id, + TRegionReplicaSet regionReplicaSet, + String database, + String tableName, + List deviceIdList, + List attributeNameList, + List attributeValueList) { + super(id); + this.database = database; + this.tableName = tableName; + this.deviceIdList = deviceIdList; + this.attributeNameList = attributeNameList; + this.attributeValueList = attributeValueList; + this.regionReplicaSet = regionReplicaSet; + } + + @Override + public PlanNodeType getType() { + return PlanNodeType.CREATE_TABLE_DEVICE; + } + + public String getDatabase() { + return database; + } + + public String getTableName() { + return tableName; + } + + public List getDeviceIdList() { + return deviceIdList; + } + + public List getAttributeNameList() { + return attributeNameList; + } + + public List getAttributeValueList() { + return attributeValueList; + } + + @Override + public TRegionReplicaSet getRegionReplicaSet() { + return regionReplicaSet; + } + + public List getPartitionKeyList() { + if (partitionKeyList == null) { + List partitionKeyList = new ArrayList<>(); + for (Object[] rawId : deviceIdList) { + String[] partitionKey = new String[rawId.length + 1]; + partitionKey[0] = tableName; + for (int i = 0; i < rawId.length; i++) { + partitionKey[i + 1] = Objects.toString(rawId[i].toString()); + } + partitionKeyList.add(IDeviceID.Factory.DEFAULT_FACTORY.create(partitionKey)); + } + this.partitionKeyList = partitionKeyList; + } + return partitionKeyList; + } + + @Override + public List getChildren() { + return new ArrayList<>(); + } + + @Override + public void addChild(PlanNode child) {} + + @Override + public PlanNode clone() { + return new CreateTableDeviceNode( + getPlanNodeId(), + regionReplicaSet, + database, + tableName, + deviceIdList, + attributeNameList, + attributeValueList); + } + + @Override + public int allowedChildCount() { + return 0; + } + + @Override + public List getOutputColumnNames() { + return null; + } + + @Override + protected void serializeAttributes(ByteBuffer byteBuffer) { + PlanNodeType.CREATE_TABLE_DEVICE.serialize(byteBuffer); + ReadWriteIOUtils.write(database, byteBuffer); + ReadWriteIOUtils.write(tableName, byteBuffer); + ReadWriteIOUtils.write(deviceIdList.size(), byteBuffer); + for (Object[] deviceId : deviceIdList) { + ReadWriteIOUtils.write(deviceId.length, byteBuffer); + for (Object idSeg : deviceId) { + ReadWriteIOUtils.writeObject(idSeg, byteBuffer); + } + } + ReadWriteIOUtils.write(attributeNameList.size(), byteBuffer); + for (String attributeName : attributeNameList) { + ReadWriteIOUtils.write(attributeName, byteBuffer); + } + ReadWriteIOUtils.write(attributeValueList.size(), byteBuffer); + for (Object[] deviceValueList : attributeValueList) { + for (Object value : deviceValueList) { + ReadWriteIOUtils.writeObject(value, byteBuffer); + } + } + } + + @Override + protected void serializeAttributes(DataOutputStream stream) throws IOException { + PlanNodeType.CREATE_TABLE_DEVICE.serialize(stream); + ReadWriteIOUtils.write(database, stream); + ReadWriteIOUtils.write(tableName, stream); + ReadWriteIOUtils.write(deviceIdList.size(), stream); + for (Object[] deviceId : deviceIdList) { + ReadWriteIOUtils.write(deviceId.length, stream); + for (Object idSeg : deviceId) { + ReadWriteIOUtils.writeObject(idSeg, stream); + } + } + ReadWriteIOUtils.write(attributeNameList.size(), stream); + for (String attributeName : attributeNameList) { + ReadWriteIOUtils.write(attributeName, stream); + } + for (Object[] deviceValueList : attributeValueList) { + for (Object value : deviceValueList) { + ReadWriteIOUtils.writeObject(value, stream); + } + } + } + + public static CreateTableDeviceNode deserialize(ByteBuffer buffer) { + String database = ReadWriteIOUtils.readString(buffer); + String tableName = ReadWriteIOUtils.readString(buffer); + int deviceNum = ReadWriteIOUtils.readInt(buffer); + List deviceIdList = new ArrayList<>(deviceNum); + int length; + Object[] deviceId; + for (int i = 0; i < deviceNum; i++) { + length = ReadWriteIOUtils.readInt(buffer); + deviceId = new Object[length]; + for (int j = 0; j < length; j++) { + deviceId[j] = ReadWriteIOUtils.readObject(buffer); + } + deviceIdList.add(deviceId); + } + int attributeNameNum = ReadWriteIOUtils.readInt(buffer); + List attributeNameList = new ArrayList<>(attributeNameNum); + for (int i = 0; i < attributeNameNum; i++) { + attributeNameList.add(ReadWriteIOUtils.readString(buffer)); + } + List attributeValueList = new ArrayList<>(deviceNum); + Object[] deviceAttributeValues; + for (int i = 0; i < deviceNum; i++) { + deviceAttributeValues = new Object[attributeNameNum]; + for (int j = 0; j < attributeNameNum; j++) { + deviceAttributeValues[j] = ReadWriteIOUtils.readObject(buffer); + } + attributeValueList.add(deviceAttributeValues); + } + PlanNodeId planNodeId = PlanNodeId.deserialize(buffer); + return new CreateTableDeviceNode( + planNodeId, database, tableName, deviceIdList, attributeNameList, attributeValueList); + } + + @Override + public List splitByPartition(IAnalysis analysis) { + String dbNameForInvoke = PATH_ROOT + PATH_SEPARATOR + database; + Map> splitMap = new HashMap<>(); + List partitionKeyList = getPartitionKeyList(); + for (int i = 0; i < partitionKeyList.size(); i++) { + // use the string literal of deviceId as the partition key + TRegionReplicaSet regionReplicaSet = + analysis + .getSchemaPartitionInfo() + .getSchemaRegionReplicaSet(dbNameForInvoke, partitionKeyList.get(i)); + splitMap.computeIfAbsent(regionReplicaSet, k -> new ArrayList<>()).add(i); + } + List result = new ArrayList<>(splitMap.size()); + for (Map.Entry> entry : splitMap.entrySet()) { + List subDeviceIdList = new ArrayList<>(entry.getValue().size()); + List subAttributeValueList = new ArrayList<>(entry.getValue().size()); + for (Integer index : entry.getValue()) { + subDeviceIdList.add(deviceIdList.get(index)); + subAttributeValueList.add(attributeValueList.get(index)); + } + result.add( + new CreateTableDeviceNode( + getPlanNodeId(), + entry.getKey(), + database, + tableName, + subDeviceIdList, + attributeNameList, + subAttributeValueList)); + } + return result; + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitCreateTableDevice(this, context); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTableDeviceNode node = (CreateTableDeviceNode) o; + return Objects.equals(database, node.database) + && Objects.equals(tableName, node.tableName) + && Objects.equals(deviceIdList, node.deviceIdList) + && Objects.equals(attributeNameList, node.attributeNameList) + && Objects.equals(attributeValueList, node.attributeValueList) + && Objects.equals(regionReplicaSet, node.regionReplicaSet) + && Objects.equals(partitionKeyList, node.partitionKeyList); + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + database, + tableName, + deviceIdList, + attributeNameList, + attributeValueList, + regionReplicaSet, + partitionKeyList); + } +} diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java index d2c1e4874582..26cbe300c2ac 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java @@ -446,4 +446,8 @@ protected R visitCreateFunction(CreateFunction node, C context) { protected R visitDropFunction(DropFunction node, C context) { return visitStatement(node, context); } + + protected R visitCreateDevice(CreateDevice node, C context) { + return visitStatement(node, context); + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/CreateDevice.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/CreateDevice.java new file mode 100644 index 000000000000..d06740804e7a --- /dev/null +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/CreateDevice.java @@ -0,0 +1,116 @@ +/* + * 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.queryengine.plan.relational.sql.ast; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +public class CreateDevice extends Statement { + + private final String database; + + private final String table; + + private final List deviceIdList; + + private final List attributeNameList; + + private final List attributeValueList; + + public CreateDevice( + String database, + String table, + List deviceIdList, + List attributeNameList, + List attributeValueList) { + super(null); + this.database = database; + this.table = table; + this.deviceIdList = deviceIdList; + this.attributeNameList = attributeNameList; + this.attributeValueList = attributeValueList; + } + + public String getDatabase() { + return database; + } + + public String getTable() { + return table; + } + + public List getDeviceIdList() { + return deviceIdList; + } + + public List getAttributeNameList() { + return attributeNameList; + } + + public List getAttributeValueList() { + return attributeValueList; + } + + @Override + public R accept(AstVisitor visitor, C context) { + return visitor.visitCreateDevice(this, context); + } + + @Override + public List getChildren() { + return Collections.emptyList(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CreateDevice that = (CreateDevice) o; + return Objects.equals(database, that.database) + && Objects.equals(table, that.table) + && Objects.equals(deviceIdList, that.deviceIdList) + && Objects.equals(attributeNameList, that.attributeNameList) + && Objects.equals(attributeValueList, that.attributeValueList); + } + + @Override + public int hashCode() { + return Objects.hash(database, table, deviceIdList, attributeNameList, attributeValueList); + } + + @Override + public String toString() { + return "CreateDevice{" + + "database='" + + database + + '\'' + + ", table='" + + table + + '\'' + + ", deviceIdList=" + + deviceIdList + + ", attributeNameList=" + + attributeNameList + + ", attributeValueList=" + + attributeValueList + + '}'; + } +} diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java index 18d94528bc2d..1b679aa8bb0a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/ISchemaRegion.java @@ -301,9 +301,10 @@ long countPathsUsingTemplate(int templateId, PathPatternTree patternTree) // region table device management void createTableDevice( - List devicePathList, + String tableName, + List devicePathList, List attributeNameList, - List> attributeValueList) + List attributeValueList) throws MetadataException; void deleteTableDevice(String table) throws MetadataException; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/attribute/DeviceAttributeStore.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/attribute/DeviceAttributeStore.java index 65ea0cb50a7c..70125fe28315 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/attribute/DeviceAttributeStore.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/attribute/DeviceAttributeStore.java @@ -117,12 +117,15 @@ public void loadFromSnapshot(File snapshotDir, String sgSchemaDirPath) throws IO } @Override - public synchronized int createAttribute(List nameList, List valueList) { + public synchronized int createAttribute(List nameList, Object[] valueList) { + // todo implement storage for device of diverse data types long memUsage = 0L; Map attributeMap = new HashMap<>(); + String value; for (int i = 0; i < nameList.size(); i++) { - attributeMap.put(nameList.get(i), valueList.get(i)); - memUsage += MemUsageUtil.computeKVMemUsageInMap(nameList.get(i), valueList.get(i)); + value = valueList[i] == null ? null : valueList[i].toString(); + attributeMap.put(nameList.get(i), value); + memUsage += MemUsageUtil.computeKVMemUsageInMap(nameList.get(i), value); } deviceAttributeList.add(attributeMap); requestMemory(memUsage); @@ -130,11 +133,13 @@ public synchronized int createAttribute(List nameList, List valu } @Override - public void alterAttribute(int pointer, List nameList, List valueList) { + public void alterAttribute(int pointer, List nameList, Object[] valueList) { + // todo implement storage for device of diverse data types long memUsageDelta = 0L; long originMemUsage; long updatedMemUsage; Map attributeMap = deviceAttributeList.get(pointer); + String value; for (int i = 0; i < nameList.size(); i++) { String key = nameList.get(i); originMemUsage = @@ -142,9 +147,9 @@ public void alterAttribute(int pointer, List nameList, List valu ? 0 : MemUsageUtil.computeKVMemUsageInMap(key, attributeMap.get(key)); - attributeMap.put(key, valueList.get(i)); - - updatedMemUsage = MemUsageUtil.computeKVMemUsageInMap(key, valueList.get(i)); + value = valueList[i] == null ? null : valueList[i].toString(); + attributeMap.put(key, value); + updatedMemUsage = MemUsageUtil.computeKVMemUsageInMap(key, value); memUsageDelta += updatedMemUsage - originMemUsage; } requestMemory(memUsageDelta); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/attribute/IDeviceAttributeStore.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/attribute/IDeviceAttributeStore.java index 79f44d20bd20..768afca54ca5 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/attribute/IDeviceAttributeStore.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/attribute/IDeviceAttributeStore.java @@ -31,9 +31,9 @@ public interface IDeviceAttributeStore { void loadFromSnapshot(File snapshotDir, String sgSchemaDirPath) throws IOException; - int createAttribute(List nameList, List valueList); + int createAttribute(List nameList, Object[] valueList); - void alterAttribute(int pointer, List nameList, List valueList); + void alterAttribute(int pointer, List nameList, Object[] valueList); String getAttribute(int pointer, String name); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java index 7775bc315a84..b7c7257b8803 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java @@ -1275,13 +1275,15 @@ public long countPathsUsingTemplate(int templateId, PathPatternTree patternTree) @Override public void createTableDevice( - List devicePathList, + String tableName, + List devicePathList, List attributeNameList, - List> attributeValueList) + List attributeValueList) throws MetadataException { for (int i = 0; i < devicePathList.size(); i++) { int finalI = i; mtree.createTableDevice( + tableName, devicePathList.get(i), () -> deviceAttributeStore.createAttribute( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java index 6ae52183a903..c1ec3c37df5b 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java @@ -1361,9 +1361,10 @@ public long countPathsUsingTemplate(int templateId, PathPatternTree patternTree) @Override public void createTableDevice( - List devicePathList, + String tableName, + List devicePathList, List attributeNameList, - List> attributeValueList) + List attributeValueList) throws MetadataException { throw new UnsupportedOperationException(); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java index 66e58b185635..4abd4b1c5296 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java @@ -1420,16 +1420,25 @@ protected Void collectMeasurement(IMeasurementMNode node) { // region table device management public void createTableDevice( - PartialPath devicePath, IntSupplier attributePointerGetter, IntConsumer attributeUppdater) + String tableName, + Object[] devicePath, + IntSupplier attributePointerGetter, + IntConsumer attributeUppdater) throws MetadataException { - String[] nodeNames = devicePath.getNodes(); + // todo implement storage for device of diverse data types IMemMNode cur = storageGroupMNode; - IMemMNode child; - for (int i = levelOfSG + 1; i < nodeNames.length; i++) { - child = cur.getChild(nodeNames[i]); + IMemMNode child = cur.getChild(tableName); + if (child == null) { + child = store.addChild(cur, tableName, nodeFactory.createInternalMNode(cur, tableName)); + } + cur = child; + + String nodeName; + for (int i = 0; i < devicePath.length; i++) { + nodeName = devicePath[i] == null ? null : devicePath[i].toString(); + child = cur.getChild(nodeName); if (child == null) { - child = - store.addChild(cur, nodeNames[i], nodeFactory.createInternalMNode(cur, nodeNames[i])); + child = store.addChild(cur, nodeName, nodeFactory.createInternalMNode(cur, nodeName)); } cur = child; } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaRegionTestUtil.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaRegionTestUtil.java index e5c6382a44d7..ec8c8d236bb3 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaRegionTestUtil.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaRegionTestUtil.java @@ -382,7 +382,7 @@ public static long deleteTimeSeries(ISchemaRegion schemaRegion, PartialPath path } public static void createTableDevice( - ISchemaRegion schemaRegion, String table, String[] deviceIds, Map attributes) + ISchemaRegion schemaRegion, String table, Object[] deviceIds, Map attributes) throws MetadataException { String[] fullId = new String[deviceIds.length + 3]; fullId[0] = ROOT; @@ -390,9 +390,10 @@ public static void createTableDevice( fullId[2] = table; System.arraycopy(deviceIds, 0, fullId, 3, deviceIds.length); schemaRegion.createTableDevice( - Collections.singletonList(new PartialPath(fullId)), + table, + Collections.singletonList(deviceIds), new ArrayList<>(attributes.keySet()), - Collections.singletonList(new ArrayList<>(attributes.values()))); + Collections.singletonList(attributes.values().toArray())); } public static List getTableDevice( diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/FakePartitionFetcherImpl.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/FakePartitionFetcherImpl.java index 38799372cf80..b7e4ac4567f4 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/FakePartitionFetcherImpl.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/analyze/FakePartitionFetcherImpl.java @@ -35,6 +35,8 @@ import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.mpp.rpc.thrift.TRegionRouteReq; +import org.apache.tsfile.file.metadata.IDeviceID; + import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -298,4 +300,20 @@ public boolean updateRegionCache(TRegionRouteReq req) { @Override public void invalidAllCache() {} + + @Override + public SchemaPartition getOrCreateSchemaPartition( + String database, List deviceIDList, String userName) { + return null; + } + + @Override + public SchemaPartition getSchemaPartition(String database, List deviceIDList) { + return null; + } + + @Override + public SchemaPartition getSchemaPartition(String database) { + return null; + } } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java index 59cd36a2f8ae..764393b3714c 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util.java @@ -58,6 +58,7 @@ import org.apache.iotdb.mpp.rpc.thrift.TRegionRouteReq; import org.apache.tsfile.enums.TSDataType; +import org.apache.tsfile.file.metadata.IDeviceID; import org.apache.tsfile.file.metadata.enums.CompressionType; import org.apache.tsfile.file.metadata.enums.TSEncoding; import org.apache.tsfile.utils.Pair; @@ -406,6 +407,22 @@ public boolean updateRegionCache(TRegionRouteReq req) { @Override public void invalidAllCache() {} + + @Override + public SchemaPartition getOrCreateSchemaPartition( + String database, List deviceIDList, String userName) { + return null; + } + + @Override + public SchemaPartition getSchemaPartition(String database, List deviceIDList) { + return null; + } + + @Override + public SchemaPartition getSchemaPartition(String database) { + return null; + } }; } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java index eb802edd9e54..38158b402e54 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/Util2.java @@ -55,6 +55,7 @@ import org.apache.iotdb.mpp.rpc.thrift.TRegionRouteReq; import org.apache.tsfile.enums.TSDataType; +import org.apache.tsfile.file.metadata.IDeviceID; import org.apache.tsfile.file.metadata.enums.CompressionType; import org.apache.tsfile.file.metadata.enums.TSEncoding; import org.apache.tsfile.utils.Pair; @@ -300,6 +301,22 @@ public boolean updateRegionCache(TRegionRouteReq req) { @Override public void invalidAllCache() {} + + @Override + public SchemaPartition getOrCreateSchemaPartition( + String database, List deviceIDList, String userName) { + return null; + } + + @Override + public SchemaPartition getSchemaPartition(String database, List deviceIDList) { + return null; + } + + @Override + public SchemaPartition getSchemaPartition(String database) { + return null; + } }; } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java index f59af819f8f4..036089787076 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java @@ -55,6 +55,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.SqlParser; import org.apache.iotdb.mpp.rpc.thrift.TRegionRouteReq; +import org.apache.tsfile.file.metadata.IDeviceID; import org.junit.Test; import org.mockito.Mockito; @@ -563,6 +564,22 @@ public boolean updateRegionCache(TRegionRouteReq req) { @Override public void invalidAllCache() {} + + @Override + public SchemaPartition getOrCreateSchemaPartition( + String database, List deviceIDList, String userName) { + return null; + } + + @Override + public SchemaPartition getSchemaPartition(String database, List deviceIDList) { + return null; + } + + @Override + public SchemaPartition getSchemaPartition(String database) { + return null; + } }; } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java index 585898e2b089..4c483f4c8fa9 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java @@ -14,6 +14,7 @@ package org.apache.iotdb.db.queryengine.plan.relational.analyzer; +import org.apache.iotdb.commons.partition.SchemaPartition; import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory; import org.apache.iotdb.commons.udf.builtin.BuiltinAggregationFunction; import org.apache.iotdb.db.queryengine.common.MPPQueryContext; @@ -34,6 +35,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.type.TypeNotFoundException; import org.apache.iotdb.db.queryengine.plan.relational.type.TypeSignature; +import org.apache.tsfile.file.metadata.IDeviceID; import org.apache.tsfile.file.metadata.StringArrayDeviceID; import org.apache.tsfile.read.common.type.BinaryType; import org.apache.tsfile.read.common.type.Type; @@ -198,6 +200,22 @@ public void validateDeviceSchema( throw new UnsupportedOperationException(); } + @Override + public SchemaPartition getOrCreateSchemaPartition( + String database, List deviceIDList, String userName) { + return null; + } + + @Override + public SchemaPartition getSchemaPartition(String database, List deviceIDList) { + return null; + } + + @Override + public SchemaPartition getSchemaPartition(String database) { + return null; + } + public static boolean isTwoNumericType(List argumentTypes) { return argumentTypes.size() == 2 && isNumericType(argumentTypes.get(0)) diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaPartition.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaPartition.java index 4c47941ca3a7..ca4cd74bb100 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaPartition.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaPartition.java @@ -63,6 +63,21 @@ public void setSchemaPartitionMap( this.schemaPartitionMap = schemaPartitionMap; } + // table model usage + + /** + * For table model usage. + * + *

The database shall start with "root.". Concat this to a user-provided db name if necessary. + * + *

The device id shall be [table, seg1, ....] + */ + public TRegionReplicaSet getSchemaRegionReplicaSet(String database, IDeviceID deviceID) { + // todo implement this interface, @Potato + throw new UnsupportedOperationException(); + } + + // [root, db, ....] public TRegionReplicaSet getSchemaRegionReplicaSet(IDeviceID deviceID) { // A list of data region replica sets will store data in a same time partition. // We will insert data to the last set in the list.