From 60c54c8eadcdec1dadff0a0c9583e798f62155cf Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Thu, 24 Oct 2024 13:25:09 -0700 Subject: [PATCH] Fix "days active" query on French SQL Server --- api/src/org/labkey/api/data/CompareType.java | 43 +++++++++++++++++-- .../org/labkey/api/security/UserManager.java | 2 +- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/api/src/org/labkey/api/data/CompareType.java b/api/src/org/labkey/api/data/CompareType.java index 670272dabfd..a415d190d04 100644 --- a/api/src/org/labkey/api/data/CompareType.java +++ b/api/src/org/labkey/api/data/CompareType.java @@ -1624,6 +1624,9 @@ private abstract static class DateCompareClause extends CompareClause private final String _filterTextDate; private final String _filterTextOperator; + // See Issue 51472 + protected final String SS_CAST = "CAST(? AS DateTime)"; + DateCompareClause(FieldKey fieldKey, CompareType t, String op, Object rawFilterValue, Calendar param0) { super(fieldKey, t, param0.getTime()); @@ -1650,7 +1653,15 @@ private abstract static class DateCompareClause extends CompareClause @Override String toWhereClause(SqlDialect dialect, String alias) { - return super.toWhereClause(dialect, alias); + return dialect.isSqlServer() ? + dialect.getColumnSelectName(alias) + getSqlServerComparison() : + super.toWhereClause(dialect, alias); + } + + // See Issue 51472 + protected String getSqlServerComparison() + { + throw new IllegalStateException("Must override either toWhereClause() or getSqlServerComparison()"); } @Override @@ -1687,7 +1698,8 @@ static class DateEqCompareClause extends DateCompareClause String toWhereClause(SqlDialect dialect, String alias) { String selectName = dialect.getColumnSelectName(alias); - return selectName + " >= ? AND " + selectName + " < ?"; + String q = dialect.isSqlServer() ? SS_CAST : "?"; + return selectName + " >= " + q + " AND " + selectName + " < " + q; } @Override @@ -1727,7 +1739,8 @@ static class DateNeqCompareClause extends DateCompareClause String toWhereClause(SqlDialect dialect, String alias) { String selectName = dialect.getColumnSelectName(alias); - return selectName + " < ? OR " + selectName + " >= ?"; + String q = dialect.isSqlServer() ? SS_CAST : "?"; + return selectName + " < " + q + " OR " + selectName + " >= " + q; } @Override @@ -1763,6 +1776,12 @@ static class DateGtCompareClause extends DateCompareClause super(fieldKey, DATE_GT, " > ", rawFilterValue, addOneDay(startValue)); } + @Override + protected String getSqlServerComparison() + { + return " > " + SS_CAST; + } + @Override protected boolean meetsCriteria(ColumnRenderProperties col, Object value) { @@ -1787,6 +1806,12 @@ static class DateGteCompareClause extends DateCompareClause super(fieldKey, DATE_GTE, " >= ", rawFilterValue, startValue); } + @Override + protected String getSqlServerComparison() + { + return " >= " + SS_CAST; + } + @Override protected boolean meetsCriteria(ColumnRenderProperties col, Object value) { @@ -1811,6 +1836,12 @@ static class DateLtCompareClause extends DateCompareClause super(fieldKey, DATE_LT, " < ", rawFilterValue, startValue); } + @Override + protected String getSqlServerComparison() + { + return " < " + SS_CAST; + } + @Override protected boolean meetsCriteria(ColumnRenderProperties col, Object value) { @@ -1835,6 +1866,12 @@ static class DateLteCompareClause extends DateCompareClause super(fieldKey, DATE_LTE, " <= ", rawFilterValue, addOneDay(startValue)); } + @Override + protected String getSqlServerComparison() + { + return " <= " + SS_CAST; + } + @Override protected boolean meetsCriteria(ColumnRenderProperties col, Object value) { diff --git a/api/src/org/labkey/api/security/UserManager.java b/api/src/org/labkey/api/security/UserManager.java index a7701d0d7cb..cf3224c85f4 100644 --- a/api/src/org/labkey/api/security/UserManager.java +++ b/api/src/org/labkey/api/security/UserManager.java @@ -424,7 +424,7 @@ private static TableSelector getRecentLoginOrOuts(LoggedInOrOut inOrOut, @Nullab SimpleFilter f = new SimpleFilter(FieldKey.fromParts("Comment"), "logged " + inOrOut.toString(), CompareType.CONTAINS); if (since != null) { - f.addCondition(FieldKey.fromParts("Created"), since, CompareType.GTE); + f.addCondition(FieldKey.fromParts("Created"), since, CompareType.DATE_GTE); } if (null == userAuditTable) userAuditTable = getUserAuditSchemaTableInfo();