diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/search/DateFieldSearchCriterionTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/search/DateFieldSearchCriterionTranslator.java index 348833d242c0d53c5694cd942b04955cf7245ff5..34cf348cecd0a004ea5d7a1295e7e7f18f5a6e8a 100644 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/search/DateFieldSearchCriterionTranslator.java +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/search/DateFieldSearchCriterionTranslator.java @@ -63,7 +63,7 @@ public class DateFieldSearchCriterionTranslator extends AbstractFieldSearchCrite DetailedSearchField detailedSearchField = getDetailedSearchField(context, dateCriterion); CompareType compareType = getCompareType(dateCriterion.getFieldValue()); String value = getValue(dateCriterion.getFieldValue()); - String timeZone = getTimeZone(dateCriterion.getTimeZone()); + String timeZone = getTimeZone(dateCriterion.getFieldValue(), dateCriterion.getTimeZone()); return new SearchCriterionTranslationResult(new DetailedSearchCriterion(detailedSearchField, compareType, value, timeZone)); } @@ -101,17 +101,23 @@ public class DateFieldSearchCriterionTranslator extends AbstractFieldSearchCrite } } - private String getTimeZone(ITimeZone timeZone) + private String getTimeZone(IDate value, ITimeZone timeZone) { - if (timeZone instanceof ServerTimeZone) - { - return DetailedSearchCriterion.SERVER_TIMEZONE; - } else if (timeZone instanceof TimeZone) + if (value instanceof AbstractDateValue) { - return String.valueOf(((TimeZone) timeZone).getHourOffset()); + if (timeZone instanceof ServerTimeZone) + { + return DetailedSearchCriterion.SERVER_TIMEZONE; + } else if (timeZone instanceof TimeZone) + { + return String.valueOf(((TimeZone) timeZone).getHourOffset()); + } else + { + throw new IllegalArgumentException("Unknown date field time zone: " + timeZone); + } } else { - throw new IllegalArgumentException("Unknown date field time zone: " + timeZone); + return String.valueOf(0); } } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculator.java index b91ad9d53799c958637f06be6e050a8b0d74946c..664d71fcf5e6ad14eed0049cdf966002b4def4cf 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculator.java @@ -49,12 +49,12 @@ public class DateRangeCalculator public DateRangeCalculator(String date, String timeZone, CompareType compareType) { lower = parseDate(date); + makeDateGMT(lower, timeZone); if (CompareType.EQUALS.equals(compareType)) { if (isDateWithTime(date)) { - makeDateGMT(lower, timeZone); lower = new Date(lower.getTime() - (lower.getTime() % DateUtils.MILLIS_PER_DAY)); } upper = new Date(lower.getTime() + DateUtils.MILLIS_PER_DAY); @@ -65,16 +65,11 @@ public class DateRangeCalculator upper = new Date(lower.getTime() + DateUtils.MILLIS_PER_DAY); } else { - makeDateGMT(lower, timeZone); upper = new Date(lower.getTime()); } lower = new Date(0); } else if (CompareType.MORE_THAN_OR_EQUAL.equals(compareType)) { - if (isDateWithTime(date)) - { - makeDateGMT(lower, timeZone); - } upper = new Date(Long.MAX_VALUE); } } diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchExperimentTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchExperimentTest.java index a9e7bec7a625b66243668bf7fb125dbaafe1f00d..aba068a403b5d43f2c531f2ae7110b8d2ecf17a7 100644 --- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchExperimentTest.java +++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchExperimentTest.java @@ -18,7 +18,9 @@ package ch.ethz.sis.openbis.systemtest.api.v3; import static org.testng.Assert.assertEquals; +import java.text.SimpleDateFormat; import java.util.List; +import java.util.TimeZone; import org.testng.annotations.Test; @@ -248,7 +250,7 @@ public class SearchExperimentTest extends AbstractExperimentTest } @Test - public void testSearchWithDatePropertyThatEquals() + public void testSearchWithDatePropertyThatEqualsWithString() { ExperimentSearchCriterion criterion = new ExperimentSearchCriterion(); criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatEquals("2009-02-08"); @@ -259,40 +261,109 @@ public class SearchExperimentTest extends AbstractExperimentTest testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2"); criterion = new ExperimentSearchCriterion(); - criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatEquals("2009-02-10"); + criterion.withDateProperty("PURCHASE_DATE").withTimeZone(2).thatEquals("2009-02-10"); + testSearch(TEST_USER, criterion, "/TEST-SPACE/NOE/EXP-TEST-2"); + } + + @Test + public void testSearchWithDatePropertyThatEqualsWithDate() throws Exception + { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + format.setTimeZone(TimeZone.getTimeZone("GMT")); + + ExperimentSearchCriterion criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").thatEquals(format.parse("2009-02-08 23:59")); + testSearch(TEST_USER, criterion, 0); + + criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").thatEquals(format.parse("2009-02-09 00:00")); + testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2"); + + criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").thatEquals(format.parse("2009-02-09 23:59")); + testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2"); + + criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").thatEquals(format.parse("2009-02-10 00:00")); testSearch(TEST_USER, criterion, 0); } @Test - public void testSearchWithDatePropertyThatIsEarlierThanOrEqualTo() + public void testSearchWithDatePropertyThatIsEarlierThanOrEqualToWithString() { ExperimentSearchCriterion criterion = new ExperimentSearchCriterion(); - criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsEarlierThanOrEqualTo("2009-02-09 08:59:59"); + criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsEarlierThanOrEqualTo("2009-02-08"); + testSearch(TEST_USER, criterion, 0); + + criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").withTimeZone(1).thatIsEarlierThanOrEqualTo("2009-02-09 09:00"); testSearch(TEST_USER, criterion, 0); criterion = new ExperimentSearchCriterion(); - criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsEarlierThanOrEqualTo("2009-02-09 09:00:00"); + criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsEarlierThanOrEqualTo("2009-02-09 09:00"); testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2"); criterion = new ExperimentSearchCriterion(); criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsEarlierThanOrEqualTo("2009-02-09"); testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2"); + + criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").withTimeZone(2).thatIsEarlierThanOrEqualTo("2009-02-09"); + testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2"); } @Test - public void testSearchWithDatePropertyThatIsLasterThanOrEqualTo() + public void testSearchWithDatePropertyThatEarlierThanOrEqualToWithDate() throws Exception { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + format.setTimeZone(TimeZone.getTimeZone("GMT")); + ExperimentSearchCriterion criterion = new ExperimentSearchCriterion(); - criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsLaterThanOrEqualTo("2009-02-09 23:00:01"); + criterion.withDateProperty("PURCHASE_DATE").thatIsEarlierThanOrEqualTo(format.parse("2009-02-09 08:59")); testSearch(TEST_USER, criterion, 0); criterion = new ExperimentSearchCriterion(); - criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsLaterThanOrEqualTo("2009-02-09 23:00:00"); - testSearch(TEST_USER, criterion, "/TEST-SPACE/NOE/EXP-TEST-2"); + criterion.withDateProperty("PURCHASE_DATE").thatIsEarlierThanOrEqualTo(format.parse("2009-02-09 09:00")); + testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2"); + + criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").thatIsEarlierThanOrEqualTo(format.parse("2009-02-09 23:00")); + testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2"); + } + + @Test + public void testSearchWithDatePropertyThatIsLaterThanOrEqualToWithString() + { + ExperimentSearchCriterion criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsLaterThanOrEqualTo("2009-02-10"); + testSearch(TEST_USER, criterion, 0); criterion = new ExperimentSearchCriterion(); criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsLaterThanOrEqualTo("2009-02-09"); testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2"); + + criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsLaterThanOrEqualTo("2009-02-08"); + testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2"); + } + + @Test + public void testSearchWithDatePropertyThatIsLaterThanOrEqualToWithDate() throws Exception + { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + format.setTimeZone(TimeZone.getTimeZone("GMT+1:00")); + + ExperimentSearchCriterion criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").thatIsLaterThanOrEqualTo(format.parse("2009-02-10 00:01")); + testSearch(TEST_USER, criterion, 0); + + criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").thatIsLaterThanOrEqualTo(format.parse("2009-02-10 00:00")); + testSearch(TEST_USER, criterion, "/TEST-SPACE/NOE/EXP-TEST-2"); + + criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").thatIsLaterThanOrEqualTo(format.parse("2009-02-09 10:00")); + testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2"); } @Test diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculatorTest.java index d6507050595a67f5939dcc09c1036d1dd78e2ff6..962ef36b400ec5824ac8289b37b691cb21731091 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculatorTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculatorTest.java @@ -54,21 +54,21 @@ public class DateRangeCalculatorTest public void testEqualToDateWithoutTimeWithPositiveTimeZoneOffset() { DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "+1", CompareType.EQUALS); - assertDates(calculator, "2014-11-14 00:00:00.000", "2014-11-15 00:00:00.000"); + assertDates(calculator, "2014-11-13 23:00:00.000", "2014-11-14 23:00:00.000"); } @Test public void testEqualToDateWithoutTimeWithNegativeTimeZoneOffset() { DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "-1", CompareType.EQUALS); - assertDates(calculator, "2014-11-14 00:00:00.000", "2014-11-15 00:00:00.000"); + assertDates(calculator, "2014-11-14 01:00:00.000", "2014-11-15 01:00:00.000"); } @Test public void testEqualToDateWithoutTimeWithServerTimeZoneOffset() { DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "server", CompareType.EQUALS); - assertDates(calculator, "2014-11-14 00:00:00.000", "2014-11-15 00:00:00.000"); + assertDates(calculator, "2014-11-13 23:00:00.000", "2014-11-14 23:00:00.000"); } @Test @@ -122,21 +122,21 @@ public class DateRangeCalculatorTest public void testLessThanOrEqualToDateWithoutTimeWithPositiveTimeZoneOffset() { DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "1", CompareType.LESS_THAN_OR_EQUAL); - assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-15 00:00:00.000"); + assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-14 23:00:00.000"); } @Test public void testLessThanOrEqualToDateWithoutTimeWithNegativeTimeZoneOffset() { DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "-1", CompareType.LESS_THAN_OR_EQUAL); - assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-15 00:00:00.000"); + assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-15 01:00:00.000"); } @Test public void testLessThanOrEqualToDateWithoutTimeWithServerTimeZoneOffset() { DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "server", CompareType.LESS_THAN_OR_EQUAL); - assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-15 00:00:00.000"); + assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-14 23:00:00.000"); } @Test @@ -184,21 +184,21 @@ public class DateRangeCalculatorTest public void testMoreThanOrEqualToDateWithoutTimeWithPositiveTimeZoneOffset() { DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "1", CompareType.MORE_THAN_OR_EQUAL); - assertDates(calculator, "2014-11-14 00:00:00.000", "292278994-08-17 07:12:55.807"); + assertDates(calculator, "2014-11-13 23:00:00.000", "292278994-08-17 07:12:55.807"); } @Test public void testMoreThanOrEqualToDateWithoutTimeWithNegativeTimeZoneOffset() { DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "-1", CompareType.MORE_THAN_OR_EQUAL); - assertDates(calculator, "2014-11-14 00:00:00.000", "292278994-08-17 07:12:55.807"); + assertDates(calculator, "2014-11-14 01:00:00.000", "292278994-08-17 07:12:55.807"); } @Test public void testMoreThanOrEqualToDateWithoutTimeWithServerTimeZoneOffset() { DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "server", CompareType.MORE_THAN_OR_EQUAL); - assertDates(calculator, "2014-11-14 00:00:00.000", "292278994-08-17 07:12:55.807"); + assertDates(calculator, "2014-11-13 23:00:00.000", "292278994-08-17 07:12:55.807"); } @Test