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

shuber pushed a commit to branch opensearch-persistence
in repository https://gitbox.apache.org/repos/asf/unomi.git


The following commit(s) were added to refs/heads/opensearch-persistence by this 
push:
     new a6c8851f0 Refactor ConditionESQueryBuilderDispatcher and 
ConditionOSQueryBuilderDispatcher to utilize 
ConditionQueryBuilderDispatcherSupport for legacy ID resolution and 
contextualization. Remove hardcoded legacy ID mappings and improve 
documentation regarding legacy query builder handling.
a6c8851f0 is described below

commit a6c8851f046569518539b92c267816b16e4e5eef
Author: Serge Huber <[email protected]>
AuthorDate: Wed Oct 15 17:16:32 2025 +0200

    Refactor ConditionESQueryBuilderDispatcher and 
ConditionOSQueryBuilderDispatcher to utilize 
ConditionQueryBuilderDispatcherSupport for legacy ID resolution and 
contextualization. Remove hardcoded legacy ID mappings and improve 
documentation regarding legacy query builder handling.
---
 .../ConditionESQueryBuilderDispatcher.java         | 70 +++++-----------
 .../ConditionOSQueryBuilderDispatcher.java         | 69 +++++-----------
 .../ConditionQueryBuilderDispatcherSupport.java    | 93 ++++++++++++++++++++++
 3 files changed, 129 insertions(+), 103 deletions(-)

diff --git 
a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ConditionESQueryBuilderDispatcher.java
 
b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ConditionESQueryBuilderDispatcher.java
index 4b313a5cb..61ffab6a3 100644
--- 
a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ConditionESQueryBuilderDispatcher.java
+++ 
b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ConditionESQueryBuilderDispatcher.java
@@ -19,7 +19,7 @@ package org.apache.unomi.persistence.elasticsearch;
 
 import co.elastic.clients.elasticsearch._types.query_dsl.Query;
 import org.apache.unomi.api.conditions.Condition;
-import org.apache.unomi.persistence.spi.conditions.ConditionContextHelper;
+import 
org.apache.unomi.persistence.spi.conditions.dispatcher.ConditionQueryBuilderDispatcherSupport;
 import org.apache.unomi.scripting.ScriptExecutor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -34,32 +34,21 @@ import java.util.concurrent.ConcurrentHashMap;
  * <p>
  * Responsibilities:
  * - Maintain a registry of available query builders by their IDs
- * - Resolve legacy queryBuilder IDs to the new canonical IDs using an
- *   immutable, hardcoded mapping for backward compatibility
+ * - Resolve legacy queryBuilder IDs to the canonical IDs using centralized 
mapping in
+ *   {@link 
org.apache.unomi.persistence.spi.conditions.dispatcher.ConditionQueryBuilderDispatcherSupport}
+ *   (with deprecation warnings)
  * - Build query fragments (filters) and full queries from {@link 
org.apache.unomi.api.conditions.Condition}
  * <p>
  * Notes:
- * - Legacy mappings are immutable and statically initialized; there is no 
runtime customization
+ * - Legacy mappings are centralized in SPI support; there is no runtime 
customization
  * - New IDs are always preferred; legacy IDs trigger a warning and are mapped 
transparently
  */
 public class ConditionESQueryBuilderDispatcher {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(ConditionESQueryBuilderDispatcher.class.getName());
 
-    // Mapping of legacy queryBuilder IDs to new canonical IDs
-    private static final Map<String, String> LEGACY_TO_NEW_QUERY_BUILDER_IDS = 
Map.ofEntries(
-            Map.entry("idsConditionESQueryBuilder", 
"idsConditionQueryBuilder"),
-            Map.entry("geoLocationByPointSessionConditionESQueryBuilder", 
"geoLocationByPointSessionConditionQueryBuilder"),
-            Map.entry("pastEventConditionESQueryBuilder", 
"pastEventConditionQueryBuilder"),
-            Map.entry("booleanConditionESQueryBuilder", 
"booleanConditionQueryBuilder"),
-            Map.entry("notConditionESQueryBuilder", 
"notConditionQueryBuilder"),
-            Map.entry("matchAllConditionESQueryBuilder", 
"matchAllConditionQueryBuilder"),
-            Map.entry("propertyConditionESQueryBuilder", 
"propertyConditionQueryBuilder"),
-            Map.entry("sourceEventPropertyConditionESQueryBuilder", 
"sourceEventPropertyConditionQueryBuilder"),
-            Map.entry("nestedConditionESQueryBuilder", 
"nestedConditionQueryBuilder")
-    );
-
     private Map<String, ConditionESQueryBuilder> queryBuilders = new 
ConcurrentHashMap<>();
     private ScriptExecutor scriptExecutor;
+    private final ConditionQueryBuilderDispatcherSupport support = new 
ConditionQueryBuilderDispatcherSupport();
 
     public ConditionESQueryBuilderDispatcher() {
     }
@@ -89,7 +78,6 @@ public class ConditionESQueryBuilderDispatcher {
     public Query getQueryBuilder(Condition condition) {
         Query.Builder qb = new Query.Builder();
         return qb.bool(b -> b.must(Query.of(q -> q.matchAll(m -> 
m))).filter(buildFilter(condition))).build();
-
     }
 
     public Query buildFilter(Condition condition) {
@@ -112,11 +100,15 @@ public class ConditionESQueryBuilderDispatcher {
         }
 
         // Find the appropriate query builder key (new or legacy)
-        String finalQueryBuilderKey = findQueryBuilderKey(queryBuilderKey, 
condition.getConditionTypeId());
+        String finalQueryBuilderKey = support.findQueryBuilderKey(
+                queryBuilderKey,
+                condition.getConditionTypeId(),
+                queryBuilders::containsKey,
+                LOGGER);
 
         if (finalQueryBuilderKey != null) {
             ConditionESQueryBuilder queryBuilder = 
queryBuilders.get(finalQueryBuilderKey);
-            Condition contextualCondition = 
ConditionContextHelper.getContextualCondition(condition, context, 
scriptExecutor);
+            Condition contextualCondition = support.contextualize(condition, 
context, scriptExecutor);
             if (contextualCondition != null) {
                 return queryBuilder.buildQuery(contextualCondition, context, 
this);
             }
@@ -149,11 +141,15 @@ public class ConditionESQueryBuilderDispatcher {
         }
 
         // Find the appropriate query builder key (new or legacy)
-        String finalQueryBuilderKey = findQueryBuilderKey(queryBuilderKey, 
condition.getConditionTypeId());
+        String finalQueryBuilderKey = support.findQueryBuilderKey(
+                queryBuilderKey,
+                condition.getConditionTypeId(),
+                queryBuilders::containsKey,
+                LOGGER);
 
         if (finalQueryBuilderKey != null) {
             ConditionESQueryBuilder queryBuilder = 
queryBuilders.get(finalQueryBuilderKey);
-            Condition contextualCondition = 
ConditionContextHelper.getContextualCondition(condition, context, 
scriptExecutor);
+            Condition contextualCondition = support.contextualize(condition, 
context, scriptExecutor);
             if (contextualCondition != null) {
                 return queryBuilder.count(contextualCondition, context, this);
             }
@@ -165,34 +161,4 @@ public class ConditionESQueryBuilderDispatcher {
         throw new UnsupportedOperationException();
     }
 
-    private String resolveLegacyQueryBuilderId(String queryBuilderId, String 
conditionTypeId) {
-        // This method only handles legacy ID mapping
-        if (!LEGACY_TO_NEW_QUERY_BUILDER_IDS.containsKey(queryBuilderId)) {
-            return null; // Not a legacy ID
-        }
-
-        // It's a legacy ID that needs mapping
-        String mappedId = LEGACY_TO_NEW_QUERY_BUILDER_IDS.get(queryBuilderId);
-        LOGGER.warn("DEPRECATED: Using legacy queryBuilderId '{}' for 
condition type '{}'. " +
-                        "Please update your condition definition to use the 
new queryBuilderId '{}'. " +
-                        "Legacy mappings are deprecated and may be removed in 
future versions.",
-                queryBuilderId, conditionTypeId, mappedId);
-        return mappedId;
-    }
-
-    private String findQueryBuilderKey(String queryBuilderKey, String 
conditionTypeId) {
-        // First try the queryBuilder ID directly (new IDs)
-        if (queryBuilders.containsKey(queryBuilderKey)) {
-            return queryBuilderKey;
-        }
-
-        // If not found, try legacy mapping
-        String legacyMappedId = resolveLegacyQueryBuilderId(queryBuilderKey, 
conditionTypeId);
-        if (legacyMappedId != null && 
queryBuilders.containsKey(legacyMappedId)) {
-            return legacyMappedId;
-        }
-
-        return null; // No matching query builder found
-    }
-
 }
diff --git 
a/persistence-opensearch/core/src/main/java/org/apache/unomi/persistence/opensearch/ConditionOSQueryBuilderDispatcher.java
 
b/persistence-opensearch/core/src/main/java/org/apache/unomi/persistence/opensearch/ConditionOSQueryBuilderDispatcher.java
index f26af4ede..825b88b93 100644
--- 
a/persistence-opensearch/core/src/main/java/org/apache/unomi/persistence/opensearch/ConditionOSQueryBuilderDispatcher.java
+++ 
b/persistence-opensearch/core/src/main/java/org/apache/unomi/persistence/opensearch/ConditionOSQueryBuilderDispatcher.java
@@ -18,7 +18,7 @@
 package org.apache.unomi.persistence.opensearch;
 
 import org.apache.unomi.api.conditions.Condition;
-import org.apache.unomi.persistence.spi.conditions.ConditionContextHelper;
+import 
org.apache.unomi.persistence.spi.conditions.dispatcher.ConditionQueryBuilderDispatcherSupport;
 import org.apache.unomi.scripting.ScriptExecutor;
 import org.opensearch.client.opensearch._types.query_dsl.Query;
 import org.slf4j.Logger;
@@ -34,32 +34,21 @@ import java.util.concurrent.ConcurrentHashMap;
  * <p>
  * Responsibilities:
  * - Maintain a registry of available query builders by their IDs
- * - Resolve legacy queryBuilder IDs to the new canonical IDs using an
- *   immutable, hardcoded mapping for backward compatibility
+ * - Resolve legacy queryBuilder IDs to the canonical IDs using centralized 
mapping in
+ *   {@link 
org.apache.unomi.persistence.spi.conditions.dispatcher.ConditionQueryBuilderDispatcherSupport}
+ *   (with deprecation warnings)
  * - Build query fragments (filters) and full queries from {@link 
org.apache.unomi.api.conditions.Condition}
  * <p>
  * Notes:
- * - Legacy mappings are immutable and statically initialized; there is no 
runtime customization
+ * - Legacy mappings are centralized in SPI support; there is no runtime 
customization
  * - New IDs are always preferred; legacy IDs trigger a warning and are mapped 
transparently
  */
 public class ConditionOSQueryBuilderDispatcher {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(ConditionOSQueryBuilderDispatcher.class.getName());
 
-    // Mapping of legacy queryBuilder IDs to new canonical IDs
-    private static final Map<String, String> LEGACY_TO_NEW_QUERY_BUILDER_IDS = 
Map.ofEntries(
-            Map.entry("idsConditionESQueryBuilder", 
"idsConditionQueryBuilder"),
-            Map.entry("geoLocationByPointSessionConditionESQueryBuilder", 
"geoLocationByPointSessionConditionQueryBuilder"),
-            Map.entry("pastEventConditionESQueryBuilder", 
"pastEventConditionQueryBuilder"),
-            Map.entry("booleanConditionESQueryBuilder", 
"booleanConditionQueryBuilder"),
-            Map.entry("notConditionESQueryBuilder", 
"notConditionQueryBuilder"),
-            Map.entry("matchAllConditionESQueryBuilder", 
"matchAllConditionQueryBuilder"),
-            Map.entry("propertyConditionESQueryBuilder", 
"propertyConditionQueryBuilder"),
-            Map.entry("sourceEventPropertyConditionESQueryBuilder", 
"sourceEventPropertyConditionQueryBuilder"),
-            Map.entry("nestedConditionESQueryBuilder", 
"nestedConditionQueryBuilder")
-    );
-
     private Map<String, ConditionOSQueryBuilder> queryBuilders = new 
ConcurrentHashMap<>();
     private ScriptExecutor scriptExecutor;
+    private final ConditionQueryBuilderDispatcherSupport support = new 
ConditionQueryBuilderDispatcherSupport();
 
     public ConditionOSQueryBuilderDispatcher() {
     }
@@ -110,11 +99,15 @@ public class ConditionOSQueryBuilderDispatcher {
         }
 
         // Find the appropriate query builder key (new or legacy)
-        String finalQueryBuilderKey = findQueryBuilderKey(queryBuilderKey, 
condition.getConditionTypeId());
+        String finalQueryBuilderKey = support.findQueryBuilderKey(
+                queryBuilderKey,
+                condition.getConditionTypeId(),
+                queryBuilders::containsKey,
+                LOGGER);
 
         if (finalQueryBuilderKey != null) {
             ConditionOSQueryBuilder queryBuilder = 
queryBuilders.get(finalQueryBuilderKey);
-            Condition contextualCondition = 
ConditionContextHelper.getContextualCondition(condition, context, 
scriptExecutor);
+            Condition contextualCondition = support.contextualize(condition, 
context, scriptExecutor);
             if (contextualCondition != null) {
                 return queryBuilder.buildQuery(contextualCondition, context, 
this);
             }
@@ -149,11 +142,15 @@ public class ConditionOSQueryBuilderDispatcher {
         }
 
         // Find the appropriate query builder key (new or legacy)
-        String finalQueryBuilderKey = findQueryBuilderKey(queryBuilderKey, 
condition.getConditionTypeId());
+        String finalQueryBuilderKey = support.findQueryBuilderKey(
+                queryBuilderKey,
+                condition.getConditionTypeId(),
+                queryBuilders::containsKey,
+                LOGGER);
 
         if (finalQueryBuilderKey != null) {
             ConditionOSQueryBuilder queryBuilder = 
queryBuilders.get(finalQueryBuilderKey);
-            Condition contextualCondition = 
ConditionContextHelper.getContextualCondition(condition, context, 
scriptExecutor);
+            Condition contextualCondition = support.contextualize(condition, 
context, scriptExecutor);
             if (contextualCondition != null) {
                 return queryBuilder.count(contextualCondition, context, this);
             }
@@ -167,34 +164,4 @@ public class ConditionOSQueryBuilderDispatcher {
         throw new UnsupportedOperationException();
     }
 
-    private String resolveLegacyQueryBuilderId(String queryBuilderId, String 
conditionTypeId) {
-        // This method only handles legacy ID mapping
-        if (!LEGACY_TO_NEW_QUERY_BUILDER_IDS.containsKey(queryBuilderId)) {
-            return null; // Not a legacy ID
-        }
-
-        // It's a legacy ID that needs mapping
-        String mappedId = LEGACY_TO_NEW_QUERY_BUILDER_IDS.get(queryBuilderId);
-        LOGGER.warn("DEPRECATED: Using legacy queryBuilderId '{}' for 
condition type '{}'. " +
-                        "Please update your condition definition to use the 
new queryBuilderId '{}'. " +
-                        "Legacy mappings are deprecated and may be removed in 
future versions.",
-                queryBuilderId, conditionTypeId, mappedId);
-        return mappedId;
-    }
-
-    private String findQueryBuilderKey(String queryBuilderKey, String 
conditionTypeId) {
-        // First try the queryBuilder ID directly (new IDs)
-        if (queryBuilders.containsKey(queryBuilderKey)) {
-            return queryBuilderKey;
-        }
-
-        // If not found, try legacy mapping
-        String legacyMappedId = resolveLegacyQueryBuilderId(queryBuilderKey, 
conditionTypeId);
-        if (legacyMappedId != null && 
queryBuilders.containsKey(legacyMappedId)) {
-            return legacyMappedId;
-        }
-
-        return null; // No matching query builder found
-    }
-
 }
diff --git 
a/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/conditions/dispatcher/ConditionQueryBuilderDispatcherSupport.java
 
b/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/conditions/dispatcher/ConditionQueryBuilderDispatcherSupport.java
new file mode 100644
index 000000000..c1cadd6e5
--- /dev/null
+++ 
b/persistence-spi/src/main/java/org/apache/unomi/persistence/spi/conditions/dispatcher/ConditionQueryBuilderDispatcherSupport.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.unomi.persistence.spi.conditions.dispatcher;
+
+import org.apache.unomi.api.conditions.Condition;
+import org.apache.unomi.persistence.spi.conditions.ConditionContextHelper;
+import org.apache.unomi.scripting.ScriptExecutor;
+import org.slf4j.Logger;
+
+import java.util.Map;
+import java.util.function.Predicate;
+
+/**
+ * Shared helper for condition query builder dispatchers (ES/OS). Centralizes 
logic that is
+ * backend-agnostic: contextualization, legacy ID mapping with logging, and 
queryBuilder key resolution.
+ * The legacy-to-new queryBuilder identifiers are centralized here in
+ * {@link #LEGACY_TO_NEW_QUERY_BUILDER_IDS} and are used by the no-arg
+ * {@link #resolveLegacyQueryBuilderId(String, String, org.slf4j.Logger)} and
+ * {@link #findQueryBuilderKey(String, String, java.util.function.Predicate, 
org.slf4j.Logger)} methods.
+ * This helper intentionally avoids any dependency on backend-specific query 
types.
+ */
+public class ConditionQueryBuilderDispatcherSupport {
+
+    /**
+     * Backend-agnostic legacy-to-new mapping of queryBuilder identifiers.
+     */
+    public static final Map<String, String> LEGACY_TO_NEW_QUERY_BUILDER_IDS = 
Map.ofEntries(
+            Map.entry("idsConditionESQueryBuilder", 
"idsConditionQueryBuilder"),
+            Map.entry("geoLocationByPointSessionConditionESQueryBuilder", 
"geoLocationByPointSessionConditionQueryBuilder"),
+            Map.entry("pastEventConditionESQueryBuilder", 
"pastEventConditionQueryBuilder"),
+            Map.entry("booleanConditionESQueryBuilder", 
"booleanConditionQueryBuilder"),
+            Map.entry("notConditionESQueryBuilder", 
"notConditionQueryBuilder"),
+            Map.entry("matchAllConditionESQueryBuilder", 
"matchAllConditionQueryBuilder"),
+            Map.entry("propertyConditionESQueryBuilder", 
"propertyConditionQueryBuilder"),
+            Map.entry("sourceEventPropertyConditionESQueryBuilder", 
"sourceEventPropertyConditionQueryBuilder"),
+            Map.entry("nestedConditionESQueryBuilder", 
"nestedConditionQueryBuilder")
+    );
+
+    /**
+     * Returns a contextualized copy of the provided condition if any dynamic 
parameters are present,
+     * otherwise returns {@code null} to indicate that a default fallback 
should be used by callers.
+     */
+    public Condition contextualize(Condition condition, Map<String, Object> 
context, ScriptExecutor scriptExecutor) {
+        return ConditionContextHelper.getContextualCondition(condition, 
context, scriptExecutor);
+    }
+
+    /**
+     * Resolves a legacy queryBuilder identifier to its new canonical 
identifier and logs a deprecation warning.
+     * Returns {@code null} if the provided identifier is not legacy-mapped.
+     */
+    public String resolveLegacyQueryBuilderId(String queryBuilderId, String 
conditionTypeId, Logger logger) {
+        if (!LEGACY_TO_NEW_QUERY_BUILDER_IDS.containsKey(queryBuilderId)) {
+            return null;
+        }
+        String mappedId = LEGACY_TO_NEW_QUERY_BUILDER_IDS.get(queryBuilderId);
+        logger.warn("DEPRECATED: Using legacy queryBuilderId '{}' for 
condition type '{}'. Please update your condition definition to use the new 
queryBuilderId '{}'. Legacy mappings are deprecated and may be removed in 
future versions.",
+                queryBuilderId, conditionTypeId, mappedId);
+        return mappedId;
+    }
+
+    /**
+     * Resolves the final queryBuilder key to use, trying the provided key 
first, then applying legacy mapping.
+     * The {@code hasBuilder} predicate is used to test the presence of a 
builder for a given key.
+     */
+    public String findQueryBuilderKey(String queryBuilderKey, String 
conditionTypeId,
+                                      Predicate<String> hasBuilder, Logger 
logger) {
+        if (hasBuilder.test(queryBuilderKey)) {
+            return queryBuilderKey;
+        }
+        String legacyMappedId = resolveLegacyQueryBuilderId(queryBuilderKey, 
conditionTypeId, logger);
+        if (legacyMappedId != null && hasBuilder.test(legacyMappedId)) {
+            return legacyMappedId;
+        }
+        return null;
+    }
+}
+
+

Reply via email to