Skip to content

Commit f1083b0

Browse files
committed
[ksqlDB.RestApi.Client]: enabled specifying of pseudocolumns using the Fluent API's model builder #96
1 parent b06b438 commit f1083b0

File tree

3 files changed

+30
-4
lines changed

3 files changed

+30
-4
lines changed

ksqlDb.RestApi.Client/FluentAPI/Builders/FieldTypeBuilder.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ public interface IFieldTypeBuilder<TProperty>
4545
/// </summary>
4646
/// <returns>The field type builder for chaining additional configuration.</returns>
4747
IFieldTypeBuilder<TProperty> AsStruct();
48+
49+
/// <summary>
50+
/// Marks the field as a ksqldb pseudocolumn.
51+
/// </summary>
52+
/// <returns>The field type builder for chaining additional configuration.</returns>
53+
IFieldTypeBuilder<TProperty> AsPseudoColumn();
4854
}
4955

5056
internal class FieldTypeBuilder<TProperty>(FieldMetadata fieldMetadata)
@@ -62,6 +68,12 @@ public IFieldTypeBuilder<TProperty> AsStruct()
6268
return this;
6369
}
6470

71+
public IFieldTypeBuilder<TProperty> AsPseudoColumn()
72+
{
73+
fieldMetadata.IsPseudoColumn = true;
74+
return this;
75+
}
76+
6577
public IFieldTypeBuilder<TProperty> Ignore()
6678
{
6779
fieldMetadata.Ignore = true;

ksqlDb.RestApi.Client/KSql/RestApi/Parsers/IdentifierUtil.cs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ internal static string Format(MemberExpression memberExpression, IdentifierEscap
5656
return escaping switch
5757
{
5858
Never => memberExpression.GetMemberName(metadataProvider),
59-
Keywords when memberExpression.Member.GetCustomAttribute<PseudoColumnAttribute>() != null => memberExpression.Member.Name,
59+
Keywords when IsPseudoColumn(memberExpression.Member, metadataProvider) => memberExpression.Member.Name,
6060
Keywords when IsValid(memberExpression.GetMemberName(metadataProvider)) && SystemColumns.IsValid(memberExpression.GetMemberName(metadataProvider)) => memberExpression.GetMemberName(metadataProvider),
6161
Keywords => string.Concat("`", memberExpression.GetMemberName(metadataProvider), "`"),
62-
Always when memberExpression.Member.GetCustomAttribute<PseudoColumnAttribute>() != null => memberExpression.Member.Name,
62+
Always when IsPseudoColumn(memberExpression.Member, metadataProvider) => memberExpression.Member.Name,
6363
Always => string.Concat("`", memberExpression.GetMemberName(metadataProvider), "`"),
6464
_ => throw new ArgumentOutOfRangeException(nameof(escaping), escaping, "Non-exhaustive match.")
6565
};
@@ -82,13 +82,26 @@ public static string Format(MemberInfo memberInfo, IdentifierEscaping escaping,
8282
return escaping switch
8383
{
8484
Never => memberInfo.GetMemberName(modelBuilder),
85-
Keywords when memberInfo.GetCustomAttribute<PseudoColumnAttribute>() != null => memberInfo.Name,
85+
Keywords when IsPseudoColumn(memberInfo, modelBuilder) => memberInfo.Name,
8686
Keywords when IsValid(memberInfo.GetMemberName(modelBuilder)) && SystemColumns.IsValid(memberInfo.GetMemberName(modelBuilder)) => memberInfo.GetMemberName(modelBuilder),
8787
Keywords => string.Concat("`", memberInfo.GetMemberName(modelBuilder), "`"),
88-
Always when memberInfo.GetCustomAttribute<PseudoColumnAttribute>() != null => memberInfo.Name,
88+
Always when IsPseudoColumn(memberInfo, modelBuilder) => memberInfo.Name,
8989
Always => string.Concat("`", memberInfo.GetMemberName(modelBuilder), "`"),
9090
_ => throw new ArgumentOutOfRangeException(nameof(escaping), escaping, "Non-exhaustive match.")
9191
};
9292
}
93+
94+
private static bool IsPseudoColumn(MemberInfo memberInfo, IMetadataProvider? metadataProvider)
95+
{
96+
if (memberInfo.GetCustomAttribute<PseudoColumnAttribute>() != null)
97+
return true;
98+
99+
var entityMetadata = metadataProvider?.GetEntities().FirstOrDefault(c => c.Type == memberInfo.DeclaringType);
100+
101+
var fieldMetadata =
102+
entityMetadata?.FieldsMetadata.FirstOrDefault(c => c.MemberInfo.Name == memberInfo.Name);
103+
104+
return fieldMetadata is {IsPseudoColumn: true};
105+
}
93106
}
94107
}

ksqlDb.RestApi.Client/Metadata/FieldMetadata.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public FieldMetadata(FieldMetadata fieldMetadata)
2323
internal bool IgnoreInDDL { get; set; }
2424
public bool HasHeaders { get; internal set; }
2525
internal bool IsStruct { get; set; }
26+
public bool IsPseudoColumn { get; internal set; }
2627
internal string Path { get; init; } = null!;
2728
internal string FullPath { get; init; } = null!;
2829
public string? ColumnName { get; set; }

0 commit comments

Comments
 (0)