diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/AbstractCompositeEntitySearchManager.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/AbstractCompositeEntitySearchManager.java index 2420b060c763143c689986b371516e807c786505..449307a6a4a187379a962f53bb5864420bfbbbe2 100644 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/AbstractCompositeEntitySearchManager.java +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/AbstractCompositeEntitySearchManager.java @@ -92,45 +92,61 @@ public abstract class AbstractCompositeEntitySearchManager<CRITERIA extends Abst } final Set<Long> parentCriteriaIntermediateResults; + final Set<Long> containerCriteriaIntermediateResults; if (!parentsCriteria.isEmpty()) { - parentCriteriaIntermediateResults = Arrays.stream(IGetRelationshipIdExecutor.RelationshipType.values()) - .flatMap(relationshipType -> - { - final Collection<ISearchCriteria> filteredParentsCriteria = - getCriteriaByRelationshipType(parentsCriteria, relationshipType); - - // The parents criteria can be or not recursive, they are resolved by a recursive call - final Set<Long> finalParentIds = findFinalRelationshipIds(userId, authorisationInformation, - finalSearchOperator, filteredParentsCriteria, tableMapper); - final Set<Long> finalParentIdsFiltered = filterIDsByUserRights(userId, authorisationInformation, - finalParentIds); - return getChildrenIdsOf(finalParentIdsFiltered, tableMapper, - relationshipType).stream(); - - }).collect(Collectors.toSet()); + final Collection<ISearchCriteria> filteredParentsCriteria = + getCriteriaByRelationshipType(parentsCriteria, + IGetRelationshipIdExecutor.RelationshipType.PARENT_CHILD); + + if (!filteredParentsCriteria.isEmpty()) + { + final Set<Long> finalParentIds = findFinalRelationshipIds(userId, authorisationInformation, + finalSearchOperator, filteredParentsCriteria, tableMapper); + final Set<Long> finalParentIdsFiltered = filterIDsByUserRights(userId, authorisationInformation, + finalParentIds); + parentCriteriaIntermediateResults = getChildrenIdsOf(finalParentIdsFiltered, tableMapper, + IGetRelationshipIdExecutor.RelationshipType.PARENT_CHILD); + } else + { + parentCriteriaIntermediateResults = null; + } + + final Collection<ISearchCriteria> filteredContainersCriteria = + getCriteriaByRelationshipType(parentsCriteria, + IGetRelationshipIdExecutor.RelationshipType.CONTAINER_COMPONENT); + + if (!filteredContainersCriteria.isEmpty()) + { + final Set<Long> finalContainerIds = findFinalRelationshipIds(userId, authorisationInformation, + finalSearchOperator, filteredContainersCriteria, tableMapper); + final Set<Long> finalContainerIdsFiltered = filterIDsByUserRights(userId, authorisationInformation, + finalContainerIds); + containerCriteriaIntermediateResults = getChildrenIdsOf(finalContainerIdsFiltered, tableMapper, + IGetRelationshipIdExecutor.RelationshipType.CONTAINER_COMPONENT); + } else + { + containerCriteriaIntermediateResults = null; + } } else { parentCriteriaIntermediateResults = null; + containerCriteriaIntermediateResults = null; } final Set<Long> childrenCriteriaIntermediateResults; if (!childrenCriteria.isEmpty()) { - childrenCriteriaIntermediateResults = Arrays.stream(IGetRelationshipIdExecutor.RelationshipType.values()) - .flatMap(relationshipType -> - { - final Collection<ISearchCriteria> filteredChildrenCriteria = - getCriteriaByRelationshipType(childrenCriteria, relationshipType); - - // The children criteria can be or not recursive, they are resolved by a recursive call - final Set<Long> finalChildrenIds = findFinalRelationshipIds(userId, authorisationInformation, - finalSearchOperator, filteredChildrenCriteria, tableMapper); - final Set<Long> finalChildrenIdsFiltered = filterIDsByUserRights(userId, - authorisationInformation, finalChildrenIds); - return getParentsIdsOf(finalChildrenIdsFiltered, tableMapper, - relationshipType).stream(); - }).collect(Collectors.toSet()); + final Collection<ISearchCriteria> filteredChildrenCriteria = + getCriteriaByRelationshipType(childrenCriteria, + IGetRelationshipIdExecutor.RelationshipType.PARENT_CHILD); + + final Set<Long> finalChildrenIds = findFinalRelationshipIds(userId, authorisationInformation, + finalSearchOperator, filteredChildrenCriteria, tableMapper); + final Set<Long> finalChildrenIdsFiltered = filterIDsByUserRights(userId, + authorisationInformation, finalChildrenIds); + childrenCriteriaIntermediateResults = getParentsIdsOf(finalChildrenIdsFiltered, tableMapper, + IGetRelationshipIdExecutor.RelationshipType.PARENT_CHILD); } else { childrenCriteriaIntermediateResults = null; @@ -138,14 +154,20 @@ public abstract class AbstractCompositeEntitySearchManager<CRITERIA extends Abst // Reaching this point we have the intermediate results of all recursive queries final Set<Long> results; - if (containsValues(mainCriteriaIntermediateResults) || containsValues(parentCriteriaIntermediateResults) || - containsValues(childrenCriteriaIntermediateResults)) + if (containsValues(mainCriteriaIntermediateResults) || containsValues(parentCriteriaIntermediateResults) + || containsValues(containerCriteriaIntermediateResults) + || containsValues(childrenCriteriaIntermediateResults)) { // If we have results, we merge them results = mergeResults(finalSearchOperator, - mainCriteriaIntermediateResults != null ? Collections.singleton(mainCriteriaIntermediateResults) : Collections.emptySet(), - childrenCriteriaIntermediateResults != null ? Collections.singleton(childrenCriteriaIntermediateResults) : Collections.emptySet(), - parentCriteriaIntermediateResults != null ? Collections.singleton(parentCriteriaIntermediateResults) : Collections.emptySet()); + mainCriteriaIntermediateResults != null + ? Collections.singleton(mainCriteriaIntermediateResults) : Collections.emptySet(), + childrenCriteriaIntermediateResults != null + ? Collections.singleton(childrenCriteriaIntermediateResults) : Collections.emptySet(), + parentCriteriaIntermediateResults != null + ? Collections.singleton(parentCriteriaIntermediateResults) : Collections.emptySet(), + containerCriteriaIntermediateResults != null + ? Collections.singleton(containerCriteriaIntermediateResults) : Collections.emptySet()); } else if (mainCriteria.isEmpty() && parentsCriteria.isEmpty() && childrenCriteria.isEmpty()) { // If we don't have results and criteria are empty, return all. diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/SampleContainerSearchManager.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/SampleContainerSearchManager.java index f67306d7bd083536360b87154a89d5889947c92b..46933502c5b131afe791689d0f8ca8cd0e18a9f2 100644 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/SampleContainerSearchManager.java +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/SampleContainerSearchManager.java @@ -49,7 +49,7 @@ public class SampleContainerSearchManager extends AbstractCompositeEntitySearchM @Override protected Class<? extends AbstractCompositeSearchCriteria> getParentsSearchCriteriaClass() { - return SampleParentsSearchCriteria.class; + return null; } public Set<Long> searchForIDs(final Long userId, final AuthorisationInformation authorisationInformation, @@ -67,7 +67,7 @@ public class SampleContainerSearchManager extends AbstractCompositeEntitySearchM @Override protected Class<? extends AbstractCompositeSearchCriteria> getChildrenSearchCriteriaClass() { - return SampleChildrenSearchCriteria.class; + return null; } @Override