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 new file mode 100644 index 0000000000000000000000000000000000000000..b91ad9d53799c958637f06be6e050a8b0d74946c --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculator.java @@ -0,0 +1,161 @@ +/* + * Copyright 2014 ETH Zuerich, Scientific IT Services + * + * 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.systemsx.cisd.openbis.generic.server.dataaccess.db.search.detailed; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.TimeZone; + +import org.apache.commons.lang.time.DateUtils; + +import ch.systemsx.cisd.common.exceptions.UserFailureException; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CompareType; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriterion; + +/** + * @author pkupczyk + */ +public class DateRangeCalculator +{ + + private static final String FORMAT_WITHOUT_TIME = "y-M-d"; + + private static final String FORMAT_WITH_MINUTES = "y-M-d HH:mm"; + + private static final String FORMAT_WITH_SECONDS = "y-M-d HH:mm:ss"; + + private static final String[] DATE_FORMATS = { FORMAT_WITH_SECONDS, FORMAT_WITH_MINUTES, FORMAT_WITHOUT_TIME }; + + private Date upper; + + private Date lower; + + public DateRangeCalculator(String date, String timeZone, CompareType compareType) + { + lower = parseDate(date); + + 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); + } else if (CompareType.LESS_THAN_OR_EQUAL.equals(compareType)) + { + if (isDateWithoutTime(date)) + { + 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); + } + } + + public Date getLowerDate() + { + return lower; + } + + public Date getUpperDate() + { + return upper; + } + + private Date parseDate(String dateAsString) + { + for (String format : DATE_FORMATS) + { + Date date = parseDate(dateAsString, format); + if (date != null) + { + return date; + } + } + throw new UserFailureException("Couldn't parse date '" + dateAsString + + "'. It has to match one of the following formats: " + Arrays.asList(DATE_FORMATS)); + } + + private Date parseDate(String dateAsString, String formatAsString) + { + SimpleDateFormat format = new SimpleDateFormat(formatAsString); + format.setTimeZone(TimeZone.getTimeZone("GMT")); + + try + { + return format.parse(dateAsString); + } catch (ParseException ex) + { + return null; + } + } + + private void makeDateGMT(Date date, String timeZone) + { + int offset = getTimeZoneOffset(timeZone, date); + date.setTime(date.getTime() + offset); + } + + private int getTimeZoneOffset(String timeZone, Date date) + { + if (timeZone.equals(DetailedSearchCriterion.SERVER_TIMEZONE)) + { + return -TimeZone.getDefault().getOffset(date.getTime()); + } + + String offset = timeZone; + if (timeZone.startsWith("+")) + { + offset = timeZone.substring(1); + } else if (timeZone.equals("Z")) + { + offset = "0"; + } + + try + { + return (int) (-Double.parseDouble(offset) * DateUtils.MILLIS_PER_HOUR); + } catch (NumberFormatException e) + { + return 0; + } + } + + private boolean isDateWithTime(String dateAsString) + { + return parseDate(dateAsString, FORMAT_WITH_MINUTES) != null || parseDate(dateAsString, FORMAT_WITH_SECONDS) != null; + } + + private boolean isDateWithoutTime(String dateAsString) + { + return false == isDateWithTime(dateAsString); + } + +} 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 2c0843ec20c2f155450cdef3dcd09e937ba4d678..97030146d995b9cbfaa1fbb9b116a8aa5d55d60f 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 @@ -16,15 +16,12 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.detailed; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; -import java.util.Date; import java.util.EnumSet; import java.util.List; -import java.util.TimeZone; +import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.search.BooleanClause.Occur; @@ -59,8 +56,6 @@ import ch.systemsx.cisd.openbis.generic.shared.search.IgnoreCaseAnalyzer; */ public class DetailedQueryBuilder { - private static final String[] DATE_FORMATS = - { "y-M-d HH:mm:ss", "y-M-d HH:mm", "y-M-d" }; private final static Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, DetailedQueryBuilder.class); @@ -139,30 +134,16 @@ public class DetailedQueryBuilder resultQuery.add(luceneQuery, occureCondition); } else { - Date lower = parseDate(criterion.getValue()); - int offset = getTimeZoneOffset(criterion, lower); - - lower.setTime(lower.getTime() + offset); - Date upper = new Date(lower.getTime() + 24 * 3600 * 1000); - - switch (criterion.getType()) + if (false == StringUtils.isEmpty(criterion.getValue())) { - case EQUALS: - break; - case LESS_THAN_OR_EQUAL: - lower = new Date(0); - break; - case MORE_THAN_OR_EQUAL: - upper = new Date(Long.MAX_VALUE); - break; + DateRangeCalculator rangeCalculator = new DateRangeCalculator(criterion.getValue(), criterion.getTimeZone(), criterion.getType()); + String fieldName = fieldNames.get(0); + DateBridge bridge = new DateBridge(Resolution.SECOND); + TermRangeQuery q = + new TermRangeQuery(fieldName, bridge.objectToString(rangeCalculator.getLowerDate()), + bridge.objectToString(rangeCalculator.getUpperDate()), true, true); + resultQuery.add(q, occureCondition); } - - String fieldName = fieldNames.get(0); - DateBridge bridge = new DateBridge(Resolution.SECOND); - TermRangeQuery q = - new TermRangeQuery(fieldName, bridge.objectToString(lower), - bridge.objectToString(upper), true, true); - resultQuery.add(q, occureCondition); } } for (DetailedSearchAssociationCriteria association : associations) @@ -176,52 +157,6 @@ public class DetailedQueryBuilder return resultQuery; } - private int getTimeZoneOffset(DetailedSearchCriterion criterion, Date lower) - { - String tzs = criterion.getTimeZone(); - if (tzs.equals(DetailedSearchCriterion.SERVER_TIMEZONE)) - { - return -TimeZone.getDefault().getOffset(lower.getTime()); - } - - if (tzs.startsWith("+")) - { - tzs = tzs.substring(1); - } else if (tzs.equals("Z")) - { - tzs = "0"; - } - - int offset; - try - { - offset = (int) (-Double.parseDouble(tzs) * 3600000); - } catch (NumberFormatException e) - { - offset = 0; - } - return offset; - } - - private Date parseDate(String dateAsString) - { - for (String format : DATE_FORMATS) - { - SimpleDateFormat sdf = new SimpleDateFormat(format); - sdf.setTimeZone(TimeZone.getTimeZone("GMT")); - - try - { - return sdf.parse(dateAsString); - } catch (ParseException ex) - { - // ignore, try next format - } - } - throw new UserFailureException("Couldn't parse date '" + dateAsString - + "'. It has to match one of the following formats: " + Arrays.asList(DATE_FORMATS)); - } - private List<String> extractAssociationPatterns(DetailedSearchAssociationCriteria association) { List<String> result = new ArrayList<String>(); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityPropertyPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityPropertyPE.java index d3a117a9bb8519f4953998d8e5c670bba215f367..3e7ddec15659909d668e0616714ddfcd6b7f666b 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityPropertyPE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityPropertyPE.java @@ -16,6 +16,8 @@ package ch.systemsx.cisd.openbis.generic.shared.dto; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.Date; import javax.persistence.Column; @@ -33,17 +35,21 @@ import org.apache.lucene.document.Field; import org.hibernate.search.annotations.ClassBridge; import org.hibernate.search.annotations.Index; import org.hibernate.search.annotations.IndexedEmbedded; +import org.hibernate.search.annotations.Resolution; import org.hibernate.search.annotations.Store; import org.hibernate.search.bridge.FieldBridge; import org.hibernate.search.bridge.LuceneOptions; +import org.hibernate.search.bridge.builtin.DateBridge; import ch.systemsx.cisd.common.reflection.ClassUtils; import ch.systemsx.cisd.common.reflection.ModifiedShortPrefixToStringStyle; import ch.systemsx.cisd.openbis.generic.shared.IServer; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants; import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; import ch.systemsx.cisd.openbis.generic.shared.util.EqualsHashUtils; +import ch.systemsx.cisd.openbis.generic.shared.util.SimplePropertyValidator.SupportedDatePattern; /** * Persistence entity representing entity property. @@ -77,8 +83,8 @@ public abstract class EntityPropertyPE extends HibernateAbstractRegistrationHold private VocabularyTermPE vocabularyTerm; /** - * If the property is of MATERIAL, this field is not <code>null</code> and {@link #value} and - * {@link #vocabularyTerm} fields are set to <code>null</code>. + * If the property is of MATERIAL, this field is not <code>null</code> and {@link #value} and {@link #vocabularyTerm} fields are set to + * <code>null</code>. */ private MaterialPE material; @@ -97,20 +103,41 @@ public abstract class EntityPropertyPE extends HibernateAbstractRegistrationHold private Date modificationDate; /** - * This bridge allows to save in the search index not only the value of property, but also the - * corresponding property code. + * This bridge allows to save in the search index not only the value of property, but also the corresponding property code. */ public static class EntityPropertySearchBridge implements FieldBridge { + private static SimpleDateFormat dateFormat; + + static + { + dateFormat = new SimpleDateFormat(SupportedDatePattern.CANONICAL_DATE_PATTERN.getPattern()); + } + @Override public void set(String name, Object/* EntityPropertyPE */value, Document/* Lucene document */document, LuceneOptions luceneOptions) { EntityPropertyPE entityProperty = (EntityPropertyPE) value; + String fieldValue = entityProperty.tryGetUntypedValue(); String fieldPrefix = name; String fieldFullName = fieldPrefix + getPropertyFieldName(entityProperty); + + if (DataTypeCode.TIMESTAMP.equals(entityProperty.getEntityTypePropertyType().getPropertyType().getType().getCode())) + { + try + { + Date date = dateFormat.parse(fieldValue); + DateBridge dateBridge = new DateBridge(Resolution.SECOND); + fieldValue = dateBridge.objectToString(date); + } catch (ParseException e) + { + // leave the original value + } + } + Field field = new Field(fieldFullName, fieldValue, luceneOptions.getStore(), luceneOptions.getIndex()); @@ -228,9 +255,7 @@ public abstract class EntityPropertyPE extends HibernateAbstractRegistrationHold /** * Sets the <var>entity</var> of this property. * <p> - * <i>Do not use directly, instead, call - * {@link IEntityPropertiesHolder#addProperty(EntityPropertyPE)} with <code>this</code> - * object!</i> + * <i>Do not use directly, instead, call {@link IEntityPropertiesHolder#addProperty(EntityPropertyPE)} with <code>this</code> object!</i> */ void setEntity(final IEntityPropertiesHolder entity) { 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 f3f31bb77c3def4f39baedf97243321583709a6f..a9e7bec7a625b66243668bf7fb125dbaafe1f00d 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 @@ -247,6 +247,54 @@ public class SearchExperimentTest extends AbstractExperimentTest testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-1"); } + @Test + public void testSearchWithDatePropertyThatEquals() + { + ExperimentSearchCriterion criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatEquals("2009-02-08"); + testSearch(TEST_USER, criterion, 0); + + criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatEquals("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).thatEquals("2009-02-10"); + testSearch(TEST_USER, criterion, 0); + } + + @Test + public void testSearchWithDatePropertyThatIsEarlierThanOrEqualTo() + { + ExperimentSearchCriterion criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsEarlierThanOrEqualTo("2009-02-09 08:59:59"); + testSearch(TEST_USER, criterion, 0); + + criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsEarlierThanOrEqualTo("2009-02-09 09:00: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"); + } + + @Test + public void testSearchWithDatePropertyThatIsLasterThanOrEqualTo() + { + ExperimentSearchCriterion criterion = new ExperimentSearchCriterion(); + criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsLaterThanOrEqualTo("2009-02-09 23:00:01"); + 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 = 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"); + } + @Test public void testSearchWithAnyPropertyThatEquals() { 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 new file mode 100644 index 0000000000000000000000000000000000000000..d6507050595a67f5939dcc09c1036d1dd78e2ff6 --- /dev/null +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculatorTest.java @@ -0,0 +1,251 @@ +package ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.detailed; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +import org.testng.Assert; +import org.testng.annotations.Test; + +import ch.systemsx.cisd.common.exceptions.UserFailureException; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CompareType; + +/** + * @author pkupczyk + */ +public class DateRangeCalculatorTest +{ + + @Test(expectedExceptions = UserFailureException.class, expectedExceptionsMessageRegExp = "Couldn't parse date 'this should be a date'.*") + public void testIncorrectDateFormat() + { + new DateRangeCalculator("this should be a date", "0", CompareType.EQUALS); + } + + @Test + public void testIncorrectTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14 00:59", "this should be a time zone", CompareType.LESS_THAN_OR_EQUAL); + assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-14 00:59:00.000"); + } + + @Test + public void testZeroTimeZoneOffsetWithZCharacter() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14 00:59", "Z", CompareType.LESS_THAN_OR_EQUAL); + assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-14 00:59:00.000"); + } + + @Test + public void testPositiveTimeZoneOffsetWithPlusSign() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14 00:59", "+1", CompareType.LESS_THAN_OR_EQUAL); + assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-13 23:59:00.000"); + } + + @Test + public void testEqualToDateWithoutTimeWithZeroTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "0", CompareType.EQUALS); + assertDates(calculator, "2014-11-14 00:00:00.000", "2014-11-15 00:00:00.000"); + } + + @Test + 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"); + } + + @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"); + } + + @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"); + } + + @Test + public void testEqualToDateWithTimeWithZeroTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14 23:59", "0", CompareType.EQUALS); + assertDates(calculator, "2014-11-14 00:00:00.000", "2014-11-15 00:00:00.000"); + + calculator = new DateRangeCalculator("2014-11-14 00:01", "0", CompareType.EQUALS); + assertDates(calculator, "2014-11-14 00:00:00.000", "2014-11-15 00:00:00.000"); + } + + @Test + public void testEqualToDateWithTimeWithPositiveTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14 00:59", "1", CompareType.EQUALS); + assertDates(calculator, "2014-11-13 00:00:00.000", "2014-11-14 00:00:00.000"); + + calculator = new DateRangeCalculator("2014-11-14 01:01", "1", CompareType.EQUALS); + assertDates(calculator, "2014-11-14 00:00:00.000", "2014-11-15 00:00:00.000"); + } + + @Test + public void testEqualToDateWithTimeWithNegativeTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14 22:59", "-1", CompareType.EQUALS); + assertDates(calculator, "2014-11-14 00:00:00.000", "2014-11-15 00:00:00.000"); + + calculator = new DateRangeCalculator("2014-11-14 23:01", "-1", CompareType.EQUALS); + assertDates(calculator, "2014-11-15 00:00:00.000", "2014-11-16 00:00:00.000"); + } + + @Test + public void testEqualToDateWithTimeWithServerTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14 00:59", "server", CompareType.EQUALS); + assertDates(calculator, "2014-11-13 00:00:00.000", "2014-11-14 00:00:00.000"); + + calculator = new DateRangeCalculator("2014-11-14 01:01", "server", CompareType.EQUALS); + assertDates(calculator, "2014-11-14 00:00:00.000", "2014-11-15 00:00:00.000"); + } + + @Test + public void testLessThanOrEqualToDateWithoutTimeWithZeroTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "0", CompareType.LESS_THAN_OR_EQUAL); + assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-15 00:00:00.000"); + } + + @Test + 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"); + } + + @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"); + } + + @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"); + } + + @Test + public void testLessThanOrEqualToDateWithTimeWithZeroTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14 14:37", "0", CompareType.LESS_THAN_OR_EQUAL); + assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-14 14:37:00.000"); + } + + @Test + public void testLessThanOrEqualToDateWithTimeWithPositiveTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14 14:37", "1", CompareType.LESS_THAN_OR_EQUAL); + assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-14 13:37:00.000"); + + calculator = new DateRangeCalculator("2014-11-14 00:59", "1", CompareType.LESS_THAN_OR_EQUAL); + assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-13 23:59:00.000"); + } + + @Test + public void testLessThanOrEqualToDateWithTimeWithNegativeTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14 14:37", "-1", CompareType.LESS_THAN_OR_EQUAL); + assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-14 15:37:00.000"); + + calculator = new DateRangeCalculator("2014-11-14 23:59", "-1", CompareType.LESS_THAN_OR_EQUAL); + assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-15 00:59:00.000"); + } + + @Test + public void testLessThanOrEqualToDateWithTimeWithServerTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14 14:37", "server", CompareType.LESS_THAN_OR_EQUAL); + assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-14 13:37:00.000"); + } + + @Test + public void testMoreThanOrEqualToDateWithoutTimeWithZeroTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "0", CompareType.MORE_THAN_OR_EQUAL); + assertDates(calculator, "2014-11-14 00:00:00.000", "292278994-08-17 07:12:55.807"); + } + + @Test + 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"); + } + + @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"); + } + + @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"); + } + + @Test + public void testMoreThanOrEqualToDateWithTimeWithZeroTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14 14:37", "0", CompareType.MORE_THAN_OR_EQUAL); + assertDates(calculator, "2014-11-14 14:37:00.000", "292278994-08-17 07:12:55.807"); + } + + @Test + public void testMoreThanOrEqualToDateWithTimeWithPositiveTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14 14:37", "1", CompareType.MORE_THAN_OR_EQUAL); + assertDates(calculator, "2014-11-14 13:37:00.000", "292278994-08-17 07:12:55.807"); + + calculator = new DateRangeCalculator("2014-11-14 00:59", "1", CompareType.MORE_THAN_OR_EQUAL); + assertDates(calculator, "2014-11-13 23:59:00.000", "292278994-08-17 07:12:55.807"); + } + + @Test + public void testMoreThanOrEqualToDateWithTimeWithNegativeTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14 14:37", "-1", CompareType.MORE_THAN_OR_EQUAL); + assertDates(calculator, "2014-11-14 15:37:00.000", "292278994-08-17 07:12:55.807"); + + calculator = new DateRangeCalculator("2014-11-14 23:59", "-1", CompareType.MORE_THAN_OR_EQUAL); + assertDates(calculator, "2014-11-15 00:59:00.000", "292278994-08-17 07:12:55.807"); + } + + @Test + public void testMoreThanOrEqualToDateWithTimeWithServerTimeZoneOffset() + { + DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14 14:37", "server", CompareType.MORE_THAN_OR_EQUAL); + assertDates(calculator, "2014-11-14 13:37:00.000", "292278994-08-17 07:12:55.807"); + } + + private void assertDates(DateRangeCalculator calculator, String expectedLowerDate, String expectedUpperDate) + { + assertDate(calculator.getLowerDate(), expectedLowerDate); + assertDate(calculator.getUpperDate(), expectedUpperDate); + } + + private void assertDate(Date actualDate, String expectedDate) + { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + format.setTimeZone(TimeZone.getTimeZone("GMT")); + Assert.assertEquals(format.format(actualDate), expectedDate); + } + +} diff --git a/openbis/sourceTest/sql/postgresql/143/023=experiment_properties.tsv b/openbis/sourceTest/sql/postgresql/143/023=experiment_properties.tsv index ed6e39a52fae25d648106a41e03aee04447bb278..58e75e69990e5393c27835fde8250d8732c672ee 100644 --- a/openbis/sourceTest/sql/postgresql/143/023=experiment_properties.tsv +++ b/openbis/sourceTest/sql/postgresql/143/023=experiment_properties.tsv @@ -13,4 +13,4 @@ 19 20 5 \N 12 2 2009-02-09 12:17:55.058768+01 2009-03-18 10:50:19.475958+01 \N 1 18 20 3 2009-02-09 10:00:00 +0100 \N 2 2009-02-09 12:17:55.058768+01 2009-03-18 10:50:19.475958+01 \N 1 20 22 1 A simple experiment \N 2 2008-11-05 09:22:37.246+01 2009-03-18 10:50:19.475958+01 \N 1 -21 24 3 2009-02-010 11:00:00 +0100 \N 2 2009-02-09 12:17:55.058768+01 2009-03-18 10:50:19.475958+01 \N 1 +21 24 3 2009-02-10 01:00:00 +0200 \N 2 2009-02-09 12:17:55.058768+01 2009-03-18 10:50:19.475958+01 \N 1