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>