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

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/master by this push:
     new 29f1c18747 Improving JPA implementations for 
PlainSchemaRepoExt#hasAttrs
29f1c18747 is described below

commit 29f1c18747c466d05f7ce5885f3cd6e5c609f305
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Wed Feb 25 10:24:24 2026 +0100

    Improving JPA implementations for PlainSchemaRepoExt#hasAttrs
---
 README.md                                          |  4 +-
 .../jpa/dao/repo/AbstractPlainSchemaRepoExt.java   | 12 ++++
 .../dao/repo/MariaDBPlainSchemaRepoExtImpl.java    | 66 +---------------------
 .../jpa/dao/repo/MySQLPlainSchemaRepoExtImpl.java  | 17 ++----
 .../jpa/dao/repo/OraclePlainSchemaRepoExtImpl.java | 18 ++----
 .../jpa/dao/repo/PGPlainSchemaRepoExtImpl.java     | 12 +---
 pom.xml                                            |  2 +-
 7 files changed, 31 insertions(+), 100 deletions(-)

diff --git a/README.md b/README.md
index da05e9a878..2bf8ca9b0d 100644
--- a/README.md
+++ b/README.md
@@ -16,8 +16,8 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 -->
-**Apache Syncope** is an Open Source system for managing digital identities in 
enterprise environments, 
-implemented in Java EE technology and released under Apache 2.0 license.
+The mission of **Apache Syncope** is the creation and maintenance of software 
related to managing
+digital identities in enterprise environments.
 
 More information at https://syncope.apache.org
 
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/AbstractPlainSchemaRepoExt.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/AbstractPlainSchemaRepoExt.java
index d9d9e1bea1..f5a4bd3f76 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/AbstractPlainSchemaRepoExt.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/AbstractPlainSchemaRepoExt.java
@@ -19,9 +19,11 @@
 package org.apache.syncope.core.persistence.jpa.dao.repo;
 
 import jakarta.persistence.EntityManager;
+import jakarta.persistence.Query;
 import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
+import java.util.stream.Collectors;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
@@ -57,6 +59,16 @@ abstract class AbstractPlainSchemaRepoExt extends 
AbstractSchemaRepoExt implemen
         return findByAnyTypeClasses(anyTypeClasses, 
JPAPlainSchema.class.getSimpleName(), PlainSchema.class);
     }
 
+    protected boolean hasAttrs(final PlainSchema schema, final String 
hasAttrsQuery, final String hasAttrsAlias) {
+        Query query = entityManager.createNativeQuery("SELECT SUM(counts) FROM 
("
+                + TABLES.stream().
+                        map(t -> hasAttrsQuery.replace("%TABLE%", 
t).replace("%SCHEMA%", schema.getKey())).
+                        collect(Collectors.joining(" UNION ALL "))
+                + ")" + hasAttrsAlias);
+
+        return ((Number) query.getSingleResult()).longValue() > 0;
+    }
+
     @Override
     public void deleteById(final String key) {
         PlainSchema schema = entityManager.find(JPAPlainSchema.class, key);
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/MariaDBPlainSchemaRepoExtImpl.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/MariaDBPlainSchemaRepoExtImpl.java
index cd8cb605ba..b22961686b 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/MariaDBPlainSchemaRepoExtImpl.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/MariaDBPlainSchemaRepoExtImpl.java
@@ -19,23 +19,10 @@
 package org.apache.syncope.core.persistence.jpa.dao.repo;
 
 import jakarta.persistence.EntityManager;
-import jakarta.persistence.Query;
-import java.util.List;
-import java.util.stream.Collectors;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
-import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
-import org.apache.syncope.core.persistence.api.entity.PlainAttr;
-import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
-import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.persistence.jpa.dao.SearchSupport;
-import org.apache.syncope.core.persistence.jpa.entity.JPARealm;
-import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
 
-public class MariaDBPlainSchemaRepoExtImpl extends AbstractPlainSchemaRepoExt {
-
-    protected static final String HAS_ATTRS_QUERY = "SELECT id FROM %TABLE% "
-            + "WHERE JSON_CONTAINS(plainAttrs, '[{\"schema\":\"%SCHEMA%\"}]') 
";
+public class MariaDBPlainSchemaRepoExtImpl extends MySQLPlainSchemaRepoExtImpl 
{
 
     public MariaDBPlainSchemaRepoExtImpl(
             final AnyUtilsFactory anyUtilsFactory,
@@ -44,55 +31,4 @@ public class MariaDBPlainSchemaRepoExtImpl extends 
AbstractPlainSchemaRepoExt {
 
         super(anyUtilsFactory, resourceDAO, entityManager);
     }
-
-    @Override
-    public boolean hasAttrs(final PlainSchema schema) {
-        Query query = entityManager.createNativeQuery("SELECT COUNT(id) FROM ( 
"
-                + TABLES.stream().
-                        map(t -> HAS_ATTRS_QUERY.replace("%TABLE%", 
t).replace("%SCHEMA%", schema.getKey())).
-                        collect(Collectors.joining(" UNION "))
-                + ") AS count");
-
-        return ((Number) query.getSingleResult()).intValue() > 0;
-    }
-
-    @Override
-    public boolean existsPlainAttrUniqueValue(
-            final String realmKey,
-            final PlainSchema schema,
-            final PlainAttrValue attrValue) {
-
-        PlainAttr attr = new PlainAttr();
-        attr.setSchema(schema.getKey());
-        attr.setUniqueValue(attrValue);
-
-        Query query = entityManager.createNativeQuery(
-                "SELECT COUNT(id) FROM " + JPARealm.TABLE
-                + " WHERE JSON_CONTAINS(plainAttrs, '" + 
POJOHelper.serialize(List.of(attr)).replace("'", "''") + "')"
-                + " AND id <> ?1");
-        query.setParameter(1, realmKey);
-
-        return ((Number) query.getSingleResult()).intValue() > 0;
-    }
-
-    @Override
-    public boolean existsPlainAttrUniqueValue(
-            final AnyUtils anyUtils,
-            final String anyKey,
-            final PlainSchema schema,
-            final PlainAttrValue attrValue) {
-
-        PlainAttr attr = new PlainAttr();
-        attr.setSchema(schema.getKey());
-        attr.setUniqueValue(attrValue);
-
-        Query query = entityManager.createNativeQuery(
-                "SELECT COUNT(id) FROM "
-                + new SearchSupport(anyUtils.anyTypeKind()).field().name()
-                + " WHERE JSON_CONTAINS(plainAttrs, '" + 
POJOHelper.serialize(List.of(attr)).replace("'", "''") + "')"
-                + " AND id <> ?1");
-        query.setParameter(1, anyKey);
-
-        return ((Number) query.getSingleResult()).intValue() > 0;
-    }
 }
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/MySQLPlainSchemaRepoExtImpl.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/MySQLPlainSchemaRepoExtImpl.java
index 610d494b9d..2b25fe8a80 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/MySQLPlainSchemaRepoExtImpl.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/MySQLPlainSchemaRepoExtImpl.java
@@ -21,7 +21,6 @@ package org.apache.syncope.core.persistence.jpa.dao.repo;
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.Query;
 import java.util.List;
-import java.util.stream.Collectors;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
@@ -34,9 +33,11 @@ import 
org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
 
 public class MySQLPlainSchemaRepoExtImpl extends AbstractPlainSchemaRepoExt {
 
-    protected static final String HAS_ATTRS_QUERY = "SELECT id FROM %TABLE% "
+    protected static final String HAS_ATTRS_QUERY = "SELECT COUNT(id) AS 
counts FROM %TABLE% "
             + "WHERE JSON_CONTAINS(plainAttrs, '[{\"schema\":\"%SCHEMA%\"}]') 
";
 
+    protected static final String HAS_ATTRS_ALIAS = " AS hasAttrs";
+
     public MySQLPlainSchemaRepoExtImpl(
             final AnyUtilsFactory anyUtilsFactory,
             final ExternalResourceDAO resourceDAO,
@@ -47,13 +48,7 @@ public class MySQLPlainSchemaRepoExtImpl extends 
AbstractPlainSchemaRepoExt {
 
     @Override
     public boolean hasAttrs(final PlainSchema schema) {
-        Query query = entityManager.createNativeQuery("SELECT COUNT(id) FROM ( 
"
-                + TABLES.stream().
-                        map(t -> HAS_ATTRS_QUERY.replace("%TABLE%", 
t).replace("%SCHEMA%", schema.getKey())).
-                        collect(Collectors.joining(" UNION "))
-                + ") AS count");
-
-        return ((Number) query.getSingleResult()).intValue() > 0;
+        return hasAttrs(schema, HAS_ATTRS_QUERY, HAS_ATTRS_ALIAS);
     }
 
     @Override
@@ -72,7 +67,7 @@ public class MySQLPlainSchemaRepoExtImpl extends 
AbstractPlainSchemaRepoExt {
                 + " AND id <> ?1");
         query.setParameter(1, realmKey);
 
-        return ((Number) query.getSingleResult()).intValue() > 0;
+        return ((Number) query.getSingleResult()).longValue() > 0;
     }
 
     @Override
@@ -93,6 +88,6 @@ public class MySQLPlainSchemaRepoExtImpl extends 
AbstractPlainSchemaRepoExt {
                 + " AND id <> ?1");
         query.setParameter(1, anyKey);
 
-        return ((Number) query.getSingleResult()).intValue() > 0;
+        return ((Number) query.getSingleResult()).longValue() > 0;
     }
 }
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/OraclePlainSchemaRepoExtImpl.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/OraclePlainSchemaRepoExtImpl.java
index 20c6c53bed..d7f253165b 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/OraclePlainSchemaRepoExtImpl.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/OraclePlainSchemaRepoExtImpl.java
@@ -20,7 +20,7 @@ package org.apache.syncope.core.persistence.jpa.dao.repo;
 
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.Query;
-import java.util.stream.Collectors;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
@@ -34,7 +34,8 @@ import 
org.apache.syncope.core.persistence.jpa.entity.JPARealm;
 
 public class OraclePlainSchemaRepoExtImpl extends AbstractPlainSchemaRepoExt {
 
-    protected static final String HAS_ATTRS_QUERY = "SELECT id FROM %TABLE%, 
%JSON_TABLE% ";
+    protected static final String HAS_ATTRS_QUERY = "SELECT COUNT(id) AS 
counts FROM %TABLE% "
+            + "WHERE JSON_EXISTS(plainAttrs, '$[*]?(@.schema == 
\"%SCHEMA%\")')";
 
     protected final PlainSchemaDAO plainSchemaDAO;
 
@@ -50,14 +51,7 @@ public class OraclePlainSchemaRepoExtImpl extends 
AbstractPlainSchemaRepoExt {
 
     @Override
     public boolean hasAttrs(final PlainSchema schema) {
-        Query query = entityManager.createNativeQuery("SELECT COUNT(id) FROM ( 
"
-                + TABLES.stream().
-                        map(t -> HAS_ATTRS_QUERY.replace("%TABLE%", t).
-                        replace("%JSON_TABLE%", 
OracleJPAAnySearchDAO.from(schema))).
-                        collect(Collectors.joining(" UNION "))
-                + ")");
-
-        return ((Number) query.getSingleResult()).intValue() > 0;
+        return hasAttrs(schema, HAS_ATTRS_QUERY, StringUtils.EMPTY);
     }
 
     @Override
@@ -75,7 +69,7 @@ public class OraclePlainSchemaRepoExtImpl extends 
AbstractPlainSchemaRepoExt {
         query.setParameter(1, attrValue.getValue());
         query.setParameter(2, realmKey);
 
-        return ((Number) query.getSingleResult()).intValue() > 0;
+        return ((Number) query.getSingleResult()).longValue() > 0;
     }
 
     @Override
@@ -94,6 +88,6 @@ public class OraclePlainSchemaRepoExtImpl extends 
AbstractPlainSchemaRepoExt {
         query.setParameter(1, attrValue.getValue());
         query.setParameter(2, anyKey);
 
-        return ((Number) query.getSingleResult()).intValue() > 0;
+        return ((Number) query.getSingleResult()).longValue() > 0;
     }
 }
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/PGPlainSchemaRepoExtImpl.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/PGPlainSchemaRepoExtImpl.java
index 3198c31431..d677f3ddcf 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/PGPlainSchemaRepoExtImpl.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/PGPlainSchemaRepoExtImpl.java
@@ -21,7 +21,7 @@ package org.apache.syncope.core.persistence.jpa.dao.repo;
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.Query;
 import java.util.List;
-import java.util.stream.Collectors;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
@@ -34,7 +34,7 @@ import 
org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
 
 public class PGPlainSchemaRepoExtImpl extends AbstractPlainSchemaRepoExt {
 
-    protected static final String HAS_ATTRS_QUERY = "SELECT id FROM %TABLE% "
+    protected static final String HAS_ATTRS_QUERY = "SELECT COUNT(id) AS 
counts FROM %TABLE% "
             + "WHERE plainAttrs::jsonb @> '[{\"schema\":\"%SCHEMA%\"}]'::jsonb 
";
 
     public PGPlainSchemaRepoExtImpl(
@@ -47,13 +47,7 @@ public class PGPlainSchemaRepoExtImpl extends 
AbstractPlainSchemaRepoExt {
 
     @Override
     public boolean hasAttrs(final PlainSchema schema) {
-        Query query = entityManager.createNativeQuery("SELECT COUNT(id) FROM ( 
"
-                + TABLES.stream().
-                        map(t -> HAS_ATTRS_QUERY.replace("%TABLE%", 
t).replace("%SCHEMA%", schema.getKey())).
-                        collect(Collectors.joining(" UNION "))
-                + ")");
-
-        return ((Number) query.getSingleResult()).intValue() > 0;
+        return hasAttrs(schema, HAS_ATTRS_QUERY, StringUtils.EMPTY);
     }
 
     @Override
diff --git a/pom.xml b/pom.xml
index 8edf1f0cad..ccf99e83cf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1734,7 +1734,7 @@ under the License.
         <plugin>
           <groupId>org.openapitools</groupId>
           <artifactId>openapi-generator-maven-plugin</artifactId>
-          <version>7.19.0</version>
+          <version>7.20.0</version>
         </plugin>
 
         <plugin>

Reply via email to