From b132b6dabf2200639b93352ca64cbc1885616ba6 Mon Sep 17 00:00:00 2001 From: Andrea Patricelli Date: Fri, 5 Sep 2025 14:31:05 +0200 Subject: [PATCH 1/3] [SYNCOPE-1906] fixed order by also on unique attributes --- .../jpa/dao/MaJPAJSONAnySearchDAO.java | 30 ++++++++ .../jpa/dao/MyJPAJSONAnySearchDAO.java | 6 +- .../persistence/jpa/dao/JPAAnySearchDAO.java | 12 +++- .../persistence/jpa/inner/AnySearchTest.java | 13 ++++ .../syncope/fit/core/UserIssuesITCase.java | 69 ++++++++++++++----- 5 files changed, 106 insertions(+), 24 deletions(-) diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MaJPAJSONAnySearchDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MaJPAJSONAnySearchDAO.java index 00fcbdce4d9..7238fb5602f 100644 --- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MaJPAJSONAnySearchDAO.java +++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MaJPAJSONAnySearchDAO.java @@ -30,6 +30,7 @@ import org.apache.syncope.core.persistence.api.dao.RealmDAO; import org.apache.syncope.core.persistence.api.dao.UserDAO; import org.apache.syncope.core.persistence.api.dao.search.AttrCond; +import org.apache.syncope.core.persistence.api.dao.search.OrderByClause; import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory; import org.apache.syncope.core.persistence.api.entity.EntityFactory; import org.apache.syncope.core.persistence.api.entity.JSONPlainAttr; @@ -64,6 +65,35 @@ public MaJPAJSONAnySearchDAO( validator); } + @Override + protected void parseOrderByForPlainSchema( + final SearchSupport svs, + final OrderBySupport obs, + final OrderBySupport.Item item, + final OrderByClause clause, + final PlainSchema schema, + final String fieldName) { + + // keep track of involvement of non-mandatory schemas in the order by clauses + obs.nonMandatorySchemas = !"true".equals(schema.getMandatoryCondition()); + + obs.views.add(svs.field()); + + item.select = new StringBuilder(). + append("( SELECT usa").append('.').append(key(schema.getType())). + append(" FROM ").append(schema.isUniqueConstraint() + ? svs.asSearchViewSupport().uniqueAttr().name + : svs.asSearchViewSupport().attr().name). + append(" usa WHERE usa.any_id = "). + append(defaultSV(svs).alias). + append(".any_id"). + append(" AND usa.schema_id ='").append(fieldName).append("'"). + append(" LIMIT 1"). + append(") AS ").append(fieldName).toString(); + item.where = "plainSchema = '" + fieldName + '\''; + item.orderBy = fieldName + ' ' + clause.getDirection().name(); + } + @Override protected AnySearchNode getQuery( final AttrCond cond, diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java index fe61bec6058..790e5d7faec 100644 --- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java +++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java @@ -80,9 +80,9 @@ protected void parseOrderByForPlainSchema( obs.views.add(svs.field()); - item.select = new StringBuilder().append("( SELECT usa"). - append('.'). - append((schema.isUniqueConstraint() ? "attrUniqueValue" : key(schema.getType()))). + item.select = new StringBuilder().append(schema.isUniqueConstraint() + ? "( SELECT JSON_UNQUOTE(JSON_EXTRACT(usa.attrUniqueValue, '$. " + key(schema.getType()) + "')) " + : "( SELECT usa." + key(schema.getType())). append(" FROM "). append(svs.field().name). append(" usa WHERE usa.any_id = "). diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java index 5ec0e795b76..ba0a7dda41e 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java @@ -995,9 +995,15 @@ protected void parseOrderByForPlainSchema( obs.views.add(svs.asSearchViewSupport().uniqueAttr()); item.select = new StringBuilder(). - append(svs.asSearchViewSupport().uniqueAttr().alias).append('.'). - append(key(schema.getType())). - append(" AS ").append(fieldName).toString(); + append("( SELECT usa").append('.').append(key(schema.getType())). + append(" FROM "). + append(svs.asSearchViewSupport().uniqueAttr().name). + append(" usa WHERE usa.any_id = "). + append(svs.asSearchViewSupport().uniqueAttr().alias). + append(".any_id"). + append(" AND usa.schema_id ='").append(fieldName).append("'"). + append(isOracle() ? " FETCH FIRST 1 ROWS ONLY " : " LIMIT 1"). + append(") AS ").append(fieldName).toString(); item.where = new StringBuilder(). append(svs.asSearchViewSupport().uniqueAttr().alias). append(".schema_id='").append(fieldName).append("'").toString(); diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java index 5f917efca47..d62d126cc3e 100644 --- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java +++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java @@ -1052,6 +1052,19 @@ public void issueSYNCOPE1906() { assertFalse(users.isEmpty()); assertEquals(2, users.size()); + + // order by unique attribute + OrderByClause orderByFullname = new OrderByClause(); + orderByFullname.setField("fullname"); + orderByFullname.setDirection(OrderByClause.Direction.DESC); + + users = searchDAO.search(SearchCond.getLeaf(idCond), List.of(orderByFullname), AnyTypeKind.USER); + + assertEquals("vivaldi", users.get(4).getUsername()); + assertEquals("puccini", users.get(3).getUsername()); + assertEquals("rossini", users.get(2).getUsername()); + assertEquals("verdi", users.get(1).getUsername()); + assertEquals("bellini", users.get(0).getUsername()); } private User addPlainAttr(final User user, final PlainSchema plainSchema, final String value) { diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java index 79d23ba03c9..4b4c9e865e8 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java @@ -1928,53 +1928,64 @@ public void issueSYNCOPE1894() { @Test public void issueSYNCOPE1906() { UserCR userCR = UserITCase.getUniqueSample("issuesyncope1906@syncope.apache.org"); - userCR.getPlainAttrs().removeIf(attr -> "ctype".equals(attr.getSchema())); + userCR.getPlainAttrs() + .removeIf(attr -> "ctype".equals(attr.getSchema()) || "fullname".equals(attr.getSchema())); userCR.getPlainAttrs().add(attr("ctype", "aa1")); + userCR.getPlainAttrs().add(attr("fullname", "aa1")); UserTO aa1 = createUser(userCR).getEntity(); userCR = UserITCase.getUniqueSample("issuesyncope1906@syncope.apache.org"); - userCR.getPlainAttrs().removeIf(attr -> "ctype".equals(attr.getSchema())); + userCR.getPlainAttrs() + .removeIf(attr -> "ctype".equals(attr.getSchema()) || "fullname".equals(attr.getSchema())); userCR.getPlainAttrs().add(attr("ctype", "aa2")); + userCR.getPlainAttrs().add(attr("fullname", "aa2")); UserTO aa2 = createUser(userCR).getEntity(); userCR = UserITCase.getUniqueSample("issuesyncope1906@syncope.apache.org"); - userCR.getPlainAttrs().removeIf(attr -> "ctype".equals(attr.getSchema())); + userCR.getPlainAttrs() + .removeIf(attr -> "ctype".equals(attr.getSchema()) || "fullname".equals(attr.getSchema())); userCR.getPlainAttrs().add(attr("ctype", "aa3")); + userCR.getPlainAttrs().add(attr("fullname", "aa3")); UserTO aa3 = createUser(userCR).getEntity(); userCR = UserITCase.getUniqueSample("issuesyncope1906@syncope.apache.org"); - userCR.getPlainAttrs().removeIf(attr -> "ctype".equals(attr.getSchema())); + userCR.getPlainAttrs() + .removeIf(attr -> "ctype".equals(attr.getSchema()) || "fullname".equals(attr.getSchema())); userCR.getPlainAttrs().add(attr("ctype", "aa4")); + userCR.getPlainAttrs().add(attr("fullname", "aa4")); UserTO aa4 = createUser(userCR).getEntity(); userCR = UserITCase.getUniqueSample("issuesyncope1906@syncope.apache.org"); - userCR.getPlainAttrs().removeIf(attr -> "ctype".equals(attr.getSchema())); + userCR.getPlainAttrs() + .removeIf(attr -> "ctype".equals(attr.getSchema()) || "fullname".equals(attr.getSchema())); userCR.getPlainAttrs().add(attr("ctype", "aa5")); + userCR.getPlainAttrs().add(attr("fullname", "aa5")); UserTO aa5 = createUser(userCR).getEntity(); // add also other users with valued ctype - userCR = UserITCase.getUniqueSample("issuesyncope1906@syncope.apache.org"); - userCR.getPlainAttrs().removeIf(attr -> "ctype".equals(attr.getSchema())); + userCR = UserITCase.getUniqueSample("actype@syncope.apache.org"); + userCR.getPlainAttrs() + .removeIf(attr -> "ctype".equals(attr.getSchema()) || "fullname".equals(attr.getSchema())); userCR.getPlainAttrs().add(attr("ctype", "a ctype")); - createUser(userCR).getEntity(); + userCR.getPlainAttrs().add(attr("fullname", "a fullname")); + createUser(userCR); - userCR = UserITCase.getUniqueSample("issuesyncope1906@syncope.apache.org"); - userCR.getPlainAttrs().removeIf(attr -> "ctype".equals(attr.getSchema())); + userCR = UserITCase.getUniqueSample("actypetwo@syncope.apache.org"); + userCR.getPlainAttrs() + .removeIf(attr -> "ctype".equals(attr.getSchema()) || "fullname".equals(attr.getSchema())); userCR.getPlainAttrs().add(attr("ctype", "a ctype 2")); - createUser(userCR).getEntity(); + userCR.getPlainAttrs().add(attr("fullname", "a fullname 2")); + createUser(userCR); try { await().until(() -> USER_SERVICE.search(new AnyQuery.Builder().fiql( - SyncopeClient.getUserSearchConditionBuilder().is("ctype").equalTo("aa*").query()) + SyncopeClient.getUserSearchConditionBuilder().is("email").equalTo("*issuesyncope1906*") + .query()) .size(0) .page(1) - .orderBy("ctype DESC") .build()).getTotalCount() == 5); List users = USER_SERVICE.search(new AnyQuery.Builder().fiql( - SyncopeClient.getUserSearchConditionBuilder().is("ctype").equalTo("aa*").query()) - .size(10) - .page(1) - .orderBy("ctype DESC") - .build()).getResult(); + SyncopeClient.getUserSearchConditionBuilder().is("email").equalTo("*issuesyncope1906*") + .query()).size(10).page(1).orderBy("ctype DESC").build()).getResult(); assertEquals(5, users.size()); @@ -1983,6 +1994,28 @@ public void issueSYNCOPE1906() { assertEquals(aa3.getUsername(), users.get(2).getUsername()); assertEquals(aa4.getUsername(), users.get(1).getUsername()); assertEquals(aa5.getUsername(), users.get(0).getUsername()); + + users = USER_SERVICE.search(new AnyQuery.Builder().fiql( + SyncopeClient.getUserSearchConditionBuilder().is("email").equalTo("*issuesyncope1906*") + .query()).size(10).page(1).orderBy("ctype ASC").build()).getResult(); + + assertEquals(aa5.getUsername(), users.get(4).getUsername()); + assertEquals(aa4.getUsername(), users.get(3).getUsername()); + assertEquals(aa3.getUsername(), users.get(2).getUsername()); + assertEquals(aa2.getUsername(), users.get(1).getUsername()); + assertEquals(aa1.getUsername(), users.get(0).getUsername()); + + // order by unique attribute + users = USER_SERVICE.search(new AnyQuery.Builder().fiql( + SyncopeClient.getUserSearchConditionBuilder().is("email").equalTo("*issuesyncope1906*") + .query()).size(10).page(1).orderBy("fullname ASC").build()).getResult(); + + assertEquals(aa5.getUsername(), users.get(4).getUsername()); + assertEquals(aa4.getUsername(), users.get(3).getUsername()); + assertEquals(aa3.getUsername(), users.get(2).getUsername()); + assertEquals(aa2.getUsername(), users.get(1).getUsername()); + assertEquals(aa1.getUsername(), users.get(0).getUsername()); + } finally { USER_SERVICE.search(new AnyQuery.Builder().fiql( SyncopeClient.getUserSearchConditionBuilder().is("ctype").equalTo("aa*").query()) From de4a8d5c8c762dc82ac338a63f3af1f544d4dc89 Mon Sep 17 00:00:00 2001 From: Andrea Patricelli Date: Tue, 9 Sep 2025 16:39:15 +0200 Subject: [PATCH 2/3] fix checkstyle --- .../syncope/core/persistence/jpa/inner/AnySearchTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java index d62d126cc3e..e49f0d6abab 100644 --- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java +++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java @@ -1057,7 +1057,7 @@ public void issueSYNCOPE1906() { OrderByClause orderByFullname = new OrderByClause(); orderByFullname.setField("fullname"); orderByFullname.setDirection(OrderByClause.Direction.DESC); - + users = searchDAO.search(SearchCond.getLeaf(idCond), List.of(orderByFullname), AnyTypeKind.USER); assertEquals("vivaldi", users.get(4).getUsername()); From 8f040ed03677568afc214f49194a19d2f4e69ebb Mon Sep 17 00:00:00 2001 From: Andrea Patricelli Date: Wed, 10 Sep 2025 08:43:22 +0200 Subject: [PATCH 3/3] fixes checkstyle --- .../syncope/fit/core/UserIssuesITCase.java | 70 +++++-------------- 1 file changed, 19 insertions(+), 51 deletions(-) diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java index 4b4c9e865e8..b142ec2c29c 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java @@ -1573,20 +1573,13 @@ public void issueSYNCOPE1472() { // 2. remove resources, auxiliary classes and roles userUR.getResources().clear(); - userUR.getResources().add(new StringPatchItem.Builder() - .value(RESOURCE_NAME_TESTDB) - .operation(PatchOperation.DELETE) - .build()); + userUR.getResources().add(new StringPatchItem.Builder().value(RESOURCE_NAME_TESTDB) + .operation(PatchOperation.DELETE).build()); userUR.getAuxClasses().clear(); - userUR.getAuxClasses().add(new StringPatchItem.Builder() - .value("csv") - .operation(PatchOperation.DELETE) + userUR.getAuxClasses().add(new StringPatchItem.Builder().value("csv").operation(PatchOperation.DELETE) .build()); userUR.getRoles().clear(); - userUR.getRoles().add(new StringPatchItem.Builder() - .value("Other") - .operation(PatchOperation.DELETE) - .build()); + userUR.getRoles().add(new StringPatchItem.Builder().value("Other").operation(PatchOperation.DELETE).build()); updateUser(userUR); UserTO userTO = USER_SERVICE.read("1417acbe-cbf6-4277-9372-e75e04f97000"); @@ -1603,8 +1596,7 @@ public void issueSYNCOPE1699() throws Exception { req.setUsername(new StringReplacePatchItem.Builder().value("newUsername" + getUUIDString()).build()); WebClient webClient = WebClient.create(ADDRESS + "/users/" + userTO.getKey(), ADMIN_UNAME, ADMIN_PWD, null). - accept(MediaType.APPLICATION_JSON_TYPE). - type(MediaType.APPLICATION_JSON_TYPE); + accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE); Response response = webClient.invoke(HttpMethod.PATCH, JSON_MAPPER.writeValueAsString(req)); assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); @@ -1736,10 +1728,7 @@ void issueSYNCOPE1818() { // 2. pull users from resource-db-pull ExecTO execution = AbstractTaskITCase.execProvisioningTask(TASK_SERVICE, - TaskType.PULL, - "7c2242f4-14af-4ab5-af31-cdae23783655", - MAX_WAIT_SECONDS, - false); + TaskType.PULL, "7c2242f4-14af-4ab5-af31-cdae23783655", MAX_WAIT_SECONDS, false); assertEquals("SUCCESS", execution.getStatus()); assertFalse(rossini.isSuspended()); assertEquals("active", rossini.getStatus()); @@ -1761,12 +1750,8 @@ void issueSYNCOPE1818() { + "'false' WHERE USERNAME = 'rossini'"); // 5. pull again rossini from resource-db-pull - execution = AbstractTaskITCase.execProvisioningTask( - TASK_SERVICE, - TaskType.PULL, - "7c2242f4-14af-4ab5-af31-cdae23783655", - MAX_WAIT_SECONDS, - false); + execution = AbstractTaskITCase.execProvisioningTask(TASK_SERVICE, TaskType.PULL, + "7c2242f4-14af-4ab5-af31-cdae23783655", MAX_WAIT_SECONDS, false); assertEquals("SUCCESS", execution.getStatus()); rossini = USER_SERVICE.read("rossini"); @@ -1785,11 +1770,7 @@ void issueSYNCOPE1818() { // 7. pull again rossini from resource-db-pull execution = AbstractTaskITCase.execProvisioningTask( - TASK_SERVICE, - TaskType.PULL, - "7c2242f4-14af-4ab5-af31-cdae23783655", - MAX_WAIT_SECONDS, - false); + TASK_SERVICE, TaskType.PULL, "7c2242f4-14af-4ab5-af31-cdae23783655", MAX_WAIT_SECONDS, false); assertEquals("SUCCESS", execution.getStatus()); rossini = USER_SERVICE.read("rossini"); @@ -1809,8 +1790,7 @@ void issueSYNCOPE1818() { } finally { // restore attributes and (if needed) status updateUser(new UserUR.Builder(rossini.getKey()). - plainAttrs( - attrAddReplacePatch("surname", "Rossini"), + plainAttrs(attrAddReplacePatch("surname", "Rossini"), new AttrPatch.Builder( new Attr.Builder("email").build()).operation(PatchOperation.DELETE).build()). resource(new StringPatchItem.Builder(). @@ -1846,16 +1826,12 @@ void issueSYNCOPE1853() { // 3. propagation tasks cleanup TASK_SERVICE.search(new TaskQuery.Builder(TaskType.PROPAGATION) - .anyTypeKind(AnyTypeKind.USER) - .resource(RESOURCE_NAME_LDAP) - .entityKey("c9b2dec2-00a7-4855-97c0-d854842b4b24") - .build()).getResult() + .anyTypeKind(AnyTypeKind.USER).resource(RESOURCE_NAME_LDAP) + .entityKey("c9b2dec2-00a7-4855-97c0-d854842b4b24").build()).getResult() .forEach(pt -> TASK_SERVICE.delete(TaskType.PROPAGATION, pt.getKey())); TASK_SERVICE.search(new TaskQuery.Builder(TaskType.PROPAGATION) - .anyTypeKind(AnyTypeKind.USER) - .resource(RESOURCE_NAME_LDAP) - .entityKey("b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee") - .build()).getResult() + .anyTypeKind(AnyTypeKind.USER).resource(RESOURCE_NAME_LDAP) + .entityKey("b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee").build()).getResult() .forEach(pt -> TASK_SERVICE.delete(TaskType.PROPAGATION, pt.getKey())); // 4. delete group cGroupForPropagation: no deprovision should be fired on bellini, since there is already @@ -1863,8 +1839,7 @@ void issueSYNCOPE1853() { GROUP_SERVICE.delete(cGroupForPropagation.getKey()); await().during(5, TimeUnit.SECONDS).atMost(MAX_WAIT_SECONDS, TimeUnit.SECONDS).until( () -> TASK_SERVICE.search(new TaskQuery.Builder(TaskType.PROPAGATION) - .anyTypeKind(AnyTypeKind.USER) - .resource(RESOURCE_NAME_LDAP) + .anyTypeKind(AnyTypeKind.USER).resource(RESOURCE_NAME_LDAP) .entityKey("c9b2dec2-00a7-4855-97c0-d854842b4b24").build()) .getResult().stream().map(PropagationTaskTO.class::cast) .collect(Collectors.toList()).stream().noneMatch(pt -> ResourceOperation.DELETE == pt. @@ -1872,8 +1847,7 @@ void issueSYNCOPE1853() { GROUP_SERVICE.delete(dGroupForPropagation.getKey()); await().atMost(MAX_WAIT_SECONDS, TimeUnit.SECONDS).until( () -> TASK_SERVICE.search(new TaskQuery.Builder(TaskType.PROPAGATION) - .anyTypeKind(AnyTypeKind.USER) - .resource(RESOURCE_NAME_LDAP) + .anyTypeKind(AnyTypeKind.USER).resource(RESOURCE_NAME_LDAP) .entityKey("b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee").build()) .getResult().stream().map(PropagationTaskTO.class::cast) .collect(Collectors.toList()).stream().anyMatch(pt -> ResourceOperation.DELETE == pt. @@ -1886,7 +1860,7 @@ public void issueSYNCOPE1894() { userWithDotSchema.setKey("user.testWithDot"); userWithDotSchema.setAnyTypeClass("minimal user"); SCHEMA_SERVICE.create(SchemaType.PLAIN, userWithDotSchema); - + ResourceTO ldap = RESOURCE_SERVICE.read(RESOURCE_NAME_LDAP); ldap.setKey("ldapWithDot"); @@ -1979,10 +1953,7 @@ public void issueSYNCOPE1906() { try { await().until(() -> USER_SERVICE.search(new AnyQuery.Builder().fiql( SyncopeClient.getUserSearchConditionBuilder().is("email").equalTo("*issuesyncope1906*") - .query()) - .size(0) - .page(1) - .build()).getTotalCount() == 5); + .query()).size(0).page(1).build()).getTotalCount() == 5); List users = USER_SERVICE.search(new AnyQuery.Builder().fiql( SyncopeClient.getUserSearchConditionBuilder().is("email").equalTo("*issuesyncope1906*") .query()).size(10).page(1).orderBy("ctype DESC").build()).getResult(); @@ -2019,10 +1990,7 @@ public void issueSYNCOPE1906() { } finally { USER_SERVICE.search(new AnyQuery.Builder().fiql( SyncopeClient.getUserSearchConditionBuilder().is("ctype").equalTo("aa*").query()) - .size(10) - .page(1) - .orderBy("ctype DESC") - .build()).getResult().forEach(u -> deleteUser(u.getKey())); + .size(10).page(1).orderBy("ctype DESC").build()).getResult().forEach(u -> deleteUser(u.getKey())); } } }