11package io .github .iamazy .elasticsearch .dsl .sql .parser .query .exact ;
22
3+ import com .alibaba .druid .sql .ast .SQLExpr ;
34import com .alibaba .druid .sql .ast .expr .SQLBinaryOpExpr ;
45import com .alibaba .druid .sql .ast .expr .SQLBinaryOperator ;
6+ import com .alibaba .druid .sql .ast .expr .SQLCharExpr ;
57import com .alibaba .druid .sql .ast .expr .SQLNullExpr ;
68import io .github .iamazy .elasticsearch .dsl .sql .enums .SqlConditionOperator ;
79import io .github .iamazy .elasticsearch .dsl .sql .exception .ElasticSql2DslException ;
810import io .github .iamazy .elasticsearch .dsl .sql .helper .ElasticSqlArgConverter ;
911import io .github .iamazy .elasticsearch .dsl .sql .model .AtomicQuery ;
12+ import io .github .iamazy .elasticsearch .dsl .sql .model .SqlCondition ;
1013import org .elasticsearch .index .query .ExistsQueryBuilder ;
1114import org .elasticsearch .index .query .QueryBuilder ;
1215import org .elasticsearch .index .query .QueryBuilders ;
16+ import org .elasticsearch .index .query .RegexpQueryBuilder ;
1317
1418
1519public class BinaryQueryParser extends AbstractExactQueryParser {
@@ -32,6 +36,8 @@ public AtomicQuery parseBinaryQuery(SQLBinaryOpExpr binQueryExpr, String queryAs
3236 });
3337 }
3438
39+
40+
3541 //GT GTE LT LTE
3642 if (SQLBinaryOperator .GreaterThan == binaryOperator || SQLBinaryOperator .GreaterThanOrEqual == binaryOperator
3743 || SQLBinaryOperator .LessThan == binaryOperator || SQLBinaryOperator .LessThanOrEqual == binaryOperator ) {
@@ -84,6 +90,31 @@ else if (SqlConditionOperator.LessThanOrEqual == operator12) {
8490 });
8591 }
8692
93+ if (SQLBinaryOperator .Like == binaryOperator || SQLBinaryOperator .NotLike == binaryOperator ){
94+ if (binQueryExpr .getRight () instanceof SQLCharExpr ) {
95+ SQLCharExpr rightExpr = (SQLCharExpr ) binQueryExpr .getRight ();
96+ SQLExpr leftExpr = binQueryExpr .getLeft ();
97+ SqlConditionOperator operator =SQLBinaryOperator .Like == binaryOperator ?SqlConditionOperator .Like :SqlConditionOperator .NotLike ;
98+ return parseCondition (binQueryExpr .getLeft (),operator ,null ,queryAs ,((queryFieldName , operator1 , rightParamValues ) -> {
99+ String rightText =rightExpr .getText ();
100+ if (rightExpr .getText ().contains ("%" )){
101+ rightText =rightText .replace ("%" ,"*" );
102+ }
103+ if (rightExpr .getText ().contains ("_" )){
104+ rightText =rightText .replace ("_" ,"?" );
105+ }
106+ RegexpQueryBuilder regexpQueryBuilder = QueryBuilders .regexpQuery (leftExpr .toString (), rightText );
107+ if (operator1 .equals (SqlConditionOperator .Like )) {
108+ return regexpQueryBuilder ;
109+ }else {
110+ return QueryBuilders .boolQuery ().mustNot (regexpQueryBuilder );
111+ }
112+ }));
113+ }else {
114+ throw new ElasticSql2DslException ("[syntax error] Like/NotLike expr right part should be a char expr" );
115+ }
116+ }
117+
87118 throw new ElasticSql2DslException (String .format ("[syntax error] Can not support binary query type[%s]" , binQueryExpr .toString ()));
88119 }
89120}
0 commit comments