Skip to content

Commit cd2dc12

Browse files
committed
Convert string to primitive array
1 parent 2f10655 commit cd2dc12

13 files changed

Lines changed: 375 additions & 56 deletions

File tree

clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseUtils.java

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.concurrent.LinkedBlockingQueue;
3131
import java.util.concurrent.TimeUnit;
3232
import java.util.concurrent.ThreadPoolExecutor;
33+
import java.util.function.Consumer;
3334
import java.util.function.Supplier;
3435
import java.util.function.UnaryOperator;
3536

@@ -1066,6 +1067,91 @@ public static int readEnumValues(String args, int startIndex, int len, Map<Strin
10661067
return len;
10671068
}
10681069

1070+
public static List<String> readValueArray(String args, int startIndex, int len) {
1071+
List<String> list = new LinkedList<>();
1072+
readValueArray(args, startIndex, len, list::add);
1073+
return list.isEmpty() ? Collections.emptyList() : Collections.unmodifiableList(list);
1074+
}
1075+
1076+
public static int readValueArray(String args, int startIndex, int len, Consumer<String> func) {
1077+
char closeBracket = ']';
1078+
StringBuilder builder = new StringBuilder();
1079+
for (int i = startIndex; i < len; i++) {
1080+
char ch = args.charAt(i);
1081+
if (ch == '[') {
1082+
startIndex = i + 1;
1083+
break;
1084+
} else if (Character.isWhitespace(ch)) {
1085+
continue;
1086+
} else if (i + 1 < len) {
1087+
char nextCh = args.charAt(i + 1);
1088+
if (ch == '-' && nextCh == '-') {
1089+
i = skipSingleLineComment(args, i + 2, len) - 1;
1090+
} else if (ch == '/' && nextCh == '*') {
1091+
i = skipMultiLineComment(args, i + 2, len) - 1;
1092+
} else {
1093+
startIndex = i;
1094+
break;
1095+
}
1096+
} else {
1097+
startIndex = i;
1098+
break;
1099+
}
1100+
}
1101+
1102+
boolean hasNext = false;
1103+
for (int i = startIndex; i < len; i++) {
1104+
char ch = args.charAt(i);
1105+
if (Character.isWhitespace(ch)) {
1106+
continue;
1107+
} else if (ch == '\'') { // string
1108+
hasNext = false;
1109+
int endIndex = readNameOrQuotedString(args, i, len, builder);
1110+
func.accept(unescape(args.substring(i, endIndex)));
1111+
builder.setLength(0);
1112+
i = endIndex + 1;
1113+
} else if (ch == '[') { // array
1114+
hasNext = false;
1115+
int endIndex = skipContentsUntil(args, i + 1, len, ']');
1116+
func.accept(args.substring(i, endIndex));
1117+
builder.setLength(0);
1118+
i = endIndex;
1119+
} else if (ch == '(') { // tuple
1120+
hasNext = false;
1121+
int endIndex = skipContentsUntil(args, i + 1, len, ')');
1122+
func.accept(args.substring(i, endIndex));
1123+
builder.setLength(0);
1124+
i = endIndex;
1125+
} else if (ch == closeBracket) {
1126+
len = i + 1;
1127+
break;
1128+
} else if (ch == ',') {
1129+
hasNext = true;
1130+
String str = builder.toString();
1131+
func.accept(str.isEmpty() || ClickHouseValues.NULL_EXPR.equalsIgnoreCase(str) ? null : str);
1132+
builder.setLength(0);
1133+
} else if (i + 1 < len) {
1134+
char nextCh = args.charAt(i + 1);
1135+
if (ch == '-' && nextCh == '-') {
1136+
i = skipSingleLineComment(args, i + 2, len) - 1;
1137+
} else if (ch == '/' && nextCh == '*') {
1138+
i = skipMultiLineComment(args, i + 2, len) - 1;
1139+
} else {
1140+
builder.append(ch);
1141+
}
1142+
} else {
1143+
builder.append(ch);
1144+
}
1145+
}
1146+
1147+
if (hasNext || builder.length() > 0) {
1148+
String str = builder.toString();
1149+
func.accept(str.isEmpty() || ClickHouseValues.NULL_EXPR.equalsIgnoreCase(str) ? null : str);
1150+
}
1151+
1152+
return len;
1153+
}
1154+
10691155
public static int readParameters(String args, int startIndex, int len, List<String> params) {
10701156
char closeBracket = ')'; // startIndex points to the openning bracket
10711157
Deque<Character> stack = new ArrayDeque<>();

clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseVersion.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,19 @@ public static ClickHouseVersion of(String version) {
7979
return versionCache.get(version);
8080
}
8181

82+
/**
83+
* Creates a new version object using given numbers.
84+
*
85+
* @param yearOrMajor year or major vrsion
86+
* @param more more version numbers if any
87+
* @return version
88+
*/
89+
public static ClickHouseVersion of(int yearOrMajor, int... more) {
90+
int len = more != null ? more.length : 0;
91+
return new ClickHouseVersion(false, yearOrMajor, len > 0 ? more[0] : 0, len > 1 ? more[1] : 0,
92+
len > 2 ? more[2] : 0);
93+
}
94+
8295
/**
8396
* Parses given version without caching.
8497
*
@@ -460,7 +473,7 @@ public boolean check(String range) {
460473
break;
461474
}
462475

463-
result = nextCh == ')' ? isOlderThan(v2) : isOlderOrEqualTo(v2);
476+
result = nextCh == ')' ? (latest || isOlderThan(v2)) : isOlderOrEqualTo(v2);
464477
if (!result) {
465478
break;
466479
}

clickhouse-client/src/main/java/com/clickhouse/client/data/array/ClickHouseByteArrayValue.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Map.Entry;
2222

2323
import com.clickhouse.client.ClickHouseChecker;
24+
import com.clickhouse.client.ClickHouseUtils;
2425
import com.clickhouse.client.ClickHouseValue;
2526
import com.clickhouse.client.ClickHouseValues;
2627
import com.clickhouse.client.data.ClickHouseObjectValue;
@@ -403,7 +404,22 @@ public ClickHouseByteArrayValue update(Map<?, ?> value) {
403404

404405
@Override
405406
public ClickHouseByteArrayValue update(String value) {
406-
return set(new byte[] { Byte.parseByte(value) });
407+
if (ClickHouseChecker.isNullOrBlank(value)) {
408+
set(ClickHouseValues.EMPTY_BYTE_ARRAY);
409+
} else {
410+
List<String> list = ClickHouseUtils.readValueArray(value, 0, value.length());
411+
if (list.isEmpty()) {
412+
set(ClickHouseValues.EMPTY_BYTE_ARRAY);
413+
} else {
414+
byte[] arr = new byte[list.size()];
415+
int index = 0;
416+
for (String v : list) {
417+
arr[index++] = Byte.parseByte(v);
418+
}
419+
set(arr);
420+
}
421+
}
422+
return this;
407423
}
408424

409425
@Override

clickhouse-client/src/main/java/com/clickhouse/client/data/array/ClickHouseDoubleArrayValue.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Map.Entry;
2222

2323
import com.clickhouse.client.ClickHouseChecker;
24+
import com.clickhouse.client.ClickHouseUtils;
2425
import com.clickhouse.client.ClickHouseValue;
2526
import com.clickhouse.client.ClickHouseValues;
2627
import com.clickhouse.client.data.ClickHouseObjectValue;
@@ -399,7 +400,22 @@ public ClickHouseDoubleArrayValue update(Map<?, ?> value) {
399400

400401
@Override
401402
public ClickHouseDoubleArrayValue update(String value) {
402-
return set(new double[] { Double.parseDouble(value) });
403+
if (ClickHouseChecker.isNullOrBlank(value)) {
404+
set(ClickHouseValues.EMPTY_DOUBLE_ARRAY);
405+
} else {
406+
List<String> list = ClickHouseUtils.readValueArray(value, 0, value.length());
407+
if (list.isEmpty()) {
408+
set(ClickHouseValues.EMPTY_DOUBLE_ARRAY);
409+
} else {
410+
double[] arr = new double[list.size()];
411+
int index = 0;
412+
for (String v : list) {
413+
arr[index++] = Double.parseDouble(v);
414+
}
415+
set(arr);
416+
}
417+
}
418+
return this;
403419
}
404420

405421
@Override

clickhouse-client/src/main/java/com/clickhouse/client/data/array/ClickHouseFloatArrayValue.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Map.Entry;
2222

2323
import com.clickhouse.client.ClickHouseChecker;
24+
import com.clickhouse.client.ClickHouseUtils;
2425
import com.clickhouse.client.ClickHouseValue;
2526
import com.clickhouse.client.ClickHouseValues;
2627
import com.clickhouse.client.data.ClickHouseObjectValue;
@@ -399,7 +400,22 @@ public ClickHouseFloatArrayValue update(Map<?, ?> value) {
399400

400401
@Override
401402
public ClickHouseFloatArrayValue update(String value) {
402-
return set(new float[] { Float.parseFloat(value) });
403+
if (ClickHouseChecker.isNullOrBlank(value)) {
404+
set(ClickHouseValues.EMPTY_FLOAT_ARRAY);
405+
} else {
406+
List<String> list = ClickHouseUtils.readValueArray(value, 0, value.length());
407+
if (list.isEmpty()) {
408+
set(ClickHouseValues.EMPTY_FLOAT_ARRAY);
409+
} else {
410+
float[] arr = new float[list.size()];
411+
int index = 0;
412+
for (String v : list) {
413+
arr[index++] = Float.parseFloat(v);
414+
}
415+
set(arr);
416+
}
417+
}
418+
return this;
403419
}
404420

405421
@Override

clickhouse-client/src/main/java/com/clickhouse/client/data/array/ClickHouseIntArrayValue.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Map.Entry;
2222

2323
import com.clickhouse.client.ClickHouseChecker;
24+
import com.clickhouse.client.ClickHouseUtils;
2425
import com.clickhouse.client.ClickHouseValue;
2526
import com.clickhouse.client.ClickHouseValues;
2627
import com.clickhouse.client.data.ClickHouseObjectValue;
@@ -399,7 +400,22 @@ public ClickHouseIntArrayValue update(Map<?, ?> value) {
399400

400401
@Override
401402
public ClickHouseIntArrayValue update(String value) {
402-
return set(new int[] { Integer.parseInt(value) });
403+
if (ClickHouseChecker.isNullOrBlank(value)) {
404+
set(ClickHouseValues.EMPTY_INT_ARRAY);
405+
} else {
406+
List<String> list = ClickHouseUtils.readValueArray(value, 0, value.length());
407+
if (list.isEmpty()) {
408+
set(ClickHouseValues.EMPTY_INT_ARRAY);
409+
} else {
410+
int[] arr = new int[list.size()];
411+
int index = 0;
412+
for (String v : list) {
413+
arr[index++] = Integer.parseInt(v);
414+
}
415+
set(arr);
416+
}
417+
}
418+
return this;
403419
}
404420

405421
@Override

clickhouse-client/src/main/java/com/clickhouse/client/data/array/ClickHouseLongArrayValue.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Map.Entry;
2222

2323
import com.clickhouse.client.ClickHouseChecker;
24+
import com.clickhouse.client.ClickHouseUtils;
2425
import com.clickhouse.client.ClickHouseValue;
2526
import com.clickhouse.client.ClickHouseValues;
2627
import com.clickhouse.client.data.ClickHouseObjectValue;
@@ -399,7 +400,22 @@ public ClickHouseLongArrayValue update(Map<?, ?> value) {
399400

400401
@Override
401402
public ClickHouseLongArrayValue update(String value) {
402-
return set(new long[] { Long.parseLong(value) });
403+
if (ClickHouseChecker.isNullOrBlank(value)) {
404+
set(ClickHouseValues.EMPTY_LONG_ARRAY);
405+
} else {
406+
List<String> list = ClickHouseUtils.readValueArray(value, 0, value.length());
407+
if (list.isEmpty()) {
408+
set(ClickHouseValues.EMPTY_LONG_ARRAY);
409+
} else {
410+
long[] arr = new long[list.size()];
411+
int index = 0;
412+
for (String v : list) {
413+
arr[index++] = Long.parseLong(v);
414+
}
415+
set(arr);
416+
}
417+
}
418+
return this;
403419
}
404420

405421
@Override

clickhouse-client/src/main/java/com/clickhouse/client/data/array/ClickHouseShortArrayValue.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Map.Entry;
2222

2323
import com.clickhouse.client.ClickHouseChecker;
24+
import com.clickhouse.client.ClickHouseUtils;
2425
import com.clickhouse.client.ClickHouseValue;
2526
import com.clickhouse.client.ClickHouseValues;
2627
import com.clickhouse.client.data.ClickHouseObjectValue;
@@ -399,7 +400,22 @@ public ClickHouseShortArrayValue update(Map<?, ?> value) {
399400

400401
@Override
401402
public ClickHouseShortArrayValue update(String value) {
402-
return set(new short[] { Short.parseShort(value) });
403+
if (ClickHouseChecker.isNullOrBlank(value)) {
404+
set(ClickHouseValues.EMPTY_SHORT_ARRAY);
405+
} else {
406+
List<String> list = ClickHouseUtils.readValueArray(value, 0, value.length());
407+
if (list.isEmpty()) {
408+
set(ClickHouseValues.EMPTY_SHORT_ARRAY);
409+
} else {
410+
short[] arr = new short[list.size()];
411+
int index = 0;
412+
for (String v : list) {
413+
arr[index++] = Short.parseShort(v);
414+
}
415+
set(arr);
416+
}
417+
}
418+
return this;
403419
}
404420

405421
@Override

clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseClusterTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,11 @@ public void testProbe() {
105105
// FIXME does not support ClickHouseProtocol.POSTGRESQL for now
106106
ClickHouseProtocol[] protocols = new ClickHouseProtocol[] { ClickHouseProtocol.GRPC, ClickHouseProtocol.HTTP,
107107
ClickHouseProtocol.MYSQL, ClickHouseProtocol.TCP };
108-
108+
ClickHouseVersion serverVersion = ClickHouseVersion.of(System.getProperty("clickhouseVersion", "latest"));
109109
for (ClickHouseProtocol p : protocols) {
110+
if (p == ClickHouseProtocol.GRPC && !serverVersion.check("[21.1,)")) {
111+
continue;
112+
}
110113
ClickHouseNode node = getServer(ClickHouseProtocol.ANY, p.getDefaultPort());
111114
ClickHouseNode probedNode = ClickHouseCluster.probe(node);
112115
Assert.assertNotEquals(probedNode, node);

0 commit comments

Comments
 (0)