diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/search/NumberFieldSearchCriteriaTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/search/NumberFieldSearchCriteriaTranslator.java index 5796a8dd4b23f26b6acc9f43b8a685d35cf19463..ca77598c10ef927607dee8d9fa137baa9d7414d7 100644 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/search/NumberFieldSearchCriteriaTranslator.java +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/search/NumberFieldSearchCriteriaTranslator.java @@ -20,7 +20,12 @@ import ch.ethz.sis.openbis.generic.shared.api.v3.dto.search.AbstractNumberValue; import ch.ethz.sis.openbis.generic.shared.api.v3.dto.search.ISearchCriteria; import ch.ethz.sis.openbis.generic.shared.api.v3.dto.search.NumberEqualToValue; import ch.ethz.sis.openbis.generic.shared.api.v3.dto.search.NumberFieldSearchCriteria; +import ch.ethz.sis.openbis.generic.shared.api.v3.dto.search.NumberGreaterOrEqualToValue; +import ch.ethz.sis.openbis.generic.shared.api.v3.dto.search.NumberGreaterToValue; +import ch.ethz.sis.openbis.generic.shared.api.v3.dto.search.NumberLessOrEqualToValue; +import ch.ethz.sis.openbis.generic.shared.api.v3.dto.search.NumberLessToValue; import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CompareType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriterion; /** @@ -46,11 +51,27 @@ public class NumberFieldSearchCriteriaTranslator extends AbstractFieldSearchCrit NumberFieldSearchCriteria numberCriteria = (NumberFieldSearchCriteria) criteria; AbstractNumberValue valueObject = numberCriteria.getFieldValue(); - if (valueObject instanceof NumberEqualToValue) + if (valueObject instanceof NumberLessToValue) + { + NumberLessToValue lessToValue = (NumberLessToValue) valueObject; + return new SearchCriteriaTranslationResult(new DetailedSearchCriterion(getDetailedSearchField(context, numberCriteria), CompareType.LESS_THAN, lessToValue.getValue().toString(), null)); + } else if (valueObject instanceof NumberLessOrEqualToValue) + { + NumberLessOrEqualToValue lessOrEqualToValue = (NumberLessOrEqualToValue) valueObject; + return new SearchCriteriaTranslationResult(new DetailedSearchCriterion(getDetailedSearchField(context, numberCriteria), CompareType.LESS_THAN_OR_EQUAL, lessOrEqualToValue.getValue().toString(), null)); + } else if (valueObject instanceof NumberEqualToValue) { NumberEqualToValue equalToValue = (NumberEqualToValue) valueObject; return new SearchCriteriaTranslationResult(new DetailedSearchCriterion(getDetailedSearchField(context, numberCriteria), equalToValue.getValue() .toString())); + } else if (valueObject instanceof NumberGreaterOrEqualToValue) + { + NumberGreaterOrEqualToValue greaterOrEqualToValue = (NumberGreaterOrEqualToValue) valueObject; + return new SearchCriteriaTranslationResult(new DetailedSearchCriterion(getDetailedSearchField(context, numberCriteria), CompareType.MORE_THAN_OR_EQUAL, greaterOrEqualToValue.getValue().toString(), null)); + } else if (valueObject instanceof NumberGreaterToValue) + { + NumberGreaterToValue greaterToValue = (NumberGreaterToValue) valueObject; + return new SearchCriteriaTranslationResult(new DetailedSearchCriterion(getDetailedSearchField(context, numberCriteria), CompareType.MORE_THAN, greaterToValue.getValue().toString(), null)); } else { throw new IllegalArgumentException("Unknown number field value: " + valueObject); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DetailedQueryBuilder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DetailedQueryBuilder.java index 4be87ee392b581b5d5c54213e234d64ad60eafac..32dfc0395d2f1290785fab4a73665b32e96b13b5 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DetailedQueryBuilder.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DetailedQueryBuilder.java @@ -119,9 +119,24 @@ public class DetailedQueryBuilder fieldAnalyzer = new IgnoreCaseAnalyzer(); } else { - fieldPattern = - LuceneQueryBuilder.adaptQuery(criterion.getValue(), - useWildcardSearchMode); + switch(criterion.getType()) { + case LESS_THAN: + fieldPattern = "{*" + " TO " + criterion.getValue() + "}"; + break; + case LESS_THAN_OR_EQUAL: + fieldPattern = "[*" + " TO " + criterion.getValue() + "]"; + break; + case EQUALS: + fieldPattern = LuceneQueryBuilder.adaptQuery(criterion.getValue(), useWildcardSearchMode); + break; + case MORE_THAN_OR_EQUAL: + fieldPattern = "[" + criterion.getValue() + " TO " + "*]"; + break; + case MORE_THAN: + fieldPattern = "{" + criterion.getValue() + " TO " + "*}"; + break; + } + fieldAnalyzer = searchAnalyzer; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/CompareType.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/CompareType.java index 0a4822ede29c32699d41e1380a787792e6d59b73..1dc83931382a55e346da27be2c096af6a1aca165 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/CompareType.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/CompareType.java @@ -18,5 +18,5 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto; public enum CompareType { - LESS_THAN_OR_EQUAL, EQUALS, MORE_THAN_OR_EQUAL + LESS_THAN, LESS_THAN_OR_EQUAL, EQUALS, MORE_THAN_OR_EQUAL, MORE_THAN } diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchSampleTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchSampleTest.java index bc1b54e22aad650201f786b0e68ed047c02d3f2a..82d75e0d8091b3e5c9b716783b06f9a6251448b0 100644 --- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchSampleTest.java +++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchSampleTest.java @@ -840,6 +840,47 @@ public class SearchSampleTest extends AbstractSampleTest v3api.logout(sessionToken); } + + @Test + public void testSearchNumeric() + { + //SIZE: 4711 CODE: 3VCP7 + //SIZE: 123 CODE: CP-TEST-1 + //SIZE: 321 CODE: CP-TEST-2 + //SIZE: 666 CODE: CP-TEST-3 + + String sessionToken = v3api.login(TEST_USER, PASSWORD); + SampleFetchOptions sortByCodeFO = new SampleFetchOptions(); + sortByCodeFO.sortBy().code().asc(); + + //Less + SampleSearchCriteria criteriaL = new SampleSearchCriteria(); + criteriaL.withNumberProperty("SIZE").thatIsLessTo(321); + List<Sample> samplesL = search(sessionToken, criteriaL, sortByCodeFO); + assertSampleIdentifiersInOrder(samplesL, "/CISD/CP-TEST-1"); + + //Less or Equals + SampleSearchCriteria criteriaLOE = new SampleSearchCriteria(); + criteriaLOE.withNumberProperty("SIZE").thatIsLessOrEqualTo(321); + List<Sample> samplesLOE = search(sessionToken, criteriaLOE, sortByCodeFO); + assertSampleIdentifiersInOrder(samplesLOE, "/CISD/CP-TEST-1", "/CISD/CP-TEST-2"); + + //Greater or Equals + SampleSearchCriteria criteriaGOE = new SampleSearchCriteria(); + criteriaGOE.withNumberProperty("SIZE").thatIsGreaterOrEqualTo(321); + List<Sample> samplesGOE = search(sessionToken, criteriaGOE, sortByCodeFO); + assertSampleIdentifiersInOrder(samplesGOE, "/CISD/3VCP7", "/CISD/CP-TEST-2", "/CISD/CP-TEST-3"); + + //Greater + SampleSearchCriteria criteriaG = new SampleSearchCriteria(); + criteriaG.withNumberProperty("SIZE").thatIsGreaterTo(321); + List<Sample> samplesG = search(sessionToken, criteriaG, sortByCodeFO); + assertSampleIdentifiersInOrder(samplesG, "/CISD/3VCP7", "/CISD/CP-TEST-3"); + + v3api.logout(sessionToken); + } + + private void testSearch(String user, SampleSearchCriteria criteria, String... expectedIdentifiers) { String sessionToken = v3api.login(user, PASSWORD); @@ -855,12 +896,12 @@ public class SearchSampleTest extends AbstractSampleTest assertEquals(samples.size(), expectedCount); v3api.logout(sessionToken); } - + private List<Sample> search(String sessionToken, SampleSearchCriteria criteria, SampleFetchOptions fetchOptions) { SearchResult<Sample> searchResult = v3api.searchSamples(sessionToken, criteria, fetchOptions); return searchResult.getObjects(); } - + } diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/AbstractEntitySearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/AbstractEntitySearchCriteria.java index 8fd07a00e6f05358130b8a5bfd0beda85d93492c..848b0633486d2b2246916ab0362f189670fff6c7 100644 --- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/AbstractEntitySearchCriteria.java +++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/AbstractEntitySearchCriteria.java @@ -58,6 +58,11 @@ public class AbstractEntitySearchCriteria<ID extends IObjectId> extends Abstract return with(new TagSearchCriteria()); } + public NumberPropertySearchCriteria withNumberProperty(String propertyName) + { + return with(new NumberPropertySearchCriteria(propertyName)); + } + public StringPropertySearchCriteria withProperty(String propertyName) { return with(new StringPropertySearchCriteria(propertyName)); diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberFieldSearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberFieldSearchCriteria.java index 1ddfedd5e0102db5e011ad771a5d74d4135e806f..6a803a9a184f79945e381fae29b86da9db966693 100644 --- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberFieldSearchCriteria.java +++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberFieldSearchCriteria.java @@ -33,5 +33,24 @@ public class NumberFieldSearchCriteria extends AbstractFieldSearchCriteria<Abstr { setFieldValue(new NumberEqualToValue(number)); } + + public void thatIsLessTo(Number number) + { + setFieldValue(new NumberLessToValue(number)); + } + + public void thatIsLessOrEqualTo(Number number) + { + setFieldValue(new NumberLessOrEqualToValue(number)); + } + public void thatIsGreaterTo(Number number) + { + setFieldValue(new NumberGreaterToValue(number)); + } + + public void thatIsGreaterOrEqualTo(Number number) + { + setFieldValue(new NumberGreaterOrEqualToValue(number)); + } } \ No newline at end of file diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberGreaterOrEqualToValue.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberGreaterOrEqualToValue.java new file mode 100644 index 0000000000000000000000000000000000000000..6e0d3dffb8e3b6d7c8dea8a46edbb1dcd04a12b6 --- /dev/null +++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberGreaterOrEqualToValue.java @@ -0,0 +1,41 @@ +/* + * Copyright 2014 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.ethz.sis.openbis.generic.shared.api.v3.dto.search; + +import ch.systemsx.cisd.base.annotation.JsonObject; + +/** + * @author juanf + */ +@JsonObject("dto.search.NumberGreaterOrEqualToValue") +public class NumberGreaterOrEqualToValue extends AbstractNumberValue +{ + + private static final long serialVersionUID = 1L; + + public NumberGreaterOrEqualToValue(Number number) + { + super(number); + } + + @Override + public String toString() + { + return "greater or equal to '" + getValue() + "'"; + } + +} diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberGreaterToValue.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberGreaterToValue.java new file mode 100644 index 0000000000000000000000000000000000000000..c03ff6854327fa3dbe5b0a91d1923c9a9c362a39 --- /dev/null +++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberGreaterToValue.java @@ -0,0 +1,41 @@ +/* + * Copyright 2014 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.ethz.sis.openbis.generic.shared.api.v3.dto.search; + +import ch.systemsx.cisd.base.annotation.JsonObject; + +/** + * @author juanf + */ +@JsonObject("dto.search.NumberGreaterToValue") +public class NumberGreaterToValue extends AbstractNumberValue +{ + + private static final long serialVersionUID = 1L; + + public NumberGreaterToValue(Number number) + { + super(number); + } + + @Override + public String toString() + { + return "greater to '" + getValue() + "'"; + } + +} diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberLessOrEqualToValue.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberLessOrEqualToValue.java new file mode 100644 index 0000000000000000000000000000000000000000..7c4cb40f3b5b25b2fa851c25ffc8463ed6d3f9bb --- /dev/null +++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberLessOrEqualToValue.java @@ -0,0 +1,41 @@ +/* + * Copyright 2014 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.ethz.sis.openbis.generic.shared.api.v3.dto.search; + +import ch.systemsx.cisd.base.annotation.JsonObject; + +/** + * @author juanf + */ +@JsonObject("dto.search.NumberLessOrEqualToValue") +public class NumberLessOrEqualToValue extends AbstractNumberValue +{ + + private static final long serialVersionUID = 1L; + + public NumberLessOrEqualToValue(Number number) + { + super(number); + } + + @Override + public String toString() + { + return "less or equal to '" + getValue() + "'"; + } + +} diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberLessToValue.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberLessToValue.java new file mode 100644 index 0000000000000000000000000000000000000000..e2d593d8dce6c2bbe5ec0594af800220d4d26b61 --- /dev/null +++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/search/NumberLessToValue.java @@ -0,0 +1,41 @@ +/* + * Copyright 2014 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.ethz.sis.openbis.generic.shared.api.v3.dto.search; + +import ch.systemsx.cisd.base.annotation.JsonObject; + +/** + * @author juanf + */ +@JsonObject("dto.search.NumberLessToValue") +public class NumberLessToValue extends AbstractNumberValue +{ + + private static final long serialVersionUID = 1L; + + public NumberLessToValue(Number number) + { + super(number); + } + + @Override + public String toString() + { + return "less to '" + getValue() + "'"; + } + +}