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 831a44a5a2 [SYNCOPE-1911] Chaging index settings and adjusting queries
to work with caseInensitive
831a44a5a2 is described below
commit 831a44a5a2adc6984ecc3d784c28499a0ba6019a
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Fri Sep 19 12:27:02 2025 +0200
[SYNCOPE-1911] Chaging index settings and adjusting queries to work with
caseInensitive
---
.../client/ElasticsearchIndexManager.java | 17 +--
.../elasticsearch/client/ElasticsearchUtils.java | 16 ---
.../dao/ElasticsearchAnySearchDAO.java | 53 ++++-----
.../dao/ElasticsearchRealmSearchDAO.java | 30 ++---
.../dao/ElasticsearchAnySearchDAOTest.java | 114 ++++++++++--------
.../opensearch/client/OpenSearchIndexManager.java | 17 +--
.../ext/opensearch/client/OpenSearchUtils.java | 16 ---
.../opensearch/dao/OpenSearchAnySearchDAO.java | 58 ++++------
.../opensearch/dao/OpenSearchRealmSearchDAO.java | 33 ++----
.../opensearch/dao/OpenSearchAnySearchDAOTest.java | 128 +++++++++++----------
.../org/apache/syncope/fit/core/SearchITCase.java | 26 +++++
11 files changed, 225 insertions(+), 283 deletions(-)
diff --git
a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchIndexManager.java
b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchIndexManager.java
index df7c8c8f7b..6cb94d554f 100644
---
a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchIndexManager.java
+++
b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchIndexManager.java
@@ -21,8 +21,6 @@ package org.apache.syncope.ext.elasticsearch.client;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.ElasticsearchException;
import co.elastic.clients.elasticsearch._types.Refresh;
-import co.elastic.clients.elasticsearch._types.analysis.CustomNormalizer;
-import co.elastic.clients.elasticsearch._types.analysis.Normalizer;
import co.elastic.clients.elasticsearch._types.mapping.DynamicTemplate;
import co.elastic.clients.elasticsearch._types.mapping.KeywordProperty;
import co.elastic.clients.elasticsearch._types.mapping.Property;
@@ -101,14 +99,7 @@ public class ElasticsearchIndexManager {
public IndexSettings defaultSettings() {
return new IndexSettings.Builder().
- analysis(new IndexSettingsAnalysis.Builder().
- normalizer("string_lowercase", new
Normalizer.Builder().
- custom(new CustomNormalizer.Builder().
- charFilter(List.of()).
- filter("lowercase").
- build()).
- build()).
- build()).
+ analysis(new IndexSettingsAnalysis.Builder().build()).
numberOfShards(numberOfShards).
numberOfReplicas(numberOfReplicas).
build();
@@ -121,7 +112,7 @@ public class ElasticsearchIndexManager {
new DynamicTemplate.Builder().
matchMappingType("string").
mapping(new Property.Builder().
- keyword(new
KeywordProperty.Builder().normalizer("string_lowercase").build()).
+ keyword(new
KeywordProperty.Builder().build()).
build()).
build()))).
build();
@@ -134,7 +125,7 @@ public class ElasticsearchIndexManager {
new DynamicTemplate.Builder().
matchMappingType("string").
mapping(new Property.Builder().
- keyword(new
KeywordProperty.Builder().normalizer("string_lowercase").build()).
+ keyword(new
KeywordProperty.Builder().build()).
build()).
build()))).
build();
@@ -147,7 +138,7 @@ public class ElasticsearchIndexManager {
new DynamicTemplate.Builder().
matchMappingType("string").
mapping(new Property.Builder().
- keyword(new
KeywordProperty.Builder().normalizer("string_lowercase").build()).
+ keyword(new
KeywordProperty.Builder().build()).
build()).
build()))).
properties(
diff --git
a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
index ac667c3875..7b77342376 100644
---
a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
+++
b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
@@ -27,7 +27,6 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
-import org.apache.commons.lang3.ArrayUtils;
import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
import org.apache.syncope.core.persistence.api.dao.GroupDAO;
@@ -64,21 +63,6 @@ public class ElasticsearchUtils {
return domain.toLowerCase() + "_audit";
}
- protected static final char[] ELASTICSEARCH_REGEX_CHARS = {
- '.', '?', '+', '*', '|', '{', '}', '[', ']', '(', ')', '"', '\\', '&'
};
-
- public static String escapeForLikeRegex(final char c) {
- StringBuilder output = new StringBuilder();
-
- if (ArrayUtils.contains(ELASTICSEARCH_REGEX_CHARS, c)) {
- output.append('\\');
- }
-
- output.append(c);
-
- return output.toString();
- }
-
protected final UserDAO userDAO;
protected final GroupDAO groupDAO;
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 335a53dd45..41737a6aa5 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
@@ -144,14 +144,14 @@ public class ElasticsearchAnySearchDAO extends
AbstractAnySearchDAO {
realmSearchDAO.findDescendants(realm.getFullPath(),
base.getFullPath()).
forEach(descendant -> queries.add(
new Query.Builder().term(QueryBuilders.term().
- field("realm").value(descendant).build()).
+
field("realm").value(descendant).caseInsensitive(false).build()).
build()));
} else {
dynRealmDAO.findById(realmPath).ifPresentOrElse(
dynRealm -> {
dynRealmKeys.add(dynRealm.getKey());
queries.add(new
Query.Builder().term(QueryBuilders.term().
-
field("dynRealm").value(dynRealm.getKey()).build()).
+
field("dynRealm").value(dynRealm.getKey()).caseInsensitive(false).build()).
build());
},
() -> LOG.warn("Ignoring invalid dynamic realm
{}", realmPath));
@@ -160,7 +160,7 @@ public class ElasticsearchAnySearchDAO extends
AbstractAnySearchDAO {
} else {
if (adminRealms.stream().anyMatch(r ->
r.startsWith(base.getFullPath()))) {
queries.add(new Query.Builder().term(QueryBuilders.term().
- field("realm").value(base.getKey()).build()).
+
field("realm").value(base.getKey()).caseInsensitive(false).build()).
build());
}
}
@@ -188,7 +188,7 @@ public class ElasticsearchAnySearchDAO extends
AbstractAnySearchDAO {
query = new Query.Builder().bool(
QueryBuilders.bool().
filter(new
Query.Builder().term(QueryBuilders.term().
-
field("realm").value(base.getKey()).build()).
+
field("realm").value(base.getKey()).caseInsensitive(false).build()).
build()).
filter(query).build()).
build();
@@ -259,8 +259,7 @@ public class ElasticsearchAnySearchDAO extends
AbstractAnySearchDAO {
options.add(new SortOptions.Builder().field(
new FieldSort.Builder().
field(sortName).
- order(clause.getDirection() ==
Sort.Direction.ASC
- ? SortOrder.Asc : SortOrder.Desc).
+ order(clause.getDirection() ==
Sort.Direction.ASC ? SortOrder.Asc : SortOrder.Desc).
build()).
build());
}
@@ -436,14 +435,14 @@ public class ElasticsearchAnySearchDAO extends
AbstractAnySearchDAO {
protected Query getQuery(final RelationshipTypeCond cond) {
return new Query.Builder().term(QueryBuilders.term().
-
field("relationshipTypes").value(cond.getRelationshipTypeKey()).build()).
+
field("relationshipTypes").value(cond.getRelationshipTypeKey()).caseInsensitive(false).build()).
build();
}
protected Query getQuery(final RelationshipCond cond) {
List<Query> queries = check(cond).stream().
map(key -> new Query.Builder().term(QueryBuilders.term().
- field("relationships").value(key).build()).
+
field("relationships").value(key).caseInsensitive(false).build()).
build()).toList();
return queries.size() == 1
@@ -454,7 +453,7 @@ public class ElasticsearchAnySearchDAO extends
AbstractAnySearchDAO {
protected Query getQuery(final MembershipCond cond) {
List<Query> queries = check(cond).stream().
map(key -> new Query.Builder().term(QueryBuilders.term().
- field("memberships").value(key).build()).
+
field("memberships").value(key).caseInsensitive(false).build()).
build()).toList();
return queries.size() == 1
@@ -464,20 +463,20 @@ public class ElasticsearchAnySearchDAO extends
AbstractAnySearchDAO {
protected Query getQuery(final RoleCond cond) {
return new Query.Builder().term(QueryBuilders.term().
- field("roles").value(cond.getRole()).build()).
+
field("roles").value(cond.getRole()).caseInsensitive(false).build()).
build();
}
protected Query getQuery(final DynRealmCond cond) {
return new Query.Builder().term(QueryBuilders.term().
- field("dynRealms").value(cond.getDynRealm()).build()).
+
field("dynRealms").value(cond.getDynRealm()).caseInsensitive(false).build()).
build();
}
protected Query getQuery(final MemberCond cond) {
List<Query> queries = check(cond).stream().
map(key -> new Query.Builder().term(QueryBuilders.term().
- field("members").value(key).build()).
+ field("members").value(key).caseInsensitive(false).build()).
build()).toList();
return queries.size() == 1
@@ -487,13 +486,13 @@ public class ElasticsearchAnySearchDAO extends
AbstractAnySearchDAO {
protected Query getQuery(final AuxClassCond cond) {
return new Query.Builder().term(QueryBuilders.term().
- field("auxClasses").value(cond.getAuxClass()).build()).
+
field("auxClasses").value(cond.getAuxClass()).caseInsensitive(false).build()).
build();
}
protected Query getQuery(final ResourceCond cond) {
return new Query.Builder().term(QueryBuilders.term().
- field("resources").value(cond.getResource()).build()).
+
field("resources").value(cond.getResource()).caseInsensitive(false).build()).
build();
}
@@ -520,32 +519,20 @@ public class ElasticsearchAnySearchDAO extends
AbstractAnySearchDAO {
break;
case ILIKE:
- StringBuilder output = new StringBuilder();
- for (char c :
cond.getExpression().toLowerCase().replace("\\_", "_").toCharArray()) {
- if (c == '%') {
- output.append(".*");
- } else if (Character.isLetter(c)) {
- output.append('[').
- append(c).
- append(Character.toUpperCase(c)).
- append(']');
- } else {
-
output.append(ElasticsearchUtils.escapeForLikeRegex(c));
- }
- }
- query = new Query.Builder().regexp(QueryBuilders.regexp().
-
field(schema.getKey()).value(output.toString()).build()).build();
+ query = new Query.Builder().wildcard(QueryBuilders.wildcard().
+
field(schema.getKey()).value(cond.getExpression().replace('%',
'*').replace("\\_", "_")).
+ caseInsensitive(true).build()).build();
break;
case LIKE:
query = new Query.Builder().wildcard(QueryBuilders.wildcard().
field(schema.getKey()).value(cond.getExpression().replace('%',
'*').replace("\\_", "_")).
- build()).build();
+ caseInsensitive(false).build()).build();
break;
case IEQ:
- query = new Query.Builder().match(QueryBuilders.match().
-
field(schema.getKey()).query(cond.getExpression().toLowerCase()).build()).
+ query = new Query.Builder().term(QueryBuilders.term().
+
field(schema.getKey()).value(cond.getExpression()).caseInsensitive(true).build()).
build();
break;
@@ -561,7 +548,7 @@ public class ElasticsearchAnySearchDAO extends
AbstractAnySearchDAO {
fieldValue = FieldValue.of(value.toString());
}
query = new Query.Builder().term(QueryBuilders.term().
- field(schema.getKey()).value(fieldValue).build()).
+
field(schema.getKey()).value(fieldValue).caseInsensitive(false).build()).
build();
break;
diff --git
a/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchRealmSearchDAO.java
b/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchRealmSearchDAO.java
index 5dae257e56..77b9bebe0d 100644
---
a/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchRealmSearchDAO.java
+++
b/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchRealmSearchDAO.java
@@ -92,7 +92,7 @@ public class ElasticsearchRealmSearchDAO implements
RealmSearchDAO {
index(ElasticsearchUtils.getRealmIndex(AuthContextUtils.getDomain())).
searchType(SearchType.QueryThenFetch).
query(new Query.Builder().term(QueryBuilders.term().
- field("fullPath").value(fullPath).build()).build()).
+
field("fullPath").value(fullPath).caseInsensitive(false).build()).build()).
size(1).
fields(List.of()).source(new
SourceConfig.Builder().fetch(false).build()).
build();
@@ -134,7 +134,7 @@ public class ElasticsearchRealmSearchDAO implements
RealmSearchDAO {
public List<Realm> findByName(final String name) {
List<String> result = search(
new Query.Builder().term(QueryBuilders.term().
- field("name").value(name).build()).build());
+
field("name").value(name).caseInsensitive(false).build()).build());
return result.stream().map(realmDAO::findById).
flatMap(Optional::stream).map(Realm.class::cast).toList();
}
@@ -143,7 +143,7 @@ public class ElasticsearchRealmSearchDAO implements
RealmSearchDAO {
public List<Realm> findChildren(final Realm realm) {
List<String> result = search(
new Query.Builder().term(QueryBuilders.term().
-
field("parent_id").value(realm.getKey()).build()).build());
+
field("parent_id").value(realm.getKey()).caseInsensitive(false).build()).build());
return result.stream().map(realmDAO::findById).
flatMap(Optional::stream).map(Realm.class::cast).toList();
}
@@ -152,7 +152,7 @@ public class ElasticsearchRealmSearchDAO implements
RealmSearchDAO {
List<Query> basesQueries = new ArrayList<>();
bases.forEach(base -> {
basesQueries.add(new Query.Builder().term(QueryBuilders.term().
- field("fullPath").value(base).build()).build());
+
field("fullPath").value(base).caseInsensitive(false).build()).build());
basesQueries.add(new Query.Builder().regexp(QueryBuilders.regexp().
field("fullPath").value(SyncopeConstants.ROOT_REALM.equals(base) ? "/.*" : base
+ "/.*").
build()).build());
@@ -163,25 +163,11 @@ public class ElasticsearchRealmSearchDAO implements
RealmSearchDAO {
return prefix;
}
- StringBuilder output = new StringBuilder();
- for (char c : keyword.toLowerCase().toCharArray()) {
- if (c == '%') {
- output.append(".*");
- } else if (Character.isLetter(c)) {
- output.append('[').
- append(c).
- append(Character.toUpperCase(c)).
- append(']');
- } else {
- output.append(ElasticsearchUtils.escapeForLikeRegex(c));
- }
- }
-
return new Query.Builder().bool(QueryBuilders.bool().filter(
prefix,
- new Query.Builder().regexp(QueryBuilders.regexp().
- field("name").value(output.toString()).build()).
- build()).build()).
+ new Query.Builder().wildcard(QueryBuilders.wildcard().
+ field("name").value(keyword.replace('%',
'*').replace("\\_", "_")).
+ caseInsensitive(true).build()).build()).build()).
build();
}
@@ -241,7 +227,7 @@ public class ElasticsearchRealmSearchDAO implements
RealmSearchDAO {
public List<String> findDescendants(final String base, final String
prefix) {
Query prefixQuery = new
Query.Builder().disMax(QueryBuilders.disMax().queries(
new Query.Builder().term(QueryBuilders.term().
- field("fullPath").value(prefix).build()).build(),
+
field("fullPath").value(prefix).caseInsensitive(false).build()).build(),
new Query.Builder().prefix(QueryBuilders.prefix().
field("fullPath").value(SyncopeConstants.ROOT_REALM.equals(prefix) ? "/" :
prefix + "/").
build()).build()).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 15b985a0a2..b4be738a7b 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
@@ -128,7 +128,8 @@ public class ElasticsearchAnySearchDAOTest {
searchDAO.getAdminRealmsFilter(root, true, adminRealms,
AnyTypeKind.USER);
assertThat(new Query.Builder().disMax(QueryBuilders.disMax().queries(
- new
Query.Builder().term(QueryBuilders.term().field("realm").value("rootKey").build()).
+ new
Query.Builder().term(QueryBuilders.term().caseInsensitive(false).
+
field("realm").value("rootKey").caseInsensitive(false).build()).
build()).build()).build()).
usingRecursiveComparison().isEqualTo(filter.getLeft().get());
assertEquals(Set.of(), filter.getMiddle());
@@ -196,7 +197,8 @@ public class ElasticsearchAnySearchDAOTest {
assertThat(
new Query.Builder().bool(QueryBuilders.bool().
filter(new
Query.Builder().exists(QueryBuilders.exists().field("_id").build()).build()).
- filter(new
Query.Builder().term(QueryBuilders.term().field("memberships").value("groupKey").
+ filter(new
Query.Builder().term(QueryBuilders.term().caseInsensitive(false).
+
field("memberships").value("groupKey").caseInsensitive(false).
build()).build()).build()).build()).
usingRecursiveComparison().
isEqualTo(request.query());
@@ -259,18 +261,18 @@ public class ElasticsearchAnySearchDAOTest {
assertEquals(6, ((BoolQuery) query._get()).filter().size());
assertThat(
new Query.Builder().bool(QueryBuilders.bool().
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("1").build()).build()).
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("2").build()).build()).
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("3").build()).build()).
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("4").build()).build()).
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("5").build()).build()).
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("6").build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("1").build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("2").build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("3").build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("4").build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("5").build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("6").build()).build()).
build()).build()).
usingRecursiveComparison().isEqualTo(query);
@@ -286,18 +288,18 @@ public class ElasticsearchAnySearchDAOTest {
assertEquals(6, ((DisMaxQuery) query._get()).queries().size());
assertThat(
new Query.Builder().disMax(QueryBuilders.disMax().
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("1").build()).build()).
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("2").build()).build()).
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("3").build()).build()).
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("4").build()).build()).
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("5").build()).build()).
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("6").build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("1").build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("2").build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("3").build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("4").build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("5").build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("6").build()).build()).
build()).build()).
usingRecursiveComparison().isEqualTo(query);
@@ -322,20 +324,26 @@ public class ElasticsearchAnySearchDAOTest {
assertThat(
new Query.Builder().bool(QueryBuilders.bool().
filter(new
Query.Builder().disMax(QueryBuilders.disMax().
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("1").build()).build()).
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("2").build()).build()).
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("3").build()).build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("1").build()).
+ build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("2").build()).
+ build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("3").build()).
+ build()).build()).
build()).
filter(new
Query.Builder().disMax(QueryBuilders.disMax().
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("4").build()).build()).
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("5").build()).build()).
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("6").build()).build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("4").build()).
+ build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("5").build()).
+ build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("6").build()).
+ build()).build()).
build()).
build()).build()).
usingRecursiveComparison().isEqualTo(query);
@@ -361,20 +369,26 @@ public class ElasticsearchAnySearchDAOTest {
assertThat(
new Query.Builder().disMax(QueryBuilders.disMax().
queries(new
Query.Builder().bool(QueryBuilders.bool().
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("1").build()).build()).
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("2").build()).build()).
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("3").build()).build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("1").build()).
+ build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("2").build()).
+ build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("3").build()).
+ build()).build()).
build()).
queries(new
Query.Builder().bool(QueryBuilders.bool().
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("4").build()).build()).
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("5").build()).build()).
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value("6").build()).build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("4").build()).
+ build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("5").build()).
+ build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value("6").build()).
+ build()).build()).
build()).
build()).build()).
usingRecursiveComparison().isEqualTo(query);
diff --git
a/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchIndexManager.java
b/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchIndexManager.java
index 99aae23a4e..eade997dbf 100644
---
a/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchIndexManager.java
+++
b/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchIndexManager.java
@@ -31,8 +31,6 @@ import
org.identityconnectors.framework.common.objects.SyncDeltaType;
import org.opensearch.client.opensearch.OpenSearchClient;
import org.opensearch.client.opensearch._types.OpenSearchException;
import org.opensearch.client.opensearch._types.Refresh;
-import org.opensearch.client.opensearch._types.analysis.CustomNormalizer;
-import org.opensearch.client.opensearch._types.analysis.Normalizer;
import org.opensearch.client.opensearch._types.mapping.DynamicTemplate;
import org.opensearch.client.opensearch._types.mapping.KeywordProperty;
import org.opensearch.client.opensearch._types.mapping.Property;
@@ -100,14 +98,7 @@ public class OpenSearchIndexManager {
public IndexSettings defaultSettings() {
return new IndexSettings.Builder().
- analysis(new IndexSettingsAnalysis.Builder().
- normalizer("string_lowercase", new
Normalizer.Builder().
- custom(new CustomNormalizer.Builder().
- charFilter(List.of()).
- filter("lowercase").
- build()).
- build()).
- build()).
+ analysis(new IndexSettingsAnalysis.Builder().build()).
numberOfShards(numberOfShards).
numberOfReplicas(numberOfReplicas).
build();
@@ -120,7 +111,7 @@ public class OpenSearchIndexManager {
new DynamicTemplate.Builder().
matchMappingType("string").
mapping(new Property.Builder().
- keyword(new
KeywordProperty.Builder().normalizer("string_lowercase").build()).
+ keyword(new
KeywordProperty.Builder().build()).
build()).
build()))).
build();
@@ -133,7 +124,7 @@ public class OpenSearchIndexManager {
new DynamicTemplate.Builder().
matchMappingType("string").
mapping(new Property.Builder().
- keyword(new
KeywordProperty.Builder().normalizer("string_lowercase").build()).
+ keyword(new
KeywordProperty.Builder().build()).
build()).
build()))).
build();
@@ -146,7 +137,7 @@ public class OpenSearchIndexManager {
new DynamicTemplate.Builder().
matchMappingType("string").
mapping(new Property.Builder().
- keyword(new
KeywordProperty.Builder().normalizer("string_lowercase").build()).
+ keyword(new
KeywordProperty.Builder().build()).
build()).
build()))).
properties(
diff --git
a/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchUtils.java
b/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchUtils.java
index 10650a7ca3..8fb81e6bab 100644
---
a/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchUtils.java
+++
b/ext/opensearch/client-opensearch/src/main/java/org/apache/syncope/ext/opensearch/client/OpenSearchUtils.java
@@ -27,7 +27,6 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
-import org.apache.commons.lang3.ArrayUtils;
import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
import org.apache.syncope.core.persistence.api.dao.GroupDAO;
@@ -64,21 +63,6 @@ public class OpenSearchUtils {
return domain.toLowerCase() + "_audit";
}
- protected static final char[] ELASTICSEARCH_REGEX_CHARS = {
- '.', '?', '+', '*', '|', '{', '}', '[', ']', '(', ')', '"', '\\', '&'
};
-
- public static String escapeForLikeRegex(final char c) {
- StringBuilder output = new StringBuilder();
-
- if (ArrayUtils.contains(ELASTICSEARCH_REGEX_CHARS, c)) {
- output.append('\\');
- }
-
- output.append(c);
-
- return output.toString();
- }
-
protected final UserDAO userDAO;
protected final GroupDAO groupDAO;
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 f58cf9c3f7..647063d354 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
@@ -143,15 +143,15 @@ public class OpenSearchAnySearchDAO extends
AbstractAnySearchDAO {
realmSearchDAO.findDescendants(realm.getFullPath(),
base.getFullPath()).
forEach(descendant -> queries.add(
new Query.Builder().term(QueryBuilders.term().
-
field("realm").value(FieldValue.of(descendant)).build()).
+
field("realm").value(FieldValue.of(descendant)).caseInsensitive(false).build()).
build()));
} else {
dynRealmDAO.findById(realmPath).ifPresentOrElse(
dynRealm -> {
dynRealmKeys.add(dynRealm.getKey());
queries.add(new
Query.Builder().term(QueryBuilders.term().
-
field("dynRealm").value(FieldValue.of(dynRealm.getKey())).build()).
- build());
+
field("dynRealm").value(FieldValue.of(dynRealm.getKey())).
+
caseInsensitive(false).build()).build());
},
() -> LOG.warn("Ignoring invalid dynamic realm
{}", realmPath));
}
@@ -159,7 +159,7 @@ public class OpenSearchAnySearchDAO extends
AbstractAnySearchDAO {
} else {
if (adminRealms.stream().anyMatch(r ->
r.startsWith(base.getFullPath()))) {
queries.add(new Query.Builder().term(QueryBuilders.term().
-
field("realm").value(FieldValue.of(base.getKey())).build()).
+
field("realm").value(FieldValue.of(base.getKey())).caseInsensitive(false).build()).
build());
}
}
@@ -187,8 +187,8 @@ public class OpenSearchAnySearchDAO extends
AbstractAnySearchDAO {
query = new Query.Builder().bool(
QueryBuilders.bool().
filter(new
Query.Builder().term(QueryBuilders.term().
-
field("realm").value(FieldValue.of(base.getKey())).build()).
- build()).
+
field("realm").value(FieldValue.of(base.getKey())).caseInsensitive(false).
+ build()).build()).
filter(query).build()).
build();
}
@@ -434,14 +434,14 @@ public class OpenSearchAnySearchDAO extends
AbstractAnySearchDAO {
protected Query getQuery(final RelationshipTypeCond cond) {
return new Query.Builder().term(QueryBuilders.term().
-
field("relationshipTypes").value(FieldValue.of(cond.getRelationshipTypeKey())).build()).
- build();
+
field("relationshipTypes").value(FieldValue.of(cond.getRelationshipTypeKey())).
+ caseInsensitive(false).build()).build();
}
protected Query getQuery(final RelationshipCond cond) {
List<Query> queries = check(cond).stream().
map(key -> new Query.Builder().term(QueryBuilders.term().
- field("relationships").value(FieldValue.of(key)).build()).
+
field("relationships").value(FieldValue.of(key)).caseInsensitive(false).build()).
build()).toList();
return queries.size() == 1
@@ -452,7 +452,7 @@ public class OpenSearchAnySearchDAO extends
AbstractAnySearchDAO {
protected Query getQuery(final MembershipCond cond) {
List<Query> queries = check(cond).stream().
map(key -> new Query.Builder().term(QueryBuilders.term().
- field("memberships").value(FieldValue.of(key)).build()).
+
field("memberships").value(FieldValue.of(key)).caseInsensitive(false).build()).
build()).toList();
return queries.size() == 1
@@ -462,20 +462,20 @@ public class OpenSearchAnySearchDAO extends
AbstractAnySearchDAO {
protected Query getQuery(final RoleCond cond) {
return new Query.Builder().term(QueryBuilders.term().
- field("roles").value(FieldValue.of(cond.getRole())).build()).
+
field("roles").value(FieldValue.of(cond.getRole())).caseInsensitive(false).build()).
build();
}
protected Query getQuery(final DynRealmCond cond) {
return new Query.Builder().term(QueryBuilders.term().
-
field("dynRealms").value(FieldValue.of(cond.getDynRealm())).build()).
+
field("dynRealms").value(FieldValue.of(cond.getDynRealm())).caseInsensitive(false).build()).
build();
}
protected Query getQuery(final MemberCond cond) {
List<Query> queries = check(cond).stream().
map(key -> new Query.Builder().term(QueryBuilders.term().
- field("members").value(FieldValue.of(key)).build()).
+
field("members").value(FieldValue.of(key)).caseInsensitive(false).build()).
build()).toList();
return queries.size() == 1
@@ -485,13 +485,13 @@ public class OpenSearchAnySearchDAO extends
AbstractAnySearchDAO {
protected Query getQuery(final AuxClassCond cond) {
return new Query.Builder().term(QueryBuilders.term().
-
field("auxClasses").value(FieldValue.of(cond.getAuxClass())).build()).
+
field("auxClasses").value(FieldValue.of(cond.getAuxClass())).caseInsensitive(false).build()).
build();
}
protected Query getQuery(final ResourceCond cond) {
return new Query.Builder().term(QueryBuilders.term().
-
field("resources").value(FieldValue.of(cond.getResource())).build()).
+
field("resources").value(FieldValue.of(cond.getResource())).caseInsensitive(false).build()).
build();
}
@@ -518,33 +518,21 @@ public class OpenSearchAnySearchDAO extends
AbstractAnySearchDAO {
break;
case ILIKE:
- StringBuilder output = new StringBuilder();
- for (char c :
cond.getExpression().toLowerCase().replace("\\_", "_").toCharArray()) {
- if (c == '%') {
- output.append(".*");
- } else if (Character.isLetter(c)) {
- output.append('[').
- append(c).
- append(Character.toUpperCase(c)).
- append(']');
- } else {
- output.append(OpenSearchUtils.escapeForLikeRegex(c));
- }
- }
- query = new Query.Builder().regexp(QueryBuilders.regexp().
-
field(schema.getKey()).value(output.toString()).build()).build();
+ query = new Query.Builder().wildcard(QueryBuilders.wildcard().
+
field(schema.getKey()).value(cond.getExpression().replace('%',
'*').replace("\\_", "_")).
+ caseInsensitive(true).build()).build();
break;
case LIKE:
query = new Query.Builder().wildcard(QueryBuilders.wildcard().
field(schema.getKey()).value(cond.getExpression().replace('%',
'*').replace("\\_", "_")).
- build()).build();
+ caseInsensitive(false).build()).build();
break;
case IEQ:
- query = new Query.Builder().match(QueryBuilders.match().
-
field(schema.getKey()).query(FieldValue.of(cond.getExpression().toLowerCase())).build()).
- build();
+ query = new Query.Builder().term(QueryBuilders.term().
+
field(schema.getKey()).value(FieldValue.of(cond.getExpression())).caseInsensitive(true).
+ build()).build();
break;
case EQ:
@@ -559,7 +547,7 @@ public class OpenSearchAnySearchDAO extends
AbstractAnySearchDAO {
fieldValue = FieldValue.of(value.toString());
}
query = new Query.Builder().term(QueryBuilders.term().
- field(schema.getKey()).value(fieldValue).build()).
+
field(schema.getKey()).value(fieldValue).caseInsensitive(false).build()).
build();
break;
diff --git
a/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchRealmSearchDAO.java
b/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchRealmSearchDAO.java
index 77cf5f3022..c9b359196f 100644
---
a/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchRealmSearchDAO.java
+++
b/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchRealmSearchDAO.java
@@ -93,7 +93,7 @@ public class OpenSearchRealmSearchDAO implements
RealmSearchDAO {
index(OpenSearchUtils.getRealmIndex(AuthContextUtils.getDomain())).
searchType(SearchType.QueryThenFetch).
query(new Query.Builder().term(QueryBuilders.term().
-
field("fullPath").value(FieldValue.of(fullPath)).build()).build()).
+
field("fullPath").value(FieldValue.of(fullPath)).caseInsensitive(false).build()).build()).
size(1).
fields(List.of()).source(new
SourceConfig.Builder().fetch(false).build()).
build();
@@ -135,7 +135,7 @@ public class OpenSearchRealmSearchDAO implements
RealmSearchDAO {
public List<Realm> findByName(final String name) {
List<String> result = search(
new Query.Builder().term(QueryBuilders.term().
-
field("name").value(FieldValue.of(name)).build()).build());
+
field("name").value(FieldValue.of(name)).caseInsensitive(false).build()).build());
return result.stream().map(realmDAO::findById).
flatMap(Optional::stream).map(Realm.class::cast).toList();
}
@@ -144,7 +144,8 @@ public class OpenSearchRealmSearchDAO implements
RealmSearchDAO {
public List<Realm> findChildren(final Realm realm) {
List<String> result = search(
new Query.Builder().term(QueryBuilders.term().
-
field("parent_id").value(FieldValue.of(realm.getKey())).build()).build());
+
field("parent_id").value(FieldValue.of(realm.getKey())).caseInsensitive(false).
+ build()).build());
return result.stream().map(realmDAO::findById).
flatMap(Optional::stream).map(Realm.class::cast).toList();
}
@@ -153,35 +154,22 @@ public class OpenSearchRealmSearchDAO implements
RealmSearchDAO {
List<Query> basesQueries = new ArrayList<>();
bases.forEach(base -> {
basesQueries.add(new Query.Builder().term(QueryBuilders.term().
-
field("fullPath").value(FieldValue.of(base)).build()).build());
+
field("fullPath").value(FieldValue.of(base)).caseInsensitive(false).build()).build());
basesQueries.add(new Query.Builder().regexp(QueryBuilders.regexp().
field("fullPath").value(SyncopeConstants.ROOT_REALM.equals(base) ? "/.*" : base
+ "/.*").
build()).build());
});
Query prefix = new
Query.Builder().disMax(QueryBuilders.disMax().queries(basesQueries).build()).build();
+
if (keyword == null) {
return prefix;
}
- StringBuilder output = new StringBuilder();
- for (char c : keyword.toLowerCase().toCharArray()) {
- if (c == '%') {
- output.append(".*");
- } else if (Character.isLetter(c)) {
- output.append('[').
- append(c).
- append(Character.toUpperCase(c)).
- append(']');
- } else {
- output.append(OpenSearchUtils.escapeForLikeRegex(c));
- }
- }
-
return new Query.Builder().bool(QueryBuilders.bool().filter(
prefix,
- new Query.Builder().regexp(QueryBuilders.regexp().
- field("name").value(output.toString()).build()).
- build()).build()).
+ new Query.Builder().wildcard(QueryBuilders.wildcard().
+ field("name").value(keyword.replace('%',
'*').replace("\\_", "_")).
+ caseInsensitive(true).build()).build()).build()).
build();
}
@@ -241,7 +229,7 @@ public class OpenSearchRealmSearchDAO implements
RealmSearchDAO {
public List<String> findDescendants(final String base, final String
prefix) {
Query prefixQuery = new
Query.Builder().disMax(QueryBuilders.disMax().queries(
new Query.Builder().term(QueryBuilders.term().
-
field("fullPath").value(FieldValue.of(prefix)).build()).build(),
+
field("fullPath").value(FieldValue.of(prefix)).caseInsensitive(false).build()).build(),
new Query.Builder().prefix(QueryBuilders.prefix().
field("fullPath").value(SyncopeConstants.ROOT_REALM.equals(prefix) ? "/" :
prefix + "/").
build()).build()).build()).build();
@@ -259,6 +247,7 @@ public class OpenSearchRealmSearchDAO implements
RealmSearchDAO {
sort(REALM_SORT_OPTIONS).
fields(List.of()).source(new
SourceConfig.Builder().fetch(false).build()).
build();
+ LOG.debug("Search request: {}", request);
List<String> result = List.of();
try {
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 c8b9c6935c..fd33731b09 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
@@ -129,7 +129,8 @@ public class OpenSearchAnySearchDAOTest {
searchDAO.getAdminRealmsFilter(root, true, adminRealms,
AnyTypeKind.USER);
assertThat(new Query.Builder().disMax(QueryBuilders.disMax().queries(
- new
Query.Builder().term(QueryBuilders.term().field("realm").value(FieldValue.of("rootKey")).build()).
+ new
Query.Builder().term(QueryBuilders.term().caseInsensitive(false).
+
field("realm").value(FieldValue.of("rootKey")).caseInsensitive(false).build()).
build()).build()).build()).
usingRecursiveComparison().isEqualTo(filter.getLeft().get());
assertEquals(Set.of(), filter.getMiddle());
@@ -197,8 +198,9 @@ public class OpenSearchAnySearchDAOTest {
assertThat(
new Query.Builder().bool(QueryBuilders.bool().
filter(new
Query.Builder().exists(QueryBuilders.exists().field("_id").build()).build()).
- filter(new
Query.Builder().term(QueryBuilders.term().field("memberships").
-
value(FieldValue.of("groupKey")).build()).build()).build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().caseInsensitive(false).
+
field("memberships").value(FieldValue.of("groupKey")).caseInsensitive(false).
+ build()).build()).build()).build()).
usingRecursiveComparison().
isEqualTo(request.query());
}
@@ -260,18 +262,18 @@ public class OpenSearchAnySearchDAOTest {
assertEquals(6, ((BoolQuery) query._get()).filter().size());
assertThat(
new Query.Builder().bool(QueryBuilders.bool().
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value(FieldValue.of("1")).build()).build()).
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value(FieldValue.of("2")).build()).build()).
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value(FieldValue.of("3")).build()).build()).
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value(FieldValue.of("4")).build()).build()).
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value(FieldValue.of("5")).build()).build()).
- filter(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value(FieldValue.of("6")).build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("1")).build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("2")).build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("3")).build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("4")).build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("5")).build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("6")).build()).build()).
build()).build()).
usingRecursiveComparison().isEqualTo(query);
@@ -287,18 +289,18 @@ public class OpenSearchAnySearchDAOTest {
assertEquals(6, ((DisMaxQuery) query._get()).queries().size());
assertThat(
new Query.Builder().disMax(QueryBuilders.disMax().
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value(FieldValue.of("1")).build()).build()).
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value(FieldValue.of("2")).build()).build()).
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value(FieldValue.of("3")).build()).build()).
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value(FieldValue.of("4")).build()).build()).
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value(FieldValue.of("5")).build()).build()).
- queries(new Query.Builder().term(
-
QueryBuilders.term().field("_id").value(FieldValue.of("6")).build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("1")).build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("2")).build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("3")).build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("4")).build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("5")).build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("6")).build()).build()).
build()).build()).
usingRecursiveComparison().isEqualTo(query);
@@ -323,26 +325,26 @@ public class OpenSearchAnySearchDAOTest {
assertThat(
new Query.Builder().bool(QueryBuilders.bool().
filter(new
Query.Builder().disMax(QueryBuilders.disMax().
- queries(new Query.Builder().term(
- QueryBuilders.term().field("_id").
-
value(FieldValue.of("1")).build()).build()).
- queries(new Query.Builder().term(
- QueryBuilders.term().field("_id").
-
value(FieldValue.of("2")).build()).build()).
- queries(new Query.Builder().term(
- QueryBuilders.term().field("_id").
-
value(FieldValue.of("3")).build()).build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("1")).build()).
+ build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("2")).build()).
+ build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("3")).build()).
+ build()).build()).
build()).
filter(new
Query.Builder().disMax(QueryBuilders.disMax().
- queries(new Query.Builder().term(
- QueryBuilders.term().field("_id").
-
value(FieldValue.of("4")).build()).build()).
- queries(new Query.Builder().term(
- QueryBuilders.term().field("_id").
-
value(FieldValue.of("5")).build()).build()).
- queries(new Query.Builder().term(
- QueryBuilders.term().field("_id").
-
value(FieldValue.of("6")).build()).build()).build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("4")).build()).
+ build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("5")).build()).
+ build()).
+ queries(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("6")).build()).
+ build()).build()).
build()).
build()).build()).
usingRecursiveComparison().isEqualTo(query);
@@ -368,26 +370,26 @@ public class OpenSearchAnySearchDAOTest {
assertThat(
new Query.Builder().disMax(QueryBuilders.disMax().
queries(new
Query.Builder().bool(QueryBuilders.bool().
- filter(new Query.Builder().term(
- QueryBuilders.term().field("_id").
-
value(FieldValue.of("1")).build()).build()).
- filter(new Query.Builder().term(
- QueryBuilders.term().field("_id").
-
value(FieldValue.of("2")).build()).build()).
- filter(new Query.Builder().term(
- QueryBuilders.term().field("_id").
-
value(FieldValue.of("3")).build()).build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("1")).build()).
+ build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("2")).build()).
+ build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("3")).build()).
+ build()).build()).
build()).
queries(new
Query.Builder().bool(QueryBuilders.bool().
- filter(new Query.Builder().term(
- QueryBuilders.term().field("_id").
-
value(FieldValue.of("4")).build()).build()).
- filter(new Query.Builder().term(
- QueryBuilders.term().field("_id").
-
value(FieldValue.of("5")).build()).build()).
- filter(new Query.Builder().term(
- QueryBuilders.term().field("_id").
-
value(FieldValue.of("6")).build()).build()).build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("4")).build()).
+ build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("5")).build()).
+ build()).
+ filter(new
Query.Builder().term(QueryBuilders.term().
+
caseInsensitive(false).field("_id").value(FieldValue.of("6")).build()).
+ build()).build()).
build()).
build()).build()).
usingRecursiveComparison().isEqualTo(query);
diff --git
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
index afc5a1cb87..d24ff178dc 100644
---
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
+++
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
@@ -118,6 +118,32 @@ public class SearchITCase extends AbstractITCase {
assertNotNull(matchingUsers);
assertEquals(1, matchingUsers.getResult().size());
assertEquals("rossini",
matchingUsers.getResult().getFirst().getUsername());
+
+ matchingUsers = USER_SERVICE.search(
+ new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+ fiql(SyncopeClient.getUserSearchConditionBuilder().
+
is("username").equalTo("RoSsINI").query()).build());
+ assertTrue(matchingUsers.getResult().isEmpty());
+
+ matchingUsers = USER_SERVICE.search(
+ new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+ fiql(SyncopeClient.getUserSearchConditionBuilder().
+
is("username").equalTo("rossini").query()).build());
+ assertEquals(1, matchingUsers.getResult().size());
+ assertEquals("rossini",
matchingUsers.getResult().getFirst().getUsername());
+
+ matchingUsers = USER_SERVICE.search(
+ new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+ fiql(SyncopeClient.getUserSearchConditionBuilder().
+ is("fullname").equalTo("gioacchino
rossini").query()).build());
+ assertTrue(matchingUsers.getResult().isEmpty());
+
+ matchingUsers = USER_SERVICE.search(
+ new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+ fiql(SyncopeClient.getUserSearchConditionBuilder().
+ is("fullname").equalTo("Gioacchino
Rossini").query()).build());
+ assertEquals(1, matchingUsers.getResult().size());
+ assertEquals("rossini",
matchingUsers.getResult().getFirst().getUsername());
}
@Test