Skip to content

Commit

Permalink
[nereids](feat) implement CleanLabelCommand in nereids (apache#46624)
Browse files Browse the repository at this point in the history
Issue Number: close apache#42569
  • Loading branch information
vinlee19 authored Jan 10, 2025
1 parent fb5e555 commit 7a6c125
Show file tree
Hide file tree
Showing 8 changed files with 175 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -480,15 +480,15 @@ supportedRefreshStatement

supportedCleanStatement
: CLEAN ALL PROFILE #cleanAllProfile
| CLEAN LABEL label=identifier? (FROM | IN) database=identifier #cleanLabel
;

unsupportedRefreshStatement
: REFRESH LDAP (ALL | (FOR user=identifierOrText)) #refreshLdap
;

unsupportedCleanStatement
: CLEAN LABEL label=identifier? (FROM | IN) database=identifier #cleanLabel
| CLEAN QUERY STATS ((FOR database=identifier)
: CLEAN QUERY STATS ((FOR database=identifier)
| ((FROM | IN) table=multipartIdentifier)) #cleanQueryStats
| CLEAN ALL QUERY STATS #cleanAllQueryStats
;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

import org.apache.doris.analysis.BrokerDesc;
import org.apache.doris.analysis.CancelLoadStmt;
import org.apache.doris.analysis.CleanLabelStmt;
import org.apache.doris.analysis.CompoundPredicate.Operator;
import org.apache.doris.analysis.InsertStmt;
import org.apache.doris.analysis.LoadStmt;
Expand Down Expand Up @@ -859,9 +858,7 @@ private void checkLabelUsed(long dbId, String label) throws DdlException {
}
}

public void cleanLabel(CleanLabelStmt stmt) throws DdlException {
String dbName = stmt.getDb();
String label = stmt.getLabel();
public void cleanLabel(String dbName, String label) throws DdlException {
Database db = Env.getCurrentInternalCatalog().getDbOrDdlException(dbName);
cleanLabelInternal(db.getId(), label, false);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
import org.apache.doris.nereids.DorisParser.CancelMTMVTaskContext;
import org.apache.doris.nereids.DorisParser.CastDataTypeContext;
import org.apache.doris.nereids.DorisParser.CleanAllProfileContext;
import org.apache.doris.nereids.DorisParser.CleanLabelContext;
import org.apache.doris.nereids.DorisParser.CollateContext;
import org.apache.doris.nereids.DorisParser.ColumnDefContext;
import org.apache.doris.nereids.DorisParser.ColumnDefsContext;
Expand Down Expand Up @@ -617,6 +618,7 @@
import org.apache.doris.nereids.trees.plans.commands.UnsupportedCommand;
import org.apache.doris.nereids.trees.plans.commands.UpdateCommand;
import org.apache.doris.nereids.trees.plans.commands.alter.AlterDatabaseRenameCommand;
import org.apache.doris.nereids.trees.plans.commands.clean.CleanLabelCommand;
import org.apache.doris.nereids.trees.plans.commands.info.AddColumnOp;
import org.apache.doris.nereids.trees.plans.commands.info.AddColumnsOp;
import org.apache.doris.nereids.trees.plans.commands.info.AddPartitionOp;
Expand Down Expand Up @@ -5054,6 +5056,13 @@ public LogicalPlan visitCleanAllProfile(CleanAllProfileContext ctx) {
return new CleanAllProfileCommand();
}

@Override
public Object visitCleanLabel(CleanLabelContext ctx) {
String label = ctx.label == null ? null : ctx.label.getText();
IdentifierContext database = ctx.database;
return new CleanLabelCommand(stripQuotes(database.getText()), label);
}

@Override
public LogicalPlan visitShowWhitelist(ShowWhitelistContext ctx) {
return new ShowWhiteListCommand();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ public enum PlanType {
CREATE_VIEW_COMMAND,
CLEAN_ALL_PROFILE_COMMAND,
CLEAN_TRASH_COMMAND,
CLEAN_LABEL_COMMAND,
CREATE_ROLE_COMMAND,
ALTER_CATALOG_RENAME_COMMAND,
ALTER_ROLE_COMMAND,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// 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.nereids.trees.plans.commands.clean;

import org.apache.doris.analysis.StmtType;
import org.apache.doris.catalog.Env;
import org.apache.doris.common.ErrorCode;
import org.apache.doris.common.ErrorReport;
import org.apache.doris.datasource.InternalCatalog;
import org.apache.doris.mysql.privilege.PrivPredicate;
import org.apache.doris.nereids.trees.plans.PlanType;
import org.apache.doris.nereids.trees.plans.commands.Command;
import org.apache.doris.nereids.trees.plans.commands.ForwardWithSync;
import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
import org.apache.doris.qe.ConnectContext;
import org.apache.doris.qe.StmtExecutor;

import com.google.common.base.Strings;

/**
* clean label command.
*/
public class CleanLabelCommand extends Command implements ForwardWithSync {
private final String dbName;
private String label;

public CleanLabelCommand(String dbName, String label) {
super(PlanType.CLEAN_LABEL_COMMAND);
this.dbName = dbName;
this.label = label;
}

@Override
public void run(ConnectContext ctx, StmtExecutor executor) throws Exception {
label = Strings.nullToEmpty(label);
// check auth
if (!Env.getCurrentEnv().getAccessManager()
.checkDbPriv(ConnectContext.get(), InternalCatalog.INTERNAL_CATALOG_NAME, dbName, PrivPredicate.LOAD)) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, "LOAD");
}
Env.getCurrentEnv().getLoadManager().cleanLabel(dbName, label);
}

@Override
public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
return visitor.visitCleanLabelCommand(this, context);
}

@Override
public StmtType stmtType() {
return StmtType.CLEAN;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@
import org.apache.doris.nereids.trees.plans.commands.UnsupportedCommand;
import org.apache.doris.nereids.trees.plans.commands.UpdateCommand;
import org.apache.doris.nereids.trees.plans.commands.alter.AlterDatabaseRenameCommand;
import org.apache.doris.nereids.trees.plans.commands.clean.CleanLabelCommand;
import org.apache.doris.nereids.trees.plans.commands.insert.BatchInsertIntoTableCommand;
import org.apache.doris.nereids.trees.plans.commands.insert.InsertIntoTableCommand;
import org.apache.doris.nereids.trees.plans.commands.insert.InsertOverwriteTableCommand;
Expand Down Expand Up @@ -565,6 +566,10 @@ default R visitCleanAllProfileCommand(CleanAllProfileCommand cleanAllProfileComm
return visitCommand(cleanAllProfileCommand, context);
}

default R visitCleanLabelCommand(CleanLabelCommand cleanLabelCommand, C context) {
return visitCommand(cleanLabelCommand, context);
}

default R visitShowDataTypesCommand(ShowDataTypesCommand showDataTypesCommand, C context) {
return visitCommand(showDataTypesCommand, context);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,7 @@ public static void execute(Env env, DdlStmt ddlStmt) throws Exception {
} else if (ddlStmt instanceof AlterCatalogPropertyStmt) {
env.getCatalogMgr().alterCatalogProps((AlterCatalogPropertyStmt) ddlStmt);
} else if (ddlStmt instanceof CleanLabelStmt) {
env.getLoadManager().cleanLabel((CleanLabelStmt) ddlStmt);
env.getLoadManager().cleanLabel(((CleanLabelStmt) ddlStmt).getDb(), ((CleanLabelStmt) ddlStmt).getLabel());
} else if (ddlStmt instanceof DropMaterializedViewStmt) {
env.dropMaterializedView((DropMaterializedViewStmt) ddlStmt);
} else if (ddlStmt instanceof RefreshCatalogStmt) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
// 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.

suite("test_clean_label_nereids") {
String dbName = "nereids_clean_label"
String tableName1 = "test_table1"
String tableName2 = "test_table2"
String insertLabel = "label_" + System.currentTimeMillis()

sql """DROP DATABASE IF EXISTS ${dbName}"""
sql """create database ${dbName}"""
// Clean up the label in advance
sql """clean label from ${dbName}"""
sql """use ${dbName}"""
sql """
CREATE TABLE ${dbName}.${tableName1}(
user_id BIGINT NOT NULL ,
name VARCHAR(20) ,
age INT
)
DUPLICATE KEY(user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 10
properties
(
"replication_num" = "1"
)
;
"""
sql """
CREATE TABLE ${dbName}.${tableName2}(
user_id BIGINT NOT NULL COMMENT "user id",
name VARCHAR(20) COMMENT "name",
age INT COMMENT "age"
)
DUPLICATE KEY(user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 10
properties
(
"replication_num" = "1"
)
;
"""

sql """
INSERT INTO ${dbName}.${tableName1} (user_id, name, age)
VALUES (1, "Emily", 25),
(2, "Benjamin", 35),
(3, "Olivia", 28),
(4, "Alexander", 60),
(5, "Ava", 17);
"""

sql """
insert into ${dbName}.${tableName2} with LABEL ${insertLabel} select * from ${dbName}.${tableName1};
"""
sql """
INSERT INTO ${dbName}.${tableName2} (user_id, name, age)
VALUES (6, "Kevin", 30);
INSERT INTO ${dbName}.${tableName2} (user_id, name, age)
VALUES (7, "Simba", 31);
"""
//
def totalLabel = sql """show load from ${dbName}"""
println totalLabel
assert totalLabel.size() == 4
// clean label
checkNereidsExecute("clean label ${insertLabel} from ${dbName};")
checkNereidsExecute("clean label from ${dbName};")
def labelResult = sql """show load from ${dbName}"""
println labelResult
assert labelResult.size() == 0
sql """drop database ${dbName}"""
}

0 comments on commit 7a6c125

Please sign in to comment.