From 9ebae01043b2e28dd3269d11c82a2a56f99cc168 Mon Sep 17 00:00:00 2001 From: Tomas Fabian Date: Fri, 31 May 2024 17:06:42 +0200 Subject: [PATCH] [ksqlDB.RestApi.Client]: HasColumnName to Fluent API sample --- .../FluentAPI/Builders/ModelBuilderTests.cs | 18 +++++++-------- .../FluentAPI/Builders/IMetadataProvider.cs | 11 ++++++++++ .../FluentAPI/Builders/ModelBuilder.cs | 16 ++++++++++---- .../Extensions/TypeExtensions.cs | 8 +++---- .../KSql/Query/Context/KSqlDBContext.cs | 1 + .../KSql/RestApi/Generators/TypeGenerator.cs | 6 ++--- .../KSql/RestApi/KSqlDbQueryStreamProvider.cs | 4 ++-- .../KSql/RestApi/Parsers/IdentifierUtil.cs | 22 +++++++++---------- .../KSql/RestApi/Statements/CreateEntity.cs | 8 +++---- .../KSql/RestApi/Statements/CreateInsert.cs | 18 +++++++-------- .../RestApi/Statements/CreateKSqlValue.cs | 2 +- .../KSql/RestApi/Statements/EntityInfo.cs | 4 ++-- .../RestApi/Statements/KSqlTypeTranslator.cs | 10 ++++----- .../Translators/DecimalTypeTranslator.cs | 2 +- 14 files changed, 74 insertions(+), 56 deletions(-) create mode 100644 ksqlDb.RestApi.Client/FluentAPI/Builders/IMetadataProvider.cs diff --git a/Tests/ksqlDB.RestApi.Client.Tests/FluentAPI/Builders/ModelBuilderTests.cs b/Tests/ksqlDB.RestApi.Client.Tests/FluentAPI/Builders/ModelBuilderTests.cs index 4fb188d0..4b3d8c81 100644 --- a/Tests/ksqlDB.RestApi.Client.Tests/FluentAPI/Builders/ModelBuilderTests.cs +++ b/Tests/ksqlDB.RestApi.Client.Tests/FluentAPI/Builders/ModelBuilderTests.cs @@ -62,7 +62,7 @@ public void Property_IgnoreField() //Assert fieldTypeBuilder.Should().NotBeNull(); - var entityMetadata = builder.GetEntities().FirstOrDefault(c => c.Type == typeof(Payment)); + var entityMetadata = ((IMetadataProvider)builder).GetEntities().FirstOrDefault(c => c.Type == typeof(Payment)); entityMetadata.Should().NotBeNull(); entityMetadata!.FieldsMetadata.First(c => c.MemberInfo.Name == nameof(Payment.Description)).Ignore.Should().BeTrue(); } @@ -80,7 +80,7 @@ public void Property_HasColumnName() //Assert fieldTypeBuilder.Should().NotBeNull(); - var entityMetadata = builder.GetEntities().FirstOrDefault(c => c.Type == typeof(Payment)); + var entityMetadata = ((IMetadataProvider)builder).GetEntities().FirstOrDefault(c => c.Type == typeof(Payment)); entityMetadata.Should().NotBeNull(); entityMetadata!.FieldsMetadata.First(c => c.MemberInfo.Name == nameof(Payment.Description)).ColumnName.Should().Be(columnName); } @@ -101,7 +101,7 @@ public void MultiplePropertiesForSameType() //Assert fieldTypeBuilder.Should().NotBeNull(); - var entityMetadata = builder.GetEntities().FirstOrDefault(c => c.Type == typeof(Payment)); + var entityMetadata = ((IMetadataProvider)builder).GetEntities().FirstOrDefault(c => c.Type == typeof(Payment)); entityMetadata.Should().NotBeNull(); entityMetadata!.FieldsMetadata.First(c => c.MemberInfo.Name == nameof(Payment.Description)).Ignore.Should().BeTrue(); entityMetadata.FieldsMetadata.First(c => c.MemberInfo.Name == nameof(Payment.Amount)).Ignore.Should().BeTrue(); @@ -123,7 +123,7 @@ public void Property_IgnoreNestedField() //Assert fieldTypeBuilder.Should().NotBeNull(); - var entityMetadata = builder.GetEntities().FirstOrDefault(c => c.Type == typeof(Composite)); + var entityMetadata = ((IMetadataProvider)builder).GetEntities().FirstOrDefault(c => c.Type == typeof(Composite)); entityMetadata.Should().NotBeNull(); var memberInfo = GetTitleMemberInfo(); entityMetadata!.FieldsMetadata.First(c => c.MemberInfo == memberInfo).Ignore.Should().BeTrue(); @@ -139,7 +139,7 @@ public void AddConventionForDecimal() builder.AddConvention(decimalTypeConvention); //Assert - builder.Conventions[typeof(decimal)].Should().BeEquivalentTo(decimalTypeConvention); + ((IMetadataProvider)builder).Conventions[typeof(decimal)].Should().BeEquivalentTo(decimalTypeConvention); } private class PaymentConfiguration : IFromItemTypeConfiguration @@ -161,7 +161,7 @@ public void FromItemTypeConfiguration() builder.Apply(configuration); //Assert - var entityMetadata = builder.GetEntities().FirstOrDefault(c => c.Type == typeof(Payment)); + var entityMetadata = ((IMetadataProvider)builder).GetEntities().FirstOrDefault(c => c.Type == typeof(Payment)); entityMetadata.Should().NotBeNull(); entityMetadata!.FieldsMetadata.First(c => c.MemberInfo.Name == nameof(Payment.Description)).Ignore.Should().BeTrue(); } @@ -188,7 +188,7 @@ public void Decimal_ConfigurePrecisionAndScale() //Assert fieldTypeBuilder.Should().NotBeNull(); - var entityMetadata = builder.GetEntities().FirstOrDefault(c => c.Type == typeof(Payment)); + var entityMetadata = ((IMetadataProvider)builder).GetEntities().FirstOrDefault(c => c.Type == typeof(Payment)); entityMetadata.Should().NotBeNull(); var metadata = (DecimalFieldMetadata)entityMetadata!.FieldsMetadata.First(c => c.MemberInfo.Name == nameof(Payment.Amount)); @@ -209,7 +209,7 @@ public void Header() //Assert fieldTypeBuilder.Should().NotBeNull(); - var entityMetadata = builder.GetEntities().FirstOrDefault(c => c.Type == typeof(Payment)); + var entityMetadata = ((IMetadataProvider)builder).GetEntities().FirstOrDefault(c => c.Type == typeof(Payment)); entityMetadata.Should().NotBeNull(); var metadata = (BytesArrayFieldMetadata)entityMetadata!.FieldsMetadata.First(c => c.MemberInfo.Name == nameof(Payment.Header)); @@ -228,7 +228,7 @@ public void Headers() //Assert fieldTypeBuilder.Should().NotBeNull(); - var entityMetadata = builder.GetEntities().FirstOrDefault(c => c.Type == typeof(Payment)); + var entityMetadata = ((IMetadataProvider)builder).GetEntities().FirstOrDefault(c => c.Type == typeof(Payment)); entityMetadata.Should().NotBeNull(); var metadata = entityMetadata!.FieldsMetadata.First(c => c.MemberInfo.Name == nameof(Payment.Header)); diff --git a/ksqlDb.RestApi.Client/FluentAPI/Builders/IMetadataProvider.cs b/ksqlDb.RestApi.Client/FluentAPI/Builders/IMetadataProvider.cs new file mode 100644 index 00000000..cbfaf943 --- /dev/null +++ b/ksqlDb.RestApi.Client/FluentAPI/Builders/IMetadataProvider.cs @@ -0,0 +1,11 @@ +using ksqlDb.RestApi.Client.FluentAPI.Builders.Configuration; +using ksqlDb.RestApi.Client.Metadata; + +namespace ksqlDb.RestApi.Client.FluentAPI.Builders +{ + internal interface IMetadataProvider + { + internal IEnumerable GetEntities(); + IDictionary Conventions { get; } + } +} diff --git a/ksqlDb.RestApi.Client/FluentAPI/Builders/ModelBuilder.cs b/ksqlDb.RestApi.Client/FluentAPI/Builders/ModelBuilder.cs index cc3d2ed8..6c5474e8 100644 --- a/ksqlDb.RestApi.Client/FluentAPI/Builders/ModelBuilder.cs +++ b/ksqlDb.RestApi.Client/FluentAPI/Builders/ModelBuilder.cs @@ -6,12 +6,20 @@ namespace ksqlDb.RestApi.Client.FluentAPI.Builders /// /// Represents a builder for configuring the model. /// - public class ModelBuilder + public class ModelBuilder : IMetadataProvider { private readonly IDictionary builders = new Dictionary(); - internal readonly IDictionary Conventions = new Dictionary(); + private readonly IDictionary conventions = new Dictionary(); - internal IEnumerable GetEntities() + IDictionary IMetadataProvider.Conventions + { + get + { + return conventions; + } + } + + IEnumerable IMetadataProvider.GetEntities() { return builders.Values.Select(c => c.Metadata); } @@ -37,7 +45,7 @@ public ModelBuilder Apply(IFromItemTypeConfiguration configura /// The current instance. public ModelBuilder AddConvention(IConventionConfiguration configuration) { - Conventions.Add(configuration.Type, configuration); + conventions.Add(configuration.Type, configuration); return this; } diff --git a/ksqlDb.RestApi.Client/Infrastructure/Extensions/TypeExtensions.cs b/ksqlDb.RestApi.Client/Infrastructure/Extensions/TypeExtensions.cs index 77a955b5..2e2f7c3b 100644 --- a/ksqlDb.RestApi.Client/Infrastructure/Extensions/TypeExtensions.cs +++ b/ksqlDb.RestApi.Client/Infrastructure/Extensions/TypeExtensions.cs @@ -105,16 +105,16 @@ internal static string ExtractTypeName(this Type type) return attribute; } - internal static string GetMemberName(this MemberExpression memberExpression, ModelBuilder? modelBuilder) + internal static string GetMemberName(this MemberExpression memberExpression, IMetadataProvider? metadataProvider) { - var entityMetadata = modelBuilder?.GetEntities().FirstOrDefault(c => c.Type == memberExpression.Expression?.Type); + var entityMetadata = metadataProvider?.GetEntities().FirstOrDefault(c => c.Type == memberExpression.Expression?.Type); return memberExpression.Member.GetMemberName(entityMetadata); } - internal static string GetMemberName(this MemberInfo memberInfo, ModelBuilder? modelBuilder) + internal static string GetMemberName(this MemberInfo memberInfo, IMetadataProvider? metadataProvider) { - var entityMetadata = modelBuilder?.GetEntities().FirstOrDefault(c => c.Type == memberInfo.DeclaringType); + var entityMetadata = metadataProvider?.GetEntities().FirstOrDefault(c => c.Type == memberInfo.DeclaringType); return memberInfo.GetMemberName(entityMetadata); } diff --git a/ksqlDb.RestApi.Client/KSql/Query/Context/KSqlDBContext.cs b/ksqlDb.RestApi.Client/KSql/Query/Context/KSqlDBContext.cs index 01d6c8e2..25c9c8a9 100644 --- a/ksqlDb.RestApi.Client/KSql/Query/Context/KSqlDBContext.cs +++ b/ksqlDb.RestApi.Client/KSql/Query/Context/KSqlDBContext.cs @@ -74,6 +74,7 @@ protected override void OnConfigureServices(IServiceCollection serviceCollection base.OnConfigureServices(serviceCollection, contextOptions); serviceCollection.TryAddSingleton(modelBuilder); + serviceCollection.TryAddSingleton(modelBuilder); serviceCollection.RegisterEndpointDependencies(contextOptions); } diff --git a/ksqlDb.RestApi.Client/KSql/RestApi/Generators/TypeGenerator.cs b/ksqlDb.RestApi.Client/KSql/RestApi/Generators/TypeGenerator.cs index f4363f5c..d1d856ae 100644 --- a/ksqlDb.RestApi.Client/KSql/RestApi/Generators/TypeGenerator.cs +++ b/ksqlDb.RestApi.Client/KSql/RestApi/Generators/TypeGenerator.cs @@ -9,9 +9,9 @@ namespace ksqlDB.RestApi.Client.KSql.RestApi.Generators; -internal sealed class TypeGenerator(ModelBuilder modelBuilder) : EntityInfo(modelBuilder) +internal sealed class TypeGenerator(ModelBuilder metadataProvider) : EntityInfo(metadataProvider) { - private readonly KSqlTypeTranslator typeTranslator = new(modelBuilder); + private readonly KSqlTypeTranslator typeTranslator = new(metadataProvider); internal string Print(TypeProperties properties) { @@ -36,7 +36,7 @@ private void PrintProperties(StringBuilder stringBuilder, IdentifierEscaping var ksqlType = typeTranslator.Translate(type, escaping); - var memberName = memberInfo.GetMemberName(modelBuilder); + var memberName = memberInfo.GetMemberName(metadataProvider); var columnDefinition = $"{EscapeName(memberName, escaping)} {ksqlType}{typeTranslator.ExploreAttributes(typeof(T), memberInfo, type)}"; ksqlProperties.Add(columnDefinition); } diff --git a/ksqlDb.RestApi.Client/KSql/RestApi/KSqlDbQueryStreamProvider.cs b/ksqlDb.RestApi.Client/KSql/RestApi/KSqlDbQueryStreamProvider.cs index 67eba0a0..9fc7c250 100644 --- a/ksqlDb.RestApi.Client/KSql/RestApi/KSqlDbQueryStreamProvider.cs +++ b/ksqlDb.RestApi.Client/KSql/RestApi/KSqlDbQueryStreamProvider.cs @@ -85,9 +85,9 @@ internal void JsonPropertyNameModifier(JsonTypeInfo jsonTypeInfo) JsonPropertyNameModifier(jsonTypeInfo, modelBuilder); } - internal static void JsonPropertyNameModifier(JsonTypeInfo jsonTypeInfo, ModelBuilder modelBuilder) + internal static void JsonPropertyNameModifier(JsonTypeInfo jsonTypeInfo, IMetadataProvider metadataProvider) { - var entityMetadata = modelBuilder.GetEntities().FirstOrDefault(c => c.Type == jsonTypeInfo.Type); + var entityMetadata = metadataProvider.GetEntities().FirstOrDefault(c => c.Type == jsonTypeInfo.Type); foreach (var typeInfoProperty in jsonTypeInfo.Properties) { diff --git a/ksqlDb.RestApi.Client/KSql/RestApi/Parsers/IdentifierUtil.cs b/ksqlDb.RestApi.Client/KSql/RestApi/Parsers/IdentifierUtil.cs index 5744919f..ba1c67a7 100644 --- a/ksqlDb.RestApi.Client/KSql/RestApi/Parsers/IdentifierUtil.cs +++ b/ksqlDb.RestApi.Client/KSql/RestApi/Parsers/IdentifierUtil.cs @@ -51,27 +51,25 @@ Keywords when IsValid(identifier) && SystemColumns.IsValid(identifier) => identi }; } - /// - /// Format the identifier, except when it is a PseudoColumn. - /// - /// the memberExpression with the identifier - /// the format - /// the model builder - /// the identifier modified based on the provided format - public static string Format(MemberExpression memberExpression, IdentifierEscaping escaping, ModelBuilder? modelBuilder = null) + internal static string Format(MemberExpression memberExpression, IdentifierEscaping escaping, IMetadataProvider? metadataProvider = null) { return escaping switch { - Never => memberExpression.GetMemberName(modelBuilder), + Never => memberExpression.GetMemberName(metadataProvider), Keywords when memberExpression.Member.GetCustomAttribute() != null => memberExpression.Member.Name, - Keywords when IsValid(memberExpression.GetMemberName(modelBuilder)) && SystemColumns.IsValid(memberExpression.GetMemberName(modelBuilder)) => memberExpression.GetMemberName(modelBuilder), - Keywords => string.Concat("`", memberExpression.GetMemberName(modelBuilder), "`"), + Keywords when IsValid(memberExpression.GetMemberName(metadataProvider)) && SystemColumns.IsValid(memberExpression.GetMemberName(metadataProvider)) => memberExpression.GetMemberName(metadataProvider), + Keywords => string.Concat("`", memberExpression.GetMemberName(metadataProvider), "`"), Always when memberExpression.Member.GetCustomAttribute() != null => memberExpression.Member.Name, - Always => string.Concat("`", memberExpression.GetMemberName(modelBuilder), "`"), + Always => string.Concat("`", memberExpression.GetMemberName(metadataProvider), "`"), _ => throw new ArgumentOutOfRangeException(nameof(escaping), escaping, "Non-exhaustive match.") }; } + internal static string Format(MemberInfo memberInfo, IdentifierEscaping escaping, IMetadataProvider? modelBuilder = null) + { + return Format(memberInfo, escaping, modelBuilder as ModelBuilder); + } + /// /// Format the identifier, except when it is a PseudoColumn. /// diff --git a/ksqlDb.RestApi.Client/KSql/RestApi/Statements/CreateEntity.cs b/ksqlDb.RestApi.Client/KSql/RestApi/Statements/CreateEntity.cs index 14fba8dc..a035fe40 100644 --- a/ksqlDb.RestApi.Client/KSql/RestApi/Statements/CreateEntity.cs +++ b/ksqlDb.RestApi.Client/KSql/RestApi/Statements/CreateEntity.cs @@ -9,11 +9,11 @@ namespace ksqlDB.RestApi.Client.KSql.RestApi.Statements; -internal sealed class CreateEntity(ModelBuilder modelBuilder) : EntityInfo(modelBuilder) +internal sealed class CreateEntity(IMetadataProvider metadataProvider) : EntityInfo(metadataProvider) { private readonly StringBuilder stringBuilder = new(); - private readonly KSqlTypeTranslator typeTranslator = new(modelBuilder); + private readonly KSqlTypeTranslator typeTranslator = new(metadataProvider); internal string Print(StatementContext statementContext, EntityCreationMetadata metadata, bool? ifNotExists) { @@ -49,7 +49,7 @@ private void PrintProperties(StatementContext statementContext, EntityCreatio var ksqlType = typeTranslator.Translate(type, metadata.IdentifierEscaping); - var columnName = IdentifierUtil.Format(memberInfo, metadata.IdentifierEscaping, modelBuilder); + var columnName = IdentifierUtil.Format(memberInfo, metadata.IdentifierEscaping, metadataProvider); string columnDefinition = $"\t{columnName} {ksqlType}{typeTranslator.ExploreAttributes(typeof(T), memberInfo, type)}"; columnDefinition += TryAttachKey(statementContext.KSqlEntityType, memberInfo); @@ -85,7 +85,7 @@ private void PrintCreateOrReplace(StatementContext statementContext, EntityCr private string TryAttachKey(KSqlEntityType entityType, MemberInfo memberInfo) { - var entityMetadata = modelBuilder.GetEntities().FirstOrDefault(c => c.Type == typeof(T)); + var entityMetadata = metadataProvider.GetEntities().FirstOrDefault(c => c.Type == typeof(T)); var primaryKey = entityMetadata?.PrimaryKeyMemberInfo; diff --git a/ksqlDb.RestApi.Client/KSql/RestApi/Statements/CreateInsert.cs b/ksqlDb.RestApi.Client/KSql/RestApi/Statements/CreateInsert.cs index 97261a2e..acc938c1 100644 --- a/ksqlDb.RestApi.Client/KSql/RestApi/Statements/CreateInsert.cs +++ b/ksqlDb.RestApi.Client/KSql/RestApi/Statements/CreateInsert.cs @@ -10,12 +10,12 @@ namespace ksqlDB.RestApi.Client.KSql.RestApi.Statements; internal sealed class CreateInsert : EntityInfo { - private readonly ModelBuilder modelBuilder; + private readonly ModelBuilder metadataProvider; - public CreateInsert(ModelBuilder modelBuilder) - : base(modelBuilder) + public CreateInsert(ModelBuilder metadataProvider) + : base(metadataProvider) { - this.modelBuilder = modelBuilder; + this.metadataProvider = metadataProvider; } internal string Generate(T entity, InsertProperties? insertProperties = null) @@ -51,11 +51,11 @@ internal string Generate(InsertValues insertValues, InsertProperties? inse valuesStringBuilder.Append(", "); } - columnsStringBuilder.Append(memberInfo.Format(insertProperties.IdentifierEscaping, modelBuilder)); + columnsStringBuilder.Append(memberInfo.Format(insertProperties.IdentifierEscaping, metadataProvider)); var type = GetMemberType(memberInfo); - var value = GetValue(insertValues, insertProperties, memberInfo, type, mi => IdentifierUtil.Format(mi, insertProperties.IdentifierEscaping, modelBuilder)); + var value = GetValue(insertValues, insertProperties, memberInfo, type, mi => IdentifierUtil.Format(mi, insertProperties.IdentifierEscaping, metadataProvider)); valuesStringBuilder.Append(value); } @@ -69,14 +69,14 @@ internal string Generate(InsertValues insertValues, InsertProperties? inse private object GetValue(InsertValues insertValues, InsertProperties insertProperties, MemberInfo memberInfo, Type type, Func formatter) { - var hasValue = insertValues.PropertyValues.ContainsKey(memberInfo.Format(insertProperties.IdentifierEscaping, modelBuilder)); + var hasValue = insertValues.PropertyValues.ContainsKey(memberInfo.Format(insertProperties.IdentifierEscaping, metadataProvider)); object value; if (hasValue) - value = insertValues.PropertyValues[memberInfo.Format(insertProperties.IdentifierEscaping, modelBuilder)]; + value = insertValues.PropertyValues[memberInfo.Format(insertProperties.IdentifierEscaping, metadataProvider)]; else - value = new CreateKSqlValue(modelBuilder).ExtractValue(insertValues.Entity, insertProperties, memberInfo, type, formatter); + value = new CreateKSqlValue(metadataProvider).ExtractValue(insertValues.Entity, insertProperties, memberInfo, type, formatter); return value; } diff --git a/ksqlDb.RestApi.Client/KSql/RestApi/Statements/CreateKSqlValue.cs b/ksqlDb.RestApi.Client/KSql/RestApi/Statements/CreateKSqlValue.cs index fdacb72a..ee82a62b 100644 --- a/ksqlDb.RestApi.Client/KSql/RestApi/Statements/CreateKSqlValue.cs +++ b/ksqlDb.RestApi.Client/KSql/RestApi/Statements/CreateKSqlValue.cs @@ -11,7 +11,7 @@ namespace ksqlDB.RestApi.Client.KSql.RestApi.Statements; #nullable disable -internal sealed class CreateKSqlValue(ModelBuilder modelBuilder) : EntityInfo(modelBuilder) +internal sealed class CreateKSqlValue(ModelBuilder metadataProvider) : EntityInfo(metadataProvider) { public object ExtractValue(T inputValue, IValueFormatters valueFormatters, MemberInfo memberInfo, Type type, Func formatter) { diff --git a/ksqlDb.RestApi.Client/KSql/RestApi/Statements/EntityInfo.cs b/ksqlDb.RestApi.Client/KSql/RestApi/Statements/EntityInfo.cs index 4e847fe3..4f7654dd 100644 --- a/ksqlDb.RestApi.Client/KSql/RestApi/Statements/EntityInfo.cs +++ b/ksqlDb.RestApi.Client/KSql/RestApi/Statements/EntityInfo.cs @@ -5,7 +5,7 @@ namespace ksqlDB.RestApi.Client.KSql.RestApi.Statements; -internal class EntityInfo(ModelBuilder modelBuilder) +internal class EntityInfo(IMetadataProvider metadataProvider) { protected static readonly EntityProvider EntityProvider = new(); @@ -24,7 +24,7 @@ protected IEnumerable Members(Type type, bool? includeReadOnly = nul .OfType() .Concat(fields); - var entityMetadata = modelBuilder.GetEntities().FirstOrDefault(c => c.Type == type); + var entityMetadata = metadataProvider.GetEntities().FirstOrDefault(c => c.Type == type); return properties.Where(c => { diff --git a/ksqlDb.RestApi.Client/KSql/RestApi/Statements/KSqlTypeTranslator.cs b/ksqlDb.RestApi.Client/KSql/RestApi/Statements/KSqlTypeTranslator.cs index c0c392b4..21417cba 100644 --- a/ksqlDb.RestApi.Client/KSql/RestApi/Statements/KSqlTypeTranslator.cs +++ b/ksqlDb.RestApi.Client/KSql/RestApi/Statements/KSqlTypeTranslator.cs @@ -9,10 +9,10 @@ namespace ksqlDB.RestApi.Client.KSql.RestApi.Statements { - internal sealed class KSqlTypeTranslator(ModelBuilder modelBuilder) : EntityInfo(modelBuilder) + internal sealed class KSqlTypeTranslator(IMetadataProvider metadataProvider) : EntityInfo(metadataProvider) { - private readonly ModelBuilder modelBuilder = modelBuilder; - private readonly DecimalTypeTranslator decimalTypeTranslator = new(modelBuilder); + private readonly IMetadataProvider metadataProvider = metadataProvider; + private readonly DecimalTypeTranslator decimalTypeTranslator = new(metadataProvider); internal string Translate(Type type, IdentifierEscaping escaping = IdentifierEscaping.Never) { @@ -107,7 +107,7 @@ internal IEnumerable GetProperties(Type type, IdentifierEscaping escapin var ksqlType = Translate(memberType, escaping); - string columnDefinition = $"{memberInfo.Format(escaping, modelBuilder)} {ksqlType}{ExploreAttributes(type, memberInfo, memberType)}"; + string columnDefinition = $"{memberInfo.Format(escaping, metadataProvider as ModelBuilder)} {ksqlType}{ExploreAttributes(type, memberInfo, memberType)}"; ksqlProperties.Add(columnDefinition); } @@ -132,7 +132,7 @@ internal string ExploreAttributes(Type? parentType, MemberInfo memberInfo, Type private string TryGetHeaderMarker(Type? parentType, MemberInfo memberInfo) { - var entityMetadata = modelBuilder.GetEntities().FirstOrDefault(c => c.Type == parentType); + var entityMetadata = metadataProvider.GetEntities().FirstOrDefault(c => c.Type == parentType); var fieldMetadata = entityMetadata?.GetFieldMetadataBy(memberInfo); if (fieldMetadata?.HasHeaders ?? false) diff --git a/ksqlDb.RestApi.Client/KSql/RestApi/Statements/Translators/DecimalTypeTranslator.cs b/ksqlDb.RestApi.Client/KSql/RestApi/Statements/Translators/DecimalTypeTranslator.cs index ac97cada..0e30fe54 100644 --- a/ksqlDb.RestApi.Client/KSql/RestApi/Statements/Translators/DecimalTypeTranslator.cs +++ b/ksqlDb.RestApi.Client/KSql/RestApi/Statements/Translators/DecimalTypeTranslator.cs @@ -7,7 +7,7 @@ namespace ksqlDb.RestApi.Client.KSql.RestApi.Statements.Translators { - internal class DecimalTypeTranslator(ModelBuilder modelBuilder) + internal class DecimalTypeTranslator(IMetadataProvider modelBuilder) { internal bool TryGetDecimal(Type? parentType, MemberInfo memberInfo, out string? @decimal) {