This commit is contained in:
2021-09-02 19:26:01 +00:00
parent 7767c7d67c
commit 7eaa9e5907

View File

@@ -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
*/
switch (sOperator)
//HAS VALUE / NO VALUE
if (sValue == "*NULL*")
{
case DataListFilterComparisonOperator.Equality:
{
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)
if (sOperator == DataListFilterComparisonOperator.Equality)
return $"{SqlColumnNameToFilter} = '{{}}'";
else
return $"{SqlColumnNameToFilter} <> '{{}}'";
}
else
{
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(','));
sb.Append("::varchar(255)]");
}
break;
case DataListFilterComparisonOperator.NotEqual:
sb.Append("<>'");
sb.Append(sValue);
sb.Append("'");
break;
break;
case DataListFilterComparisonOperator.NotEqual:
sb.Append("<>'");
sb.Append(sValue);
sb.Append("'");
break;
case DataListFilterComparisonOperator.NotContains:
sb.Append("Not Like '%");
sb.Append(sValue);
sb.Append("%'");
break;
case DataListFilterComparisonOperator.NotContains:
sb.Append("Not Like '%");
sb.Append(sValue);
sb.Append("%'");
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();