[Bug](doe) Fix some bug (#11594)
This commit is contained in:
@ -63,7 +63,7 @@ public class EsShardProcDir implements ProcDirInterface {
|
||||
for (EsShardRouting esShardRouting : shardRoutings) {
|
||||
List<Comparable> shardInfo = new ArrayList<Comparable>();
|
||||
shardInfo.add(shardId);
|
||||
shardInfo.add(esShardRouting.getAddress().toString());
|
||||
shardInfo.add(esShardRouting.getHttpAddress().toString());
|
||||
shardInfo.add(esShardRouting.isPrimary());
|
||||
shardInfos.add(shardInfo);
|
||||
}
|
||||
|
||||
@ -98,6 +98,21 @@ public class EsExternalDataSource extends ExternalDataSource {
|
||||
throw new DdlException("Hosts of ES table is null.");
|
||||
}
|
||||
nodes = properties.get(PROP_HOSTS).trim().split(",");
|
||||
// check protocol
|
||||
for (String seed : nodes) {
|
||||
if (!seed.startsWith("http")) {
|
||||
throw new DdlException("the protocol must be used");
|
||||
}
|
||||
if (properties.containsKey(PROP_SSL)) {
|
||||
enableSsl = EsUtil.getBoolean(properties, PROP_SSL);
|
||||
if (enableSsl && seed.startsWith("http://")) {
|
||||
throw new DdlException("if ssl_enabled is true, the https protocol must be used");
|
||||
}
|
||||
if (!enableSsl && seed.startsWith("https://")) {
|
||||
throw new DdlException("if ssl_enabled is false, the http protocol must be used");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (StringUtils.isNotBlank(properties.get(PROP_USERNAME))) {
|
||||
username = properties.get(PROP_USERNAME).trim();
|
||||
@ -119,18 +134,6 @@ public class EsExternalDataSource extends ExternalDataSource {
|
||||
enableNodesDiscovery = EsUtil.getBoolean(properties, PROP_NODES_DISCOVERY);
|
||||
}
|
||||
|
||||
if (properties.containsKey(PROP_SSL)) {
|
||||
enableSsl = EsUtil.getBoolean(properties, PROP_SSL);
|
||||
// check protocol
|
||||
for (String seed : nodes) {
|
||||
if (enableSsl && seed.startsWith("http://")) {
|
||||
throw new DdlException("if ssl_enabled is true, the https protocol must be used");
|
||||
}
|
||||
if (!enableSsl && seed.startsWith("https://")) {
|
||||
throw new DdlException("if ssl_enabled is false, the http protocol must be used");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -155,7 +158,7 @@ public class EsExternalDataSource extends ExternalDataSource {
|
||||
this.esRestClient = new EsRestClient(this.nodes, this.username, this.password, this.enableSsl);
|
||||
long defaultDbId = Env.getCurrentEnv().getNextId();
|
||||
dbNameToId.put(DEFAULT_DB, defaultDbId);
|
||||
idToDb.put(defaultDbId, new EsExternalDatabase(this, defaultDbId, "default"));
|
||||
idToDb.put(defaultDbId, new EsExternalDatabase(this, defaultDbId, DEFAULT_DB));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -177,7 +180,7 @@ public class EsExternalDataSource extends ExternalDataSource {
|
||||
if (!dbNameToId.containsKey(realDbName)) {
|
||||
return null;
|
||||
}
|
||||
return new EsExternalDatabase(this, dbNameToId.get(realDbName), realDbName);
|
||||
return idToDb.get(dbNameToId.get(realDbName));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -189,12 +189,11 @@ public class EsRestClient {
|
||||
**/
|
||||
public List<String> listTable() {
|
||||
List<String> indices = getIndices().stream().distinct().collect(Collectors.toList());
|
||||
getAliases().entrySet().stream().filter(e -> indices.contains(e.getKey()))
|
||||
.flatMap(e -> e.getValue().stream()).distinct().forEach(indices::add);
|
||||
getAliases().entrySet().stream().filter(e -> indices.contains(e.getKey())).flatMap(e -> e.getValue().stream())
|
||||
.distinct().forEach(indices::add);
|
||||
return indices;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get Shard location.
|
||||
**/
|
||||
|
||||
@ -54,12 +54,11 @@ public class EsShardPartitions {
|
||||
/**
|
||||
* Parse shardRoutings from the json
|
||||
*
|
||||
* @param indexName indexName(alias or really name)
|
||||
* @param indexName indexName(alias or really name)
|
||||
* @param searchShards the return value of _search_shards
|
||||
* @return shardRoutings is used for searching
|
||||
*/
|
||||
public static EsShardPartitions findShardPartitions(String indexName, String searchShards) throws DorisEsException {
|
||||
|
||||
EsShardPartitions partitions = new EsShardPartitions(indexName);
|
||||
JSONObject jsonObject = (JSONObject) JSONValue.parse(searchShards);
|
||||
JSONArray shards = (JSONArray) jsonObject.get("shards");
|
||||
@ -67,23 +66,18 @@ public class EsShardPartitions {
|
||||
for (int i = 0; i < size; i++) {
|
||||
List<EsShardRouting> singleShardRouting = Lists.newArrayList();
|
||||
JSONArray shardsArray = (JSONArray) shards.get(i);
|
||||
int arraySize = shardsArray.size();
|
||||
for (int j = 0; j < arraySize; j++) {
|
||||
JSONObject indexShard = (JSONObject) shardsArray.get(j);
|
||||
for (Object o : shardsArray) {
|
||||
JSONObject indexShard = (JSONObject) o;
|
||||
String shardState = (String) indexShard.get("state");
|
||||
if ("STARTED".equalsIgnoreCase(shardState) || "RELOCATING".equalsIgnoreCase(shardState)) {
|
||||
try {
|
||||
singleShardRouting.add(
|
||||
EsShardRouting.newSearchShard(
|
||||
(String) indexShard.get("index"),
|
||||
((Long) indexShard.get("shard")).intValue(),
|
||||
(Boolean) indexShard.get("primary"),
|
||||
(String) indexShard.get("node"),
|
||||
(JSONObject) jsonObject.get("nodes")));
|
||||
singleShardRouting.add(new EsShardRouting((String) indexShard.get("index"),
|
||||
((Long) indexShard.get("shard")).intValue(), (Boolean) indexShard.get("primary"),
|
||||
(String) indexShard.get("node")));
|
||||
} catch (Exception e) {
|
||||
LOG.error("fetch index [{}] shard partitions failure", indexName, e);
|
||||
throw new DorisEsException("fetch [" + indexName
|
||||
+ "] shard partitions failure [" + e.getMessage() + "]");
|
||||
throw new DorisEsException(
|
||||
"fetch [" + indexName + "] shard partitions failure [" + e.getMessage() + "]");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -19,41 +19,21 @@ package org.apache.doris.external.elasticsearch;
|
||||
|
||||
import org.apache.doris.thrift.TNetworkAddress;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
public class EsShardRouting {
|
||||
|
||||
private final String indexName;
|
||||
private final int shardId;
|
||||
private final boolean isPrimary;
|
||||
private final TNetworkAddress address;
|
||||
|
||||
private TNetworkAddress httpAddress;
|
||||
private final String nodeId;
|
||||
|
||||
public EsShardRouting(String indexName, int shardId, boolean isPrimary, TNetworkAddress address, String nodeId) {
|
||||
public EsShardRouting(String indexName, int shardId, boolean isPrimary, String nodeId) {
|
||||
this.indexName = indexName;
|
||||
this.shardId = shardId;
|
||||
this.isPrimary = isPrimary;
|
||||
this.address = address;
|
||||
this.nodeId = nodeId;
|
||||
}
|
||||
|
||||
public static EsShardRouting newSearchShard(String indexName, int shardId, boolean isPrimary,
|
||||
String nodeId, JSONObject nodesMap) {
|
||||
JSONObject nodeInfo = (JSONObject) nodesMap.get(nodeId);
|
||||
String[] transportAddr = ((String) nodeInfo.get("transport_address")).split(":");
|
||||
// get thrift port from node info
|
||||
String thriftPort = (String) ((JSONObject) nodeInfo.get("attributes")).get("thrift_port");
|
||||
// In http transport mode, should ignore thrift_port, set address to null
|
||||
TNetworkAddress addr = null;
|
||||
if (!Strings.isNullOrEmpty(thriftPort)) {
|
||||
addr = new TNetworkAddress(transportAddr[0], Integer.parseInt(thriftPort));
|
||||
}
|
||||
return new EsShardRouting(indexName, shardId, isPrimary, addr, nodeId);
|
||||
}
|
||||
|
||||
public int getShardId() {
|
||||
return shardId;
|
||||
}
|
||||
@ -62,10 +42,6 @@ public class EsShardRouting {
|
||||
return isPrimary;
|
||||
}
|
||||
|
||||
public TNetworkAddress getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
public String getIndexName() {
|
||||
return indexName;
|
||||
}
|
||||
@ -84,13 +60,7 @@ public class EsShardRouting {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "EsShardRouting{"
|
||||
+ "indexName='" + indexName + '\''
|
||||
+ ", shardId=" + shardId
|
||||
+ ", isPrimary=" + isPrimary
|
||||
+ ", address=" + address
|
||||
+ ", httpAddress=" + httpAddress
|
||||
+ ", nodeId='" + nodeId + '\''
|
||||
+ '}';
|
||||
return "EsShardRouting{" + "indexName='" + indexName + '\'' + ", shardId=" + shardId + ", isPrimary="
|
||||
+ isPrimary + ", httpAddress=" + httpAddress + ", nodeId='" + nodeId + '\'' + '}';
|
||||
}
|
||||
}
|
||||
|
||||
@ -19,8 +19,8 @@ package org.apache.doris.external.elasticsearch;
|
||||
|
||||
import org.apache.doris.analysis.BinaryPredicate;
|
||||
import org.apache.doris.analysis.BoolLiteral;
|
||||
import org.apache.doris.analysis.CastExpr;
|
||||
import org.apache.doris.analysis.CompoundPredicate;
|
||||
import org.apache.doris.analysis.DateLiteral;
|
||||
import org.apache.doris.analysis.DecimalLiteral;
|
||||
import org.apache.doris.analysis.DistributionDesc;
|
||||
import org.apache.doris.analysis.Expr;
|
||||
@ -35,7 +35,6 @@ import org.apache.doris.analysis.LikePredicate.Operator;
|
||||
import org.apache.doris.analysis.PartitionDesc;
|
||||
import org.apache.doris.analysis.RangePartitionDesc;
|
||||
import org.apache.doris.analysis.SlotRef;
|
||||
import org.apache.doris.analysis.StringLiteral;
|
||||
import org.apache.doris.catalog.ArrayType;
|
||||
import org.apache.doris.catalog.Column;
|
||||
import org.apache.doris.catalog.Type;
|
||||
@ -192,27 +191,39 @@ public class EsUtil {
|
||||
return properties;
|
||||
}
|
||||
|
||||
private static QueryBuilder toCompoundEsDsl(Expr expr) {
|
||||
private static QueryBuilder toCompoundEsDsl(Expr expr, List<Expr> notPushDownList) {
|
||||
CompoundPredicate compoundPredicate = (CompoundPredicate) expr;
|
||||
switch (compoundPredicate.getOp()) {
|
||||
case AND: {
|
||||
QueryBuilder left = toEsDsl(compoundPredicate.getChild(0));
|
||||
QueryBuilder right = toEsDsl(compoundPredicate.getChild(1));
|
||||
QueryBuilder left = toEsDsl(compoundPredicate.getChild(0), notPushDownList);
|
||||
QueryBuilder right = toEsDsl(compoundPredicate.getChild(1), notPushDownList);
|
||||
if (left != null && right != null) {
|
||||
return QueryBuilders.boolQuery().must(left).must(right);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
case OR: {
|
||||
QueryBuilder left = toEsDsl(compoundPredicate.getChild(0));
|
||||
QueryBuilder right = toEsDsl(compoundPredicate.getChild(1));
|
||||
int beforeSize = notPushDownList.size();
|
||||
QueryBuilder left = toEsDsl(compoundPredicate.getChild(0), notPushDownList);
|
||||
QueryBuilder right = toEsDsl(compoundPredicate.getChild(1), notPushDownList);
|
||||
int afterSize = notPushDownList.size();
|
||||
if (left != null && right != null) {
|
||||
return QueryBuilders.boolQuery().should(left).should(right);
|
||||
}
|
||||
// One 'or' association cannot be pushed down and the other cannot be pushed down
|
||||
if (afterSize > beforeSize) {
|
||||
if (left != null) {
|
||||
// add right if right don't pushdown
|
||||
notPushDownList.add(compoundPredicate.getChild(0));
|
||||
} else if (right != null) {
|
||||
// add left if left don't pushdown
|
||||
notPushDownList.add(compoundPredicate.getChild(1));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
case NOT: {
|
||||
QueryBuilder child = toEsDsl(compoundPredicate.getChild(0));
|
||||
QueryBuilder child = toEsDsl(compoundPredicate.getChild(0), notPushDownList);
|
||||
if (child != null) {
|
||||
return QueryBuilders.boolQuery().mustNot(child);
|
||||
}
|
||||
@ -223,18 +234,27 @@ public class EsUtil {
|
||||
}
|
||||
}
|
||||
|
||||
public static QueryBuilder toEsDsl(Expr expr) {
|
||||
return toEsDsl(expr, new ArrayList<>());
|
||||
}
|
||||
|
||||
/**
|
||||
* Doris expr to es dsl.
|
||||
**/
|
||||
public static QueryBuilder toEsDsl(Expr expr) {
|
||||
public static QueryBuilder toEsDsl(Expr expr, List<Expr> notPushDownList) {
|
||||
if (expr == null) {
|
||||
return null;
|
||||
}
|
||||
// CompoundPredicate, `between` also converted to CompoundPredicate.
|
||||
if (expr instanceof CompoundPredicate) {
|
||||
return toCompoundEsDsl(expr);
|
||||
return toCompoundEsDsl(expr, notPushDownList);
|
||||
}
|
||||
TExprOpcode opCode = expr.getOpcode();
|
||||
// Cast can not pushdown
|
||||
if (expr.getChild(0) instanceof CastExpr || expr.getChild(1) instanceof CastExpr) {
|
||||
notPushDownList.add(expr);
|
||||
return null;
|
||||
}
|
||||
String column = ((SlotRef) expr.getChild(0)).getColumnName();
|
||||
if (expr instanceof BinaryPredicate) {
|
||||
Object value = toDorisLiteral(expr.getChild(1));
|
||||
@ -386,9 +406,6 @@ public class EsUtil {
|
||||
if (expr instanceof BoolLiteral) {
|
||||
BoolLiteral boolLiteral = (BoolLiteral) expr;
|
||||
return boolLiteral.getValue();
|
||||
} else if (expr instanceof DateLiteral) {
|
||||
DateLiteral dateLiteral = (DateLiteral) expr;
|
||||
return dateLiteral.getStringValue();
|
||||
} else if (expr instanceof DecimalLiteral) {
|
||||
DecimalLiteral decimalLiteral = (DecimalLiteral) expr;
|
||||
return decimalLiteral.getValue();
|
||||
@ -401,11 +418,8 @@ public class EsUtil {
|
||||
} else if (expr instanceof LargeIntLiteral) {
|
||||
LargeIntLiteral largeIntLiteral = (LargeIntLiteral) expr;
|
||||
return largeIntLiteral.getLongValue();
|
||||
} else if (expr instanceof StringLiteral) {
|
||||
StringLiteral stringLiteral = (StringLiteral) expr;
|
||||
return stringLiteral.getStringValue();
|
||||
}
|
||||
return null;
|
||||
return expr.getStringValue();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -338,15 +338,11 @@ public class EsScanNode extends ScanNode {
|
||||
}
|
||||
|
||||
if (!conjuncts.isEmpty()) {
|
||||
output.append(prefix).append("PREDICATES: ").append(getExplainString(conjuncts)).append("\n");
|
||||
// reserved for later using: LOCAL_PREDICATES is processed by Doris EsScanNode
|
||||
output.append(prefix).append("LOCAL_PREDICATES: ").append(" ").append("\n");
|
||||
// reserved for later using: REMOTE_PREDICATES is processed by remote ES Cluster
|
||||
output.append(prefix).append("REMOTE_PREDICATES: ").append(" ").append("\n");
|
||||
output.append(prefix).append("LOCAL_PREDICATES: ").append(getExplainString(conjuncts)).append("\n");
|
||||
buildQuery();
|
||||
output.append(prefix).append("ES_QUERY_DSL: ").append(queryBuilder.toJson()).append("\n");
|
||||
output.append(prefix).append("REMOTE_PREDICATES: ").append(queryBuilder.toJson()).append("\n");
|
||||
} else {
|
||||
output.append(prefix).append("ES_QUERY_DSL: ").append("{\"match_all\": {}}").append("\n");
|
||||
output.append(prefix).append("REMOTE_PREDICATES: ").append("{\"match_all\": {}}").append("\n");
|
||||
}
|
||||
String indexName = table.getIndexName();
|
||||
String typeName = table.getMappingType();
|
||||
@ -360,8 +356,9 @@ public class EsScanNode extends ScanNode {
|
||||
} else {
|
||||
boolean hasFilter = false;
|
||||
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
|
||||
List<Expr> notPushDownList = new ArrayList<>();
|
||||
for (Expr expr : conjuncts) {
|
||||
QueryBuilder queryBuilder = EsUtil.toEsDsl(expr);
|
||||
QueryBuilder queryBuilder = EsUtil.toEsDsl(expr, notPushDownList);
|
||||
if (queryBuilder != null) {
|
||||
hasFilter = true;
|
||||
boolQueryBuilder.must(queryBuilder);
|
||||
|
||||
@ -19,8 +19,10 @@ package org.apache.doris.external.elasticsearch;
|
||||
|
||||
import org.apache.doris.analysis.BinaryPredicate;
|
||||
import org.apache.doris.analysis.BinaryPredicate.Operator;
|
||||
import org.apache.doris.analysis.CastExpr;
|
||||
import org.apache.doris.analysis.CompoundPredicate;
|
||||
import org.apache.doris.analysis.Expr;
|
||||
import org.apache.doris.analysis.FloatLiteral;
|
||||
import org.apache.doris.analysis.FunctionCallExpr;
|
||||
import org.apache.doris.analysis.InPredicate;
|
||||
import org.apache.doris.analysis.IntLiteral;
|
||||
@ -28,6 +30,7 @@ import org.apache.doris.analysis.IsNullPredicate;
|
||||
import org.apache.doris.analysis.LikePredicate;
|
||||
import org.apache.doris.analysis.SlotRef;
|
||||
import org.apache.doris.analysis.StringLiteral;
|
||||
import org.apache.doris.analysis.TypeDef;
|
||||
import org.apache.doris.catalog.Column;
|
||||
import org.apache.doris.catalog.EsTable;
|
||||
import org.apache.doris.catalog.PrimitiveType;
|
||||
@ -37,7 +40,6 @@ import mockit.Expectations;
|
||||
import mockit.Injectable;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.JSONValue;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
@ -84,19 +86,19 @@ public class EsUtilTest extends EsTestCase {
|
||||
EsTable esTableBefore7X = fakeEsTable("fake", "test", "doc", columns);
|
||||
SearchContext searchContext = new SearchContext(esTableBefore7X);
|
||||
MappingPhase.resolveFields(searchContext, loadJsonFromFile("data/es/test_index_mapping.json"));
|
||||
Assert.assertEquals("k3.keyword", searchContext.fetchFieldsContext().get("k3"));
|
||||
Assert.assertEquals("k3.keyword", searchContext.docValueFieldsContext().get("k3"));
|
||||
Assert.assertEquals("k1", searchContext.docValueFieldsContext().get("k1"));
|
||||
Assert.assertEquals("k2", searchContext.docValueFieldsContext().get("k2"));
|
||||
Assertions.assertEquals("k3.keyword", searchContext.fetchFieldsContext().get("k3"));
|
||||
Assertions.assertEquals("k3.keyword", searchContext.docValueFieldsContext().get("k3"));
|
||||
Assertions.assertEquals("k1", searchContext.docValueFieldsContext().get("k1"));
|
||||
Assertions.assertEquals("k2", searchContext.docValueFieldsContext().get("k2"));
|
||||
|
||||
// ES version >= 7.0
|
||||
EsTable esTableAfter7X = fakeEsTable("fake", "test", "_doc", columns);
|
||||
SearchContext searchContext1 = new SearchContext(esTableAfter7X);
|
||||
MappingPhase.resolveFields(searchContext1, loadJsonFromFile("data/es/test_index_mapping_after_7x.json"));
|
||||
Assert.assertEquals("k3.keyword", searchContext1.fetchFieldsContext().get("k3"));
|
||||
Assert.assertEquals("k3.keyword", searchContext1.docValueFieldsContext().get("k3"));
|
||||
Assert.assertEquals("k1", searchContext1.docValueFieldsContext().get("k1"));
|
||||
Assert.assertEquals("k2", searchContext1.docValueFieldsContext().get("k2"));
|
||||
Assertions.assertEquals("k3.keyword", searchContext1.fetchFieldsContext().get("k3"));
|
||||
Assertions.assertEquals("k3.keyword", searchContext1.docValueFieldsContext().get("k3"));
|
||||
Assertions.assertEquals("k1", searchContext1.docValueFieldsContext().get("k1"));
|
||||
Assertions.assertEquals("k2", searchContext1.docValueFieldsContext().get("k2"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -114,10 +116,10 @@ public class EsUtilTest extends EsTestCase {
|
||||
MappingPhase mappingPhase = new MappingPhase(client);
|
||||
ExceptionChecker.expectThrowsNoException(() -> mappingPhase.execute(searchContext1));
|
||||
ExceptionChecker.expectThrowsNoException(() -> mappingPhase.postProcess(searchContext1));
|
||||
Assert.assertEquals("k3.keyword", searchContext1.fetchFieldsContext().get("k3"));
|
||||
Assert.assertEquals("k3.keyword", searchContext1.docValueFieldsContext().get("k3"));
|
||||
Assert.assertEquals("k1", searchContext1.docValueFieldsContext().get("k1"));
|
||||
Assert.assertEquals("k2", searchContext1.docValueFieldsContext().get("k2"));
|
||||
Assertions.assertEquals("k3.keyword", searchContext1.fetchFieldsContext().get("k3"));
|
||||
Assertions.assertEquals("k3.keyword", searchContext1.docValueFieldsContext().get("k3"));
|
||||
Assertions.assertEquals("k1", searchContext1.docValueFieldsContext().get("k1"));
|
||||
Assertions.assertEquals("k2", searchContext1.docValueFieldsContext().get("k2"));
|
||||
|
||||
}
|
||||
|
||||
@ -127,21 +129,21 @@ public class EsUtilTest extends EsTestCase {
|
||||
SearchContext searchContext = new SearchContext(esTableAfter7X);
|
||||
MappingPhase.resolveFields(searchContext,
|
||||
loadJsonFromFile("data/es/test_index_mapping_field_mult_analyzer.json"));
|
||||
Assert.assertFalse(searchContext.docValueFieldsContext().containsKey("k3"));
|
||||
Assertions.assertFalse(searchContext.docValueFieldsContext().containsKey("k3"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetJsonObject() {
|
||||
JSONObject json = (JSONObject) JSONValue.parse(jsonStr);
|
||||
JSONObject upperBoundSetting = EsUtil.getJsonObject(json, "settings.index.bpack.partition", 0);
|
||||
Assert.assertTrue(upperBoundSetting.containsKey("upperbound"));
|
||||
Assert.assertEquals("12", (String) upperBoundSetting.get("upperbound"));
|
||||
Assertions.assertTrue(upperBoundSetting.containsKey("upperbound"));
|
||||
Assertions.assertEquals("12", (String) upperBoundSetting.get("upperbound"));
|
||||
|
||||
JSONObject unExistKey = EsUtil.getJsonObject(json, "set", 0);
|
||||
Assert.assertNull(unExistKey);
|
||||
Assertions.assertNull(unExistKey);
|
||||
|
||||
JSONObject singleKey = EsUtil.getJsonObject(json, "settings", 0);
|
||||
Assert.assertTrue(singleKey.containsKey("index"));
|
||||
Assertions.assertTrue(singleKey.containsKey("index"));
|
||||
}
|
||||
|
||||
@Test(expected = ClassCastException.class)
|
||||
@ -162,13 +164,13 @@ public class EsUtilTest extends EsTestCase {
|
||||
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));
|
||||
Assert.assertEquals("{\"term\":{\"k1\":3}}", EsUtil.toEsDsl(eqExpr).toJson());
|
||||
Assert.assertEquals("{\"bool\":{\"must_not\":{\"term\":{\"k1\":3}}}}", EsUtil.toEsDsl(neExpr).toJson());
|
||||
Assert.assertEquals("{\"range\":{\"k1\":{\"lte\":3}}}", EsUtil.toEsDsl(leExpr).toJson());
|
||||
Assert.assertEquals("{\"range\":{\"k1\":{\"gte\":3}}}", EsUtil.toEsDsl(geExpr).toJson());
|
||||
Assert.assertEquals("{\"range\":{\"k1\":{\"lt\":3}}}", EsUtil.toEsDsl(ltExpr).toJson());
|
||||
Assert.assertEquals("{\"range\":{\"k1\":{\"gt\":3}}}", EsUtil.toEsDsl(gtExpr).toJson());
|
||||
Assert.assertEquals("{\"term\":{\"k1\":3}}", EsUtil.toEsDsl(efnExpr).toJson());
|
||||
Assertions.assertEquals("{\"term\":{\"k1\":3}}", EsUtil.toEsDsl(eqExpr).toJson());
|
||||
Assertions.assertEquals("{\"bool\":{\"must_not\":{\"term\":{\"k1\":3}}}}", EsUtil.toEsDsl(neExpr).toJson());
|
||||
Assertions.assertEquals("{\"range\":{\"k1\":{\"lte\":3}}}", EsUtil.toEsDsl(leExpr).toJson());
|
||||
Assertions.assertEquals("{\"range\":{\"k1\":{\"gte\":3}}}", EsUtil.toEsDsl(geExpr).toJson());
|
||||
Assertions.assertEquals("{\"range\":{\"k1\":{\"lt\":3}}}", EsUtil.toEsDsl(ltExpr).toJson());
|
||||
Assertions.assertEquals("{\"range\":{\"k1\":{\"gt\":3}}}", EsUtil.toEsDsl(gtExpr).toJson());
|
||||
Assertions.assertEquals("{\"term\":{\"k1\":3}}", EsUtil.toEsDsl(efnExpr).toJson());
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -184,11 +186,12 @@ public class EsUtilTest extends EsTestCase {
|
||||
CompoundPredicate orPredicate = new CompoundPredicate(CompoundPredicate.Operator.OR, binaryPredicate1,
|
||||
binaryPredicate2);
|
||||
CompoundPredicate notPredicate = new CompoundPredicate(CompoundPredicate.Operator.NOT, binaryPredicate1, null);
|
||||
Assert.assertEquals("{\"bool\":{\"must\":[{\"term\":{\"k1\":3}},{\"range\":{\"k2\":{\"gt\":5}}}]}}",
|
||||
Assertions.assertEquals("{\"bool\":{\"must\":[{\"term\":{\"k1\":3}},{\"range\":{\"k2\":{\"gt\":5}}}]}}",
|
||||
EsUtil.toEsDsl(andPredicate).toJson());
|
||||
Assert.assertEquals("{\"bool\":{\"should\":[{\"term\":{\"k1\":3}},{\"range\":{\"k2\":{\"gt\":5}}}]}}",
|
||||
Assertions.assertEquals("{\"bool\":{\"should\":[{\"term\":{\"k1\":3}},{\"range\":{\"k2\":{\"gt\":5}}}]}}",
|
||||
EsUtil.toEsDsl(orPredicate).toJson());
|
||||
Assert.assertEquals("{\"bool\":{\"must_not\":{\"term\":{\"k1\":3}}}}", EsUtil.toEsDsl(notPredicate).toJson());
|
||||
Assertions.assertEquals("{\"bool\":{\"must_not\":{\"term\":{\"k1\":3}}}}",
|
||||
EsUtil.toEsDsl(notPredicate).toJson());
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -196,9 +199,9 @@ public class EsUtilTest extends EsTestCase {
|
||||
SlotRef k1 = new SlotRef(null, "k1");
|
||||
IsNullPredicate isNullPredicate = new IsNullPredicate(k1, false);
|
||||
IsNullPredicate isNotNullPredicate = new IsNullPredicate(k1, true);
|
||||
Assert.assertEquals("{\"bool\":{\"must_not\":{\"exists\":{\"field\":\"k1\"}}}}",
|
||||
Assertions.assertEquals("{\"bool\":{\"must_not\":{\"exists\":{\"field\":\"k1\"}}}}",
|
||||
EsUtil.toEsDsl(isNullPredicate).toJson());
|
||||
Assert.assertEquals("{\"exists\":{\"field\":\"k1\"}}", EsUtil.toEsDsl(isNotNullPredicate).toJson());
|
||||
Assertions.assertEquals("{\"exists\":{\"field\":\"k1\"}}", EsUtil.toEsDsl(isNotNullPredicate).toJson());
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -210,9 +213,9 @@ public class EsUtilTest extends EsTestCase {
|
||||
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);
|
||||
Assert.assertEquals("{\"wildcard\":{\"k1\":\"*1*\"}}", EsUtil.toEsDsl(likePredicate1).toJson());
|
||||
Assert.assertEquals("{\"wildcard\":{\"k1\":\"*1*\"}}", EsUtil.toEsDsl(regexPredicate).toJson());
|
||||
Assert.assertEquals("{\"wildcard\":{\"k1\":\"1?2\"}}", EsUtil.toEsDsl(likePredicate2).toJson());
|
||||
Assertions.assertEquals("{\"wildcard\":{\"k1\":\"*1*\"}}", EsUtil.toEsDsl(likePredicate1).toJson());
|
||||
Assertions.assertEquals("{\"wildcard\":{\"k1\":\"*1*\"}}", EsUtil.toEsDsl(regexPredicate).toJson());
|
||||
Assertions.assertEquals("{\"wildcard\":{\"k1\":\"1?2\"}}", EsUtil.toEsDsl(likePredicate2).toJson());
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -225,8 +228,8 @@ public class EsUtilTest extends EsTestCase {
|
||||
intLiterals.add(intLiteral2);
|
||||
InPredicate isInPredicate = new InPredicate(k1, intLiterals, false);
|
||||
InPredicate isNotInPredicate = new InPredicate(k1, intLiterals, true);
|
||||
Assert.assertEquals("{\"terms\":{\"k1\":[3,5]}}", EsUtil.toEsDsl(isInPredicate).toJson());
|
||||
Assert.assertEquals("{\"bool\":{\"must_not\":{\"terms\":{\"k1\":[3,5]}}}}",
|
||||
Assertions.assertEquals("{\"terms\":{\"k1\":[3,5]}}", EsUtil.toEsDsl(isInPredicate).toJson());
|
||||
Assertions.assertEquals("{\"bool\":{\"must_not\":{\"terms\":{\"k1\":[3,5]}}}}",
|
||||
EsUtil.toEsDsl(isNotInPredicate).toJson());
|
||||
}
|
||||
|
||||
@ -239,18 +242,37 @@ public class EsUtilTest extends EsTestCase {
|
||||
exprs.add(k1);
|
||||
exprs.add(stringLiteral);
|
||||
FunctionCallExpr functionCallExpr = new FunctionCallExpr("esquery", exprs);
|
||||
Assert.assertEquals(str, EsUtil.toEsDsl(functionCallExpr).toJson());
|
||||
Assertions.assertEquals(str, EsUtil.toEsDsl(functionCallExpr).toJson());
|
||||
|
||||
SlotRef k2 = new SlotRef(null, "k2");
|
||||
IntLiteral intLiteral = new IntLiteral(5);
|
||||
BinaryPredicate binaryPredicate = new BinaryPredicate(Operator.EQ, k2, intLiteral);
|
||||
CompoundPredicate compoundPredicate = new CompoundPredicate(CompoundPredicate.Operator.AND, binaryPredicate,
|
||||
functionCallExpr);
|
||||
Assert.assertEquals(
|
||||
Assertions.assertEquals(
|
||||
"{\"bool\":{\"must\":[{\"term\":{\"k2\":5}},{\"bool\":{\"must_not\":{\"terms\":{\"k1\":[3,5]}}}}]}}",
|
||||
EsUtil.toEsDsl(compoundPredicate).toJson());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCastConvertEsDsl() {
|
||||
SlotRef k1 = new SlotRef(null, "k1");
|
||||
FloatLiteral floatLiteral = new FloatLiteral(3.14);
|
||||
CastExpr castExpr = new CastExpr(TypeDef.create(PrimitiveType.INT), floatLiteral);
|
||||
BinaryPredicate castPredicate = new BinaryPredicate(Operator.EQ, k1, castExpr);
|
||||
List<Expr> notPushDownList = new ArrayList<>();
|
||||
Assertions.assertNull(EsUtil.toEsDsl(castPredicate, notPushDownList));
|
||||
Assertions.assertEquals(1, notPushDownList.size());
|
||||
|
||||
SlotRef k2 = new SlotRef(null, "k2");
|
||||
IntLiteral intLiteral = new IntLiteral(5);
|
||||
BinaryPredicate eqPredicate = new BinaryPredicate(Operator.EQ, k2, intLiteral);
|
||||
CompoundPredicate compoundPredicate = new CompoundPredicate(CompoundPredicate.Operator.OR, castPredicate,
|
||||
eqPredicate);
|
||||
EsUtil.toEsDsl(compoundPredicate, notPushDownList);
|
||||
Assertions.assertEquals(3, notPushDownList.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEs6Mapping() throws IOException, URISyntaxException {
|
||||
JSONObject testAliases = EsUtil.getMappingProps("test", loadJsonFromFile("data/es/es6_aliases_mapping.json"),
|
||||
@ -310,4 +332,5 @@ public class EsUtilTest extends EsTestCase {
|
||||
+ "\"fields\":{\"keyword\":{\"ignore_above\":256,\"type\":\"keyword\"}}},"
|
||||
+ "\"test3\":{\"type\":\"double\"},\"test1\":{\"type\":\"keyword\"}}", testIndex.toJSONString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user