using System.Collections.Generic; using System; using System.Globalization; using System.Text; using Newtonsoft.Json.Linq; using System.Linq; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; namespace AyaNova.DataList { internal class SqlSelectBuilderResult { internal Dictionary map { get; set; } internal string Select { get; set; } } internal static class DataListSqlSelectBuilder { //Build the SELECT portion of a list query based on the ListView fields internal static SqlSelectBuilderResult Build(List objectFieldsList, List listViewFieldList) { StringBuilder sb = new StringBuilder(); sb.Append("SELECT "); //DEPRECATED // //Default ID column for each row (always is aliased as df) // AyaDataListFieldDefinition def = objectFieldsList.FirstOrDefault(x => x.FieldKey == "df"); // if (def == null) // { // throw new System.ArgumentNullException("DataListSqlSelectBuilder: objectFieldList is missing the df default field"); // } // if (string.IsNullOrEmpty(def.SqlIdColumnName)) // { // sb.Append("id");//default when no alternate column is specified // } // else // { // sb.Append(def.SqlIdColumnName); // } // sb.Append(" AS df"); //keep track of which custom fields columns were added already //this ensures that if there is more than one set of custom fields like from two different objects in the list //only unique ones will be returned by query // Dictionary CustomFieldColumnsAddedToQuery = new Dictionary(); //map sql column name to ordinal name Dictionary map = new Dictionary(); //DEPRECATED map.Add("df", 0); int nOrdinal = 0; var firstColumnAdded = false; foreach (string ColumnName in listViewFieldList) { // //skip the df column, it's already been processed above // if (ColumnName == "df") // continue; AyaDataListFieldDefinition o = objectFieldsList.FirstOrDefault(x => x.FieldKey == ColumnName); #if (DEBUG) //Developers little helper if (o == null) { throw new System.ArgumentNullException($"DEV ERROR in DataListSqlSelectBuilder.cs: field {ColumnName} specified in template was NOT found in ObjectFields list"); } #endif if (o != null) {//Ignore missing fields in production if (o.IsCustomField) { //if any are custom field then add custom fields column to query var CustomFieldSqlColumnName = o.GetSqlValueColumnName(); //has it been added yet? if (!map.ContainsKey(CustomFieldSqlColumnName)) { //nope if (firstColumnAdded) sb.Append(", "); sb.Append(CustomFieldSqlColumnName); firstColumnAdded = true; map.Add(CustomFieldSqlColumnName, nOrdinal++); } //if it was already added then can just ignore it // else // { // map.Add(ColumnName, CustomFieldColumnsAddedToQuery[CustomFieldSqlColumnName]); // } } else { 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++); } } } } } return new SqlSelectBuilderResult() { map = map, Select = sb.ToString() }; } }//eoc }//ens