66import com .clickhouse .data .ClickHouseAggregateFunction ;
77import com .clickhouse .data .ClickHouseColumn ;
88import com .clickhouse .data .ClickHouseDataType ;
9+ import com .clickhouse .data .ClickHouseEnum ;
910import com .clickhouse .data .format .BinaryStreamUtils ;
1011import com .clickhouse .data .value .ClickHouseBitmap ;
1112import com .clickhouse .data .value .ClickHouseGeoMultiPolygonValue ;
2829import java .net .Inet4Address ;
2930import java .net .Inet6Address ;
3031import java .sql .Timestamp ;
31- import java .time .Instant ;
3232import java .time .LocalDate ;
3333import java .time .LocalDateTime ;
3434import java .time .ZoneId ;
3535import java .time .ZonedDateTime ;
36- import java .util .ArrayList ;
3736import java .util .Arrays ;
3837import java .util .Collections ;
3938import java .util .HashMap ;
4645import java .util .TimeZone ;
4746import java .util .UUID ;
4847import java .util .stream .Collectors ;
49- import java .util .stream .StreamSupport ;
5048
5149import static org .objectweb .asm .Opcodes .ACC_PUBLIC ;
5250import static org .objectweb .asm .Opcodes .ALOAD ;
@@ -177,16 +175,16 @@ public static ClickHouseColumn valueToColumnForDynamicType(Object value) {
177175 int scale ;
178176 if (d .precision () > ClickHouseDataType .Decimal128 .getMaxScale ()) {
179177 decType = "Decimal256" ;
180- scale = ClickHouseDataType .Decimal128 .getMaxScale ();
178+ scale = ClickHouseDataType .Decimal256 .getMaxScale ();
181179 } else if (d .precision () > ClickHouseDataType .Decimal64 .getMaxScale ()) {
182180 decType = "Decimal128" ;
183181 scale = ClickHouseDataType .Decimal128 .getMaxScale ();
184182 } else if (d .precision () > ClickHouseDataType .Decimal32 .getMaxScale ()) {
185183 decType = "Decimal64" ;
186- scale = ClickHouseDataType .Decimal128 .getMaxScale ();
184+ scale = ClickHouseDataType .Decimal64 .getMaxScale ();
187185 } else {
188186 decType = "Decimal32" ;
189- scale = ClickHouseDataType .Decimal128 .getMaxScale ();
187+ scale = ClickHouseDataType .Decimal32 .getMaxScale ();
190188 }
191189
192190 column = ClickHouseColumn .of ("v" , decType + "(" + scale + ")" );
@@ -197,8 +195,10 @@ public static ClickHouseColumn valueToColumnForDynamicType(Object value) {
197195 ClickHouseColumn keyInfo = valueToColumnForDynamicType (entry .getKey ());
198196 ClickHouseColumn valueInfo = valueToColumnForDynamicType (entry .getValue ());
199197 column = ClickHouseColumn .of ("v" , "Map(" + keyInfo .getOriginalTypeName () + ", " + valueInfo .getOriginalTypeName () + ")" );
198+ } else if (value instanceof Enum <?>) {
199+ column = enumValue2Column ((Enum )value );
200200 } else if (value instanceof List <?>) {
201- column = value2Column (value );
201+ column = listValue2Column (value );
202202 } else if (value == null ) {
203203 column = PREDEFINED_TYPE_COLUMNS .get (Void .class );
204204 } else {
@@ -221,7 +221,7 @@ public static ClickHouseColumn valueToColumnForDynamicType(Object value) {
221221 // { 0, 1, 2 }
222222 // In this case we need to find max depth.
223223
224- private static ClickHouseColumn value2Column (Object value ) {
224+ private static ClickHouseColumn listValue2Column (Object value ) {
225225 ClickHouseColumn column ;
226226 if (value instanceof List <?>) {
227227 List <?> list = (List <?>) value ;
@@ -250,6 +250,12 @@ private static ClickHouseColumn value2Column(Object value) {
250250 return column ;
251251 }
252252
253+ private static ClickHouseColumn enumValue2Column (Enum <?> enumValue ) {
254+ ClickHouseEnum clickHouseEnum = ClickHouseEnum .of (enumValue .getClass ());
255+ return new ClickHouseColumn (clickHouseEnum .size () > 127 ? ClickHouseDataType .Enum16 : ClickHouseDataType .Enum8 , "v" , "Enum16" , false , false , Collections .emptyList (), Collections .emptyList (),
256+ clickHouseEnum );
257+ }
258+
253259 public static void writeDynamicTypeTag (OutputStream stream , ClickHouseColumn typeColumn )
254260 throws IOException {
255261
@@ -272,12 +278,20 @@ public static void writeDynamicTypeTag(OutputStream stream, ClickHouseColumn typ
272278 writeVarInt (stream , typeColumn .getEstimatedLength ());
273279 break ;
274280 case Enum8 :
275- stream .write (binTag );
276- /// 0x17<var_uint_number_of_elements><var_uint_name_size_1><name_data_1><int8_value_1>...<var_uint_name_size_N><name_data_N><int8_value_N>
277- break ;
278281 case Enum16 :
279282 stream .write (binTag );
280- //0x18<var_uint_number_of_elements><var_uint_name_size_1><name_data_1><int16_little_endian_value_1>...><var_uint_name_size_N><name_data_N><int16_little_endian_value_N>
283+ ClickHouseEnum enumVal = typeColumn .getEnumConstants ();
284+ String [] names = enumVal .getNames ();
285+ int [] values = enumVal .getValues ();
286+ writeVarInt (stream , names .length );
287+ for (int i = 0 ; i < enumVal .size (); i ++ ) {
288+ BinaryStreamUtils .writeString (stream , names [i ]);
289+ if (dt == ClickHouseDataType .Enum8 ) {
290+ BinaryStreamUtils .writeInt8 (stream , values [i ]);
291+ } else {
292+ BinaryStreamUtils .writeInt16 (stream , values [i ]);
293+ }
294+ }
281295 break ;
282296 case Decimal :
283297 case Decimal32 :
@@ -524,6 +538,7 @@ private static void serializePrimitiveData(OutputStream stream, Object value, Cl
524538 serializeJSON (stream , value );
525539 break ;
526540 case IntervalNanosecond :
541+ case IntervalMicrosecond :
527542 case IntervalMillisecond :
528543 case IntervalSecond :
529544 case IntervalMinute :
@@ -545,7 +560,9 @@ private static void serializeEnumData(OutputStream stream, ClickHouseColumn colu
545560 if (value instanceof String ) {
546561 enumValue = column .getEnumConstants ().value ((String ) value );
547562 } else if (value instanceof Number ) {
548- enumValue = ((Number )value ).intValue ();
563+ enumValue = ((Number ) value ).intValue ();
564+ } else if (value instanceof Enum <?>) {
565+ enumValue = ((Enum <?>)value ).ordinal ();
549566 } else {
550567 throw new IllegalArgumentException ("Cannot write value of class " + value .getClass () + " into column with Enum type " + column .getOriginalTypeName ());
551568 }
0 commit comments