|
|
@@ -6,12 +6,12 @@ import com.google.common.collect.ImmutableList;
|
|
|
import com.google.common.collect.Lists;
|
|
|
import org.apache.commons.collections.MapUtils;
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
-import org.elasticsearch.dsl.bean.AtomQuery;
|
|
|
import org.elasticsearch.dsl.exception.ElasticSql2DslException;
|
|
|
import org.elasticsearch.dsl.helper.ElasticSqlArgTransferHelper;
|
|
|
import org.elasticsearch.dsl.helper.ElasticSqlMethodInvokeHelper;
|
|
|
import org.elasticsearch.dsl.listener.ParseActionListener;
|
|
|
-import org.elasticsearch.dsl.parser.query.method.AbstractAtomMethodQueryParser;
|
|
|
+import org.elasticsearch.dsl.parser.query.method.AbstractFieldSpecificMethodQueryParser;
|
|
|
+import org.elasticsearch.dsl.parser.query.method.MethodInvocation;
|
|
|
import org.elasticsearch.index.query.QueryBuilder;
|
|
|
import org.elasticsearch.index.query.QueryBuilders;
|
|
|
import org.elasticsearch.index.query.TermsQueryBuilder;
|
|
|
@@ -19,7 +19,7 @@ import org.elasticsearch.index.query.TermsQueryBuilder;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
|
-public class TermsAtomQueryParser extends AbstractAtomMethodQueryParser {
|
|
|
+public class TermsAtomQueryParser extends AbstractFieldSpecificMethodQueryParser {
|
|
|
|
|
|
private static List<String> TERMS_QUERY_METHOD = ImmutableList.of("terms", "terms_query", "termsQuery");
|
|
|
|
|
|
@@ -27,17 +27,35 @@ public class TermsAtomQueryParser extends AbstractAtomMethodQueryParser {
|
|
|
super(parseActionListener);
|
|
|
}
|
|
|
|
|
|
- public static Boolean isTermsQuery(SQLMethodInvokeExpr methodQueryExpr) {
|
|
|
- return ElasticSqlMethodInvokeHelper.isMethodOf(TERMS_QUERY_METHOD, methodQueryExpr.getMethodName());
|
|
|
+ @Override
|
|
|
+ public boolean isMatchMethodInvocation(MethodInvocation invocation) {
|
|
|
+ return ElasticSqlMethodInvokeHelper.isMethodOf(TERMS_QUERY_METHOD, invocation.getMatchQueryExpr().getMethodName());
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- protected void checkQueryMethod(SQLMethodInvokeExpr methodQueryExpr, String queryAs, Object[] sqlArgs) {
|
|
|
- if (Boolean.FALSE == isTermsQuery(methodQueryExpr)) {
|
|
|
- throw new ElasticSql2DslException(String.format("[syntax error] Expected terms query method name is [terms],but get [%s]", methodQueryExpr.getMethodName()));
|
|
|
+ protected String getExtraParamString(MethodInvocation invocation) {
|
|
|
+ int paramCount = invocation.getMatchQueryExpr().getParameters().size();
|
|
|
+ SQLExpr lastParam = invocation.getMatchQueryExpr().getParameters().get(paramCount - 1);
|
|
|
+
|
|
|
+ String extraParamString = ElasticSqlArgTransferHelper.transferSqlArg(lastParam, invocation.getSqlArgs(), false).toString();
|
|
|
+
|
|
|
+ if (isExtraParamsString(extraParamString)) {
|
|
|
+ return extraParamString;
|
|
|
}
|
|
|
+ return StringUtils.EMPTY;
|
|
|
+ }
|
|
|
|
|
|
- int paramCount = methodQueryExpr.getParameters().size();
|
|
|
+ @Override
|
|
|
+ protected void checkQueryMethod(MethodInvocation invocation) {
|
|
|
+ if (Boolean.FALSE == isMatchMethodInvocation(invocation)) {
|
|
|
+ throw new ElasticSql2DslException(
|
|
|
+ String.format("[syntax error] Expected terms query method name is [terms],but get [%s]",
|
|
|
+ invocation.getMatchQueryExpr().getMethodName()));
|
|
|
+ }
|
|
|
+
|
|
|
+ SQLMethodInvokeExpr methodQueryExpr = invocation.getMatchQueryExpr();
|
|
|
+
|
|
|
+ int paramCount = invocation.getMatchQueryExpr().getParameters().size();
|
|
|
if (paramCount <= 1) {
|
|
|
throw new ElasticSql2DslException(String.format("[syntax error] There's no %s args method: term", paramCount));
|
|
|
}
|
|
|
@@ -45,24 +63,19 @@ public class TermsAtomQueryParser extends AbstractAtomMethodQueryParser {
|
|
|
for (int idx = 1; idx < paramCount - 1; idx++) {
|
|
|
SQLExpr textExpr = methodQueryExpr.getParameters().get(idx);
|
|
|
|
|
|
- String text = ElasticSqlArgTransferHelper.transferSqlArg(textExpr, sqlArgs, false).toString();
|
|
|
+ String text = ElasticSqlArgTransferHelper.transferSqlArg(textExpr, invocation.getSqlArgs(), false).toString();
|
|
|
if (StringUtils.isEmpty(text)) {
|
|
|
throw new ElasticSql2DslException("[syntax error] Terms text can not be blank!");
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- SQLExpr lastParam = methodQueryExpr.getParameters().get(paramCount - 1);
|
|
|
- String lastParamText = ElasticSqlArgTransferHelper.transferSqlArg(lastParam, sqlArgs, false).toString();
|
|
|
-
|
|
|
- if (Boolean.FALSE == isExtraParamsString(lastParamText) && StringUtils.isEmpty(lastParamText)) {
|
|
|
- throw new ElasticSql2DslException("[syntax error] Terms text can not be blank!");
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- @SuppressWarnings("unchecked")
|
|
|
- protected AtomQuery parseMethodQueryExpr(SQLMethodInvokeExpr methodQueryExpr, String queryAs, Object[] sqlArgs) {
|
|
|
- SQLExpr queryField = methodQueryExpr.getParameters().get(0);
|
|
|
+ protected QueryBuilder buildQuery(MethodInvocation invocation, String fieldName, Map<String, String> extraParams) {
|
|
|
+
|
|
|
+ SQLMethodInvokeExpr methodQueryExpr = invocation.getMatchQueryExpr();
|
|
|
+ Object[] sqlArgs = invocation.getSqlArgs();
|
|
|
+
|
|
|
int paramCount = methodQueryExpr.getParameters().size();
|
|
|
|
|
|
List<String> termTextList = Lists.newArrayList();
|
|
|
@@ -76,30 +89,18 @@ public class TermsAtomQueryParser extends AbstractAtomMethodQueryParser {
|
|
|
SQLExpr lastParam = methodQueryExpr.getParameters().get(paramCount - 1);
|
|
|
String lastParamText = ElasticSqlArgTransferHelper.transferSqlArg(lastParam, sqlArgs, false).toString();
|
|
|
|
|
|
- Map<String, String> extraParamMap = null;
|
|
|
- if (isExtraParamsString(lastParamText)) {
|
|
|
- String extraParam = ElasticSqlArgTransferHelper.transferSqlArg(lastParam, sqlArgs, false).toString();
|
|
|
-
|
|
|
- extraParamMap = buildExtraMethodQueryParamsMap(extraParam);
|
|
|
- }
|
|
|
- else {
|
|
|
+ if (Boolean.FALSE == isExtraParamsString(lastParamText)) {
|
|
|
termTextList.add(lastParamText);
|
|
|
}
|
|
|
|
|
|
+ TermsQueryBuilder termsQuery = QueryBuilders.termsQuery(fieldName, termTextList);
|
|
|
+ setExtraMatchQueryParam(termsQuery, extraParams);
|
|
|
+ return termsQuery;
|
|
|
+ }
|
|
|
|
|
|
- return parseCondition(queryField, new Object[]{termTextList, extraParamMap}, queryAs, new IConditionMethodQueryBuilder() {
|
|
|
- @Override
|
|
|
- public QueryBuilder buildQuery(String queryFieldName, Object[] parameters) {
|
|
|
- TermsQueryBuilder termsQuery = QueryBuilders.termsQuery(queryFieldName, (List<String>) parameters[0]);
|
|
|
-
|
|
|
- if (parameters.length == 2 && parameters[1] != null) {
|
|
|
- Map<String, String> tExtraParamMap = (Map<String, String>) parameters[1];
|
|
|
- setExtraMatchQueryParam(termsQuery, tExtraParamMap);
|
|
|
- }
|
|
|
-
|
|
|
- return termsQuery;
|
|
|
- }
|
|
|
- });
|
|
|
+ @Override
|
|
|
+ protected SQLExpr getFieldExpr(MethodInvocation invocation) {
|
|
|
+ return invocation.getMatchQueryExpr().getParameters().get(0);
|
|
|
}
|
|
|
|
|
|
private void setExtraMatchQueryParam(TermsQueryBuilder termsQuery, Map<String, String> extraParamMap) {
|