From f18282de38a6dc3c201f626abfc20fcf86a95587 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Wed, 2 Mar 2022 19:16:27 +0000 Subject: [PATCH] --- .../DataListSqlFilterCriteriaBuilder.cs | 27 +++++++++++++++++++ server/AyaNova/kpi/WorkOrderOverdueAllList.cs | 14 +++++----- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs index 88f580c9..acd5e481 100644 --- a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs +++ b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs @@ -1145,6 +1145,33 @@ namespace AyaNova.DataList } + //////////////////////////////////////////////////////////////////////// + // + /// + /// Translate KPI tag filter to PostgreSQL friendly SQL criteria + /// + public static string KPITagFilterToSqlCriteria(string SqlColumnNameToFilter, List sValue, bool bAny) + { + if(sValue.Count==0) return string.Empty; + //if it's an OR (any) query then need to build individual terms, if it's not then it's just an all or AND query and can pass through as is + if (sValue.Count > 0 && bAny == true) + { + StringBuilder sb = new StringBuilder(); + sb.Append(" AND "); + sb.Append("("); + foreach (string s in sValue) + { + sb.Append($"({TagDataFilterToColumnCriteria(SqlColumnNameToFilter, DataListFilterComparisonOperator.Contains, s)}) OR "); + } + var ret = sb.ToString(); + return ret.Substring(0, ret.LastIndexOf(" OR ")) + ")"; + } + else + { + //it's an AND (not any) query so it's just all inclusive but still contains + return " AND " + TagDataFilterToColumnCriteria(SqlColumnNameToFilter, DataListFilterComparisonOperator.Contains, string.Join(",", sValue)); + } + } diff --git a/server/AyaNova/kpi/WorkOrderOverdueAllList.cs b/server/AyaNova/kpi/WorkOrderOverdueAllList.cs index bce29a48..b8defcfb 100644 --- a/server/AyaNova/kpi/WorkOrderOverdueAllList.cs +++ b/server/AyaNova/kpi/WorkOrderOverdueAllList.cs @@ -27,15 +27,17 @@ namespace AyaNova.KPI { var wotags = options.Criteria["wotags"].ToObject>(); + bool wotagsany = options.Criteria["wotagsany"].ToObject(); var woitemtags = options.Criteria["woitemtags"].ToObject>(); + bool woitemtagsany = options.Criteria["woitemtagsany"].ToObject(); - string woTagsWhere = null; - if (wotags.Count > 0) - woTagsWhere = " AND " + DataListSqlFilterCriteriaBuilder.TagDataFilterToColumnCriteria("aworkorder.tags", DataListFilterComparisonOperator.Contains, string.Join(",", wotags)); + string woTagsWhere = DataListSqlFilterCriteriaBuilder.KPITagFilterToSqlCriteria("aworkorder.tags", wotags, wotagsany); + // if (wotags.Count > 0) + // woTagsWhere = " AND " + DataListSqlFilterCriteriaBuilder.TagDataFilterToColumnCriteria("aworkorder.tags", DataListFilterComparisonOperator.Contains, string.Join(",", wotags)); - string woItemTagsWhere = null; - if (woitemtags.Count > 0) - woItemTagsWhere = " AND " + DataListSqlFilterCriteriaBuilder.TagDataFilterToColumnCriteria("aworkorderitem.tags", DataListFilterComparisonOperator.Contains, string.Join(",", woitemtags)); + string woItemTagsWhere = DataListSqlFilterCriteriaBuilder.KPITagFilterToSqlCriteria("aworkorderitem.tags", woitemtags, woitemtagsany); ; + // if (woitemtags.Count > 0) + // woItemTagsWhere = " AND " + DataListSqlFilterCriteriaBuilder.TagDataFilterToColumnCriteria("aworkorderitem.tags", DataListFilterComparisonOperator.Contains, string.Join(",", woitemtags)); _dataQuery = @$"SELECT row_to_json(t) as res from ( SELECT distinct(AWORKORDER.ID),