From 961f861efe167e43827c56f35b1dee94825af4d4 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Wed, 4 Dec 2024 11:01:32 -0800 Subject: [PATCH 1/2] Test all date compare types on SQL Server --- api/src/org/labkey/api/data/CompareType.java | 35 ++++++++------------ 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/api/src/org/labkey/api/data/CompareType.java b/api/src/org/labkey/api/data/CompareType.java index 49adef5b3fc..ffde29d5d2b 100644 --- a/api/src/org/labkey/api/data/CompareType.java +++ b/api/src/org/labkey/api/data/CompareType.java @@ -597,6 +597,7 @@ public boolean meetsCriteria(ColumnRenderProperties col, Object value, Object[] } }; + // BETWEEN is inclusive of the begin and end values public static final CompareType BETWEEN = new CompareType("Between", "between", "BETWEEN", true, " BETWEEN ? AND ?", OperatorType.BETWEEN) { @Override @@ -1860,6 +1861,7 @@ protected boolean meetsCriteria(ColumnRenderProperties col, Object value) } } + // Between is inclusive of the begin and end values public static class BetweenClause extends CompareClause { public static final String SEPARATOR = ","; @@ -2428,8 +2430,6 @@ public void testDateComparisons() { User user = TestContext.get().getUser(); TableInfo table = TestSchema.getInstance().getTableInfoTestTable(); - // Skip DATE_GT and DATE_LTE testing on SQL Server until 24.7 fix is merged to develop TODO: Remove this check - boolean isPostgreSQL = table.getSqlDialect().isPostgreSQL(); Table.truncate(table); Container c = JunitUtil.getTestContainer(); @@ -2463,38 +2463,29 @@ public void testDateComparisons() Assert.assertEquals(rowsPerDay, new TableSelector(table, new SimpleFilter(dateField, jan1, DATE_EQUAL), null).getRowCount()); Assert.assertEquals(totalRows - rowsPerDay, new TableSelector(table, new SimpleFilter(dateField, jan1, DATE_NOT_EQUAL), null).getRowCount()); Assert.assertEquals(totalRows, new TableSelector(table, new SimpleFilter(dateField, jan1, DATE_GTE), null).getRowCount()); - if (isPostgreSQL) - { - Assert.assertEquals(totalRows - rowsPerDay, new TableSelector(table, new SimpleFilter(dateField, jan1, DATE_GT), null).getRowCount()); - Assert.assertEquals(rowsPerDay, new TableSelector(table, new SimpleFilter(dateField, jan1, DATE_LTE), null).getRowCount()); - } + Assert.assertEquals(totalRows - rowsPerDay, new TableSelector(table, new SimpleFilter(dateField, jan1, DATE_GT), null).getRowCount()); + Assert.assertEquals(rowsPerDay, new TableSelector(table, new SimpleFilter(dateField, jan1, DATE_LTE), null).getRowCount()); Assert.assertEquals(0, new TableSelector(table, new SimpleFilter(dateField, jan1, DATE_LT), null).getRowCount()); Assert.assertEquals(rowsPerDay, new TableSelector(table, new SimpleFilter(dateField, jan5, DATE_EQUAL), null).getRowCount()); Assert.assertEquals(totalRows - rowsPerDay, new TableSelector(table, new SimpleFilter(dateField, jan5, DATE_NOT_EQUAL), null).getRowCount()); Assert.assertEquals(rowsPerDay * (days - 4), new TableSelector(table, new SimpleFilter(dateField, jan5, DATE_GTE), null).getRowCount()); - if (isPostgreSQL) - { - Assert.assertEquals(rowsPerDay * (days - 5), new TableSelector(table, new SimpleFilter(dateField, jan5, DATE_GT), null).getRowCount()); - Assert.assertEquals(rowsPerDay * 5, new TableSelector(table, new SimpleFilter(dateField, jan5, DATE_LTE), null).getRowCount()); - } + Assert.assertEquals(rowsPerDay * (days - 5), new TableSelector(table, new SimpleFilter(dateField, jan5, DATE_GT), null).getRowCount()); + Assert.assertEquals(rowsPerDay * 5, new TableSelector(table, new SimpleFilter(dateField, jan5, DATE_LTE), null).getRowCount()); Assert.assertEquals(rowsPerDay * 4, new TableSelector(table, new SimpleFilter(dateField, jan5, DATE_LT), null).getRowCount()); Assert.assertEquals(rowsPerDay, new TableSelector(table, new SimpleFilter(dateField, jan15, DATE_EQUAL), null).getRowCount()); Assert.assertEquals(totalRows - rowsPerDay, new TableSelector(table, new SimpleFilter(dateField, jan15, DATE_NOT_EQUAL), null).getRowCount()); Assert.assertEquals(rowsPerDay * (days - 14), new TableSelector(table, new SimpleFilter(dateField, jan15, DATE_GTE), null).getRowCount()); - if (isPostgreSQL) - { - Assert.assertEquals(rowsPerDay * (days - 15), new TableSelector(table, new SimpleFilter(dateField, jan15, DATE_GT), null).getRowCount()); - Assert.assertEquals(rowsPerDay * 15, new TableSelector(table, new SimpleFilter(dateField, jan15, DATE_LTE), null).getRowCount()); - } + Assert.assertEquals(rowsPerDay * (days - 15), new TableSelector(table, new SimpleFilter(dateField, jan15, DATE_GT), null).getRowCount()); + Assert.assertEquals(rowsPerDay * 15, new TableSelector(table, new SimpleFilter(dateField, jan15, DATE_LTE), null).getRowCount()); Assert.assertEquals(rowsPerDay * 14, new TableSelector(table, new SimpleFilter(dateField, jan15, DATE_LT), null).getRowCount()); -// Not sure how BETWEEN is supposed to work for dates, so leave it untested for now -// if (isPostgreSQL) -// { -// Assert.assertEquals(rowsPerDay * 11, new TableSelector(table, new SimpleFilter(new BetweenClause(dateField, jan5, jan15, false)), null).getRowCount()); -// } + // Note: There is no DATE_BETWEEN operator, so this is a date-time comparison, unlike all of the above operators. + // BETWEEN is inclusive of the begin and end values. + Assert.assertEquals(1, new TableSelector(table, new SimpleFilter(new BetweenClause(dateField, jan1, jan1, false)), null).getRowCount()); + Assert.assertEquals(60/minuteInterval + 1, new TableSelector(table, new SimpleFilter(new BetweenClause(dateField, jan1, jan1.plusMinutes(60), false)), null).getRowCount()); + Assert.assertEquals(rowsPerDay * 10 + 1, new TableSelector(table, new SimpleFilter(new BetweenClause(dateField, jan5, jan15, false)), null).getRowCount()); Table.truncate(table); } From f7d0557c32c0d9095dafc1352a4ef767fb6d4d3e Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Wed, 4 Dec 2024 11:33:19 -0800 Subject: [PATCH 2/2] Test NOT_BETWEEN --- api/src/org/labkey/api/data/CompareType.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/src/org/labkey/api/data/CompareType.java b/api/src/org/labkey/api/data/CompareType.java index ffde29d5d2b..11568942838 100644 --- a/api/src/org/labkey/api/data/CompareType.java +++ b/api/src/org/labkey/api/data/CompareType.java @@ -2484,8 +2484,11 @@ public void testDateComparisons() // Note: There is no DATE_BETWEEN operator, so this is a date-time comparison, unlike all of the above operators. // BETWEEN is inclusive of the begin and end values. Assert.assertEquals(1, new TableSelector(table, new SimpleFilter(new BetweenClause(dateField, jan1, jan1, false)), null).getRowCount()); + Assert.assertEquals(totalRows - 1, new TableSelector(table, new SimpleFilter(new BetweenClause(dateField, jan1, jan1, true)), null).getRowCount()); Assert.assertEquals(60/minuteInterval + 1, new TableSelector(table, new SimpleFilter(new BetweenClause(dateField, jan1, jan1.plusMinutes(60), false)), null).getRowCount()); + Assert.assertEquals(totalRows - (60/minuteInterval + 1), new TableSelector(table, new SimpleFilter(new BetweenClause(dateField, jan1, jan1.plusMinutes(60), true)), null).getRowCount()); Assert.assertEquals(rowsPerDay * 10 + 1, new TableSelector(table, new SimpleFilter(new BetweenClause(dateField, jan5, jan15, false)), null).getRowCount()); + Assert.assertEquals(totalRows - (rowsPerDay * 10 + 1), new TableSelector(table, new SimpleFilter(new BetweenClause(dateField, jan5, jan15, true)), null).getRowCount()); Table.truncate(table); }