This commit is contained in:
2018-12-03 20:09:10 +00:00
parent 51941a958e
commit 59beefd3a4
3 changed files with 89 additions and 61 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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