This commit is contained in:
@@ -2,13 +2,9 @@ using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.JsonPatch;
|
||||
using EnumsNET;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using AyaNova.Util;
|
||||
using AyaNova.Api.ControllerHelpers;
|
||||
using AyaNova.Biz;
|
||||
using AyaNova.Models;
|
||||
|
||||
|
||||
|
||||
@@ -2,18 +2,49 @@ using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace AyaNova.Biz
|
||||
{
|
||||
public static class FilterSqlCriteriaBuilder
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
public static string DataFilterToSQLCriteria(AyaNova.Models.DataFilter dataFilter, FilterOptions filterOptions)
|
||||
{
|
||||
|
||||
if (string.IsNullOrWhiteSpace(dataFilter.Filter))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
//iterate the datafilter and concatenate a sql query from it
|
||||
var FilterArray = JArray.Parse(dataFilter.Filter);
|
||||
for (int i = 0; i < FilterArray.Count; i++)
|
||||
{
|
||||
|
||||
var filterItem = FilterArray[i];
|
||||
var fld = filterItem["fld"].Value<string>();
|
||||
var opType = filterItem["op"].Value<string>();
|
||||
var val = filterItem["value"].Value<string>();
|
||||
var dataType = filterOptions.Flds.Find(x => x.Fld == fld).Type;
|
||||
|
||||
sb.Append(DataFilterToColumnCriteria(fld, dataType, opType, val));
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Translate DataFilter to Postgres friendly SQL criteria
|
||||
/// </summary>
|
||||
private static string GridToSqlCriteria(string sColumn, string sDataType, string sOperator, string sValue, bool IsCompound)
|
||||
private static string DataFilterToColumnCriteria(string sColumn, string sDataType, string sOperator, string sValue)//, bool IsCompound)
|
||||
{
|
||||
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
//Column name
|
||||
//sb.Append(" ");
|
||||
@@ -73,44 +104,44 @@ namespace AyaNova.Biz
|
||||
//so....
|
||||
//Special addition to handle nulls
|
||||
|
||||
if (!IsCompound)
|
||||
// if (!IsCompound)
|
||||
// {
|
||||
switch (sOperator)
|
||||
{
|
||||
switch (sOperator)
|
||||
{
|
||||
case "Equals":
|
||||
//no change on equals for nulls
|
||||
break;
|
||||
case "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 "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 "LessThan":
|
||||
sb.Append("Is Null OR ");
|
||||
sb.Append(sColumn);
|
||||
sb.Append(" ");
|
||||
break;
|
||||
case "LessThanOrEqualTo":
|
||||
sb.Append("Is Null OR ");
|
||||
sb.Append(sColumn);
|
||||
sb.Append(" ");
|
||||
break;
|
||||
case "Like":
|
||||
//No change on like
|
||||
break;
|
||||
case "NotEquals":
|
||||
//This is the big one:
|
||||
sb.Append("Is Null OR ");
|
||||
sb.Append(sColumn);
|
||||
sb.Append(" ");
|
||||
break;
|
||||
}
|
||||
case "Equals":
|
||||
//no change on equals for nulls
|
||||
break;
|
||||
case "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 "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 "LessThan":
|
||||
sb.Append("Is Null OR ");
|
||||
sb.Append(sColumn);
|
||||
sb.Append(" ");
|
||||
break;
|
||||
case "LessThanOrEqualTo":
|
||||
sb.Append("Is Null OR ");
|
||||
sb.Append(sColumn);
|
||||
sb.Append(" ");
|
||||
break;
|
||||
case "Like":
|
||||
//No change on like
|
||||
break;
|
||||
case "NotEquals":
|
||||
//This is the big one:
|
||||
sb.Append("Is Null OR ");
|
||||
sb.Append(sColumn);
|
||||
sb.Append(" ");
|
||||
break;
|
||||
}
|
||||
// }
|
||||
|
||||
#region Build for specific type
|
||||
switch (sDataType)
|
||||
@@ -304,7 +335,7 @@ namespace AyaNova.Biz
|
||||
dtBefore = System.DateTime.Today.AddDays(1);
|
||||
//dtBefore=dtBefore.AddSeconds(1);
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
//sb.Append(" ");
|
||||
sb.Append(sColumn);
|
||||
@@ -320,7 +351,7 @@ namespace AyaNova.Biz
|
||||
dtBefore = System.DateTime.Today.AddDays(2);
|
||||
//dtBefore=dtBefore.AddSeconds(1);
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
//sb.Append(" ");
|
||||
sb.Append(sColumn);
|
||||
@@ -348,7 +379,7 @@ namespace AyaNova.Biz
|
||||
dtAfter = dtAfter.AddSeconds(-1);
|
||||
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
//sb.Append(" ");
|
||||
sb.Append(sColumn);
|
||||
@@ -385,7 +416,7 @@ namespace AyaNova.Biz
|
||||
}
|
||||
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
//sb.Append(" ");
|
||||
sb.Append(sColumn);
|
||||
@@ -416,7 +447,7 @@ namespace AyaNova.Biz
|
||||
dtAfter = dtAfter.AddSeconds(-1);
|
||||
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
//sb.Append(" ");
|
||||
sb.Append(sColumn);
|
||||
@@ -440,7 +471,7 @@ namespace AyaNova.Biz
|
||||
// 'yyyy-mm-ddTHH:MM:SS'
|
||||
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
//sb.Append(" ");
|
||||
sb.Append(sColumn);
|
||||
@@ -460,7 +491,7 @@ namespace AyaNova.Biz
|
||||
dtAfter = dtAfter.AddSeconds(-1);
|
||||
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
//sb.Append(" ");
|
||||
sb.Append(sColumn);
|
||||
@@ -483,7 +514,7 @@ namespace AyaNova.Biz
|
||||
dtAfter = dtAfter.AddSeconds(-1);
|
||||
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
//sb.Append(" ");
|
||||
sb.Append(sColumn);
|
||||
@@ -504,7 +535,7 @@ namespace AyaNova.Biz
|
||||
dtAfter = dtAfter.AddSeconds(-1);
|
||||
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
//sb.Append(" ");
|
||||
sb.Append(sColumn);
|
||||
@@ -522,7 +553,7 @@ namespace AyaNova.Biz
|
||||
dtAfter = new DateTime(1753, 1, 2, 00, 00, 00);
|
||||
dtBefore = System.DateTime.Now;
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
sb.Append(sColumn);
|
||||
sb.Append(" ");
|
||||
@@ -536,7 +567,7 @@ namespace AyaNova.Biz
|
||||
dtAfter = System.DateTime.Now;
|
||||
dtBefore = System.DateTime.Now.AddYears(999);
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
sb.Append(sColumn);
|
||||
sb.Append(" ");
|
||||
@@ -551,7 +582,7 @@ namespace AyaNova.Biz
|
||||
//To zero hour January 1 this year
|
||||
dtBefore = new DateTime(DateTime.Now.Year, 1, 1, 00, 00, 00);
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
sb.Append(sColumn);
|
||||
sb.Append(" ");
|
||||
@@ -566,7 +597,7 @@ namespace AyaNova.Biz
|
||||
//To zero hour Jan 1 next year
|
||||
dtBefore = new DateTime(DateTime.Now.AddYears(1).Year, 1, 1, 00, 00, 00);
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
sb.Append(sColumn);
|
||||
sb.Append(" ");
|
||||
@@ -581,7 +612,7 @@ namespace AyaNova.Biz
|
||||
//To Now
|
||||
dtBefore = DateTime.Now;
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
sb.Append(sColumn);
|
||||
sb.Append(" ");
|
||||
@@ -596,7 +627,7 @@ namespace AyaNova.Biz
|
||||
//To Now
|
||||
dtBefore = DateTime.Now;
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
sb.Append(sColumn);
|
||||
sb.Append(" ");
|
||||
@@ -611,7 +642,7 @@ namespace AyaNova.Biz
|
||||
//To Now
|
||||
dtBefore = DateTime.Now;
|
||||
sb.Append(">'");
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append(PostgresDateFormat(dtAfter));
|
||||
sb.Append("') AND (");
|
||||
sb.Append(sColumn);
|
||||
sb.Append(" ");
|
||||
@@ -817,12 +848,12 @@ namespace AyaNova.Biz
|
||||
// }
|
||||
|
||||
|
||||
public static DateTime ZeroMilliseconds(DateTime d)
|
||||
private static DateTime ZeroMilliseconds(DateTime d)
|
||||
{
|
||||
if (d.Millisecond == 0) return d;
|
||||
return new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second, DateTimeKind.Utc);
|
||||
}
|
||||
public static DateTime MaxMilliseconds(DateTime d)
|
||||
private static DateTime MaxMilliseconds(DateTime d)
|
||||
{
|
||||
if (d.Millisecond == 0) return d;
|
||||
return new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second, 999, DateTimeKind.Utc);
|
||||
@@ -833,7 +864,7 @@ namespace AyaNova.Biz
|
||||
/// https://www.postgresql.org/docs/current/datatype-datetime.html#DATATYPE-DATETIME-DATE-TABLE
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static string PostgresDateFormat(DateTime theDate)
|
||||
private static string PostgresDateFormat(DateTime theDate)
|
||||
{
|
||||
//If this was used it should be like this for a UTC date to iso8601
|
||||
// ISO8601 with 7 decimal places
|
||||
|
||||
@@ -175,6 +175,7 @@ namespace AyaNova.Biz
|
||||
var q = "SELECT *, xmin FROM AWIDGET ";
|
||||
|
||||
//BUILD WHERE AND APPEND IT
|
||||
q=q+FilterSqlCriteriaBuilder.DataFilterToSQLCriteria(theFilter,WidgetBiz.FilterOptions);
|
||||
|
||||
//BUILD ORDER BY AND APPEND IT
|
||||
|
||||
|
||||
Reference in New Issue
Block a user