This commit is contained in:
@@ -948,63 +948,79 @@ namespace AyaNova.DataList
|
|||||||
|
|
||||||
This method and choices ensures users don't need to make a separate row for each one they can just treat the entire tag collection like they treat a single word match in a text field
|
This method and choices ensures users don't need to make a separate row for each one they can just treat the entire tag collection like they treat a single word match in a text field
|
||||||
*/
|
*/
|
||||||
switch (sOperator)
|
|
||||||
|
//HAS VALUE / NO VALUE
|
||||||
|
if (sValue == "*NULL*")
|
||||||
{
|
{
|
||||||
case DataListFilterComparisonOperator.Equality:
|
if (sOperator == DataListFilterComparisonOperator.Equality)
|
||||||
{
|
return $"{SqlColumnNameToFilter} = '{{}}'";
|
||||||
StringBuilder sbTags = new StringBuilder();
|
else
|
||||||
sbTags.Append("@> array[");
|
return $"{SqlColumnNameToFilter} <> '{{}}'";
|
||||||
//Note: with listOptions change to split filter and view the tags are now in sValue as a string of comma delimited strings so split them out here
|
}
|
||||||
List<string> normalizedTags = TagBiz.NormalizeTags(sValue.Split(',').ToList<string>());
|
else
|
||||||
foreach (string s in normalizedTags)
|
{
|
||||||
|
string PostgresTagArrayFragment = string.Empty;
|
||||||
|
//Filter ui builder allows multiple tag selection just like any other tag selection and sends the filter to the server like this:
|
||||||
|
//filter "[{\"column\":\"customertags\",\"any\":false,\"items\":[{\"op\":\"=\",\"value\":\"completed.reminder,burnaby.dispatchzone,cabling-fibre.user-skill\"}]}]"
|
||||||
|
//needs to be "ARRAY['red','green'::varchar(255)]"
|
||||||
|
StringBuilder sbTemp = new StringBuilder();
|
||||||
|
sbTemp = sbTemp.Append("ARRAY[");
|
||||||
|
List<string> normalizedTags = TagBiz.NormalizeTags(sValue.Split(',').ToList<string>());
|
||||||
|
if (normalizedTags.Count == 0)
|
||||||
|
throw new System.ArgumentNullException("DataListSqlFilterCriteriaBuilder::TagDataFilterToColumnCriteria - NO tags were provided for filtering");
|
||||||
|
|
||||||
|
foreach (string s in normalizedTags)
|
||||||
|
sbTemp.Append($"'{s}',");
|
||||||
|
PostgresTagArrayFragment = sbTemp.ToString().TrimEnd(',');
|
||||||
|
PostgresTagArrayFragment += "::VARCHAR(255)]";
|
||||||
|
|
||||||
|
switch (sOperator)
|
||||||
|
{
|
||||||
|
case DataListFilterComparisonOperator.Equality:
|
||||||
{
|
{
|
||||||
|
//WHERE ARRAY['green'::varchar(255)] <@ tags and array_length(tags,1) = 1
|
||||||
|
StringBuilder sbTags = new StringBuilder();
|
||||||
|
sbTags.Append("@> array[");
|
||||||
|
//Note: with listOptions change to split filter and view the tags are now in sValue as a string of comma delimited strings so split them out here
|
||||||
|
List<string> normalizedTags = TagBiz.NormalizeTags(sValue.Split(',').ToList<string>());
|
||||||
|
foreach (string s in normalizedTags)
|
||||||
|
{
|
||||||
|
|
||||||
sbTags.Append($"'{s}',");
|
sbTags.Append($"'{s}',");
|
||||||
|
}
|
||||||
|
sb.Append(sbTags.ToString().TrimEnd(','));
|
||||||
|
sb.Append("::varchar(255)]");
|
||||||
}
|
}
|
||||||
sb.Append(sbTags.ToString().TrimEnd(','));
|
break;
|
||||||
sb.Append("::varchar(255)]");
|
case DataListFilterComparisonOperator.NotEqual:
|
||||||
}
|
sb.Append("<>'");
|
||||||
break;
|
sb.Append(sValue);
|
||||||
case DataListFilterComparisonOperator.NotEqual:
|
sb.Append("'");
|
||||||
sb.Append("<>'");
|
break;
|
||||||
sb.Append(sValue);
|
|
||||||
sb.Append("'");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DataListFilterComparisonOperator.NotContains:
|
case DataListFilterComparisonOperator.NotContains:
|
||||||
sb.Append("Not Like '%");
|
sb.Append("Not Like '%");
|
||||||
sb.Append(sValue);
|
sb.Append(sValue);
|
||||||
sb.Append("%'");
|
sb.Append("%'");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DataListFilterComparisonOperator.Contains:
|
||||||
|
|
||||||
|
//TagSpecificWhereFragment = $"(array_to_string({tagColumn.GetSqlValueColumnName()},',') like '%{tagSpecificQuery}%')";
|
||||||
|
sb.Append("Like '%");
|
||||||
|
sb.Append(sValue);
|
||||||
|
sb.Append("%'");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new System.ArgumentOutOfRangeException("OPERATOR_TYPE", sOperator, "DataListSqlFilterCriteriaBuilder unhandled operator type [" + sOperator + "] IN TAGS");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
case DataListFilterComparisonOperator.Contains:
|
|
||||||
|
|
||||||
//TagSpecificWhereFragment = $"(array_to_string({tagColumn.GetSqlValueColumnName()},',') like '%{tagSpecificQuery}%')";
|
|
||||||
sb.Append("Like '%");
|
|
||||||
sb.Append(sValue);
|
|
||||||
sb.Append("%'");
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw new System.ArgumentOutOfRangeException("OPERATOR_TYPE", sOperator, "DataListSqlFilterCriteriaBuilder unhandled operator type [" + sOperator + "] IN TAGS");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//NOTE: tag filter OPERATOR is ignored, query matches if all tags are found in a tag collection that could have other tags as well
|
|
||||||
|
|
||||||
//for initial release a tag filter is inclusive of all tags only
|
|
||||||
//in other words all tags presented must be in record to match (simple AND)
|
|
||||||
//select * from awidget where awidget.tags @> array['blah','blah3'::varchar(255)]
|
|
||||||
|
|
||||||
//NOTE: After coding this discovered *can* do a LIKE query with tags like this:
|
|
||||||
//(array_to_string(awidget.tags,',') like '%zo%')
|
|
||||||
//implemented that way in picklistquery builder
|
|
||||||
//also ilike is a postgres case insensitive like but works on current locale of server which
|
|
||||||
//sounds like it might fuck up when using other languages so...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user