Skip to content

Commit

Permalink
[test](mtmv) Auto calc the value of sync_cbo_rewrite variable to make…
Browse files Browse the repository at this point in the history
… sure the same test code in different version
  • Loading branch information
seawinde committed Oct 22, 2024
1 parent f796e3b commit 7fefac9
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
import org.apache.doris.nereids.trees.plans.Plan;
import org.apache.doris.nereids.trees.plans.algebra.Relation;
import org.apache.doris.nereids.trees.plans.commands.ExplainCommand.ExplainLevel;
import org.apache.doris.nereids.trees.plans.physical.PhysicalPlan;
import org.apache.doris.nereids.trees.plans.physical.PhysicalRelation;
import org.apache.doris.nereids.trees.plans.visitor.DefaultPlanVisitor;
import org.apache.doris.statistics.ColumnStatistic;
Expand Down Expand Up @@ -348,7 +347,7 @@ public String toString() {
* ToSummaryString, this contains only summary info.
*/
public static String toSummaryString(List<MaterializationContext> materializationContexts,
PhysicalPlan physicalPlan) {
Plan physicalPlan) {
if (materializationContexts.isEmpty()) {
return "";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1684,6 +1684,17 @@ class Suite implements GroovyInterceptable {
return result.values().toList()
}

// enable_sync_mv_cost_based_rewrite is true or not
boolean enable_sync_mv_cost_based_rewrite () {
def showVariable = "show variables like 'enable_sync_mv_cost_based_rewrite';"
List<List<Object>> result = sql(showVariable)
logger.info("enable_sync_mv_cost_based_rewrite = " + result)
if (result.isEmpty()) {
return false;
}
return Boolean.parseBoolean(result.get(0).get(1));
}

// Given tables to decide whether the table partition row count statistic is ready or not
boolean is_partition_statistics_ready(db, tables) {
boolean isReady = true;
Expand Down Expand Up @@ -1763,12 +1774,14 @@ class Suite implements GroovyInterceptable {
// sync_cbo_rewrite is the bool value which control sync mv is use cbo based mv rewrite
// is_partition_statistics_ready is the bool value which identifying if partition row count is valid or not
// if true, check if chosen by cbo or doesn't check
def mv_rewrite_success = { query_sql, mv_name, sync_cbo_rewrite = true, is_partition_statistics_ready = true ->
void mv_rewrite_success(query_sql, mv_name, sync_cbo_rewrite = enable_sync_mv_cost_based_rewrite(),
is_partition_statistics_ready = true) {
logger.info("query_sql = " + query_sql + ", mv_name = " + mv_name + ", sync_cbo_rewrite = " +sync_cbo_rewrite
+ ", is_partition_statistics_ready = " + is_partition_statistics_ready)
if (!is_partition_statistics_ready) {
// If partition statistics is no ready, degrade to without check cbo chosen
return mv_rewrite_success_without_check_chosen(query_sql, mv_name, sync_cbo_rewrite)
mv_rewrite_success_without_check_chosen(query_sql, mv_name, sync_cbo_rewrite)
return
}
if (!sync_cbo_rewrite) {
explain {
Expand All @@ -1787,12 +1800,14 @@ class Suite implements GroovyInterceptable {
// sync_cbo_rewrite is the bool value which control sync mv is use cbo based mv rewrite
// is_partition_statistics_ready is the bool value which identifying if partition row count is valid or not
// if true, check if chosen by cbo or doesn't check
def mv_rewrite_all_success = { query_sql, mv_names, sync_cbo_rewrite = true, is_partition_statistics_ready = true ->
void mv_rewrite_all_success( query_sql, mv_names, sync_cbo_rewrite = enable_sync_mv_cost_based_rewrite(),
is_partition_statistics_ready = true) {
logger.info("query_sql = " + query_sql + ", mv_names = " + mv_names + ", sync_cbo_rewrite = " +sync_cbo_rewrite
+ ", is_partition_statistics_ready = " + is_partition_statistics_ready)
if (!is_partition_statistics_ready) {
// If partition statistics is no ready, degrade to without check cbo chosen
return mv_rewrite_all_success_without_check_chosen(query_sql, mv_names, sync_cbo_rewrite)
mv_rewrite_all_success_without_check_chosen(query_sql, mv_names, sync_cbo_rewrite)
return
}
if (!sync_cbo_rewrite) {
explain {
Expand Down Expand Up @@ -1823,12 +1838,14 @@ class Suite implements GroovyInterceptable {
// sync_cbo_rewrite is the bool value which control sync mv is use cbo based mv rewrite
// is_partition_statistics_ready is the bool value which identifying if partition row count is valid or not
// if true, check if chosen by cbo or doesn't check
def mv_rewrite_any_success = { query_sql, mv_names, sync_cbo_rewrite = true, is_partition_statistics_ready = true ->
void mv_rewrite_any_success(query_sql, mv_names, sync_cbo_rewrite = enable_sync_mv_cost_based_rewrite(),
is_partition_statistics_ready = true) {
logger.info("query_sql = " + query_sql + ", mv_names = " + mv_names + ", sync_cbo_rewrite = " +sync_cbo_rewrite
+ ", is_partition_statistics_ready = " + is_partition_statistics_ready)
if (!is_partition_statistics_ready) {
// If partition statistics is no ready, degrade to without check cbo chosen
return mv_rewrite_any_success_without_check_chosen(query_sql, mv_names, sync_cbo_rewrite)
mv_rewrite_any_success_without_check_chosen(query_sql, mv_names, sync_cbo_rewrite)
return
}
if (!sync_cbo_rewrite) {
explain {
Expand Down Expand Up @@ -1857,15 +1874,18 @@ class Suite implements GroovyInterceptable {

// multi mv part in rewrite process, all rewrte success without check if chosen by cbo
// sync_cbo_rewrite is the bool value which control sync mv is use cbo based mv rewrite
def mv_rewrite_all_success_without_check_chosen = { query_sql, mv_names, sync_cbo_rewrite = true ->
void mv_rewrite_all_success_without_check_chosen(query_sql, mv_names,
sync_cbo_rewrite = enable_sync_mv_cost_based_rewrite()){
logger.info("query_sql = " + query_sql + ", mv_names = " + mv_names)
if (!sync_cbo_rewrite) {
explain {
sql("${query_sql}")
check { result ->
boolean success = true;
for (String mv_name : mv_names) {
success = success && result.contains("(${mv_name})")
def splitResult = result.split("MaterializedViewRewriteFail")
def each_result = splitResult.length == 2 ? splitResult[0].contains(mv_name) : false
success = success && (result.contains"(${mv_name})" || each_result)
}
Assert.assertEquals(true, success)
}
Expand All @@ -1887,15 +1907,18 @@ class Suite implements GroovyInterceptable {

// multi mv part in rewrite process, any of them rewrte success without check if chosen by cbo or not
// sync_cbo_rewrite is the bool value which control sync mv is use cbo based mv rewrite
def mv_rewrite_any_success_without_check_chosen = { query_sql, mv_names, sync_cbo_rewrite = true ->
void mv_rewrite_any_success_without_check_chosen(query_sql, mv_names,
sync_cbo_rewrite = enable_sync_mv_cost_based_rewrite()) {
logger.info("query_sql = " + query_sql + ", mv_names = " + mv_names)
if (!sync_cbo_rewrite) {
explain {
sql("${query_sql}")
check { result ->
boolean success = false;
for (String mv_name : mv_names) {
success = success || result.contains("(${mv_name})")
def splitResult = result.split("MaterializedViewRewriteFail")
def each_result = splitResult.length == 2 ? splitResult[0].contains(mv_name) : false
success = success || (result.contains"(${mv_name})" || each_result)
}
Assert.assertEquals(true, success)
}
Expand All @@ -1904,7 +1927,7 @@ class Suite implements GroovyInterceptable {
}
explain {
sql(" memo plan ${query_sql}")
check {result ->
check { result ->
boolean success = false
for (String mv_name : mv_names) {
success = success || result.contains("${mv_name} chose") || result.contains("${mv_name} not chose")
Expand All @@ -1916,12 +1939,16 @@ class Suite implements GroovyInterceptable {

// multi mv part in rewrite process, rewrte success without check if chosen by cbo or not
// sync_cbo_rewrite is the bool value which control sync mv is use cbo based mv rewrite
def mv_rewrite_success_without_check_chosen = { query_sql, mv_name, sync_cbo_rewrite = true ->
void mv_rewrite_success_without_check_chosen(query_sql, mv_name,
sync_cbo_rewrite = enable_sync_mv_cost_based_rewrite()) {
logger.info("query_sql = " + query_sql + ", mv_name = " + mv_name)
if (!sync_cbo_rewrite) {
explain {
sql("${query_sql}")
contains("(${mv_name})")
check { result ->
def splitResult = result.split("MaterializedViewRewriteFail")
result.contains"(${mv_name})" || (splitResult.length == 2 ? splitResult[0].contains(mv_name) : false)
}
}
return
}
Expand All @@ -1935,12 +1962,12 @@ class Suite implements GroovyInterceptable {

// single mv part in rewrite process, rewrte fail
// sync_cbo_rewrite is the bool value which control sync mv is use cbo based mv rewrite
def mv_rewrite_fail = { query_sql, mv_name, sync_cbo_rewrite = true ->
void mv_rewrite_fail(query_sql, mv_name, sync_cbo_rewrite = enable_sync_mv_cost_based_rewrite()) {
logger.info("query_sql = " + query_sql + ", mv_name = " + mv_name)
if (!sync_cbo_rewrite) {
explain {
sql("${query_sql}")
nonContains("(${mv_name})")
notContains("(${mv_name})")
}
return
}
Expand All @@ -1952,7 +1979,7 @@ class Suite implements GroovyInterceptable {

// multi mv part in rewrite process, all rewrte fail
// sync_cbo_rewrite is the bool value which control sync mv is use cbo based mv rewrite
def mv_rewrite_all_fail = {query_sql, mv_names, sync_cbo_rewrite = true ->
void mv_rewrite_all_fail(query_sql, mv_names, sync_cbo_rewrite = enable_sync_mv_cost_based_rewrite()) {
logger.info("query_sql = " + query_sql + ", mv_names = " + mv_names)
if (!sync_cbo_rewrite) {
explain {
Expand Down Expand Up @@ -1983,7 +2010,7 @@ class Suite implements GroovyInterceptable {

// multi mv part in rewrite process, any rewrte fail
// sync_cbo_rewrite is the bool value which control sync mv is use cbo based mv rewrite
def mv_rewrite_any_fail = {query_sql, mv_names, sync_cbo_rewrite = true ->
void mv_rewrite_any_fail (query_sql, mv_names, sync_cbo_rewrite = enable_sync_mv_cost_based_rewrite()) {
logger.info("query_sql = " + query_sql + ", mv_names = " + mv_names)
if (!sync_cbo_rewrite) {
explain {
Expand Down Expand Up @@ -2022,7 +2049,7 @@ class Suite implements GroovyInterceptable {
"""
def job_name = getJobName(db, mv_name);
waitingMTMVTaskFinished(job_name)
mv_rewrite_success(query_sql, mv_name)
mv_rewrite_success(query_sql, mv_name, true)
}

def async_mv_rewrite_success_without_check_chosen = { db, mv_sql, query_sql, mv_name ->
Expand All @@ -2038,7 +2065,7 @@ class Suite implements GroovyInterceptable {

def job_name = getJobName(db, mv_name);
waitingMTMVTaskFinished(job_name)
mv_rewrite_success_without_check_chosen(query_sql, mv_name)
mv_rewrite_success_without_check_chosen(query_sql, mv_name, true)
}


Expand All @@ -2055,7 +2082,7 @@ class Suite implements GroovyInterceptable {

def job_name = getJobName(db, mv_name);
waitingMTMVTaskFinished(job_name)
mv_rewrite_fail(query_sql, mv_name)
mv_rewrite_fail(query_sql, mv_name, true)
}

def token = context.config.metaServiceToken
Expand Down

0 comments on commit 7fefac9

Please sign in to comment.