Skip to content

Commit

Permalink
More data type aliases, return scale for number and datetime, and bet…
Browse files Browse the repository at this point in the history
…ter binary string support
  • Loading branch information
zhicwu committed Jan 24, 2022
1 parent 2949c8a commit c9ea0a1
Show file tree
Hide file tree
Showing 11 changed files with 240 additions and 58 deletions.
Expand Up @@ -74,10 +74,11 @@ public enum ClickHouseDataType {
IPv6(Inet6Address.class, false, true, false, 16, 39, 0, 0, 0, "INET6"),
FixedString(String.class, true, true, false, 0, 0, 0, 0, 0, "BINARY"),
String(String.class, false, true, false, 0, 0, 0, 0, 0, "BINARY LARGE OBJECT", "BINARY VARYING", "BLOB", "BYTEA",
"CHAR", "CHAR LARGE OBJECT", "CHAR VARYING", "CHARACTER", "CHARACTER LARGE OBJECT", "CHARACTER VARYING",
"CLOB", "LONGBLOB", "LONGTEXT", "MEDIUMBLOB", "MEDIUMTEXT", "NATIONAL CHAR", "NATIONAL CHAR VARYING",
"NATIONAL CHARACTER", "NATIONAL CHARACTER LARGE OBJECT", "NATIONAL CHARACTER VARYING", "NCHAR",
"NCHAR LARGE OBJECT", "NCHAR VARYING", "NVARCHAR", "TEXT", "TINYBLOB", "TINYTEXT", "VARCHAR", "VARCHAR2"),
"CHAR", "CHARACTER", "CHARACTER LARGE OBJECT", "CHARACTER VARYING", "CHAR LARGE OBJECT", "CHAR VARYING",
"CLOB", "LONGBLOB", "LONGTEXT", "MEDIUMBLOB", "MEDIUMTEXT", "NATIONAL CHAR", "NATIONAL CHARACTER",
"NATIONAL CHARACTER LARGE OBJECT", "NATIONAL CHARACTER VARYING", "NATIONAL CHAR VARYING", "NCHAR",
"NCHAR LARGE OBJECT", "NCHAR VARYING", "NVARCHAR", "TEXT", "TINYBLOB", "TINYTEXT", "VARBINARY", "VARCHAR",
"VARCHAR2"),
AggregateFunction(String.class, true, true, false, 0, 0, 0, 0, 0), // implementation-defined intermediate state
SimpleAggregateFunction(String.class, true, true, false, 0, 0, 0, 0, 0),
Array(Object.class, true, true, false, 0, 0, 0, 0, 0),
Expand Down
Expand Up @@ -538,6 +538,55 @@ default <T, E extends Enum<E>> T asObject(Class<T> clazz) {
}
}

/**
* Gets binary value as byte array.
*
* @return non-null byte array
*/
default byte[] asBinary() {
return asBinary(0, null);
}

/**
* Gets binary value as fixed length byte array.
*
* @param length byte length of value, 0 or negative number means no limit
* @return non-null byte array
*/
default byte[] asBinary(int length) {
return asBinary(length, null);
}

/**
* Gets binary value as byte array.
*
* @param charset charset, null is same as default(UTF-8)
* @return non-null byte array
*/
default byte[] asBinary(Charset charset) {
return asBinary(0, charset);
}

/**
* Gets binary value as byte array.
*
* @param length byte length of value, 0 or negative number means no limit
* @param charset charset, null is same as default(UTF-8)
* @return non-null byte array
*/
default byte[] asBinary(int length, Charset charset) {
if (isNullOrEmpty()) {
return ClickHouseValues.EMPTY_BYTE_ARRAY;
}

byte[] bytes = asString().getBytes(charset == null ? StandardCharsets.UTF_8 : charset);
if (length > 0) {
ClickHouseChecker.notWithDifferentLength(bytes, length);
}

return bytes;
}

/**
* Gets value as unbounded string, using default charset(usually UTF-8).
*
Expand Down
Expand Up @@ -76,7 +76,9 @@ public final class ClickHouseValues {
public static final long[] EMPTY_LONG_ARRAY = new long[0];
public static final float[] EMPTY_FLOAT_ARRAY = new float[0];
public static final double[] EMPTY_DOUBLE_ARRAY = new double[0];

public static final String EMPTY_ARRAY_EXPR = "[]";
public static final String EMPTY_STRING_EXPR = "''";

public static final BigDecimal NANOS = new BigDecimal(BigInteger.TEN.pow(9));

Expand Down
Expand Up @@ -331,13 +331,15 @@ private void buildMappingsForDataTypes() {

// string and uuid
buildMappings(deserializers, serializers,
(r, f, c, i) -> ClickHouseStringValue.of(r, BinaryStreamUtils.readFixedString(i, c.getPrecision())),
(v, f, c, o) -> BinaryStreamUtils.writeFixedString(o, v.asString(c.getPrecision()),
c.getPrecision()),
ClickHouseDataType.FixedString);
buildMappings(deserializers, serializers,
(r, f, c, i) -> ClickHouseStringValue.of(r, i.readUnicodeString()),
(v, f, c, o) -> BinaryStreamUtils.writeString(o, v.asString()), ClickHouseDataType.String);
(r, f, c, i) -> ClickHouseStringValue.of(r, i.readBytes(c.getPrecision())),
(v, f, c, o) -> o.write(v.asBinary(c.getPrecision())), ClickHouseDataType.FixedString);
buildMappings(deserializers, serializers,
(r, f, c, i) -> ClickHouseStringValue.of(r, i.readBytes(i.readVarInt())),
(v, f, c, o) -> {
byte[] bytes = v.asBinary();
BinaryStreamUtils.writeVarInt(o, bytes.length);
o.write(bytes);
}, ClickHouseDataType.String);
buildMappings(deserializers, serializers,
(r, f, c, i) -> ClickHouseUuidValue.of(r, BinaryStreamUtils.readUuid(i)),
(v, f, c, o) -> BinaryStreamUtils.writeUuid(o, v.asUuid()), ClickHouseDataType.UUID);
Expand Down

0 comments on commit c9ea0a1

Please sign in to comment.