1616package org .eclipse .jnosql .diana .cassandra .column ;
1717
1818
19- import com .datastax .driver .core .CodecRegistry ;
20- import com .datastax .driver .core .ColumnDefinitions ;
21- import com .datastax .driver .core .DataType ;
22- import com .datastax .driver .core .Row ;
23- import com .datastax .driver .core .TypeCodec ;
24- import com .datastax .driver .core .UDTValue ;
25- import com .datastax .driver .core .UserType ;
26- import com .google .common .reflect .TypeToken ;
19+ import com .datastax .oss .driver .api .core .CqlIdentifier ;
20+ import com .datastax .oss .driver .api .core .cql .ColumnDefinition ;
21+ import com .datastax .oss .driver .api .core .cql .Row ;
22+ import com .datastax .oss .driver .api .core .data .UdtValue ;
23+ import com .datastax .oss .driver .api .core .type .DataType ;
24+ import com .datastax .oss .driver .api .core .type .UserDefinedType ;
25+ import com .datastax .oss .driver .api .core .type .codec .TypeCodec ;
26+ import com .datastax .oss .driver .api .core .type .codec .registry .CodecRegistry ;
27+ import com .datastax .oss .protocol .internal .ProtocolConstants ;
2728import jakarta .nosql .Value ;
2829import jakarta .nosql .column .Column ;
2930import jakarta .nosql .column .ColumnEntity ;
3536
3637import static java .util .stream .Collectors .toList ;
3738
38-
3939final class CassandraConverter {
4040
41- private static final CodecRegistry CODE_REGISTRY = CodecRegistry .DEFAULT_INSTANCE ;
42-
4341 private CassandraConverter () {
4442 }
4543
4644 public static ColumnEntity toDocumentEntity (Row row ) {
4745 List <Column > columns = new ArrayList <>();
4846 String columnFamily = "" ;
49- for (ColumnDefinitions . Definition definition : row .getColumnDefinitions (). asList ()) {
50- columnFamily = definition .getTable ();
47+ for (ColumnDefinition definition : row .getColumnDefinitions ()) {
48+ columnFamily = definition .getTable (). asInternal () ;
5149 Object result = CassandraConverter .get (definition , row );
5250 if (Objects .nonNull (result )) {
5351 columns .add (getColumn (definition , result ));
@@ -56,79 +54,70 @@ public static ColumnEntity toDocumentEntity(Row row) {
5654 return ColumnEntity .of (columnFamily , columns );
5755 }
5856
59- private static Column getColumn (ColumnDefinitions .Definition definition , Object result ) {
60- switch (definition .getType ().getName ()) {
61- case UDT :
57+
58+ private static Column getColumn (ColumnDefinition definition , Object result ) {
59+
60+ final DataType type = definition .getType ();
61+ switch (type .getProtocolCode ()) {
62+ case ProtocolConstants .DataType .UDT :
6263 return Column .class .cast (result );
63- case LIST :
64- case SET :
64+ case ProtocolConstants . DataType . LIST :
65+ case ProtocolConstants . DataType . SET :
6566 if (isUDTIterable (result )) {
66- return UDT .builder (getUserType (definition , result )).withName (definition .getName ())
67+ return UDT .builder (getUserType (result )).withName (definition .getName (). asInternal ())
6768 .addUDTs (getColumns (definition , result )).build ();
68-
6969 }
70- return Column .of (definition .getName (), Value .of (result ));
70+ return Column .of (definition .getName (). asInternal () , Value .of (result ));
7171 default :
72- return Column .of (definition .getName (), Value .of (result ));
72+ return Column .of (definition .getName (). asInternal () , Value .of (result ));
7373 }
7474 }
7575
76- private static Iterable <Iterable <Column >> getColumns (ColumnDefinitions .Definition definition , Object result ) {
77- return (Iterable <Iterable <Column >>)
78- StreamSupport .stream (Iterable .class .cast (result ).spliterator (), false )
79- .map (c -> getUDT (definition .getName (), (UDTValue ) c ).get ())
80- .collect (toList ());
76+ static Object get (ColumnDefinition definition , Row row ) {
77+
78+ String name = definition .getName ().asInternal ();
79+ final DataType type = definition .getType ();
80+ if (type instanceof UserDefinedType ) {
81+ return getUDT (definition , row .getUdtValue (name ));
82+ }
83+ final TypeCodec <Object > codec = row .codecRegistry ().codecFor (type );
84+ return row .get (name , codec );
8185 }
8286
83- private static String getUserType (ColumnDefinitions .Definition definition , Object result ) {
87+ private static UDT getUDT (ColumnDefinition definition , UdtValue udtValue ) {
88+ String name = definition .getName ().asInternal ();
89+ final UserDefinedType type = udtValue .getType ();
90+ List <Column > columns = new ArrayList <>();
91+ List <String > names = type .getFieldNames ().stream ().map (CqlIdentifier ::asInternal ).collect (toList ());
92+ for (CqlIdentifier fieldName : type .getFieldNames ()) {
93+ final int index = names .indexOf (fieldName .asInternal ());
94+ DataType fieldType = type .getFieldTypes ().get (index );
95+ Object elementValue = udtValue .get (fieldName , CodecRegistry .DEFAULT .codecFor (fieldType ));
96+ if (elementValue != null ) {
97+ columns .add (Column .of (fieldName .asInternal (), elementValue ));
98+ }
99+ }
100+ return UDT .builder (type .getName ().asInternal ()).withName (name ).addUDT (columns ).build ();
101+ }
102+
103+ private static String getUserType (Object result ) {
84104 return StreamSupport .stream (Iterable .class .cast (result ).spliterator (), false )
85105 .limit (1L )
86- .map (c -> getUDT ( definition . getName (), ( UDTValue ) c ). getUserType ())
106+ .map (c -> UdtValue . class . cast ( c ). getType (). getName (). asInternal ())
87107 .findFirst ()
88108 .get ().toString ();
89109 }
90110
111+ private static Iterable <Iterable <Column >> getColumns (ColumnDefinition definition , Object result ) {
91112
92- public static Object get (ColumnDefinitions .Definition definition , Row row ) {
93-
94- String name = definition .getName ();
95- switch (definition .getType ().getName ()) {
96- case LIST :
97- DataType typeList = definition .getType ().getTypeArguments ().get (0 );
98- TypeToken <Object > javaTypeList = CODE_REGISTRY .codecFor (typeList ).getJavaType ();
99- return row .getList (name , javaTypeList );
100- case SET :
101- DataType typeSet = definition .getType ().getTypeArguments ().get (0 );
102- TypeToken <Object > javaTypeSet = CODE_REGISTRY .codecFor (typeSet ).getJavaType ();
103- return row .getSet (name , javaTypeSet );
104- case MAP :
105- DataType typeKey = definition .getType ().getTypeArguments ().get (0 );
106- DataType typeValue = definition .getType ().getTypeArguments ().get (1 );
107- TypeToken <Object > javaTypeKey = CODE_REGISTRY .codecFor (typeKey ).getJavaType ();
108- TypeToken <Object > javaTypeValue = CODE_REGISTRY .codecFor (typeValue ).getJavaType ();
109- return row .getMap (name , javaTypeKey , javaTypeValue );
110- case UDT :
111- UDTValue udtValue = row .getUDTValue (name );
112- return getUDT (name , udtValue );
113- default :
114- TypeCodec <Object > objectTypeCodec = CODE_REGISTRY .codecFor (definition .getType ());
115- return row .get (name , objectTypeCodec );
113+ List <Iterable <Column >> columns = new ArrayList <>();
114+ for (Object value : Iterable .class .cast (result )) {
115+ final UdtValue udtValue = UdtValue .class .cast (value );
116+ final UDT udt = getUDT (definition , udtValue );
117+ columns .add ((Iterable <Column >) udt .get ());
116118 }
117119
118-
119- }
120-
121- private static UDT getUDT (String name , UDTValue udtValue ) {
122- List <Column > columns = new ArrayList <>();
123- UserType type = udtValue .getType ();
124- for (String fieldName : type .getFieldNames ()) {
125- DataType fieldType = type .getFieldType (fieldName );
126- Object elementValue = udtValue .get (fieldName , CODE_REGISTRY .codecFor (fieldType ));
127- if (elementValue != null ) {
128- columns .add (Column .of (fieldName , elementValue ));
129- }
130- }
131- return UDT .builder (type .getTypeName ()).withName (name ).addUDT (columns ).build ();
120+ return columns ;
132121 }
133122
134123 private static boolean isUDTIterable (Object result ) {
@@ -137,7 +126,7 @@ private static boolean isUDTIterable(Object result) {
137126 return false ;
138127 }
139128 return StreamSupport .stream (iterable .spliterator (), false )
140- .allMatch (UDTValue .class ::isInstance );
129+ .allMatch (UdtValue .class ::isInstance );
141130 }
142131
143132
0 commit comments