Fix duplicate users on searching attributes with multiple entries

Closes #39246

Signed-off-by: koplas <pschwabauer@intevation.de>
This commit is contained in:
Paul Schwabauer 2025-04-28 19:35:37 +02:00 committed by GitHub
parent 4ed2e5f00d
commit 8f860c810e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 11 additions and 6 deletions

View File

@ -618,7 +618,7 @@ public class JpaUserProvider implements UserProvider, UserCredentialStore, JpaUs
CriteriaQuery<Long> queryBuilder = builder.createQuery(Long.class);
Root<UserEntity> root = queryBuilder.from(UserEntity.class);
queryBuilder.select(builder.count(root));
queryBuilder.select(builder.countDistinct(root));
List<Predicate> predicates = new ArrayList<>();
@ -647,7 +647,7 @@ public class JpaUserProvider implements UserProvider, UserCredentialStore, JpaUs
Root<UserGroupMembershipEntity> groupMembership = queryBuilder.from(UserGroupMembershipEntity.class);
Join<UserGroupMembershipEntity, UserEntity> userJoin = groupMembership.join("user");
queryBuilder.select(builder.count(userJoin));
queryBuilder.select(builder.countDistinct(userJoin));
List<Predicate> predicates = new ArrayList<>();
@ -669,7 +669,7 @@ public class JpaUserProvider implements UserProvider, UserCredentialStore, JpaUs
CriteriaBuilder qb = em.getCriteriaBuilder();
CriteriaQuery<Long> userQuery = qb.createQuery(Long.class);
Root<UserEntity> from = userQuery.from(UserEntity.class);
Expression<Long> count = qb.count(from);
Expression<Long> count = qb.countDistinct(from);
userQuery = userQuery.select(count);
List<Predicate> restrictions = predicates(params, from, Map.of());
@ -694,7 +694,7 @@ public class JpaUserProvider implements UserProvider, UserCredentialStore, JpaUs
CriteriaQuery<Long> countQuery = cb.createQuery(Long.class);
Root<UserEntity> root = countQuery.from(UserEntity.class);
countQuery.select(cb.count(root));
countQuery.select(cb.countDistinct(root));
List<Predicate> restrictions = predicates(params, root, Map.of());
restrictions.add(cb.equal(root.get("realmId"), realm.getId()));
@ -808,7 +808,7 @@ public class JpaUserProvider implements UserProvider, UserCredentialStore, JpaUs
predicates.addAll(AdminPermissionsSchema.SCHEMA.applyAuthorizationFilters(session, AdminPermissionsSchema.USERS, this, realm, builder, queryBuilder, root));
queryBuilder.where(predicates.toArray(Predicate[]::new)).orderBy(builder.asc(root.get(UserModel.USERNAME)));
queryBuilder.distinct(true).where(predicates.toArray(Predicate[]::new)).orderBy(builder.asc(root.get(UserModel.USERNAME)));
TypedQuery<UserEntity> query = em.createQuery(queryBuilder);

View File

@ -782,7 +782,7 @@ public class UserTest extends AbstractAdminTest {
addAttribute(user, "test", Collections.singletonList("test" + i));
addAttribute(user, "test" + i, Collections.singletonList("test" + i));
addAttribute(user, "attr", Collections.singletonList("common"));
addAttribute(user, "attr", Arrays.asList("common", "common2"));
ids.add(createUser(user));
}
@ -819,6 +819,11 @@ public class UserTest extends AbstractAdminTest {
attributes = new HashMap<>();
attributes.put("attr", "common");
assertThat(realm.users().count(null, null, null, null, null, null, null, mapToSearchQuery(attributes)), is(9));
attributes = new HashMap<>();
attributes.put("attr", "common");
attributes.put(UserModel.EXACT, Boolean.FALSE.toString());
assertThat(realm.users().count(null, null, null, null, null, null, null, mapToSearchQuery(attributes)), is(9));
}
@Test