You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hu...@apache.org on 2023/04/03 16:42:29 UTC
[iotdb] branch master updated: [IOTDB-5080] [IoTDB ML] Support model management SQL on DataNode (#9429)
This is an automated email from the ASF dual-hosted git repository.
hui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 79f7507a09 [IOTDB-5080] [IoTDB ML] Support model management SQL on DataNode (#9429)
79f7507a09 is described below
commit 79f7507a09a19e21396d231dd3af1bf15e7842a9
Author: liuminghui233 <36...@users.noreply.github.com>
AuthorDate: Tue Apr 4 00:42:19 2023 +0800
[IOTDB-5080] [IoTDB ML] Support model management SQL on DataNode (#9429)
---
.../org/apache/iotdb/db/qp/sql/IdentifierParser.g4 | 4 +
.../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 | 549 ++++++++++++---------
.../antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 | 16 +
.../iotdb/confignode/persistence/ModelInfo.java | 14 +-
.../procedure/impl/model/CreateModelProcedure.java | 2 +-
.../procedure/impl/model/DropModelProcedure.java | 27 +-
.../procedure/state/model/DropModelState.java | 1 -
.../procedure/store/ProcedureFactory.java | 16 +-
mlnode/iotdb/mlnode/service.py | 2 +-
.../iotdb/commons/model/ModelHyperparameter.java | 10 +
.../iotdb/commons/model/ModelInformation.java | 89 +++-
.../iotdb/commons/model/TrailInformation.java | 7 +-
.../apache/iotdb/db/client/ConfigNodeClient.java | 58 ++-
.../org/apache/iotdb/db/client/MLNodeClient.java | 18 +-
.../db/mpp/common/header/ColumnHeaderConstant.java | 25 +
.../db/mpp/common/header/DatasetHeaderFactory.java | 8 +
.../apache/iotdb/db/mpp/plan/analyze/Analyzer.java | 16 +-
.../plan/execution/config/ConfigTaskVisitor.java | 30 ++
.../config/executor/ClusterConfigTaskExecutor.java | 111 +++++
.../config/executor/IConfigTaskExecutor.java | 9 +
.../config/metadata/model/CreateModelTask.java | 42 ++
.../config/metadata/model/DropModelTask.java | 28 +-
.../config/metadata/model/ShowModelsTask.java | 96 ++++
.../config/metadata/model/ShowTrailsTask.java | 90 ++++
.../ConcatExpressionWithSuffixPathsVisitor.java | 3 +-
.../iotdb/db/mpp/plan/parser/ASTVisitor.java | 105 ++--
.../db/mpp/plan/parser/StatementGenerator.java | 52 +-
.../db/mpp/plan/statement/StatementVisitor.java | 21 +
.../metadata/model/CreateModelStatement.java | 107 ++++
.../metadata/model/DropModelStatement.java | 57 +++
.../metadata/model/ShowModelsStatement.java | 49 ++
.../metadata/model/ShowTrailsStatement.java | 57 +++
.../impl/DataNodeInternalRPCServiceImpl.java | 3 +-
33 files changed, 1329 insertions(+), 393 deletions(-)
diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4 b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4
index 73a94b23f8..f3f0325324 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4
@@ -43,6 +43,7 @@ keyWords
| AS
| ASC
| ATTRIBUTES
+ | AUTO
| BEFORE
| BEGIN
| BLOCKED
@@ -116,6 +117,8 @@ keyWords
| LOCK
| MERGE
| METADATA
+ | MODEL
+ | MODELS
| NODES
| NONE
| NOW
@@ -188,6 +191,7 @@ keyWords
| TOLERANCE
| TOP
| TRACING
+ | TRAILS
| TRIGGER
| TRIGGERS
| TTL
diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
index 00a9d5d481..212099ba97 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
@@ -36,21 +36,33 @@ statement
;
ddlStatement
- : createStorageGroup | createTimeseries | createSchemaTemplate | createTimeseriesOfSchemaTemplate
- | createFunction | createTrigger | createPipePlugin | createContinuousQuery
- | alterTimeseries | alterStorageGroup | deleteStorageGroup | deleteTimeseries | deletePartition | deleteTimeseriesOfSchemaTemplate
- | dropFunction | dropTrigger | dropPipePlugin | dropContinuousQuery | dropSchemaTemplate
- | setTTL | unsetTTL | startTrigger | stopTrigger | setSchemaTemplate | unsetSchemaTemplate
- | showStorageGroup | showDevices | showTimeseries | showChildPaths | showChildNodes
- | showFunctions | showTriggers | showPipePlugins | showContinuousQueries | showTTL | showAllTTL | showCluster | showVariables | showRegion | showDataNodes | showConfigNodes
- | showSchemaTemplates | showNodesInSchemaTemplate
- | showPathsUsingSchemaTemplate | showPathsSetSchemaTemplate
- | countStorageGroup | countDevices | countTimeseries | countNodes
+ // Database
+ : createDatabase | dropDatabase | dropPartition | alterDatabase | showDatabases | countDatabases
+ // Timeseries & Path
+ | createTimeseries | dropTimeseries | alterTimeseries
+ | showDevices | showTimeseries | showChildPaths | showChildNodes | countDevices | countTimeseries | countNodes
+ // Schema Template
+ | createSchemaTemplate | createTimeseriesOfSchemaTemplate | dropSchemaTemplate | dropTimeseriesOfSchemaTemplate
+ | showSchemaTemplates | showNodesInSchemaTemplate | showPathsUsingSchemaTemplate | showPathsSetSchemaTemplate
+ | setSchemaTemplate | unsetSchemaTemplate
+ // TTL
+ | setTTL | unsetTTL | showTTL | showAllTTL
+ // Function
+ | createFunction | dropFunction | showFunctions
+ // Trigger
+ | createTrigger | dropTrigger | showTriggers | startTrigger | stopTrigger
+ // CQ
+ | createContinuousQuery | dropContinuousQuery | showContinuousQueries
+ // Cluster
+ | showVariables | showCluster | showRegions | showDataNodes | showConfigNodes
| getRegionId | getTimeSlotList | getSeriesSlotList | migrateRegion
+ // ML Model
+ | createModel | dropModel | showModels | showTrails
;
dmlStatement
- : selectStatement | insertStatement | deleteStatement;
+ : selectStatement | insertStatement | deleteStatement
+ ;
dclStatement
: createUser | createRole | alterUser | grantUser | grantRole | grantRoleToUser
@@ -62,36 +74,70 @@ utilityStatement
: merge | fullMerge | flush | clearCache | settle | explain
| setSystemStatus | showVersion | showFlushInfo | showLockInfo | showQueryResource
| showQueries | killQuery | grantWatermarkEmbedding | revokeWatermarkEmbedding
- | loadConfiguration | loadTimeseries | loadFile | removeFile | unloadFile;
+ | loadConfiguration | loadTimeseries | loadFile | removeFile | unloadFile
+ ;
syncStatement
: createPipeSink | showPipeSinkType | showPipeSink | dropPipeSink
- | createPipe | showPipe | stopPipe | startPipe | dropPipe;
+ | createPipe | showPipe | stopPipe | startPipe | dropPipe
+ ;
/**
* 2. Data Definition Language (DDL)
*/
-// Create Storage Group
-createStorageGroup
- : SET STORAGE GROUP TO prefixPath storageGroupAttributesClause?
- | CREATE (STORAGE GROUP | DATABASE) prefixPath storageGroupAttributesClause?
+// Database =========================================================================================
+// ---- Create Database
+createDatabase
+ : SET STORAGE GROUP TO prefixPath databaseAttributesClause?
+ | CREATE (STORAGE GROUP | DATABASE) prefixPath databaseAttributesClause?
+ ;
+
+databaseAttributesClause
+ : WITH databaseAttributeClause (COMMA? databaseAttributeClause)*
+ ;
+
+databaseAttributeClause
+ : databaseAttributeKey operator_eq INTEGER_LITERAL
+ ;
+
+databaseAttributeKey
+ : TTL
+ | SCHEMA_REPLICATION_FACTOR
+ | DATA_REPLICATION_FACTOR
+ | TIME_PARTITION_INTERVAL
+ | SCHEMA_REGION_GROUP_NUM
+ | DATA_REGION_GROUP_NUM
+ ;
+
+// ---- Drop Database
+dropDatabase
+ : (DELETE | DROP) (STORAGE GROUP | DATABASE) prefixPath (COMMA prefixPath)*
+ ;
+
+// ---- Drop Partition
+dropPartition
+ : (DELETE | DROP) PARTITION prefixPath INTEGER_LITERAL(COMMA INTEGER_LITERAL)*
;
-storageGroupAttributesClause
- : WITH storageGroupAttributeClause (COMMA? storageGroupAttributeClause)*
+// ---- Alter Database
+alterDatabase
+ : ALTER (STORAGE GROUP | DATABASE) prefixPath databaseAttributesClause
;
-storageGroupAttributeClause
- : (TTL | SCHEMA_REPLICATION_FACTOR | DATA_REPLICATION_FACTOR | TIME_PARTITION_INTERVAL | SCHEMA_REGION_GROUP_NUM | DATA_REGION_GROUP_NUM) '=' INTEGER_LITERAL
+// ---- Show Databases
+showDatabases
+ : SHOW (STORAGE GROUP | DATABASES) DETAILS? prefixPath?
;
-// Alter StorageGroup
-alterStorageGroup
- : ALTER (STORAGE GROUP | DATABASE) prefixPath storageGroupAttributesClause
+// ---- Count Databases
+countDatabases
+ : COUNT (STORAGE GROUP | DATABASES) prefixPath?
;
-// Create Timeseries
+
+// Timeseries & Path ===============================================================================
+// ---- Create Timeseries
createTimeseries
: CREATE ALIGNED TIMESERIES fullPath alignedMeasurements? #createAlignedTimeseries
| CREATE TIMESERIES fullPath attributeClauses #createNonAlignedTimeseries
@@ -102,333 +148,347 @@ alignedMeasurements
(COMMA nodeNameWithoutWildcard attributeClauses)* RR_BRACKET
;
-// Create Schema Template
-createSchemaTemplate
- : CREATE SCHEMA TEMPLATE templateName=identifier
- ALIGNED? LR_BRACKET templateMeasurementClause (COMMA templateMeasurementClause)* RR_BRACKET
+// ---- Drop Timeseries
+dropTimeseries
+ : (DELETE | DROP) TIMESERIES prefixPath (COMMA prefixPath)*
;
-templateMeasurementClause
- : nodeNameWithoutWildcard attributeClauses
+// ---- Alter Timeseries
+alterTimeseries
+ : ALTER TIMESERIES fullPath alterClause
;
-// Create Timeseries Of Schema Template
-createTimeseriesOfSchemaTemplate
- : CREATE TIMESERIES OF SCHEMA TEMPLATE ON prefixPath
+alterClause
+ : RENAME beforeName=attributeKey TO currentName=attributeKey
+ | SET attributePair (COMMA attributePair)*
+ | DROP attributeKey (COMMA attributeKey)*
+ | ADD TAGS attributePair (COMMA attributePair)*
+ | ADD ATTRIBUTES attributePair (COMMA attributePair)*
+ | UPSERT aliasClause? tagClause? attributeClause?
;
-// Create Function
-createFunction
- : CREATE FUNCTION udfName=identifier AS className=STRING_LITERAL uriClause?
+aliasClause
+ : ALIAS operator_eq alias
;
-uriClause
- : USING URI uri
+// ---- Show Devices
+showDevices
+ : SHOW DEVICES prefixPath? (WITH (STORAGE GROUP | DATABASE))? rowPaginationClause?
;
-uri
- : STRING_LITERAL
+// ---- Show Timeseries
+showTimeseries
+ : SHOW LATEST? TIMESERIES prefixPath? tagWhereClause? rowPaginationClause?
;
-// Create Trigger
-createTrigger
- : CREATE triggerType? TRIGGER triggerName=identifier
- triggerEventClause
- ON prefixPath
- AS className=STRING_LITERAL
- uriClause?
- triggerAttributeClause?
+// ---- Show Child Paths
+showChildPaths
+ : SHOW CHILD PATHS prefixPath?
;
-triggerType
- : STATELESS | STATEFUL
+// ---- Show Child Nodes
+showChildNodes
+ : SHOW CHILD NODES prefixPath?
;
-triggerEventClause
- : (BEFORE | AFTER) (INSERT | DELETE)
+// ---- Count Devices
+countDevices
+ : COUNT DEVICES prefixPath?
;
-triggerAttributeClause
- : WITH LR_BRACKET triggerAttribute (COMMA triggerAttribute)* RR_BRACKET
+// ---- Count Timeseries
+countTimeseries
+ : COUNT TIMESERIES prefixPath? tagWhereClause? (GROUP BY LEVEL operator_eq INTEGER_LITERAL)?
;
-triggerAttribute
- : key=attributeKey operator_eq value=attributeValue
+// ---- Count Nodes
+countNodes
+ : COUNT NODES prefixPath LEVEL operator_eq INTEGER_LITERAL
;
-// Create Pipe Plugin
-createPipePlugin
- : CREATE PIPEPLUGIN pluginName=identifier AS className=STRING_LITERAL uriClause
+tagWhereClause
+ : WHERE (attributePair | containsExpression)
;
-// Create Continuous Query
-createContinuousQuery
- : CREATE (CONTINUOUS QUERY | CQ) cqId=identifier
- resampleClause?
- timeoutPolicyClause?
- BEGIN
- selectStatement
- END
- ;
-resampleClause
- : RESAMPLE
- (EVERY everyInterval=DURATION_LITERAL)?
- (BOUNDARY boundaryTime=timeValue)?
- (RANGE startTimeOffset=DURATION_LITERAL (COMMA endTimeOffset=DURATION_LITERAL)?)?
+// Schema Template ==================================================================================
+// ---- Create Schema Template
+createSchemaTemplate
+ : CREATE SCHEMA TEMPLATE templateName=identifier
+ ALIGNED? LR_BRACKET templateMeasurementClause (COMMA templateMeasurementClause)* RR_BRACKET
;
-timeoutPolicyClause
- : TIMEOUT POLICY (BLOCKED | DISCARD)
+templateMeasurementClause
+ : nodeNameWithoutWildcard attributeClauses
;
-// Alter Timeseries
-alterTimeseries
- : ALTER TIMESERIES fullPath alterClause
+// ---- Create Timeseries Of Schema Template
+createTimeseriesOfSchemaTemplate
+ : CREATE TIMESERIES OF SCHEMA TEMPLATE ON prefixPath
;
-alterClause
- : RENAME beforeName=attributeKey TO currentName=attributeKey
- | SET attributePair (COMMA attributePair)*
- | DROP attributeKey (COMMA attributeKey)*
- | ADD TAGS attributePair (COMMA attributePair)*
- | ADD ATTRIBUTES attributePair (COMMA attributePair)*
- | UPSERT aliasClause? tagClause? attributeClause?
+// ---- Drop Schema Template
+dropSchemaTemplate
+ : DROP SCHEMA TEMPLATE templateName=identifier
;
-aliasClause
- : ALIAS operator_eq alias
+// ---- Drop Timeseries of Schema Template
+dropTimeseriesOfSchemaTemplate
+ : ((DELETE | DROP) TIMESERIES OF | DEACTIVATE) SCHEMA TEMPLATE (templateName=identifier) ? FROM prefixPath (COMMA prefixPath)*
;
-alias
- : constant
- | identifier
+// ---- Show Schema Template
+showSchemaTemplates
+ : SHOW SCHEMA TEMPLATES
;
-// Delete Storage Group
-deleteStorageGroup
- : (DELETE | DROP) (STORAGE GROUP | DATABASE) prefixPath (COMMA prefixPath)*
+// ---- Show Measurements In Schema Template
+showNodesInSchemaTemplate
+ : SHOW NODES OPERATOR_IN SCHEMA TEMPLATE templateName=identifier
;
-// Delete Timeseries
-deleteTimeseries
- : (DELETE | DROP) TIMESERIES prefixPath (COMMA prefixPath)*
+// ---- Show Paths Set Schema Template
+showPathsSetSchemaTemplate
+ : SHOW PATHS SET SCHEMA TEMPLATE templateName=identifier
;
-// Delete Partition
-deletePartition
- : DELETE PARTITION prefixPath INTEGER_LITERAL(COMMA INTEGER_LITERAL)*
+// ---- Show Paths Using Schema Template
+showPathsUsingSchemaTemplate
+ : SHOW PATHS prefixPath? USING SCHEMA TEMPLATE templateName=identifier
;
-// Delete Timeseries of Schema Template
-deleteTimeseriesOfSchemaTemplate
- : (DELETE TIMESERIES OF | DEACTIVATE) SCHEMA TEMPLATE (templateName=identifier) ? FROM prefixPath (COMMA prefixPath)*
+// ---- Set Schema Template
+setSchemaTemplate
+ : SET SCHEMA TEMPLATE templateName=identifier TO prefixPath
;
-// Drop Function
-dropFunction
- : DROP FUNCTION udfName=identifier
+// ---- Unset Schema Template
+unsetSchemaTemplate
+ : UNSET SCHEMA TEMPLATE templateName=identifier FROM prefixPath
;
-// Drop Pipe Plugin
-dropPipePlugin
- : DROP PIPEPLUGIN pluginName=identifier
+
+// TTL =============================================================================================
+// ---- Set TTL
+setTTL
+ : SET TTL TO path=prefixPath time=INTEGER_LITERAL
;
-// Drop Trigger
-dropTrigger
- : DROP TRIGGER triggerName=identifier
+// ---- Unset TTL
+unsetTTL
+ : UNSET TTL TO path=prefixPath
;
-// Drop Continuous Query
-dropContinuousQuery
- : DROP (CONTINUOUS QUERY|CQ) cqId=identifier
+// ---- Show TTL
+showTTL
+ : SHOW TTL ON prefixPath (COMMA prefixPath)*
;
-// Drop Schema Template
-dropSchemaTemplate
- : DROP SCHEMA TEMPLATE templateName=identifier
+// ---- Show All TTL
+showAllTTL
+ : SHOW ALL TTL
;
-// Get Region Id
-getRegionId
- : SHOW (DATA|SCHEMA) REGIONID OF path=prefixPath WHERE (SERIESSLOTID operator_eq
- seriesSlot=INTEGER_LITERAL|DEVICEID operator_eq deviceId=prefixPath) (OPERATOR_AND (TIMESLOTID operator_eq timeSlot=INTEGER_LITERAL|
- TIMESTAMP operator_eq timeStamp=INTEGER_LITERAL))?
+
+// Function =========================================================================================
+// ---- Create Function
+createFunction
+ : CREATE FUNCTION udfName=identifier AS className=STRING_LITERAL uriClause?
;
-// Get Time Slot List
-getTimeSlotList
- : SHOW TIMESLOTID OF path=prefixPath WHERE SERIESSLOTID operator_eq seriesSlot=INTEGER_LITERAL
- (OPERATOR_AND STARTTIME operator_eq startTime=INTEGER_LITERAL)?
- (OPERATOR_AND ENDTIME operator_eq endTime=INTEGER_LITERAL)?
+uriClause
+ : USING URI uri
;
-// Get Series Slot List
-getSeriesSlotList
- : SHOW (DATA|SCHEMA)? SERIESSLOTID OF path=prefixPath
+uri
+ : STRING_LITERAL
;
-// Migrate Region
-migrateRegion
- : MIGRATE REGION regionId=INTEGER_LITERAL FROM fromId=INTEGER_LITERAL TO toId=INTEGER_LITERAL
+// ---- Drop Function
+dropFunction
+ : DROP FUNCTION udfName=identifier
;
-// Set TTL
-setTTL
- : SET TTL TO path=prefixPath time=INTEGER_LITERAL
+// ---- Show Functions
+showFunctions
+ : SHOW FUNCTIONS
;
-// Unset TTL
-unsetTTL
- : UNSET TTL TO path=prefixPath
+
+// Trigger =========================================================================================
+// ---- Create Trigger
+createTrigger
+ : CREATE triggerType? TRIGGER triggerName=identifier
+ triggerEventClause
+ ON prefixPath
+ AS className=STRING_LITERAL
+ uriClause?
+ triggerAttributeClause?
;
-// Set Schema Template
-setSchemaTemplate
- : SET SCHEMA TEMPLATE templateName=identifier TO prefixPath
+triggerType
+ : STATELESS | STATEFUL
;
-// Unset Schema Template
-unsetSchemaTemplate
- : UNSET SCHEMA TEMPLATE templateName=identifier FROM prefixPath
+triggerEventClause
+ : (BEFORE | AFTER) (INSERT | DELETE)
;
-// Start Trigger
-startTrigger
- : START TRIGGER triggerName=identifier
+triggerAttributeClause
+ : WITH LR_BRACKET triggerAttribute (COMMA triggerAttribute)* RR_BRACKET
;
-// Stop Trigger
-stopTrigger
- : STOP TRIGGER triggerName=identifier
+triggerAttribute
+ : key=attributeKey operator_eq value=attributeValue
;
-// Show Storage Group
-showStorageGroup
- : SHOW (STORAGE GROUP | DATABASES) DETAILS? prefixPath?
+// ---- Drop Trigger
+dropTrigger
+ : DROP TRIGGER triggerName=identifier
;
-// Show Devices
-showDevices
- : SHOW DEVICES prefixPath? (WITH (STORAGE GROUP | DATABASE))? rowPaginationClause?
+// ---- Show Triggers
+showTriggers
+ : SHOW TRIGGERS
;
-// Show Timeseries
-showTimeseries
- : SHOW LATEST? TIMESERIES prefixPath? tagWhereClause? rowPaginationClause?
+// ---- Start Trigger
+startTrigger
+ : START TRIGGER triggerName=identifier
;
-// Show Child Paths
-showChildPaths
- : SHOW CHILD PATHS prefixPath?
+// ---- Stop Trigger
+stopTrigger
+ : STOP TRIGGER triggerName=identifier
;
-// Show Child Nodes
-showChildNodes
- : SHOW CHILD NODES prefixPath?
+
+// CQ ==============================================================================================
+// ---- Create Continuous Query
+createContinuousQuery
+ : CREATE (CONTINUOUS QUERY | CQ) cqId=identifier
+ resampleClause?
+ timeoutPolicyClause?
+ BEGIN
+ selectStatement
+ END
;
-// Show Functions
-showFunctions
- : SHOW FUNCTIONS
+resampleClause
+ : RESAMPLE
+ (EVERY everyInterval=DURATION_LITERAL)?
+ (BOUNDARY boundaryTime=timeValue)?
+ (RANGE startTimeOffset=DURATION_LITERAL (COMMA endTimeOffset=DURATION_LITERAL)?)?
;
-// Show Triggers
-showTriggers
- : SHOW TRIGGERS
+timeoutPolicyClause
+ : TIMEOUT POLICY (BLOCKED | DISCARD)
;
-// Show Pipe Plugins
-showPipePlugins
- : SHOW PIPEPLUGINS
+// ---- Drop Continuous Query
+dropContinuousQuery
+ : DROP (CONTINUOUS QUERY|CQ) cqId=identifier
;
-// Show Continuous Queries
+// ---- Show Continuous Queries
showContinuousQueries
: SHOW (CONTINUOUS QUERIES | CQS)
;
-// Show TTL
-showTTL
- : SHOW TTL ON prefixPath (COMMA prefixPath)*
- ;
-// Show All TTL
-showAllTTL
- : SHOW ALL TTL
- ;
-
-// Show Variables
+// Cluster =========================================================================================
+// ---- Show Variables
showVariables
: SHOW VARIABLES
;
-// Show Cluster
+// ---- Show Cluster
showCluster
: SHOW CLUSTER (DETAILS)?
;
-// Show Region
-showRegion
+// ---- Show Regions
+showRegions
: SHOW (SCHEMA | DATA)? REGIONS (OF (STORAGE GROUP | DATABASE) prefixPath? (COMMA prefixPath)*)?
(ON NODEID INTEGER_LITERAL (COMMA INTEGER_LITERAL)*)?
;
-// Show Data Nodes
+// ---- Show Data Nodes
showDataNodes
: SHOW DATANODES
;
-// Show Config Nodes
+// ---- Show Config Nodes
showConfigNodes
: SHOW CONFIGNODES
;
-// Show Schema Template
-showSchemaTemplates
- : SHOW SCHEMA TEMPLATES
+// ---- Get Region Id
+getRegionId
+ : SHOW (DATA|SCHEMA) REGIONID OF path=prefixPath WHERE (SERIESSLOTID operator_eq
+ seriesSlot=INTEGER_LITERAL|DEVICEID operator_eq deviceId=prefixPath) (OPERATOR_AND (TIMESLOTID operator_eq timeSlot=INTEGER_LITERAL|
+ TIMESTAMP operator_eq timeStamp=INTEGER_LITERAL))?
;
-// Show Measurements In Schema Template
-showNodesInSchemaTemplate
- : SHOW NODES OPERATOR_IN SCHEMA TEMPLATE templateName=identifier
+// ---- Get Time Slot List
+getTimeSlotList
+ : SHOW TIMESLOTID OF path=prefixPath WHERE SERIESSLOTID operator_eq seriesSlot=INTEGER_LITERAL
+ (OPERATOR_AND STARTTIME operator_eq startTime=INTEGER_LITERAL)?
+ (OPERATOR_AND ENDTIME operator_eq endTime=INTEGER_LITERAL)?
;
-// Show Paths Set Schema Template
-showPathsSetSchemaTemplate
- : SHOW PATHS SET SCHEMA TEMPLATE templateName=identifier
+// ---- Get Series Slot List
+getSeriesSlotList
+ : SHOW (DATA|SCHEMA)? SERIESSLOTID OF path=prefixPath
;
-// Show Paths Using Schema Template
-showPathsUsingSchemaTemplate
- : SHOW PATHS prefixPath? USING SCHEMA TEMPLATE templateName=identifier
+// ---- Migrate Region
+migrateRegion
+ : MIGRATE REGION regionId=INTEGER_LITERAL FROM fromId=INTEGER_LITERAL TO toId=INTEGER_LITERAL
;
-// Count Storage Group
-countStorageGroup
- : COUNT (STORAGE GROUP | DATABASES) prefixPath?
+
+// Pipe Plugin =========================================================================================
+// Create Pipe Plugin
+createPipePlugin
+ : CREATE PIPEPLUGIN pluginName=identifier AS className=STRING_LITERAL uriClause
;
-// Count Devices
-countDevices
- : COUNT DEVICES prefixPath?
+// Drop Pipe Plugin
+dropPipePlugin
+ : DROP PIPEPLUGIN pluginName=identifier
;
-// Count Timeseries
-countTimeseries
- : COUNT TIMESERIES prefixPath? tagWhereClause? (GROUP BY LEVEL operator_eq INTEGER_LITERAL)?
+// Show Pipe Plugins
+showPipePlugins
+ : SHOW PIPEPLUGINS
;
-// Count Nodes
-countNodes
- : COUNT NODES prefixPath LEVEL operator_eq INTEGER_LITERAL
+
+// ML Model =========================================================================================
+// ---- Create Model
+createModel
+ : CREATE AUTO? MODEL modelId=identifier
+ WITH attributePair (COMMA attributePair)*
+ BEGIN
+ selectStatement
+ END
;
-tagWhereClause
- : WHERE (attributePair | containsExpression)
+// ---- Drop Model
+dropModel
+ : DROP MODEL modelId=identifier
;
+// ---- Show Models
+showModels
+ : SHOW MODELS
+ ;
+
+// ---- Show Trails
+showTrails
+ : SHOW TRAILS modelId=identifier
+ ;
/**
* 3. Data Manipulation Language (DML)
@@ -852,6 +912,30 @@ showPipe
: SHOW ((PIPE pipeName=identifier) | PIPES (WHERE CONNECTOR USED BY pipeName=identifier)?)
;
+collectorAttributesClause
+ : WITH COLLECTOR LR_BRACKET (collectorAttributeClause COMMA)* collectorAttributeClause? RR_BRACKET
+ ;
+
+collectorAttributeClause
+ : collectorKey=STRING_LITERAL OPERATOR_SEQ collectorValue=STRING_LITERAL
+ ;
+
+processorAttributesClause
+ : WITH PROCESSOR LR_BRACKET (processorAttributeClause COMMA)* processorAttributeClause? RR_BRACKET
+ ;
+
+processorAttributeClause
+ : processorKey=STRING_LITERAL OPERATOR_SEQ processorValue=STRING_LITERAL
+ ;
+
+connectorAttributesClause
+ : WITH CONNECTOR LR_BRACKET (connectorAttributeClause COMMA)* connectorAttributeClause? RR_BRACKET
+ ;
+
+connectorAttributeClause
+ : connectorKey=STRING_LITERAL OPERATOR_SEQ connectorValue=STRING_LITERAL
+ ;
+
stopPipe
: STOP PIPE pipeName=identifier
;
@@ -889,10 +973,6 @@ prefixPath
: ROOT (DOT nodeName)*
;
-suffixPath
- : nodeName (DOT nodeName)*
- ;
-
intoPath
: ROOT (DOT nodeNameInIntoPath)* #fullPathInIntoPath
| nodeNameInIntoPath (DOT nodeNameInIntoPath)* #suffixPathInIntoPath
@@ -1037,28 +1117,9 @@ attributeValue
| constant
;
-collectorAttributesClause
- : WITH COLLECTOR LR_BRACKET (collectorAttributeClause COMMA)* collectorAttributeClause? RR_BRACKET
- ;
-
-collectorAttributeClause
- : collectorKey=STRING_LITERAL OPERATOR_SEQ collectorValue=STRING_LITERAL
- ;
-
-processorAttributesClause
- : WITH PROCESSOR LR_BRACKET (processorAttributeClause COMMA)* processorAttributeClause? RR_BRACKET
- ;
-
-processorAttributeClause
- : processorKey=STRING_LITERAL OPERATOR_SEQ processorValue=STRING_LITERAL
- ;
-
-connectorAttributesClause
- : WITH CONNECTOR LR_BRACKET (connectorAttributeClause COMMA)* connectorAttributeClause? RR_BRACKET
- ;
-
-connectorAttributeClause
- : connectorKey=STRING_LITERAL OPERATOR_SEQ connectorValue=STRING_LITERAL
+alias
+ : constant
+ | identifier
;
subStringExpression
diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
index 7024c37c0d..8716e22c61 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
@@ -85,6 +85,10 @@ ATTRIBUTES
: A T T R I B U T E S
;
+AUTO
+ : A U T O
+ ;
+
BEFORE
: B E F O R E
;
@@ -390,6 +394,14 @@ MIGRATE
: M I G R A T E
;
+MODEL
+ : M O D E L
+ ;
+
+MODELS
+ : M O D E L S
+ ;
+
NODEID
: N O D E I D
;
@@ -706,6 +718,10 @@ TRACING
: T R A C I N G
;
+TRAILS
+ : T R A I L S
+ ;
+
TRIGGER
: T R I G G E R
;
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ModelInfo.java b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ModelInfo.java
index 58e3ec4e6b..3c72e09570 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ModelInfo.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ModelInfo.java
@@ -84,7 +84,7 @@ public class ModelInfo implements SnapshotProcessor {
return new TSStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode())
.setMessage(errorMessage);
}
- return null;
+ return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
}
public TSStatus dropModel(DropModelPlan plan) {
@@ -122,7 +122,17 @@ public class ModelInfo implements SnapshotProcessor {
public TrailTableResp showTrail(ShowTrailPlan plan) {
acquireModelTableLock();
try {
- ModelInformation modelInformation = modelTable.getModelInformationById(plan.getModelId());
+ String modelId = plan.getModelId();
+ ModelInformation modelInformation = modelTable.getModelInformationById(modelId);
+ if (modelInformation == null) {
+ return new TrailTableResp(
+ new TSStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode())
+ .setMessage(
+ String.format(
+ "Failed to show trails of model [%s], this model has not been created.",
+ modelId)));
+ }
+
TrailTableResp trailTableResp =
new TrailTableResp(new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()));
if (plan.isSetTrailId()) {
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/model/CreateModelProcedure.java b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/model/CreateModelProcedure.java
index 0a4d306fde..7dff5fe06e 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/model/CreateModelProcedure.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/model/CreateModelProcedure.java
@@ -49,7 +49,7 @@ import java.util.Objects;
public class CreateModelProcedure extends AbstractNodeProcedure<CreateModelState> {
private static final Logger LOGGER = LoggerFactory.getLogger(CreateModelProcedure.class);
- private static final int RETRY_THRESHOLD = 5;
+ private static final int RETRY_THRESHOLD = 1;
private ModelInformation modelInformation;
private Map<String, String> modelConfigs;
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/model/DropModelProcedure.java b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/model/DropModelProcedure.java
index 1268368bd6..bfa461a8b2 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/model/DropModelProcedure.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/model/DropModelProcedure.java
@@ -21,19 +21,16 @@ package org.apache.iotdb.confignode.procedure.impl.model;
import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
-import org.apache.iotdb.common.rpc.thrift.TrainingState;
import org.apache.iotdb.commons.model.exception.ModelManagementException;
import org.apache.iotdb.confignode.client.DataNodeRequestType;
import org.apache.iotdb.confignode.client.sync.SyncDataNodeClientPool;
import org.apache.iotdb.confignode.consensus.request.write.model.DropModelPlan;
-import org.apache.iotdb.confignode.consensus.request.write.model.UpdateModelStatePlan;
import org.apache.iotdb.confignode.persistence.ModelInfo;
import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv;
import org.apache.iotdb.confignode.procedure.exception.ProcedureException;
import org.apache.iotdb.confignode.procedure.impl.node.AbstractNodeProcedure;
import org.apache.iotdb.confignode.procedure.state.model.DropModelState;
import org.apache.iotdb.confignode.procedure.store.ProcedureType;
-import org.apache.iotdb.confignode.rpc.thrift.TUpdateModelStateReq;
import org.apache.iotdb.consensus.common.response.ConsensusWriteResponse;
import org.apache.iotdb.db.client.MLNodeClient;
import org.apache.iotdb.mpp.rpc.thrift.TDeleteModelMetricsReq;
@@ -53,7 +50,7 @@ import java.util.Optional;
public class DropModelProcedure extends AbstractNodeProcedure<DropModelState> {
private static final Logger LOGGER = LoggerFactory.getLogger(DropModelProcedure.class);
- private static final int RETRY_THRESHOLD = 5;
+ private static final int RETRY_THRESHOLD = 1;
private String modelId;
@@ -87,25 +84,6 @@ public class DropModelProcedure extends AbstractNodeProcedure<DropModelState> {
break;
case VALIDATED:
- LOGGER.info("Change state of model [{}] to DROPPING", modelId);
-
- ConsensusWriteResponse response =
- env.getConfigManager()
- .getConsensusManager()
- .write(
- new UpdateModelStatePlan(
- new TUpdateModelStateReq(modelId, TrainingState.DROPPING)));
- if (!response.isSuccessful()) {
- throw new ModelManagementException(
- String.format(
- "Failed to drop model [%s], fail to modify model state: %s",
- modelId, response.getErrorMessage()));
- }
-
- setNextState(DropModelState.CONFIG_NODE_DROPPING);
- break;
-
- case CONFIG_NODE_DROPPING:
LOGGER.info("Start to drop model metrics [{}] on Data Nodes", modelId);
Optional<TDataNodeLocation> targetDataNode =
@@ -153,7 +131,8 @@ public class DropModelProcedure extends AbstractNodeProcedure<DropModelState> {
case ML_NODE_DROPPED:
LOGGER.info("Start to drop model [{}] on Config Nodes", modelId);
- response = env.getConfigManager().getConsensusManager().write(new DropModelPlan(modelId));
+ ConsensusWriteResponse response =
+ env.getConfigManager().getConsensusManager().write(new DropModelPlan(modelId));
if (!response.isSuccessful()) {
throw new ModelManagementException(
String.format(
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/model/DropModelState.java b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/model/DropModelState.java
index 5f8c5a6f6e..54e32e86da 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/model/DropModelState.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/model/DropModelState.java
@@ -22,7 +22,6 @@ package org.apache.iotdb.confignode.procedure.state.model;
public enum DropModelState {
INIT,
VALIDATED,
- CONFIG_NODE_DROPPING,
DATA_NODE_DROPPED,
ML_NODE_DROPPED,
CONFIG_NODE_DROPPED
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
index 42a421891f..9ef0b7422d 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
@@ -113,18 +113,18 @@ public class ProcedureFactory implements IProcedureFactory {
case UNSET_TEMPLATE_PROCEDURE:
procedure = new UnsetTemplateProcedure();
break;
- case CREATE_MODEL_PROCEDURE:
- procedure = new CreateModelProcedure();
- break;
- case DROP_MODEL_PROCEDURE:
- procedure = new DropModelProcedure();
- break;
case CREATE_PIPE_PLUGIN_PROCEDURE:
procedure = new CreatePipePluginProcedure();
break;
case DROP_PIPE_PLUGIN_PROCEDURE:
procedure = new DropPipePluginProcedure();
break;
+ case CREATE_MODEL_PROCEDURE:
+ procedure = new CreateModelProcedure();
+ break;
+ case DROP_MODEL_PROCEDURE:
+ procedure = new DropModelProcedure();
+ break;
default:
LOGGER.error("unknown Procedure type: " + typeCode);
throw new IOException("unknown Procedure type: " + typeCode);
@@ -170,6 +170,10 @@ public class ProcedureFactory implements IProcedureFactory {
return ProcedureType.CREATE_PIPE_PLUGIN_PROCEDURE;
} else if (procedure instanceof DropPipePluginProcedure) {
return ProcedureType.DROP_PIPE_PLUGIN_PROCEDURE;
+ } else if (procedure instanceof CreateModelProcedure) {
+ return ProcedureType.CREATE_MODEL_PROCEDURE;
+ } else if (procedure instanceof DropModelProcedure) {
+ return ProcedureType.DROP_MODEL_PROCEDURE;
}
return null;
}
diff --git a/mlnode/iotdb/mlnode/service.py b/mlnode/iotdb/mlnode/service.py
index 8314dc363e..a2c05ea5c3 100644
--- a/mlnode/iotdb/mlnode/service.py
+++ b/mlnode/iotdb/mlnode/service.py
@@ -33,7 +33,7 @@ class RPCService(threading.Thread):
super().__init__()
processor = IMLNodeRPCService.Processor(handler=MLNodeRPCServiceHandler())
transport = TSocket.TServerSocket(host=config.get_mn_rpc_address(), port=config.get_mn_rpc_port())
- transport_factory = TTransport.TBufferedTransportFactory()
+ transport_factory = TTransport.TFramedTransportFactory()
protocol_factory = TCompactProtocol.TCompactProtocolFactory()
self.__pool_server = TServer.TThreadPoolServer(processor, transport, transport_factory, protocol_factory)
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/model/ModelHyperparameter.java b/node-commons/src/main/java/org/apache/iotdb/commons/model/ModelHyperparameter.java
index 151a6b7c59..ed5a3cbb3c 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/model/ModelHyperparameter.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/model/ModelHyperparameter.java
@@ -26,6 +26,8 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Map;
public class ModelHyperparameter {
@@ -53,6 +55,14 @@ public class ModelHyperparameter {
return stringBuilder.toString();
}
+ public List<String> toStringList() {
+ List<String> resultList = new ArrayList<>();
+ for (Map.Entry<String, String> keyValuePair : keyValueMap.entrySet()) {
+ resultList.add(keyValuePair.getKey() + "=" + keyValuePair.getValue());
+ }
+ return resultList;
+ }
+
public void serialize(DataOutputStream stream) throws IOException {
ReadWriteIOUtils.write(keyValueMap, stream);
}
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/model/ModelInformation.java b/node-commons/src/main/java/org/apache/iotdb/commons/model/ModelInformation.java
index ecccda085e..522f609e51 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/model/ModelInformation.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/model/ModelInformation.java
@@ -24,6 +24,8 @@ import org.apache.iotdb.common.rpc.thrift.TrainingState;
import org.apache.iotdb.tsfile.utils.PublicBAOS;
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+import javax.annotation.Nullable;
+
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -44,13 +46,13 @@ public class ModelInformation {
private final String modelType;
private final List<String> queryExpressions;
- private final String queryFilter;
+ @Nullable private String queryFilter;
private final boolean isAuto;
private TrainingState trainingState;
- private String bestTrailId;
- private Map<String, TrailInformation> trailMap;
+ @Nullable private String bestTrailId;
+ private final Map<String, TrailInformation> trailMap;
public ModelInformation(
String modelId,
@@ -58,13 +60,15 @@ public class ModelInformation {
String modelType,
boolean isAuto,
List<String> queryExpressions,
- String queryFilter) {
+ @Nullable String queryFilter) {
this.modelId = modelId;
this.modelTask = modelTask;
this.modelType = modelType;
this.isAuto = isAuto;
+ this.trainingState = TrainingState.PENDING;
this.queryExpressions = queryExpressions;
this.queryFilter = queryFilter;
+ this.trailMap = new HashMap<>();
}
public ModelInformation(ByteBuffer buffer) {
@@ -78,10 +82,18 @@ public class ModelInformation {
this.queryExpressions.add(ReadWriteIOUtils.readString(buffer));
}
- this.queryFilter = ReadWriteIOUtils.readString(buffer);
+ byte isNull = ReadWriteIOUtils.readByte(buffer);
+ if (isNull == 1) {
+ this.queryFilter = ReadWriteIOUtils.readString(buffer);
+ }
+
this.isAuto = ReadWriteIOUtils.readBool(buffer);
this.trainingState = TrainingState.findByValue(ReadWriteIOUtils.readInt(buffer));
- this.bestTrailId = ReadWriteIOUtils.readString(buffer);
+
+ isNull = ReadWriteIOUtils.readByte(buffer);
+ if (isNull == 1) {
+ this.bestTrailId = ReadWriteIOUtils.readString(buffer);
+ }
int mapSize = ReadWriteIOUtils.readInt(buffer);
this.trailMap = new HashMap<>();
@@ -102,10 +114,18 @@ public class ModelInformation {
this.queryExpressions.add(ReadWriteIOUtils.readString(stream));
}
- this.queryFilter = ReadWriteIOUtils.readString(stream);
+ byte isNull = ReadWriteIOUtils.readByte(stream);
+ if (isNull == 1) {
+ this.queryFilter = ReadWriteIOUtils.readString(stream);
+ }
+
this.isAuto = ReadWriteIOUtils.readBool(stream);
this.trainingState = TrainingState.findByValue(ReadWriteIOUtils.readInt(stream));
- this.bestTrailId = ReadWriteIOUtils.readString(stream);
+
+ isNull = ReadWriteIOUtils.readByte(stream);
+ if (isNull == 1) {
+ this.bestTrailId = ReadWriteIOUtils.readString(stream);
+ }
int mapSize = ReadWriteIOUtils.readInt(stream);
this.trailMap = new HashMap<>();
@@ -127,6 +147,7 @@ public class ModelInformation {
return queryExpressions;
}
+ @Nullable
public String getQueryFilter() {
return queryFilter;
}
@@ -173,10 +194,24 @@ public class ModelInformation {
for (String queryExpression : queryExpressions) {
ReadWriteIOUtils.write(queryExpression, stream);
}
- ReadWriteIOUtils.write(queryFilter, stream);
+
+ if (queryFilter == null) {
+ ReadWriteIOUtils.write((byte) 0, stream);
+ } else {
+ ReadWriteIOUtils.write((byte) 1, stream);
+ ReadWriteIOUtils.write(queryFilter, stream);
+ }
+
ReadWriteIOUtils.write(isAuto, stream);
ReadWriteIOUtils.write(trainingState.ordinal(), stream);
- ReadWriteIOUtils.write(bestTrailId, stream);
+
+ if (bestTrailId == null) {
+ ReadWriteIOUtils.write((byte) 0, stream);
+ } else {
+ ReadWriteIOUtils.write((byte) 1, stream);
+ ReadWriteIOUtils.write(bestTrailId, stream);
+ }
+
ReadWriteIOUtils.write(trailMap.size(), stream);
for (TrailInformation trailInformation : trailMap.values()) {
trailInformation.serialize(stream);
@@ -193,10 +228,22 @@ public class ModelInformation {
ReadWriteIOUtils.write(queryExpression, stream);
}
- ReadWriteIOUtils.write(queryFilter, stream);
+ if (queryFilter == null) {
+ ReadWriteIOUtils.write((byte) 0, stream);
+ } else {
+ ReadWriteIOUtils.write((byte) 1, stream);
+ ReadWriteIOUtils.write(queryFilter, stream);
+ }
+
ReadWriteIOUtils.write(isAuto, stream);
ReadWriteIOUtils.write(trainingState.ordinal(), stream);
- ReadWriteIOUtils.write(bestTrailId, stream);
+
+ if (bestTrailId == null) {
+ ReadWriteIOUtils.write((byte) 0, stream);
+ } else {
+ ReadWriteIOUtils.write((byte) 1, stream);
+ ReadWriteIOUtils.write(bestTrailId, stream);
+ }
ReadWriteIOUtils.write(trailMap.size(), stream);
for (TrailInformation trailInformation : trailMap.values()) {
@@ -221,9 +268,21 @@ public class ModelInformation {
ReadWriteIOUtils.write(Arrays.toString(queryExpressions.toArray(new String[0])), stream);
ReadWriteIOUtils.write(trainingState.toString(), stream);
- TrailInformation bestTrail = trailMap.get(bestTrailId);
- ReadWriteIOUtils.write(bestTrail.getModelHyperparameter().toString(), stream);
- ReadWriteIOUtils.write(bestTrail.getModelPath(), stream);
+ if (bestTrailId != null) {
+ TrailInformation bestTrail = trailMap.get(bestTrailId);
+ ReadWriteIOUtils.write(bestTrail.getModelPath(), stream);
+
+ List<String> modelHyperparameterList = bestTrail.getModelHyperparameter().toStringList();
+ ReadWriteIOUtils.write(modelHyperparameterList.size(), stream);
+ for (String hyperparameter : modelHyperparameterList) {
+ ReadWriteIOUtils.write(hyperparameter, stream);
+ }
+ } else {
+ ReadWriteIOUtils.write("UNKNOWN", stream);
+
+ ReadWriteIOUtils.write(1, stream);
+ ReadWriteIOUtils.write("UNKNOWN", stream);
+ }
return ByteBuffer.wrap(buffer.getBuf(), 0, buffer.size());
}
}
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/model/TrailInformation.java b/node-commons/src/main/java/org/apache/iotdb/commons/model/TrailInformation.java
index 8551534d41..56de20671e 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/model/TrailInformation.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/model/TrailInformation.java
@@ -27,6 +27,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
+import java.util.List;
import java.util.Map;
public class TrailInformation {
@@ -68,8 +69,12 @@ public class TrailInformation {
PublicBAOS buffer = new PublicBAOS();
DataOutputStream stream = new DataOutputStream(buffer);
ReadWriteIOUtils.write(trailId, stream);
- ReadWriteIOUtils.write(modelHyperparameter.toString(), stream);
ReadWriteIOUtils.write(modelPath, stream);
+ List<String> modelHyperparameterList = modelHyperparameter.toStringList();
+ ReadWriteIOUtils.write(modelHyperparameterList.size(), stream);
+ for (String hyperparameter : modelHyperparameterList) {
+ ReadWriteIOUtils.write(hyperparameter, stream);
+ }
return ByteBuffer.wrap(buffer.getBuf(), 0, buffer.size());
}
diff --git a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
index 83d295f473..ed6865a302 100644
--- a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
+++ b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
@@ -2001,37 +2001,75 @@ public class ConfigNodeClient implements IConfigNodeRPCService.Iface, ThriftClie
@Override
public TSStatus createModel(TCreateModelReq req) throws TException {
- // TODO
- throw new TException(new UnsupportedOperationException().getCause());
+ for (int i = 0; i < RETRY_NUM; i++) {
+ try {
+ TSStatus status = client.createModel(req);
+ if (!updateConfigNodeLeader(status)) {
+ return status;
+ }
+ } catch (TException e) {
+ configLeader = null;
+ }
+ waitAndReconnect();
+ }
+ throw new TException(MSG_RECONNECTION_FAIL);
}
@Override
public TSStatus dropModel(TDropModelReq req) throws TException {
- // TODO
- throw new TException(new UnsupportedOperationException().getCause());
+ for (int i = 0; i < RETRY_NUM; i++) {
+ try {
+ TSStatus status = client.dropModel(req);
+ if (!updateConfigNodeLeader(status)) {
+ return status;
+ }
+ } catch (TException e) {
+ configLeader = null;
+ }
+ waitAndReconnect();
+ }
+ throw new TException(MSG_RECONNECTION_FAIL);
}
@Override
public TShowModelResp showModel(TShowModelReq req) throws TException {
- // TODO
- throw new TException(new UnsupportedOperationException().getCause());
+ for (int i = 0; i < RETRY_NUM; i++) {
+ try {
+ TShowModelResp resp = client.showModel(req);
+ if (!updateConfigNodeLeader(resp.getStatus())) {
+ return resp;
+ }
+ } catch (TException e) {
+ configLeader = null;
+ }
+ waitAndReconnect();
+ }
+ throw new TException(MSG_RECONNECTION_FAIL);
}
@Override
public TShowTrailResp showTrail(TShowTrailReq req) throws TException {
- // TODO
- throw new TException(new UnsupportedOperationException().getCause());
+ for (int i = 0; i < RETRY_NUM; i++) {
+ try {
+ TShowTrailResp resp = client.showTrail(req);
+ if (!updateConfigNodeLeader(resp.getStatus())) {
+ return resp;
+ }
+ } catch (TException e) {
+ configLeader = null;
+ }
+ waitAndReconnect();
+ }
+ throw new TException(MSG_RECONNECTION_FAIL);
}
@Override
public TSStatus updateModelInfo(TUpdateModelInfoReq req) throws TException {
- // TODO
throw new TException(new UnsupportedOperationException().getCause());
}
@Override
public TSStatus updateModelState(TUpdateModelStateReq req) throws TException {
- // TODO
throw new TException(new UnsupportedOperationException().getCause());
}
diff --git a/server/src/main/java/org/apache/iotdb/db/client/MLNodeClient.java b/server/src/main/java/org/apache/iotdb/db/client/MLNodeClient.java
index 84278d9ba4..1ff54d43b6 100644
--- a/server/src/main/java/org/apache/iotdb/db/client/MLNodeClient.java
+++ b/server/src/main/java/org/apache/iotdb/db/client/MLNodeClient.java
@@ -29,16 +29,18 @@ import org.apache.iotdb.mlnode.rpc.thrift.TCreateTrainingTaskReq;
import org.apache.iotdb.mlnode.rpc.thrift.TDeleteModelReq;
import org.apache.iotdb.mlnode.rpc.thrift.TForecastReq;
import org.apache.iotdb.mlnode.rpc.thrift.TForecastResp;
-import org.apache.iotdb.rpc.RpcTransportFactory;
+import org.apache.iotdb.rpc.TConfigurationConst;
import org.apache.iotdb.rpc.TSStatusCode;
import org.apache.iotdb.tsfile.read.common.block.TsBlock;
import org.apache.iotdb.tsfile.read.common.block.column.TsBlockSerde;
import org.apache.thrift.TException;
-import org.apache.thrift.protocol.TBinaryProtocol;
+import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocolFactory;
+import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
+import org.apache.thrift.transport.layered.TFramedTransport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -63,9 +65,13 @@ public class MLNodeClient implements AutoCloseable {
try {
long connectionTimeout = ClientPoolProperty.DefaultProperty.WAIT_CLIENT_TIMEOUT_MS;
transport =
- RpcTransportFactory.INSTANCE.getTransport(
- // As there is a try-catch already, we do not need to use TSocket.wrap
- endpoint.getIp(), endpoint.getPort(), (int) connectionTimeout);
+ new TFramedTransport.Factory()
+ .getTransport(
+ new TSocket(
+ TConfigurationConst.defaultTConfiguration,
+ endpoint.getIp(),
+ endpoint.getPort(),
+ (int) connectionTimeout));
if (!transport.isOpen()) {
transport.open();
}
@@ -73,7 +79,7 @@ public class MLNodeClient implements AutoCloseable {
throw new TException(MSG_CONNECTION_FAIL);
}
- TProtocolFactory protocolFactory = new TBinaryProtocol.Factory();
+ TProtocolFactory protocolFactory = new TCompactProtocol.Factory();
client = new IMLNodeRPCService.Client(protocolFactory.getProtocol(transport));
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/ColumnHeaderConstant.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/ColumnHeaderConstant.java
index 2097a05478..ded93fc3df 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/ColumnHeaderConstant.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/ColumnHeaderConstant.java
@@ -161,6 +161,15 @@ public class ColumnHeaderConstant {
public static final String ELAPSED_TIME = "ElapsedTime";
public static final String STATEMENT = "Statement";
+ // column names for show models/trails
+ public static final String MODEL_ID = "ModelId";
+ public static final String TRAIL_ID = "TrailId";
+ public static final String MODEL_TASK = "ModelTask";
+ public static final String MODEL_TYPE = "ModelType";
+ public static final String QUERY_BODY = "QueryBody";
+ public static final String HYPERPARAMETER = "Hyperparameter";
+ public static final String MODEL_PATH = "ModelPath";
+
public static final List<ColumnHeader> lastQueryColumnHeaders =
ImmutableList.of(
new ColumnHeader(TIMESERIES, TSDataType.TEXT),
@@ -395,4 +404,20 @@ public class ColumnHeaderConstant {
new ColumnHeader(DATA_NODE_ID, TSDataType.INT32),
new ColumnHeader(ELAPSED_TIME, TSDataType.FLOAT),
new ColumnHeader(STATEMENT, TSDataType.TEXT));
+
+ public static final List<ColumnHeader> showModelsColumnHeaders =
+ ImmutableList.of(
+ new ColumnHeader(MODEL_ID, TSDataType.TEXT),
+ new ColumnHeader(MODEL_TASK, TSDataType.TEXT),
+ new ColumnHeader(MODEL_TYPE, TSDataType.TEXT),
+ new ColumnHeader(QUERY_BODY, TSDataType.TEXT),
+ new ColumnHeader(STATE, TSDataType.TEXT),
+ new ColumnHeader(MODEL_PATH, TSDataType.TEXT),
+ new ColumnHeader(HYPERPARAMETER, TSDataType.TEXT));
+
+ public static final List<ColumnHeader> showTrailsColumnHeaders =
+ ImmutableList.of(
+ new ColumnHeader(TRAIL_ID, TSDataType.TEXT),
+ new ColumnHeader(MODEL_PATH, TSDataType.TEXT),
+ new ColumnHeader(HYPERPARAMETER, TSDataType.TEXT));
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeaderFactory.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeaderFactory.java
index e47e4370ca..c7b07431d0 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeaderFactory.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeaderFactory.java
@@ -168,4 +168,12 @@ public class DatasetHeaderFactory {
public static DatasetHeader getShowQueriesHeader() {
return new DatasetHeader(ColumnHeaderConstant.showQueriesColumnHeaders, false);
}
+
+ public static DatasetHeader getShowModelsHeader() {
+ return new DatasetHeader(ColumnHeaderConstant.showModelsColumnHeaders, true);
+ }
+
+ public static DatasetHeader getShowTrailsHeader() {
+ return new DatasetHeader(ColumnHeaderConstant.showTrailsColumnHeaders, true);
+ }
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java
index c9c71b85f6..99ebd6fb70 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java
@@ -54,14 +54,14 @@ public class Analyzer {
}
public static void validate(Statement statement) {
- MPPQueryContext context = new MPPQueryContext(mockQueryId);
-
- IPartitionFetcher partitionFetcher;
- ISchemaFetcher schemaFetcher;
- partitionFetcher = ClusterPartitionFetcher.getInstance();
- schemaFetcher = ClusterSchemaFetcher.getInstance();
-
- Analyzer analyzer = new Analyzer(context, partitionFetcher, schemaFetcher);
+ Analyzer analyzer = getAnalyzer();
analyzer.analyze(statement);
}
+
+ public static Analyzer getAnalyzer() {
+ return new Analyzer(
+ new MPPQueryContext(mockQueryId),
+ ClusterPartitionFetcher.getInstance(),
+ ClusterSchemaFetcher.getInstance());
+ }
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
index a0a0a8bf18..81c33c845c 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
@@ -49,6 +49,10 @@ import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowTTLTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowTriggersTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowVariablesTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.UnSetTTLTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.metadata.model.CreateModelTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.metadata.model.DropModelTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.metadata.model.ShowModelsTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.metadata.model.ShowTrailsTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.CreateSchemaTemplateTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.DeactivateSchemaTemplateTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.DropSchemaTemplateTask;
@@ -104,6 +108,10 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTTLStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTriggersStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowVariablesStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.UnSetTTLStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.model.CreateModelStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.model.DropModelStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.model.ShowModelsStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.model.ShowTrailsStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.template.DeactivateTemplateStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.template.DropSchemaTemplateStatement;
@@ -448,6 +456,28 @@ public class ConfigTaskVisitor
return new ShowContinuousQueriesTask();
}
+ /** ML Model Management */
+ @Override
+ public IConfigTask visitCreateModel(
+ CreateModelStatement createModelStatement, TaskContext context) {
+ return new CreateModelTask(createModelStatement);
+ }
+
+ @Override
+ public IConfigTask visitDropModel(DropModelStatement dropModelStatement, TaskContext context) {
+ return new DropModelTask(dropModelStatement.getModelId());
+ }
+
+ @Override
+ public IConfigTask visitShowModels(ShowModelsStatement showModelsStatement, TaskContext context) {
+ return new ShowModelsTask();
+ }
+
+ @Override
+ public IConfigTask visitShowTrails(ShowTrailsStatement showTrailsStatement, TaskContext context) {
+ return new ShowTrailsTask(showTrailsStatement.getModelId());
+ }
+
public static class TaskContext {
private final String queryId;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index 720f4b519f..53567fc601 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -40,6 +40,7 @@ import org.apache.iotdb.commons.udf.service.UDFExecutableManager;
import org.apache.iotdb.confignode.rpc.thrift.TCountDatabaseResp;
import org.apache.iotdb.confignode.rpc.thrift.TCreateCQReq;
import org.apache.iotdb.confignode.rpc.thrift.TCreateFunctionReq;
+import org.apache.iotdb.confignode.rpc.thrift.TCreateModelReq;
import org.apache.iotdb.confignode.rpc.thrift.TCreatePipePluginReq;
import org.apache.iotdb.confignode.rpc.thrift.TCreatePipeReq;
import org.apache.iotdb.confignode.rpc.thrift.TCreateTriggerReq;
@@ -50,6 +51,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TDeleteDatabasesReq;
import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropCQReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropFunctionReq;
+import org.apache.iotdb.confignode.rpc.thrift.TDropModelReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropPipePluginReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropPipeSinkReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropTriggerReq;
@@ -72,11 +74,15 @@ import org.apache.iotdb.confignode.rpc.thrift.TShowClusterResp;
import org.apache.iotdb.confignode.rpc.thrift.TShowConfigNodesResp;
import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp;
import org.apache.iotdb.confignode.rpc.thrift.TShowDatabaseResp;
+import org.apache.iotdb.confignode.rpc.thrift.TShowModelReq;
+import org.apache.iotdb.confignode.rpc.thrift.TShowModelResp;
import org.apache.iotdb.confignode.rpc.thrift.TShowPipeInfo;
import org.apache.iotdb.confignode.rpc.thrift.TShowPipeReq;
import org.apache.iotdb.confignode.rpc.thrift.TShowPipeResp;
import org.apache.iotdb.confignode.rpc.thrift.TShowRegionReq;
import org.apache.iotdb.confignode.rpc.thrift.TShowRegionResp;
+import org.apache.iotdb.confignode.rpc.thrift.TShowTrailReq;
+import org.apache.iotdb.confignode.rpc.thrift.TShowTrailResp;
import org.apache.iotdb.confignode.rpc.thrift.TShowVariablesResp;
import org.apache.iotdb.confignode.rpc.thrift.TUnsetSchemaTemplateReq;
import org.apache.iotdb.db.client.ConfigNodeClient;
@@ -89,6 +95,7 @@ import org.apache.iotdb.db.exception.StorageEngineException;
import org.apache.iotdb.db.exception.sql.SemanticException;
import org.apache.iotdb.db.metadata.template.ClusterTemplateManager;
import org.apache.iotdb.db.metadata.template.Template;
+import org.apache.iotdb.db.mpp.plan.analyze.Analysis;
import org.apache.iotdb.db.mpp.plan.analyze.Analyzer;
import org.apache.iotdb.db.mpp.plan.execution.config.ConfigTaskResult;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.CountDatabaseTask;
@@ -107,11 +114,14 @@ import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowRegionTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowTTLTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowTriggersTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowVariablesTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.metadata.model.ShowModelsTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.metadata.model.ShowTrailsTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.ShowNodesInSchemaTemplateTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.ShowPathSetTemplateTask;
import org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.ShowSchemaTemplateTask;
import org.apache.iotdb.db.mpp.plan.execution.config.sys.pipe.ShowPipeTask;
import org.apache.iotdb.db.mpp.plan.execution.config.sys.sync.ShowPipeSinkTask;
+import org.apache.iotdb.db.mpp.plan.expression.Expression;
import org.apache.iotdb.db.mpp.plan.statement.metadata.CountDatabaseStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateContinuousQueryStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateFunctionStatement;
@@ -130,6 +140,7 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowDataNodesStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowDatabaseStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowRegionStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTTLStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.model.CreateModelStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.template.DeactivateTemplateStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.template.DropSchemaTemplateStatement;
@@ -1802,4 +1813,104 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor {
return future;
}
+
+ @Override
+ public SettableFuture<ConfigTaskResult> createModel(CreateModelStatement createModelStatement) {
+ createModelStatement.semanticCheck();
+
+ Analyzer analyzer = Analyzer.getAnalyzer();
+ Analysis analysis = analyzer.analyze(createModelStatement.getQueryStatement());
+
+ List<String> queryExpressions = new ArrayList<>();
+ for (Expression expression : analysis.getSelectExpressions()) {
+ queryExpressions.add(expression.toString());
+ }
+ Expression whereExpression = analysis.getWhereExpression();
+ String queryFilter = whereExpression == null ? null : whereExpression.toString();
+
+ SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+ try (ConfigNodeClient client =
+ CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
+ TCreateModelReq createModelReq = new TCreateModelReq();
+ createModelReq.setModelId(createModelStatement.getModelId());
+ createModelReq.setModelTask(createModelStatement.getModelTask());
+ createModelReq.setModelType(createModelStatement.getModelType());
+ createModelReq.setIsAuto(createModelStatement.isAuto());
+ createModelReq.setQueryExpressions(queryExpressions);
+ createModelReq.setQueryFilter(queryFilter);
+ createModelReq.setModelConfigs(createModelStatement.getAttributes());
+ final TSStatus executionStatus = client.createModel(createModelReq);
+ if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != executionStatus.getCode()) {
+ LOGGER.warn(
+ "[{}] Failed to create model {}. TSStatus is {}",
+ executionStatus,
+ createModelStatement.getModelId(),
+ executionStatus.message);
+ future.setException(new IoTDBException(executionStatus.message, executionStatus.code));
+ } else {
+ future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
+ }
+ } catch (ClientManagerException | TException e) {
+ future.setException(e);
+ }
+ return future;
+ }
+
+ @Override
+ public SettableFuture<ConfigTaskResult> dropModel(String modelId) {
+ SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+ try (ConfigNodeClient client =
+ CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
+ final TSStatus executionStatus = client.dropModel(new TDropModelReq(modelId));
+ if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != executionStatus.getCode()) {
+ LOGGER.warn("[{}] Failed to drop model {}.", executionStatus, modelId);
+ future.setException(new IoTDBException(executionStatus.message, executionStatus.code));
+ } else {
+ future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
+ }
+ } catch (ClientManagerException | TException e) {
+ future.setException(e);
+ }
+ return future;
+ }
+
+ @Override
+ public SettableFuture<ConfigTaskResult> showModels() {
+ SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+ try (ConfigNodeClient client =
+ CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
+ TShowModelResp showModelResp = client.showModel(new TShowModelReq());
+ if (showModelResp.getStatus().getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ future.setException(
+ new IoTDBException(showModelResp.getStatus().message, showModelResp.getStatus().code));
+ return future;
+ }
+ // convert model info list and buildTsBlock
+ ShowModelsTask.buildTsBlock(showModelResp.getModelInfoList(), future);
+ } catch (ClientManagerException | TException e) {
+ future.setException(e);
+ }
+
+ return future;
+ }
+
+ @Override
+ public SettableFuture<ConfigTaskResult> showTrails(String modelId) {
+ SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+ try (ConfigNodeClient client =
+ CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
+ TShowTrailResp showTrailResp = client.showTrail(new TShowTrailReq(modelId));
+ if (showTrailResp.getStatus().getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ future.setException(
+ new IoTDBException(showTrailResp.getStatus().message, showTrailResp.getStatus().code));
+ return future;
+ }
+ // convert trail info list and buildTsBlock
+ ShowTrailsTask.buildTsBlock(showTrailResp.getTrailInfoList(), future);
+ } catch (ClientManagerException | TException e) {
+ future.setException(e);
+ }
+
+ return future;
+ }
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
index f35fa0a84b..8fdaa7c8a1 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
@@ -40,6 +40,7 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowDataNodesStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowDatabaseStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowRegionStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTTLStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.model.CreateModelStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.template.DeactivateTemplateStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.template.DropSchemaTemplateStatement;
@@ -175,4 +176,12 @@ public interface IConfigTaskExecutor {
SettableFuture<ConfigTaskResult> dropContinuousQuery(String cqId);
SettableFuture<ConfigTaskResult> showContinuousQueries();
+
+ SettableFuture<ConfigTaskResult> createModel(CreateModelStatement createModelStatement);
+
+ SettableFuture<ConfigTaskResult> dropModel(String modelId);
+
+ SettableFuture<ConfigTaskResult> showModels();
+
+ SettableFuture<ConfigTaskResult> showTrails(String modelId);
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/model/CreateModelTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/model/CreateModelTask.java
new file mode 100644
index 0000000000..48909f0a03
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/model/CreateModelTask.java
@@ -0,0 +1,42 @@
+/*
+ * 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.mpp.plan.execution.config.metadata.model;
+
+import org.apache.iotdb.db.mpp.plan.execution.config.ConfigTaskResult;
+import org.apache.iotdb.db.mpp.plan.execution.config.IConfigTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.executor.IConfigTaskExecutor;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.model.CreateModelStatement;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+public class CreateModelTask implements IConfigTask {
+
+ private final CreateModelStatement createModelStatement;
+
+ public CreateModelTask(CreateModelStatement createModelStatement) {
+ this.createModelStatement = createModelStatement;
+ }
+
+ @Override
+ public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor configTaskExecutor)
+ throws InterruptedException {
+ return configTaskExecutor.createModel(createModelStatement);
+ }
+}
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/model/DropModelState.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/model/DropModelTask.java
similarity index 53%
copy from confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/model/DropModelState.java
copy to server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/model/DropModelTask.java
index 5f8c5a6f6e..1efd1aad0a 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/model/DropModelState.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/model/DropModelTask.java
@@ -17,13 +17,25 @@
* under the License.
*/
-package org.apache.iotdb.confignode.procedure.state.model;
+package org.apache.iotdb.db.mpp.plan.execution.config.metadata.model;
-public enum DropModelState {
- INIT,
- VALIDATED,
- CONFIG_NODE_DROPPING,
- DATA_NODE_DROPPED,
- ML_NODE_DROPPED,
- CONFIG_NODE_DROPPED
+import org.apache.iotdb.db.mpp.plan.execution.config.ConfigTaskResult;
+import org.apache.iotdb.db.mpp.plan.execution.config.IConfigTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.executor.IConfigTaskExecutor;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+public class DropModelTask implements IConfigTask {
+
+ private final String modelId;
+
+ public DropModelTask(String modelId) {
+ this.modelId = modelId;
+ }
+
+ @Override
+ public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor configTaskExecutor)
+ throws InterruptedException {
+ return configTaskExecutor.dropModel(modelId);
+ }
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/model/ShowModelsTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/model/ShowModelsTask.java
new file mode 100644
index 0000000000..750e0dd5ae
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/model/ShowModelsTask.java
@@ -0,0 +1,96 @@
+/*
+ * 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.mpp.plan.execution.config.metadata.model;
+
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory;
+import org.apache.iotdb.db.mpp.plan.execution.config.ConfigTaskResult;
+import org.apache.iotdb.db.mpp.plan.execution.config.IConfigTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.executor.IConfigTaskExecutor;
+import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.iotdb.tsfile.utils.Binary;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class ShowModelsTask implements IConfigTask {
+
+ public ShowModelsTask() {}
+
+ @Override
+ public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor configTaskExecutor)
+ throws InterruptedException {
+ return configTaskExecutor.showModels();
+ }
+
+ public static void buildTsBlock(
+ List<ByteBuffer> modelInfoList, SettableFuture<ConfigTaskResult> future) {
+ List<TSDataType> outputDataTypes =
+ ColumnHeaderConstant.showModelsColumnHeaders.stream()
+ .map(ColumnHeader::getColumnType)
+ .collect(Collectors.toList());
+ TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
+ for (ByteBuffer modelInfo : modelInfoList) {
+ String modelId = ReadWriteIOUtils.readString(modelInfo);
+ String modelTask = ReadWriteIOUtils.readString(modelInfo);
+ String modelType = ReadWriteIOUtils.readString(modelInfo);
+ String queryBody = ReadWriteIOUtils.readString(modelInfo);
+ String trainingState = ReadWriteIOUtils.readString(modelInfo);
+ String modelPath = ReadWriteIOUtils.readString(modelInfo);
+
+ int listSize = ReadWriteIOUtils.readInt(modelInfo);
+ List<String> modelHyperparameter = new ArrayList<>();
+ for (int i = 0; i < listSize; i++) {
+ modelHyperparameter.add(ReadWriteIOUtils.readString(modelInfo));
+ }
+
+ builder.getTimeColumnBuilder().writeLong(0L);
+ builder.getColumnBuilder(0).writeBinary(Binary.valueOf(modelId));
+ builder.getColumnBuilder(1).writeBinary(Binary.valueOf(modelTask));
+ builder.getColumnBuilder(2).writeBinary(Binary.valueOf(modelType));
+ builder.getColumnBuilder(3).writeBinary(Binary.valueOf(queryBody));
+ builder.getColumnBuilder(4).writeBinary(Binary.valueOf(trainingState));
+ builder.getColumnBuilder(5).writeBinary(Binary.valueOf(modelPath));
+ builder.getColumnBuilder(6).writeBinary(Binary.valueOf(modelHyperparameter.get(0)));
+ builder.declarePosition();
+
+ for (int i = 1; i < listSize; i++) {
+ builder.getTimeColumnBuilder().writeLong(0L);
+ for (int columnIndex = 0; columnIndex <= 5; columnIndex++) {
+ builder.getColumnBuilder(columnIndex).writeBinary(Binary.valueOf(""));
+ }
+ builder.getColumnBuilder(6).writeBinary(Binary.valueOf(modelHyperparameter.get(i)));
+ builder.declarePosition();
+ }
+ }
+ DatasetHeader datasetHeader = DatasetHeaderFactory.getShowModelsHeader();
+ future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, builder.build(), datasetHeader));
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/model/ShowTrailsTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/model/ShowTrailsTask.java
new file mode 100644
index 0000000000..ddb9a5e385
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/model/ShowTrailsTask.java
@@ -0,0 +1,90 @@
+/*
+ * 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.mpp.plan.execution.config.metadata.model;
+
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory;
+import org.apache.iotdb.db.mpp.plan.execution.config.ConfigTaskResult;
+import org.apache.iotdb.db.mpp.plan.execution.config.IConfigTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.executor.IConfigTaskExecutor;
+import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.iotdb.tsfile.utils.Binary;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class ShowTrailsTask implements IConfigTask {
+
+ private final String modelId;
+
+ public ShowTrailsTask(String modelId) {
+ this.modelId = modelId;
+ }
+
+ @Override
+ public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor configTaskExecutor)
+ throws InterruptedException {
+ return configTaskExecutor.showTrails(modelId);
+ }
+
+ public static void buildTsBlock(
+ List<ByteBuffer> trailInfoList, SettableFuture<ConfigTaskResult> future) {
+ List<TSDataType> outputDataTypes =
+ ColumnHeaderConstant.showTrailsColumnHeaders.stream()
+ .map(ColumnHeader::getColumnType)
+ .collect(Collectors.toList());
+ TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
+ for (ByteBuffer trailInfo : trailInfoList) {
+ String trailId = ReadWriteIOUtils.readString(trailInfo);
+ String modelPath = ReadWriteIOUtils.readString(trailInfo);
+ int listSize = ReadWriteIOUtils.readInt(trailInfo);
+ List<String> modelHyperparameter = new ArrayList<>();
+ for (int i = 0; i < listSize; i++) {
+ modelHyperparameter.add(ReadWriteIOUtils.readString(trailInfo));
+ }
+
+ builder.getTimeColumnBuilder().writeLong(0L);
+ builder.getColumnBuilder(0).writeBinary(Binary.valueOf(trailId));
+ builder.getColumnBuilder(1).writeBinary(Binary.valueOf(modelPath));
+ builder.getColumnBuilder(2).writeBinary(Binary.valueOf(modelHyperparameter.get(0)));
+ builder.declarePosition();
+
+ for (int i = 1; i < listSize; i++) {
+ builder.getTimeColumnBuilder().writeLong(0L);
+ builder.getColumnBuilder(0).writeBinary(Binary.valueOf(""));
+ builder.getColumnBuilder(1).writeBinary(Binary.valueOf(""));
+ builder.getColumnBuilder(2).writeBinary(Binary.valueOf(modelHyperparameter.get(i)));
+ builder.declarePosition();
+ }
+ }
+ DatasetHeader datasetHeader = DatasetHeaderFactory.getShowTrailsHeader();
+ future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, builder.build(), datasetHeader));
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/ConcatExpressionWithSuffixPathsVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/ConcatExpressionWithSuffixPathsVisitor.java
index 4afbe910ee..a8e565e7da 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/ConcatExpressionWithSuffixPathsVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/ConcatExpressionWithSuffixPathsVisitor.java
@@ -60,8 +60,7 @@ public class ConcatExpressionWithSuffixPathsVisitor
}
List<List<Expression>> childExpressionsList = new ArrayList<>();
cartesianProduct(extendedExpressions, childExpressionsList, 0, new ArrayList<>());
- return reconstructFunctionExpressions(
- (FunctionExpression) functionExpression, childExpressionsList);
+ return reconstructFunctionExpressions(functionExpression, childExpressionsList);
}
@Override
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
index 7515f4076d..4bc44543fe 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
@@ -138,6 +138,10 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTimeSeriesStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTriggersStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowVariablesStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.UnSetTTLStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.model.CreateModelStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.model.DropModelStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.model.ShowModelsStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.model.ShowTrailsStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.template.ActivateTemplateStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.template.DeactivateTemplateStatement;
@@ -169,9 +173,9 @@ import org.apache.iotdb.db.mpp.plan.statement.sys.sync.ShowPipeSinkStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.sync.ShowPipeSinkTypeStatement;
import org.apache.iotdb.db.qp.sql.IoTDBSqlParser;
import org.apache.iotdb.db.qp.sql.IoTDBSqlParser.ConstantContext;
+import org.apache.iotdb.db.qp.sql.IoTDBSqlParser.CountDatabasesContext;
import org.apache.iotdb.db.qp.sql.IoTDBSqlParser.CountDevicesContext;
import org.apache.iotdb.db.qp.sql.IoTDBSqlParser.CountNodesContext;
-import org.apache.iotdb.db.qp.sql.IoTDBSqlParser.CountStorageGroupContext;
import org.apache.iotdb.db.qp.sql.IoTDBSqlParser.CountTimeseriesContext;
import org.apache.iotdb.db.qp.sql.IoTDBSqlParser.CreateFunctionContext;
import org.apache.iotdb.db.qp.sql.IoTDBSqlParser.DropFunctionContext;
@@ -540,10 +544,10 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
}
}
- // Delete Timeseries ======================================================================
+ // Drop Timeseries ======================================================================
@Override
- public Statement visitDeleteTimeseries(IoTDBSqlParser.DeleteTimeseriesContext ctx) {
+ public Statement visitDropTimeseries(IoTDBSqlParser.DropTimeseriesContext ctx) {
DeleteTimeSeriesStatement deleteTimeSeriesStatement = new DeleteTimeSeriesStatement();
List<PartialPath> partialPaths = new ArrayList<>();
for (IoTDBSqlParser.PrefixPathContext prefixPathContext : ctx.prefixPath()) {
@@ -615,7 +619,7 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
// SHOW DATABASES
@Override
- public Statement visitShowStorageGroup(IoTDBSqlParser.ShowStorageGroupContext ctx) {
+ public Statement visitShowDatabases(IoTDBSqlParser.ShowDatabasesContext ctx) {
ShowDatabaseStatement showDatabaseStatement;
// Parse prefixPath
@@ -708,7 +712,7 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
// Count StorageGroup ========================================================================
@Override
- public Statement visitCountStorageGroup(CountStorageGroupContext ctx) {
+ public Statement visitCountDatabases(CountDatabasesContext ctx) {
PartialPath path;
if (ctx.prefixPath() != null) {
path = parsePrefixPath(ctx.prefixPath());
@@ -945,6 +949,43 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
return new ShowContinuousQueriesStatement();
}
+ // Create Model =====================================================================
+ @Override
+ public Statement visitCreateModel(IoTDBSqlParser.CreateModelContext ctx) {
+ CreateModelStatement createModelStatement = new CreateModelStatement();
+ createModelStatement.setModelId(parseIdentifier(ctx.modelId.getText()));
+ createModelStatement.setAuto(ctx.AUTO() != null);
+
+ Map<String, String> attributes = new HashMap<>();
+ for (IoTDBSqlParser.AttributePairContext attribute : ctx.attributePair()) {
+ attributes.put(
+ parseAttributeKey(attribute.key).toLowerCase(), parseAttributeValue(attribute.value));
+ }
+ createModelStatement.setAttributes(attributes);
+
+ createModelStatement.setQueryStatement(
+ (QueryStatement) visitSelectStatement(ctx.selectStatement()));
+ return createModelStatement;
+ }
+
+ // Drop Model =====================================================================
+ @Override
+ public Statement visitDropModel(IoTDBSqlParser.DropModelContext ctx) {
+ return new DropModelStatement(parseIdentifier(ctx.modelId.getText()));
+ }
+
+ // Show Models =====================================================================
+ @Override
+ public Statement visitShowModels(IoTDBSqlParser.ShowModelsContext ctx) {
+ return new ShowModelsStatement();
+ }
+
+ // Show Trails =====================================================================
+ @Override
+ public Statement visitShowTrails(IoTDBSqlParser.ShowTrailsContext ctx) {
+ return new ShowTrailsStatement(parseIdentifier(ctx.modelId.getText()));
+ }
+
/** Data Manipulation Language (DML) */
// Select Statement ========================================================================
@@ -1634,15 +1675,6 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
return new PartialPath(path);
}
- private PartialPath parseSuffixPath(IoTDBSqlParser.SuffixPathContext ctx) {
- List<IoTDBSqlParser.NodeNameContext> nodeNames = ctx.nodeName();
- String[] path = new String[nodeNames.size()];
- for (int i = 0; i < nodeNames.size(); i++) {
- path[i] = parseNodeName(nodeNames.get(i));
- }
- return new PartialPath(path);
- }
-
private PartialPath convertConstantToPath(String src) throws IllegalPathException {
return new PartialPath(src);
}
@@ -2050,49 +2082,48 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
// Create database
@Override
- public Statement visitCreateStorageGroup(IoTDBSqlParser.CreateStorageGroupContext ctx) {
+ public Statement visitCreateDatabase(IoTDBSqlParser.CreateDatabaseContext ctx) {
DatabaseSchemaStatement databaseSchemaStatement =
new DatabaseSchemaStatement(DatabaseSchemaStatement.DatabaseSchemaStatementType.CREATE);
PartialPath path = parsePrefixPath(ctx.prefixPath());
databaseSchemaStatement.setDatabasePath(path);
- if (ctx.storageGroupAttributesClause() != null) {
- parseStorageGroupAttributesClause(
- databaseSchemaStatement, ctx.storageGroupAttributesClause());
+ if (ctx.databaseAttributesClause() != null) {
+ parseDatabaseAttributesClause(databaseSchemaStatement, ctx.databaseAttributesClause());
}
return databaseSchemaStatement;
}
@Override
- public Statement visitAlterStorageGroup(IoTDBSqlParser.AlterStorageGroupContext ctx) {
+ public Statement visitAlterDatabase(IoTDBSqlParser.AlterDatabaseContext ctx) {
DatabaseSchemaStatement databaseSchemaStatement =
new DatabaseSchemaStatement(DatabaseSchemaStatement.DatabaseSchemaStatementType.ALTER);
PartialPath path = parsePrefixPath(ctx.prefixPath());
databaseSchemaStatement.setDatabasePath(path);
- parseStorageGroupAttributesClause(databaseSchemaStatement, ctx.storageGroupAttributesClause());
+ parseDatabaseAttributesClause(databaseSchemaStatement, ctx.databaseAttributesClause());
return databaseSchemaStatement;
}
- private void parseStorageGroupAttributesClause(
+ private void parseDatabaseAttributesClause(
DatabaseSchemaStatement databaseSchemaStatement,
- IoTDBSqlParser.StorageGroupAttributesClauseContext ctx) {
- for (IoTDBSqlParser.StorageGroupAttributeClauseContext attribute :
- ctx.storageGroupAttributeClause()) {
- if (attribute.TTL() != null) {
+ IoTDBSqlParser.DatabaseAttributesClauseContext ctx) {
+ for (IoTDBSqlParser.DatabaseAttributeClauseContext attribute : ctx.databaseAttributeClause()) {
+ IoTDBSqlParser.DatabaseAttributeKeyContext attributeKey = attribute.databaseAttributeKey();
+ if (attributeKey.TTL() != null) {
long ttl = Long.parseLong(attribute.INTEGER_LITERAL().getText());
databaseSchemaStatement.setTTL(ttl);
- } else if (attribute.SCHEMA_REPLICATION_FACTOR() != null) {
+ } else if (attributeKey.SCHEMA_REPLICATION_FACTOR() != null) {
int schemaReplicationFactor = Integer.parseInt(attribute.INTEGER_LITERAL().getText());
databaseSchemaStatement.setSchemaReplicationFactor(schemaReplicationFactor);
- } else if (attribute.DATA_REPLICATION_FACTOR() != null) {
+ } else if (attributeKey.DATA_REPLICATION_FACTOR() != null) {
int dataReplicationFactor = Integer.parseInt(attribute.INTEGER_LITERAL().getText());
databaseSchemaStatement.setDataReplicationFactor(dataReplicationFactor);
- } else if (attribute.TIME_PARTITION_INTERVAL() != null) {
+ } else if (attributeKey.TIME_PARTITION_INTERVAL() != null) {
long timePartitionInterval = Long.parseLong(attribute.INTEGER_LITERAL().getText());
databaseSchemaStatement.setTimePartitionInterval(timePartitionInterval);
- } else if (attribute.SCHEMA_REGION_GROUP_NUM() != null) {
+ } else if (attributeKey.SCHEMA_REGION_GROUP_NUM() != null) {
int schemaRegionGroupNum = Integer.parseInt(attribute.INTEGER_LITERAL().getText());
databaseSchemaStatement.setSchemaRegionGroupNum(schemaRegionGroupNum);
- } else if (attribute.DATA_REGION_GROUP_NUM() != null) {
+ } else if (attributeKey.DATA_REGION_GROUP_NUM() != null) {
int dataRegionGroupNum = Integer.parseInt(attribute.INTEGER_LITERAL().getText());
databaseSchemaStatement.setDataRegionGroupNum(dataRegionGroupNum);
}
@@ -2149,15 +2180,15 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
}
@Override
- public Statement visitDeleteStorageGroup(IoTDBSqlParser.DeleteStorageGroupContext ctx) {
- DeleteDatabaseStatement deleteDatabaseStatement = new DeleteDatabaseStatement();
+ public Statement visitDropDatabase(IoTDBSqlParser.DropDatabaseContext ctx) {
+ DeleteDatabaseStatement dropDatabaseStatement = new DeleteDatabaseStatement();
List<IoTDBSqlParser.PrefixPathContext> prefixPathContexts = ctx.prefixPath();
List<String> paths = new ArrayList<>();
for (IoTDBSqlParser.PrefixPathContext prefixPathContext : prefixPathContexts) {
paths.add(parsePrefixPath(prefixPathContext).getFullPath());
}
- deleteDatabaseStatement.setPrefixPath(paths);
- return deleteDatabaseStatement;
+ dropDatabaseStatement.setPrefixPath(paths);
+ return dropDatabaseStatement;
}
// Explain ========================================================================
@@ -2830,7 +2861,7 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
// show region
@Override
- public Statement visitShowRegion(IoTDBSqlParser.ShowRegionContext ctx) {
+ public Statement visitShowRegions(IoTDBSqlParser.ShowRegionsContext ctx) {
ShowRegionStatement showRegionStatement = new ShowRegionStatement();
// TODO: Maybe add a show ConfigNode region in the future
if (ctx.DATA() != null) {
@@ -3075,8 +3106,8 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
}
@Override
- public Statement visitDeleteTimeseriesOfSchemaTemplate(
- IoTDBSqlParser.DeleteTimeseriesOfSchemaTemplateContext ctx) {
+ public Statement visitDropTimeseriesOfSchemaTemplate(
+ IoTDBSqlParser.DropTimeseriesOfSchemaTemplateContext ctx) {
DeactivateTemplateStatement statement = new DeactivateTemplateStatement();
if (ctx.templateName != null) {
statement.setTemplateName(parseIdentifier(ctx.templateName.getText()));
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java
index e3951749d4..ee59471e6e 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java
@@ -837,38 +837,40 @@ public class StatementGenerator {
PartialPath path = new PartialPath(pathStr);
fromComponent.addPrefixPath(path);
}
+ queryStatement.setFromComponent(fromComponent);
SelectComponent selectComponent = new SelectComponent(zoneId);
selectComponent.addResultColumn(
new ResultColumn(
new TimeSeriesOperand(new PartialPath("", false)), ResultColumn.ColumnType.RAW));
+ queryStatement.setSelectComponent(selectComponent);
- WhereCondition whereCondition = new WhereCondition();
- String queryFilter = fetchTimeseriesReq.getQueryFilter();
- String[] times = queryFilter.split(",");
- int predictNum = 0;
- LessThanExpression rightPredicate = null;
- GreaterEqualExpression leftPredicate = null;
- if (!Objects.equals(times[0], "-1")) {
- leftPredicate =
- new GreaterEqualExpression(
- new TimestampOperand(), new ConstantOperand(TSDataType.INT64, times[0]));
- predictNum += 1;
- }
- if (!Objects.equals(times[1], "-1")) {
- rightPredicate =
- new LessThanExpression(
- new TimestampOperand(), new ConstantOperand(TSDataType.INT64, times[1]));
- predictNum += 2;
- }
- whereCondition.setPredicate(
- predictNum == 3
- ? new LogicAndExpression(leftPredicate, rightPredicate)
- : (predictNum == 1 ? leftPredicate : rightPredicate));
+ if (fetchTimeseriesReq.isSetQueryFilter()) {
+ WhereCondition whereCondition = new WhereCondition();
+ String queryFilter = fetchTimeseriesReq.getQueryFilter();
+ String[] times = queryFilter.split(",");
+ int predictNum = 0;
+ LessThanExpression rightPredicate = null;
+ GreaterEqualExpression leftPredicate = null;
+ if (!Objects.equals(times[0], "-1")) {
+ leftPredicate =
+ new GreaterEqualExpression(
+ new TimestampOperand(), new ConstantOperand(TSDataType.INT64, times[0]));
+ predictNum += 1;
+ }
+ if (!Objects.equals(times[1], "-1")) {
+ rightPredicate =
+ new LessThanExpression(
+ new TimestampOperand(), new ConstantOperand(TSDataType.INT64, times[1]));
+ predictNum += 2;
+ }
+ whereCondition.setPredicate(
+ predictNum == 3
+ ? new LogicAndExpression(leftPredicate, rightPredicate)
+ : (predictNum == 1 ? leftPredicate : rightPredicate));
- queryStatement.setWhereCondition(whereCondition);
- queryStatement.setFromComponent(fromComponent);
- queryStatement.setSelectComponent(selectComponent);
+ queryStatement.setWhereCondition(whereCondition);
+ }
return queryStatement;
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
index 10f6b7df2a..93bbda8947 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
@@ -73,6 +73,10 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTimeSeriesStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTriggersStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowVariablesStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.UnSetTTLStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.model.CreateModelStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.model.DropModelStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.model.ShowModelsStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.model.ShowTrailsStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.template.ActivateTemplateStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.template.BatchActivateTemplateStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
@@ -230,6 +234,23 @@ public abstract class StatementVisitor<R, C> {
return visitStatement(showPipePluginsStatement, context);
}
+ // ML Model
+ public R visitCreateModel(CreateModelStatement createModelStatement, C context) {
+ return visitStatement(createModelStatement, context);
+ }
+
+ public R visitDropModel(DropModelStatement dropModelStatement, C context) {
+ return visitStatement(dropModelStatement, context);
+ }
+
+ public R visitShowModels(ShowModelsStatement showModelsModelStatement, C context) {
+ return visitStatement(showModelsModelStatement, context);
+ }
+
+ public R visitShowTrails(ShowTrailsStatement showTrailsStatement, C context) {
+ return visitStatement(showTrailsStatement, context);
+ }
+
/** Data Manipulation Language (DML) */
// Select Statement
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/model/CreateModelStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/model/CreateModelStatement.java
new file mode 100644
index 0000000000..47372902aa
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/model/CreateModelStatement.java
@@ -0,0 +1,107 @@
+/*
+ * 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.mpp.plan.statement.metadata.model;
+
+import org.apache.iotdb.common.rpc.thrift.ModelTask;
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.exception.sql.SemanticException;
+import org.apache.iotdb.db.mpp.plan.analyze.QueryType;
+import org.apache.iotdb.db.mpp.plan.statement.IConfigStatement;
+import org.apache.iotdb.db.mpp.plan.statement.Statement;
+import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
+import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+public class CreateModelStatement extends Statement implements IConfigStatement {
+
+ private String modelId;
+ private boolean isAuto;
+ private Map<String, String> attributes;
+ private QueryStatement queryStatement;
+
+ public CreateModelStatement() {}
+
+ public String getModelId() {
+ return modelId;
+ }
+
+ public void setModelId(String modelId) {
+ this.modelId = modelId;
+ }
+
+ public boolean isAuto() {
+ return isAuto;
+ }
+
+ public void setAuto(boolean auto) {
+ isAuto = auto;
+ }
+
+ public Map<String, String> getAttributes() {
+ return attributes;
+ }
+
+ public void setAttributes(Map<String, String> attributes) {
+ this.attributes = attributes;
+ }
+
+ public QueryStatement getQueryStatement() {
+ return queryStatement;
+ }
+
+ public void setQueryStatement(QueryStatement queryStatement) {
+ this.queryStatement = queryStatement;
+ }
+
+ public ModelTask getModelTask() {
+ return ModelTask.valueOf(attributes.get("model_task").toUpperCase());
+ }
+
+ public String getModelType() {
+ return attributes.get("model_type");
+ }
+
+ public void semanticCheck() {
+ if (!attributes.containsKey("model_task")) {
+ throw new SemanticException("The attribute `model_task` must be specified.");
+ }
+ if (!attributes.containsKey("model_type")) {
+ throw new SemanticException("The attribute `model_type` must be specified.");
+ }
+ }
+
+ @Override
+ public List<? extends PartialPath> getPaths() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public QueryType getQueryType() {
+ return QueryType.WRITE;
+ }
+
+ @Override
+ public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
+ return visitor.visitCreateModel(this, context);
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/model/DropModelStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/model/DropModelStatement.java
new file mode 100644
index 0000000000..16ecc95cdf
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/model/DropModelStatement.java
@@ -0,0 +1,57 @@
+/*
+ * 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.mpp.plan.statement.metadata.model;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.mpp.plan.analyze.QueryType;
+import org.apache.iotdb.db.mpp.plan.statement.IConfigStatement;
+import org.apache.iotdb.db.mpp.plan.statement.Statement;
+import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
+
+import java.util.Collections;
+import java.util.List;
+
+public class DropModelStatement extends Statement implements IConfigStatement {
+
+ private final String modelId;
+
+ public DropModelStatement(String modelId) {
+ this.modelId = modelId;
+ }
+
+ public String getModelId() {
+ return modelId;
+ }
+
+ @Override
+ public List<? extends PartialPath> getPaths() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public QueryType getQueryType() {
+ return QueryType.WRITE;
+ }
+
+ @Override
+ public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
+ return visitor.visitDropModel(this, context);
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/model/ShowModelsStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/model/ShowModelsStatement.java
new file mode 100644
index 0000000000..88f075889c
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/model/ShowModelsStatement.java
@@ -0,0 +1,49 @@
+/*
+ * 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.mpp.plan.statement.metadata.model;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.mpp.plan.analyze.QueryType;
+import org.apache.iotdb.db.mpp.plan.statement.IConfigStatement;
+import org.apache.iotdb.db.mpp.plan.statement.Statement;
+import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
+
+import java.util.Collections;
+import java.util.List;
+
+public class ShowModelsStatement extends Statement implements IConfigStatement {
+
+ public ShowModelsStatement() {}
+
+ @Override
+ public List<? extends PartialPath> getPaths() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public QueryType getQueryType() {
+ return QueryType.READ;
+ }
+
+ @Override
+ public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
+ return visitor.visitShowModels(this, context);
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/model/ShowTrailsStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/model/ShowTrailsStatement.java
new file mode 100644
index 0000000000..108ec8eb92
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/model/ShowTrailsStatement.java
@@ -0,0 +1,57 @@
+/*
+ * 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.mpp.plan.statement.metadata.model;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.mpp.plan.analyze.QueryType;
+import org.apache.iotdb.db.mpp.plan.statement.IConfigStatement;
+import org.apache.iotdb.db.mpp.plan.statement.Statement;
+import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
+
+import java.util.Collections;
+import java.util.List;
+
+public class ShowTrailsStatement extends Statement implements IConfigStatement {
+
+ private final String modelId;
+
+ public ShowTrailsStatement(String modelId) {
+ this.modelId = modelId;
+ }
+
+ public String getModelId() {
+ return modelId;
+ }
+
+ @Override
+ public List<? extends PartialPath> getPaths() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public QueryType getQueryType() {
+ return QueryType.READ;
+ }
+
+ @Override
+ public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
+ return visitor.visitShowTrails(this, context);
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java
index da32425582..d00903759a 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java
@@ -870,8 +870,7 @@ public class DataNodeInternalRPCServiceImpl implements IDataNodeRPCService.Iface
@Override
public TSStatus deleteModelMetrics(TDeleteModelMetricsReq req) throws TException {
- // TODO
- throw new TException(new UnsupportedOperationException().getCause());
+ return RpcUtils.SUCCESS_STATUS;
}
private PathPatternTree filterPathPatternTree(PathPatternTree patternTree, String storageGroup) {