|
|
@@ -12,6 +12,7 @@ import org.elasticsearch.index.query.FilterBuilders;
|
|
|
import org.elasticsearch.sql.ElasticSqlSelectQueryBlock;
|
|
|
|
|
|
import java.util.List;
|
|
|
+import java.util.function.Consumer;
|
|
|
|
|
|
public class QueryWhereConditionParser implements ElasticSqlParser {
|
|
|
@Override
|
|
|
@@ -22,14 +23,14 @@ public class QueryWhereConditionParser implements ElasticSqlParser {
|
|
|
if (!sqlCondition.isAndOr()) {
|
|
|
dslContext.boolFilter().must(sqlCondition.getFilterList().get(0));
|
|
|
} else {
|
|
|
- sqlCondition.getFilterList().stream().forEach(filter -> {
|
|
|
+ for (FilterBuilder filter : sqlCondition.getFilterList()) {
|
|
|
if (sqlCondition.getOperator() == SQLBinaryOperator.BooleanAnd) {
|
|
|
dslContext.boolFilter().must(filter);
|
|
|
}
|
|
|
if (sqlCondition.getOperator() == SQLBinaryOperator.BooleanOr) {
|
|
|
dslContext.boolFilter().should(filter);
|
|
|
}
|
|
|
- });
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -39,21 +40,24 @@ public class QueryWhereConditionParser implements ElasticSqlParser {
|
|
|
SQLBinaryOpExpr sqlBinOpExpr = (SQLBinaryOpExpr) sqlExpr;
|
|
|
SQLBinaryOperator binaryOperator = sqlBinOpExpr.getOperator();
|
|
|
if (SQLBinaryOperator.BooleanAnd == binaryOperator || SQLBinaryOperator.BooleanOr == binaryOperator) {
|
|
|
- SqlCondition leftCondition = parseFilterCondition(dslContext, sqlBinOpExpr.getLeft());
|
|
|
- SqlCondition rightCondition = parseFilterCondition(dslContext, sqlBinOpExpr.getRight());
|
|
|
+ final SqlCondition leftCondition = parseFilterCondition(dslContext, sqlBinOpExpr.getLeft());
|
|
|
+ final SqlCondition rightCondition = parseFilterCondition(dslContext, sqlBinOpExpr.getRight());
|
|
|
|
|
|
List<FilterBuilder> curFilterList = Lists.newArrayList();
|
|
|
|
|
|
if (!leftCondition.isAndOr() || leftCondition.operator == binaryOperator) {
|
|
|
curFilterList.addAll(leftCondition.getFilterList());
|
|
|
} else {
|
|
|
- BoolFilterBuilder subBoolFilter = FilterBuilders.boolFilter();
|
|
|
- leftCondition.getFilterList().stream().forEach(filter -> {
|
|
|
- if (leftCondition.getOperator() == SQLBinaryOperator.BooleanAnd) {
|
|
|
- subBoolFilter.must(filter);
|
|
|
- }
|
|
|
- if (leftCondition.getOperator() == SQLBinaryOperator.BooleanOr) {
|
|
|
- subBoolFilter.should(filter);
|
|
|
+ final BoolFilterBuilder subBoolFilter = FilterBuilders.boolFilter();
|
|
|
+ leftCondition.getFilterList().stream().forEach(new Consumer<FilterBuilder>() {
|
|
|
+ @Override
|
|
|
+ public void accept(FilterBuilder filter) {
|
|
|
+ if (leftCondition.getOperator() == SQLBinaryOperator.BooleanAnd) {
|
|
|
+ subBoolFilter.must(filter);
|
|
|
+ }
|
|
|
+ if (leftCondition.getOperator() == SQLBinaryOperator.BooleanOr) {
|
|
|
+ subBoolFilter.should(filter);
|
|
|
+ }
|
|
|
}
|
|
|
});
|
|
|
curFilterList.add(subBoolFilter);
|
|
|
@@ -62,13 +66,16 @@ public class QueryWhereConditionParser implements ElasticSqlParser {
|
|
|
if (!rightCondition.isAndOr() || rightCondition.operator == binaryOperator) {
|
|
|
curFilterList.addAll(rightCondition.getFilterList());
|
|
|
} else {
|
|
|
- BoolFilterBuilder subBoolFilter = FilterBuilders.boolFilter();
|
|
|
- rightCondition.getFilterList().stream().forEach(filter -> {
|
|
|
- if (rightCondition.getOperator() == SQLBinaryOperator.BooleanAnd) {
|
|
|
- subBoolFilter.must(filter);
|
|
|
- }
|
|
|
- if (rightCondition.getOperator() == SQLBinaryOperator.BooleanOr) {
|
|
|
- subBoolFilter.should(filter);
|
|
|
+ final BoolFilterBuilder subBoolFilter = FilterBuilders.boolFilter();
|
|
|
+ rightCondition.getFilterList().stream().forEach(new Consumer<FilterBuilder>() {
|
|
|
+ @Override
|
|
|
+ public void accept(FilterBuilder filter) {
|
|
|
+ if (rightCondition.getOperator() == SQLBinaryOperator.BooleanAnd) {
|
|
|
+ subBoolFilter.must(filter);
|
|
|
+ }
|
|
|
+ if (rightCondition.getOperator() == SQLBinaryOperator.BooleanOr) {
|
|
|
+ subBoolFilter.should(filter);
|
|
|
+ }
|
|
|
}
|
|
|
});
|
|
|
curFilterList.add(subBoolFilter);
|
|
|
@@ -82,7 +89,7 @@ public class QueryWhereConditionParser implements ElasticSqlParser {
|
|
|
private FilterBuilder parseAtomFilterCondition(ElasticDslContext dslContext, SQLExpr sqlExpr) {
|
|
|
if (sqlExpr instanceof SQLBinaryOpExpr) {
|
|
|
SQLBinaryOpExpr sqlBinOpExpr = (SQLBinaryOpExpr) sqlExpr;
|
|
|
- SQLBinaryOperator binaryOperator = sqlBinOpExpr.getOperator();
|
|
|
+ final SQLBinaryOperator binaryOperator = sqlBinOpExpr.getOperator();
|
|
|
|
|
|
if (ElasticSqlParseUtil.isValidBinOperator(binaryOperator)) {
|
|
|
//以下是二元运算,左边必须是变量
|
|
|
@@ -92,13 +99,16 @@ public class QueryWhereConditionParser implements ElasticSqlParser {
|
|
|
|
|
|
//EQ NEQ
|
|
|
if (SQLBinaryOperator.Equality == binaryOperator || SQLBinaryOperator.LessThanOrGreater == binaryOperator || SQLBinaryOperator.NotEqual == binaryOperator) {
|
|
|
- Object targetVal = ElasticSqlParseUtil.transferSqlArg(sqlBinOpExpr.getRight());
|
|
|
- return parseCondition(sqlBinOpExpr.getLeft(), dslContext.getQueryAs(), idfName -> {
|
|
|
- FilterBuilder eqFilter = FilterBuilders.termFilter(idfName, targetVal);
|
|
|
- if (SQLBinaryOperator.Equality == binaryOperator) {
|
|
|
- return eqFilter;
|
|
|
- } else {
|
|
|
- return FilterBuilders.notFilter(eqFilter);
|
|
|
+ final Object targetVal = ElasticSqlParseUtil.transferSqlArg(sqlBinOpExpr.getRight());
|
|
|
+ return parseCondition(sqlBinOpExpr.getLeft(), dslContext.getQueryAs(), new ConditionFilterBuilder() {
|
|
|
+ @Override
|
|
|
+ public FilterBuilder buildFilter(String idfName) {
|
|
|
+ FilterBuilder eqFilter = FilterBuilders.termFilter(idfName, targetVal);
|
|
|
+ if (SQLBinaryOperator.Equality == binaryOperator) {
|
|
|
+ return eqFilter;
|
|
|
+ } else {
|
|
|
+ return FilterBuilders.notFilter(eqFilter);
|
|
|
+ }
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
@@ -106,19 +116,22 @@ public class QueryWhereConditionParser implements ElasticSqlParser {
|
|
|
//GT GTE LT LTE
|
|
|
if (SQLBinaryOperator.GreaterThan == binaryOperator || SQLBinaryOperator.GreaterThanOrEqual == binaryOperator
|
|
|
|| SQLBinaryOperator.LessThan == binaryOperator || SQLBinaryOperator.LessThanOrEqual == binaryOperator) {
|
|
|
- Object targetVal = ElasticSqlParseUtil.transferSqlArg(sqlBinOpExpr.getRight());
|
|
|
- return parseCondition(sqlBinOpExpr.getLeft(), dslContext.getQueryAs(), idfName -> {
|
|
|
- FilterBuilder rangeFilter = null;
|
|
|
- if (SQLBinaryOperator.GreaterThan == binaryOperator) {
|
|
|
- rangeFilter = FilterBuilders.rangeFilter(idfName).gt(targetVal);
|
|
|
- } else if (SQLBinaryOperator.GreaterThanOrEqual == binaryOperator) {
|
|
|
- rangeFilter = FilterBuilders.rangeFilter(idfName).gte(targetVal);
|
|
|
- } else if (SQLBinaryOperator.LessThan == binaryOperator) {
|
|
|
- rangeFilter = FilterBuilders.rangeFilter(idfName).lt(targetVal);
|
|
|
- } else if (SQLBinaryOperator.LessThanOrEqual == binaryOperator) {
|
|
|
- rangeFilter = FilterBuilders.rangeFilter(idfName).lte(targetVal);
|
|
|
+ final Object targetVal = ElasticSqlParseUtil.transferSqlArg(sqlBinOpExpr.getRight());
|
|
|
+ return parseCondition(sqlBinOpExpr.getLeft(), dslContext.getQueryAs(), new ConditionFilterBuilder() {
|
|
|
+ @Override
|
|
|
+ public FilterBuilder buildFilter(String idfName) {
|
|
|
+ FilterBuilder rangeFilter = null;
|
|
|
+ if (SQLBinaryOperator.GreaterThan == binaryOperator) {
|
|
|
+ rangeFilter = FilterBuilders.rangeFilter(idfName).gt(targetVal);
|
|
|
+ } else if (SQLBinaryOperator.GreaterThanOrEqual == binaryOperator) {
|
|
|
+ rangeFilter = FilterBuilders.rangeFilter(idfName).gte(targetVal);
|
|
|
+ } else if (SQLBinaryOperator.LessThan == binaryOperator) {
|
|
|
+ rangeFilter = FilterBuilders.rangeFilter(idfName).lt(targetVal);
|
|
|
+ } else if (SQLBinaryOperator.LessThanOrEqual == binaryOperator) {
|
|
|
+ rangeFilter = FilterBuilders.rangeFilter(idfName).lte(targetVal);
|
|
|
+ }
|
|
|
+ return rangeFilter;
|
|
|
}
|
|
|
- return rangeFilter;
|
|
|
});
|
|
|
}
|
|
|
|
|
|
@@ -127,54 +140,69 @@ public class QueryWhereConditionParser implements ElasticSqlParser {
|
|
|
if (!(sqlBinOpExpr.getRight() instanceof SQLNullExpr)) {
|
|
|
throw new ElasticSql2DslException("[syntax error] Is/IsNot expr right part should be null");
|
|
|
}
|
|
|
- return parseCondition(sqlBinOpExpr.getLeft(), dslContext.getQueryAs(), idfName -> {
|
|
|
- FilterBuilder missingFilter = FilterBuilders.missingFilter(idfName);
|
|
|
- if (SQLBinaryOperator.IsNot == binaryOperator) {
|
|
|
- return FilterBuilders.notFilter(missingFilter);
|
|
|
+ return parseCondition(sqlBinOpExpr.getLeft(), dslContext.getQueryAs(), new ConditionFilterBuilder() {
|
|
|
+ @Override
|
|
|
+ public FilterBuilder buildFilter(String idfName) {
|
|
|
+ FilterBuilder missingFilter = FilterBuilders.missingFilter(idfName);
|
|
|
+ if (SQLBinaryOperator.IsNot == binaryOperator) {
|
|
|
+ return FilterBuilders.notFilter(missingFilter);
|
|
|
+ }
|
|
|
+ return missingFilter;
|
|
|
}
|
|
|
- return missingFilter;
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
} else if (sqlExpr instanceof SQLInListExpr) {
|
|
|
- SQLInListExpr inListExpr = (SQLInListExpr) sqlExpr;
|
|
|
+ final SQLInListExpr inListExpr = (SQLInListExpr) sqlExpr;
|
|
|
if (CollectionUtils.isEmpty(inListExpr.getTargetList())) {
|
|
|
throw new ElasticSql2DslException("[syntax error] In list expr target list cannot be blank");
|
|
|
}
|
|
|
- Object[] targetInList = ElasticSqlParseUtil.transferSqlArgs(inListExpr.getTargetList());
|
|
|
- return parseCondition(inListExpr.getExpr(), dslContext.getQueryAs(), idfName -> {
|
|
|
- if (inListExpr.isNot()) {
|
|
|
- return FilterBuilders.notFilter(FilterBuilders.inFilter(idfName, targetInList));
|
|
|
- } else {
|
|
|
- return FilterBuilders.inFilter(idfName, targetInList);
|
|
|
+ final Object[] targetInList = ElasticSqlParseUtil.transferSqlArgs(inListExpr.getTargetList());
|
|
|
+ return parseCondition(inListExpr.getExpr(), dslContext.getQueryAs(), new ConditionFilterBuilder() {
|
|
|
+ @Override
|
|
|
+ public FilterBuilder buildFilter(String idfName) {
|
|
|
+ if (inListExpr.isNot()) {
|
|
|
+ return FilterBuilders.notFilter(FilterBuilders.inFilter(idfName, targetInList));
|
|
|
+ } else {
|
|
|
+ return FilterBuilders.inFilter(idfName, targetInList);
|
|
|
+ }
|
|
|
}
|
|
|
});
|
|
|
} else if (sqlExpr instanceof SQLBetweenExpr) {
|
|
|
SQLBetweenExpr betweenExpr = (SQLBetweenExpr) sqlExpr;
|
|
|
|
|
|
- Object from = ElasticSqlParseUtil.transferSqlArg(betweenExpr.getBeginExpr());
|
|
|
- Object to = ElasticSqlParseUtil.transferSqlArg(betweenExpr.getEndExpr());
|
|
|
+ final Object from = ElasticSqlParseUtil.transferSqlArg(betweenExpr.getBeginExpr());
|
|
|
+ final Object to = ElasticSqlParseUtil.transferSqlArg(betweenExpr.getEndExpr());
|
|
|
|
|
|
if (from == null || to == null) {
|
|
|
throw new ElasticSql2DslException("[syntax error] Between Expr only support one of [number,date] arg type");
|
|
|
}
|
|
|
|
|
|
- return parseCondition(betweenExpr.getTestExpr(), dslContext.getQueryAs(), idfName -> {
|
|
|
- return FilterBuilders.rangeFilter(idfName).gte(from).lte(to);
|
|
|
+ return parseCondition(betweenExpr.getTestExpr(), dslContext.getQueryAs(), new ConditionFilterBuilder() {
|
|
|
+ @Override
|
|
|
+ public FilterBuilder buildFilter(String idfName) {
|
|
|
+ return FilterBuilders.rangeFilter(idfName).gte(from).lte(to);
|
|
|
+ }
|
|
|
});
|
|
|
}
|
|
|
- throw new ElasticSql2DslException("[syntax error] Can not support Op type: " + sqlExpr.getClass());
|
|
|
+ throw new ElasticSql2DslException("[syntax error] Can not support syntax type: " + sqlExpr.toString());
|
|
|
}
|
|
|
|
|
|
- private FilterBuilder parseCondition(SQLExpr sqlExpr, String queryAs, ConditionFilterBuilder filterBuilder) {
|
|
|
- List<FilterBuilder> tmpFilterList = Lists.newLinkedList();
|
|
|
- ElasticSqlIdfParser.parseSqlIdentifier(sqlExpr, queryAs, idfName -> {
|
|
|
- FilterBuilder originalFilter = filterBuilder.buildFilter(idfName);
|
|
|
- tmpFilterList.add(originalFilter);
|
|
|
- }, (nestPath, idfName) -> {
|
|
|
- FilterBuilder originalFilter = filterBuilder.buildFilter(idfName);
|
|
|
- FilterBuilder nestFilter = FilterBuilders.nestedFilter(nestPath, originalFilter);
|
|
|
- tmpFilterList.add(nestFilter);
|
|
|
+ private FilterBuilder parseCondition(SQLExpr sqlExpr, String queryAs, final ConditionFilterBuilder filterBuilder) {
|
|
|
+ final List<FilterBuilder> tmpFilterList = Lists.newLinkedList();
|
|
|
+ ElasticSqlIdfParser.parseSqlIdentifier(sqlExpr, queryAs, new ElasticSqlIdfParser.ElasticSqlTopIdfFunc() {
|
|
|
+ @Override
|
|
|
+ public void parse(String idfName) {
|
|
|
+ FilterBuilder originalFilter = filterBuilder.buildFilter(idfName);
|
|
|
+ tmpFilterList.add(originalFilter);
|
|
|
+ }
|
|
|
+ }, new ElasticSqlIdfParser.ElasticSqlNestIdfFunc() {
|
|
|
+ @Override
|
|
|
+ public void parse(String nestPath, String idfName) {
|
|
|
+ FilterBuilder originalFilter = filterBuilder.buildFilter(idfName);
|
|
|
+ FilterBuilder nestFilter = FilterBuilders.nestedFilter(nestPath, originalFilter);
|
|
|
+ tmpFilterList.add(nestFilter);
|
|
|
+ }
|
|
|
});
|
|
|
if (CollectionUtils.isNotEmpty(tmpFilterList)) {
|
|
|
return tmpFilterList.get(0);
|