diff --git a/src/main/java/simpaths/data/filters/FemaleWithChildrenByAgeBandFilter.java b/src/main/java/simpaths/data/filters/FemaleWithChildrenByAgeBandFilter.java deleted file mode 100644 index 938cb6461..000000000 --- a/src/main/java/simpaths/data/filters/FemaleWithChildrenByAgeBandFilter.java +++ /dev/null @@ -1,31 +0,0 @@ -//package simpaths.data.filters; -// -//import org.apache.commons.collections.Predicate; -// -//import simpaths.model.Person; -//import simpaths.model.enums.Gender; -//import simpaths.model.enums.Indicator; -// -//public class FemaleWithChildrenByAgeBandFilter implements Predicate { -// -// private int ageFrom; -// private int ageTo; -// -// public FemaleWithChildrenByAgeBandFilter(int ageFrom, int ageTo) { -// super(); -// this.ageFrom = ageFrom; -// this.ageTo = ageTo; -// } -// -// @Override -// public boolean evaluate(Object object) { -// Person agent = (Person) object; -// -// return ( (agent.getGender().equals(Gender.Female)) && -// ( agent.getHousehold().getD_children_3under().equals(Indicator.True) || agent.getHousehold().getD_children_4_12().equals(Indicator.True) ) && -// ( agent.getAge() >= ageFrom ) && //Inclusive -// ( agent.getAge() < ageTo ) //Exclusive -// ); -// } -// -//} diff --git a/src/main/java/simpaths/data/filters/FemalesWithChildrenByChildAgeCSfilter.java b/src/main/java/simpaths/data/filters/FemalesWithChildrenByChildAgeCSfilter.java index 43675b540..46f05b628 100644 --- a/src/main/java/simpaths/data/filters/FemalesWithChildrenByChildAgeCSfilter.java +++ b/src/main/java/simpaths/data/filters/FemalesWithChildrenByChildAgeCSfilter.java @@ -1,72 +1,22 @@ package simpaths.data.filters; import simpaths.model.Person; -import simpaths.model.enums.Gender; import microsim.statistics.ICollectionFilter; -import java.util.Arrays; -import java.util.Set; +import java.util.function.Predicate; -public class FemalesWithChildrenByChildAgeCSfilter implements ICollectionFilter{ +/// Filter women aged 20 to 65, with at least one child in the given age range. +public class FemalesWithChildrenByChildAgeCSfilter implements ICollectionFilter { - private int ageFrom; - private int ageTo; + private Predicate checks; - public FemalesWithChildrenByChildAgeCSfilter(int ageFrom, int ageTo) { - super(); - this.ageFrom = ageFrom; - this.ageTo = ageTo; - } + public FemalesWithChildrenByChildAgeCSfilter(int ageFrom, int ageTo) { + this.checks = Filters.female() + .and(Filters.ageRange(20, 65)) + .and(Filters.hasChildInAgeRange(ageFrom, ageTo)); + } - - - public boolean isFiltered(Object object) { - Person person = (Person) object; - -// int minAge = 99; -// int maxAge = -1; - - Set childrenInBU = person.getBenefitUnit().getChildren(); - int[] ages = new int[childrenInBU.size()]; - if (childrenInBU != null) { - int arrayPosition = 0; - for (Person child : childrenInBU) { - ages[arrayPosition] = child.getDemAge(); - } - } - - int minAge = -1; - int maxAge = 99; - - if (ages.length > 0) { - minAge = Arrays.stream(ages).min().getAsInt(); - maxAge = Arrays.stream(ages).max().getAsInt(); - } - - -/* - Set childrenInBU = person.getBenefitUnit().getChildren(); - if (childrenInBU != null) { - for (Person child : childrenInBU) { - int age = child.getDemAge(); - if (age < minAge) { - minAge = age; - } - if (age > maxAge) { - maxAge = age; - } - } - } else { - minAge = -1; - maxAge = 99; - } -*/ - - return ( person.getDemMaleFlag().equals(Gender.Female) && - person.getDemAge() >= 20 && person.getDemAge() <= 65 && - (minAge >= ageFrom && maxAge <= ageTo) - ); - } - + public boolean isFiltered(Object object) { + return this.checks.test((Person) object); + } } - diff --git a/src/main/java/simpaths/data/filters/Filters.java b/src/main/java/simpaths/data/filters/Filters.java new file mode 100644 index 000000000..48db986e4 --- /dev/null +++ b/src/main/java/simpaths/data/filters/Filters.java @@ -0,0 +1,39 @@ +package simpaths.data.filters; + +import java.util.function.Predicate; + +import simpaths.model.Person; +import simpaths.model.enums.Gender; +import simpaths.model.enums.Indicator; + +/// Collection of [Person] filters. +public class Filters { + private Filters() { + } + + /// Filter the requested gender. + public static Predicate gender(Gender gender) { + return p -> p.getDemMaleFlag() == gender; + } + + /// Filter male persons. + public static Predicate male() { + return gender(Gender.Male); + } + + /// Filter female persons. + public static Predicate female() { + return gender(Gender.Female); + } + + /// Filter given age range (both ends are included). + public static Predicate ageRange(int from, int to) { + return p -> p.getDemAge() >= from && p.getDemAge() <= to; + } + + /// Filter persons with at least one child in the given age range (both + /// ends included). + public static Predicate hasChildInAgeRange(int from, int to) { + return p -> p.getBenefitUnit().getIndicatorChildren(from, to) == Indicator.True; + } +} diff --git a/src/main/java/simpaths/model/BenefitUnit.java b/src/main/java/simpaths/model/BenefitUnit.java index 99feab649..4a6817bfd 100644 --- a/src/main/java/simpaths/model/BenefitUnit.java +++ b/src/main/java/simpaths/model/BenefitUnit.java @@ -6,6 +6,7 @@ import microsim.data.db.PanelEntityKey; import org.hibernate.annotations.Fetch; +import simpaths.data.filters.Filters; import simpaths.data.ManagerRegressions; import simpaths.data.MultiValEvent; import simpaths.model.annotations.Lag; @@ -4130,16 +4131,13 @@ public int getNumberChildren(int minAge, int maxAge) { } return nChildren; } + + /// Whether the Person has children in the given age range (both ends included). public Indicator getIndicatorChildren(int minAge, int maxAge) { - Indicator flag = Indicator.False; - for (int aa=minAge; aa<=maxAge; aa++) { - if (getNumberChildrenByAge(aa) > 0) { - flag = Indicator.True; - break; - } - } - return flag; + var found = this.members.stream().anyMatch(Filters.ageRange(minAge, maxAge)); + return found ? Indicator.True : Indicator.False; } + public Indicator getIndicatorChildren0to3() { return getIndicatorChildren(0,3);