This is an automated email from the ASF dual-hosted git repository.
airborne pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new e6b51086d8c [fix](ES Catalog)Only like on keyword can be applied to
wildcard query (#41176) (#43459)
e6b51086d8c is described below
commit e6b51086d8c41628c64783deea743a4257680fe7
Author: qiye <[email protected]>
AuthorDate: Fri Nov 8 09:40:17 2024 +0800
[fix](ES Catalog)Only like on keyword can be applied to wildcard query
(#41176) (#43459)
bp #41176
---
.../java/org/apache/doris/catalog/EsTable.java | 5 +-
.../doris/catalog/external/EsExternalTable.java | 8 +-
.../doris/external/elasticsearch/EsUtil.java | 19 ++--
.../external/elasticsearch/QueryBuilders.java | 102 ++++++++++-------
.../java/org/apache/doris/planner/EsScanNode.java | 6 +-
.../doris/external/elasticsearch/EsUtilTest.java | 7 +-
.../external/elasticsearch/QueryBuildersTest.java | 124 ++++++++++++++++-----
.../data/external_table_p0/es/test_es_query.out | 104 +++++++++++++++++
.../external_table_p0/es/test_es_query.groovy | 10 +-
9 files changed, 299 insertions(+), 86 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/EsTable.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/EsTable.java
index ab4b69440f9..4d9bda287d3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/EsTable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/EsTable.java
@@ -115,6 +115,9 @@ public class EsTable extends Table {
// Periodically pull es metadata
private EsMetaStateTracker esMetaStateTracker;
+ // column name -> elasticsearch field data type
+ private Map<String, String> column2typeMap = new HashMap<>();
+
public EsTable() {
super(TableType.ELASTICSEARCH);
}
@@ -340,6 +343,6 @@ public class EsTable extends Table {
}
public List<Column> genColumnsFromEs() {
- return EsUtil.genColumnsFromEs(client, indexName, mappingType, false);
+ return EsUtil.genColumnsFromEs(client, indexName, mappingType, false,
column2typeMap);
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/catalog/external/EsExternalTable.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/external/EsExternalTable.java
index 464fb79b8da..d06e07d1fab 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/catalog/external/EsExternalTable.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/catalog/external/EsExternalTable.java
@@ -26,7 +26,9 @@ import org.apache.doris.thrift.TEsTable;
import org.apache.doris.thrift.TTableDescriptor;
import org.apache.doris.thrift.TTableType;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
* Elasticsearch external table.
@@ -34,6 +36,7 @@ import java.util.List;
public class EsExternalTable extends ExternalTable {
private EsTable esTable;
+ private Map<String, String> column2typeMap = new HashMap<>();
/**
* Create elasticsearch external table.
@@ -78,9 +81,11 @@ public class EsExternalTable extends ExternalTable {
@Override
public List<Column> initSchema() {
EsRestClient restClient = ((EsExternalCatalog)
catalog).getEsRestClient();
- return EsUtil.genColumnsFromEs(restClient, name, null,
((EsExternalCatalog) catalog).enableMappingEsId());
+ return EsUtil.genColumnsFromEs(restClient, name, null,
((EsExternalCatalog) catalog).enableMappingEsId(),
+ column2typeMap);
}
+
private EsTable toEsTable() {
List<Column> schema = getFullSchema();
EsExternalCatalog esCatalog = (EsExternalCatalog) catalog;
@@ -98,6 +103,7 @@ public class EsExternalTable extends ExternalTable {
esTable.setHosts(String.join(",", esCatalog.getNodes()));
esTable.syncTableMetaData();
esTable.setIncludeHiddenIndex(esCatalog.enableIncludeHiddenIndex());
+ esTable.setColumn2typeMap(column2typeMap);
return esTable;
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/EsUtil.java
b/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/EsUtil.java
index 0178d9784ec..fcf95f87837 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/EsUtil.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/EsUtil.java
@@ -189,18 +189,18 @@ public class EsUtil {
* Add mappingEsId config in es external catalog.
**/
public static List<Column> genColumnsFromEs(EsRestClient client, String
indexName, String mappingType,
- boolean mappingEsId) {
+ boolean mappingEsId, Map<String, String> column2typeMap) {
String mapping = client.getMapping(indexName);
ObjectNode mappings = getMapping(mapping);
// Get array_fields while removing _meta property.
List<String> arrayFields = new ArrayList<>();
ObjectNode rootSchema = getRootSchema(mappings, mappingType,
arrayFields);
- return genColumnsFromEs(indexName, mappingType, rootSchema,
mappingEsId, arrayFields);
+ return genColumnsFromEs(indexName, mappingType, rootSchema,
mappingEsId, arrayFields, column2typeMap);
}
@VisibleForTesting
public static List<Column> genColumnsFromEs(String indexName, String
mappingType, ObjectNode rootSchema,
- boolean mappingEsId, List<String> arrayFields) {
+ boolean mappingEsId, List<String> arrayFields, Map<String, String>
column2typeMap) {
List<Column> columns = new ArrayList<>();
if (mappingEsId) {
Column column = new Column();
@@ -220,7 +220,8 @@ public class EsUtil {
while (iterator.hasNext()) {
String fieldName = iterator.next();
ObjectNode fieldValue = (ObjectNode) mappingProps.get(fieldName);
- Column column = parseEsField(fieldName,
replaceFieldAlias(mappingProps, fieldValue), arrayFields);
+ Column column = parseEsField(fieldName,
replaceFieldAlias(mappingProps, fieldValue), arrayFields,
+ column2typeMap);
columns.add(column);
}
return columns;
@@ -245,7 +246,8 @@ public class EsUtil {
return fieldValue;
}
- private static Column parseEsField(String fieldName, ObjectNode
fieldValue, List<String> arrayFields) {
+ private static Column parseEsField(String fieldName, ObjectNode
fieldValue, List<String> arrayFields,
+ Map<String, String> column2typeMap) {
Column column = new Column();
column.setName(fieldName);
column.setIsKey(true);
@@ -256,6 +258,7 @@ public class EsUtil {
if (fieldValue.has("type")) {
String typeStr = fieldValue.get("type").asText();
column.setComment("Elasticsearch type is " + typeStr);
+ column2typeMap.put(fieldName, typeStr);
// reference
https://www.elastic.co/guide/en/elasticsearch/reference/8.3/sql-data-types.html
switch (typeStr) {
case "null":
@@ -298,15 +301,17 @@ public class EsUtil {
type = ScalarType.createStringType();
break;
case "nested":
- case "object":
type = Type.JSONB;
break;
default:
type = Type.UNSUPPORTED;
}
} else {
+ // When there is no explicit type in mapping, it indicates this
type is an `object` in Elasticsearch.
+ // reference:
https://www.elastic.co/guide/en/elasticsearch/reference/current/object.html
type = Type.JSONB;
- column.setComment("Elasticsearch no type");
+ column.setComment("Elasticsearch type is object");
+ column2typeMap.put(fieldName, "object");
}
if (arrayFields.contains(fieldName)) {
column.setType(ArrayType.create(type, true));
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/QueryBuilders.java
b/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/QueryBuilders.java
index 518f6d93bbd..b549f379bb4 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/QueryBuilders.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/QueryBuilders.java
@@ -70,14 +70,14 @@ public final class QueryBuilders {
* Generate dsl from compound expr.
**/
private static QueryBuilder toCompoundEsDsl(Expr expr, List<Expr>
notPushDownList,
- Map<String, String> fieldsContext, BuilderOptions builderOptions) {
+ Map<String, String> fieldsContext, BuilderOptions builderOptions,
Map<String, String> column2typeMap) {
CompoundPredicate compoundPredicate = (CompoundPredicate) expr;
switch (compoundPredicate.getOp()) {
case AND: {
QueryBuilder left = toEsDsl(compoundPredicate.getChild(0),
notPushDownList, fieldsContext,
- builderOptions);
+ builderOptions, column2typeMap);
QueryBuilder right = toEsDsl(compoundPredicate.getChild(1),
notPushDownList, fieldsContext,
- builderOptions);
+ builderOptions, column2typeMap);
if (left != null && right != null) {
return QueryBuilders.boolQuery().must(left).must(right);
}
@@ -86,9 +86,9 @@ public final class QueryBuilders {
case OR: {
int beforeSize = notPushDownList.size();
QueryBuilder left = toEsDsl(compoundPredicate.getChild(0),
notPushDownList, fieldsContext,
- builderOptions);
+ builderOptions, column2typeMap);
QueryBuilder right = toEsDsl(compoundPredicate.getChild(1),
notPushDownList, fieldsContext,
- builderOptions);
+ builderOptions, column2typeMap);
int afterSize = notPushDownList.size();
if (left != null && right != null) {
return
QueryBuilders.boolQuery().should(left).should(right);
@@ -101,7 +101,7 @@ public final class QueryBuilders {
}
case NOT: {
QueryBuilder child = toEsDsl(compoundPredicate.getChild(0),
notPushDownList, fieldsContext,
- builderOptions);
+ builderOptions, column2typeMap);
if (child != null) {
return QueryBuilders.boolQuery().mustNot(child);
}
@@ -122,10 +122,10 @@ public final class QueryBuilders {
return expr;
}
- public static QueryBuilder toEsDsl(Expr expr) {
+ public static QueryBuilder toEsDsl(Expr expr, Map<String, String>
column2typeMap) {
return toEsDsl(expr, new ArrayList<>(), new HashMap<>(),
BuilderOptions.builder().likePushDown(Boolean.parseBoolean(EsResource.LIKE_PUSH_DOWN_DEFAULT_VALUE))
- .build());
+ .build(), column2typeMap);
}
private static TExprOpcode flipOpCode(TExprOpcode opCode) {
@@ -185,32 +185,44 @@ public final class QueryBuilders {
return
QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery(column));
}
- private static QueryBuilder parseLikePredicate(Expr expr, String column) {
- LikePredicate likePredicate = (LikePredicate) expr;
- if (likePredicate.getOp().equals(Operator.LIKE)) {
- char[] chars =
likePredicate.getChild(1).getStringValue().toCharArray();
- // example of translation :
- // abc_123 ===> abc?123
- // abc%ykz ===> abc*123
- // %abc123 ===> *abc123
- // _abc123 ===> ?abc123
- // \\_abc1 ===> \\_abc1
- // abc\\_123 ===> abc\\_123
- // abc\\%123 ===> abc\\%123
- // NOTE. user must input sql like 'abc\\_123' or 'abc\\%ykz'
- for (int i = 0; i < chars.length; i++) {
- if (chars[i] == '_' || chars[i] == '%') {
- if (i == 0) {
- chars[i] = (chars[i] == '_') ? '?' : '*';
- } else if (chars[i - 1] != '\\') {
- chars[i] = (chars[i] == '_') ? '?' : '*';
- }
- }
+ private static QueryBuilder parseLikeExpression(Expr expr, String column) {
+ String pattern;
+ if (expr instanceof LikePredicate) {
+ LikePredicate likePredicate = (LikePredicate) expr;
+ if (!likePredicate.getOp().equals(Operator.LIKE)) {
+ return QueryBuilders.wildcardQuery(column,
likePredicate.getChild(1).getStringValue());
+ }
+ pattern = likePredicate.getChild(1).getStringValue();
+ } else if (expr instanceof FunctionCallExpr) {
+ FunctionCallExpr functionCallExpr = (FunctionCallExpr) expr;
+ String fnName = functionCallExpr.getFnName().getFunction();
+ if (!fnName.equalsIgnoreCase("like")) {
+ return QueryBuilders.wildcardQuery(column,
functionCallExpr.getChild(1).getStringValue());
}
- return QueryBuilders.wildcardQuery(column, new String(chars));
+ pattern = functionCallExpr.getChild(1).getStringValue();
} else {
- return QueryBuilders.wildcardQuery(column,
likePredicate.getChild(1).getStringValue());
+ throw new IllegalArgumentException("Unsupported expression type");
+ }
+ char[] chars = pattern.toCharArray();
+ // example of translation :
+ // abc_123 ===> abc?123
+ // abc%ykz ===> abc*123
+ // %abc123 ===> *abc123
+ // _abc123 ===> ?abc123
+ // \\_abc1 ===> \\_abc1
+ // abc\\_123 ===> abc\\_123
+ // abc\\%123 ===> abc\\%123
+ // NOTE. user must input sql like 'abc\\_123' or 'abc\\%ykz'
+ for (int i = 0; i < chars.length; i++) {
+ if (chars[i] == '_' || chars[i] == '%') {
+ if (i == 0) {
+ chars[i] = (chars[i] == '_') ? '?' : '*';
+ } else if (chars[i - 1] != '\\') {
+ chars[i] = (chars[i] == '_') ? '?' : '*';
+ }
+ }
}
+ return QueryBuilders.wildcardQuery(column, new String(chars));
}
private static QueryBuilder parseInPredicate(Expr expr, String column,
boolean needDateCompat) {
@@ -257,18 +269,18 @@ public final class QueryBuilders {
* Doris expr to es dsl.
**/
public static QueryBuilder toEsDsl(Expr expr, List<Expr> notPushDownList,
Map<String, String> fieldsContext,
- BuilderOptions builderOptions) {
+ BuilderOptions builderOptions, Map<String, String> column2typeMap)
{
if (expr == null) {
return null;
}
// esquery functionCallExpr will be rewritten to castExpr in where
clause rewriter,
// so we get the functionCallExpr here.
if (expr instanceof CastExpr) {
- return toEsDsl(expr.getChild(0), notPushDownList, fieldsContext,
builderOptions);
+ return toEsDsl(expr.getChild(0), notPushDownList, fieldsContext,
builderOptions, column2typeMap);
}
// CompoundPredicate, `between` also converted to CompoundPredicate.
if (expr instanceof CompoundPredicate) {
- return toCompoundEsDsl(expr, notPushDownList, fieldsContext,
builderOptions);
+ return toCompoundEsDsl(expr, notPushDownList, fieldsContext,
builderOptions, column2typeMap);
}
TExprOpcode opCode = expr.getOpcode();
boolean isFlip = false;
@@ -287,6 +299,7 @@ public final class QueryBuilders {
return null;
}
+ String type = column2typeMap.get(column);
// Check whether the date type need compat, it must before keyword
replace.
List<String> needCompatDateFields =
builderOptions.getNeedCompatDateFields();
boolean needDateCompat = needCompatDateFields != null &&
needCompatDateFields.contains(column);
@@ -313,24 +326,29 @@ public final class QueryBuilders {
return parseIsNullPredicate(expr, column);
}
if (expr instanceof LikePredicate) {
- if (!builderOptions.isLikePushDown()) {
+ if (builderOptions.isLikePushDown() && "keyword".equals(type)) {
+ // only keyword can apply wildcard query
+ return parseLikeExpression(expr, column);
+ } else {
notPushDownList.add(expr);
return null;
- } else {
- return parseLikePredicate(expr, column);
}
}
if (expr instanceof InPredicate) {
return parseInPredicate(expr, column, needDateCompat);
}
if (expr instanceof FunctionCallExpr) {
- FunctionCallExpr functionCallExpr = (FunctionCallExpr) expr;
- // current only esquery functionCallExpr can be push down to ES
- if (!"esquery".equals(functionCallExpr.getFnName().getFunction()))
{
+ // current only esquery and like applied in keyword
functionCallExpr can be push down to ES
+ String fnName = ((FunctionCallExpr)
expr).getFnName().getFunction();
+ if ("esquery".equals(fnName)) {
+ return parseFunctionCallExpr(expr);
+ } else if (builderOptions.isLikePushDown() &&
"like".equalsIgnoreCase(fnName) && "keyword".equals(type)) {
+ return parseLikeExpression(expr, column);
+ } else if (builderOptions.isLikePushDown() &&
"regexp".equalsIgnoreCase(fnName)) {
+ return parseLikeExpression(expr, column);
+ } else {
notPushDownList.add(expr);
return null;
- } else {
- return parseFunctionCallExpr(expr);
}
}
return null;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/EsScanNode.java
b/fe/fe-core/src/main/java/org/apache/doris/planner/EsScanNode.java
index b5f39193895..9fdb8f02a0d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/EsScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/EsScanNode.java
@@ -350,10 +350,14 @@ public class EsScanNode extends ExternalScanNode {
boolean hasFilter = false;
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
List<Expr> notPushDownList = new ArrayList<>();
+ if (table.getColumn2typeMap() == null) {
+ table.genColumnsFromEs();
+ }
for (Expr expr : conjuncts) {
QueryBuilder queryBuilder = QueryBuilders.toEsDsl(expr,
notPushDownList, fieldsContext,
BuilderOptions.builder().likePushDown(table.isLikePushDown())
-
.needCompatDateFields(table.needCompatDateFields()).build());
+
.needCompatDateFields(table.needCompatDateFields()).build(),
+ table.getColumn2typeMap());
if (queryBuilder != null) {
hasFilter = true;
boolQueryBuilder.must(queryBuilder);
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsUtilTest.java
b/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsUtilTest.java
index f5b3133fbf7..8e184001e35 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsUtilTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsUtilTest.java
@@ -34,6 +34,7 @@ import org.junit.rules.ExpectedException;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
/**
@@ -221,7 +222,7 @@ public class EsUtilTest extends EsTestCase {
public void testDateType() throws IOException, URISyntaxException {
ObjectNode testDateFormat = EsUtil.getRootSchema(
EsUtil.getMapping(loadJsonFromFile("data/es/test_date_format.json")), null, new
ArrayList<>());
- List<Column> parseColumns =
EsUtil.genColumnsFromEs("test_date_format", null, testDateFormat, false, new
ArrayList<>());
+ List<Column> parseColumns =
EsUtil.genColumnsFromEs("test_date_format", null, testDateFormat, false, new
ArrayList<>(), new HashMap<>());
Assertions.assertEquals(8, parseColumns.size());
for (Column column : parseColumns) {
String name = column.getName();
@@ -254,7 +255,7 @@ public class EsUtilTest extends EsTestCase {
public void testFieldAlias() throws IOException, URISyntaxException {
ObjectNode testFieldAlias = EsUtil.getRootSchema(
EsUtil.getMapping(loadJsonFromFile("data/es/test_field_alias.json")), null, new
ArrayList<>());
- List<Column> parseColumns =
EsUtil.genColumnsFromEs("test_field_alias", null, testFieldAlias, true, new
ArrayList<>());
+ List<Column> parseColumns =
EsUtil.genColumnsFromEs("test_field_alias", null, testFieldAlias, true, new
ArrayList<>(), new HashMap<>());
Assertions.assertEquals("datetimev2(0)",
parseColumns.get(2).getType().toSql());
Assertions.assertEquals("text", parseColumns.get(4).getType().toSql());
}
@@ -264,7 +265,7 @@ public class EsUtilTest extends EsTestCase {
ObjectNode testFieldAlias = EsUtil.getRootSchema(
EsUtil.getMapping(loadJsonFromFile("data/es/es6_dynamic_complex_type.json")),
null, new ArrayList<>());
List<Column> columns = EsUtil.genColumnsFromEs("test_complex_type",
"complex_type", testFieldAlias, true,
- new ArrayList<>());
+ new ArrayList<>(), new HashMap<>());
Assertions.assertEquals(3, columns.size());
}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/QueryBuildersTest.java
b/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/QueryBuildersTest.java
index 64f69bb4644..e5788dc3e85 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/QueryBuildersTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/QueryBuildersTest.java
@@ -70,30 +70,32 @@ public class QueryBuildersTest {
Expr ltExpr = new BinaryPredicate(Operator.LT, k1, intLiteral);
Expr gtExpr = new BinaryPredicate(Operator.GT, k1, intLiteral);
Expr efnExpr = new BinaryPredicate(Operator.EQ_FOR_NULL, new
SlotRef(null, "k1"), new IntLiteral(3));
- Assertions.assertEquals("{\"term\":{\"k1\":3}}",
QueryBuilders.toEsDsl(eqExpr).toJson());
+ Map<String, String> column2typeMap = new HashMap<>();
+ Assertions.assertEquals("{\"term\":{\"k1\":3}}",
QueryBuilders.toEsDsl(eqExpr, column2typeMap).toJson());
Assertions.assertEquals("{\"bool\":{\"must_not\":{\"term\":{\"k1\":3}}}}",
- QueryBuilders.toEsDsl(neExpr).toJson());
- Assertions.assertEquals("{\"range\":{\"k1\":{\"lte\":3}}}",
QueryBuilders.toEsDsl(leExpr).toJson());
- Assertions.assertEquals("{\"range\":{\"k1\":{\"gte\":3}}}",
QueryBuilders.toEsDsl(geExpr).toJson());
- Assertions.assertEquals("{\"range\":{\"k1\":{\"lt\":3}}}",
QueryBuilders.toEsDsl(ltExpr).toJson());
- Assertions.assertEquals("{\"range\":{\"k1\":{\"gt\":3}}}",
QueryBuilders.toEsDsl(gtExpr).toJson());
- Assertions.assertEquals("{\"term\":{\"k1\":3}}",
QueryBuilders.toEsDsl(efnExpr).toJson());
+ QueryBuilders.toEsDsl(neExpr, column2typeMap).toJson());
+ Assertions.assertEquals("{\"range\":{\"k1\":{\"lte\":3}}}",
QueryBuilders.toEsDsl(leExpr, column2typeMap).toJson());
+ Assertions.assertEquals("{\"range\":{\"k1\":{\"gte\":3}}}",
QueryBuilders.toEsDsl(geExpr, column2typeMap).toJson());
+ Assertions.assertEquals("{\"range\":{\"k1\":{\"lt\":3}}}",
QueryBuilders.toEsDsl(ltExpr, column2typeMap).toJson());
+ Assertions.assertEquals("{\"range\":{\"k1\":{\"gt\":3}}}",
QueryBuilders.toEsDsl(gtExpr, column2typeMap).toJson());
+ Assertions.assertEquals("{\"term\":{\"k1\":3}}",
QueryBuilders.toEsDsl(efnExpr, column2typeMap).toJson());
SlotRef k2 = new SlotRef(null, "k2");
Expr dateTimeLiteral = new StringLiteral("2023-02-19 22:00:00");
Expr dateTimeEqExpr = new BinaryPredicate(Operator.EQ, k2,
dateTimeLiteral);
Assertions.assertEquals("{\"term\":{\"k2\":\"2023-02-19T22:00:00.000+08:00\"}}",
QueryBuilders.toEsDsl(dateTimeEqExpr, new ArrayList<>(), new
HashMap<>(),
-
BuilderOptions.builder().needCompatDateFields(Lists.newArrayList("k2")).build()).toJson());
+
BuilderOptions.builder().needCompatDateFields(Lists.newArrayList("k2")).build(),
+ new HashMap<>()).toJson());
SlotRef k3 = new SlotRef(null, "k3");
Expr stringLiteral = new StringLiteral("");
Expr stringNeExpr = new BinaryPredicate(Operator.NE, k3,
stringLiteral);
Assertions.assertEquals("{\"bool\":{\"must\":{\"exists\":{\"field\":\"k3\"}},\"must_not\":{\"term\":{\"k3\":\"\"}}}}",
- QueryBuilders.toEsDsl(stringNeExpr).toJson());
+ QueryBuilders.toEsDsl(stringNeExpr, column2typeMap).toJson());
stringLiteral = new StringLiteral("message");
stringNeExpr = new BinaryPredicate(Operator.NE, k3, stringLiteral);
Assertions.assertEquals("{\"bool\":{\"must_not\":{\"term\":{\"k3\":\"message\"}}}}",
- QueryBuilders.toEsDsl(stringNeExpr).toJson());
+ QueryBuilders.toEsDsl(stringNeExpr, column2typeMap).toJson());
}
@Test
@@ -102,6 +104,7 @@ public class QueryBuildersTest {
IntLiteral intLiteral1 = new IntLiteral(3);
SlotRef k2 = new SlotRef(null, "k2");
IntLiteral intLiteral2 = new IntLiteral(5);
+ Map<String, String> column2typeMap = new HashMap<>();
BinaryPredicate binaryPredicate1 = new BinaryPredicate(Operator.EQ,
k1, intLiteral1);
BinaryPredicate binaryPredicate2 = new BinaryPredicate(Operator.GT,
k2, intLiteral2);
CompoundPredicate andPredicate = new
CompoundPredicate(CompoundPredicate.Operator.AND, binaryPredicate1,
@@ -110,21 +113,22 @@ public class QueryBuildersTest {
binaryPredicate2);
CompoundPredicate notPredicate = new
CompoundPredicate(CompoundPredicate.Operator.NOT, binaryPredicate1, null);
Assertions.assertEquals("{\"bool\":{\"must\":[{\"term\":{\"k1\":3}},{\"range\":{\"k2\":{\"gt\":5}}}]}}",
- QueryBuilders.toEsDsl(andPredicate).toJson());
+ QueryBuilders.toEsDsl(andPredicate, column2typeMap).toJson());
Assertions.assertEquals("{\"bool\":{\"should\":[{\"term\":{\"k1\":3}},{\"range\":{\"k2\":{\"gt\":5}}}]}}",
- QueryBuilders.toEsDsl(orPredicate).toJson());
+ QueryBuilders.toEsDsl(orPredicate, column2typeMap).toJson());
Assertions.assertEquals("{\"bool\":{\"must_not\":{\"term\":{\"k1\":3}}}}",
- QueryBuilders.toEsDsl(notPredicate).toJson());
+ QueryBuilders.toEsDsl(notPredicate, column2typeMap).toJson());
}
@Test
public void testIsNullPredicateConvertEsDsl() {
SlotRef k1 = new SlotRef(null, "k1");
+ Map<String, String> column2typeMap = new HashMap<>();
IsNullPredicate isNullPredicate = new IsNullPredicate(k1, false);
IsNullPredicate isNotNullPredicate = new IsNullPredicate(k1, true);
Assertions.assertEquals("{\"bool\":{\"must_not\":{\"exists\":{\"field\":\"k1\"}}}}",
- QueryBuilders.toEsDsl(isNullPredicate).toJson());
- Assertions.assertEquals("{\"exists\":{\"field\":\"k1\"}}",
QueryBuilders.toEsDsl(isNotNullPredicate).toJson());
+ QueryBuilders.toEsDsl(isNullPredicate,
column2typeMap).toJson());
+ Assertions.assertEquals("{\"exists\":{\"field\":\"k1\"}}",
QueryBuilders.toEsDsl(isNotNullPredicate, column2typeMap).toJson());
}
@Test
@@ -136,13 +140,28 @@ public class QueryBuildersTest {
LikePredicate likePredicate1 = new
LikePredicate(LikePredicate.Operator.LIKE, k1, stringLiteral1);
LikePredicate regexPredicate = new
LikePredicate(LikePredicate.Operator.REGEXP, k1, stringLiteral2);
LikePredicate likePredicate2 = new
LikePredicate(LikePredicate.Operator.LIKE, k1, stringLiteral3);
- Assertions.assertEquals("{\"wildcard\":{\"k1\":\"*1*\"}}",
QueryBuilders.toEsDsl(likePredicate1).toJson());
- Assertions.assertEquals("{\"wildcard\":{\"k1\":\"*1*\"}}",
QueryBuilders.toEsDsl(regexPredicate).toJson());
- Assertions.assertEquals("{\"wildcard\":{\"k1\":\"1?2\"}}",
QueryBuilders.toEsDsl(likePredicate2).toJson());
+ Map<String, String> column2typeMap = new HashMap<>();
+ column2typeMap.put("k1", "keyword");
+ Assertions.assertEquals("{\"wildcard\":{\"k1\":\"*1*\"}}",
QueryBuilders.toEsDsl(likePredicate1, column2typeMap).toJson());
+ Assertions.assertEquals("{\"wildcard\":{\"k1\":\"*1*\"}}",
QueryBuilders.toEsDsl(regexPredicate, column2typeMap).toJson());
+ Assertions.assertEquals("{\"wildcard\":{\"k1\":\"1?2\"}}",
QueryBuilders.toEsDsl(likePredicate2, column2typeMap).toJson());
List<Expr> notPushDownList = new ArrayList<>();
Assertions.assertNull(QueryBuilders.toEsDsl(likePredicate2,
notPushDownList, new HashMap<>(),
- BuilderOptions.builder().likePushDown(false).build()));
+ BuilderOptions.builder().likePushDown(false).build(),
column2typeMap));
Assertions.assertFalse(notPushDownList.isEmpty());
+
+ // like can not push down
+ column2typeMap.clear();
+ notPushDownList.clear();
+ column2typeMap.put("k1", "text");
+ Assertions.assertNull(QueryBuilders.toEsDsl(likePredicate1,
notPushDownList, new HashMap<>(),
+ BuilderOptions.builder().likePushDown(true).build(),
column2typeMap));
+ Assertions.assertNull(QueryBuilders.toEsDsl(likePredicate2,
notPushDownList, new HashMap<>(),
+ BuilderOptions.builder().likePushDown(true).build(),
column2typeMap));
+ Assertions.assertNull(QueryBuilders.toEsDsl(regexPredicate,
notPushDownList, new HashMap<>(),
+ BuilderOptions.builder().likePushDown(true).build(),
column2typeMap));
+
+ Assertions.assertEquals(3, notPushDownList.size());
}
@Test
@@ -155,9 +174,10 @@ public class QueryBuildersTest {
intLiterals.add(intLiteral2);
InPredicate isInPredicate = new InPredicate(k1, intLiterals, false);
InPredicate isNotInPredicate = new InPredicate(k1, intLiterals, true);
- Assertions.assertEquals("{\"terms\":{\"k1\":[3,5]}}",
QueryBuilders.toEsDsl(isInPredicate).toJson());
+ Map<String, String> column2typeMap = new HashMap<>();
+ Assertions.assertEquals("{\"terms\":{\"k1\":[3,5]}}",
QueryBuilders.toEsDsl(isInPredicate, column2typeMap).toJson());
Assertions.assertEquals("{\"bool\":{\"must_not\":{\"terms\":{\"k1\":[3,5]}}}}",
- QueryBuilders.toEsDsl(isNotInPredicate).toJson());
+ QueryBuilders.toEsDsl(isNotInPredicate,
column2typeMap).toJson());
}
@Test
@@ -165,11 +185,12 @@ public class QueryBuildersTest {
SlotRef k1 = new SlotRef(null, "k1");
String str = "{\"bool\":{\"must_not\":{\"terms\":{\"k1\":[3,5]}}}}";
StringLiteral stringLiteral = new StringLiteral(str);
+ Map<String, String> column2typeMap = new HashMap<>();
List<Expr> exprs = new ArrayList<>();
exprs.add(k1);
exprs.add(stringLiteral);
FunctionCallExpr functionCallExpr = new FunctionCallExpr("esquery",
exprs);
- Assertions.assertEquals(str,
QueryBuilders.toEsDsl(functionCallExpr).toJson());
+ Assertions.assertEquals(str, QueryBuilders.toEsDsl(functionCallExpr,
column2typeMap).toJson());
SlotRef k2 = new SlotRef(null, "k2");
IntLiteral intLiteral = new IntLiteral(5);
@@ -178,7 +199,44 @@ public class QueryBuildersTest {
functionCallExpr);
Assertions.assertEquals(
"{\"bool\":{\"must\":[{\"term\":{\"k2\":5}},{\"bool\":{\"must_not\":{\"terms\":{\"k1\":[3,5]}}}}]}}",
- QueryBuilders.toEsDsl(compoundPredicate).toJson());
+ QueryBuilders.toEsDsl(compoundPredicate,
column2typeMap).toJson());
+ }
+
+ @Test
+ public void testLikeFunctionCallConvertEsDsl() {
+ SlotRef k1 = new SlotRef(null, "k1");
+ String str1 = "text%";
+ StringLiteral stringLiteral1 = new StringLiteral(str1);
+ Map<String, String> column2typeMap = new HashMap<>();
+ column2typeMap.put("k1", "keyword");
+ List<Expr> exprs1 = new ArrayList<>();
+ exprs1.add(k1);
+ exprs1.add(stringLiteral1);
+ FunctionCallExpr likeFunctionCallExpr = new FunctionCallExpr("like",
exprs1);
+ Assertions.assertEquals("{\"wildcard\":{\"k1\":\"text*\"}}",
+ QueryBuilders.toEsDsl(likeFunctionCallExpr,
column2typeMap).toJson());
+
+ SlotRef k2 = new SlotRef(null, "k2");
+ String str2 = "text$";
+ StringLiteral stringLiteral2 = new StringLiteral(str2);
+ List<Expr> exprs2 = new ArrayList<>();
+ exprs2.add(k2);
+ exprs2.add(stringLiteral2);
+ FunctionCallExpr regexFunctionCallExpr = new
FunctionCallExpr("regexp", exprs2);
+ Assertions.assertEquals("{\"wildcard\":{\"k2\":\"text$\"}}",
+ QueryBuilders.toEsDsl(regexFunctionCallExpr,
column2typeMap).toJson());
+
+
+ column2typeMap.clear();
+ List<Expr> notPushDownList = new ArrayList<>();
+ column2typeMap.put("k1", "text");
+ Assertions.assertNull(QueryBuilders.toEsDsl(likeFunctionCallExpr,
notPushDownList, new HashMap<>(),
+ BuilderOptions.builder().likePushDown(true).build(),
column2typeMap));
+ Assertions.assertEquals("{\"wildcard\":{\"k2\":\"text$\"}}",
+ QueryBuilders.toEsDsl(regexFunctionCallExpr, notPushDownList,
new HashMap<>(),
+ BuilderOptions.builder().likePushDown(true).build(),
column2typeMap).toJson());
+
+ Assertions.assertEquals(1, notPushDownList.size());
}
@Test
@@ -188,8 +246,10 @@ public class QueryBuildersTest {
BinaryPredicate castPredicate = new BinaryPredicate(Operator.EQ,
castExpr, new IntLiteral(3));
List<Expr> notPushDownList = new ArrayList<>();
Map<String, String> fieldsContext = new HashMap<>();
+ Map<String, String> col2typeMap = new HashMap<>();
BuilderOptions builderOptions =
BuilderOptions.builder().likePushDown(true).build();
- Assertions.assertNull(QueryBuilders.toEsDsl(castPredicate,
notPushDownList, fieldsContext, builderOptions));
+ Assertions.assertNull(QueryBuilders.toEsDsl(castPredicate,
notPushDownList, fieldsContext, builderOptions,
+ col2typeMap));
Assertions.assertEquals(1, notPushDownList.size());
SlotRef k2 = new SlotRef(null, "k2");
@@ -198,7 +258,7 @@ public class QueryBuildersTest {
CompoundPredicate compoundPredicate = new
CompoundPredicate(CompoundPredicate.Operator.OR, castPredicate,
eqPredicate);
- QueryBuilders.toEsDsl(compoundPredicate, notPushDownList,
fieldsContext, builderOptions);
+ QueryBuilders.toEsDsl(compoundPredicate, notPushDownList,
fieldsContext, builderOptions, col2typeMap);
Assertions.assertEquals(3, notPushDownList.size());
SlotRef k3 = new SlotRef(null, "k3");
@@ -206,7 +266,7 @@ public class QueryBuildersTest {
CastExpr castDoubleExpr = new CastExpr(Type.DOUBLE, k3);
BinaryPredicate castDoublePredicate = new BinaryPredicate(Operator.GE,
castDoubleExpr,
new FloatLiteral(3.0, Type.DOUBLE));
- QueryBuilders.toEsDsl(castDoublePredicate, notPushDownList,
fieldsContext, builderOptions);
+ QueryBuilders.toEsDsl(castDoublePredicate, notPushDownList,
fieldsContext, builderOptions, col2typeMap);
Assertions.assertEquals(3, notPushDownList.size());
SlotRef k4 = new SlotRef(null, "k4");
@@ -214,25 +274,29 @@ public class QueryBuildersTest {
CastExpr castFloatExpr = new CastExpr(Type.FLOAT, k4);
BinaryPredicate castFloatPredicate = new BinaryPredicate(Operator.GE,
new FloatLiteral(3.0, Type.FLOAT),
castFloatExpr);
- QueryBuilders.QueryBuilder queryBuilder =
QueryBuilders.toEsDsl(castFloatPredicate, notPushDownList, fieldsContext,
builderOptions);
+ QueryBuilders.QueryBuilder queryBuilder =
QueryBuilders.toEsDsl(castFloatPredicate, notPushDownList,
+ fieldsContext, builderOptions, col2typeMap);
Assertions.assertEquals("{\"range\":{\"k4\":{\"lte\":3.0}}}",
queryBuilder.toJson());
Assertions.assertEquals(3, notPushDownList.size());
castFloatPredicate = new BinaryPredicate(Operator.LE, new
FloatLiteral(3.0, Type.FLOAT),
castFloatExpr);
- queryBuilder = QueryBuilders.toEsDsl(castFloatPredicate,
notPushDownList, fieldsContext, builderOptions);
+ queryBuilder = QueryBuilders.toEsDsl(castFloatPredicate,
notPushDownList, fieldsContext, builderOptions,
+ col2typeMap);
Assertions.assertEquals("{\"range\":{\"k4\":{\"gte\":3.0}}}",
queryBuilder.toJson());
Assertions.assertEquals(3, notPushDownList.size());
castFloatPredicate = new BinaryPredicate(Operator.LT, new
FloatLiteral(3.0, Type.FLOAT),
castFloatExpr);
- queryBuilder = QueryBuilders.toEsDsl(castFloatPredicate,
notPushDownList, fieldsContext, builderOptions);
+ queryBuilder = QueryBuilders.toEsDsl(castFloatPredicate,
notPushDownList, fieldsContext, builderOptions,
+ col2typeMap);
Assertions.assertEquals("{\"range\":{\"k4\":{\"gt\":3.0}}}",
queryBuilder.toJson());
Assertions.assertEquals(3, notPushDownList.size());
castFloatPredicate = new BinaryPredicate(Operator.GT, new
FloatLiteral(3.0, Type.FLOAT),
castFloatExpr);
- queryBuilder = QueryBuilders.toEsDsl(castFloatPredicate,
notPushDownList, fieldsContext, builderOptions);
+ queryBuilder = QueryBuilders.toEsDsl(castFloatPredicate,
notPushDownList, fieldsContext, builderOptions,
+ col2typeMap);
Assertions.assertEquals("{\"range\":{\"k4\":{\"lt\":3.0}}}",
queryBuilder.toJson());
Assertions.assertEquals(3, notPushDownList.size());
}
diff --git a/regression-test/data/external_table_p0/es/test_es_query.out
b/regression-test/data/external_table_p0/es/test_es_query.out
index 6d761babed7..628fe9772e9 100644
--- a/regression-test/data/external_table_p0/es/test_es_query.out
+++ b/regression-test/data/external_table_p0/es/test_es_query.out
@@ -20,6 +20,10 @@ I'm not null or empty
I'm not null or empty
-- !sql06 --
+\N
+\N
+\N
+
I'm not null or empty
-- !sql07 --
@@ -220,6 +224,17 @@ Ivy [12, 34, 56] ["judo", "karate", "taekwondo"]
-- !sql_5_28 --
value1 value2
+-- !sql_5_29 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+
+-- !sql_5_30 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+string_ignore_above_10 text_ignore_above_10
+
-- !sql_6_02 --
[1, 0, 1, 1] [1, -2, -3, 4] ["2020-01-01", "2020-01-02"] ["2020-01-01
12:00:00", "2020-01-02 13:01:01"] [1, 2, 3, 4] [1, 1.1, 1.2, 1.3] [1,
2, 3, 4] [32768, 32769, -32769, -32770] ["192.168.0.1", "127.0.0.1"]
["a", "b", "c"] [-1, 0, 1, 2]
[{"name":"Andy","age":18},{"name":"Tim","age":28}] [1, 2, 3, 4] [128,
129, -129, -130] ["d", "e", "f"] [0, 1, 2, 3]
[{"last":"Smith","first":"John"},{"last":"White","first":"Alice"}] \N
string1 text#1 3.14 2022-08-08T00:00 12345 2022-08-08T20:10:10
@@ -349,6 +364,17 @@ Ivy [12, 34, 56] ["judo", "karate", "taekwondo"]
-- !sql_6_28 --
value1 value2
+-- !sql_6_29 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+
+-- !sql_6_30 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+string_ignore_above_10 text_ignore_above_10
+
-- !sql_7_02 --
[1, 0, 1, 1] [1, -2, -3, 4] ["2020-01-01", "2020-01-02"] ["2020-01-01
12:00:00", "2020-01-02 13:01:01"] [1, 2, 3, 4] [1, 1.1, 1.2, 1.3] [1,
2, 3, 4] [32768, 32769, -32769, -32770] ["192.168.0.1", "127.0.0.1"]
["a", "b", "c"] [-1, 0, 1, 2]
[{"name":"Andy","age":18},{"name":"Tim","age":28}] [1, 2, 3, 4] [128,
129, -129, -130] ["d", "e", "f"] [0, 1, 2, 3]
[{"last":"Smith","first":"John"},{"last":"White","first":"Alice"}] debug
\N This string can be quite lengthy string1 2022-08-08T20:10:10
[...]
@@ -517,6 +543,19 @@ Grace [34, 56, 78] ["table tennis", "badminton",
"athletics"]
Henry [23, 45, 67] ["archery", "fencing", "weightlifting"]
Ivy [12, 34, 56] ["judo", "karate", "taekwondo"]
+-- !sql_7_35 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+string4 text3_4*5
+
+-- !sql_7_36 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+string4 text3_4*5
+string_ignore_above_10 text_ignore_above_10
+
-- !sql_7_50 --
value1 value2
@@ -685,6 +724,19 @@ Grace [34, 56, 78] ["table tennis", "badminton",
"athletics"]
Henry [23, 45, 67] ["archery", "fencing", "weightlifting"]
Ivy [12, 34, 56] ["judo", "karate", "taekwondo"]
+-- !sql_8_33 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+string4 text3_4*5
+
+-- !sql_8_34 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+string4 text3_4*5
+string_ignore_above_10 text_ignore_above_10
+
-- !sql01 --
["2020-01-01 12:00:00", "2020-01-02 13:01:01"] [-1, 0, 1, 2] [0, 1, 2, 3]
["d", "e", "f"] [128, 129, -129, -130] ["192.168.0.1", "127.0.0.1"] string1
[1, 2, 3, 4] 2022-08-08 2022-08-08T12:10:10 text#1 ["2020-01-01",
"2020-01-02"] 3.14 [1, 2, 3, 4] [1, 1.1, 1.2, 1.3] [1, 2, 3, 4]
["a", "b", "c"] [{"name":"Andy","age":18},{"name":"Tim","age":28}]
2022-08-08T12:10:10 2022-08-08T12:10:10 2022-08-08T20:10:10 [1, -2,
-3, 4] [1, 0, 1, 1] [32768, 32769, -32769, -32770] \N
[{"last":"Smith","first [...]
@@ -706,6 +758,10 @@ I'm not null or empty
I'm not null or empty
-- !sql06 --
+\N
+\N
+\N
+
I'm not null or empty
-- !sql07 --
@@ -906,6 +962,17 @@ Ivy [12, 34, 56] ["judo", "karate", "taekwondo"]
-- !sql_5_28 --
value1 value2
+-- !sql_5_29 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+
+-- !sql_5_30 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+string_ignore_above_10 text_ignore_above_10
+
-- !sql_6_02 --
[1, 0, 1, 1] [1, -2, -3, 4] ["2020-01-01", "2020-01-02"] ["2020-01-01
12:00:00", "2020-01-02 13:01:01"] [1, 2, 3, 4] [1, 1.1, 1.2, 1.3] [1,
2, 3, 4] [32768, 32769, -32769, -32770] ["192.168.0.1", "127.0.0.1"]
["a", "b", "c"] [-1, 0, 1, 2]
[{"name":"Andy","age":18},{"name":"Tim","age":28}] [1, 2, 3, 4] [128,
129, -129, -130] ["d", "e", "f"] [0, 1, 2, 3]
[{"last":"Smith","first":"John"},{"last":"White","first":"Alice"}] \N
string1 text#1 3.14 2022-08-08T00:00 12345 2022-08-08T20:10:10
@@ -1035,6 +1102,17 @@ Ivy [12, 34, 56] ["judo", "karate", "taekwondo"]
-- !sql_6_28 --
value1 value2
+-- !sql_6_29 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+
+-- !sql_6_30 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+string_ignore_above_10 text_ignore_above_10
+
-- !sql_7_02 --
[1, 0, 1, 1] [1, -2, -3, 4] ["2020-01-01", "2020-01-02"] ["2020-01-01
12:00:00", "2020-01-02 13:01:01"] [1, 2, 3, 4] [1, 1.1, 1.2, 1.3] [1,
2, 3, 4] [32768, 32769, -32769, -32770] ["192.168.0.1", "127.0.0.1"]
["a", "b", "c"] [-1, 0, 1, 2]
[{"name":"Andy","age":18},{"name":"Tim","age":28}] [1, 2, 3, 4] [128,
129, -129, -130] ["d", "e", "f"] [0, 1, 2, 3]
[{"last":"Smith","first":"John"},{"last":"White","first":"Alice"}] debug
\N This string can be quite lengthy string1 2022-08-08T20:10:10
[...]
@@ -1203,6 +1281,19 @@ Grace [34, 56, 78] ["table tennis", "badminton",
"athletics"]
Henry [23, 45, 67] ["archery", "fencing", "weightlifting"]
Ivy [12, 34, 56] ["judo", "karate", "taekwondo"]
+-- !sql_7_35 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+string4 text3_4*5
+
+-- !sql_7_36 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+string4 text3_4*5
+string_ignore_above_10 text_ignore_above_10
+
-- !sql_7_50 --
value1 value2
@@ -1371,3 +1462,16 @@ Grace [34, 56, 78] ["table tennis", "badminton",
"athletics"]
Henry [23, 45, 67] ["archery", "fencing", "weightlifting"]
Ivy [12, 34, 56] ["judo", "karate", "taekwondo"]
+-- !sql_8_33 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+string4 text3_4*5
+
+-- !sql_8_34 --
+string1 text#1
+string2 text2
+string3 text3_4*5
+string4 text3_4*5
+string_ignore_above_10 text_ignore_above_10
+
diff --git a/regression-test/suites/external_table_p0/es/test_es_query.groovy
b/regression-test/suites/external_table_p0/es/test_es_query.groovy
index 796a6656c13..08dbc0a94ee 100644
--- a/regression-test/suites/external_table_p0/es/test_es_query.groovy
+++ b/regression-test/suites/external_table_p0/es/test_es_query.groovy
@@ -214,6 +214,8 @@ suite("test_es_query",
"p0,external,es,external_docker,external_docker_es") {
order_qt_sql_5_26 """select test6 from test2;"""
order_qt_sql_5_27 """select * from composite_type_array order by
name;"""
order_qt_sql_5_28 """select * from test3_20231005;"""
+ order_qt_sql_5_29 """select test1, test2 from test1 where test1
like 'string%';"""
+ order_qt_sql_5_30 """select test1, test2 from test1 where test2
like 'text%';"""
sql """switch test_es_query_es6"""
// order_qt_sql_6_01 """show tables"""
@@ -244,6 +246,8 @@ suite("test_es_query",
"p0,external,es,external_docker,external_docker_es") {
order_qt_sql_6_26 """select test6 from test2;"""
order_qt_sql_6_27 """select * from composite_type_array order by
name;"""
order_qt_sql_6_28 """select * from test3_20231005;"""
+ order_qt_sql_6_29 """select test1, test2 from test1 where test1
like 'string%';"""
+ order_qt_sql_6_30 """select test1, test2 from test1 where test2
like 'text%';"""
List<List<String>> tables6N = sql """show tables"""
boolean notContainHide = true
@@ -299,6 +303,8 @@ suite("test_es_query",
"p0,external,es,external_docker,external_docker_es") {
order_qt_sql_7_32 """select test6 from test1;"""
order_qt_sql_7_33 """select test6 from test2;"""
order_qt_sql_7_34 """select * from composite_type_array order by
name;"""
+ order_qt_sql_7_35 """select test1, test2 from test1 where test1
like 'string%';"""
+ order_qt_sql_7_36 """select test1, test2 from test1 where test2
like 'text%';"""
List<List<String>> tables7N = sql """show tables"""
boolean notContainHide7 = true
@@ -354,7 +360,9 @@ suite("test_es_query",
"p0,external,es,external_docker,external_docker_es") {
order_qt_sql_8_30 """select test6 from test1;"""
order_qt_sql_8_31 """select test6 from test2;"""
order_qt_sql_8_32 """select * from composite_type_array order by
name;"""
-
+ order_qt_sql_8_33 """select test1, test2 from test1 where test1
like 'string%';"""
+ order_qt_sql_8_34 """select test1, test2 from test1 where test2
like 'text%';"""
+
}
sql """set enable_es_shard_scroll=true"""
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]