From ef0b4e9663b608a4732d17437b2f854a4b128cae Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Wed, 27 Jan 2021 19:41:21 +0000 Subject: [PATCH] --- server/AyaNova/DataList/DataListFetcher.cs | 79 ++++--- .../DataListSqlFilterCriteriaBuilder.cs | 2 +- .../DataListSqlFilterOrderByBuilder.cs | 2 +- .../DataList/DataListSqlSelectBuilder.cs | 200 ++++++++++-------- 4 files changed, 160 insertions(+), 123 deletions(-) diff --git a/server/AyaNova/DataList/DataListFetcher.cs b/server/AyaNova/DataList/DataListFetcher.cs index b0bc8213..c775eedf 100644 --- a/server/AyaNova/DataList/DataListFetcher.cs +++ b/server/AyaNova/DataList/DataListFetcher.cs @@ -242,12 +242,12 @@ namespace AyaNova.DataList // // //internal static async Task GetIdListResponseAsync(string dataListKey, string listView, string metaListView, AyContext ct, AuthorizationRoles userRoles, ILogger log, long userId) - internal static async Task GetIdListResponseAsync(AyContext ct, DataListSelectionOptions dataListSelectionOptions, AuthorizationRoles userRoles, ILogger log, long userId) + internal static async Task GetIdListResponseAsync(AyContext ct, DataListSelectionOptions dataListSelectionOptions, AuthorizationRoles userRoles, ILogger log, long userId) { - var DataList = DataListFactory.GetAyaDataList(dataListKey); + var DataList = DataListFactory.GetAyaDataList(dataListSelectionOptions.DataListKey); //was the name not found as a list? if (DataList == null) - throw new System.ArgumentOutOfRangeException($"DataList \"{dataListKey}\" specified does not exist"); + throw new System.ArgumentOutOfRangeException($"DataList \"{dataListSelectionOptions.DataListKey}\" specified does not exist"); @@ -255,34 +255,42 @@ namespace AyaNova.DataList if (!userRoles.HasAnyFlags(DataList.AllowedRoles)) throw new System.UnauthorizedAccessException("User roles insufficient for this datalist"); - //do we need to default the listView? - if (string.IsNullOrWhiteSpace(listView)) - listView = DataList.DefaultListView; + // //do we need to default the listView? + // if (string.IsNullOrWhiteSpace(listView)) + // listView = DataList.DefaultListView; - //parse the list view - var ListViewArray = JArray.Parse(listView); + DataList.SetListOptionDefaultsIfNecessary(dataListSelectionOptions); + + // //parse the list view + // var ListViewArray = JArray.Parse(listView); - //Hard coded extra criteria from server end + // //Hard coded extra criteria from server end + // if (DataList is IAyaDataListServerCriteria) + // { + // var ServerCriteriaListView = JArray.Parse(((IAyaDataListServerCriteria)DataList).DataListServerCriteria(await ct.User.AsNoTracking().FirstOrDefaultAsync(z => z.Id == userId), ct)); + // foreach (JToken jt in ServerCriteriaListView) + // ListViewArray.Add(jt); + // } + + //STATIC filter options from server + List StaticServerFilterOptions = null; if (DataList is IAyaDataListServerCriteria) - { - var ServerCriteriaListView = JArray.Parse(((IAyaDataListServerCriteria)DataList).DataListServerCriteria(await ct.User.AsNoTracking().FirstOrDefaultAsync(z => z.Id == userId), ct)); - foreach (JToken jt in ServerCriteriaListView) - ListViewArray.Add(jt); - } + StaticServerFilterOptions = ((IAyaDataListServerCriteria)DataList).DataListServerCriteria(userId, userRoles, dataListSelectionOptions); - //Hard coded extra criteria from Client end - //parse and combine any additional listview hard coded from Client UI - var MetaListViewArray = JArray.Parse(metaListView ?? "[]"); - foreach (JToken jt in MetaListViewArray) - ListViewArray.Add(jt); - //Get the field key names in a list from the listview - List ListViewFieldList = DataList.GetFieldListFromListView(ListViewArray); + // //Hard coded extra criteria from Client end + // //parse and combine any additional listview hard coded from Client UI + // var MetaListViewArray = JArray.Parse(metaListView ?? "[]"); + // foreach (JToken jt in MetaListViewArray) + // ListViewArray.Add(jt); + + // //Get the field key names in a list from the listview + // List ListViewFieldList = DataList.GetFieldListFromListView(ListViewArray); //BUILD THE QUERY //SELECT FRAGMENT COLUMNS FROM TEMPLATE - var SelectBuild = DataListSqlSelectBuilder.BuildForReportIdListOnly(DataList.FieldDefinitions, ListViewFieldList); + var SelectBuild = DataListSqlSelectBuilder.BuildForReportIdListOnly(DataList.FieldDefinitions); //FROM CLAUSE var qFrom = DataList.SQLFrom; @@ -291,10 +299,10 @@ namespace AyaNova.DataList var qOrderBy = string.Empty; //WHERE CLAUSE - FILTER - qWhere = DataListSqlFilterCriteriaBuilder.DataFilterToSQLCriteria(DataList.FieldDefinitions, ListViewArray); + qWhere = DataListSqlFilterCriteriaBuilder.DataFilterToSQLCriteria(DataList.FieldDefinitions, dataListSelectionOptions); //ORDER BY CLAUSE - SORT - qOrderBy = DataListSqlFilterOrderByBuilder.DataFilterToSQLOrderBy(DataList.FieldDefinitions, ListViewArray); + qOrderBy = DataListSqlFilterOrderByBuilder.DataFilterToSQLOrderBy(DataList.FieldDefinitions, dataListSelectionOptions); //PUT IT ALL TOGETHER string qDataQuery = string.Empty; @@ -306,16 +314,19 @@ namespace AyaNova.DataList //GET ID COLUMN ORDINAL int IDColumnOrdinal = 0; - foreach (string TemplateField in ListViewFieldList) - { - //get the AyaObjectFieldDefinition - AyaDataListFieldDefinition f = DataList.FieldDefinitions.FirstOrDefault(z => z.FieldKey == TemplateField); - if (f.IsRowId) - { - IDColumnOrdinal = SelectBuild.map[f.SqlIdColumnName]; - break; - } - } + + //NOTE: assuming change of code means id column is *always* the zeroth column + + // foreach (string TemplateField in ListViewFieldList) + // { + // //get the AyaObjectFieldDefinition + // AyaDataListFieldDefinition f = DataList.FieldDefinitions.FirstOrDefault(z => z.FieldKey == TemplateField); + // if (f.IsRowId) + // { + // IDColumnOrdinal = SelectBuild.map[f.SqlIdColumnName]; + // break; + // } + // } using (var command = ct.Database.GetDbConnection().CreateCommand()) { diff --git a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs index 5861a14c..93d3ac84 100644 --- a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs +++ b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs @@ -11,7 +11,7 @@ namespace AyaNova.DataList { public static class DataListSqlFilterCriteriaBuilder { - public static string DataFilterToSQLCriteria(List objectFieldsList, DataListTableOptions listOptions) + public static string DataFilterToSQLCriteria(List objectFieldsList, DataListBase listOptions) { if (listOptions.Filter == null || listOptions.Filter.Count == 0) diff --git a/server/AyaNova/DataList/DataListSqlFilterOrderByBuilder.cs b/server/AyaNova/DataList/DataListSqlFilterOrderByBuilder.cs index 7f8f9f30..5d21fc0f 100644 --- a/server/AyaNova/DataList/DataListSqlFilterOrderByBuilder.cs +++ b/server/AyaNova/DataList/DataListSqlFilterOrderByBuilder.cs @@ -10,7 +10,7 @@ namespace AyaNova.DataList { - public static string DataFilterToSQLOrderBy(List objectFieldsList, DataListTableOptions listOptions) + public static string DataFilterToSQLOrderBy(List objectFieldsList, DataListBase listOptions) { StringBuilder sb = new StringBuilder(); diff --git a/server/AyaNova/DataList/DataListSqlSelectBuilder.cs b/server/AyaNova/DataList/DataListSqlSelectBuilder.cs index af6fe330..430561f6 100644 --- a/server/AyaNova/DataList/DataListSqlSelectBuilder.cs +++ b/server/AyaNova/DataList/DataListSqlSelectBuilder.cs @@ -108,106 +108,132 @@ namespace AyaNova.DataList } } return new SqlSelectBuilderResult() { map = map, Select = sb.ToString() }; - }//eof - + }//eom //Build the SELECT portion of a list query but only to return rowid's - internal static SqlSelectBuilderResult BuildForReportIdListOnly(List objectFieldsList, List listViewFieldList) + internal static SqlSelectBuilderResult BuildForReportIdListOnly(List objectFieldsList) { StringBuilder sb = new StringBuilder(); sb.Append("SELECT "); //map sql column name to ordinal name Dictionary map = new Dictionary(); - int nOrdinal = 0; - var firstColumnAdded = false; - foreach (string ColumnName in listViewFieldList) + //find the rowid in the objectfields list and insert it + var o = objectFieldsList.FirstOrDefault(z => z.IsRowId == true); + if (o != null) { - AyaDataListFieldDefinition o = objectFieldsList.FirstOrDefault(z => z.FieldKey == ColumnName); -#if (DEBUG) - //Developers little helper - if (o == null) + var idColumnName = o.SqlIdColumnName; + if (!string.IsNullOrWhiteSpace(idColumnName)) { - throw new System.ArgumentNullException($"DEV ERROR in DataListSqlSelectBuilder.cs:BuildForReportIdListOnly() field {ColumnName} specified in template was NOT found in ObjectFields list"); - } -#endif - if (o != null && o.IsRowId)//only return the rowid column - {//Ignore missing fields in production - AddTheColumn(sb, map, ref nOrdinal, ref firstColumnAdded, o); - } - } - - - //insert rowid if it wasn't specified already in the list view - //this is legit as some datalists don't have a rowid visible to user e.g. PartInventoryOnHand - if (map.Count == 0) - { - //find the rowid in the objectfields list and insert it since it wasn't in the view already - var o = objectFieldsList.FirstOrDefault(z => z.IsRowId == true); - if (o != null) - { - // if(!string.IsNullOrWhiteSpace(rowIdColumn.SqlIdColumnName)){ - // map.Add(rowIdColumn.SqlIdColumnName, nOrdinal++); - // }else{ - // map.Add(rowIdColumn.GetSqlValueColumnName(), nOrdinal++); - // } - AddTheColumn(sb, map, ref nOrdinal, ref firstColumnAdded, o); - } - - } - return new SqlSelectBuilderResult() { map = map, Select = sb.ToString() }; - }//eof - - private static void AddTheColumn(StringBuilder sb, Dictionary map, ref int nOrdinal, ref bool firstColumnAdded, AyaDataListFieldDefinition o) - { - // var valueColumnName = o.GetSqlValueColumnName(); - // if (!map.ContainsKey(valueColumnName)) - // { - // if (firstColumnAdded) - // sb.Append(", "); - // sb.Append(valueColumnName); - // firstColumnAdded = true; - // map.Add(valueColumnName, nOrdinal++); - // } - - // //does it also have an ID column? - // var idColumnName = o.SqlIdColumnName; - // if (!string.IsNullOrWhiteSpace(idColumnName)) - // { - // if (!map.ContainsKey(idColumnName)) - // { - // if (firstColumnAdded) - // sb.Append(", "); - // sb.Append(idColumnName); - // firstColumnAdded = true; - // map.Add(idColumnName, nOrdinal++); - // } - // } - - // var valueColumnName = o.GetSqlValueColumnName(); - // if (!map.ContainsKey(valueColumnName)) - // { - // if (firstColumnAdded) - // sb.Append(", "); - // sb.Append(valueColumnName); - // firstColumnAdded = true; - // map.Add(valueColumnName, nOrdinal++); - // } - - //does it also have an ID column? - var idColumnName = o.SqlIdColumnName; - if (!string.IsNullOrWhiteSpace(idColumnName)) - { - // if (!map.ContainsKey(idColumnName)) - // { - // if (firstColumnAdded) - // sb.Append(", "); sb.Append(idColumnName); - // firstColumnAdded = true; map.Add(idColumnName, 0); - // } + } } - } + + return new SqlSelectBuilderResult() { map = map, Select = sb.ToString() }; + }//eom + + + // //Build the SELECT portion of a list query but only to return rowid's + // internal static SqlSelectBuilderResult BuildForReportIdListOnly(List objectFieldsList, List listViewFieldList) + // { + // StringBuilder sb = new StringBuilder(); + // sb.Append("SELECT "); + // //map sql column name to ordinal name + // Dictionary map = new Dictionary(); + // int nOrdinal = 0; + + // var firstColumnAdded = false; + // foreach (string ColumnName in listViewFieldList) + // { + // AyaDataListFieldDefinition o = objectFieldsList.FirstOrDefault(z => z.FieldKey == ColumnName); + // #if (DEBUG) + // //Developers little helper + // if (o == null) + // { + // throw new System.ArgumentNullException($"DEV ERROR in DataListSqlSelectBuilder.cs:BuildForReportIdListOnly() field {ColumnName} specified in template was NOT found in ObjectFields list"); + // } + // #endif + // if (o != null && o.IsRowId)//only return the rowid column + // {//Ignore missing fields in production + // AddTheColumn(sb, map, ref nOrdinal, ref firstColumnAdded, o); + // } + // } + + + // //insert rowid if it wasn't specified already in the list view + // //this is legit as some datalists don't have a rowid visible to user e.g. PartInventoryOnHand + // if (map.Count == 0) + // { + // //find the rowid in the objectfields list and insert it since it wasn't in the view already + // var o = objectFieldsList.FirstOrDefault(z => z.IsRowId == true); + // if (o != null) + // { + // // if(!string.IsNullOrWhiteSpace(rowIdColumn.SqlIdColumnName)){ + // // map.Add(rowIdColumn.SqlIdColumnName, nOrdinal++); + // // }else{ + // // map.Add(rowIdColumn.GetSqlValueColumnName(), nOrdinal++); + // // } + // AddTheColumn(sb, map, ref nOrdinal, ref firstColumnAdded, o); + // } + + // } + // return new SqlSelectBuilderResult() { map = map, Select = sb.ToString() }; + // }//eof + + + + + // private static void AddTheColumn(StringBuilder sb, Dictionary map, ref int nOrdinal, ref bool firstColumnAdded, AyaDataListFieldDefinition o) + // { + // // var valueColumnName = o.GetSqlValueColumnName(); + // // if (!map.ContainsKey(valueColumnName)) + // // { + // // if (firstColumnAdded) + // // sb.Append(", "); + // // sb.Append(valueColumnName); + // // firstColumnAdded = true; + // // map.Add(valueColumnName, nOrdinal++); + // // } + + // // //does it also have an ID column? + // // var idColumnName = o.SqlIdColumnName; + // // if (!string.IsNullOrWhiteSpace(idColumnName)) + // // { + // // if (!map.ContainsKey(idColumnName)) + // // { + // // if (firstColumnAdded) + // // sb.Append(", "); + // // sb.Append(idColumnName); + // // firstColumnAdded = true; + // // map.Add(idColumnName, nOrdinal++); + // // } + // // } + + // // var valueColumnName = o.GetSqlValueColumnName(); + // // if (!map.ContainsKey(valueColumnName)) + // // { + // // if (firstColumnAdded) + // // sb.Append(", "); + // // sb.Append(valueColumnName); + // // firstColumnAdded = true; + // // map.Add(valueColumnName, nOrdinal++); + // // } + + // //does it also have an ID column? + // var idColumnName = o.SqlIdColumnName; + // if (!string.IsNullOrWhiteSpace(idColumnName)) + // { + // // if (!map.ContainsKey(idColumnName)) + // // { + // // if (firstColumnAdded) + // // sb.Append(", "); + // sb.Append(idColumnName); + // // firstColumnAdded = true; + // map.Add(idColumnName, 0); + // // } + // } + // } }//eoc }//ens