Skip to content
Snippets Groups Projects
Commit e625c4f5 authored by Robert Goldmann's avatar Robert Goldmann
Browse files

Fixed #682 - filter: transactions without tags are filtered if one tag is de-selected

parent 0317d0ba
No related branches found
No related tags found
No related merge requests found
...@@ -7,6 +7,7 @@ import org.springframework.data.jpa.domain.Specification; ...@@ -7,6 +7,7 @@ import org.springframework.data.jpa.domain.Specification;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Join; import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -99,13 +100,16 @@ public class TransactionSpecifications ...@@ -99,13 +100,16 @@ public class TransactionSpecifications
if(!tagIDs.isEmpty()) if(!tagIDs.isEmpty())
{ {
Join<Transaction, Tag> join = transaction.join(Transaction_.tags); Join<Transaction, Tag> join = transaction.join(Transaction_.tags, JoinType.LEFT);
Predicate tagPredicate = builder.disjunction(); Predicate tagPredicate = builder.disjunction();
for(Integer tagID : tagIDs) for(Integer tagID : tagIDs)
{ {
tagPredicate.getExpressions().add(builder.equal(join.get(Tag_.ID), tagID)); tagPredicate.getExpressions().add(builder.equal(join.get(Tag_.ID), tagID));
} }
// transactions without any tags should be included in results
tagPredicate.getExpressions().add(builder.isEmpty(transaction.get(Transaction_.tags)));
predicates.add(tagPredicate); predicates.add(tagPredicate);
transferPredicates.add(tagPredicate); transferPredicates.add(tagPredicate);
} }
......
...@@ -38,6 +38,7 @@ class TransactionSpecificationsTest ...@@ -38,6 +38,7 @@ class TransactionSpecificationsTest
private TransactionRepository transactionRepository; private TransactionRepository transactionRepository;
private Transaction transaction1; private Transaction transaction1;
private Transaction transaction2; private Transaction transaction2;
private Transaction transaction3;
private Transaction repeatingTransaction; private Transaction repeatingTransaction;
private Transaction transferTransaction; private Transaction transferTransaction;
private Transaction transferTransactionWrongAccount; private Transaction transferTransactionWrongAccount;
...@@ -102,6 +103,14 @@ class TransactionSpecificationsTest ...@@ -102,6 +103,14 @@ class TransactionSpecificationsTest
transaction2.setAccount(account); transaction2.setAccount(account);
transaction2 = transactionRepository.save(transaction2); transaction2 = transactionRepository.save(transaction2);
transaction3 = new Transaction();
transaction3.setName("Income without tags");
transaction3.setAmount(100);
transaction3.setDate(LocalDate.of(2018, 12, 3));
transaction3.setCategory(category2);
transaction3.setAccount(account);
transaction3 = transactionRepository.save(transaction3);
LocalDate repeatingTransactionDate = LocalDate.of(2018, 3, 13); LocalDate repeatingTransactionDate = LocalDate.of(2018, 3, 13);
repeatingOption = new RepeatingOption(); repeatingOption = new RepeatingOption();
repeatingOption.setModifier(new RepeatingModifierDays(10)); repeatingOption.setModifier(new RepeatingModifierDays(10));
...@@ -154,9 +163,10 @@ class TransactionSpecificationsTest ...@@ -154,9 +163,10 @@ class TransactionSpecificationsTest
Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, List.of(), List.of(), null); Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, List.of(), List.of(), null);
List<Transaction> results = transactionRepository.findAll(spec); List<Transaction> results = transactionRepository.findAll(spec);
assertThat(results).hasSize(4) assertThat(results).hasSize(5)
.contains(transaction1) .contains(transaction1)
.contains(transaction2) .contains(transaction2)
.contains(transaction3)
.contains(repeatingTransaction) .contains(repeatingTransaction)
.contains(transferTransaction); .contains(transferTransaction);
} }
...@@ -167,9 +177,10 @@ class TransactionSpecificationsTest ...@@ -167,9 +177,10 @@ class TransactionSpecificationsTest
Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, false, null, List.of(), List.of(), null); Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, false, null, List.of(), List.of(), null);
List<Transaction> results = transactionRepository.findAll(spec); List<Transaction> results = transactionRepository.findAll(spec);
assertThat(results).hasSize(3) assertThat(results).hasSize(4)
.contains(transaction1) .contains(transaction1)
.contains(transaction2) .contains(transaction2)
.contains(transaction3)
.contains(repeatingTransaction); .contains(repeatingTransaction);
} }
...@@ -179,8 +190,9 @@ class TransactionSpecificationsTest ...@@ -179,8 +190,9 @@ class TransactionSpecificationsTest
Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, false, false, null, List.of(), List.of(), null); Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, false, false, null, List.of(), List.of(), null);
List<Transaction> results = transactionRepository.findAll(spec); List<Transaction> results = transactionRepository.findAll(spec);
assertThat(results).hasSize(1) assertThat(results).hasSize(2)
.contains(transaction1); .contains(transaction1)
.contains(transaction3);
} }
@Test @Test
...@@ -210,9 +222,10 @@ class TransactionSpecificationsTest ...@@ -210,9 +222,10 @@ class TransactionSpecificationsTest
Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, false, false, false, null, List.of(), List.of(), null); Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, false, false, false, null, List.of(), List.of(), null);
List<Transaction> results = transactionRepository.findAll(spec); List<Transaction> results = transactionRepository.findAll(spec);
assertThat(results).hasSize(3) assertThat(results).hasSize(4)
.contains(transaction1) .contains(transaction1)
.contains(transaction2) .contains(transaction2)
.contains(transaction3)
.contains(repeatingTransaction); .contains(repeatingTransaction);
} }
...@@ -222,8 +235,9 @@ class TransactionSpecificationsTest ...@@ -222,8 +235,9 @@ class TransactionSpecificationsTest
Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, false, true, null, List.of(), List.of(), null); Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, false, true, null, List.of(), List.of(), null);
List<Transaction> results = transactionRepository.findAll(spec); List<Transaction> results = transactionRepository.findAll(spec);
assertThat(results).hasSize(1) assertThat(results).hasSize(2)
.contains(transaction1); .contains(transaction1)
.contains(transaction3);
} }
@Test @Test
...@@ -283,9 +297,10 @@ class TransactionSpecificationsTest ...@@ -283,9 +297,10 @@ class TransactionSpecificationsTest
Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, false, List.of(), List.of(), null); Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, false, List.of(), List.of(), null);
List<Transaction> results = transactionRepository.findAll(spec); List<Transaction> results = transactionRepository.findAll(spec);
assertThat(results).hasSize(3) assertThat(results).hasSize(4)
.contains(transaction1) .contains(transaction1)
.contains(transaction2) .contains(transaction2)
.contains(transaction3)
.contains(transferTransaction); .contains(transferTransaction);
} }
...@@ -352,8 +367,11 @@ class TransactionSpecificationsTest ...@@ -352,8 +367,11 @@ class TransactionSpecificationsTest
Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, List.of(), tagIDs, null); Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, List.of(), tagIDs, null);
List<Transaction> results = transactionRepository.findAll(spec); List<Transaction> results = transactionRepository.findAll(spec);
assertThat(results).hasSize(1) assertThat(results).hasSize(4)
.contains(transaction1); .contains(transaction1)
.contains(transaction2)
.contains(transaction3)
.contains(transferTransaction);
} }
@Test @Test
...@@ -366,9 +384,12 @@ class TransactionSpecificationsTest ...@@ -366,9 +384,12 @@ class TransactionSpecificationsTest
Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, List.of(), tagIDs, null); Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, List.of(), tagIDs, null);
List<Transaction> results = transactionRepository.findAll(spec); List<Transaction> results = transactionRepository.findAll(spec);
assertThat(results).hasSize(2) assertThat(results).hasSize(5)
.contains(transaction1) .contains(transaction1)
.contains(repeatingTransaction); .contains(transaction2)
.contains(transaction3)
.contains(repeatingTransaction)
.contains(transferTransaction);
} }
...@@ -381,7 +402,10 @@ class TransactionSpecificationsTest ...@@ -381,7 +402,10 @@ class TransactionSpecificationsTest
Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, List.of(), tagIDs, null); Specification spec = TransactionSpecifications.withDynamicQuery(startDate, LocalDate.now(), account, true, true, true, null, List.of(), tagIDs, null);
List<Transaction> results = transactionRepository.findAll(spec); List<Transaction> results = transactionRepository.findAll(spec);
assertThat(results).isEmpty(); assertThat(results).hasSize(3)
.contains(transaction2)
.contains(transaction3)
.contains(transferTransaction);
} }
@Test @Test
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment