This is an automated email from the ASF dual-hosted git repository. xiangweiwei pushed a commit to branch removeTokenType in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit bbb8bc082dec73126e057943fe909dee89e728c8 Author: Alima777 <[email protected]> AuthorDate: Fri Jun 4 17:16:26 2021 +0800 move part1 --- .../org/apache/iotdb/db/qp/logical/Operator.java | 6 + .../qp/logical/crud/AggregationQueryOperator.java | 58 +++++ .../db/qp/logical/crud/DeleteDataOperator.java | 10 + .../db/qp/logical/crud/FillQueryOperator.java | 21 ++ .../qp/logical/crud/GroupByFillQueryOperator.java | 33 ++- .../db/qp/logical/crud/GroupByQueryOperator.java | 30 ++- .../iotdb/db/qp/logical/crud/InsertOperator.java | 41 ++++ .../db/qp/logical/crud/SpecialClauseComponent.java | 4 + .../db/qp/logical/sys/AlterTimeSeriesOperator.java | 11 + .../iotdb/db/qp/logical/sys/AuthorOperator.java | 22 ++ .../db/qp/logical/sys/CreateIndexOperator.java | 10 + .../qp/logical/sys/CreateTimeSeriesOperator.java | 29 +++ .../iotdb/db/qp/logical/sys/DataAuthOperator.java | 8 + .../qp/logical/sys/DeleteStorageGroupOperator.java | 8 + .../qp/logical/sys/DeleteTimeSeriesOperator.java | 8 + .../iotdb/db/qp/logical/sys/DropIndexOperator.java | 10 + .../iotdb/db/qp/logical/sys/FlushOperator.java | 10 + .../iotdb/db/qp/logical/sys/LoadDataOperator.java | 8 + .../iotdb/db/qp/logical/sys/MergeOperator.java | 15 ++ .../db/qp/logical/sys/SetStorageGroupOperator.java | 8 + .../iotdb/db/qp/logical/sys/SetTTLOperator.java | 10 + .../iotdb/db/qp/logical/sys/ShowTTLOperator.java | 8 + .../iotdb/db/qp/logical/sys/TracingOperator.java | 10 + .../{SetTTLOperator.java => UnSetTTLOperator.java} | 19 +- .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java | 3 +- .../iotdb/db/qp/strategy/PhysicalGenerator.java | 268 +-------------------- 26 files changed, 390 insertions(+), 278 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java index ba9b7bb..9cb15a1 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java @@ -18,7 +18,10 @@ */ package org.apache.iotdb.db.qp.logical; +import org.apache.iotdb.db.exception.query.QueryProcessException; import org.apache.iotdb.db.qp.constant.SQLConstant; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; /** This class is a superclass of all operator. */ public abstract class Operator { @@ -64,6 +67,9 @@ public abstract class Operator { return SQLConstant.tokenNames.get(tokenIntType); } + public abstract PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException; + /** If you want to add new OperatorType, you must add it in the last. */ public enum OperatorType { NULL, diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/AggregationQueryOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/AggregationQueryOperator.java index bc7efb5..6a9ab43 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/AggregationQueryOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/AggregationQueryOperator.java @@ -19,10 +19,21 @@ package org.apache.iotdb.db.qp.logical.crud; +import org.apache.iotdb.db.exception.metadata.MetadataException; import org.apache.iotdb.db.exception.query.LogicalOperatorException; +import org.apache.iotdb.db.exception.query.QueryProcessException; +import org.apache.iotdb.db.metadata.PartialPath; +import org.apache.iotdb.db.qp.constant.SQLConstant; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.crud.AggregationPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; import org.apache.iotdb.db.query.expression.Expression; import org.apache.iotdb.db.query.expression.ResultColumn; import org.apache.iotdb.db.query.expression.unary.TimeSeriesOperand; +import org.apache.iotdb.db.utils.SchemaUtils; +import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; + +import java.util.List; public class AggregationQueryOperator extends QueryOperator { @@ -45,11 +56,58 @@ public class AggregationQueryOperator extends QueryOperator { throw new LogicalOperatorException("AGGREGATION doesn't support disable align clause."); } + if (hasTimeSeriesGeneratingFunction()) { + throw new LogicalOperatorException( + "User-defined and built-in hybrid aggregation is not supported together."); + } + for (ResultColumn resultColumn : selectComponent.getResultColumns()) { Expression expression = resultColumn.getExpression(); if (expression instanceof TimeSeriesOperand) { throw new LogicalOperatorException(ERROR_MESSAGE1); } } + + if (specialClauseComponent.isGroupByLevel()) { + try { + if (!verifyAllAggregationDataTypesEqual()) { + throw new LogicalOperatorException("Aggregate among unmatched data types"); + } + } catch (MetadataException e) { + throw new LogicalOperatorException(e); + } + } + } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + AggregationPlan queryPlan = new AggregationPlan(); + + queryPlan.setPaths(selectComponent.getPaths()); + queryPlan.setAggregations(selectComponent.getAggregationFunctions()); + queryPlan.setLevel(specialClauseComponent.getLevel()); + + return queryPlan; + } + + private boolean verifyAllAggregationDataTypesEqual() throws MetadataException { + List<String> aggregations = selectComponent.getAggregationFunctions(); + if (aggregations.isEmpty()) { + return true; + } + + List<PartialPath> paths = selectComponent.getPaths(); + List<TSDataType> dataTypes = SchemaUtils.getSeriesTypesByPaths(paths); + String aggType = aggregations.get(0); + switch (aggType) { + case SQLConstant.MIN_VALUE: + case SQLConstant.MAX_VALUE: + case SQLConstant.AVG: + case SQLConstant.SUM: + return dataTypes.stream().allMatch(dataTypes.get(0)::equals); + default: + return true; + } } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/DeleteDataOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/DeleteDataOperator.java index e7a0619..3e9512d 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/DeleteDataOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/DeleteDataOperator.java @@ -18,8 +18,12 @@ */ package org.apache.iotdb.db.qp.logical.crud; +import org.apache.iotdb.db.exception.query.QueryProcessException; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.crud.DeletePlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; import java.util.ArrayList; import java.util.List; @@ -61,4 +65,10 @@ public class DeleteDataOperator extends Operator { public void setEndTime(long time) { this.endTime = time; } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + return new DeletePlan(getStartTime(), getEndTime(), getPaths()); + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/FillQueryOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/FillQueryOperator.java index 2a707f4..6deb3ad 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/FillQueryOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/FillQueryOperator.java @@ -20,7 +20,11 @@ package org.apache.iotdb.db.qp.logical.crud; import org.apache.iotdb.db.exception.query.LogicalOperatorException; +import org.apache.iotdb.db.exception.query.QueryProcessException; import org.apache.iotdb.db.qp.constant.FilterConstant.FilterType; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.crud.FillQueryPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; public class FillQueryOperator extends QueryOperator { @@ -32,9 +36,26 @@ public class FillQueryOperator extends QueryOperator { throw new LogicalOperatorException("FILL doesn't support disable align clause."); } + if (hasTimeSeriesGeneratingFunction()) { + throw new LogicalOperatorException("Fill functions are not supported in UDF queries."); + } + FilterOperator filterOperator = whereComponent.getFilterOperator(); if (!filterOperator.isLeaf() || filterOperator.getFilterType() != FilterType.EQUAL) { throw new LogicalOperatorException("Only \"=\" can be used in fill function"); + } else if (!filterOperator.isSingle()) { + throw new LogicalOperatorException("Slice query must select a single time point"); } } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + FillQueryPlan queryPlan = new FillQueryPlan(); + FilterOperator timeFilter = whereComponent.getFilterOperator(); + long time = Long.parseLong(((BasicFunctionOperator) timeFilter).getValue()); + queryPlan.setQueryTime(time); + queryPlan.setFillType(((FillClauseComponent) specialClauseComponent).getFillTypes()); + return queryPlan; + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByFillQueryOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByFillQueryOperator.java index b28b031..5829ff1 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByFillQueryOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByFillQueryOperator.java @@ -19,4 +19,35 @@ package org.apache.iotdb.db.qp.logical.crud; -public class GroupByFillQueryOperator extends GroupByQueryOperator {} +import org.apache.iotdb.db.exception.query.LogicalOperatorException; +import org.apache.iotdb.db.exception.query.QueryProcessException; +import org.apache.iotdb.db.qp.constant.SQLConstant; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.crud.GroupByTimeFillPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; + +public class GroupByFillQueryOperator extends GroupByQueryOperator { + + @Override + public void check() throws LogicalOperatorException { + super.check(); + + for (String aggregation : selectComponent.getAggregationFunctions()) { + if (!SQLConstant.LAST_VALUE.equals(aggregation)) { + throw new LogicalOperatorException("Group By Fill only support last_value function"); + } + } + } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + GroupByTimeFillPlan queryPlan = new GroupByTimeFillPlan(); + + GroupByFillClauseComponent groupByFillClauseComponent = + (GroupByFillClauseComponent) specialClauseComponent; + queryPlan.setFillType(groupByFillClauseComponent.getFillTypes()); + + return queryPlan; + } +} diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByQueryOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByQueryOperator.java index 363eb90..0da70d0 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByQueryOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByQueryOperator.java @@ -19,4 +19,32 @@ package org.apache.iotdb.db.qp.logical.crud; -public class GroupByQueryOperator extends AggregationQueryOperator {} +import org.apache.iotdb.db.exception.query.QueryProcessException; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.crud.GroupByTimePlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; + +public class GroupByQueryOperator extends AggregationQueryOperator { + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + GroupByTimePlan queryPlan = new GroupByTimePlan(); + + GroupByClauseComponent groupByClauseComponent = (GroupByClauseComponent) specialClauseComponent; + queryPlan.setInterval(groupByClauseComponent.getUnit()); + queryPlan.setIntervalByMonth(groupByClauseComponent.isIntervalByMonth()); + queryPlan.setSlidingStep(groupByClauseComponent.getSlidingStep()); + queryPlan.setSlidingStepByMonth(groupByClauseComponent.isSlidingStepByMonth()); + queryPlan.setLeftCRightO(groupByClauseComponent.isLeftCRightO()); + if (!groupByClauseComponent.isLeftCRightO()) { + queryPlan.setStartTime(groupByClauseComponent.getStartTime() + 1); + queryPlan.setEndTime(groupByClauseComponent.getEndTime() + 1); + } else { + queryPlan.setStartTime(groupByClauseComponent.getStartTime()); + queryPlan.setEndTime(groupByClauseComponent.getEndTime()); + } + + return queryPlan; + } +} diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/InsertOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/InsertOperator.java index e8c3f42..cabbd00 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/InsertOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/InsertOperator.java @@ -18,8 +18,16 @@ */ package org.apache.iotdb.db.qp.logical.crud; +import org.apache.iotdb.db.exception.query.QueryProcessException; +import org.apache.iotdb.db.exception.runtime.SQLParserException; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.crud.InsertRowPlan; +import org.apache.iotdb.db.qp.physical.crud.InsertRowsPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; + +import java.util.Arrays; /** this class extends {@code RootOperator} and process insert statement. */ public class InsertOperator extends Operator { @@ -66,4 +74,37 @@ public class InsertOperator extends Operator { public void setTimes(long[] times) { this.times = times; } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + int measurementsNum = 0; + for (String measurement : measurementList) { + if (measurement.startsWith("(") && measurement.endsWith(")")) { + measurementsNum += measurement.replace("(", "").replace(")", "").split(",").length; + } else { + measurementsNum++; + } + } + if (measurementsNum == 0 || (valueList.length % measurementsNum != 0)) { + throw new SQLParserException( + String.format( + "the measurementList's size %d is not consistent with the valueList's size %d", + measurementsNum, valueList.length)); + } + if (measurementsNum == valueList.length) { + return new InsertRowPlan(device, times[0], measurementList, valueList); + } + InsertRowsPlan insertRowsPlan = new InsertRowsPlan(); + for (int i = 0; i < times.length; i++) { + insertRowsPlan.addOneInsertRowPlan( + new InsertRowPlan( + device, + times[0], + measurementList, + Arrays.copyOfRange(valueList, i * measurementsNum, (i + 1) * measurementsNum)), + i); + } + return insertRowsPlan; + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SpecialClauseComponent.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SpecialClauseComponent.java index f935433..5b63bd9 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SpecialClauseComponent.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SpecialClauseComponent.java @@ -111,6 +111,10 @@ public class SpecialClauseComponent { this.level = level; } + public boolean isGroupByLevel() { + return level != -1; + } + public boolean isAlignByDevice() { return isAlignByDevice; } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AlterTimeSeriesOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AlterTimeSeriesOperator.java index 173ec20..3cfcdda 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AlterTimeSeriesOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AlterTimeSeriesOperator.java @@ -19,8 +19,12 @@ package org.apache.iotdb.db.qp.logical.sys; +import org.apache.iotdb.db.exception.query.QueryProcessException; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.AlterTimeSeriesPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; import java.util.Map; @@ -95,6 +99,13 @@ public class AlterTimeSeriesOperator extends Operator { this.alias = alias; } + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + return new AlterTimeSeriesPlan( + getPath(), getAlterType(), getAlterMap(), getAlias(), getTagsMap(), getAttributesMap()); + } + public enum AlterType { RENAME, SET, diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AuthorOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AuthorOperator.java index a82ac00..8629d4c 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AuthorOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AuthorOperator.java @@ -18,8 +18,13 @@ */ package org.apache.iotdb.db.qp.logical.sys; +import org.apache.iotdb.db.auth.AuthException; +import org.apache.iotdb.db.exception.query.QueryProcessException; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.AuthorPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; /** * this class maintains information in Author statement, including CREATE, DROP, GRANT and REVOKE. @@ -110,6 +115,23 @@ public class AuthorOperator extends Operator { this.nodeName = nodePath; } + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + try { + return new AuthorPlan( + getAuthorType(), + getUserName(), + getRoleName(), + getPassWord(), + getNewPassword(), + getPrivilegeList(), + getNodeName()); + } catch (AuthException e) { + throw new QueryProcessException(e.getMessage()); + } + } + public enum AuthorType { CREATE_USER, CREATE_ROLE, diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateIndexOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateIndexOperator.java index 8934bee..14137ee 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateIndexOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateIndexOperator.java @@ -18,9 +18,13 @@ */ package org.apache.iotdb.db.qp.logical.sys; +import org.apache.iotdb.db.exception.query.QueryProcessException; import org.apache.iotdb.db.index.common.IndexType; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.CreateIndexPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; import java.util.ArrayList; import java.util.List; @@ -71,4 +75,10 @@ public class CreateIndexOperator extends Operator { public void setIndexType(IndexType indexType) { this.indexType = indexType; } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + return new CreateIndexPlan(getPaths(), getProps(), getTime(), getIndexType()); + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateTimeSeriesOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateTimeSeriesOperator.java index 95d173f..5c78597 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateTimeSeriesOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateTimeSeriesOperator.java @@ -18,8 +18,12 @@ */ package org.apache.iotdb.db.qp.logical.sys; +import org.apache.iotdb.db.exception.query.QueryProcessException; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding; @@ -105,4 +109,29 @@ public class CreateTimeSeriesOperator extends Operator { public void setTags(Map<String, String> tags) { this.tags = tags; } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + if (getTags() != null + && !getTags().isEmpty() + && getAttributes() != null + && !getAttributes().isEmpty()) { + for (String tagKey : getTags().keySet()) { + if (getAttributes().containsKey(tagKey)) { + throw new QueryProcessException( + String.format("Tag and attribute shouldn't have the same property key [%s]", tagKey)); + } + } + } + return new CreateTimeSeriesPlan( + getPath(), + getDataType(), + getEncoding(), + getCompressor(), + getProps(), + getTags(), + getAttributes(), + getAlias()); + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DataAuthOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DataAuthOperator.java index 635e85d..b12f943 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DataAuthOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DataAuthOperator.java @@ -20,6 +20,9 @@ package org.apache.iotdb.db.qp.logical.sys; import org.apache.iotdb.db.qp.constant.SQLConstant; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.DataAuthPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; import java.util.List; @@ -40,4 +43,9 @@ public class DataAuthOperator extends Operator { public List<String> getUsers() { return users; } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) { + return new DataAuthPlan(getType(), getUsers()); + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteStorageGroupOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteStorageGroupOperator.java index 2540899..cc67ea2 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteStorageGroupOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteStorageGroupOperator.java @@ -20,6 +20,9 @@ package org.apache.iotdb.db.qp.logical.sys; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.DeleteStorageGroupPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; import java.util.List; @@ -39,4 +42,9 @@ public class DeleteStorageGroupOperator extends Operator { public void setDeletePathList(List<PartialPath> deletePathList) { this.deletePathList = deletePathList; } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) { + return new DeleteStorageGroupPlan(getDeletePathList()); + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteTimeSeriesOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteTimeSeriesOperator.java index c3d2fe9..49a13ee 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteTimeSeriesOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteTimeSeriesOperator.java @@ -20,6 +20,9 @@ package org.apache.iotdb.db.qp.logical.sys; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.DeleteTimeSeriesPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; import java.util.List; @@ -40,4 +43,9 @@ public class DeleteTimeSeriesOperator extends Operator { public void setDeletePathList(List<PartialPath> deletePathList) { this.deletePathList = deletePathList; } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) { + return new DeleteTimeSeriesPlan(getDeletePathList()); + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DropIndexOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DropIndexOperator.java index e538311..22793aa 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DropIndexOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DropIndexOperator.java @@ -18,9 +18,13 @@ */ package org.apache.iotdb.db.qp.logical.sys; +import org.apache.iotdb.db.exception.query.QueryProcessException; import org.apache.iotdb.db.index.common.IndexType; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.DropIndexPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; import java.util.ArrayList; import java.util.List; @@ -52,4 +56,10 @@ public class DropIndexOperator extends Operator { public void setIndexType(IndexType indexType) { this.indexType = indexType; } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + return new DropIndexPlan(getPaths(), getIndexType()); + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/FlushOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/FlushOperator.java index 2cbed7a..a52b4ce 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/FlushOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/FlushOperator.java @@ -18,8 +18,12 @@ */ package org.apache.iotdb.db.qp.logical.sys; +import org.apache.iotdb.db.exception.query.QueryProcessException; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.FlushPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; import java.util.List; @@ -49,4 +53,10 @@ public class FlushOperator extends Operator { super(tokenIntType); operatorType = OperatorType.FLUSH; } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + return new FlushPlan(isSeq(), getStorageGroupList()); + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/LoadDataOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/LoadDataOperator.java index 7142e04..48845a3 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/LoadDataOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/LoadDataOperator.java @@ -19,6 +19,9 @@ package org.apache.iotdb.db.qp.logical.sys; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.LoadDataPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; /** * this class maintains information in Author statement, including CREATE, DROP, GRANT and REVOKE. @@ -43,4 +46,9 @@ public class LoadDataOperator extends Operator { public String getMeasureType() { return measureType; } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) { + return new LoadDataPlan(getInputFilePath(), getMeasureType()); + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java index 3660db8..a66b45e 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java @@ -18,7 +18,12 @@ */ package org.apache.iotdb.db.qp.logical.sys; +import org.apache.iotdb.db.exception.query.QueryProcessException; +import org.apache.iotdb.db.qp.constant.SQLConstant; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.MergePlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; public class MergeOperator extends Operator { @@ -26,4 +31,14 @@ public class MergeOperator extends Operator { super(tokenIntType); operatorType = OperatorType.MERGE; } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + if (tokenIntType == SQLConstant.TOK_FULL_MERGE) { + return new MergePlan(OperatorType.FULL_MERGE); + } else { + return new MergePlan(); + } + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetStorageGroupOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetStorageGroupOperator.java index d14624f..dca8f99 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetStorageGroupOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetStorageGroupOperator.java @@ -20,6 +20,9 @@ package org.apache.iotdb.db.qp.logical.sys; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.SetStorageGroupPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; public class SetStorageGroupOperator extends Operator { @@ -37,4 +40,9 @@ public class SetStorageGroupOperator extends Operator { public void setPath(PartialPath path) { this.path = path; } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) { + return new SetStorageGroupPlan(getPath()); + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java index 1fdcde2..f81f503 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java @@ -20,8 +20,12 @@ package org.apache.iotdb.db.qp.logical.sys; +import org.apache.iotdb.db.exception.query.QueryProcessException; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.SetTTLPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; public class SetTTLOperator extends Operator { @@ -48,4 +52,10 @@ public class SetTTLOperator extends Operator { public void setDataTTL(long dataTTL) { this.dataTTL = dataTTL; } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + return new SetTTLPlan(storageGroup, dataTTL); + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java index 063b4cd..9e806b3 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java @@ -22,6 +22,9 @@ package org.apache.iotdb.db.qp.logical.sys; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.constant.SQLConstant; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.ShowTTLPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; import java.util.List; @@ -37,4 +40,9 @@ public class ShowTTLOperator extends ShowOperator { public List<PartialPath> getStorageGroups() { return storageGroups; } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) { + return new ShowTTLPlan(storageGroups); + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/TracingOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/TracingOperator.java index 359ff9a..e156350 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/TracingOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/TracingOperator.java @@ -18,7 +18,11 @@ */ package org.apache.iotdb.db.qp.logical.sys; +import org.apache.iotdb.db.exception.query.QueryProcessException; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.TracingPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; public class TracingOperator extends Operator { @@ -33,4 +37,10 @@ public class TracingOperator extends Operator { public boolean isTracingOn() { return isTracingOn; } + + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + return new TracingPlan(isTracingOn); + } } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/UnSetTTLOperator.java similarity index 71% copy from server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java copy to server/src/main/java/org/apache/iotdb/db/qp/logical/sys/UnSetTTLOperator.java index 1fdcde2..1c4641c 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/UnSetTTLOperator.java @@ -20,15 +20,18 @@ package org.apache.iotdb.db.qp.logical.sys; +import org.apache.iotdb.db.exception.query.QueryProcessException; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.logical.Operator; +import org.apache.iotdb.db.qp.physical.PhysicalPlan; +import org.apache.iotdb.db.qp.physical.sys.SetTTLPlan; +import org.apache.iotdb.db.qp.strategy.PhysicalGenerator; -public class SetTTLOperator extends Operator { +public class UnSetTTLOperator extends Operator { private PartialPath storageGroup; - private long dataTTL; - public SetTTLOperator(int tokenIntType) { + public UnSetTTLOperator(int tokenIntType) { super(tokenIntType); this.operatorType = OperatorType.TTL; } @@ -41,11 +44,9 @@ public class SetTTLOperator extends Operator { this.storageGroup = storageGroup; } - public long getDataTTL() { - return dataTTL; - } - - public void setDataTTL(long dataTTL) { - this.dataTTL = dataTTL; + @Override + public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) + throws QueryProcessException { + return new SetTTLPlan(storageGroup); } } 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 d33f774..bffb037 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 @@ -91,6 +91,7 @@ import org.apache.iotdb.db.qp.logical.sys.ShowTriggersOperator; import org.apache.iotdb.db.qp.logical.sys.StartTriggerOperator; import org.apache.iotdb.db.qp.logical.sys.StopTriggerOperator; import org.apache.iotdb.db.qp.logical.sys.TracingOperator; +import org.apache.iotdb.db.qp.logical.sys.UnSetTTLOperator; import org.apache.iotdb.db.qp.sql.SqlBaseParser.AliasClauseContext; import org.apache.iotdb.db.qp.sql.SqlBaseParser.AlignByDeviceClauseOrDisableAlignContext; import org.apache.iotdb.db.qp.sql.SqlBaseParser.AlignByDeviceClauseOrDisableAlignStatementContext; @@ -758,7 +759,7 @@ public class IoTDBSqlVisitor extends SqlBaseBaseVisitor<Operator> { @Override public Operator visitUnsetTTLStatement(UnsetTTLStatementContext ctx) { - SetTTLOperator operator = new SetTTLOperator(SQLConstant.TOK_UNSET); + UnSetTTLOperator operator = new UnSetTTLOperator(SQLConstant.TOK_UNSET); operator.setStorageGroup(parsePrefixPath(ctx.prefixPath())); return operator; } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java index f920018..2c647a9 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java @@ -18,104 +18,66 @@ */ package org.apache.iotdb.db.qp.strategy; -import org.apache.iotdb.db.auth.AuthException; import org.apache.iotdb.db.exception.metadata.MetadataException; import org.apache.iotdb.db.exception.query.LogicalOperatorException; import org.apache.iotdb.db.exception.query.LogicalOptimizeException; import org.apache.iotdb.db.exception.query.QueryProcessException; -import org.apache.iotdb.db.exception.runtime.SQLParserException; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.qp.constant.SQLConstant; import org.apache.iotdb.db.qp.logical.Operator; import org.apache.iotdb.db.qp.logical.Operator.OperatorType; import org.apache.iotdb.db.qp.logical.crud.BasicFunctionOperator; -import org.apache.iotdb.db.qp.logical.crud.DeleteDataOperator; -import org.apache.iotdb.db.qp.logical.crud.FillClauseComponent; import org.apache.iotdb.db.qp.logical.crud.FillQueryOperator; import org.apache.iotdb.db.qp.logical.crud.FilterOperator; -import org.apache.iotdb.db.qp.logical.crud.GroupByClauseComponent; -import org.apache.iotdb.db.qp.logical.crud.GroupByFillClauseComponent; import org.apache.iotdb.db.qp.logical.crud.GroupByFillQueryOperator; import org.apache.iotdb.db.qp.logical.crud.GroupByQueryOperator; -import org.apache.iotdb.db.qp.logical.crud.InsertOperator; import org.apache.iotdb.db.qp.logical.crud.LastQueryOperator; import org.apache.iotdb.db.qp.logical.crud.QueryOperator; import org.apache.iotdb.db.qp.logical.crud.SpecialClauseComponent; import org.apache.iotdb.db.qp.logical.crud.WhereComponent; -import org.apache.iotdb.db.qp.logical.sys.AlterTimeSeriesOperator; -import org.apache.iotdb.db.qp.logical.sys.AuthorOperator; import org.apache.iotdb.db.qp.logical.sys.CountOperator; import org.apache.iotdb.db.qp.logical.sys.CreateFunctionOperator; -import org.apache.iotdb.db.qp.logical.sys.CreateIndexOperator; -import org.apache.iotdb.db.qp.logical.sys.CreateTimeSeriesOperator; import org.apache.iotdb.db.qp.logical.sys.CreateTriggerOperator; -import org.apache.iotdb.db.qp.logical.sys.DataAuthOperator; import org.apache.iotdb.db.qp.logical.sys.DeletePartitionOperator; -import org.apache.iotdb.db.qp.logical.sys.DeleteStorageGroupOperator; -import org.apache.iotdb.db.qp.logical.sys.DeleteTimeSeriesOperator; import org.apache.iotdb.db.qp.logical.sys.DropFunctionOperator; -import org.apache.iotdb.db.qp.logical.sys.DropIndexOperator; import org.apache.iotdb.db.qp.logical.sys.DropTriggerOperator; -import org.apache.iotdb.db.qp.logical.sys.FlushOperator; import org.apache.iotdb.db.qp.logical.sys.KillQueryOperator; import org.apache.iotdb.db.qp.logical.sys.LoadConfigurationOperator; import org.apache.iotdb.db.qp.logical.sys.LoadConfigurationOperator.LoadConfigurationOperatorType; -import org.apache.iotdb.db.qp.logical.sys.LoadDataOperator; import org.apache.iotdb.db.qp.logical.sys.LoadFilesOperator; import org.apache.iotdb.db.qp.logical.sys.MoveFileOperator; import org.apache.iotdb.db.qp.logical.sys.RemoveFileOperator; -import org.apache.iotdb.db.qp.logical.sys.SetStorageGroupOperator; -import org.apache.iotdb.db.qp.logical.sys.SetTTLOperator; import org.apache.iotdb.db.qp.logical.sys.ShowChildNodesOperator; import org.apache.iotdb.db.qp.logical.sys.ShowChildPathsOperator; import org.apache.iotdb.db.qp.logical.sys.ShowDevicesOperator; import org.apache.iotdb.db.qp.logical.sys.ShowFunctionsOperator; import org.apache.iotdb.db.qp.logical.sys.ShowStorageGroupOperator; -import org.apache.iotdb.db.qp.logical.sys.ShowTTLOperator; import org.apache.iotdb.db.qp.logical.sys.ShowTimeSeriesOperator; import org.apache.iotdb.db.qp.logical.sys.StartTriggerOperator; import org.apache.iotdb.db.qp.logical.sys.StopTriggerOperator; -import org.apache.iotdb.db.qp.logical.sys.TracingOperator; import org.apache.iotdb.db.qp.physical.PhysicalPlan; import org.apache.iotdb.db.qp.physical.crud.AggregationPlan; import org.apache.iotdb.db.qp.physical.crud.AlignByDevicePlan; import org.apache.iotdb.db.qp.physical.crud.AlignByDevicePlan.MeasurementType; import org.apache.iotdb.db.qp.physical.crud.DeletePartitionPlan; -import org.apache.iotdb.db.qp.physical.crud.DeletePlan; import org.apache.iotdb.db.qp.physical.crud.FillQueryPlan; -import org.apache.iotdb.db.qp.physical.crud.GroupByTimeFillPlan; import org.apache.iotdb.db.qp.physical.crud.GroupByTimePlan; -import org.apache.iotdb.db.qp.physical.crud.InsertRowPlan; -import org.apache.iotdb.db.qp.physical.crud.InsertRowsPlan; import org.apache.iotdb.db.qp.physical.crud.LastQueryPlan; import org.apache.iotdb.db.qp.physical.crud.QueryIndexPlan; import org.apache.iotdb.db.qp.physical.crud.QueryPlan; import org.apache.iotdb.db.qp.physical.crud.RawDataQueryPlan; import org.apache.iotdb.db.qp.physical.crud.UDTFPlan; -import org.apache.iotdb.db.qp.physical.sys.AlterTimeSeriesPlan; -import org.apache.iotdb.db.qp.physical.sys.AuthorPlan; import org.apache.iotdb.db.qp.physical.sys.ClearCachePlan; import org.apache.iotdb.db.qp.physical.sys.CountPlan; import org.apache.iotdb.db.qp.physical.sys.CreateFunctionPlan; -import org.apache.iotdb.db.qp.physical.sys.CreateIndexPlan; import org.apache.iotdb.db.qp.physical.sys.CreateSnapshotPlan; -import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan; import org.apache.iotdb.db.qp.physical.sys.CreateTriggerPlan; -import org.apache.iotdb.db.qp.physical.sys.DataAuthPlan; -import org.apache.iotdb.db.qp.physical.sys.DeleteStorageGroupPlan; -import org.apache.iotdb.db.qp.physical.sys.DeleteTimeSeriesPlan; import org.apache.iotdb.db.qp.physical.sys.DropFunctionPlan; -import org.apache.iotdb.db.qp.physical.sys.DropIndexPlan; import org.apache.iotdb.db.qp.physical.sys.DropTriggerPlan; -import org.apache.iotdb.db.qp.physical.sys.FlushPlan; import org.apache.iotdb.db.qp.physical.sys.KillQueryPlan; import org.apache.iotdb.db.qp.physical.sys.LoadConfigurationPlan; import org.apache.iotdb.db.qp.physical.sys.LoadConfigurationPlan.LoadConfigurationPlanType; -import org.apache.iotdb.db.qp.physical.sys.LoadDataPlan; -import org.apache.iotdb.db.qp.physical.sys.MergePlan; import org.apache.iotdb.db.qp.physical.sys.OperateFilePlan; -import org.apache.iotdb.db.qp.physical.sys.SetStorageGroupPlan; -import org.apache.iotdb.db.qp.physical.sys.SetTTLPlan; import org.apache.iotdb.db.qp.physical.sys.ShowChildNodesPlan; import org.apache.iotdb.db.qp.physical.sys.ShowChildPathsPlan; import org.apache.iotdb.db.qp.physical.sys.ShowDevicesPlan; @@ -125,12 +87,10 @@ import org.apache.iotdb.db.qp.physical.sys.ShowPlan; import org.apache.iotdb.db.qp.physical.sys.ShowPlan.ShowContentType; import org.apache.iotdb.db.qp.physical.sys.ShowQueryProcesslistPlan; import org.apache.iotdb.db.qp.physical.sys.ShowStorageGroupPlan; -import org.apache.iotdb.db.qp.physical.sys.ShowTTLPlan; import org.apache.iotdb.db.qp.physical.sys.ShowTimeSeriesPlan; import org.apache.iotdb.db.qp.physical.sys.ShowTriggersPlan; import org.apache.iotdb.db.qp.physical.sys.StartTriggerPlan; import org.apache.iotdb.db.qp.physical.sys.StopTriggerPlan; -import org.apache.iotdb.db.qp.physical.sys.TracingPlan; import org.apache.iotdb.db.query.expression.Expression; import org.apache.iotdb.db.query.expression.ResultColumn; import org.apache.iotdb.db.query.expression.unary.FunctionExpression; @@ -142,7 +102,6 @@ import org.apache.iotdb.tsfile.read.expression.IExpression; import org.apache.iotdb.tsfile.utils.Pair; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; @@ -155,7 +114,7 @@ public class PhysicalGenerator { public PhysicalPlan transformToPhysicalPlan(Operator operator, int fetchSize) throws QueryProcessException { - PhysicalPlan physicalPlan = doTransformation(operator, fetchSize); + PhysicalPlan physicalPlan = operator.transform2PhysicalPlan(fetchSize, this); physicalPlan.setDebug(operator.isDebug()); return physicalPlan; } @@ -164,146 +123,8 @@ public class PhysicalGenerator { private PhysicalPlan doTransformation(Operator operator, int fetchSize) throws QueryProcessException { switch (operator.getType()) { - case AUTHOR: - AuthorOperator author = (AuthorOperator) operator; - try { - return new AuthorPlan( - author.getAuthorType(), - author.getUserName(), - author.getRoleName(), - author.getPassWord(), - author.getNewPassword(), - author.getPrivilegeList(), - author.getNodeName()); - } catch (AuthException e) { - throw new QueryProcessException(e.getMessage()); - } - case GRANT_WATERMARK_EMBEDDING: - case REVOKE_WATERMARK_EMBEDDING: - DataAuthOperator dataAuthOperator = (DataAuthOperator) operator; - return new DataAuthPlan(dataAuthOperator.getType(), dataAuthOperator.getUsers()); - case LOAD_DATA: - LoadDataOperator loadData = (LoadDataOperator) operator; - return new LoadDataPlan(loadData.getInputFilePath(), loadData.getMeasureType()); - case SET_STORAGE_GROUP: - SetStorageGroupOperator setStorageGroup = (SetStorageGroupOperator) operator; - return new SetStorageGroupPlan(setStorageGroup.getPath()); - case DELETE_STORAGE_GROUP: - DeleteStorageGroupOperator deleteStorageGroup = (DeleteStorageGroupOperator) operator; - return new DeleteStorageGroupPlan(deleteStorageGroup.getDeletePathList()); - case CREATE_TIMESERIES: - CreateTimeSeriesOperator createOperator = (CreateTimeSeriesOperator) operator; - if (createOperator.getTags() != null - && !createOperator.getTags().isEmpty() - && createOperator.getAttributes() != null - && !createOperator.getAttributes().isEmpty()) { - for (String tagKey : createOperator.getTags().keySet()) { - if (createOperator.getAttributes().containsKey(tagKey)) { - throw new QueryProcessException( - String.format( - "Tag and attribute shouldn't have the same property key [%s]", tagKey)); - } - } - } - return new CreateTimeSeriesPlan( - createOperator.getPath(), - createOperator.getDataType(), - createOperator.getEncoding(), - createOperator.getCompressor(), - createOperator.getProps(), - createOperator.getTags(), - createOperator.getAttributes(), - createOperator.getAlias()); - case DELETE_TIMESERIES: - DeleteTimeSeriesOperator deletePath = (DeleteTimeSeriesOperator) operator; - return new DeleteTimeSeriesPlan(deletePath.getDeletePathList()); - case CREATE_INDEX: - CreateIndexOperator createIndexOp = (CreateIndexOperator) operator; - return new CreateIndexPlan( - createIndexOp.getPaths(), - createIndexOp.getProps(), - createIndexOp.getTime(), - createIndexOp.getIndexType()); - case DROP_INDEX: - DropIndexOperator dropIndexOp = (DropIndexOperator) operator; - return new DropIndexPlan(dropIndexOp.getPaths(), dropIndexOp.getIndexType()); - case ALTER_TIMESERIES: - AlterTimeSeriesOperator alterTimeSeriesOperator = (AlterTimeSeriesOperator) operator; - return new AlterTimeSeriesPlan( - alterTimeSeriesOperator.getPath(), - alterTimeSeriesOperator.getAlterType(), - alterTimeSeriesOperator.getAlterMap(), - alterTimeSeriesOperator.getAlias(), - alterTimeSeriesOperator.getTagsMap(), - alterTimeSeriesOperator.getAttributesMap()); - case DELETE: - DeleteDataOperator delete = (DeleteDataOperator) operator; - return new DeletePlan(delete.getStartTime(), delete.getEndTime(), delete.getPaths()); - case INSERT: - InsertOperator insert = (InsertOperator) operator; - int measurementsNum = 0; - for (String measurement : insert.getMeasurementList()) { - if (measurement.startsWith("(") && measurement.endsWith(")")) { - measurementsNum += measurement.replace("(", "").replace(")", "").split(",").length; - } else { - measurementsNum++; - } - } - if (measurementsNum == 0 || (insert.getValueList().length % measurementsNum != 0)) { - throw new SQLParserException( - String.format( - "the measurementList's size %d is not consistent with the valueList's size %d", - measurementsNum, insert.getValueList().length)); - } - if (measurementsNum == insert.getValueList().length) { - return new InsertRowPlan( - insert.getDevice(), - insert.getTimes()[0], - insert.getMeasurementList(), - insert.getValueList()); - } - InsertRowsPlan insertRowsPlan = new InsertRowsPlan(); - for (int i = 0; i < insert.getTimes().length; i++) { - insertRowsPlan.addOneInsertRowPlan( - new InsertRowPlan( - insert.getDevice(), - insert.getTimes()[i], - insert.getMeasurementList(), - Arrays.copyOfRange( - insert.getValueList(), i * measurementsNum, (i + 1) * measurementsNum)), - i); - } - return insertRowsPlan; - case MERGE: - if (operator.getTokenIntType() == SQLConstant.TOK_FULL_MERGE) { - return new MergePlan(OperatorType.FULL_MERGE); - } else { - return new MergePlan(); - } - case FLUSH: - FlushOperator flushOperator = (FlushOperator) operator; - return new FlushPlan(flushOperator.isSeq(), flushOperator.getStorageGroupList()); - case TRACING: - TracingOperator tracingOperator = (TracingOperator) operator; - return new TracingPlan(tracingOperator.isTracingOn()); case QUERY: return transformQuery((QueryOperator) operator); - case TTL: - switch (operator.getTokenIntType()) { - case SQLConstant.TOK_SET: - SetTTLOperator setTTLOperator = (SetTTLOperator) operator; - return new SetTTLPlan(setTTLOperator.getStorageGroup(), setTTLOperator.getDataTTL()); - case SQLConstant.TOK_UNSET: - SetTTLOperator unsetTTLOperator = (SetTTLOperator) operator; - return new SetTTLPlan(unsetTTLOperator.getStorageGroup()); - case SQLConstant.TOK_SHOW: - ShowTTLOperator showTTLOperator = (ShowTTLOperator) operator; - return new ShowTTLPlan(showTTLOperator.getStorageGroups()); - default: - throw new LogicalOperatorException( - String.format( - "not supported operator type %s in ttl operation.", operator.getType())); - } case LOAD_CONFIGURATION: LoadConfigurationOperatorType type = ((LoadConfigurationOperator) operator).getLoadConfigurationOperatorType(); @@ -475,79 +296,15 @@ public class PhysicalGenerator { @Override public QueryPlan transform(QueryOperator queryOperator) throws QueryProcessException { AggregationPlan queryPlan; - if (queryOperator.hasTimeSeriesGeneratingFunction()) { - throw new QueryProcessException( - "User-defined and built-in hybrid aggregation is not supported."); - } - if (queryOperator instanceof GroupByFillQueryOperator) { - queryPlan = new GroupByTimeFillPlan(); - } else if (queryOperator instanceof GroupByQueryOperator) { - queryPlan = new GroupByTimePlan(); - } else { - queryPlan = new AggregationPlan(); - } - - queryPlan.setPaths(queryOperator.getSelectComponent().getPaths()); - queryPlan.setAggregations(queryOperator.getSelectComponent().getAggregationFunctions()); if (queryOperator instanceof GroupByQueryOperator) { GroupByTimePlan groupByTimePlan = (GroupByTimePlan) queryPlan; - GroupByClauseComponent groupByClauseComponent = - (GroupByClauseComponent) queryOperator.getSpecialClauseComponent(); - groupByTimePlan.setInterval(groupByClauseComponent.getUnit()); - groupByTimePlan.setIntervalByMonth(groupByClauseComponent.isIntervalByMonth()); - groupByTimePlan.setSlidingStep(groupByClauseComponent.getSlidingStep()); - groupByTimePlan.setSlidingStepByMonth(groupByClauseComponent.isSlidingStepByMonth()); - groupByTimePlan.setLeftCRightO(groupByClauseComponent.isLeftCRightO()); - if (!groupByClauseComponent.isLeftCRightO()) { - groupByTimePlan.setStartTime(groupByClauseComponent.getStartTime() + 1); - groupByTimePlan.setEndTime(groupByClauseComponent.getEndTime() + 1); - } else { - groupByTimePlan.setStartTime(groupByClauseComponent.getStartTime()); - groupByTimePlan.setEndTime(groupByClauseComponent.getEndTime()); - } } if (queryOperator instanceof GroupByFillQueryOperator) { - GroupByFillClauseComponent groupByFillClauseComponent = - (GroupByFillClauseComponent) queryOperator.getSpecialClauseComponent(); - ((GroupByTimeFillPlan) queryPlan).setFillType(groupByFillClauseComponent.getFillTypes()); - for (String aggregation : queryPlan.getAggregations()) { - if (!SQLConstant.LAST_VALUE.equals(aggregation)) { - throw new QueryProcessException("Group By Fill only support last_value function"); - } - } - } else if (queryOperator.isGroupByLevel()) { - queryPlan.setLevel(queryOperator.getSpecialClauseComponent().getLevel()); - try { - if (!verifyAllAggregationDataTypesEqual(queryOperator)) { - throw new QueryProcessException("Aggregate among unmatched data types"); - } - } catch (MetadataException e) { - throw new QueryProcessException(e); - } - } - return queryPlan; - } - } - /** fill physical plan transfrom */ - public static class FillPhysicalPlanRule implements Transform { + } else if (queryOperator.isGroupByLevel()) { - @Override - public QueryPlan transform(QueryOperator queryOperator) throws QueryProcessException { - FillQueryOperator fillQueryOperator = (FillQueryOperator) queryOperator; - if (queryOperator.hasTimeSeriesGeneratingFunction()) { - throw new QueryProcessException("Fill functions are not supported in UDF queries."); } - FillQueryPlan queryPlan = new FillQueryPlan(); - FilterOperator timeFilter = fillQueryOperator.getWhereComponent().getFilterOperator(); - if (!timeFilter.isSingle()) { - throw new QueryProcessException("Slice query must select a single time point"); - } - long time = Long.parseLong(((BasicFunctionOperator) timeFilter).getValue()); - queryPlan.setQueryTime(time); - queryPlan.setFillType( - ((FillClauseComponent) fillQueryOperator.getSpecialClauseComponent()).getFillTypes()); return queryPlan; } } @@ -907,27 +664,6 @@ public class PhysicalGenerator { return new ArrayList<>(columnList.subList(seriesOffset, endPosition)); } - private static boolean verifyAllAggregationDataTypesEqual(QueryOperator queryOperator) - throws MetadataException { - List<String> aggregations = queryOperator.getSelectComponent().getAggregationFunctions(); - if (aggregations.isEmpty()) { - return true; - } - - List<PartialPath> paths = queryOperator.getSelectComponent().getPaths(); - List<TSDataType> dataTypes = SchemaUtils.getSeriesTypesByPaths(paths); - String aggType = aggregations.get(0); - switch (aggType) { - case SQLConstant.MIN_VALUE: - case SQLConstant.MAX_VALUE: - case SQLConstant.AVG: - case SQLConstant.SUM: - return dataTypes.stream().allMatch(dataTypes.get(0)::equals); - default: - return true; - } - } - protected List<PartialPath> getMatchedTimeseries(PartialPath path) throws MetadataException { return IoTDB.metaManager.getAllTimeseriesPath(path); }
