You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ar...@apache.org on 2021/02/17 08:11:22 UTC
[metamodel] 01/05: MM-1233: Elasticsearch uses 'match' query for
text based columns conditions in WHERE clause.
This is an automated email from the ASF dual-hosted git repository.
arjansh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metamodel.git
commit 8386549ee9580d6f14232041e60bc2ff476ae1dd
Author: jakub <j....@quadient.com>
AuthorDate: Fri Feb 12 16:02:12 2021 +0100
MM-1233: Elasticsearch uses 'match' query for text based columns conditions in WHERE clause.
---
.../elasticsearch/common/ElasticSearchUtils.java | 2 ++
.../common/ElasticSearchUtilsTest.java | 24 ++++++++++++++++++++--
2 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/elasticsearch/common/src/main/java/org/apache/metamodel/elasticsearch/common/ElasticSearchUtils.java b/elasticsearch/common/src/main/java/org/apache/metamodel/elasticsearch/common/ElasticSearchUtils.java
index f5c70e8..b2c1f27 100644
--- a/elasticsearch/common/src/main/java/org/apache/metamodel/elasticsearch/common/ElasticSearchUtils.java
+++ b/elasticsearch/common/src/main/java/org/apache/metamodel/elasticsearch/common/ElasticSearchUtils.java
@@ -202,6 +202,8 @@ public class ElasticSearchUtils {
if (OperatorType.EQUALS_TO.equals(operator)) {
if (operand == null) {
itemQueryBuilder = getMissingQuery(fieldName);
+ } else if (column.getType().isLiteral()) {
+ itemQueryBuilder = QueryBuilders.matchQuery(fieldName, operand);
} else {
itemQueryBuilder = QueryBuilders.termQuery(fieldName, operand);
}
diff --git a/elasticsearch/common/src/test/java/org/apache/metamodel/elasticsearch/common/ElasticSearchUtilsTest.java b/elasticsearch/common/src/test/java/org/apache/metamodel/elasticsearch/common/ElasticSearchUtilsTest.java
index 9fb7e03..8228316 100644
--- a/elasticsearch/common/src/test/java/org/apache/metamodel/elasticsearch/common/ElasticSearchUtilsTest.java
+++ b/elasticsearch/common/src/test/java/org/apache/metamodel/elasticsearch/common/ElasticSearchUtilsTest.java
@@ -18,15 +18,24 @@
*/
package org.apache.metamodel.elasticsearch.common;
-import junit.framework.TestCase;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
import org.apache.metamodel.data.DataSetHeader;
import org.apache.metamodel.data.Row;
import org.apache.metamodel.data.SimpleDataSetHeader;
+import org.apache.metamodel.query.FilterItem;
+import org.apache.metamodel.query.OperatorType;
import org.apache.metamodel.query.SelectItem;
import org.apache.metamodel.schema.ColumnType;
import org.apache.metamodel.schema.MutableColumn;
+import org.elasticsearch.index.query.QueryBuilder;
-import java.util.*;
+import junit.framework.TestCase;
public class ElasticSearchUtilsTest extends TestCase {
@@ -60,4 +69,15 @@ public class ElasticSearchUtilsTest extends TestCase {
assertTrue(stringValue instanceof String);
assertTrue(dateValue instanceof Date);
}
+
+ /**
+ * For text-based conditions a 'match' query is recommended (instead of 'term' query).
+ */
+ public void testMatchQueryIsCreatedForTextFilter() {
+ final SelectItem selectItem = new SelectItem(new MutableColumn("column_name", ColumnType.STRING));
+ final FilterItem filterItem = new FilterItem(selectItem, OperatorType.EQUALS_TO, "text-value");
+ final QueryBuilder queryBuilder =
+ ElasticSearchUtils.createQueryBuilderForSimpleWhere(Collections.singletonList(filterItem), null);
+ assertEquals("match", queryBuilder.getName());
+ }
}