|
@@ -8,6 +8,7 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
|
|
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
|
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
|
|
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
|
|
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
|
|
|
import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
|
|
import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
|
|
|
|
|
+import com.google.common.collect.ImmutableList;
|
|
|
import com.google.common.collect.Lists;
|
|
import com.google.common.collect.Lists;
|
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
|
import org.es.sql.druid.ElasticSqlSelectQueryBlock;
|
|
import org.es.sql.druid.ElasticSqlSelectQueryBlock;
|
|
@@ -23,6 +24,8 @@ import org.elasticsearch.search.sort.FieldSortBuilder;
|
|
|
import org.elasticsearch.search.sort.SortBuilder;
|
|
import org.elasticsearch.search.sort.SortBuilder;
|
|
|
import org.elasticsearch.search.sort.SortBuilders;
|
|
import org.elasticsearch.search.sort.SortBuilders;
|
|
|
import org.elasticsearch.search.sort.SortOrder;
|
|
import org.elasticsearch.search.sort.SortOrder;
|
|
|
|
|
+import org.es.sql.dsl.parser.query.method.MethodInvocation;
|
|
|
|
|
+import org.es.sql.dsl.parser.sql.sort.*;
|
|
|
|
|
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
|
|
|
@@ -30,8 +33,15 @@ public class QueryOrderConditionParser implements QueryParser {
|
|
|
|
|
|
|
|
private ParseActionListener parseActionListener;
|
|
private ParseActionListener parseActionListener;
|
|
|
|
|
|
|
|
|
|
+ private List<MethodSortParser> methodSortParsers;
|
|
|
|
|
+
|
|
|
public QueryOrderConditionParser(ParseActionListener parseActionListener) {
|
|
public QueryOrderConditionParser(ParseActionListener parseActionListener) {
|
|
|
this.parseActionListener = parseActionListener;
|
|
this.parseActionListener = parseActionListener;
|
|
|
|
|
+
|
|
|
|
|
+ methodSortParsers = ImmutableList.of(
|
|
|
|
|
+ new NvlMethodSortParser(),
|
|
|
|
|
+ new ScriptMethodSortParser()
|
|
|
|
|
+ );
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -51,76 +61,29 @@ public class QueryOrderConditionParser implements QueryParser {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private SortBuilder parseOrderCondition(SQLSelectOrderByItem orderByItem, String queryAs, Object[] sqlArgs) {
|
|
private SortBuilder parseOrderCondition(SQLSelectOrderByItem orderByItem, String queryAs, Object[] sqlArgs) {
|
|
|
- if (orderByItem.getExpr() instanceof SQLPropertyExpr || orderByItem.getExpr() instanceof SQLIdentifierExpr) {
|
|
|
|
|
- return parseCondition(orderByItem.getExpr(), queryAs, new ConditionSortBuilder() {
|
|
|
|
|
|
|
+
|
|
|
|
|
+ SortOrder order = orderByItem.getType() == SQLOrderingSpecification.ASC ? SortOrder.ASC : SortOrder.DESC;
|
|
|
|
|
+
|
|
|
|
|
+ if (ParseSortBuilderHelper.isFieldExpr(orderByItem.getExpr())) {
|
|
|
|
|
+ QueryFieldParser fieldParser = new QueryFieldParser();
|
|
|
|
|
+ ElasticSqlQueryField sortField = fieldParser.parseConditionQueryField(orderByItem.getExpr(), queryAs);
|
|
|
|
|
+ return ParseSortBuilderHelper.parseBasedOnFieldSortBuilder(sortField, new ConditionSortBuilder() {
|
|
|
@Override
|
|
@Override
|
|
|
public FieldSortBuilder buildSort(String queryFieldName) {
|
|
public FieldSortBuilder buildSort(String queryFieldName) {
|
|
|
- if (SQLOrderingSpecification.ASC == orderByItem.getType()) {
|
|
|
|
|
- return SortBuilders.fieldSort(queryFieldName).order(SortOrder.ASC);
|
|
|
|
|
- }
|
|
|
|
|
- else {
|
|
|
|
|
- return SortBuilders.fieldSort(queryFieldName).order(SortOrder.DESC);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ return SortBuilders.fieldSort(queryFieldName).order(order);
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
- if (orderByItem.getExpr() instanceof SQLMethodInvokeExpr) {
|
|
|
|
|
- SQLMethodInvokeExpr methodInvokeExpr = (SQLMethodInvokeExpr) orderByItem.getExpr();
|
|
|
|
|
- //nvl method
|
|
|
|
|
- if (ElasticSqlMethodInvokeHelper.isMethodOf(ElasticSqlMethodInvokeHelper.NVL_METHOD, methodInvokeExpr.getMethodName())) {
|
|
|
|
|
- ElasticSqlMethodInvokeHelper.checkNvlMethod(methodInvokeExpr);
|
|
|
|
|
- Object valueArg = ElasticSqlArgTransferHelper.transferSqlArg(methodInvokeExpr.getParameters().get(1), sqlArgs);
|
|
|
|
|
- return parseCondition(methodInvokeExpr.getParameters().get(0), queryAs, new ConditionSortBuilder() {
|
|
|
|
|
- @Override
|
|
|
|
|
- public FieldSortBuilder buildSort(String idfName) {
|
|
|
|
|
- FieldSortBuilder fieldSortBuilder = null;
|
|
|
|
|
-
|
|
|
|
|
- if (SQLOrderingSpecification.ASC == orderByItem.getType()) {
|
|
|
|
|
- fieldSortBuilder = SortBuilders.fieldSort(idfName).order(SortOrder.ASC).missing(valueArg);
|
|
|
|
|
- }
|
|
|
|
|
- else {
|
|
|
|
|
- fieldSortBuilder = SortBuilders.fieldSort(idfName).order(SortOrder.DESC).missing(valueArg);
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- if (methodInvokeExpr.getParameters().size() == 3) {
|
|
|
|
|
- SQLExpr sortModArg = methodInvokeExpr.getParameters().get(2);
|
|
|
|
|
- String sortModeText = ((SQLCharExpr) sortModArg).getText();
|
|
|
|
|
- fieldSortBuilder.sortMode(SortOption.get(sortModeText).mode());
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return fieldSortBuilder;
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ if (ParseSortBuilderHelper.isMethodInvokeExpr(orderByItem.getExpr())) {
|
|
|
|
|
+ MethodInvocation sortMethodInvocation = new MethodInvocation((SQLMethodInvokeExpr) orderByItem.getExpr(), queryAs, sqlArgs);
|
|
|
|
|
+ for (MethodSortParser methodSortParser : methodSortParsers) {
|
|
|
|
|
+ if (methodSortParser.isMatchMethodInvocation(sortMethodInvocation)) {
|
|
|
|
|
+ return methodSortParser.parseMethodSortBuilder(sortMethodInvocation, order);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- throw new ElasticSql2DslException("[syntax error] can not support sort type: " + orderByItem.getExpr().getClass());
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- private SortBuilder parseCondition(SQLExpr sqlExpr, String queryAs, ConditionSortBuilder sortBuilder) {
|
|
|
|
|
- QueryFieldParser queryFieldParser = new QueryFieldParser();
|
|
|
|
|
- ElasticSqlQueryField sortField = queryFieldParser.parseConditionQueryField(sqlExpr, queryAs);
|
|
|
|
|
-
|
|
|
|
|
- SortBuilder rtnSortBuilder = null;
|
|
|
|
|
- if (sortField.getQueryFieldType() == QueryFieldType.RootDocField || sortField.getQueryFieldType() == QueryFieldType.InnerDocField) {
|
|
|
|
|
- rtnSortBuilder = sortBuilder.buildSort(sortField.getQueryFieldFullName());
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (sortField.getQueryFieldType() == QueryFieldType.NestedDocField) {
|
|
|
|
|
- FieldSortBuilder originalSort = sortBuilder.buildSort(sortField.getQueryFieldFullName());
|
|
|
|
|
- originalSort.setNestedPath(sortField.getNestedDocContextPath());
|
|
|
|
|
- rtnSortBuilder = originalSort;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (rtnSortBuilder == null) {
|
|
|
|
|
- throw new ElasticSql2DslException(String.format("[syntax error] sort condition field can not support type[%s]", sortField.getQueryFieldType()));
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return rtnSortBuilder;
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
- @FunctionalInterface
|
|
|
|
|
- private interface ConditionSortBuilder {
|
|
|
|
|
- FieldSortBuilder buildSort(String idfName);
|
|
|
|
|
|
|
+ throw new ElasticSql2DslException("[syntax error] can not support sort type: " + orderByItem.getExpr().getClass());
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|