From fdac6f75657b4d7c0474dc7d49b63844a51d800e Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Fri, 14 Feb 2020 19:12:13 +0000 Subject: [PATCH] --- .../DataListSqlFilterCriteriaBuilder.cs | 100 +++++++++++------- 1 file changed, 60 insertions(+), 40 deletions(-) diff --git a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs index b2010b57..6e196678 100644 --- a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs +++ b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs @@ -19,25 +19,26 @@ namespace AyaNova.DataList return ""; } - StringBuilder sb = new StringBuilder(); + //List to compile each columns where clause fragment for later assembly into sql query + List ColumnWhereClauses = new List(); - //bugbug too many paranthesis: - //" where (((awidget.name Like 'DateOpEqualityFilterWorks%')) AND ((awidget.startdate >='1968-03-12T18:00:00.0000000' AND awidget.startdate <='1968-03-12T18:00:00.9990000Z'))" + //StringBuilder sb = new StringBuilder(); + + bool ThisIsTheFirstColumnWhereGroup = true; //iterate the list view fields and concatenate a sql query from it //// [{key:"COLUMN UNIQUE KEY ID",sort:"-" or "+",filter:{any:true/false,items:[{FILTER OBJECT SEE BELOW}]} }, {key:"second column unique key"},{...etc...}] for (int i = 0; i < listViewArray.Count; i++) { - + StringBuilder sb = new StringBuilder(); var cm = listViewArray[i]; - //skip it if sort is not defined + //skip it if FILTER is not defined if (cm["filter"] == null) { continue; } - //Yup there's at least one filter here for this column - sb.Append("("); + //Get some info about this column / field var fld = cm["fld"].Value(); @@ -60,33 +61,47 @@ namespace AyaNova.DataList IsOrFilter = cm["filter"]["any"].Value(); } - //Is there more than one filter for this column? - if (filterItems.Count > 1) - { - //Yup, so put the whole group in paranthesis - sb.Append("("); - } + //Iterate filter items building this WHERE segment + bool ThisIsTheFirstFilterItemForThisColumn = true; + var ThereAreMultipleFilterItems = filterItems.Count > 1; + for (int y = 0; y < filterItems.Count; y++) { - //Put this item in parenthesis - // sb.Append("("); - var filterItem = (JObject)filterItems[y]; + //close or open another parenthetic group + //Is this the first filter item of multiple for this field? + if (ThisIsTheFirstFilterItemForThisColumn && ThereAreMultipleFilterItems) + { + //Yup, so put the entire where group for this field in parenthesis + sb.Append("("); + } + + //Is this a subsequent filter for this column? + if (!ThisIsTheFirstFilterItemForThisColumn) + { + //Close last filter item and start new one + if (IsOrFilter) + sb.Append(") OR ("); + else + sb.Append(") AND ("); + + } + + + //gather filter data + var filterItem = (JObject)filterItems[y]; var opType = filterItem["op"].Value(); List tagList = new List(); string val = string.Empty; - bool IsPossibleIdValue = filterItem["value"].Type == JTokenType.Integer; - if (filterItem["value"].Type != JTokenType.Array) val = filterItem["value"].Value(); else { tagList = filterItem["value"].ToObject>(); } - //prep for possible ID field filter instead string columnNameToFilter = string.Empty; UiFieldDataType DataTypeToFilter = UiFieldDataType.NoType; @@ -104,38 +119,43 @@ namespace AyaNova.DataList DataTypeToFilter = (UiFieldDataType)dataType; columnNameToFilter = DataListField.GetSqlValueColumnName(); } + + //Append this filter's criteria sb.Append(DataFilterToColumnCriteria(columnNameToFilter, DataTypeToFilter, opType, val, tagList, userId)); - //close this item parenthesis - if (y < filterItems.Count - 1) - { - if (IsOrFilter) - sb.Append(") OR ("); - else - sb.Append(") AND ("); - } - // else - // { - // sb.Append(")"); - // } - + ThisIsTheFirstFilterItemForThisColumn = false; } - if (filterItems.Count > 1) + //we've done at least one now + ThisIsTheFirstColumnWhereGroup = false; + + if (ThereAreMultipleFilterItems) { - //close this group + //The whole thing was in a group so close this group sb.Append(")"); } + ColumnWhereClauses.Add(sb.ToString()); + - if (i < listViewArray.Count - 1) - { - sb.Append(") AND "); - } } - if (sb.Length == 0) + if (ColumnWhereClauses.Count == 0) return string.Empty; else - return " where " + sb.ToString() + ")"; + { + StringBuilder sb = new StringBuilder(); + sb.Append(" where "); + for (int i = 0; i < ColumnWhereClauses.Count; i++) + { + sb.Append("("); + sb.Append(ColumnWhereClauses[i]); + sb.Append(")"); + if (i < ColumnWhereClauses.Count-1) + { + sb.Append(" AND "); + } + } + return sb.ToString(); + } } ///