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 <66766227+nitin-kash...@users.noreply.github.com> 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: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org