This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 6d32a856897 [test](ut) added UT cases for show build index (#29561)
6d32a856897 is described below
commit 6d32a856897c66948cf719597975faecd59e402f
Author: Nitin-Kashyap <[email protected]>
AuthorDate: Wed Jan 24 11:29:33 2024 +0530
[test](ut) added UT cases for show build index (#29561)
Added UT case for show build index flow
---
.../apache/doris/analysis/ShowBuildIndexStmt.java | 9 +-
.../doris/analysis/ShowBuildIndexStmtTest.java | 239 +++++++++++++++++++++
2 files changed, 243 insertions(+), 5 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowBuildIndexStmt.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowBuildIndexStmt.java
index c4afb4fdc74..d804b9b9f82 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowBuildIndexStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowBuildIndexStmt.java
@@ -40,10 +40,11 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
-// SHOW LOAD STATUS statement used to get status of load job.
+// SHOW BUILD INDEX statement used to get status of build index job.
//
// syntax:
-// SHOW LOAD [FROM db] [LIKE mask]
+// SHOW BUILD INDEX [FROM db] [WHERE <condition>]
+// [ORDER BY [DESC|ASC] [NULLS LAST | NULLS FIRST]]] [ LIMIT 1, 100]
public class ShowBuildIndexStmt extends ShowStmt {
private static final Logger LOG =
LogManager.getLogger(ShowBuildIndexStmt.class);
@@ -96,9 +97,7 @@ public class ShowBuildIndexStmt extends ShowStmt {
}
// analyze where clause if not null
- if (whereClause != null) {
- analyzeSubPredicate(whereClause);
- }
+ analyzeSubPredicate(whereClause);
// order by
if (orderByElements != null && !orderByElements.isEmpty()) {
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowBuildIndexStmtTest.java
b/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowBuildIndexStmtTest.java
new file mode 100644
index 00000000000..fa88156dd47
--- /dev/null
+++
b/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowBuildIndexStmtTest.java
@@ -0,0 +1,239 @@
+// 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.doris.analysis;
+
+import org.apache.doris.analysis.LikePredicate.Operator;
+import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.common.AnalysisException;
+import org.apache.doris.common.proc.BuildIndexProcDir;
+import org.apache.doris.common.proc.ProcNodeInterface;
+import org.apache.doris.common.proc.ProcService;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.SessionVariable;
+import org.apache.doris.qe.ShowResultSetMetaData;
+
+import com.google.common.collect.ImmutableList;
+import mockit.Mock;
+import mockit.MockUp;
+import mockit.Mocked;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+public class ShowBuildIndexStmtTest {
+ private Analyzer analyzer;
+ private ConnectContext ctx = new ConnectContext();
+ @Mocked
+ private BuildIndexProcDir procDir;
+
+ @Before
+ public void setUp() {
+ analyzer = AccessTestUtil.fetchAdminAnalyzer(true);
+ ctx.setSessionVariable(new SessionVariable());
+ ctx.setThreadLocalInfo();
+ }
+
+ @After
+ public void tearDown() {
+ ConnectContext.remove();
+ }
+
+ @Test
+ public void getMetaData() {
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt("", null,
ImmutableList.of(), null);
+ ShowResultSetMetaData result = stmt.getMetaData();
+ Assertions.assertEquals(result.getColumnCount(), 10);
+ result.getColumns().forEach(col ->
Assertions.assertEquals(col.getType(), ScalarType.createVarchar(30)));
+ }
+
+ @Test
+ public void testAnalysisNormal() throws Exception {
+ AtomicBoolean pass = new AtomicBoolean(false);
+ new MockUp<ProcService>() {
+ @Mock
+ public ProcNodeInterface open(String path) throws
AnalysisException {
+ if (pass.get()) {
+ return procDir;
+ }
+ return null;
+ }
+ };
+
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt(null, null, null,
null);
+ Assertions.assertThrows(AnalysisException.class, () ->
stmt.analyze(analyzer));
+
+ pass.set(true);
+ stmt.analyze(analyzer);
+ Assertions.assertEquals(stmt.toString(), "SHOW BUILD INDEX FROM
`testDb`");
+ Assertions.assertEquals(stmt.getDbName(), "testDb");
+
+ TableName tableName = new TableName("a.b.c");
+
+ /* case: WHERE compound predicate, Limit, Order */ {
+ Expr subWhere1 = new BinaryPredicate(BinaryPredicate.Operator.GT,
new SlotRef(tableName, "createtime"),
+ new StringLiteral("%.b.%"));
+ Expr subWhere2 = new BinaryPredicate(BinaryPredicate.Operator.EQ,
new SlotRef(tableName, "tablename"),
+ new StringLiteral("%.b.%"));
+ Expr where = new CompoundPredicate(CompoundPredicate.Operator.AND,
subWhere1, subWhere2);
+ List<OrderByElement> orderBy = Arrays.asList(
+ new OrderByElement(new SlotRef(tableName, "TableName"),
false, false));
+ ShowBuildIndexStmt stmt1 = new ShowBuildIndexStmt(null, where,
orderBy, new LimitElement(1, 100));
+ Assertions.assertEquals(stmt1.toSql(), "SHOW BUILD INDEX WHERE
(`a`.`b`.`c`.`createtime` > '%.b.%') "
+ + "AND (`a`.`b`.`c`.`tablename` = '%.b.%') ORDER BY
`a`.`b`.`c`.`TableName` DESC NULLS LAST "
+ + "LIMIT 1, 100");
+
+ stmt1.analyze(analyzer);
+ Assertions.assertEquals(stmt1.toSql(), "SHOW BUILD INDEX FROM
`testDb` WHERE "
+ + "(`a`.`b`.`c`.`createtime` > CAST('%.b.%' AS
DATETIMEV2(0))) "
+ + "AND (`a`.`b`.`c`.`tablename` = '%.b.%') "
+ + "ORDER BY `a`.`b`.`c`.`TableName` DESC NULLS LAST LIMIT
1, 100");
+
+ Assertions.assertEquals(stmt1.getFilterMap().size(), 2);
+ Assertions.assertEquals(stmt1.getNode(), procDir);
+ Assertions.assertEquals(stmt1.getOrderPairs().size(), 1);
+ Assertions.assertEquals(stmt1.getLimitElement().getLimit(), 100);
+ Assertions.assertEquals(stmt1.getLimitElement().getOffset(), 1);
+ }
+ }
+
+ @Test
+ public void testAnalysisWhereException() throws Exception {
+ new MockUp<ProcService>() {
+ @Mock
+ public ProcNodeInterface open(String path) throws
AnalysisException {
+ return null;
+ }
+ };
+
+ TableName tableName = new TableName("a.b.c");
+
+ /* case: no BinaryPredicate */ {
+ Expr where = new LikePredicate(Operator.LIKE, new
StringLiteral("%.b.%"),
+ new SlotRef(tableName, "STATE_NAME"));
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt(null, where,
null, null);
+ Assertions.assertThrows(AnalysisException.class, () ->
stmt.analyze(analyzer));
+ }
+
+ /* case: binary predicate - left not SlotRef */ {
+ Expr where = new BinaryPredicate(BinaryPredicate.Operator.EQ, new
StringLiteral("%.b.%"),
+ new SlotRef(tableName, "STATE_NAME"));
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt(null, where,
null, null);
+ Assertions.assertThrows(AnalysisException.class, () ->
stmt.analyze(analyzer));
+ }
+
+ /* case: binary predicate - left key wrong column */ {
+ Expr where = new BinaryPredicate(BinaryPredicate.Operator.EQ, new
SlotRef(tableName, "WRONG_COL"),
+ new StringLiteral("%.b.%"));
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt(null, where,
null, null);
+ Assertions.assertThrows(AnalysisException.class, () ->
stmt.analyze(analyzer));
+ }
+
+ /* case: binary predicate - right key wrong type */ {
+ Expr where = new BinaryPredicate(BinaryPredicate.Operator.EQ, new
SlotRef(tableName, "tablename"),
+ new IntLiteral(1234));
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt(null, where,
null, null);
+ Assertions.assertThrows(AnalysisException.class, () ->
stmt.analyze(analyzer));
+ }
+
+ /* case: binary predicate - right key wrong type */ {
+ Expr where = new BinaryPredicate(BinaryPredicate.Operator.EQ, new
SlotRef(tableName, "createtime"),
+ new IntLiteral(1234));
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt(null, where,
null, null);
+ Assertions.assertThrows(AnalysisException.class, () ->
stmt.analyze(analyzer));
+ }
+
+ /* case: binary predicate - wrong Operator */ {
+ Expr where = new BinaryPredicate(BinaryPredicate.Operator.GT, new
SlotRef(tableName, "tablename"),
+ new StringLiteral("%.b.%"));
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt(null, where,
null, null);
+ Assertions.assertThrows(AnalysisException.class, () ->
stmt.analyze(analyzer));
+ }
+
+ /* case: where-success, */ {
+ Expr where = new BinaryPredicate(BinaryPredicate.Operator.GT, new
SlotRef(tableName, "createtime"),
+ new StringLiteral("%.b.%"));
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt(null, where,
null, null);
+ Assertions.assertThrows(AnalysisException.class, () ->
stmt.analyze(analyzer));
+ }
+
+ /* case: compound predicate - wrong operator */ {
+ Expr subWhere = new BinaryPredicate(BinaryPredicate.Operator.GT,
new SlotRef(tableName, "createtime"),
+ new StringLiteral("%.b.%"));
+ Expr where = new CompoundPredicate(CompoundPredicate.Operator.OR,
subWhere, subWhere);
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt(null, where,
null, null);
+ Assertions.assertThrows(AnalysisException.class, () ->
stmt.analyze(analyzer));
+ }
+
+ /* case: compound predicate - wrong operator */ {
+ Expr subWhere1 = new BinaryPredicate(BinaryPredicate.Operator.GT,
new SlotRef(tableName, "createtime"),
+ new StringLiteral("%.b.%"));
+ Expr subWhere2 = new BinaryPredicate(BinaryPredicate.Operator.EQ,
new SlotRef(tableName, "tablename"),
+ new StringLiteral("%.b.%"));
+ Expr where = new CompoundPredicate(CompoundPredicate.Operator.AND,
subWhere1, subWhere2);
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt(null, where,
null, null);
+ Assertions.assertThrows(AnalysisException.class, () ->
stmt.analyze(analyzer));
+ }
+ }
+
+ @Test
+ public void testAnalysisOrderByException() throws Exception {
+ new MockUp<ProcService>() {
+ @Mock
+ public ProcNodeInterface open(String path) throws
AnalysisException {
+ return null;
+ }
+ };
+
+ TableName tableName = new TableName("a.b.c");
+
+ /* case: order by not slotRef */ {
+ List<OrderByElement> orderBy = Arrays.asList(new
OrderByElement(new IntLiteral(123), false, false));
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt(null, null,
orderBy, null);
+ Assertions.assertThrows(AnalysisException.class, () ->
stmt.analyze(analyzer));
+ }
+
+ /* case: order by not known column */ {
+ List<OrderByElement> orderBy = Arrays.asList(new
OrderByElement(new SlotRef(tableName, "unknown"), false, false));
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt(null, null,
orderBy, null);
+ Assertions.assertThrows(AnalysisException.class, () ->
stmt.analyze(analyzer));
+ }
+
+ /* case: order by success - fail on procDir */ {
+ List<OrderByElement> orderBy = Arrays.asList(new
OrderByElement(new SlotRef(tableName, "TableName"), false, false));
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt(null, null,
orderBy, null);
+ Assertions.assertThrows(AnalysisException.class, () ->
stmt.analyze(analyzer));
+ }
+
+ /* case: order by success - fail on procDir */ {
+ List<OrderByElement> orderBy = Arrays.asList(new
OrderByElement(new SlotRef(tableName, "TableName"), false, false));
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt(null, null,
orderBy, null);
+ Assertions.assertThrows(AnalysisException.class, () ->
stmt.analyze(analyzer));
+ }
+
+ /* case: limit success - fail on procDir */ {
+ LimitElement limit = new LimitElement();
+ ShowBuildIndexStmt stmt = new ShowBuildIndexStmt(null, null, null,
limit);
+ Assertions.assertThrows(AnalysisException.class, () ->
stmt.analyze(analyzer));
+ }
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]