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

pefernan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie.git


The following commit(s) were added to refs/heads/main by this push:
     new 6cf8a6fd750 [incubator-kie-issues#2394] replace data-isolation inline 
VALUES constructor (#6907)
6cf8a6fd750 is described below

commit 6cf8a6fd750ff66083b772a058d6ae32f88d1c3b
Author: Jan Stastny <[email protected]>
AuthorDate: Wed Aug 26 16:35:28 2026 +0200

    [incubator-kie-issues#2394] replace data-isolation inline VALUES 
constructor (#6907)
    
    * [incubator-kie-issues#2394] replace data-isolation inline VALUES 
constructor
    
    * fix tests reactor order
    
    * rename cte to be in sync with other cases
    
    * remove fromTable param
    
    * format
    
    * unify imports
    
    ---------
    
    Co-authored-by: jstastny-cz <[email protected]>
---
 .../kogito/persistence/jdbc/GenericRepository.java | 15 +++----
 .../integration-tests-process/pom.xml              | 16 ++++++++
 .../app/audit/jpa/queries/JPAAbstractQuery.java    | 48 ++++++++++++++++------
 3 files changed, 60 insertions(+), 19 deletions(-)

diff --git 
a/kogito-addons/common/persistence/jdbc/src/main/java/org/kie/kogito/persistence/jdbc/GenericRepository.java
 
b/kogito-addons/common/persistence/jdbc/src/main/java/org/kie/kogito/persistence/jdbc/GenericRepository.java
index eb0cc4f95ce..706f9813dfc 100644
--- 
a/kogito-addons/common/persistence/jdbc/src/main/java/org/kie/kogito/persistence/jdbc/GenericRepository.java
+++ 
b/kogito-addons/common/persistence/jdbc/src/main/java/org/kie/kogito/persistence/jdbc/GenericRepository.java
@@ -22,6 +22,7 @@ import java.sql.*;
 import java.util.*;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
@@ -93,19 +94,19 @@ public class GenericRepository extends Repository {
             return baseQuery;
         }
 
-        String valueTuples = java.util.stream.IntStream.range(0, 
processIds.size())
+        String processInstancesTable = "process_instances";
+        String anchorBlock = "WITH anchor_row AS (SELECT MIN(id) as target_id 
FROM " + processInstancesTable + ")";
+        String unionSelects = IntStream.range(0, processIds.size())
                 .mapToObj(i -> {
                     if (i == 0) {
-                        return "(CAST(? AS VARCHAR(255)), CAST(? AS 
VARCHAR(255)))";
+                        return "SELECT CAST(? AS VARCHAR(255)), CAST(? AS 
VARCHAR(255)) FROM " + processInstancesTable + " WHERE id = (SELECT target_id 
FROM anchor_row)";
                     } else {
-                        return "(?, ?)";
+                        return "SELECT ?, ? FROM " + processInstancesTable + " 
WHERE id = (SELECT target_id FROM anchor_row)";
                     }
                 })
-                .collect(Collectors.joining(", "));
+                .collect(Collectors.joining(" UNION ALL "));
 
-        String cte = "WITH allowed_processes (process_id, process_version) AS 
(" +
-                "  SELECT * FROM (VALUES " + valueTuples + ") AS temp(pid, 
pver)" +
-                ") ";
+        String cte = anchorBlock + ", allowed_processes (process_id, 
process_version) AS (" + unionSelects + ") ";
 
         // Determine if we need WHERE or AND
         String whereClause = baseQuery.toLowerCase().contains(" where ") ? " 
AND " : " WHERE ";
diff --git 
a/kogito-apps-quarkus/data-index-quarkus/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-postgresql/integration-tests-process/pom.xml
 
b/kogito-apps-quarkus/data-index-quarkus/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-postgresql/integration-tests-process/pom.xml
index 02dfb62386c..cd6e371f8b8 100644
--- 
a/kogito-apps-quarkus/data-index-quarkus/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-postgresql/integration-tests-process/pom.xml
+++ 
b/kogito-apps-quarkus/data-index-quarkus/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-postgresql/integration-tests-process/pom.xml
@@ -92,6 +92,22 @@
         </exclusion>
       </exclusions>
     </dependency>
+    <!-- Ensure data-index-service-postgresql binary is built before running 
integration tests.
+         Build-ordering sentinel only: type=pom + full exclusions adds nothing 
to classpath.
+         Without this edge the partial CI build skips the service module and 
the
+         DataIndexPostgreSqlContainer image is missing at runtime. -->
+    <dependency>
+      <groupId>org.kie.kogito</groupId>
+      <artifactId>data-index-service-postgresql</artifactId>
+      <type>pom</type>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
   </dependencies>
 
   <profiles>
diff --git 
a/kogito-data-audit/kogito-addons-data-audit-jpa/kogito-addons-data-audit-jpa-common/src/main/java/org/kie/kogito/app/audit/jpa/queries/JPAAbstractQuery.java
 
b/kogito-data-audit/kogito-addons-data-audit-jpa/kogito-addons-data-audit-jpa-common/src/main/java/org/kie/kogito/app/audit/jpa/queries/JPAAbstractQuery.java
index e45967022b8..8dccb548f02 100644
--- 
a/kogito-data-audit/kogito-addons-data-audit-jpa/kogito-addons-data-audit-jpa-common/src/main/java/org/kie/kogito/app/audit/jpa/queries/JPAAbstractQuery.java
+++ 
b/kogito-data-audit/kogito-addons-data-audit-jpa/kogito-addons-data-audit-jpa-common/src/main/java/org/kie/kogito/app/audit/jpa/queries/JPAAbstractQuery.java
@@ -23,6 +23,8 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
@@ -155,44 +157,66 @@ public abstract class JPAAbstractQuery<R> {
             return baseQuery;
         }
 
-        String valueRows = IntStream.range(0, allowedKeys.size())
-                .mapToObj(i -> "(:processId" + i + ", :processVersion" + i + 
")")
-                .collect(Collectors.joining(", "));
+        Pattern fromPattern = Pattern.compile("(?i)\\bFROM\\s+([^\\s,)(]+)");
+        Matcher matcher = fromPattern.matcher(baseQuery);
+        if (!matcher.find()) {
+            throw new IllegalArgumentException("Invalid base SQL query 
structure: Could not parse target table from 'FROM' clause.");
+        }
+        String fromTable = matcher.group(1);
+        if (matcher.find()) {
+            throw new IllegalArgumentException("Ambiguous SQL query structure: 
Multiple 'FROM' clauses or targets detected.");
+        }
+
+        String anchorBlock = "WITH anchor_row AS (SELECT MIN(id) as target_id 
FROM " + fromTable + ")";
 
-        String cte = "WITH _allowed_processes (processId, processVersion) AS 
(VALUES " + valueRows + ") ";
+        String unionSelects = IntStream.range(0, allowedKeys.size())
+                .mapToObj(i -> {
+                    if (i == 0) {
+                        return "SELECT CAST(:processId" + i + " AS 
VARCHAR(255)) AS processId, CAST(:processVersion" + i + " AS VARCHAR(255)) AS 
processVersion FROM " + fromTable
+                                + " WHERE id = (SELECT target_id FROM 
anchor_row)";
+                    } else {
+                        return "SELECT :processId" + i + ", :processVersion" + 
i + " FROM " + fromTable + " WHERE id = (SELECT target_id FROM anchor_row)";
+                    }
+                })
+                .collect(Collectors.joining(" UNION ALL "));
+
+        String cte = anchorBlock + ", allowed_processes (processId, 
processVersion) AS (" + unionSelects + ") ";
 
         String isolationPredicate;
         if (rootProcessIdColumn != null) {
             String preFilter = "("
-                    + processIdColumn + " IN (SELECT ap.processId FROM 
_allowed_processes ap)"
-                    + " OR " + rootProcessIdColumn + " IN (SELECT ap.processId 
FROM _allowed_processes ap)"
+                    + processIdColumn + " IN (SELECT ap.processId FROM 
allowed_processes ap)"
+                    + " OR " + rootProcessIdColumn + " IN (SELECT ap.processId 
FROM allowed_processes ap)"
                     + ")";
             String versionCheck = "("
                     + processVersionColumn + " IS NULL"
-                    + " OR EXISTS (SELECT 1 FROM _allowed_processes ap WHERE 
ap.processId = " + rootProcessIdColumn
+                    + " OR EXISTS (SELECT 1 FROM allowed_processes ap WHERE 
ap.processId = " + rootProcessIdColumn
                     + " AND ap.processVersion = " + rootProcessVersionColumn + 
")"
                     + " OR (" + rootProcessIdColumn + " IS NULL"
-                    + " AND EXISTS (SELECT 1 FROM _allowed_processes ap WHERE 
ap.processId = " + processIdColumn
+                    + " AND EXISTS (SELECT 1 FROM allowed_processes ap WHERE 
ap.processId = " + processIdColumn
                     + " AND ap.processVersion = " + processVersionColumn + "))"
                     + ")";
             isolationPredicate = preFilter + " AND " + versionCheck;
         } else {
-            isolationPredicate = processIdColumn + " IN (SELECT ap.processId 
FROM _allowed_processes ap)"
+            isolationPredicate = processIdColumn + " IN (SELECT ap.processId 
FROM allowed_processes ap)"
                     + " AND ("
                     + processVersionColumn + " IS NULL"
-                    + " OR EXISTS (SELECT 1 FROM _allowed_processes ap WHERE 
ap.processId = " + processIdColumn
+                    + " OR EXISTS (SELECT 1 FROM allowed_processes ap WHERE 
ap.processId = " + processIdColumn
                     + " AND ap.processVersion = " + processVersionColumn + ")"
                     + ")";
         }
 
         String upperQuery = baseQuery.toUpperCase();
         int orderByIdx = upperQuery.lastIndexOf("ORDER BY");
+
+        String queryConditionKeyword = upperQuery.contains(" WHERE ") ? " AND 
" : " WHERE ";
+
         if (orderByIdx >= 0) {
             return cte + baseQuery.substring(0, orderByIdx).stripTrailing()
-                    + " AND " + isolationPredicate + " "
+                    + queryConditionKeyword + isolationPredicate + " "
                     + baseQuery.substring(orderByIdx);
         }
-        return cte + baseQuery.stripTrailing() + " AND " + isolationPredicate;
+        return cte + baseQuery.stripTrailing() + queryConditionKeyword + 
isolationPredicate;
     }
 
     private void bindIsolationParameters(Query jpaQuery, List<ProcessKey> 
allowedKeys) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to