diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSearchSpecifications.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSearchSpecifications.java index f2ace4e2ea0d08d980c3b9c2c452eeaa70bbba18..0e4b5623cb267e8b6d3b7c13b780bd6e44fa9672 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSearchSpecifications.java +++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSearchSpecifications.java @@ -44,7 +44,7 @@ public class TransactionSearchSpecifications if(search.isSearchTags()) { - final Join<Transaction, Tag> tagJoin = transaction.join(Transaction_.tags, JoinType.LEFT); + Join<Transaction, Tag> tagJoin = transaction.join(Transaction_.tags, JoinType.LEFT); predicates.add(builder.like(builder.lower(tagJoin.get(Tag_.name).as(String.class)), pattern)); } @@ -52,9 +52,9 @@ public class TransactionSearchSpecifications Predicate predicatesCombined = builder.or(predicates.toArray(predicatesArray)); Predicate accountStatePredicate = transaction.get(Transaction_.account).get("accountState").in(getAllowedAccountStates(search)); - ; query.orderBy(builder.desc(transaction.get(Transaction_.date))); + query.distinct(true); return builder.and(accountStatePredicate, predicatesCombined); }; } diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java index ba11b5e4e5d7571cad29f7c386291f683e48b253..a8e028f04a3bbefe6ad095b24666d1c692b8dc6c 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java @@ -43,6 +43,7 @@ class TransactionSearchSpecificationsTest private Transaction repeatingTransaction; private Transaction transferTransaction; private Transaction transactionFromHiddenAccount; + private Transaction transactionWithMultipleTags; @Autowired private CategoryRepository categoryRepository; @@ -134,6 +135,15 @@ class TransactionSearchSpecificationsTest transactionFromHiddenAccount.setCategory(category2); transactionFromHiddenAccount.setAccount(accountHidden); transactionFromHiddenAccount = transactionRepository.save(transactionFromHiddenAccount); + + transactionWithMultipleTags = new Transaction(); + transactionWithMultipleTags.setName("I am the TagMaster"); + transactionWithMultipleTags.setAmount(-525); + transactionWithMultipleTags.setDate(new DateTime(2018, 11, 3, 12, 0, 0, 0)); + transactionWithMultipleTags.setCategory(category1); + transactionWithMultipleTags.setAccount(account); + transactionWithMultipleTags.setTags(List.of(tag1, tag2)); + transactionWithMultipleTags = transactionRepository.save(transactionWithMultipleTags); } @Test @@ -199,11 +209,12 @@ class TransactionSearchSpecificationsTest Specification spec = TransactionSearchSpecifications.withDynamicQuery(search); List<Transaction> results = transactionRepository.findAll(spec); - assertThat(results).hasSize(4) + assertThat(results).hasSize(5) .contains(transaction1) .contains(transaction2) .contains(repeatingTransaction) - .contains(transferTransaction); + .contains(transferTransaction) + .contains(transactionWithMultipleTags); } @Test @@ -213,10 +224,11 @@ class TransactionSearchSpecificationsTest Specification spec = TransactionSearchSpecifications.withDynamicQuery(search); List<Transaction> results = transactionRepository.findAll(spec); - assertThat(results).hasSize(3) + assertThat(results).hasSize(4) .contains(transaction1) .contains(repeatingTransaction) - .contains(transferTransaction); + .contains(transferTransaction) + .contains(transactionWithMultipleTags); } @Test @@ -246,8 +258,8 @@ class TransactionSearchSpecificationsTest Specification spec = TransactionSearchSpecifications.withDynamicQuery(search); List<Transaction> results = transactionRepository.findAll(spec); - assertThat(results).hasSize(1) - .contains(transaction1); + assertThat(results).hasSize(2) + .contains(transaction1, transactionWithMultipleTags); } @Test @@ -257,8 +269,8 @@ class TransactionSearchSpecificationsTest Specification spec = TransactionSearchSpecifications.withDynamicQuery(search); List<Transaction> results = transactionRepository.findAll(spec); - assertThat(results).hasSize(1) - .contains(transaction1); + assertThat(results).hasSize(2) + .contains(transaction1, transactionWithMultipleTags); } @Test @@ -280,4 +292,14 @@ class TransactionSearchSpecificationsTest List<Transaction> results = transactionRepository.findAll(spec); assertThat(results).containsExactly(transactionFromHiddenAccount); } + + @Test + void getMatches_AvoidDuplicatedEntriesIfSearchTextIsFoundInMultipleCriteria() + { + Search search = new Search("TagMaster", true, true, true, true, false, 0); + Specification spec = TransactionSearchSpecifications.withDynamicQuery(search); + + List<Transaction> results = transactionRepository.findAll(spec); + assertThat(results).containsExactly(transactionWithMultipleTags, repeatingTransaction); + } } \ No newline at end of file