This commit is contained in:
@@ -886,720 +886,11 @@ namespace AyaNova.DataList
|
|||||||
{
|
{
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
//Column name
|
//Column name
|
||||||
sb.Append(SqlColumnNameToFilter);
|
// sb.Append(SqlColumnNameToFilter);
|
||||||
sb.Append(" ");
|
// sb.Append(" ");
|
||||||
//handle null values separately
|
|
||||||
if (DataType != UiFieldDataType.Tags && sValue == "*NULL*")
|
|
||||||
{
|
|
||||||
switch (DataType)
|
|
||||||
{
|
|
||||||
//ALL TEXT TYPES
|
|
||||||
case UiFieldDataType.Text:
|
|
||||||
case UiFieldDataType.PhoneNumber:
|
|
||||||
case UiFieldDataType.EmailAddress:
|
|
||||||
case UiFieldDataType.HTTP:
|
|
||||||
{
|
|
||||||
if (sOperator == DataListFilterComparisonOperator.Equality)
|
|
||||||
{
|
|
||||||
|
|
||||||
sb.Append("Is Null");
|
|
||||||
sb.Append(" OR ");
|
|
||||||
sb.Append(SqlColumnNameToFilter);
|
|
||||||
sb.Append(" = ''");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
sb.Append(" <> ''");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
if (sOperator == DataListFilterComparisonOperator.Equality)
|
|
||||||
sb.Append("Is Null");
|
|
||||||
else
|
|
||||||
sb.Append("Is Not Null");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//non null value
|
|
||||||
//Special addition to handle nulls
|
|
||||||
|
|
||||||
if (DataType != UiFieldDataType.Tags)
|
|
||||||
{
|
|
||||||
switch (sOperator)
|
|
||||||
{
|
|
||||||
case DataListFilterComparisonOperator.Equality:
|
|
||||||
//no change on equals for nulls
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.GreaterThan:
|
|
||||||
//no change on greater than for nulls
|
|
||||||
//(nulls are going to be assumed to be always at the
|
|
||||||
//less than end of the scale)
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.GreaterThanOrEqualTo:
|
|
||||||
//no change on greater than for nulls
|
|
||||||
//(nulls are going to be assumed to be always at the
|
|
||||||
//less than end of the scale)
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.LessThan:
|
|
||||||
sb.Append("Is Null OR ");
|
|
||||||
sb.Append(SqlColumnNameToFilter);
|
|
||||||
sb.Append(" ");
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.LessThanOrEqualTo:
|
|
||||||
sb.Append("Is Null OR ");
|
|
||||||
sb.Append(SqlColumnNameToFilter);
|
|
||||||
sb.Append(" ");
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.NotEqual:
|
|
||||||
//This is the big one:
|
|
||||||
sb.Append("Is Null OR ");
|
|
||||||
sb.Append(SqlColumnNameToFilter);
|
|
||||||
sb.Append(" ");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Build for specific type
|
|
||||||
switch (DataType)
|
|
||||||
{
|
|
||||||
//ALL TEXT TYPES
|
|
||||||
case UiFieldDataType.Text:
|
|
||||||
case UiFieldDataType.PhoneNumber:
|
|
||||||
case UiFieldDataType.EmailAddress:
|
|
||||||
case UiFieldDataType.HTTP:
|
|
||||||
//escape any pre-existing apostrophes
|
|
||||||
//i.e. "O'Flaherty's pub"
|
|
||||||
sValue = sValue.Replace("'", "''");
|
|
||||||
|
|
||||||
//case 1951 - unescape ampersands
|
|
||||||
sValue = sValue.Replace("&", "&");
|
|
||||||
|
|
||||||
//RAVEN NOTE: Decided not to implement TEXT token criteria for now (TTM, probably not useful)
|
|
||||||
//meaning the A-H etc group ranges by alpha bet chunk
|
|
||||||
|
|
||||||
#region Build TEXT OPS criteria
|
|
||||||
switch (sOperator)
|
|
||||||
{
|
|
||||||
case DataListFilterComparisonOperator.Equality:
|
|
||||||
sb.Append("='");
|
|
||||||
sb.Append(sValue);
|
|
||||||
sb.Append("'");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DataListFilterComparisonOperator.GreaterThan:
|
|
||||||
sb.Append(">'");
|
|
||||||
sb.Append(sValue);
|
|
||||||
sb.Append("'");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DataListFilterComparisonOperator.GreaterThanOrEqualTo:
|
|
||||||
sb.Append(">='");
|
|
||||||
sb.Append(sValue);
|
|
||||||
sb.Append("'");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DataListFilterComparisonOperator.LessThan:
|
|
||||||
sb.Append("<'");
|
|
||||||
sb.Append(sValue);
|
|
||||||
sb.Append("'");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DataListFilterComparisonOperator.LessThanOrEqualTo:
|
|
||||||
sb.Append("<='");
|
|
||||||
sb.Append(sValue);
|
|
||||||
sb.Append("'");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DataListFilterComparisonOperator.NotEqual:
|
|
||||||
sb.Append("<>'");
|
|
||||||
sb.Append(sValue);
|
|
||||||
sb.Append("'");
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
/* NOTE: CASE - I decided to NOT do case insensitive for now for datalists like I did for picklists because it's a bit of a different situation
|
|
||||||
I would need to make big changes to the select builder and this criteria builder so it's TTM at the moment because it's all tested and working
|
|
||||||
however also the use is a bit different in that it's much more necessary to be hyper accurate here since this drives reporting and potentially a lot
|
|
||||||
of important business data. Matching two different clients inadvertantly because of a case issue would be a bit of a kerfuffle potentially so I'd rather err on the side of accuracy
|
|
||||||
and also I'm not certain how the case code will work with other languages so it's a bit more risky here, if a picklist doesn't work I get a support call but if a report is missing data then maybe
|
|
||||||
the user doesn't realize it and has bad reports.
|
|
||||||
|
|
||||||
code from picklist in case I decide to do it later
|
|
||||||
if (ServerGlobalBizSettings.SearchCaseSensitiveOnly)
|
|
||||||
sWhere = $"({valueColumnName} like '%{autoCompleteQuery}%')";
|
|
||||||
else
|
|
||||||
sWhere = $"(lower({valueColumnName}) like lower('%{autoCompleteQuery}%'))";
|
|
||||||
*/
|
|
||||||
|
|
||||||
//Following 7 operators added 14-June-2006
|
|
||||||
case DataListFilterComparisonOperator.NotContains:
|
|
||||||
sb.Append("Not Like '%");
|
|
||||||
sb.Append(sValue);
|
|
||||||
sb.Append("%'");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DataListFilterComparisonOperator.Contains:
|
|
||||||
sb.Append("Like '%");
|
|
||||||
sb.Append(sValue);
|
|
||||||
sb.Append("%'");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DataListFilterComparisonOperator.StartsWith:
|
|
||||||
sb.Append("Like '");
|
|
||||||
sb.Append(sValue);
|
|
||||||
sb.Append("%'");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DataListFilterComparisonOperator.EndsWith:
|
|
||||||
sb.Append("Like '%");
|
|
||||||
sb.Append(sValue);
|
|
||||||
sb.Append("'");
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw new System.ArgumentOutOfRangeException("OPERATOR_TYPE", sOperator, "DataListSqlFilterCriteriaBuilder unhandled operator type [" + sOperator + "] IN STRING");
|
|
||||||
|
|
||||||
}
|
|
||||||
#endregion build text ops criteria
|
|
||||||
break;
|
|
||||||
case UiFieldDataType.Bool:
|
|
||||||
{
|
|
||||||
switch (sOperator)
|
|
||||||
{
|
|
||||||
case DataListFilterComparisonOperator.Equality:
|
|
||||||
sb.Append("= ");
|
|
||||||
if (sValue.ToLowerInvariant() == "true")
|
|
||||||
sb.Append("true");
|
|
||||||
else
|
|
||||||
sb.Append("false");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DataListFilterComparisonOperator.NotEqual:
|
|
||||||
sb.Append("<> ");
|
|
||||||
if (sValue.ToLowerInvariant() == "true")
|
|
||||||
sb.Append("true");
|
|
||||||
else
|
|
||||||
sb.Append("false");
|
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new System.ArgumentOutOfRangeException("OPERATOR_TYPE", sOperator, "DataListSqlFilterCriteriaBuilder unhandled operator type [" + sOperator + "] in BOOL");
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
//Note there are three types here for display purposes but all are stored in the db as a timestamp the same with date and time components
|
|
||||||
case UiFieldDataType.Date:
|
|
||||||
case UiFieldDataType.DateTime:
|
|
||||||
case UiFieldDataType.Time:
|
|
||||||
{
|
|
||||||
|
|
||||||
if (sValue.StartsWith("*") && sValue.EndsWith("*"))
|
|
||||||
{
|
|
||||||
//Note: due to date token relativity, all below calcs done with Client provided current date/time and converted to UTC only at the end for sql
|
|
||||||
DateTime ClientToday = clientTimeStamp.Date;
|
|
||||||
DateTime ClientNow = clientTimeStamp.DateTime;
|
|
||||||
|
|
||||||
#region Build criteria for date RANGE TOKEN specified
|
|
||||||
|
|
||||||
//Used as the basis point
|
|
||||||
System.DateTime dtAfter;
|
|
||||||
System.DateTime dtBefore;
|
|
||||||
switch (sValue)
|
|
||||||
{
|
|
||||||
//Case 402
|
|
||||||
case "*yesterday*":
|
|
||||||
//Between Day before yesterday at midnight and yesterday at midnight
|
|
||||||
dtAfter = ClientToday.AddDays(-1);
|
|
||||||
dtAfter = dtAfter.AddSeconds(-1);
|
|
||||||
dtBefore = ClientToday;
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*today*":
|
|
||||||
//Between yesterday at midnight and tommorow at midnight
|
|
||||||
dtAfter = ClientToday.AddSeconds(-1);
|
|
||||||
dtBefore = ClientToday.AddDays(1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
case "*tomorrow*":
|
|
||||||
//Between Tonight at midnight and day after tommorow at midnight
|
|
||||||
dtAfter = ClientToday.AddDays(1).AddSeconds(-1);
|
|
||||||
dtBefore = ClientToday.AddDays(2);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
case "*lastweek*":
|
|
||||||
//Between two Sundays ago at midnight and last sunday at midnight
|
|
||||||
dtAfter = ClientToday;
|
|
||||||
//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);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
case "*thisweek*":
|
|
||||||
//Between Sunday at midnight and Next sunday at midnight
|
|
||||||
dtAfter = ClientToday;
|
|
||||||
//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 = ClientToday;
|
|
||||||
//go forwards to monday
|
|
||||||
if (ClientToday.DayOfWeek == DayOfWeek.Monday)
|
|
||||||
{
|
|
||||||
//Monday today? then go to next monday
|
|
||||||
dtBefore = dtBefore.AddDays(7);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
while (dtBefore.DayOfWeek != DayOfWeek.Monday)
|
|
||||||
dtBefore = dtBefore.AddDays(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
case "*nextweek*":
|
|
||||||
//Between Next Sunday at midnight and Next Next sunday at midnight
|
|
||||||
dtAfter = ClientToday;
|
|
||||||
|
|
||||||
//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);
|
|
||||||
dtAfter = dtAfter.AddSeconds(-1);
|
|
||||||
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
case "*lastmonth*":
|
|
||||||
//start with the first day of this month
|
|
||||||
dtAfter = new DateTime(ClientToday.Year, ClientToday.Month, 1);
|
|
||||||
//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);
|
|
||||||
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
case "*thismonth*":
|
|
||||||
//start with the first day of this month
|
|
||||||
dtAfter = new DateTime(ClientToday.Year, ClientToday.Month, 1);
|
|
||||||
|
|
||||||
//Add one month to dtAfter to get end date
|
|
||||||
dtBefore = dtAfter.AddMonths(1);
|
|
||||||
|
|
||||||
//case 1155
|
|
||||||
dtAfter = dtAfter.AddSeconds(-1);
|
|
||||||
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*nextmonth*":
|
|
||||||
//start with the first day of this month
|
|
||||||
dtAfter = new DateTime(ClientToday.Year, ClientToday.Month, 1);
|
|
||||||
//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);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*14daywindow*":
|
|
||||||
//start with today zero hour
|
|
||||||
dtAfter = new DateTime(ClientToday.Year, ClientToday.Month, ClientToday.Day);
|
|
||||||
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);
|
|
||||||
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*past*":
|
|
||||||
//Forever up to Now
|
|
||||||
dtAfter = new DateTime(1753, 1, 2);//this was for sql server but even then was probably outdated good enough though for our purposes
|
|
||||||
dtBefore = ClientNow;
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*future*":
|
|
||||||
//From Now to forever (999 years from now)
|
|
||||||
dtAfter = ClientNow;
|
|
||||||
dtBefore = dtAfter.AddYears(999);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*lastyear*":
|
|
||||||
//From zero hour january 1 a year ago
|
|
||||||
dtAfter = new DateTime(ClientNow.AddYears(-1).Year, 1, 1, 0, 0, 00).AddSeconds(-1);
|
|
||||||
//To zero hour January 1 this year
|
|
||||||
dtBefore = new DateTime(ClientNow.Year, 1, 1, 0, 0, 00);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*thisyear*":
|
|
||||||
//From zero hour january 1 this year
|
|
||||||
dtAfter = new DateTime(ClientNow.Year, 1, 1).AddSeconds(-1);
|
|
||||||
//To zero hour Jan 1 next year
|
|
||||||
dtBefore = new DateTime(ClientNow.AddYears(1).Year, 1, 1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*last3months*":
|
|
||||||
//From Now minus 3 months
|
|
||||||
dtAfter = ClientNow.AddMonths(-3).AddSeconds(-1);
|
|
||||||
//To Now
|
|
||||||
dtBefore = ClientNow;
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*last6months*":
|
|
||||||
//From Now minus 6 months
|
|
||||||
dtAfter = ClientNow.AddMonths(-6).AddSeconds(-1);
|
|
||||||
//To Now
|
|
||||||
dtBefore = ClientNow;
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*pastyear*": //within the prior 365 days before today
|
|
||||||
//From Now minus 365 days
|
|
||||||
dtAfter = ClientNow.AddDays(-365).AddSeconds(-1);
|
|
||||||
//To Now
|
|
||||||
dtBefore = ClientNow;
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*past90days*":
|
|
||||||
//From Now minus 90 days
|
|
||||||
dtAfter = ClientNow.AddDays(-90).AddSeconds(-1);
|
|
||||||
//To Now
|
|
||||||
dtBefore = ClientNow;
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
case "*past30days*":
|
|
||||||
//From Now minus 30 days
|
|
||||||
dtAfter = ClientNow.AddDays(-30).AddSeconds(-1);
|
|
||||||
//To Now
|
|
||||||
dtBefore = ClientNow;
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
case "*past7days*":
|
|
||||||
//From Now minus 7 days
|
|
||||||
dtAfter = ClientNow.AddDays(-7).AddSeconds(-1);
|
|
||||||
//To Now
|
|
||||||
dtBefore = ClientNow;
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*past24hours*":
|
|
||||||
//From Now minus 24 hours
|
|
||||||
dtAfter = ClientNow.AddHours(-24).AddSeconds(-1);
|
|
||||||
//To Now
|
|
||||||
dtBefore = ClientNow;
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*past6hours*":
|
|
||||||
//From Now minus 6 hours
|
|
||||||
dtAfter = ClientNow.AddHours(-6).AddSeconds(-1);
|
|
||||||
//To Now
|
|
||||||
dtBefore = ClientNow;
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*january*":
|
|
||||||
//From zero hour january 1 this year
|
|
||||||
dtAfter = new DateTime(ClientNow.Year, 1, 1).AddSeconds(-1);
|
|
||||||
//To zero hour feb 1 this year
|
|
||||||
dtBefore = new DateTime(ClientNow.Year, 2, 1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*february*":
|
|
||||||
dtAfter = new DateTime(ClientNow.Year, 2, 1).AddSeconds(-1);
|
|
||||||
dtBefore = new DateTime(ClientNow.Year, 3, 1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*march*":
|
|
||||||
dtAfter = new DateTime(ClientNow.Year, 3, 1).AddSeconds(-1);
|
|
||||||
dtBefore = new DateTime(ClientNow.Year, 4, 1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*april*":
|
|
||||||
dtAfter = new DateTime(ClientNow.Year, 4, 1).AddSeconds(-1);
|
|
||||||
dtBefore = new DateTime(ClientNow.Year, 5, 1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*may*":
|
|
||||||
dtAfter = new DateTime(ClientNow.Year, 5, 1).AddSeconds(-1);
|
|
||||||
dtBefore = new DateTime(ClientNow.Year, 6, 1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*june*":
|
|
||||||
dtAfter = new DateTime(ClientNow.Year, 6, 1).AddSeconds(-1);
|
|
||||||
dtBefore = new DateTime(ClientNow.Year, 7, 1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*july*":
|
|
||||||
dtAfter = new DateTime(ClientNow.Year, 7, 1).AddSeconds(-1);
|
|
||||||
dtBefore = new DateTime(ClientNow.Year, 8, 1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*august*":
|
|
||||||
dtAfter = new DateTime(ClientNow.Year, 8, 1).AddSeconds(-1);
|
|
||||||
dtBefore = new DateTime(ClientNow.Year, 9, 1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*september*":
|
|
||||||
dtAfter = new DateTime(ClientNow.Year, 9, 1).AddSeconds(-1);
|
|
||||||
dtBefore = new DateTime(ClientNow.Year, 10, 1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*october*":
|
|
||||||
dtAfter = new DateTime(ClientNow.Year, 10, 1).AddSeconds(-1);
|
|
||||||
dtBefore = new DateTime(ClientNow.Year, 11, 1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*november*":
|
|
||||||
dtAfter = new DateTime(ClientNow.Year, 11, 1).AddSeconds(-1);
|
|
||||||
dtBefore = new DateTime(ClientNow.Year, 12, 1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*december*":
|
|
||||||
//From zero hour dec 1 this year
|
|
||||||
dtAfter = new DateTime(ClientNow.Year, 12, 1).AddSeconds(-1);
|
|
||||||
//To zero hour Jan 1 next year
|
|
||||||
dtBefore = new DateTime(ClientNow.AddYears(1).Year, 1, 1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
case "*lastyearlastmonth*":
|
|
||||||
//start with the first day of this month
|
|
||||||
dtAfter = new DateTime(ClientToday.Year, ClientToday.Month, 1);
|
|
||||||
//subtract a year and a Month
|
|
||||||
dtAfter = dtAfter.AddYears(-1).AddMonths(-1);
|
|
||||||
//Add one month to dtAfter to get end date
|
|
||||||
dtBefore = dtAfter.AddMonths(1);
|
|
||||||
dtAfter = dtAfter.AddSeconds(-1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*lastyearthismonth*":
|
|
||||||
//start with the first day of this month
|
|
||||||
dtAfter = new DateTime(ClientToday.Year, ClientToday.Month, 1);
|
|
||||||
//subtract a year
|
|
||||||
dtAfter = dtAfter.AddYears(-1);
|
|
||||||
//Add one month to dtAfter to get end date
|
|
||||||
dtBefore = dtAfter.AddMonths(1);
|
|
||||||
dtAfter = dtAfter.AddSeconds(-1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "*lastyearnextmonth*":
|
|
||||||
//start with the first day of this month
|
|
||||||
dtAfter = new DateTime(ClientToday.Year, ClientToday.Month, 1);
|
|
||||||
//subtract a year
|
|
||||||
dtAfter = dtAfter.AddYears(-1);
|
|
||||||
//Add a Month
|
|
||||||
dtAfter = dtAfter.AddMonths(1);
|
|
||||||
//Add one month to dtAfter to get end date
|
|
||||||
dtBefore = dtAfter.AddMonths(1);
|
|
||||||
dtAfter = dtAfter.AddSeconds(-1);
|
|
||||||
BuildSQLBetweenTwoTokenDerivedDates(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
|
|
||||||
//dates come in iso8601 UTC format from the client
|
|
||||||
//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
|
|
||||||
|
|
||||||
//comes in UTC, parse converts it to local but touniversal puts it back in utc, weird but only thing that consistently work
|
|
||||||
System.DateTime dtData = DateTime.Parse(sValue).ToUniversalTime();
|
|
||||||
|
|
||||||
//Filter time resolution is in minutes only, you can't select seconds in a filter
|
|
||||||
//so the filter code below must construct a filter time
|
|
||||||
//that falls within the 0th second, 0th millisecond and 59th second and 999th millisecond of the specified time
|
|
||||||
//to ensure it matches the users selections
|
|
||||||
string sDateValueWithZeroSeconds = PostgresDateFormat(ZeroSeconds(dtData));
|
|
||||||
string sDateValueWithMaxSeconds = PostgresDateFormat(MaxSeconds(dtData));
|
|
||||||
|
|
||||||
switch (sOperator)
|
|
||||||
{
|
|
||||||
case DataListFilterComparisonOperator.Equality:
|
|
||||||
sb.Append(">='");
|
|
||||||
sb.Append(sDateValueWithZeroSeconds);
|
|
||||||
sb.Append("' AND ");
|
|
||||||
sb.Append(SqlColumnNameToFilter);
|
|
||||||
sb.Append(" ");
|
|
||||||
sb.Append("<='");
|
|
||||||
sb.Append(sDateValueWithMaxSeconds);
|
|
||||||
sb.Append("'");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DataListFilterComparisonOperator.GreaterThan:
|
|
||||||
sb.Append(">'");
|
|
||||||
sb.Append(sDateValueWithMaxSeconds);
|
|
||||||
sb.Append("'");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DataListFilterComparisonOperator.GreaterThanOrEqualTo:
|
|
||||||
sb.Append(">='");
|
|
||||||
sb.Append(sDateValueWithMaxSeconds);
|
|
||||||
sb.Append("'");
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.LessThan:
|
|
||||||
sb.Append("<'");
|
|
||||||
sb.Append(sDateValueWithMaxSeconds);
|
|
||||||
sb.Append("'");
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.LessThanOrEqualTo:
|
|
||||||
sb.Append("<='");
|
|
||||||
sb.Append(sDateValueWithMaxSeconds);
|
|
||||||
sb.Append("'");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DataListFilterComparisonOperator.NotEqual:
|
|
||||||
sb.Append("<'");
|
|
||||||
sb.Append(sDateValueWithMaxSeconds);
|
|
||||||
sb.Append("' OR ");
|
|
||||||
sb.Append(SqlColumnNameToFilter);
|
|
||||||
sb.Append(" ");
|
|
||||||
sb.Append(">'");
|
|
||||||
sb.Append(sDateValueWithMaxSeconds);
|
|
||||||
sb.Append("'");
|
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new System.ArgumentOutOfRangeException("OPERATOR_TYPE", sOperator, "DataListSqlFilterCriteriaBuilder unhandled operator type [" + sOperator + "] IN DATE_TIME");
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case UiFieldDataType.Enum://enums are just ints to the db, but it's a special type so the client can recognize it
|
|
||||||
case UiFieldDataType.MemorySize://memory / file size, just a long but this type is for display formatting only
|
|
||||||
case UiFieldDataType.Decimal:
|
|
||||||
case UiFieldDataType.Currency:
|
|
||||||
case UiFieldDataType.InternalId:
|
|
||||||
case UiFieldDataType.Integer: //whole numbers, not only integer
|
|
||||||
{
|
|
||||||
//case 1795 - it's numeric, convert to translation independant format
|
|
||||||
//RAVEN NOTE: no numbers are coming from the client in any culture format other than xx,xxx.00 but this is just insurance for api users
|
|
||||||
NumberFormatInfo nfi = System.Globalization.CultureInfo.CurrentCulture.NumberFormat;
|
|
||||||
switch (DataType)
|
|
||||||
{
|
|
||||||
case UiFieldDataType.Decimal:
|
|
||||||
case UiFieldDataType.Currency:
|
|
||||||
{
|
|
||||||
if (nfi.CurrencyDecimalSeparator != ".")
|
|
||||||
{
|
|
||||||
sValue = sValue.Replace(nfi.CurrencyGroupSeparator, "");
|
|
||||||
sValue = sValue.Replace(nfi.CurrencyDecimalSeparator, ".");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case UiFieldDataType.Integer:
|
|
||||||
{
|
|
||||||
if (nfi.NumberDecimalSeparator != ".")
|
|
||||||
{
|
|
||||||
sValue = sValue.Replace(nfi.NumberGroupSeparator, "");
|
|
||||||
sValue = sValue.Replace(nfi.NumberDecimalSeparator, ".");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case UiFieldDataType.InternalId:
|
|
||||||
{
|
|
||||||
//do nothing, it's a simple number
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (sOperator)
|
|
||||||
{
|
|
||||||
case DataListFilterComparisonOperator.Equality:
|
|
||||||
sb.Append("=");
|
|
||||||
sb.Append(sValue);
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.GreaterThan:
|
|
||||||
sb.Append(">");
|
|
||||||
sb.Append(sValue);
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.GreaterThanOrEqualTo:
|
|
||||||
sb.Append(">=");
|
|
||||||
sb.Append(sValue);
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.LessThan:
|
|
||||||
sb.Append("<");
|
|
||||||
sb.Append(sValue);
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.LessThanOrEqualTo:
|
|
||||||
sb.Append("<=");
|
|
||||||
sb.Append(sValue);
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.NotEqual:
|
|
||||||
sb.Append("<>");
|
|
||||||
sb.Append(sValue);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new System.ArgumentOutOfRangeException("OPERATOR_TYPE", sOperator, "DataListSqlFilterCriteriaBuilder unhandled operator type [" + sOperator + "] IN NUMBER");
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case UiFieldDataType.Tags:
|
|
||||||
{
|
|
||||||
//Build tags filter fragment
|
//Build tags filter fragment
|
||||||
//https://www.postgresql.org/docs/current/functions-array.html
|
//https://www.postgresql.org/docs/current/functions-array.html
|
||||||
//https://www.postgresql.org/docs/9.1/functions-array.html
|
//https://www.postgresql.org/docs/9.1/functions-array.html
|
||||||
@@ -1712,58 +1003,7 @@ namespace AyaNova.DataList
|
|||||||
//sounds like it might fuck up when using other languages so...
|
//sounds like it might fuck up when using other languages so...
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case UiFieldDataType.TimeSpan: //TIMESPAN / DURATION
|
|
||||||
{
|
|
||||||
sValue = TimeSpanToPostgresInterval(sValue);
|
|
||||||
/*
|
|
||||||
{ name: vm.$ay.t("GridRowFilterDropDownGreaterThan"), id: ">" },
|
|
||||||
{
|
|
||||||
name: vm.$ay.t("GridRowFilterDropDownGreaterThanOrEqualTo"),
|
|
||||||
id: ">="
|
|
||||||
},
|
|
||||||
{ name: vm.$ay.t("GridRowFilterDropDownLessThan"), id: "<" },
|
|
||||||
{ name: vm.$ay.t("GridRowFilterDropDownLessThanOrEqualTo"), id: "<=" },
|
|
||||||
{ name: vm.$ay.t("GridRowFilterDropDownNotEquals"), id: "!=" }
|
|
||||||
*/
|
|
||||||
switch (sOperator)
|
|
||||||
{
|
|
||||||
case DataListFilterComparisonOperator.Equality:
|
|
||||||
sb.Append("=");
|
|
||||||
sb.Append(sValue);
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.GreaterThan:
|
|
||||||
sb.Append(">");
|
|
||||||
sb.Append(sValue);
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.GreaterThanOrEqualTo:
|
|
||||||
sb.Append(">=");
|
|
||||||
sb.Append(sValue);
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.LessThan:
|
|
||||||
sb.Append("<");
|
|
||||||
sb.Append(sValue);
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.LessThanOrEqualTo:
|
|
||||||
sb.Append("<=");
|
|
||||||
sb.Append(sValue);
|
|
||||||
break;
|
|
||||||
case DataListFilterComparisonOperator.NotEqual:
|
|
||||||
sb.Append("<>");
|
|
||||||
sb.Append(sValue);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new System.ArgumentOutOfRangeException("OPERATOR_TYPE", sOperator, "DataListSqlFilterCriteriaBuilder unhandled operator type [" + sOperator + "] IN TIMESPAN / DURATION");
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
throw new System.ArgumentOutOfRangeException("DATA_TYPE", DataType, "DataListSqlFilterCriteriaBuilder unhandled data type[" + DataType + "]");
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
}//end of nonnull path
|
|
||||||
|
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user