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]