Skip to content

Commit

Permalink
fix comments
Browse files Browse the repository at this point in the history
  • Loading branch information
libinfeng committed Apr 22, 2024
1 parent 76f073f commit e04933a
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@
import org.apache.doris.nereids.rules.expression.rules.DateFunctionRewrite;
import org.apache.doris.nereids.rules.expression.rules.DistinctPredicatesRule;
import org.apache.doris.nereids.rules.expression.rules.ExtractCommonFactorRule;
import org.apache.doris.nereids.rules.expression.rules.NotEqualToLength;
import org.apache.doris.nereids.rules.expression.rules.NullSafeEqualToEqual;
import org.apache.doris.nereids.rules.expression.rules.OrToIn;
import org.apache.doris.nereids.rules.expression.rules.SimplifyComparisonPredicate;
import org.apache.doris.nereids.rules.expression.rules.SimplifyDecimalV3Comparison;
import org.apache.doris.nereids.rules.expression.rules.SimplifyInPredicate;
import org.apache.doris.nereids.rules.expression.rules.SimplifyRange;
import org.apache.doris.nereids.rules.expression.rules.StringEqualToLength;
import org.apache.doris.nereids.rules.expression.rules.TopnToMax;

import com.google.common.collect.ImmutableList;
Expand All @@ -53,7 +53,7 @@ public class ExpressionOptimization extends ExpressionRewrite {
CaseWhenToIf.INSTANCE,
TopnToMax.INSTANCE,
NullSafeEqualToEqual.INSTANCE,
NotEqualToLength.INSTANCE
StringEqualToLength.INSTANCE
)
);
private static final ExpressionRuleExecutor EXECUTOR = new ExpressionRuleExecutor(OPTIMIZE_REWRITE_RULES);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,41 +20,38 @@
import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
import org.apache.doris.nereids.trees.expressions.EqualPredicate;
import org.apache.doris.nereids.trees.expressions.EqualTo;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.GreaterThan;
import org.apache.doris.nereids.trees.expressions.Not;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Length;
import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral;
import org.apache.doris.nereids.trees.expressions.literal.StringLiteral;
import org.apache.doris.nereids.trees.expressions.literal.StringLikeLiteral;

import com.google.common.collect.ImmutableList;

import java.util.List;

/**
* Rewrite rule to convert NOT EQUAL(string, "") to GREATERTHAN(string, 0)
* Rewrite rule to convert EQUAL(string, "") to length(string, 0)
* For example:
* string <> "" ==> length(string) > 0
* string == "" ==> length(string) == 0
*/
public class NotEqualToLength implements ExpressionPatternRuleFactory {
public class StringEqualToLength implements ExpressionPatternRuleFactory {

public static NotEqualToLength INSTANCE = new NotEqualToLength();
public static StringEqualToLength INSTANCE = new StringEqualToLength();

@Override
public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
return ImmutableList.of(
matchesTopType(Not.class).then(NotEqualToLength::rewrite)
matchesTopType(EqualPredicate.class).then(StringEqualToLength::rewrite)
);
}

private static Expression rewrite(Not not) {
Expression expr = not;
if (not.getArgument(0) instanceof EqualPredicate) {
EqualPredicate equalPredicate = (EqualPredicate) not.getArgument(0);
if (equalPredicate.getArgument(0).getDataType().isStringType()
&& equalPredicate.getArgument(1).equals(new StringLiteral(""))) {
expr = new GreaterThan(new Length(equalPredicate.getArgument(0)), new IntegerLiteral(0), false);
}
private static Expression rewrite(EqualPredicate equalPredicate) {
Expression expr = equalPredicate;
if (equalPredicate.getArgument(0).getDataType().isStringType()
&& equalPredicate.getArgument(1) instanceof StringLikeLiteral
&& ((StringLikeLiteral) equalPredicate.getArgument(1)).getStringValue().equals("")) {
expr = new EqualTo(new Length(equalPredicate.getArgument(0)), new IntegerLiteral(0));
}
return expr;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,49 +15,62 @@
// specific language governing permissions and limitations
// under the License.

suite("test_not_equal_to_length") {
suite("string_equal_to_length") {
sql 'set enable_nereids_planner=true'
sql 'set enable_fallback_to_original_planner=false'

sql 'drop table if exists test_not_equal_to_length;'
sql 'drop table if exists test_string_equal_to_length;'

sql '''create table test_not_equal_to_length (k0 int, k1 string, k2 varchar, k3 char(5)) distributed by hash(k0) buckets 3 properties('replication_num' = '1');'''
sql '''create table test_string_equal_to_length (k0 int, k1 string, k2 varchar, k3 char(5)) distributed by hash(k0) buckets 3 properties('replication_num' = '1');'''

// for string type
sql '''
select k1
from test_not_equal_to_length
from test_string_equal_to_length
where k1 <> "";
'''
def res = sql '''
explain rewritten plan select k1
from test_not_equal_to_length
from test_string_equal_to_length
where k1 <> "";
'''
assertTrue(res.toString().contains("length"))

// for varchar type
sql '''
select k2
from test_not_equal_to_length
from test_string_equal_to_length
where k2 <> "";
'''
def res1 = sql '''
explain rewritten plan select k2
from test_not_equal_to_length
from test_string_equal_to_length
where k2 <> "";
'''
assertTrue(res1.toString().contains("length"))

sql '''
select k3
from test_not_equal_to_length
from test_string_equal_to_length
where k3 <> "";
'''
def res2 = sql '''
explain rewritten plan select k3
from test_not_equal_to_length
from test_string_equal_to_length
where k3 <> "";
'''
assertTrue(res2.toString().contains("length"))

// for equal
sql '''
select k1
from test_string_equal_to_length
where k1 == "";
'''
def res3 = sql '''
explain rewritten plan select k1
from test_string_equal_to_length
where k1 == "";'''
assertTrue(res3.toString().contains("length"))

}

0 comments on commit e04933a

Please sign in to comment.