From 59beefd3a4f380427fe8c2cb124df772327b5ac4 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Mon, 3 Dec 2018 20:09:10 +0000 Subject: [PATCH] --- server/AyaNova/biz/DataFilterBiz.cs | 4 - .../AyaNova/biz/FilterSqlCriteriaBuilder.cs | 145 +++++++++++------- server/AyaNova/biz/WidgetBiz.cs | 1 + 3 files changed, 89 insertions(+), 61 deletions(-) diff --git a/server/AyaNova/biz/DataFilterBiz.cs b/server/AyaNova/biz/DataFilterBiz.cs index 809c5b47..3e8f9b96 100644 --- a/server/AyaNova/biz/DataFilterBiz.cs +++ b/server/AyaNova/biz/DataFilterBiz.cs @@ -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; diff --git a/server/AyaNova/biz/FilterSqlCriteriaBuilder.cs b/server/AyaNova/biz/FilterSqlCriteriaBuilder.cs index 836709a7..5d67707a 100644 --- a/server/AyaNova/biz/FilterSqlCriteriaBuilder.cs +++ b/server/AyaNova/biz/FilterSqlCriteriaBuilder.cs @@ -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(); + var opType = filterItem["op"].Value(); + var val = filterItem["value"].Value(); + var dataType = filterOptions.Flds.Find(x => x.Fld == fld).Type; + + sb.Append(DataFilterToColumnCriteria(fld, dataType, opType, val)); + } + + return sb.ToString(); + } + /// /// Translate DataFilter to Postgres friendly SQL criteria /// - 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 /// /// - 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 diff --git a/server/AyaNova/biz/WidgetBiz.cs b/server/AyaNova/biz/WidgetBiz.cs index 5dc8974a..93d0e974 100644 --- a/server/AyaNova/biz/WidgetBiz.cs +++ b/server/AyaNova/biz/WidgetBiz.cs @@ -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