This is an automated email from the ASF dual-hosted git repository. hui pushed a commit to branch lmh/optPPTcs in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 384332214621d0581a2e3f18ec295ebc41ec1888 Author: Minghui Liu <[email protected]> AuthorDate: Tue May 16 17:15:28 2023 +0800 opt --- .../apache/iotdb/commons/path/PathPatternTree.java | 33 ++++++++++++++-------- .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java | 2 +- .../iotdb/db/mpp/plan/parser/ASTVisitor.java | 6 ++++ .../db/mpp/plan/statement/crud/QueryStatement.java | 10 +++++++ 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java b/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java index 4c9179cce9..056c4a240b 100644 --- a/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java +++ b/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java @@ -43,6 +43,13 @@ public class PathPatternTree { private List<PartialPath> pathPatternList; + private boolean useWildcard = true; + + public PathPatternTree(boolean useWildcard) { + this(); + this.useWildcard = useWildcard; + } + public PathPatternTree() { this.root = new PathPatternNode<>(IoTDBConstant.PATH_ROOT, VoidSerializer.getInstance()); this.pathPatternList = new LinkedList<>(); @@ -77,18 +84,22 @@ public class PathPatternTree { /** Add a pathPattern (may contain wildcards) to pathPatternList. */ public void appendPathPattern(PartialPath pathPattern) { - boolean isExist = false; - for (PartialPath path : pathPatternList) { - if (path.include(pathPattern)) { - // path already exists in pathPatternList - isExist = true; - break; + if (useWildcard) { + boolean isExist = false; + for (PartialPath path : pathPatternList) { + if (path.include(pathPattern)) { + // path already exists in pathPatternList + isExist = true; + break; + } } - } - if (!isExist) { - // remove duplicate path in pathPatternList - pathPatternList.removeIf(pathPattern::include); - pathPatternList.add(pathPattern); + if (!isExist) { + // remove duplicate path in pathPatternList + pathPatternList.removeIf(pathPattern::include); + pathPatternList.add(pathPattern); + } + } else { + appendBranchWithoutPrune(root, pathPattern.getNodes(), 0); } } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java index 4b4a89ff48..bdfe19b1b2 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java @@ -233,7 +233,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> queryStatement.semanticCheck(); // concat path and construct path pattern tree - PathPatternTree patternTree = new PathPatternTree(); + PathPatternTree patternTree = new PathPatternTree(queryStatement.useWildcard()); queryStatement = (QueryStatement) new ConcatPathRewriter().rewrite(queryStatement, patternTree); analysis.setStatement(queryStatement); 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 82b7b494f9..763e7477da 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 @@ -254,6 +254,8 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> { private static final String IGNORENULL = "IgnoreNull"; private ZoneId zoneId; + private boolean useWildcard = false; + public void setZoneId(ZoneId zoneId) { this.zoneId = zoneId; } @@ -1219,6 +1221,7 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> { queryStatement.setResultSetFormat(parseAlignBy(ctx.alignByClause())); } + queryStatement.setUseWildcard(useWildcard); return queryStatement; } @@ -1794,6 +1797,9 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> { } private String parseNodeName(IoTDBSqlParser.NodeNameContext ctx) { + if (!useWildcard && ctx.wildcard().size() > 0) { + useWildcard = true; + } return parseNodeString(ctx.getText()); } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java index c2cfae97f0..408eb514cc 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java @@ -112,6 +112,8 @@ public class QueryStatement extends Statement { private boolean isOutputEndTime = false; + private boolean useWildcard = true; + public QueryStatement() { this.statementType = StatementType.QUERY; } @@ -448,6 +450,14 @@ public class QueryStatement extends Statement { return rowOffset > 0; } + public void setUseWildcard(boolean useWildcard) { + this.useWildcard = useWildcard; + } + + public boolean useWildcard() { + return useWildcard; + } + public void semanticCheck() { if (isAggregationQuery()) { if (disableAlign()) {
