diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java index 0ae49d01e..fa763bf16 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java @@ -507,7 +507,7 @@ public class GenericResourceAllocation extends @Override public List querySuitableResources(IResourceDAO resourceDAO) { - return resourceDAO.findSatisfyingCriterionsAtSomePoint(getCriterions()); + return resourceDAO.findSatisfyingAllCriterionsAtSomePoint(getCriterions()); } public static Map> byCriterion( diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IResourceDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IResourceDAO.java index f4260f521..457687e15 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IResourceDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IResourceDAO.java @@ -60,12 +60,12 @@ public interface IResourceDAO extends IIntegrationEntityDAO { boolean limitingResource); /** - * Returns a list of {@link Resource} satisfying at least one criterion from criterions - * + * Returns a list of {@link Resource} satisfying all criteria at some point + * in time * @param criterions * @return */ - List findSatisfyingCriterionsAtSomePoint(Collection criterions); + List findSatisfyingAllCriterionsAtSomePoint(Collection criterions); /** * Returns all {@link Machine} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ResourceDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ResourceDAO.java index 9515d9a94..534b5f948 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ResourceDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/ResourceDAO.java @@ -92,14 +92,27 @@ public class ResourceDAO extends IntegrationEntityDAO implements } @Override - public List findSatisfyingCriterionsAtSomePoint( + public List findSatisfyingAllCriterionsAtSomePoint( Collection criterions) { Validate.notNull(criterions); Validate.noNullElements(criterions); if (criterions.isEmpty()) { return list(Resource.class); } - return findRelatedWithSomeOfTheCriterions(criterions); + return selectSatisfiyingAllAtSomePoint( + findRelatedWithSomeOfTheCriterions(criterions), criterions); + } + + private List selectSatisfiyingAllAtSomePoint( + List resources, + Collection criterions) { + List result = new ArrayList(); + for (Resource each : resources) { + if (each.satisfiesCriterionsAtSomePoint(criterions)) { + result.add(each); + } + } + return result; } @SuppressWarnings("unchecked") @@ -107,8 +120,8 @@ public class ResourceDAO extends IntegrationEntityDAO implements Collection criterions) { String strQuery = "SELECT DISTINCT resource " + "FROM Resource resource " - + "LEFT OUTER JOIN resource.criterionSatisfactions criterionSatisfactions " - + "LEFT OUTER JOIN criterionSatisfactions.criterion criterion " + + "JOIN resource.criterionSatisfactions criterionSatisfactions " + + "JOIN criterionSatisfactions.criterion criterion " + "WHERE criterion IN (:criterions)"; Query query = getSession().createQuery(strQuery); query.setParameterList("criterions", criterions); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java index 8fd9712d0..23c6b2dd6 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java @@ -44,6 +44,7 @@ import org.hibernate.validator.InvalidValue; import org.hibernate.validator.Valid; import org.joda.time.Days; import org.joda.time.LocalDate; +import org.navalplanner.business.calendars.entities.AvailabilityTimeLine; import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.calendars.entities.ICalendar; import org.navalplanner.business.calendars.entities.ResourceCalendar; @@ -54,6 +55,7 @@ import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.MultipleInstancesException; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.costcategories.entities.ResourcesCostCategoryAssignment; +import org.navalplanner.business.planner.entities.AvailabilityCalculator; import org.navalplanner.business.planner.entities.DayAssignment; import org.navalplanner.business.resources.daos.IResourceDAO; import org.navalplanner.business.scenarios.entities.Scenario; @@ -967,6 +969,13 @@ public abstract class Resource extends IntegrationEntity { return compositedCriterion.isSatisfiedBy(this); } + public boolean satisfiesCriterionsAtSomePoint( + Collection criterions) { + AvailabilityTimeLine availability = AvailabilityCalculator + .getCriterionsAvailabilityFor(criterions, this); + return !availability.getValidPeriods().isEmpty(); + } + @Valid public Set getResourcesCostCategoryAssignments() { return resourcesCostCategoryAssignments; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueueTaskGenerator.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueueTaskGenerator.java index 4b7b68a4e..bd3d7e07c 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueueTaskGenerator.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/QueueTaskGenerator.java @@ -99,7 +99,7 @@ abstract class QueueTaskGenerator { private List findResources(final Criterion criterion, final IResourceDAO resourcesDAO) { return resourcesDAO - .findSatisfyingCriterionsAtSomePoint(Collections + .findSatisfyingAllCriterionsAtSomePoint(Collections .singletonList(criterion)); } }; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/GenericAllocationRow.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/GenericAllocationRow.java index b7523bdca..70c14b18e 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/GenericAllocationRow.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/GenericAllocationRow.java @@ -71,7 +71,7 @@ public class GenericAllocationRow extends AllocationRow { .getNonConsolidatedResourcePerDay()); result.criterions = resourceAllocation.getCriterions(); - result.resources = resourceDAO.findSatisfyingCriterionsAtSomePoint(result.criterions); + result.resources = resourceDAO.findSatisfyingAllCriterionsAtSomePoint(result.criterions); result.setName(Criterion.getNames(result.criterions)); return result; } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java index 14c9e025a..f379c28dd 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/ResourceAllocationModel.java @@ -127,7 +127,7 @@ public class ResourceAllocationModel implements IResourceAllocationModel { for (AggregatedHoursGroup each : hoursGroups) { hours[i++] = each.getHours(); List resourcesFound = resourceDAO - .findSatisfyingCriterionsAtSomePoint(each.getCriterions()); + .findSatisfyingAllCriterionsAtSomePoint(each.getCriterions()); allocationRowsHandler.addGeneric(each.getCriterions(), reloadResources(resourcesFound), each.getHours()); } @@ -259,7 +259,7 @@ public class ResourceAllocationModel implements IResourceAllocationModel { List allSatisfyingCriterions; if (!requiredCriterions.isEmpty()) { allSatisfyingCriterions = resourceDAO - .findSatisfyingCriterionsAtSomePoint(requiredCriterions); + .findSatisfyingAllCriterionsAtSomePoint(requiredCriterions); } else { allSatisfyingCriterions = new ArrayList(); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/LoadPeriodGenerator.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/LoadPeriodGenerator.java index 6b385e56e..f25d94566 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/LoadPeriodGenerator.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/LoadPeriodGenerator.java @@ -103,7 +103,7 @@ abstract class LoadPeriodGenerator { private List findResources(final Criterion criterion, final IResourceDAO resourcesDAO) { return resourcesDAO - .findSatisfyingCriterionsAtSomePoint(Collections + .findSatisfyingAllCriterionsAtSomePoint(Collections .singletonList(criterion)); } }; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java index 4b623094b..513e1ce2c 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resourceload/ResourceLoadModel.java @@ -919,7 +919,7 @@ public class ResourceLoadModel implements IResourceLoadModel { } else { resources =resourcesDAO - .findSatisfyingCriterionsAtSomePoint(criteriaToShow()); + .findSatisfyingAllCriterionsAtSomePoint(criteriaToShow()); } for (Resource resource : resources) { resourcesDAO.reattach(resource); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/search/ResourceSearchModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/search/ResourceSearchModel.java index 600ad2455..39e4b6d3f 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/search/ResourceSearchModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/search/ResourceSearchModel.java @@ -117,7 +117,7 @@ public class ResourceSearchModel implements IResourceSearchModel { List criteria, boolean limitingResource) { Set result = new HashSet(); for (Resource each : resourceDAO - .findSatisfyingCriterionsAtSomePoint(criteria)) { + .findSatisfyingAllCriterionsAtSomePoint(criteria)) { if (each.isLimitingResource() == limitingResource) { result.add(each); }