Skip to content

Commit

Permalink
Fixed #1006 plus simple/corrected C# code in Filters
Browse files Browse the repository at this point in the history
  • Loading branch information
rappen committed Apr 14, 2024
1 parent a08c261 commit 3ca1e98
Showing 1 changed file with 40 additions and 10 deletions.
50 changes: 40 additions & 10 deletions FetchXmlBuilder/Converters/CSharpCodeGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -229,13 +229,21 @@ private string GetFilterLbL(string entity, FilterExpression filter, string owner
{
return string.Empty;
}
if (filter.Filters.Count == 1 && !filter.Conditions.Any())
{
return GetFilterLbL(entity, filter.Filters.First(), ownerName, ownerType, several);
}
if (settings.QExStyle == QExStyleEnum.QueryByAttribute && ownerType != OwnersType.Root)
{
throw new Exception("Only root filters are supported for QueryByAttribute. Use QueryExpression if you need it.");
}
var code = new StringBuilder();
filter.FilterHint = $"{ownerName}.{(ownerType == OwnersType.Root ? "Criteria" : ownerType == OwnersType.Link ? "LinkCriteria" : "Filters")}";
var rootfilters = filter.FilterHint.EndsWith("Criteria") || filter.FilterHint.EndsWith("Criteria.Filters");
if (ownerType == OwnersType.Root && filter.FilterOperator == LogicalOperator.Or)
{
code.AppendLine($"{ownerName}.Criteria.FilterOperator = LogicalOperator.Or;");
}
if (ownerType == OwnersType.Sub || (ownerType == OwnersType.Link && (filter.FilterOperator == LogicalOperator.Or || !filter.Conditions.Any())))
{
filter.FilterHint = GetVarName($"{ownerName}.{(filter.FilterOperator == LogicalOperator.Or ? "Or" : "And")}".Replace(".Criteria", "").Replace(".LinkCriteria", ""), several);
Expand All @@ -245,7 +253,16 @@ private string GetFilterLbL(string entity, FilterExpression filter, string owner
code.AppendLine($"//{CRLF}// Add filter {filter.FilterHint} to {ownerName}");
}
code.AppendLine($"var {filter.FilterHint} = new FilterExpression({(filter.FilterOperator == LogicalOperator.Or ? "LogicalOperator.Or" : "")});");
code.AppendLine($"{ownerName}.AddFilter({filter.FilterHint});");
switch (ownerType)
{
case OwnersType.Link:
code.AppendLine($"{ownerName}.LinkCriteria = {filter.FilterHint};");
break;

default:
code.AppendLine($"{ownerName}.AddFilter({filter.FilterHint});");
break;
}
}
var filtercode = new List<string>
{
Expand Down Expand Up @@ -322,7 +339,7 @@ private string GetLinkEntitiesLbL(DataCollection<LinkEntity> linkEntities, strin
foreach (var link in linkEntities)
{
var linkcode = string.Empty;
var linkname = GetVarName(string.IsNullOrEmpty(link.EntityAlias) || link.LinkToEntityName == link.EntityAlias ? LineStart + "_" + link.LinkToEntityName : link.EntityAlias);
var linkname = GetVarName(string.IsNullOrEmpty(link.EntityAlias) || link.LinkToEntityName == link.EntityAlias ? LineStart + "_" + link.LinkToEntityName : link.EntityAlias);
if (settings.IncludeComments)
{
linkcode += $"//{CRLF}// Add link-entity {linkname}{CRLF}";
Expand Down Expand Up @@ -485,13 +502,14 @@ private string GetFiltersOI(string entity, FilterExpression filter, string owner
var filterscode = "";
var filters = filter.Filters.Where(f => f.Conditions.Any() || f.Filters.Any());
var filtercodes = new List<string>();
var rootfilters = settings.QExFlavor == QExFlavorEnum.EarlyBound && (filter.FilterHint.EndsWith("Criteria") || filter.FilterHint.EndsWith("Criteria.Filters"));
var rootfilters = filter.FilterHint.EndsWith("Criteria") || filter.FilterHint.EndsWith("Criteria.Filters");
var dlabrootfilters = settings.QExFlavor == QExFlavorEnum.EarlyBound && rootfilters;
var comment = $"{Indent(indentslevel)}// Add {filters.Count()} filters to {entity}{CRLF}";
// Before filters
switch (settings.QExStyle)
{
case QExStyleEnum.QueryExpressionFactory:
if (!rootfilters)
if (!dlabrootfilters)
{
filterscode += $"{Indent(indentslevel)}Filters ={CRLF}{Indent(indentslevel++)}{{{CRLF}";
}
Expand All @@ -515,7 +533,7 @@ private string GetFiltersOI(string entity, FilterExpression filter, string owner
switch (settings.QExStyle)
{
case QExStyleEnum.QueryExpressionFactory:
if (!rootfilters)
if (!dlabrootfilters)
{
filterscode += $"{CRLF}{Indent(--indentslevel)}}}";
}
Expand All @@ -537,6 +555,10 @@ private string GetFilterOI(string entity, FilterExpression filter, string ownerN
{
return string.Empty;
}
if (filter.Filters.Count == 1 && !filter.Conditions.Any())
{
return GetFilterOI(entity, filter.Filters.First(), ownerName, ownerType, indentslevel, namestree);
}
if (settings.QExStyle == QExStyleEnum.QueryByAttribute && ownerType != OwnersType.Root)
{
throw new Exception("Only root filters are supported for QueryByAttribute. Use QueryExpression if you need it.");
Expand All @@ -547,12 +569,12 @@ private string GetFilterOI(string entity, FilterExpression filter, string ownerN
var commentconds = filter.Conditions.Count > 0 ? $" {filter.Conditions.Count} conditions" : "";
var commentfilts = filter.Filters.Count > 0 ? $" {filter.Filters.Count} filters" : "";
var comment = $"{Indent(indentslevel)}// Add filter to {entity} with{commentconds}{commentfilts}{CRLF}";
var dlabrootfilters = /*settings.QExFlavor == QExFlavorEnum.EarlyBound &&*/ (filter.FilterHint.EndsWith("Criteria") || filter.FilterHint.EndsWith("Criteria.Filters"));
var rootfilters = filter.FilterHint.EndsWith("Criteria") || filter.FilterHint.EndsWith("Criteria.Filters");
var addfilterexpression = true;
switch (settings.QExStyle)
{
case QExStyleEnum.QueryExpressionFactory:
if (!dlabrootfilters || filter.FilterOperator == LogicalOperator.Or || !filter.Conditions.Any())
if (!rootfilters || filter.FilterOperator == LogicalOperator.Or || !filter.Conditions.Any())
{
code.Append($"{Indent(indentslevel)}new FilterExpression({(filter.FilterOperator == LogicalOperator.Or ? "LogicalOperator.Or" : "")}){CRLF}{Indent(indentslevel++)}{{{CRLF}");
}
Expand Down Expand Up @@ -591,14 +613,22 @@ private string GetFilterOI(string entity, FilterExpression filter, string ownerN
break;

default:
if (ownerType == OwnersType.Sub || (ownerType == OwnersType.Link && (filter.FilterOperator == LogicalOperator.Or || !filter.Conditions.Any())))
if (ownerType == OwnersType.Sub)
{
code.Append($"{Indent(indentslevel)}new FilterExpression({(filter.FilterOperator == LogicalOperator.Or ? "LogicalOperator.Or" : "")}){CRLF}{Indent(indentslevel++)}{{{CRLF}");
code.Append($"{Indent(indentslevel)}new FilterExpression{CRLF}{Indent(indentslevel++)}{{{CRLF}");
}
else if (ownerType == OwnersType.Link && (filter.FilterOperator == LogicalOperator.Or || !filter.Conditions.Any()))
{
code.Append($"{Indent(indentslevel)}LinkCriteria ={CRLF}{Indent(indentslevel++)}{{{CRLF}");
}
else
{
code.Append($"{Indent(indentslevel)}{filterObjectName} ={CRLF}{Indent(indentslevel++)}{{{CRLF}");
}
if (filter.FilterOperator == LogicalOperator.Or)
{
code.Append($"{Indent(indentslevel)}FilterOperator = LogicalOperator.Or,{CRLF}");
}
break;
}
if (settings.IncludeComments && !string.IsNullOrWhiteSpace(code.ToString()))
Expand Down Expand Up @@ -1435,4 +1465,4 @@ internal static string CapitSchemaName(this AttributeMetadata attribute, QExFlav
return attribute.SchemaName;
}
}
}
}

0 comments on commit 3ca1e98

Please sign in to comment.