Skip to content

Commit

Permalink
More fixes...
Browse files Browse the repository at this point in the history
  • Loading branch information
rappen committed Jan 17, 2023
1 parent ab5bcb4 commit 09dbccb
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 59 deletions.
92 changes: 41 additions & 51 deletions FetchXmlBuilder/Converters/CSharpCodeGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,13 @@ internal string GetQueryCode()
var queryclass = QExStyle.StyleClassName(settings.QExStyle);
var entityname = GetCodeEntity(qex.EntityName);
var earlybound = settings.QExFlavor == QExFlavorEnum.EarlyBound;
var queryproperties = GetQueryOptions(qex, qename, settings.ObjectInitializer ? 1 : 0);
var queryproperties = new List<string>();
if (settings.ObjectInitializer)
{
if (settings.QExStyle != QExStyleEnum.QueryExpressionFactory)
{
queryproperties.AddRange(GetQueryOptions(qex, qename, 1));
}
queryproperties.AddRange(GetObjectInitializer(qename, qex, 1));
}

Expand Down Expand Up @@ -97,6 +101,7 @@ internal string GetQueryCode()

case QExStyleEnum.QueryExpressionFactory:
querycode += $");{CRLF}";
querycode += string.Join(CRLF, GetQueryOptions(qex, qename, 0).Select(p => $"{qename}.{p};")) + CRLF;
querycode += GetOrdersLbL(qex.EntityName, qex.Orders, qename, true);
break;

Expand All @@ -108,7 +113,7 @@ internal string GetQueryCode()
else
{
querycode += $";{CRLF}";
querycode += string.Join(CRLF, queryproperties.Select(p => $"{qename}.{p};")) + CRLF;
querycode += string.Join(CRLF, GetQueryOptions(qex, qename, 0).Select(p => $"{qename}.{p};")) + CRLF;
querycode += GetColumnsLbL(qex.EntityName, qex.ColumnSet, qename, OwnersType.Root);
querycode += GetFilterLbL(qex.EntityName, qex.Criteria, qename, OwnersType.Root);
querycode += GetOrdersLbL(qex.EntityName, qex.Orders, qename, true);
Expand All @@ -126,7 +131,7 @@ private List<string> GetObjectInitializer(string qename, QueryExpression qex, in
{
GetColumnsOI(qex.EntityName, qex.ColumnSet, OwnersType.Root, indentslevel),
GetFilterOI(qex.EntityName, qex.Criteria, qename, OwnersType.Root, indentslevel),
GetOrdersOI(qex.EntityName, qex.Orders, qename, indentslevel),
GetOrdersOI(qex.EntityName, qex.Orders, qename, OwnersType.Root, indentslevel),
GetLinkEntitiesOI(qex.LinkEntities, qename, indentslevel)
}.Where(o => !string.IsNullOrWhiteSpace(o)).ToList();
}
Expand Down Expand Up @@ -294,7 +299,12 @@ internal string GetOrdersLbL(string entityname, DataCollection<OrderExpression>
return string.Empty;
}
var code = new StringBuilder();
if (settings.IncludeComments)
if (!root && settings.QExStyle == QExStyleEnum.QueryExpressionFactory)
{
code.AppendLine($"// Orders for link entities is currently not supported for QueryExpressionFactory.{CRLF}// Please add it manually:");
ownerName = "// " + ownerName;
}
else if (settings.IncludeComments)
{
code.AppendLine($"//{CRLF}// Add orders");
}
Expand Down Expand Up @@ -428,7 +438,7 @@ 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 = filter.FilterHint.EndsWith("Criteria") || filter.FilterHint.EndsWith("Criteria.Filters");
var rootfilters = settings.QExFlavor == QExFlavorEnum.EarlyBound && (filter.FilterHint.EndsWith("Criteria") || filter.FilterHint.EndsWith("Criteria.Filters"));
var comment = $"{Indent(indentslevel)}// Add {filters.Count()} filters to {entity}{CRLF}";
// Before filters
switch (settings.QExStyle)
Expand Down Expand Up @@ -486,7 +496,7 @@ internal string GetFilterOI(string entity, FilterExpression filter, string owner
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 rootfilters = filter.FilterHint.EndsWith("Criteria") || filter.FilterHint.EndsWith("Criteria.Filters");
var rootfilters = settings.QExFlavor == QExFlavorEnum.EarlyBound && (filter.FilterHint.EndsWith("Criteria") || filter.FilterHint.EndsWith("Criteria.Filters"));
var addfilterexpression = true;
switch (settings.QExStyle)
{
Expand Down Expand Up @@ -577,7 +587,10 @@ private string GetConditionsOI(string entity, FilterExpression filter, int inden
{
code.AppendLine($"{Indent(indentslevel)}// Add {filter.Conditions.Count} conditions to {entity}");
}
var rootfiltersinline = settings.QExStyle == QExStyleEnum.QueryExpressionFactory && (filter.FilterHint.EndsWith("Criteria") || filter.FilterHint.EndsWith("Criteria.Filters"));
var rootfiltersinline =
settings.QExStyle == QExStyleEnum.QueryExpressionFactory &&
settings.QExFlavor == QExFlavorEnum.EarlyBound &&
(filter.FilterHint.EndsWith("Criteria") || filter.FilterHint.EndsWith("Criteria.Filters"));
switch (settings.QExStyle)
{
case QExStyleEnum.FluentQueryExpression:
Expand Down Expand Up @@ -659,7 +672,7 @@ private string GetConditionOI(string entity, ConditionExpression cond, string fi
}

default:
if (!rootfiltersinline &&
if (rootfiltersinline &&
settings.QExStyle == QExStyleEnum.QueryExpressionFactory &&
string.IsNullOrWhiteSpace(entityalias) &&
cond.Operator == ConditionOperator.Equal && cond.Values?.Count == 1)
Expand Down Expand Up @@ -746,7 +759,7 @@ private string GetLinkEntityOI(LinkEntity link, string ownerName, int indentslev
default:
var varstart = $"{Indent(indentslevel)}new LinkEntity(";
linkcode += varstart +
GetCodeParametersMaxWidth(120 - varstart.Length, indentslevel, false,
GetCodeParametersMaxWidth(120 - varstart.Length, indentslevel + 1, false,
GetCodeEntity(link.LinkFromEntityName),
GetCodeEntity(link.LinkToEntityName),
GetCodeAttribute(link.LinkFromEntityName, link.LinkFromAttributeName),
Expand All @@ -759,7 +772,7 @@ private string GetLinkEntityOI(LinkEntity link, string ownerName, int indentslev
aliascode,
GetColumnsOI(link.LinkToEntityName, link.Columns, OwnersType.Link, indentslevel + 1),
GetFilterOI(link.LinkToEntityName, link.LinkCriteria, linkname, OwnersType.Link, indentslevel + 1),
GetOrdersOI(link.LinkToEntityName, link.Orders, linkname, indentslevel + 1),
GetOrdersOI(link.LinkToEntityName, link.Orders, linkname, OwnersType.Link, indentslevel + 1),
GetLinkEntitiesOI(link.LinkEntities, linkname, indentslevel + 1, namestree)
}.Where(o => !string.IsNullOrWhiteSpace(o)).ToList();
if (objinicode.Any())
Expand All @@ -782,14 +795,19 @@ private string GetLinkEntityOI(LinkEntity link, string ownerName, int indentslev
return linkcode;
}

internal string GetOrdersOI(string entityname, DataCollection<OrderExpression> orders, string ownerName, int indentslevel)
internal string GetOrdersOI(string entityname, DataCollection<OrderExpression> orders, string ownerName, OwnersType ownerType, int indentslevel)
{
if (orders.Count == 0)
{
return string.Empty;
}
var code = new StringBuilder();
if (settings.IncludeComments)
var notsupported = ownerType == OwnersType.Link && settings.QExStyle == QExStyleEnum.QueryExpressionFactory;
if (notsupported)
{
code.AppendLine($"Orders for link entities is currently not supported for QueryExpressionFactory.{CRLF}Please add it manually:");
}
else if (settings.IncludeComments)
{
code.AppendLine($"{Indent(indentslevel)}// Add orders to {ownerName}");
}
Expand Down Expand Up @@ -834,6 +852,10 @@ internal string GetOrdersOI(string entityname, DataCollection<OrderExpression> o
code.Append($"{CRLF}{Indent(--indentslevel)}}}");
break;
}
if (notsupported)
{
return CommentLines(code.ToString());
}
return code.ToString();
}

Expand Down Expand Up @@ -995,7 +1017,7 @@ internal string GetCodeEntity(string entityname)
return entity.SchemaName + "." + settings.EBG_EntityLogicalNames;

case QExFlavorEnum.LCGconstants:
return GetCodeEntityLCGClassName(entity) + ".EntityName";
return LCG.Extensions.GetEntityClass(entity, settings.LCG_Settings) + ".EntityName";

case QExFlavorEnum.EarlyBound:
return entity.SchemaName;
Expand All @@ -1004,24 +1026,6 @@ internal string GetCodeEntity(string entityname)
return "\"" + entityname + "\"";
}

private string GetCodeEntityLCGClassName(EntityMetadata entity)
{
var result = entity.LogicalName;
switch (settings.LCG_Settings.ConstantName)
{
case LCG.NameType.DisplayName:
result = LCG.Extensions.StringToCSharpIdentifier(entity.DisplayName?.UserLocalizedLabel?.Label ?? entity.LogicalName);
break;

case LCG.NameType.SchemaName:
result = entity.SchemaName;
break;
}
result = LCG.Extensions.StripPrefix(result, settings.LCG_Settings);
result = LCG.Extensions.CamelCaseIt(result, settings.LCG_Settings);
return result;
}

private string GetCodeEntityPrefix(string entityname)
{
if (metas.FirstOrDefault(e => e.LogicalName.Equals(entityname)) is EntityMetadata entity)
Expand All @@ -1047,26 +1051,7 @@ internal string GetCodeAttribute(string entityname, string attributename, bool a
return attribute.SchemaName;

case QExFlavorEnum.LCGconstants:
var entityclassname = GetCodeEntityLCGClassName(entity);
if (attribute.IsPrimaryId == true)
{
return entityclassname + ".PrimaryKey";
}
if (attribute.IsPrimaryName == true)
{
return entityclassname + ".PrimaryName";
}
switch (settings.LCG_Settings.ConstantName)
{
case LCG.NameType.DisplayName:
return entityclassname + "." + LCG.Extensions.StringToCSharpIdentifier(attribute.DisplayName?.UserLocalizedLabel?.Label ?? attribute.LogicalName);

case LCG.NameType.SchemaName:
return entityclassname + "." + LCG.Extensions.CamelCaseIt(LCG.Extensions.StripPrefix(attribute.SchemaName, settings.LCG_Settings), settings.LCG_Settings);

default:
return entityclassname + "." + LCG.Extensions.CamelCaseIt(LCG.Extensions.StripPrefix(attribute.LogicalName, settings.LCG_Settings), settings.LCG_Settings);
}
return LCG.Extensions.GetEntityClass(entity, settings.LCG_Settings) + "." + LCG.Extensions.GetAttributeProperty(attribute, settings.LCG_Settings);

default:
return entity.SchemaName + "." + settings.EBG_AttributeLogicalNameClass + attribute.SchemaName;
Expand Down Expand Up @@ -1099,6 +1084,11 @@ private static string GetQueryObjectName(QExStyleEnum style)
}
}

private static string CommentLines(string codes)
{
return string.Join("\n", codes.Split('\n').Select(l => $"// {l}"));
}

#endregion Helpers
}

Expand Down
55 changes: 47 additions & 8 deletions FetchXmlBuilder/Converters/LCG/Extensions.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
using System;
using Microsoft.Xrm.Sdk.Metadata;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
using McTools.Xrm.Connection;
using Microsoft.Xrm.Sdk.Metadata;

namespace Rappen.XTB.LCG
{
Expand Down Expand Up @@ -98,7 +93,7 @@ private static bool AddBlankLineBetween(string lastline, string line)

public static string CamelCaseIt(this string name, Settings settings)
{
if (!settings.ConstantCamelCased)
if (!settings.ConstantCamelCased || settings.ConstantName == NameType.DisplayName)
{
return name;
}
Expand Down Expand Up @@ -184,7 +179,7 @@ public static string ReplaceIfNotEmpty(this string template, string oldValue, st

public static string StripPrefix(this string name, Settings settings)
{
if (!settings.DoStripPrefix || string.IsNullOrEmpty(settings.StripPrefix))
if (!settings.DoStripPrefix || string.IsNullOrEmpty(settings.StripPrefix) || settings.ConstantName == NameType.DisplayName)
{
return name;
}
Expand Down Expand Up @@ -222,5 +217,49 @@ internal static string StringToCSharpIdentifier(string name)
.Replace("]", "_");
return UnicodeCharacterUtilities.MakeValidIdentifier(name, false);
}

internal static string GetEntityClass(this EntityMetadata entity, Settings lcgsettings)
{
var result = entity.LogicalName;
switch (lcgsettings.ConstantName)
{
case NameType.DisplayName:
result = StringToCSharpIdentifier(entity.DisplayName?.UserLocalizedLabel?.Label ?? entity.LogicalName);
break;

case NameType.SchemaName:
result = entity.SchemaName;
break;
}
result = StripPrefix(result, lcgsettings);
result = CamelCaseIt(result, lcgsettings);
return result;
}

internal static string GetAttributeProperty(this AttributeMetadata attribute, Settings lcgsettings)
{
if (attribute.IsPrimaryId == true)
{
return "PrimaryKey";
}
if (attribute.IsPrimaryName == true)
{
return "PrimaryName";
}
var result = attribute.LogicalName;
switch (lcgsettings.ConstantName)
{
case NameType.DisplayName:
result = StringToCSharpIdentifier(attribute.DisplayName?.UserLocalizedLabel?.Label ?? attribute.LogicalName);
break;

case NameType.SchemaName:
result = attribute.SchemaName;
break;
}
result = StripPrefix(result, lcgsettings);
result = CamelCaseIt(result, lcgsettings);
return result;
}
}
}

0 comments on commit 09dbccb

Please sign in to comment.