From 2244a9ef2e7e1e0eebcb79413b03f3c23df7e994 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francesco=20Chicchiricc=C3=B2?= Date: Thu, 13 Aug 2026 09:03:52 +0200 Subject: [PATCH] Rationalize AdminRealmFilter for AnySearchDAO impls --- .../common/dao/AbstractAnySearchDAO.java | 40 ++++++++++++ .../jpa/dao/AbstractJPAAnySearchDAO.java | 62 +++++-------------- .../neo4j/dao/Neo4jAnySearchDAO.java | 50 +++------------ .../dao/ElasticsearchAnySearchDAO.java | 57 ++++------------- .../dao/ElasticsearchAnySearchDAOTest.java | 8 +-- .../dao/OpenSearchAnySearchDAO.java | 57 ++++------------- .../dao/OpenSearchAnySearchDAOTest.java | 8 +-- 7 files changed, 96 insertions(+), 186 deletions(-) diff --git a/core/persistence-common/src/main/java/org/apache/syncope/core/persistence/common/dao/AbstractAnySearchDAO.java b/core/persistence-common/src/main/java/org/apache/syncope/core/persistence/common/dao/AbstractAnySearchDAO.java index 106ee3bc6bb..52caba13a79 100644 --- a/core/persistence-common/src/main/java/org/apache/syncope/core/persistence/common/dao/AbstractAnySearchDAO.java +++ b/core/persistence-common/src/main/java/org/apache/syncope/core/persistence/common/dao/AbstractAnySearchDAO.java @@ -20,12 +20,16 @@ import java.util.ArrayList; import java.util.Comparator; +import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import org.apache.commons.lang3.tuple.Pair; +import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.SyncopeConstants; import org.apache.syncope.common.lib.types.AnyTypeKind; +import org.apache.syncope.common.lib.types.ClientExceptionType; import org.apache.syncope.core.persistence.api.attrvalue.PlainAttrValidationManager; import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO; import org.apache.syncope.core.persistence.api.dao.AnySearchDAO; @@ -44,6 +48,7 @@ import org.apache.syncope.core.persistence.api.entity.EntityFactory; import org.apache.syncope.core.persistence.api.entity.Realm; import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject; +import org.apache.syncope.core.persistence.api.utils.RealmUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.PageRequest; @@ -54,6 +59,10 @@ public abstract class AbstractAnySearchDAO extends AbstractSearchDAO implements AnySearchDAO { + public record AdminRealmsFilter(T filter, Set> managed) { + + } + protected static final Logger LOG = LoggerFactory.getLogger(AnySearchDAO.class); private static final Set ORDER_BY_NOT_ALLOWED = Set.of( @@ -126,6 +135,37 @@ public List findByDerAttrValue( return conditions.isEmpty() ? List.of() : search(SearchCond.and(conditions), anyTypeKind); } + protected AdminRealmsFilter processRealms( + final Realm base, + final boolean recursive, + final Set adminRealms, + final Function, T> filterBuilder) { + + Set realmKeys = new HashSet<>(); + Set> managed = new HashSet<>(); + + adminRealms.forEach(realmPath -> RealmUtils.ManagerRealm.of(realmPath).ifPresentOrElse( + realm -> managed.add(Pair.of(realm.kind(), realm.anyKey())), + () -> { + Realm realm = realmSearchDAO.findByFullPath(realmPath).orElseThrow(() -> { + SyncopeClientException noRealm = SyncopeClientException.build(ClientExceptionType.InvalidRealm); + noRealm.getElements().add("Invalid realm specified: " + realmPath); + return noRealm; + }); + + if (recursive) { + realmKeys.addAll(realmSearchDAO.findDescendants(realm.getFullPath(), base.getFullPath()). + stream().map(Realm::getKey).toList()); + } else { + if (RealmUtils.subtree(realm.getFullPath(), base.getFullPath())) { + realmKeys.add(realm.getKey()); + } + } + })); + + return new AdminRealmsFilter<>(filterBuilder.apply(realmKeys), managed); + } + protected abstract long doCount( Realm base, boolean recursive, Set adminRealms, SearchCond cond, AnyTypeKind kind); diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAAnySearchDAO.java index 1a9e660d585..0530f2dd99c 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAAnySearchDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAAnySearchDAO.java @@ -29,12 +29,9 @@ import java.util.Set; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.Pair; -import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.SyncopeConstants; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.AttrSchemaType; -import org.apache.syncope.common.lib.types.ClientExceptionType; import org.apache.syncope.common.rest.api.service.JAXRSService; import org.apache.syncope.core.persistence.api.attrvalue.PlainAttrValidationManager; import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO; @@ -60,7 +57,6 @@ import org.apache.syncope.core.persistence.api.entity.PlainAttrValue; import org.apache.syncope.core.persistence.api.entity.PlainSchema; import org.apache.syncope.core.persistence.api.entity.Realm; -import org.apache.syncope.core.persistence.api.utils.RealmUtils; import org.apache.syncope.core.persistence.common.dao.AbstractAnySearchDAO; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -70,10 +66,6 @@ */ abstract class AbstractJPAAnySearchDAO extends AbstractAnySearchDAO { - protected record AdminRealmsFilter(AnySearchNode.Leaf filter, Set> managed) { - - } - protected record QueryInfo(AnySearchNode node, Set plainSchemas) { } @@ -620,52 +612,24 @@ protected AnySearchNode getQuery( }; } - protected AnySearchNode.Leaf buildAdminRealmsFilter( - final Set realmKeys, - final SearchSupport svs, - final List parameters) { - - if (realmKeys.isEmpty()) { - return new AnySearchNode.Leaf(defaultSV(svs), StringUtils.substringAfter(anyId(svs), '.') + " IS NOT NULL"); - } - - String realmKeysArg = realmKeys.stream(). - map(realmKey -> "?" + setParameter(parameters, realmKey)). - collect(Collectors.joining(",")); - return new AnySearchNode.Leaf(defaultSV(svs), "realm_id IN (" + realmKeysArg + ")"); - } - - protected AdminRealmsFilter getAdminRealmsFilter( + protected AdminRealmsFilter getAdminRealmsFilter( final Realm base, final boolean recursive, final Set adminRealms, final List parameters, final SearchSupport svs) { - Set realmKeys = new HashSet<>(); - Set> managed = new HashSet<>(); - - if (recursive) { - adminRealms.forEach(realmPath -> RealmUtils.ManagerRealm.of(realmPath).ifPresentOrElse( - realm -> managed.add(Pair.of(realm.kind(), realm.anyKey())), - () -> { - Realm realm = realmSearchDAO.findByFullPath(realmPath).orElseThrow(() -> { - SyncopeClientException noRealm = - SyncopeClientException.build(ClientExceptionType.InvalidRealm); - noRealm.getElements().add("Invalid realm specified: " + realmPath); - return noRealm; - }); - - realmKeys.addAll(realmSearchDAO.findDescendants(realm.getFullPath(), base.getFullPath()). - stream().map(Realm::getKey).toList()); - })); - } else { - if (RealmUtils.SubtreePredicate.of(adminRealms).test(base.getFullPath())) { - realmKeys.add(base.getKey()); + return processRealms(base, recursive, adminRealms, realmKeys -> { + if (realmKeys.isEmpty()) { + return new AnySearchNode.Leaf( + defaultSV(svs), StringUtils.substringAfter(anyId(svs), '.') + " IS NOT NULL"); } - } - return new AdminRealmsFilter(buildAdminRealmsFilter(realmKeys, svs, parameters), managed); + String realmKeysArg = realmKeys.stream(). + map(realmKey -> "?" + setParameter(parameters, realmKey)). + collect(Collectors.joining(",")); + return new AnySearchNode.Leaf(defaultSV(svs), "realm_id IN (" + realmKeysArg + ")"); + }); } protected void visitNode( @@ -771,7 +735,8 @@ protected long doCount( SearchSupport svs = new SearchViewSupport(kind); // 1. get admin realms filter - AdminRealmsFilter filter = getAdminRealmsFilter(base, recursive, adminRealms, parameters, svs); + AdminRealmsFilter filter = + getAdminRealmsFilter(base, recursive, adminRealms, parameters, svs); // 2. transform search condition QueryInfo queryInfo = getQuery( @@ -936,7 +901,8 @@ protected List doSearch( SearchSupport svs = new SearchViewSupport(kind); // 1. get admin realms filter - AdminRealmsFilter filter = getAdminRealmsFilter(base, recursive, adminRealms, parameters, svs); + AdminRealmsFilter filter = + getAdminRealmsFilter(base, recursive, adminRealms, parameters, svs); // 2. transform search condition QueryInfo queryInfo = getQuery( diff --git a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/Neo4jAnySearchDAO.java b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/Neo4jAnySearchDAO.java index 2842f829449..a433c9fb2e8 100644 --- a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/Neo4jAnySearchDAO.java +++ b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/Neo4jAnySearchDAO.java @@ -30,7 +30,6 @@ import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Strings; -import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.text.TextStringBuilder; import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.SyncopeConstants; @@ -62,7 +61,6 @@ import org.apache.syncope.core.persistence.api.entity.PlainAttrValue; import org.apache.syncope.core.persistence.api.entity.PlainSchema; import org.apache.syncope.core.persistence.api.entity.Realm; -import org.apache.syncope.core.persistence.api.utils.RealmUtils; import org.apache.syncope.core.persistence.common.dao.AbstractAnySearchDAO; import org.apache.syncope.core.persistence.neo4j.dao.repo.AnyRepoExt; import org.apache.syncope.core.persistence.neo4j.entity.AbstractAny; @@ -88,10 +86,6 @@ public class Neo4jAnySearchDAO extends AbstractAnySearchDAO { - protected record AdminRealmsFilter(String filter, Set> managed) { - - } - protected record AnyCondQuery(String query, String field) { } @@ -180,47 +174,19 @@ protected boolean isPatternMatch(final String clause) { return clause.indexOf('*') != -1; } - protected String buildAdminRealmsFilter( - final Set realmKeys, - final Map parameters) { - - if (realmKeys.isEmpty()) { - return "(n)-[]-(:" + Neo4jRealm.NODE + ")"; - } - - return "(n)-[]-(r:" + Neo4jRealm.NODE + ") WHERE r.id IN $" + setParameter(parameters, realmKeys); - } - - protected AdminRealmsFilter getAdminRealmsFilter( + protected AdminRealmsFilter getAdminRealmsFilter( final Realm base, final boolean recursive, final Set adminRealms, final Map parameters) { - Set realmKeys = new HashSet<>(); - Set> managed = new HashSet<>(); - - if (recursive) { - adminRealms.forEach(realmPath -> RealmUtils.ManagerRealm.of(realmPath).ifPresentOrElse( - realm -> managed.add(Pair.of(realm.kind(), realm.anyKey())), - () -> { - Realm realm = realmSearchDAO.findByFullPath(realmPath).orElseThrow(() -> { - SyncopeClientException noRealm = - SyncopeClientException.build(ClientExceptionType.InvalidRealm); - noRealm.getElements().add("Invalid realm specified: " + realmPath); - return noRealm; - }); - - realmKeys.addAll(realmSearchDAO.findDescendants(realm.getFullPath(), base.getFullPath()). - stream().map(Realm::getKey).toList()); - })); - } else { - if (RealmUtils.SubtreePredicate.of(adminRealms).test(base.getFullPath())) { - realmKeys.add(base.getKey()); + return processRealms(base, recursive, adminRealms, realmKeys -> { + if (realmKeys.isEmpty()) { + return "(n)-[]-(:" + Neo4jRealm.NODE + ")"; } - } - return new AdminRealmsFilter(buildAdminRealmsFilter(realmKeys, parameters), managed); + return "(n)-[]-(r:" + Neo4jRealm.NODE + ") WHERE r.id IN $" + setParameter(parameters, realmKeys); + }); } protected String getQuery( @@ -910,7 +876,7 @@ protected long doCount( Map parameters = new HashMap<>(); - AdminRealmsFilter filter = getAdminRealmsFilter(base, recursive, adminRealms, parameters); + AdminRealmsFilter filter = getAdminRealmsFilter(base, recursive, adminRealms, parameters); // 1. get the query string from the search condition QueryInfo queryInfo = getQuery( @@ -979,7 +945,7 @@ protected List doSearch( Map parameters = new HashMap<>(); - AdminRealmsFilter filter = getAdminRealmsFilter(base, recursive, adminRealms, parameters); + AdminRealmsFilter filter = getAdminRealmsFilter(base, recursive, adminRealms, parameters); // 1. get the query string from the search condition QueryInfo queryInfo = getQuery( diff --git a/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java b/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java index 1288133f31c..7464e165e7a 100644 --- a/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java +++ b/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java @@ -36,18 +36,14 @@ import co.elastic.clients.json.JsonData; import java.lang.reflect.Field; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.apache.commons.lang3.tuple.Pair; -import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.SyncopeConstants; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.AttrSchemaType; -import org.apache.syncope.common.lib.types.ClientExceptionType; import org.apache.syncope.common.rest.api.service.JAXRSService; import org.apache.syncope.core.persistence.api.attrvalue.PlainAttrValidationManager; import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO; @@ -74,7 +70,6 @@ import org.apache.syncope.core.persistence.api.entity.PlainSchema; import org.apache.syncope.core.persistence.api.entity.Realm; import org.apache.syncope.core.persistence.api.utils.FormatUtils; -import org.apache.syncope.core.persistence.api.utils.RealmUtils; import org.apache.syncope.core.persistence.common.dao.AbstractAnySearchDAO; import org.apache.syncope.core.spring.security.AuthContextUtils; import org.apache.syncope.ext.elasticsearch.client.ElasticsearchUtils; @@ -87,10 +82,6 @@ */ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO { - protected record AdminRealmsFilter(Optional query, Set> managed) { - - } - protected static final Set ID_PROPS = Set.of("key", "id", "_id"); protected final ElasticsearchClient client; @@ -123,44 +114,22 @@ public ElasticsearchAnySearchDAO( this.indexMaxResultWindow = indexMaxResultWindow; } - protected AdminRealmsFilter getAdminRealmsFilter( + protected AdminRealmsFilter> getAdminRealmsFilter( final Realm base, final boolean recursive, final Set adminRealms) { - Set> managed = new HashSet<>(); - List queries = new ArrayList<>(); - - if (recursive) { - adminRealms.forEach(realmPath -> RealmUtils.ManagerRealm.of(realmPath).ifPresentOrElse( - realm -> managed.add(Pair.of(realm.kind(), realm.anyKey())), - () -> { - Realm realm = realmSearchDAO.findByFullPath(realmPath).orElseThrow(() -> { - SyncopeClientException noRealm = - SyncopeClientException.build(ClientExceptionType.InvalidRealm); - noRealm.getElements().add("Invalid realm specified: " + realmPath); - return noRealm; - }); - - realmSearchDAO.findDescendants(realm.getFullPath(), base.getFullPath()). - stream().map(Realm::getKey).forEach(descendant -> queries.add( - new Query.Builder().term(QueryBuilders.term(). - field("realm").value(descendant).caseInsensitive(false).build()). - build())); - })); - } else { - if (RealmUtils.SubtreePredicate.of(adminRealms).test(base.getFullPath())) { - queries.add(new Query.Builder().term(QueryBuilders.term(). - field("realm").value(base.getKey()).caseInsensitive(false).build()). - build()); + return processRealms(base, recursive, adminRealms, realmKeys -> { + if (realmKeys.isEmpty()) { + return Optional.empty(); } - } - return new AdminRealmsFilter( - managed.isEmpty() - ? Optional.of(new Query.Builder().disMax(QueryBuilders.disMax().queries(queries).build()).build()) - : Optional.empty(), - managed); + List queries = realmKeys.stream(). + map(realm -> new Query.Builder().term(QueryBuilders.term(). + field("realm").value(realm).caseInsensitive(false).build()). + build()).toList(); + return Optional.of(new Query.Builder().disMax(QueryBuilders.disMax().queries(queries).build()).build()); + }); } protected Query getQuery( @@ -184,13 +153,13 @@ protected Query getQuery( build(); } } else { - AdminRealmsFilter filter = getAdminRealmsFilter(base, recursive, adminRealms); + AdminRealmsFilter> filter = getAdminRealmsFilter(base, recursive, adminRealms); query = getQuery(buildEffectiveCond(cond, filter.managed(), kind), kind); - if (filter.query().isPresent()) { + if (filter.filter().isPresent()) { query = new Query.Builder().bool( QueryBuilders.bool(). - filter(filter.query().get()). + filter(filter.filter().get()). filter(query).build()). build(); } diff --git a/ext/elasticsearch/persistence/src/test/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAOTest.java b/ext/elasticsearch/persistence/src/test/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAOTest.java index 8507d071f7d..187b454ab6d 100644 --- a/ext/elasticsearch/persistence/src/test/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAOTest.java +++ b/ext/elasticsearch/persistence/src/test/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAOTest.java @@ -119,23 +119,23 @@ public void getAdminRealmsFilter4realm() throws IOException { // 2. test Set adminRealms = Set.of(SyncopeConstants.ROOT_REALM); - ElasticsearchAnySearchDAO.AdminRealmsFilter filter = + ElasticsearchAnySearchDAO.AdminRealmsFilter> filter = searchDAO.getAdminRealmsFilter(root, true, adminRealms); assertThat(new Query.Builder().disMax(QueryBuilders.disMax().queries( new Query.Builder().term(QueryBuilders.term().caseInsensitive(false). field("realm").value("rootKey").caseInsensitive(false).build()). build()).build()).build()). - usingRecursiveComparison().isEqualTo(filter.query().get()); + usingRecursiveComparison().isEqualTo(filter.filter().get()); assertEquals(Set.of(), filter.managed()); } @Test public void getAdminRealmsFilter4manager() { Set adminRealms = Set.of(new RealmUtils.ManagerRealm("/any", AnyTypeKind.GROUP, "groupKey").output()); - ElasticsearchAnySearchDAO.AdminRealmsFilter filter = + ElasticsearchAnySearchDAO.AdminRealmsFilter> filter = searchDAO.getAdminRealmsFilter(realmDAO.getRoot(), true, adminRealms); - assertFalse(filter.query().isPresent()); + assertFalse(filter.filter().isPresent()); assertEquals(Set.of(Pair.of(AnyTypeKind.GROUP, "groupKey")), filter.managed()); } diff --git a/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java b/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java index ea30d7a6c46..1b1d1b55e55 100644 --- a/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java +++ b/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java @@ -20,18 +20,14 @@ import java.lang.reflect.Field; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.apache.commons.lang3.tuple.Pair; -import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.SyncopeConstants; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.AttrSchemaType; -import org.apache.syncope.common.lib.types.ClientExceptionType; import org.apache.syncope.common.rest.api.service.JAXRSService; import org.apache.syncope.core.persistence.api.attrvalue.PlainAttrValidationManager; import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO; @@ -58,7 +54,6 @@ import org.apache.syncope.core.persistence.api.entity.PlainSchema; import org.apache.syncope.core.persistence.api.entity.Realm; import org.apache.syncope.core.persistence.api.utils.FormatUtils; -import org.apache.syncope.core.persistence.api.utils.RealmUtils; import org.apache.syncope.core.persistence.common.dao.AbstractAnySearchDAO; import org.apache.syncope.core.spring.security.AuthContextUtils; import org.apache.syncope.ext.opensearch.client.OpenSearchUtils; @@ -86,10 +81,6 @@ */ public class OpenSearchAnySearchDAO extends AbstractAnySearchDAO { - protected record AdminRealmsFilter(Optional query, Set> managed) { - - } - protected static final Set ID_PROPS = Set.of("key", "id", "_id"); protected final OpenSearchClient client; @@ -122,44 +113,22 @@ public OpenSearchAnySearchDAO( this.indexMaxResultWindow = indexMaxResultWindow; } - protected AdminRealmsFilter getAdminRealmsFilter( + protected AdminRealmsFilter> getAdminRealmsFilter( final Realm base, final boolean recursive, final Set adminRealms) { - Set> managed = new HashSet<>(); - List queries = new ArrayList<>(); - - if (recursive) { - adminRealms.forEach(realmPath -> RealmUtils.ManagerRealm.of(realmPath).ifPresentOrElse( - realm -> managed.add(Pair.of(realm.kind(), realm.anyKey())), - () -> { - Realm realm = realmSearchDAO.findByFullPath(realmPath).orElseThrow(() -> { - SyncopeClientException noRealm = - SyncopeClientException.build(ClientExceptionType.InvalidRealm); - noRealm.getElements().add("Invalid realm specified: " + realmPath); - return noRealm; - }); - - realmSearchDAO.findDescendants(realm.getFullPath(), base.getFullPath()). - stream().map(Realm::getKey).forEach(descendant -> queries.add( - new Query.Builder().term(QueryBuilders.term(). - field("realm").value(FieldValue.of(descendant)).caseInsensitive(false).build()). - build())); - })); - } else { - if (RealmUtils.SubtreePredicate.of(adminRealms).test(base.getFullPath())) { - queries.add(new Query.Builder().term(QueryBuilders.term(). - field("realm").value(FieldValue.of(base.getKey())).caseInsensitive(false).build()). - build()); + return processRealms(base, recursive, adminRealms, realmKeys -> { + if (realmKeys.isEmpty()) { + return Optional.empty(); } - } - return new AdminRealmsFilter( - managed.isEmpty() - ? Optional.of(new Query.Builder().disMax(QueryBuilders.disMax().queries(queries).build()).build()) - : Optional.empty(), - managed); + List queries = realmKeys.stream(). + map(realm -> new Query.Builder().term(QueryBuilders.term(). + field("realm").value(FieldValue.of(realm)).caseInsensitive(false).build()). + build()).toList(); + return Optional.of(new Query.Builder().disMax(QueryBuilders.disMax().queries(queries).build()).build()); + }); } protected Query getQuery( @@ -183,13 +152,13 @@ protected Query getQuery( build(); } } else { - AdminRealmsFilter filter = getAdminRealmsFilter(base, recursive, adminRealms); + AdminRealmsFilter> filter = getAdminRealmsFilter(base, recursive, adminRealms); query = getQuery(buildEffectiveCond(cond, filter.managed(), kind), kind); - if (filter.query().isPresent()) { + if (filter.filter().isPresent()) { query = new Query.Builder().bool( QueryBuilders.bool(). - filter(filter.query().get()). + filter(filter.filter().get()). filter(query).build()). build(); } diff --git a/ext/opensearch/persistence/src/test/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAOTest.java b/ext/opensearch/persistence/src/test/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAOTest.java index 20998de3baf..560386ee5d2 100644 --- a/ext/opensearch/persistence/src/test/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAOTest.java +++ b/ext/opensearch/persistence/src/test/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAOTest.java @@ -120,23 +120,23 @@ public void getAdminRealmsFilter4realm() throws IOException { // 2. test Set adminRealms = Set.of(SyncopeConstants.ROOT_REALM); - OpenSearchAnySearchDAO.AdminRealmsFilter filter = + OpenSearchAnySearchDAO.AdminRealmsFilter> filter = searchDAO.getAdminRealmsFilter(root, true, adminRealms); assertThat(new Query.Builder().disMax(QueryBuilders.disMax().queries( new Query.Builder().term(QueryBuilders.term().caseInsensitive(false). field("realm").value(FieldValue.of("rootKey")).caseInsensitive(false).build()). build()).build()).build()). - usingRecursiveComparison().isEqualTo(filter.query().get()); + usingRecursiveComparison().isEqualTo(filter.filter().get()); assertEquals(Set.of(), filter.managed()); } @Test public void getAdminRealmsFilter4manager() { Set adminRealms = Set.of(new RealmUtils.ManagerRealm("/any", AnyTypeKind.GROUP, "groupKey").output()); - OpenSearchAnySearchDAO.AdminRealmsFilter filter = + OpenSearchAnySearchDAO.AdminRealmsFilter> filter = searchDAO.getAdminRealmsFilter(realmDAO.getRoot(), true, adminRealms); - assertFalse(filter.query().isPresent()); + assertFalse(filter.filter().isPresent()); assertEquals(Set.of(Pair.of(AnyTypeKind.GROUP, "groupKey")), filter.managed()); }