using System.Collections.Generic; using System.Text; using System.Linq; using Sockeye.Models; namespace Sockeye.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 columns internal static SqlSelectBuilderResult BuildForDataTableListResponse(List objectFieldsList, List columns) { StringBuilder sb = new StringBuilder(); sb.Append("SELECT "); //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 //map sql column name to ordinal name Dictionary map = new Dictionary(); int nOrdinal = 0; var firstColumnAdded = false; foreach (string ColumnName in columns) { DataListFieldDefinition o = objectFieldsList.FirstOrDefault(z => z.FieldKey == ColumnName); #if (DEBUG) //Developers little helper if (o == null) { throw new System.ArgumentNullException($"## DEV ERROR in DataListSqlSelectBuilder.cs:BuildForDataTableListResponse() field {ColumnName} specified in columns was NOT found in the data list's ObjectFields list, a defined fieldkey name differs from the columns key name"); } #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++); } } 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++); } } //does it also have an openable SockType column? var sockTypeColumnName = o.SqlATypeColumnName; if (!string.IsNullOrWhiteSpace(sockTypeColumnName)) { if (!map.ContainsKey(sockTypeColumnName)) { if (firstColumnAdded) sb.Append(", "); sb.Append(sockTypeColumnName); firstColumnAdded = true; map.Add(sockTypeColumnName, nOrdinal++); } } //does it also have a Color column? var ayaColorColumnName = o.SqlColorColumnName; if (!string.IsNullOrWhiteSpace(ayaColorColumnName)) { if (!map.ContainsKey(ayaColorColumnName)) { if (firstColumnAdded) sb.Append(", "); sb.Append(ayaColorColumnName); firstColumnAdded = true; map.Add(ayaColorColumnName, nOrdinal++); } } } } } 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 string BuildForIdListResponse(List fieldDefinitions, DataListSelectedProcessingOptions dataListSelectionOptions) { StringBuilder sb = new StringBuilder(); sb.Append("SELECT "); //note: only need rowid column for these queries, the where conditions don't rely on any defined column names as they explicitly refer to the exact identifier known to postgres //Note: IsRowId field should *always* exist for any list that is intended to be used in an idlist response var o = fieldDefinitions.FirstOrDefault(z => z.IsRowId == true); sb.Append(o.SqlIdColumnName); return sb.ToString(); }//eom }//eoc }//ens