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 de38351e29ca2..bc5bcd9849a38 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 @@ -94,8 +94,8 @@ createSchemaTemplate ; templateMeasurementClause - : nodeNameWithoutWildcard attributeClauses #nonAlignedTemplateMeasurement - | alignedDevice=nodeNameWithoutWildcard LR_BRACKET nodeNameWithoutWildcard attributeClauses + : suffixPath attributeClauses #nonAlignedTemplateMeasurement + | suffixPath LR_BRACKET nodeNameWithoutWildcard attributeClauses (COMMA nodeNameWithoutWildcard attributeClauses)+ RR_BRACKET #alignedTemplateMeasurement ; diff --git a/docs/UserGuide/Appendix/SQL-Reference.md b/docs/UserGuide/Appendix/SQL-Reference.md index dea41d4eccb49..0cf4657fa779e 100644 --- a/docs/UserGuide/Appendix/SQL-Reference.md +++ b/docs/UserGuide/Appendix/SQL-Reference.md @@ -144,8 +144,8 @@ Note: It is not currently supported to set an alias, tag, and attribute for alig ``` CREATE SCHEMA TEMPLATE LR_BRACKET (COMMA plateMeasurementClause>)* RR_BRACKET templateMeasurementClause - : nodeNameWithoutWildcard attributeClauses #nonAlignedTemplateMeasurement - | alignedDevice=nodeNameWithoutWildcard LR_BRACKET nodeNameWithoutWildcard attributeClauses + : suffixPath attributeClauses #nonAlignedTemplateMeasurement + | suffixPath LR_BRACKET nodeNameWithoutWildcard attributeClauses (COMMA nodeNameWithoutWildcard attributeClauses)+ RR_BRACKET #alignedTemplateMeasurement ; Eg: CREATE SCHEMA TEMPLATE temp1( @@ -158,19 +158,19 @@ Eg: CREATE SCHEMA TEMPLATE temp1( * Set Schema Template Statement ``` -SET SCHEMA TEMPLATE TO +SET SCHEMA TEMPLATE TO Eg: SET SCHEMA TEMPLATE temp1 TO root.beijing ``` * Create Timeseries Of Schema Template Statement ``` -CREATE TIMESERIES OF SCHEMA TEMPLATE ON +CREATE TIMESERIES OF SCHEMA TEMPLATE ON Eg: CREATE TIMESERIES OF SCHEMA TEMPLATE ON root.beijing ``` * Unset Schema Template Statement ``` -UNSET SCHEMA TEMPLATE FROM +UNSET SCHEMA TEMPLATE FROM Eg: UNSET SCHEMA TEMPLATE temp1 FROM root.beijing ``` diff --git a/docs/UserGuide/IoTDB-SQL-Language/DDL-Data-Definition-Language.md b/docs/UserGuide/IoTDB-SQL-Language/DDL-Data-Definition-Language.md index 813a1e1136bfa..2d832d2b7e0a7 100644 --- a/docs/UserGuide/IoTDB-SQL-Language/DDL-Data-Definition-Language.md +++ b/docs/UserGuide/IoTDB-SQL-Language/DDL-Data-Definition-Language.md @@ -538,9 +538,11 @@ IoTDB supports the schema template function, enabling different entities of the The SQL Statement for creating schema template is as follow: ``` -IoTDB> create schema template temp1(GPS(lat FLOAT encoding=Gorilla, lon FLOAT encoding=Gorilla) compression=SNAPPY, status BOOLEAN encoding=PLAIN compression=SNAPPY) +IoTDB> create schema template temp1(GPS(lat FLOAT encoding=Gorilla, lon FLOAT encoding=Gorilla compression=SNAPPY), status BOOLEAN encoding=PLAIN compression=SNAPPY) ``` +The` lat` and `lon` measurements under the `GPS` device are aligned. + ### Set Schema Template The SQL Statement for setting schema template is as follow: diff --git a/docs/zh/UserGuide/Appendix/SQL-Reference.md b/docs/zh/UserGuide/Appendix/SQL-Reference.md index c2a60d69c1566..f593902142c9a 100644 --- a/docs/zh/UserGuide/Appendix/SQL-Reference.md +++ b/docs/zh/UserGuide/Appendix/SQL-Reference.md @@ -129,12 +129,12 @@ Note: It is not supported to set different compression for a group of aligned ti Note: It is not currently supported to set an alias, tag, and attribute for aligned timeseries. ``` -* 创建设备模板语句 +* 创建元数据模板语句 ``` CREATE SCHEMA TEMPLATE LR_BRACKET (COMMA plateMeasurementClause>)* RR_BRACKET templateMeasurementClause - : nodeNameWithoutWildcard attributeClauses #nonAlignedTemplateMeasurement - | alignedDevice=nodeNameWithoutWildcard LR_BRACKET nodeNameWithoutWildcard attributeClauses + : suffixPath attributeClauses #nonAlignedTemplateMeasurement + | suffixPath LR_BRACKET nodeNameWithoutWildcard attributeClauses (COMMA nodeNameWithoutWildcard attributeClauses)+ RR_BRACKET #alignedTemplateMeasurement ; Eg: CREATE SCHEMA TEMPLATE temp1( @@ -145,21 +145,21 @@ Eg: CREATE SCHEMA TEMPLATE temp1( ) ``` -* 挂载设备模板语句 +* 挂载元数据模板语句 ``` -SET SCHEMA TEMPLATE TO +SET SCHEMA TEMPLATE TO Eg: SET SCHEMA TEMPLATE temp1 TO root.beijing ``` -* 创建模板时间序列语句 +* 根据元数据模板创建时间序列语句 ``` -CREATE TIMESERIES OF SCHEMA TEMPLATE ON +CREATE TIMESERIES OF SCHEMA TEMPLATE ON Eg: CREATE TIMESERIES OF SCHEMA TEMPLATE ON root.beijing ``` -* 卸载设备模板语句 +* 卸载元数据模板语句 ``` -UNSET SCHEMA TEMPLATE FROM +UNSET SCHEMA TEMPLATE FROM Eg: UNSET SCHEMA TEMPLATE temp1 FROM root.beijing ``` diff --git a/docs/zh/UserGuide/IoTDB-SQL-Language/DDL-Data-Definition-Language.md b/docs/zh/UserGuide/IoTDB-SQL-Language/DDL-Data-Definition-Language.md index 3f46afc2f6a10..4789da3c0704e 100644 --- a/docs/zh/UserGuide/IoTDB-SQL-Language/DDL-Data-Definition-Language.md +++ b/docs/zh/UserGuide/IoTDB-SQL-Language/DDL-Data-Definition-Language.md @@ -537,27 +537,29 @@ Total line number = 2 It costs 0.001s ``` -## 物理量模板 +## 元数据模板 -IoTDB 支持物理量模板功能,实现同类型不同实体的物理量元数据共享,减少元数据内存占用,同时简化同类型实体的管理。 +IoTDB 支持元数据模板功能,实现同类型不同实体的物理量元数据共享,减少元数据内存占用,同时简化同类型实体的管理。 -### 创建物理量模板 +### 创建元数据模板 -创建物理量模板的 SQL 语句如下所示: +创建元数据模板的 SQL 语句如下所示: ``` -IoTDB> create schema template temp1(GPS(lat FLOAT encoding=Gorilla, lon FLOAT encoding=Gorilla) compression=SNAPPY, status BOOLEAN encoding=PLAIN compression=SNAPPY) +IoTDB> create schema template temp1(GPS(lat FLOAT encoding=Gorilla, lon FLOAT encoding=Gorilla compression=SNAPPY), status BOOLEAN encoding=PLAIN compression=SNAPPY) ``` -### 挂载物理量模板 +其中,`GPS` 设备下的物理量 `lat` 和 `lon` 是对齐的。 -挂载物理量模板的 SQL 语句如下所示: +### 挂载元数据模板 + +挂载元数据模板的 SQL 语句如下所示: ``` IoTDB> set schema template temp1 to root.ln.wf01 ``` -挂载好物理量模板后,即可进行数据的写入。例如存储组为root.ln,模板temp1被挂载到了节点root.ln.wf01,那么可直接向时间序列(如root.ln.wf01.GPS.lat和root.ln.wf01.status)写入时间序列数据,该时间序列已可被当作正常创建的序列使用。 +挂载好元数据模板后,即可进行数据的写入。例如存储组为root.ln,模板temp1被挂载到了节点root.ln.wf01,那么可直接向时间序列(如root.ln.wf01.GPS.lat和root.ln.wf01.status)写入时间序列数据,该时间序列已可被当作正常创建的序列使用。 **注意**:在插入数据之前,模板定义的时间序列不会被创建。可以使用如下SQL语句在插入数据前创建时间序列: @@ -565,9 +567,9 @@ IoTDB> set schema template temp1 to root.ln.wf01 IoTDB> create timeseries of schema template on root.ln.wf01 ``` -### 卸载物理量模板 +### 卸载元数据模板 -卸载物理量模板的 SQL 语句如下所示: +卸载元数据模板的 SQL 语句如下所示: ``` IoTDB> unset schema template temp1 from root.beijing diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSchemaTemplateIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSchemaTemplateIT.java index 9d2a2cef9f571..01c0c1d1fd02c 100644 --- a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSchemaTemplateIT.java +++ b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSchemaTemplateIT.java @@ -55,7 +55,6 @@ public void tearDown() throws Exception { } @Test - @Ignore public void testCreateTemplateAndCreateTimeseries() throws SQLException { statement.execute("CREATE STORAGE GROUP root.sg1"); @@ -72,7 +71,7 @@ public void testCreateTemplateAndCreateTimeseries() throws SQLException { } // set schema template - statement.execute("SET SCHEMA TEMPLATE temp1 TO root.sg1"); + statement.execute("SET SCHEMA TEMPLATE temp1 TO root.sg1.d1"); statement.execute("SHOW TIMESERIES root.sg1.**"); try (ResultSet resultSet = statement.getResultSet()) { @@ -80,16 +79,16 @@ public void testCreateTemplateAndCreateTimeseries() throws SQLException { } // create timeseries of schema template - statement.execute("CREATE TIMESERIES OF SCHEMA TEMPLATE ON root.sg1"); + statement.execute("CREATE TIMESERIES OF SCHEMA TEMPLATE ON root.sg1.d1"); boolean hasResult = statement.execute("SHOW TIMESERIES root.sg1.**"); Assert.assertTrue(hasResult); String[] expectedResult = new String[] { - "root.sg1.vector1.s1,FLOAT,GORILLA,SNAPPY", - "root.sg1.vector1.s2,INT64,RLE,SNAPPY", - "root.sg1.s1,INT64,RLE,SNAPPY" + "root.sg1.d1.vector1.s1,FLOAT,GORILLA,SNAPPY", + "root.sg1.d1.vector1.s2,INT64,RLE,SNAPPY", + "root.sg1.d1.s1,INT64,RLE,SNAPPY" }; int count = 0; @@ -109,15 +108,30 @@ public void testCreateTemplateAndCreateTimeseries() throws SQLException { } Assert.assertEquals(3, count); + hasResult = statement.execute("SHOW DEVICES"); + Assert.assertTrue(hasResult); + + expectedResult = new String[] {"root.sg1.d1,false", "root.sg1.d1.vector1,true"}; + + count = 0; + try (ResultSet resultSet = statement.getResultSet()) { + while (resultSet.next()) { + String ActualResult = + resultSet.getString("devices") + "," + resultSet.getString("isAligned"); + Assert.assertEquals(expectedResult[count], ActualResult); + count++; + } + } + Assert.assertEquals(2, count); + try { - statement.execute("UNSET SCHEMA TEMPLATE temp1 FROM root.sg1"); + statement.execute("UNSET SCHEMA TEMPLATE temp1 FROM root.sg1.d1"); } catch (IoTDBSQLException e) { - Assert.assertEquals("326: Template is in use on root.sg1", e.getMessage()); + Assert.assertEquals("326: Template is in use on root.sg1.d1", e.getMessage()); } } @Test - @Ignore public void testCreateAndSetSchemaTemplate() throws SQLException { statement.execute("CREATE STORAGE GROUP root.sg1"); @@ -134,7 +148,7 @@ public void testCreateAndSetSchemaTemplate() throws SQLException { } // set schema template - statement.execute("SET SCHEMA TEMPLATE temp1 TO root.sg1"); + statement.execute("SET SCHEMA TEMPLATE temp1 TO root.sg1.d1"); statement.execute("SHOW TIMESERIES root.sg1.**"); try (ResultSet resultSet = statement.getResultSet()) { @@ -171,8 +185,24 @@ public void testCreateAndSetSchemaTemplate() throws SQLException { } Assert.assertEquals(3, count); + hasResult = statement.execute("SHOW DEVICES"); + Assert.assertTrue(hasResult); + + expectedResult = new String[] {"root.sg1.d1,false", "root.sg1.d1.vector1,true"}; + + count = 0; + try (ResultSet resultSet = statement.getResultSet()) { + while (resultSet.next()) { + String ActualResult = + resultSet.getString("devices") + "," + resultSet.getString("isAligned"); + Assert.assertEquals(expectedResult[count], ActualResult); + count++; + } + } + Assert.assertEquals(2, count); + try { - statement.execute("UNSET SCHEMA TEMPLATE temp1 FROM root.sg1"); + statement.execute("UNSET SCHEMA TEMPLATE temp1 FROM root.sg1.d1"); } catch (IoTDBSQLException e) { Assert.assertEquals("326: Template is in use on root.sg1.d1", e.getMessage()); } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateTemplateOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateTemplateOperator.java index 45df5bbecc74a..0f5d3ec27d0dd 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateTemplateOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateTemplateOperator.java @@ -34,7 +34,6 @@ public class CreateTemplateOperator extends Operator { String name; - List schemaNames = new ArrayList<>(); List> measurements = new ArrayList<>(); List> dataTypes = new ArrayList<>(); List> encodings = new ArrayList<>(); @@ -53,18 +52,6 @@ public void setName(String name) { this.name = name; } - public List getSchemaNames() { - return schemaNames; - } - - public void setSchemaNames(List schemaNames) { - this.schemaNames = schemaNames; - } - - public void addSchemaName(String schemaName) { - this.schemaNames.add(schemaName); - } - public List> getMeasurements() { return measurements; } @@ -116,7 +103,6 @@ public void addCompressor(List compressors) { @Override public PhysicalPlan generatePhysicalPlan(PhysicalGenerator generator) throws QueryProcessException { - return new CreateTemplatePlan( - name, schemaNames, measurements, dataTypes, encodings, compressors); + return new CreateTemplatePlan(name, measurements, dataTypes, encodings, compressors); } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java index 533ae4f32343a..cbf194ed2641e 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java @@ -333,36 +333,34 @@ public Operator visitCreateSchemaTemplate(IoTDBSqlParser.CreateSchemaTemplateCon private void parseTemplateMeasurementClause( IoTDBSqlParser.TemplateMeasurementClauseContext ctx, CreateTemplateOperator createTemplateOperator) { - String schemaName; List measurements = new ArrayList<>(); List dataTypes = new ArrayList<>(); List encodings = new ArrayList<>(); List compressors = new ArrayList<>(); if (ctx instanceof IoTDBSqlParser.AlignedTemplateMeasurementContext) { // aligned measurement + String alignedSuffixPath = + ((IoTDBSqlParser.AlignedTemplateMeasurementContext) ctx).suffixPath().getText(); List measurementList = ((IoTDBSqlParser.AlignedTemplateMeasurementContext) ctx).nodeNameWithoutWildcard(); List attributeList = ((IoTDBSqlParser.AlignedTemplateMeasurementContext) ctx).attributeClauses(); - schemaName = measurementList.get(0).getText(); for (int i = 0; i < attributeList.size(); i++) { - measurements.add(measurementList.get(i + 1).getText()); + measurements.add( + alignedSuffixPath.concat( + TsFileConstant.PATH_SEPARATOR + measurementList.get(i).getText())); parseAttributeClause(attributeList.get(i), dataTypes, encodings, compressors); } } else { // non-aligned template measurement - schemaName = - ((IoTDBSqlParser.NonAlignedTemplateMeasurementContext) ctx) - .nodeNameWithoutWildcard() - .getText(); - measurements.add(schemaName); + measurements.add( + ((IoTDBSqlParser.NonAlignedTemplateMeasurementContext) ctx).suffixPath().getText()); parseAttributeClause( ((IoTDBSqlParser.NonAlignedTemplateMeasurementContext) ctx).attributeClauses(), dataTypes, encodings, compressors); } - createTemplateOperator.addSchemaName(schemaName); createTemplateOperator.addMeasurements(measurements); createTemplateOperator.addDataTypes(dataTypes); createTemplateOperator.addEncodings(encodings);