This commit is contained in:
@@ -14,34 +14,31 @@ namespace AyaNova.DataList
|
||||
public static string DataFilterToSQLCriteria(List<AyaDataListFieldDefinition> objectFieldsList, JArray listViewArray, long userId)
|
||||
{
|
||||
|
||||
if (string.IsNullOrWhiteSpace(filterJson))
|
||||
if (listViewArray == null || listViewArray.Count == 0)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
//iterate the datafilter and concatenate a sql query from it
|
||||
var FilterArray = JArray.Parse(filterJson);
|
||||
for (int i = 0; i < FilterArray.Count; i++)
|
||||
//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++)
|
||||
{
|
||||
|
||||
var filterItem = FilterArray[i];
|
||||
var fld = filterItem["fld"].Value<string>();
|
||||
var opType = filterItem["op"].Value<string>();
|
||||
List<string> tagList = new List<string>();
|
||||
string val = string.Empty;
|
||||
if (filterItem["value"].Type != JTokenType.Array)
|
||||
val = filterItem["value"].Value<string>();
|
||||
else
|
||||
var cm = listViewArray[i];
|
||||
//skip it if sort is not defined
|
||||
if (cm["filter"] == null)
|
||||
{
|
||||
tagList = filterItem["value"].ToObject<List<String>>();
|
||||
continue;
|
||||
}
|
||||
|
||||
var dataType = objectFieldsList.Find(x => x.FieldKey.ToLowerInvariant() == fld).UiFieldDataType;
|
||||
//Yup there's at least one filter here for this column
|
||||
sb.Append("(");
|
||||
|
||||
//Get the correct sql column name
|
||||
//Get some info about this column / field
|
||||
var fld = cm["fld"].Value<string>();
|
||||
var dataType = objectFieldsList.Find(x => x.FieldKey.ToLowerInvariant() == fld).UiFieldDataType;
|
||||
AyaDataListFieldDefinition DataListField = objectFieldsList.FirstOrDefault(x => x.FieldKey == fld);
|
||||
#if (DEBUG)
|
||||
//Developers little helper
|
||||
@@ -51,14 +48,71 @@ namespace AyaNova.DataList
|
||||
}
|
||||
#endif
|
||||
var SQLValueColumnName = DataListField.GetSqlValueColumnName();
|
||||
sb.Append(DataFilterToColumnCriteria(SQLValueColumnName, (UiFieldDataType)dataType, opType, val, tagList, userId));
|
||||
if (i < FilterArray.Count - 1)
|
||||
var SQLIdColumnName = DataListField.SqlIdColumnName;
|
||||
|
||||
//get filter items collection for this field view definition
|
||||
var filterItems = (JArray)cm["filter"]["items"];
|
||||
|
||||
var IsOrFilter = false;
|
||||
if (cm["filter"]["any"] != null)
|
||||
{
|
||||
IsOrFilter = cm["filter"]["any"].Value<bool>();
|
||||
}
|
||||
|
||||
//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
|
||||
for (int y = 0; y < filterItems.Count; y++)
|
||||
{
|
||||
//Put this item in parenthesis
|
||||
sb.Append("(");
|
||||
var filterItem = (JObject)filterItems[y];
|
||||
|
||||
var opType = filterItem["op"].Value<string>();
|
||||
List<string> tagList = new List<string>();
|
||||
string val = string.Empty;
|
||||
if (filterItem["value"].Type != JTokenType.Array)
|
||||
val = filterItem["value"].Value<string>();
|
||||
else
|
||||
{
|
||||
tagList = filterItem["value"].ToObject<List<String>>();
|
||||
}
|
||||
|
||||
sb.Append(DataFilterToColumnCriteria(SQLValueColumnName, (UiFieldDataType)dataType, 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(")");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
if (filterItems.Count > 1)
|
||||
{
|
||||
//close this group
|
||||
sb.Append(")");
|
||||
}
|
||||
|
||||
if (i < listViewArray.Count - 1)
|
||||
{
|
||||
sb.Append(") AND ");
|
||||
}
|
||||
}
|
||||
|
||||
return " where " + sb.ToString() + ")";
|
||||
return " where (" + sb.ToString() + ")";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -15,31 +15,20 @@ namespace AyaNova.DataList
|
||||
public static string DataFilterToSQLOrderBy(List<AyaDataListFieldDefinition> objectFieldsList, JArray listViewArray)
|
||||
{
|
||||
|
||||
if ( string.IsNullOrWhiteSpace(SortJson))
|
||||
{
|
||||
//sort by default field descending which should in theory always be the id column of the main object in the list
|
||||
//which should return the results to user with most recent records at the top if no sort order was specified
|
||||
if (objectFieldsList[0].FieldKey == "df")
|
||||
{
|
||||
return $"ORDER BY {objectFieldsList[0].SqlIdColumnName} DESC";
|
||||
}
|
||||
else
|
||||
{
|
||||
//no default column so no idea how to sort
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
//iterate the datafilter and concatenate a sql query from it
|
||||
var SortArray = JArray.Parse(SortJson);
|
||||
for (int i = 0; i < SortArray.Count; i++)
|
||||
// [{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++)
|
||||
{
|
||||
|
||||
var SortItem = SortArray[i];
|
||||
var fld = SortItem["fld"].Value<string>();
|
||||
var dir = SortItem["dir"].Value<string>();
|
||||
var cm = listViewArray[i];
|
||||
//skip it if sort is not defined
|
||||
if (cm["sort"] == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
var fld = cm["fld"].Value<string>();
|
||||
var dir = cm["sort"].Value<string>();
|
||||
//Get the correct sql column name
|
||||
AyaDataListFieldDefinition DataListField = objectFieldsList.FirstOrDefault(x => x.FieldKey == fld);
|
||||
#if (DEBUG)
|
||||
@@ -56,13 +45,29 @@ namespace AyaNova.DataList
|
||||
sb.Append(" ");
|
||||
sb.Append(dir == "+" ? "ASC" : "DESC");
|
||||
|
||||
if (i < SortArray.Count - 1)
|
||||
if (i < listViewArray.Count - 1)
|
||||
{
|
||||
sb.Append(",");
|
||||
}
|
||||
}
|
||||
|
||||
return "ORDER BY" + sb.ToString();
|
||||
if (sb.Length == 0)
|
||||
{
|
||||
//no sort specified so default it
|
||||
if (objectFieldsList[0].FieldKey == "df")
|
||||
{
|
||||
return $"ORDER BY {objectFieldsList[0].SqlIdColumnName} DESC";
|
||||
}
|
||||
else
|
||||
{
|
||||
//no default column so no idea how to sort
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return "ORDER BY" + sb.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -15,9 +15,7 @@ namespace AyaNova.DataList
|
||||
//Build the SELECT portion of a list query based on the template, mini or full and the object key in question
|
||||
internal static string Build(List<AyaDataListFieldDefinition> objectFieldsList, JArray listViewArray)
|
||||
{
|
||||
|
||||
//parse the template
|
||||
var jtemplate = JObject.Parse(template);
|
||||
|
||||
|
||||
|
||||
//convert to strings array (https://stackoverflow.com/a/33836599/8939)
|
||||
|
||||
Reference in New Issue
Block a user