You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by fo...@apache.org on 2023/06/07 11:04:47 UTC

[jackrabbit-oak] branch trunk updated: OAK-10267: make elastic indexes more lenient when fields cannot be converted (#961)

This is an automated email from the ASF dual-hosted git repository.

fortino pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 7db2a795aa OAK-10267: make elastic indexes more lenient when fields cannot be converted (#961)
7db2a795aa is described below

commit 7db2a795aa0ffc1faeff838ef197273bcf4a6a7f
Author: Fabrizio Fortino <fa...@gmail.com>
AuthorDate: Wed Jun 7 13:04:40 2023 +0200

    OAK-10267: make elastic indexes more lenient when fields cannot be converted (#961)
---
 .../index/elastic/index/ElasticIndexHelper.java    |  3 ++
 .../oak/plugins/index/PropertyIndexCommonTest.java | 56 +++++++++++++++-------
 2 files changed, 43 insertions(+), 16 deletions(-)

diff --git a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelper.java b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelper.java
index e8beb54aaf..63afc7c9df 100644
--- a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelper.java
+++ b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelper.java
@@ -172,6 +172,9 @@ class ElasticIndexHelper {
 
         // set up the index
         builder.index(indexBuilder -> indexBuilder
+                        // Make the index more lenient when a field cannot be converted to the mapped type. Without this setting
+                        // the entire document will fail to update. Instead, only the specific field won't be updated.
+                        .mapping(mf -> mf.ignoreMalformed(true))
                         // static setting: cannot be changed after the index gets created
                         .numberOfShards(Integer.toString(indexDefinition.numberOfShards))
                         // dynamic settings: see #enableIndexRequest
diff --git a/oak-search/src/test/java/org/apache/jackrabbit/oak/plugins/index/PropertyIndexCommonTest.java b/oak-search/src/test/java/org/apache/jackrabbit/oak/plugins/index/PropertyIndexCommonTest.java
index c7e90448f5..29cc034469 100644
--- a/oak-search/src/test/java/org/apache/jackrabbit/oak/plugins/index/PropertyIndexCommonTest.java
+++ b/oak-search/src/test/java/org/apache/jackrabbit/oak/plugins/index/PropertyIndexCommonTest.java
@@ -382,21 +382,41 @@ public abstract class PropertyIndexCommonTest extends AbstractQueryTest {
         test.addChild("c").setProperty("propa", createCal("14/04/1770"));
         root.commit();
 
-        assertEventually(() ->
-                {
-                    try {
-                        assertQuery("select [jcr:path] from [nt:base] where [propa] >= " + dt("15/02/1768"), asList("/test/b", "/test/c"));
-                    } catch (ParseException e) {
-                        throw new RuntimeException(e);
-                    }
-                }
+        assertEventually(() -> {
+            assertQuery("select [jcr:path] from [nt:base] where [propa] >= " + dt("15/02/1768"), asList("/test/b", "/test/c"));
+            assertQuery("select [jcr:path] from [nt:base] where [propa] <=" + dt("15/03/1769"), asList("/test/b", "/test/a"));
+            assertQuery("select [jcr:path] from [nt:base] where [propa] < " + dt("14/03/1769"), singletonList("/test/a"));
+            assertQuery("select [jcr:path] from [nt:base] where [propa] <> " + dt("14/03/1769"), asList("/test/a", "/test/c"));
+            assertQuery("select [jcr:path] from [nt:base] where [propa] > " + dt("15/02/1768") + " and [propa] < " + dt("13/04/1770"), singletonList("/test/b"));
+            assertQuery("select [jcr:path] from [nt:base] where propa is not null", asList("/test/a", "/test/b", "/test/c"));
+        });
+    }
+
+    @Test
+    public void dateQueryWithEmptyValue() throws Exception {
+        Tree idx = indexOptions.setIndex(
+                root,
+                "test1",
+                indexOptions.createIndex(indexOptions.createIndexDefinitionBuilder(), false, "textField", "imageLaunchDate")
         );
+        Tree aggregates = idx.addChild("aggregates").addChild("nt:base");
+        Tree include0 = aggregates.addChild("include0");
+        include0.setProperty("path", "jcr:content/metadata/product", Type.STRING);
+
+        Tree dateField = idx.getChild("indexRules").getChild("nt:base").getChild(PROP_NODE).getChild("imageLaunchDate");
+        dateField.setProperty("name", "jcr:content/metadata/product/imageLaunchDate");
+        dateField.setProperty(FulltextIndexConstants.PROP_TYPE, PropertyType.TYPENAME_DATE);
+        dateField.setProperty(FulltextIndexConstants.PROP_ORDERED, true);
+        root.commit();
 
-        assertQuery("select [jcr:path] from [nt:base] where [propa] <=" + dt("15/03/1769"), asList("/test/b", "/test/a"));
-        assertQuery("select [jcr:path] from [nt:base] where [propa] < " + dt("14/03/1769"), asList("/test/a"));
-        assertQuery("select [jcr:path] from [nt:base] where [propa] <> " + dt("14/03/1769"), asList("/test/a", "/test/c"));
-        assertQuery("select [jcr:path] from [nt:base] where [propa] > " + dt("15/02/1768") + " and [propa] < " + dt("13/04/1770"), asList("/test/b"));
-        assertQuery("select [jcr:path] from [nt:base] where propa is not null", asList("/test/a", "/test/b", "/test/c"));
+        Tree test = root.getTree("/").addChild("test");
+        Tree a = test.addChild("a");
+        a.setProperty("textField", "foo");
+        Tree content = a.addChild("jcr:content").addChild("metadata").addChild("product");
+        content.setProperty("imageLaunchDate", "", Type.STRING);
+        root.commit();
+
+        assertEventually(() -> assertQuery("select [jcr:path] from [nt:base] where [textField] = 'foo'", singletonList("/test/a")));
     }
 
     protected String explain(String query) {
@@ -410,14 +430,18 @@ public abstract class PropertyIndexCommonTest extends AbstractQueryTest {
         return t;
     }
 
-    private static Calendar createCal(String dt) throws java.text.ParseException {
+    private static Calendar createCal(String dt) throws ParseException {
         SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
         Calendar cal = Calendar.getInstance();
         cal.setTime(sdf.parse(dt));
         return cal;
     }
 
-    private static String dt(String date) throws ParseException {
-        return String.format("CAST ('%s' AS DATE)", ISO8601.format(createCal(date)));
+    private static String dt(String date) {
+        try {
+            return String.format("CAST ('%s' AS DATE)", ISO8601.format(createCal(date)));
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
     }
 }