From f91ed7dc23a1f802389fcdb90ba4c3fc460e0a40 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Sat, 8 Feb 2020 00:12:32 +0000 Subject: [PATCH] --- .../DataList/DataListFilterSpecialTokens.cs | 110 ++-- .../DataListSqlFilterCriteriaBuilder.cs | 486 ++---------------- 2 files changed, 112 insertions(+), 484 deletions(-) diff --git a/server/AyaNova/DataList/DataListFilterSpecialTokens.cs b/server/AyaNova/DataList/DataListFilterSpecialTokens.cs index bdf44efc..c9154158 100644 --- a/server/AyaNova/DataList/DataListFilterSpecialTokens.cs +++ b/server/AyaNova/DataList/DataListFilterSpecialTokens.cs @@ -1,69 +1,69 @@ -namespace AyaNova.DataList -{ - public static class DataListFilterSpecialToken - { - public const string Null = "{[null]}"; - public const string Yesterday = "{[yesterday]}"; - public const string Today = "{[today]}"; - public const string Tomorrow = "{[tomorrow]}"; - public const string LastWeek = "{[lastweek]}"; - public const string ThisWeek = "{[thisweek]}"; - public const string NextWeek = "{[nextweek]}"; - public const string LastMonth = "{[lastmonth]}"; - public const string ThisMonth = "{[thismonth]}"; - public const string NextMonth = "{[nextmonth]}"; - public const string FourteenDayWindow = "{[14daywindow]}"; - public const string Past = "{[past]}"; - public const string Future = "{[future]}"; - public const string LastYear = "{[lastyear]}"; - public const string ThisYear = "{[thisyear]}"; - public const string InTheLast3Months = "{[last3months]}"; - public const string InTheLast6Months = "{[last6months]}"; - public const string InTheLastYear = "{[lastcalendaryear]}"; +// namespace AyaNova.DataList +// { +// public static class DataListFilterSpecialToken +// { +// public const string Null = "{[null]}"; +// public const string Yesterday = "{[yesterday]}"; +// public const string Today = "{[today]}"; +// public const string Tomorrow = "{[tomorrow]}"; +// public const string LastWeek = "{[lastweek]}"; +// public const string ThisWeek = "{[thisweek]}"; +// public const string NextWeek = "{[nextweek]}"; +// public const string LastMonth = "{[lastmonth]}"; +// public const string ThisMonth = "{[thismonth]}"; +// public const string NextMonth = "{[nextmonth]}"; +// public const string FourteenDayWindow = "{[14daywindow]}"; +// public const string Past = "{[past]}"; +// public const string Future = "{[future]}"; +// public const string LastYear = "{[lastyear]}"; +// public const string ThisYear = "{[thisyear]}"; +// public const string InTheLast3Months = "{[last3months]}"; +// public const string InTheLast6Months = "{[last6months]}"; +// public const string InTheLastYear = "{[lastcalendaryear]}"; - //Months THIS year - public const string January = "{[january]}"; - public const string February = "{[february]}"; - public const string March = "{[march]}"; - public const string April = "{[april]}"; - public const string May = "{[may]}"; - public const string June = "{[june]}"; - public const string July = "{[july]}"; - public const string August = "{[august]}"; - public const string September = "{[september]}"; - public const string October = "{[october]}"; - public const string November = "{[november]}"; - public const string December = "{[december]}"; +// //Months THIS year +// public const string January = "{[january]}"; +// public const string February = "{[february]}"; +// public const string March = "{[march]}"; +// public const string April = "{[april]}"; +// public const string May = "{[may]}"; +// public const string June = "{[june]}"; +// public const string July = "{[july]}"; +// public const string August = "{[august]}"; +// public const string September = "{[september]}"; +// public const string October = "{[october]}"; +// public const string November = "{[november]}"; +// public const string December = "{[december]}"; - //These TEXT filter tokens were more for paging purposes than anything else - //however paging is done by numeric range now so will not implement for now - // public const string AH = "{[ah]}"; - // public const string IP = "{[ip]}"; - // public const string QZ = "{[qz]}"; - // public const string ZeroToThree = "{[03]}"; - // public const string FourToSix = "{[46]}"; - // public const string SevenToNine = "{[79]}"; +// //These TEXT filter tokens were more for paging purposes than anything else +// //however paging is done by numeric range now so will not implement for now +// // public const string AH = "{[ah]}"; +// // public const string IP = "{[ip]}"; +// // public const string QZ = "{[qz]}"; +// // public const string ZeroToThree = "{[03]}"; +// // public const string FourToSix = "{[46]}"; +// // public const string SevenToNine = "{[79]}"; - //Don't think I need these - //public const string LessThanZero = "{[<0]}"; - // public const string Zero = "{[0]}"; - //public const string GreaterThanZero = "{[>0]}"; +// //Don't think I need these +// //public const string LessThanZero = "{[<0]}"; +// // public const string Zero = "{[0]}"; +// //public const string GreaterThanZero = "{[>0]}"; - //https://www.klipfolio.com/resources/articles/kpi-timeframe-comparison-metrics +// //https://www.klipfolio.com/resources/articles/kpi-timeframe-comparison-metrics - //More business time frames +// //More business time frames - public const string YearToDate = "{[yeartodate]}"; +// public const string YearToDate = "{[yeartodate]}"; - public const string Past90Days = "{[past90days]}"; - public const string Past30Days = "{[past30days]}"; - public const string Past24Hours = "{[past24hours]}"; +// public const string Past90Days = "{[past90days]}"; +// public const string Past30Days = "{[past30days]}"; +// public const string Past24Hours = "{[past24hours]}"; - } -} +// } +// } diff --git a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs index 99bd8132..89b142d1 100644 --- a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs +++ b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs @@ -74,7 +74,7 @@ namespace AyaNova.DataList sb.Append(" "); //handle null values separately - if (!TagFilter && sValue == DataListFilterSpecialToken.Null) + if (!TagFilter && sValue == "{[null]}") { switch (DataType) { @@ -290,440 +290,68 @@ namespace AyaNova.DataList //suitable for the database to handle as all database dates are in UTC //Local display and parsing will be considered a CLIENT issue at all times - //HOWEVER, if it's a relative date filter TOKEN like "nextMonth" then the users time zone offset will be taken into consideration + #region Build criteria for date specified + //RAVEN NOTE: it is my intention that dates come in iso8601 UTC format from the client + //so a simple parse should be sufficient + //https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings#Roundtrip + System.DateTime dtData = DateTime.Parse(sValue); - //So this is the core date time to work off of - DateTime RelativeToday = DateTime.Today; - DateTime RelativeNow = DateTime.Now; - // ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger("FilterSqlCriteriaBuilder::DataFilterToColumnCriteria"); - // log.LogInformation("RelativeToday (before adjustment):"); - // log.LogInformation(RelativeToday.ToString()); - // log.LogInformation("RelativeNow (before adjustment):"); - // log.LogInformation(RelativeNow.ToString()); + string sHighEnd = PostgresDateFormat(MaxMilliseconds(dtData)); + string sLowEnd = PostgresDateFormat(ZeroMilliseconds(dtData)); - - if (sValue.StartsWith("{[") && sValue.EndsWith("]}")) + switch (sOperator) { - + case DataListFilterComparisonOperator.Equality: + sb.Append(">='"); + sb.Append(sLowEnd); + sb.Append("' AND "); + sb.Append(SqlColumnNameToFilter); + sb.Append(" "); + sb.Append("<='"); + sb.Append(sHighEnd); + sb.Append("'"); + break; + + case DataListFilterComparisonOperator.GreaterThan: + sb.Append(">'"); + sb.Append(sLowEnd); + sb.Append("'"); + break; + + case DataListFilterComparisonOperator.GreaterThanOrEqualTo: + sb.Append(">='"); + sb.Append(sLowEnd); + sb.Append("'"); + break; + case DataListFilterComparisonOperator.LessThan: + sb.Append("<'"); + sb.Append(sHighEnd); + sb.Append("'"); + break; + case DataListFilterComparisonOperator.LessThanOrEqualTo: + sb.Append("<='"); + sb.Append(sHighEnd); + sb.Append("'"); + break; + + case DataListFilterComparisonOperator.NotEqual: + sb.Append("<'"); + sb.Append(sLowEnd); + sb.Append("' OR "); + sb.Append(SqlColumnNameToFilter); + sb.Append(" "); + sb.Append(">'"); + sb.Append(sHighEnd); + sb.Append("'"); + + break; + default: + throw new System.ArgumentOutOfRangeException("OPERATOR_TYPE", sOperator, "DataListSqlFilterCriteriaBuilder unhandled operator type [" + sOperator + "] IN DATE_TIME"); - //Need to adjust RelativeToday to users time frame - //Fetch useroptions object and relative time offset - //See servers spec doc core-locale-currency-numbers-time-and-dates.txt for details about why this is necessary to be done this way - AyaNova.Models.AyContext ct = AyaNova.Util.ServiceProviderProvider.DBContext; - var u = ct.User.AsNoTracking().Where(a => a.Id == userId).Select(m => new { tz = m.UserOptions.TimeZoneOffset }).First(); - //Add this value to any time's hours to convert to user local time - Double TimeZoneAdjustment = ((double)u.tz) * -1; - - //Stock times used for many of the tokens: - RelativeToday = RelativeToday.AddHours(TimeZoneAdjustment);//flip the sign to adjust towards UTC - RelativeNow = RelativeNow.AddHours(TimeZoneAdjustment);//flip the sign to adjust towards UTC - - //TESTING: - //LOG THE CRIT AND QUERY - // ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger("FilterSqlCriteriaBuilder::DataFilterToColumnCriteria"); - // log.LogInformation("RelativeToday (adjusted):"); - // log.LogInformation(RelativeToday.ToString()); - // log.LogInformation("RelativeNow (adjusted):"); - // log.LogInformation(RelativeNow.ToString()); - // log.LogInformation("Offset used:"); - // log.LogInformation(u.tz.ToString()); - - #region Build criteria for date RANGE TOKEN specified - //Used as the basis point - System.DateTime dtAfter; - System.DateTime dtBefore; - switch (sValue) - { - //Case 402 - case DataListFilterSpecialToken.Yesterday: - //Between Day before yesterday at midnight and yesterday at midnight - dtAfter = RelativeToday.AddDays(-1); - dtAfter = dtAfter.AddSeconds(-1); - dtBefore = RelativeToday;//.AddDays(-1); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.Today: - //Between yesterday at midnight and tommorow at midnight - dtAfter = RelativeToday.AddSeconds(-1); - dtBefore = RelativeToday.AddDays(1); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - case DataListFilterSpecialToken.Tomorrow: - //Between Tonight at midnight and day after tommorow at midnight - dtAfter = RelativeToday.AddDays(1); - dtAfter = dtAfter.AddSeconds(-1); - dtBefore = RelativeToday.AddDays(2); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - //Case 402 - case DataListFilterSpecialToken.LastWeek: - //Between two Sundays ago at midnight and last sunday at midnight - dtAfter = RelativeToday; - - //go back a week - dtAfter = dtAfter.AddDays(-7); - - //go backwards to Sunday - while (dtAfter.DayOfWeek != DayOfWeek.Sunday) - dtAfter = dtAfter.AddDays(-1); - - //go to very start of eighth dayahead - dtBefore = dtAfter.AddDays(8); - - dtAfter = dtAfter.AddSeconds(-1); - - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - - case DataListFilterSpecialToken.ThisWeek: - //Between Sunday at midnight and Next sunday at midnight - dtAfter = RelativeToday; - //go backwards to monday - while (dtAfter.DayOfWeek != DayOfWeek.Monday) - dtAfter = dtAfter.AddDays(-1); - - //Now go back to sunday last second - dtAfter = dtAfter.AddSeconds(-1); - - - - dtBefore = RelativeToday; - //go forwards to monday - if (RelativeToday.DayOfWeek == DayOfWeek.Monday) - { - //Monday today? then go to next monday - dtBefore = dtBefore.AddDays(7); - } - else - { - while (dtBefore.DayOfWeek != DayOfWeek.Monday) - dtBefore = dtBefore.AddDays(1); - } - - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - case DataListFilterSpecialToken.NextWeek: - //Between Next Sunday at midnight and Next Next sunday at midnight - dtAfter = RelativeToday; - - //If today is monday skip over it first - if (dtAfter.DayOfWeek == DayOfWeek.Monday) - dtAfter = dtAfter.AddDays(1); - - //go forwards to next monday - while (dtAfter.DayOfWeek != DayOfWeek.Monday) - dtAfter = dtAfter.AddDays(1); - - //Now go back to sunday last second - dtAfter = dtAfter.AddDays(-1); - - //go seven days ahead - dtBefore = dtAfter.AddDays(7); - - //case 1155 - dtAfter = dtAfter.AddSeconds(-1); - - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - case DataListFilterSpecialToken.LastMonth: - //start with the first day of this month - dtAfter = new DateTime(RelativeToday.Year, RelativeToday.Month, 1, RelativeToday.Hour, RelativeToday.Minute, 00); - //subtract a Month - dtAfter = dtAfter.AddMonths(-1); - - //Add one month to dtAfter to get end date - dtBefore = dtAfter.AddMonths(1); - - //case 1155 - dtAfter = dtAfter.AddSeconds(-1); - - // 'yyyy-mm-ddTHH:MM:SS' - - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - case DataListFilterSpecialToken.ThisMonth: - //start with the first day of this month - dtAfter = new DateTime(RelativeToday.Year, RelativeToday.Month, 1, RelativeToday.Hour, RelativeToday.Minute, 00); - - //Add one month to dtAfter to get end date - dtBefore = dtAfter.AddMonths(1); - - //case 1155 - dtAfter = dtAfter.AddSeconds(-1); - - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.NextMonth: - //start with the first day of this month - dtAfter = new DateTime(RelativeToday.Year, RelativeToday.Month, 1, RelativeToday.Hour, RelativeToday.Minute, 00); - //Add a Month - dtAfter = dtAfter.AddMonths(1); - - //Add one month to dtAfter to get end date - dtBefore = dtAfter.AddMonths(1); - - //case 1155 - dtAfter = dtAfter.AddSeconds(-1); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - case DataListFilterSpecialToken.FourteenDayWindow: - //start with today zero hour - dtAfter = new DateTime(RelativeToday.Year, RelativeToday.Month, RelativeToday.Day, RelativeToday.Hour, RelativeToday.Minute, 00); - dtAfter = dtAfter.AddDays(-7); - - //Add 15 days to get end date (zero hour so not really 15 full days) - dtBefore = dtAfter.AddDays(15); - - //case 1155 - dtAfter = dtAfter.AddSeconds(-1); - - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - - //case 2067 ADDITIONAL DATE RANGES ************ - - case DataListFilterSpecialToken.Past: - //Forever up to Now - dtAfter = new DateTime(1753, 1, 2, 00, 00, 00); - dtBefore = DateTime.UtcNow; - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.Future: - //From Now to forever (999 years from now) - dtAfter = DateTime.UtcNow; - dtBefore = DateTime.UtcNow.AddYears(999); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.LastYear: - //From zero hour january 1 a year ago - dtAfter = new DateTime(RelativeNow.AddYears(-1).Year, 1, 1, 0, 0, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); - //To zero hour January 1 this year - dtBefore = new DateTime(RelativeNow.Year, 1, 1, 0, 0, 00).AddHours(TimeZoneAdjustment); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.ThisYear: - //From zero hour january 1 this year - dtAfter = new DateTime(RelativeNow.Year, 1, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); - //To zero hour Jan 1 next year - dtBefore = new DateTime(RelativeNow.AddYears(1).Year, 1, 1, 00, 00, 00).AddHours(TimeZoneAdjustment); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.InTheLast3Months: - //From Now minus 3 months - dtAfter = DateTime.UtcNow.AddMonths(-3); - //To Now - dtBefore = DateTime.UtcNow; - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.InTheLast6Months: - //From Now minus 6 months - dtAfter = DateTime.UtcNow.AddMonths(-6); - //To Now - dtBefore = DateTime.UtcNow; - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.InTheLastYear: - //From Now minus 365 days - dtAfter = DateTime.UtcNow.AddDays(-365); - //To Now - dtBefore = DateTime.UtcNow; - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - //======================= - //NEW ONES FOR RAVEN - - - case DataListFilterSpecialToken.YearToDate: - //From zero hour january 1 this year - dtAfter = new DateTime(RelativeNow.Year, 1, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); ; - //To now - dtBefore = RelativeNow; - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.Past90Days: - //From Now minus 90 days - dtAfter = DateTime.UtcNow.AddDays(-90); - //To Now - dtBefore = DateTime.UtcNow; - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - case DataListFilterSpecialToken.Past30Days: - //From Now minus 30 days - dtAfter = DateTime.UtcNow.AddDays(-30); - //To Now - dtBefore = DateTime.UtcNow; - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - case DataListFilterSpecialToken.Past24Hours: - //From Now minus 24 hours - dtAfter = DateTime.UtcNow.AddHours(-24); - //To Now - dtBefore = DateTime.UtcNow; - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.January: - //From zero hour january 1 this year - dtAfter = new DateTime(RelativeNow.Year, 1, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); - //To zero hour feb 1 this year - dtBefore = new DateTime(RelativeNow.Year, 2, 1, 00, 00, 00).AddHours(TimeZoneAdjustment); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.February: - dtAfter = new DateTime(RelativeNow.Year, 2, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); - dtBefore = new DateTime(RelativeNow.Year, 3, 1, 00, 00, 00).AddHours(TimeZoneAdjustment); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.March: - dtAfter = new DateTime(RelativeNow.Year, 3, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); - dtBefore = new DateTime(RelativeNow.Year, 4, 1, 00, 00, 00).AddHours(TimeZoneAdjustment); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.April: - dtAfter = new DateTime(RelativeNow.Year, 4, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); - dtBefore = new DateTime(RelativeNow.Year, 5, 1, 00, 00, 00).AddHours(TimeZoneAdjustment); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.May: - dtAfter = new DateTime(RelativeNow.Year, 5, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); - dtBefore = new DateTime(RelativeNow.Year, 6, 1, 00, 00, 00).AddHours(TimeZoneAdjustment); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.June: - dtAfter = new DateTime(RelativeNow.Year, 6, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); - dtBefore = new DateTime(RelativeNow.Year, 7, 1, 00, 00, 00).AddHours(TimeZoneAdjustment); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.July: - dtAfter = new DateTime(RelativeNow.Year, 7, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); - dtBefore = new DateTime(RelativeNow.Year, 8, 1, 00, 00, 00).AddHours(TimeZoneAdjustment); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.August: - dtAfter = new DateTime(RelativeNow.Year, 8, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); - dtBefore = new DateTime(RelativeNow.Year, 9, 1, 00, 00, 00).AddHours(TimeZoneAdjustment); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.September: - dtAfter = new DateTime(RelativeNow.Year, 9, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); - dtBefore = new DateTime(RelativeNow.Year, 10, 1, 00, 00, 00).AddHours(TimeZoneAdjustment); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.October: - dtAfter = new DateTime(RelativeNow.Year, 10, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); - dtBefore = new DateTime(RelativeNow.Year, 11, 1, 00, 00, 00).AddHours(TimeZoneAdjustment); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.November: - dtAfter = new DateTime(RelativeNow.Year, 11, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); - dtBefore = new DateTime(RelativeNow.Year, 12, 1, 00, 00, 00).AddHours(TimeZoneAdjustment); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - case DataListFilterSpecialToken.December: - //From zero hour dec 1 this year - dtAfter = new DateTime(RelativeNow.Year, 12, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); - //To zero hour Jan 1 next year - dtBefore = new DateTime(RelativeNow.AddYears(1).Year, 1, 1, 00, 00, 00).AddHours(TimeZoneAdjustment); - BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore); - break; - - default: - throw new System.ArgumentOutOfRangeException("TOKEN", sOperator, "DataListSqlFilterCriteriaBuilder invalid filter TOKEN type [" + sValue + "] IN DATE_TIME"); - - //----- - } - - #endregion - } - else - { - #region Build criteria for date specified - //RAVEN NOTE: it is my intention that dates come in iso8601 UTC format from the client - //so a simple parse should be sufficient - //https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings#Roundtrip - System.DateTime dtData = DateTime.Parse(sValue); - - string sHighEnd = PostgresDateFormat(MaxMilliseconds(dtData)); - string sLowEnd = PostgresDateFormat(ZeroMilliseconds(dtData)); - - switch (sOperator) - { - case DataListFilterComparisonOperator.Equality: - sb.Append(">='"); - sb.Append(sLowEnd); - sb.Append("' AND "); - sb.Append(SqlColumnNameToFilter); - sb.Append(" "); - sb.Append("<='"); - sb.Append(sHighEnd); - sb.Append("'"); - break; - - case DataListFilterComparisonOperator.GreaterThan: - sb.Append(">'"); - sb.Append(sLowEnd); - sb.Append("'"); - break; - - case DataListFilterComparisonOperator.GreaterThanOrEqualTo: - sb.Append(">='"); - sb.Append(sLowEnd); - sb.Append("'"); - break; - case DataListFilterComparisonOperator.LessThan: - sb.Append("<'"); - sb.Append(sHighEnd); - sb.Append("'"); - break; - case DataListFilterComparisonOperator.LessThanOrEqualTo: - sb.Append("<='"); - sb.Append(sHighEnd); - sb.Append("'"); - break; - - case DataListFilterComparisonOperator.NotEqual: - sb.Append("<'"); - sb.Append(sLowEnd); - sb.Append("' OR "); - sb.Append(SqlColumnNameToFilter); - sb.Append(" "); - sb.Append(">'"); - sb.Append(sHighEnd); - sb.Append("'"); - - break; - default: - throw new System.ArgumentOutOfRangeException("OPERATOR_TYPE", sOperator, "DataListSqlFilterCriteriaBuilder unhandled operator type [" + sOperator + "] IN DATE_TIME"); - - - } - #endregion } + #endregion + //} } break; case UiFieldDataType.Enum://enums are just ints to the db, but it's a special type so the client can recognize it