9
9
10
10
namespace ksqlDB . RestApi . Client . KSql . RestApi . Statements
11
11
{
12
- internal sealed class KSqlTypeTranslator ( IMetadataProvider metadataProvider ) : EntityInfo ( metadataProvider )
12
+ internal sealed class KSqlTypeTranslator < TEntity > ( IMetadataProvider metadataProvider ) : EntityInfo ( metadataProvider )
13
13
{
14
14
private readonly IMetadataProvider metadataProvider = metadataProvider ;
15
15
private readonly DecimalTypeTranslator decimalTypeTranslator = new ( metadataProvider ) ;
16
16
17
- internal string Translate ( Type type , IdentifierEscaping escaping = IdentifierEscaping . Never )
17
+ internal string Translate ( Type type , MemberInfo ? memberInfo = null , IdentifierEscaping escaping = IdentifierEscaping . Never )
18
18
{
19
19
var ksqlType = string . Empty ;
20
20
@@ -25,16 +25,16 @@ internal string Translate(Type type, IdentifierEscaping escaping = IdentifierEsc
25
25
var elementType = type . GetElementType ( ) ;
26
26
if ( elementType == null )
27
27
throw new InvalidOperationException ( nameof ( elementType ) ) ;
28
- var elementTypeName = Translate ( elementType , escaping ) ;
28
+ var elementTypeName = Translate ( elementType , memberInfo , escaping ) ;
29
29
30
30
ksqlType = $ "{ KSqlTypes . Array } <{ elementTypeName } >";
31
31
}
32
32
else if ( type . IsDictionary ( ) )
33
33
{
34
34
Type [ ] typeParameters = type . GetGenericArguments ( ) ;
35
35
36
- var keyType = Translate ( typeParameters [ 0 ] , escaping ) ;
37
- var valueType = Translate ( typeParameters [ 1 ] , escaping ) ;
36
+ var keyType = Translate ( typeParameters [ 0 ] , memberInfo , escaping ) ;
37
+ var valueType = Translate ( typeParameters [ 1 ] , memberInfo , escaping ) ;
38
38
39
39
ksqlType = $ "{ KSqlTypes . Map } <{ keyType } , { valueType } >";
40
40
}
@@ -58,7 +58,7 @@ internal string Translate(Type type, IdentifierEscaping escaping = IdentifierEsc
58
58
ksqlType = KSqlTypes . Time ;
59
59
else if ( type == typeof ( DateTimeOffset ) )
60
60
ksqlType = KSqlTypes . Timestamp ;
61
- else if ( ! type . IsGenericType && type . TryGetAttribute < StructAttribute > ( ) != null )
61
+ else if ( ! type . IsGenericType && IsStructType ( type , memberInfo ) )
62
62
{
63
63
var ksqlProperties = GetProperties ( type , escaping ) ;
64
64
@@ -88,7 +88,7 @@ internal string Translate(Type type, IdentifierEscaping escaping = IdentifierEsc
88
88
89
89
if ( elementType != null )
90
90
{
91
- string ksqlElementType = Translate ( elementType , escaping ) ;
91
+ string ksqlElementType = Translate ( elementType , memberInfo , escaping ) ;
92
92
93
93
ksqlType = $ "{ KSqlTypes . Array } <{ ksqlElementType } >";
94
94
}
@@ -97,6 +97,22 @@ internal string Translate(Type type, IdentifierEscaping escaping = IdentifierEsc
97
97
return ksqlType ;
98
98
}
99
99
100
+ private bool IsStructType ( Type type , MemberInfo ? memberInfo )
101
+ {
102
+ if ( type . TryGetAttribute < StructAttribute > ( ) != null )
103
+ return true ;
104
+
105
+ if ( memberInfo == null )
106
+ return false ;
107
+
108
+ var entityMetadata = metadataProvider . GetEntities ( ) . FirstOrDefault ( c => c . Type == typeof ( TEntity ) ) ;
109
+ var fieldMetadata = entityMetadata ? . GetFieldMetadataBy ( memberInfo ) ;
110
+ return fieldMetadata is
111
+ {
112
+ IsStruct : true
113
+ } ;
114
+ }
115
+
100
116
internal IEnumerable < string > GetProperties ( Type type , IdentifierEscaping escaping )
101
117
{
102
118
var ksqlProperties = new List < string > ( ) ;
@@ -105,7 +121,7 @@ internal IEnumerable<string> GetProperties(Type type, IdentifierEscaping escapin
105
121
{
106
122
var memberType = GetMemberType ( memberInfo ) ;
107
123
108
- var ksqlType = Translate ( memberType , escaping ) ;
124
+ var ksqlType = Translate ( memberType , memberInfo , escaping ) ;
109
125
110
126
string columnDefinition = $ "{ memberInfo . Format ( escaping , metadataProvider as ModelBuilder ) } { ksqlType } { ExploreAttributes ( type , memberInfo , memberType ) } ";
111
127
0 commit comments