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

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


The following commit(s) were added to refs/heads/4_0_X by this push:
     new d0e16b0c15 [SYNCOPE-1982] Improve query perfomance on 
OraclePlainSchemaRepoExtImpl (#1450)
d0e16b0c15 is described below

commit d0e16b0c15a1d3308e601b7ea8d77f672777f3fc
Author: Valerio Crescia <[email protected]>
AuthorDate: Sat Jul 11 08:44:35 2026 +0200

    [SYNCOPE-1982] Improve query perfomance on OraclePlainSchemaRepoExtImpl 
(#1450)
---
 .../persistence/jpa/OraclePersistenceContext.java  |  3 +-
 .../jpa/dao/repo/OraclePlainSchemaRepoExtImpl.java | 60 ++++++++++++----------
 2 files changed, 35 insertions(+), 28 deletions(-)

diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/OraclePersistenceContext.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/OraclePersistenceContext.java
index c677d07869..a1345b37cf 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/OraclePersistenceContext.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/OraclePersistenceContext.java
@@ -102,9 +102,8 @@ public class OraclePersistenceContext {
     public PlainSchemaRepoExt plainSchemaRepoExt(
             final AnyUtilsFactory anyUtilsFactory,
             final @Lazy ExternalResourceDAO resourceDAO,
-            final @Lazy PlainSchemaDAO plainSchemaDAO,
             final EntityManager entityManager) {
 
-        return new OraclePlainSchemaRepoExtImpl(anyUtilsFactory, resourceDAO, 
plainSchemaDAO, entityManager);
+        return new OraclePlainSchemaRepoExtImpl(anyUtilsFactory, resourceDAO, 
entityManager);
     }
 }
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..dbc3b1991f 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
@@ -21,9 +21,8 @@ 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;
 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.PlainAttrValue;
@@ -31,21 +30,18 @@ import 
org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.jpa.dao.OracleJPAAnySearchDAO;
 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 OraclePlainSchemaRepoExtImpl extends AbstractPlainSchemaRepoExt {
 
     protected static final String HAS_ATTRS_QUERY = "SELECT id FROM %TABLE%, 
%JSON_TABLE% ";
 
-    protected final PlainSchemaDAO plainSchemaDAO;
-
     public OraclePlainSchemaRepoExtImpl(
             final AnyUtilsFactory anyUtilsFactory,
             final ExternalResourceDAO resourceDAO,
-            final PlainSchemaDAO plainSchemaDAO,
             final EntityManager entityManager) {
 
         super(anyUtilsFactory, resourceDAO, entityManager);
-        this.plainSchemaDAO = plainSchemaDAO;
     }
 
     @Override
@@ -60,22 +56,39 @@ public class OraclePlainSchemaRepoExtImpl extends 
AbstractPlainSchemaRepoExt {
         return ((Number) query.getSingleResult()).intValue() > 0;
     }
 
+    protected boolean existsPlainAttrUniqueValue(
+            final String table,
+            final String key,
+            final PlainSchema schema,
+            final PlainAttrValue attrValue) {
+
+        String queryString = new StringBuilder("SELECT COUNT(id) FROM 
").append(table).
+                append(" WHERE ").
+                append("JSON_EXISTS(plainAttrs, '$[*]?(@.schema == 
\"").append(schema.getKey()).append("\" ").
+                append("&& 
@.uniqueValue.").append(OracleJPAAnySearchDAO.key(schema.getType())).append(" 
== $value)' ").
+                append("PASSING ?1 AS \"value\") AND id <> ?2").
+                toString();
+
+        Query query = entityManager.createNativeQuery(queryString);
+
+        query.setParameter(1, StringUtils.stripEnd(StringUtils.stripStart(
+                POJOHelper.serialize(attrValue.getValue()), "\""), "\""));
+        query.setParameter(2, key);
+
+        return ((Number) query.getSingleResult()).longValue() > 0;
+    }
+
     @Override
     public boolean existsPlainAttrUniqueValue(
             final String realmKey,
             final PlainSchema schema,
             final PlainAttrValue attrValue) {
 
-        Query query = entityManager.createNativeQuery(
-                "SELECT COUNT(id) FROM "
-                + JPARealm.TABLE + ","
-                + 
OracleJPAAnySearchDAO.from(plainSchemaDAO.findById(schema.getKey()).
-                        orElseThrow(() -> new NotFoundException("PlainSchema " 
+ schema.getKey())))
-                + " WHERE " + schema.getKey() + ".uniqueValue=?1 AND id <> 
?2");
-        query.setParameter(1, attrValue.getValue());
-        query.setParameter(2, realmKey);
-
-        return ((Number) query.getSingleResult()).intValue() > 0;
+        return existsPlainAttrUniqueValue(
+                JPARealm.TABLE,
+                realmKey,
+                schema,
+                attrValue);
     }
 
     @Override
@@ -85,15 +98,10 @@ public class OraclePlainSchemaRepoExtImpl extends 
AbstractPlainSchemaRepoExt {
             final PlainSchema schema,
             final PlainAttrValue attrValue) {
 
-        Query query = entityManager.createNativeQuery(
-                "SELECT COUNT(id) FROM "
-                + new SearchSupport(anyUtils.anyTypeKind()).table().name() + 
","
-                + 
OracleJPAAnySearchDAO.from(plainSchemaDAO.findById(schema.getKey()).
-                        orElseThrow(() -> new NotFoundException("PlainSchema " 
+ schema.getKey())))
-                + " WHERE " + schema.getKey() + ".uniqueValue=?1 AND id <> 
?2");
-        query.setParameter(1, attrValue.getValue());
-        query.setParameter(2, anyKey);
-
-        return ((Number) query.getSingleResult()).intValue() > 0;
+        return existsPlainAttrUniqueValue(
+                new SearchSupport(anyUtils.anyTypeKind()).table().name(),
+                anyKey,
+                schema,
+                attrValue);
     }
 }

Reply via email to