diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/AbstractCompositeSearchCriteriaTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/AbstractCompositeSearchCriteriaTranslator.java index 5219d8fca325c3cd76ef23a5ab724840860110d3..013a9c92d0633c3eed13de2985dae581400bba78 100644 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/AbstractCompositeSearchCriteriaTranslator.java +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/AbstractCompositeSearchCriteriaTranslator.java @@ -73,6 +73,9 @@ public abstract class AbstractCompositeSearchCriteriaTranslator extends Abstract continue; } else { + for (DetailedSearchCriteria additionalCriteria: translationResult.getCriteriaList()) { + detailedCriterionList.addAll(additionalCriteria.getCriteria()); + } detailedCriterionList.addAll(translationResult.getCriterionList()); detailedSubCriteriaList.addAll(translationResult.getSubCriteriaList()); } diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/SampleSearchCriteriaTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/SampleSearchCriteriaTranslator.java index 06ee207a1ed10950051b40c8cfb15df2b4559036..b1af693ab96bab3a8d22a1ec8513ad3f12aad553 100644 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/SampleSearchCriteriaTranslator.java +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/SampleSearchCriteriaTranslator.java @@ -16,17 +16,25 @@ package ch.ethz.sis.openbis.generic.server.asapi.v3.translator.search; +import java.util.Collections; + import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria; import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.NoSampleContainerSearchCriteria; import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.NoSampleSearchCriteria; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.OnlyListableSeachCriteria; import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.SampleChildrenSearchCriteria; import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.SampleContainerSearchCriteria; import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.SampleParentsSearchCriteria; import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.SampleSearchCriteria; import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AssociatedEntityKind; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriterion; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchField; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchSubCriteria; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SimpleAttributeSearchFieldKind; +import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants; /** * @author pkupczyk @@ -42,7 +50,9 @@ public class SampleSearchCriteriaTranslator extends AbstractCompositeSearchCrite @Override protected boolean doAccepts(ISearchCriteria criteria) { - return criteria instanceof SampleSearchCriteria || criteria instanceof NoSampleSearchCriteria; + return criteria instanceof SampleSearchCriteria + || criteria instanceof NoSampleSearchCriteria + || criteria instanceof OnlyListableSeachCriteria; } @Override @@ -61,6 +71,13 @@ public class SampleSearchCriteriaTranslator extends AbstractCompositeSearchCrite } return new SearchCriteriaTranslationResult(new DetailedSearchSubCriteria(entityKind, null)); + } else if (criteria instanceof OnlyListableSeachCriteria) + { + SimpleAttributeSearchFieldKind attributeFieldKind = new SimpleAttributeSearchFieldKind(SearchFieldConstants.PREFIX_ENTITY_TYPE + SearchFieldConstants.IS_LISTABLE, "listable"); + DetailedSearchField createAttributeField = DetailedSearchField.createAttributeField(attributeFieldKind); + DetailedSearchCriterion criterion = new DetailedSearchCriterion(createAttributeField, "true"); + + return new SearchCriteriaTranslationResult(criterion); } else { context.pushEntityKind(EntityKind.SAMPLE); @@ -85,8 +102,7 @@ public class SampleSearchCriteriaTranslator extends AbstractCompositeSearchCrite } else if (criteria instanceof SampleSearchCriteria) { entityKind = AssociatedEntityKind.SAMPLE; - } else - { + } else { throw new IllegalArgumentException("Unknown criteria: " + criteria); } DetailedSearchSubCriteria subCriteria = new DetailedSearchSubCriteria(entityKind, translationResult.getCriteria()); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePE.java index bcbe50d40e358d1976d40d94828635f7c9ea6a33..67bc22581a494c5bf801973d397146e27a397220 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePE.java @@ -35,9 +35,14 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import org.apache.commons.lang.builder.ToStringBuilder; +import org.hibernate.search.annotations.Field; +import org.hibernate.search.annotations.Index; +import org.hibernate.search.annotations.Indexed; +import org.hibernate.search.annotations.Store; import org.hibernate.validator.constraints.Length; import ch.systemsx.cisd.openbis.generic.shared.IServer; +import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants; import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; /** @@ -50,6 +55,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; @Table(name = TableNames.SAMPLE_TYPES_TABLE, uniqueConstraints = { @UniqueConstraint(columnNames = { ColumnNames.CODE_COLUMN }) }) +@Indexed(index = "SampleTypePE") public final class SampleTypePE extends EntityTypePE { private static final long serialVersionUID = IServer.VERSION; @@ -117,6 +123,7 @@ public final class SampleTypePE extends EntityTypePE } @Column(name = ColumnNames.IS_LISTABLE) + @Field(index = Index.YES, store = Store.YES, name = SearchFieldConstants.IS_LISTABLE) public Boolean isListable() { return listable; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/SearchFieldConstants.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/SearchFieldConstants.java index 331ab685daec6607f9c6a533243ae08118220c05..b1c5d38a57d87f0d3eb54664e2f25ba3d237e880 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/SearchFieldConstants.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/SearchFieldConstants.java @@ -102,4 +102,6 @@ public final class SearchFieldConstants public static final String MODIFICATION_DATE = "modification_date"; public static final String ACCESS_DATE = "access_date"; + + public static final String IS_LISTABLE = "is_listable"; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/sample/search/OnlyListableSeachCriteria.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/sample/search/OnlyListableSeachCriteria.js new file mode 100644 index 0000000000000000000000000000000000000000..bce2d8624914cddf47988ddd741eb215887649a1 --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/sample/search/OnlyListableSeachCriteria.js @@ -0,0 +1,12 @@ +/** + * @author pkupczyk + */ +define([ "stjs", "as/dto/sample/search/AbstractCompositeSearchCriteria" ], function(stjs, AbstractCompositeSearchCriteria) { + var OnlyListableSeachCriteria = function() { + }; + stjs.extend(AbstractCompositeSearchCriteria, OnlyListableSeachCriteria, [ OnlyListableSeachCriteria ], function(constructor, prototype) { + prototype['@type'] = 'as.dto.sample.search.OnlyListableSeachCriteria'; + constructor.serialVersionUID = 1; + }, {}); + return OnlyListableSeachCriteria; +}) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/sample/search/SampleSearchCriteria.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/sample/search/SampleSearchCriteria.js index 62fcd50caf5b45ab7341cd2b7b7c69a8c530f89c..13d609c3518ffcdd929c91a29c3fe68a9750decf 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/sample/search/SampleSearchCriteria.js +++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/sample/search/SampleSearchCriteria.js @@ -3,7 +3,7 @@ */ define([ "require", "stjs", "as/dto/common/search/AbstractEntitySearchCriteria", "as/dto/common/search/SearchOperator", "as/dto/sample/search/SampleSearchRelation", "as/dto/space/search/SpaceSearchCriteria", "as/dto/experiment/search/ExperimentSearchCriteria", "as/dto/experiment/search/NoExperimentSearchCriteria", - "as/dto/sample/search/NoSampleContainerSearchCriteria" ], function(require, stjs, AbstractEntitySearchCriteria, SearchOperator, SampleSearchRelation) { + "as/dto/sample/search/NoSampleContainerSearchCriteria", "as/dto/sample/search/OnlyListableSeachCriteria" ], function(require, stjs, AbstractEntitySearchCriteria, SearchOperator, SampleSearchRelation) { var SampleSearchCriteria = function(relation) { AbstractEntitySearchCriteria.call(this); @@ -38,6 +38,10 @@ define([ "require", "stjs", "as/dto/common/search/AbstractEntitySearchCriteria", var NoSampleContainerSearchCriteria = require("as/dto/sample/search/NoSampleContainerSearchCriteria"); return this.addCriteria(new NoSampleContainerSearchCriteria()); }; + prototype.withListableOnly = function() { + var OnlyListableSeachCriteria = require("as/dto/sample/search/OnlyListableSeachCriteria"); + return this.addCriteria(new OnlyListableSeachCriteria()); + }; prototype.withOrOperator = function() { return this.withOperator(SearchOperator.OR); }; diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java index f924f14a5a23e3c73bf5aa2e2be4d35d4ec15b3f..507007ac1a7a7ef850eace8e5401ce97a9b5924f 100644 --- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java +++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java @@ -967,6 +967,56 @@ public class SearchSampleTest extends AbstractSampleTest v3api.logout(sessionToken); } + final String LISTED_ID = "/CISD/C1"; + final String UNLISTED_ID = "/CISD/CL1:A01"; + + @Test + public void testSearchListableOnlyShouldNotFindUnlisted() + { + + String sessionToken = v3api.login(TEST_USER, PASSWORD); + SampleFetchOptions fo = new SampleFetchOptions(); + + SampleSearchCriteria criteria = new SampleSearchCriteria(); + criteria.withId().thatEquals(new SampleIdentifier(UNLISTED_ID)); + + + List<Sample> samples = search(sessionToken, criteria, fo); + + assertEquals(samples.size(), 1); + + assertSampleIdentifiersInOrder(samples, UNLISTED_ID); + + criteria.withListableOnly(); + samples = search(sessionToken, criteria, fo); + assertEquals(samples.size(), 0); + } + + @Test + public void testSearchListableOnlyShouldFindListed() + { + + String sessionToken = v3api.login(TEST_USER, PASSWORD); + SampleFetchOptions fo = new SampleFetchOptions(); + fo.withType(); + fo.withProperties(); + + SampleSearchCriteria criteria = new SampleSearchCriteria(); + criteria.withId().thatEquals(new SampleIdentifier(LISTED_ID)); + + List<Sample> samples = search(sessionToken, criteria, fo); + + assertEquals(samples.size(), 1); + + assertEquals(samples.get(0).getIdentifier().getIdentifier(), LISTED_ID); + + criteria.withListableOnly(); + samples = search(sessionToken, criteria, fo); + assertEquals(samples.size(), 1); + + assertEquals(samples.get(0).getIdentifier().getIdentifier(), LISTED_ID); + } + private void testSearch(String user, SampleSearchCriteria criteria, String... expectedIdentifiers) { String sessionToken = v3api.login(user, PASSWORD);