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());
+    }
 }