This is an automated email from the ASF dual-hosted git repository.
victorromero pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git
The following commit(s) were added to refs/heads/develop by this push:
new 4bb5c02b19 FINERACT-2488: Fix duplicate results in
/api/v2/clients/search (#5485)
4bb5c02b19 is described below
commit 4bb5c02b19d71c1f5fc699c51d1e6ac5db2458e1
Author: Ralph Hopman <[email protected]>
AuthorDate: Sat Feb 14 20:05:13 2026 +0100
FINERACT-2488: Fix duplicate results in /api/v2/clients/search (#5485)
---
.../search/SearchingClientRepositoryImpl.java | 1 +
.../integrationtests/client/ClientSearchTest.java | 31 ++++++++++++++++++++++
2 files changed, 32 insertions(+)
diff --git
a/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/search/SearchingClientRepositoryImpl.java
b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/search/SearchingClientRepositoryImpl.java
index 94cf4e2dc0..fcfefb751d 100644
---
a/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/search/SearchingClientRepositoryImpl.java
+++
b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/search/SearchingClientRepositoryImpl.java
@@ -67,6 +67,7 @@ public class SearchingClientRepositoryImpl implements
SearchingClientRepository
Path<Office> office = root.get("office");
Specification<Client> spec = (r, q, builder) -> {
+ q.distinct(true);
Path<Office> o = r.get("office");
Join<Client, ClientIdentifier> identity = r.join("identifiers",
JoinType.LEFT);
diff --git
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ClientSearchTest.java
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ClientSearchTest.java
index eed2076d67..456d8d8721 100644
---
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ClientSearchTest.java
+++
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ClientSearchTest.java
@@ -36,6 +36,7 @@ import org.apache.fineract.client.models.PostOfficesResponse;
import org.apache.fineract.client.models.SortOrder;
import org.apache.fineract.integrationtests.common.ClientHelper;
import org.apache.fineract.integrationtests.common.Utils;
+import org.apache.fineract.integrationtests.common.system.CodeHelper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -271,6 +272,36 @@ public class ClientSearchTest extends IntegrationTest {
assertThat(result.getContent().get(0).getMobileNo()).isEqualTo(request1.getMobileNo());
}
+ @Test
+ public void
testClientSearchDoesNotDuplicateResults_WhenIdentifierHasMultipleMatches() {
+ // given
+ PostClientsRequest request =
ClientHelper.defaultClientCreationRequest();
+ PostClientsResponse clientResponse =
clientHelper.createClient(request);
+
+ Integer codeId = (Integer) CodeHelper.createCode(requestSpec,
responseSpec, Utils.randomStringGenerator("ClientIdentifierTest_", 6),
+ CodeHelper.RESPONSE_ID_ATTRIBUTE_NAME);
+ Integer documentTypeIdOne = CodeHelper.createCodeValue(requestSpec,
responseSpec, codeId,
+ Utils.randomStringGenerator("DocType_", 6), 1);
+ Integer documentTypeIdTwo = CodeHelper.createCodeValue(requestSpec,
responseSpec, codeId,
+ Utils.randomStringGenerator("DocType_", 6), 2);
+
+ String documentKeyToken = Utils.randomStringGenerator("DUP_ID_", 6);
+ PostClientsClientIdIdentifiersRequest identifierOne = new
PostClientsClientIdIdentifiersRequest()
+
.documentTypeId(documentTypeIdOne.longValue()).documentKey(documentKeyToken +
"_A").description("Test").status("Active");
+ PostClientsClientIdIdentifiersRequest identifierTwo = new
PostClientsClientIdIdentifiersRequest()
+
.documentTypeId(documentTypeIdTwo.longValue()).documentKey(documentKeyToken +
"_B").description("Test").status("Active");
+ clientHelper.createClientIdentifer(clientResponse.getClientId(),
identifierOne);
+ clientHelper.createClientIdentifer(clientResponse.getClientId(),
identifierTwo);
+
+ // when
+ PageClientSearchData result =
clientHelper.searchClients(documentKeyToken);
+
+ // then
+ assertThat(result.getTotalElements()).isEqualTo(1);
+ assertThat(result.getContent().size()).isEqualTo(1);
+
assertThat(result.getContent().get(0).getExternalId().getValue()).isEqualTo(request.getExternalId());
+ }
+
@Test
public void testClientSearchByLegalForm() {
// given