Skip to content

Commit 508c7e5

Browse files
committed
Opt
1 parent a2c22ac commit 508c7e5

13 files changed

Lines changed: 321 additions & 239 deletions

File tree

iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBJDBCDataSet.java

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -127,20 +127,15 @@ public IoTDBJDBCDataSet(
127127

128128
// deduplicate and map
129129
if (columnNameIndex != null) {
130-
int deduplicatedColumnSize = (int) columnNameIndex.values().stream().distinct().count();
131-
this.columnTypeDeduplicatedList = new ArrayList<>(deduplicatedColumnSize);
132-
for (int i = 0; i < deduplicatedColumnSize; i++) {
133-
columnTypeDeduplicatedList.add(null);
134-
}
130+
this.columnTypeDeduplicatedList =
131+
initDeduplicatedColumnTypes(getDeduplicatedColumnSize(columnNameIndex));
135132
for (int i = 0; i < columnNameList.size(); i++) {
136133
String name = columnNameList.get(i);
137134
this.columnNameList.add(name);
138135
this.columnTypeList.add(columnTypeList.get(i));
139136
if (!columnOrdinalMap.containsKey(name)) {
140137
int index = columnNameIndex.get(name);
141-
if (!columnOrdinalMap.containsValue(index + START_INDEX)) {
142-
columnTypeDeduplicatedList.set(index, TSDataType.valueOf(columnTypeList.get(i)));
143-
}
138+
setColumnTypeIfAbsent(columnTypeDeduplicatedList, index, columnTypeList.get(i));
144139
columnOrdinalMap.put(name, index + START_INDEX);
145140
}
146141
}
@@ -242,11 +237,8 @@ public IoTDBJDBCDataSet(
242237

243238
// deduplicate and map
244239
if (columnNameIndex != null) {
245-
int deduplicatedColumnSize = (int) columnNameIndex.values().stream().distinct().count();
246-
this.columnTypeDeduplicatedList = new ArrayList<>(deduplicatedColumnSize);
247-
for (int i = 0; i < deduplicatedColumnSize; i++) {
248-
columnTypeDeduplicatedList.add(null);
249-
}
240+
this.columnTypeDeduplicatedList =
241+
initDeduplicatedColumnTypes(getDeduplicatedColumnSize(columnNameIndex));
250242
for (int i = 0; i < columnNameList.size(); i++) {
251243
String name = "";
252244
if (sgList != null
@@ -262,9 +254,7 @@ public IoTDBJDBCDataSet(
262254
// "Time".equals(name) -> to allow the Time column appear in value columns
263255
if (!columnOrdinalMap.containsKey(name) || "Time".equals(name)) {
264256
int index = columnNameIndex.get(name);
265-
if (!columnOrdinalMap.containsValue(index + START_INDEX)) {
266-
columnTypeDeduplicatedList.set(index, TSDataType.valueOf(columnTypeList.get(i)));
267-
}
257+
setColumnTypeIfAbsent(columnTypeDeduplicatedList, index, columnTypeList.get(i));
268258
columnOrdinalMap.put(name, index + START_INDEX);
269259
}
270260
}
@@ -320,6 +310,31 @@ public IoTDBJDBCDataSet(
320310
this.emptyResultSet = (queryDataSet == null || !queryDataSet.time.hasRemaining());
321311
}
322312

313+
private static int getDeduplicatedColumnSize(Map<String, Integer> columnNameIndex) {
314+
int deduplicatedColumnSize = 0;
315+
for (Integer index : columnNameIndex.values()) {
316+
if (index != null && index + 1 > deduplicatedColumnSize) {
317+
deduplicatedColumnSize = index + 1;
318+
}
319+
}
320+
return deduplicatedColumnSize;
321+
}
322+
323+
private static List<TSDataType> initDeduplicatedColumnTypes(int deduplicatedColumnSize) {
324+
List<TSDataType> columnTypes = new ArrayList<>(deduplicatedColumnSize);
325+
for (int i = 0; i < deduplicatedColumnSize; i++) {
326+
columnTypes.add(null);
327+
}
328+
return columnTypes;
329+
}
330+
331+
private static void setColumnTypeIfAbsent(
332+
List<TSDataType> columnTypeDeduplicatedList, int index, String columnType) {
333+
if (columnTypeDeduplicatedList.get(index) == null) {
334+
columnTypeDeduplicatedList.set(index, TSDataType.valueOf(columnType));
335+
}
336+
}
337+
323338
public void close() throws StatementExecutionException, TException {
324339
if (isClosed) {
325340
return;

iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/stmt/PreparedParameterSerde.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
/** Serializer for PreparedStatement parameters. */
3535
public class PreparedParameterSerde {
3636

37+
private static final char[] HEX_DIGITS = "0123456789ABCDEF".toCharArray();
38+
3739
public static class DeserializedParam {
3840
public final TSDataType type;
3941
public final Object value;
@@ -166,10 +168,13 @@ private static Object deserializeValue(ByteBuffer buffer, TSDataType type) {
166168

167169
/** Convert byte array to hexadecimal string representation. */
168170
public static String bytesToHex(byte[] bytes) {
169-
StringBuilder sb = new StringBuilder(bytes.length * 2);
170-
for (byte b : bytes) {
171-
sb.append(String.format("%02X", b));
171+
char[] chars = new char[bytes.length * 2];
172+
for (int i = 0; i < bytes.length; i++) {
173+
int value = bytes[i] & 0xFF;
174+
int index = i * 2;
175+
chars[index] = HEX_DIGITS[value >>> 4];
176+
chars[index + 1] = HEX_DIGITS[value & 0x0F];
172177
}
173-
return sb.toString();
178+
return new String(chars);
174179
}
175180
}

iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java

Lines changed: 96 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -852,31 +852,12 @@ private TSCreateAlignedTimeseriesReq getTSCreateAlignedTimeseriesReq(
852852
TSCreateAlignedTimeseriesReq request = new TSCreateAlignedTimeseriesReq();
853853
request.setPrefixPath(prefixPath);
854854
request.setMeasurements(measurements);
855-
request.setDataTypes(dataTypes.stream().map(TSDataType::ordinal).collect(Collectors.toList()));
856-
request.setEncodings(encodings.stream().map(TSEncoding::ordinal).collect(Collectors.toList()));
857-
request.setCompressors(
858-
compressors.stream().map(i -> (int) i.serialize()).collect(Collectors.toList()));
859-
if (measurementAliasList != null) {
860-
measurementAliasList =
861-
measurementAliasList.stream()
862-
.map(value -> value != null ? value : "")
863-
.collect(Collectors.toList());
864-
}
865-
request.setMeasurementAlias(measurementAliasList);
866-
if (tagsList != null) {
867-
tagsList =
868-
tagsList.stream()
869-
.map(value -> value != null ? value : new HashMap<String, String>())
870-
.collect(Collectors.toList());
871-
}
872-
request.setTagsList(tagsList);
873-
if (attributesList != null) {
874-
attributesList =
875-
attributesList.stream()
876-
.map(value -> value != null ? value : new HashMap<String, String>())
877-
.collect(Collectors.toList());
878-
}
879-
request.setAttributesList(attributesList);
855+
request.setDataTypes(toDataTypeOrdinals(dataTypes));
856+
request.setEncodings(toEncodingOrdinals(encodings));
857+
request.setCompressors(toCompressionOrdinals(compressors));
858+
request.setMeasurementAlias(replaceNullStrings(measurementAliasList));
859+
request.setTagsList(replaceNullMaps(tagsList));
860+
request.setAttributesList(replaceNullMaps(attributesList));
880861
return request;
881862
}
882863

@@ -916,47 +897,14 @@ private TSCreateMultiTimeseriesReq genTSCreateMultiTimeseriesReq(
916897
TSCreateMultiTimeseriesReq request = new TSCreateMultiTimeseriesReq();
917898

918899
request.setPaths(paths);
919-
920-
List<Integer> dataTypeOrdinals = new ArrayList<>(dataTypes.size());
921-
for (TSDataType dataType : dataTypes) {
922-
dataTypeOrdinals.add(dataType.ordinal());
923-
}
924-
request.setDataTypes(dataTypeOrdinals);
925-
926-
List<Integer> encodingOrdinals = new ArrayList<>(dataTypes.size());
927-
for (TSEncoding encoding : encodings) {
928-
encodingOrdinals.add(encoding.ordinal());
929-
}
930-
request.setEncodings(encodingOrdinals);
931-
932-
List<Integer> compressionOrdinals = new ArrayList<>(paths.size());
933-
for (CompressionType compression : compressors) {
934-
compressionOrdinals.add((int) compression.serialize());
935-
}
936-
request.setCompressors(compressionOrdinals);
900+
request.setDataTypes(toDataTypeOrdinals(dataTypes));
901+
request.setEncodings(toEncodingOrdinals(encodings));
902+
request.setCompressors(toCompressionOrdinals(compressors));
937903

938904
request.setPropsList(propsList);
939-
if (tagsList != null) {
940-
tagsList =
941-
tagsList.stream()
942-
.map(value -> value != null ? value : new HashMap<String, String>())
943-
.collect(Collectors.toList());
944-
}
945-
request.setTagsList(tagsList);
946-
if (attributesList != null) {
947-
attributesList =
948-
attributesList.stream()
949-
.map(value -> value != null ? value : new HashMap<String, String>())
950-
.collect(Collectors.toList());
951-
}
952-
request.setAttributesList(attributesList);
953-
if (measurementAliasList != null) {
954-
measurementAliasList =
955-
measurementAliasList.stream()
956-
.map(value -> value != null ? value : "")
957-
.collect(Collectors.toList());
958-
}
959-
request.setMeasurementAliasList(measurementAliasList);
905+
request.setTagsList(replaceNullMaps(tagsList));
906+
request.setAttributesList(replaceNullMaps(attributesList));
907+
request.setMeasurementAliasList(replaceNullStrings(measurementAliasList));
960908

961909
return request;
962910
}
@@ -1819,19 +1767,23 @@ private boolean filterNullValueAndMeasurement(
18191767
List<String> measurementsList,
18201768
List<TSDataType> types,
18211769
List<Object> valuesList) {
1822-
Map<String, Object> nullMap = new HashMap<>();
1770+
Map<String, Object> nullMap = logger.isInfoEnabled() ? new HashMap<>() : null;
18231771
for (int i = valuesList.size() - 1; i >= 0; i--) {
18241772
if (valuesList.get(i) == null) {
1825-
nullMap.put(measurementsList.get(i), valuesList.get(i));
1773+
if (nullMap != null) {
1774+
nullMap.put(measurementsList.get(i), valuesList.get(i));
1775+
}
18261776
valuesList.remove(i);
18271777
measurementsList.remove(i);
18281778
types.remove(i);
18291779
}
18301780
}
18311781
if (valuesList.isEmpty()) {
1832-
logger.info("All values of the {} are null,null values are {}", deviceId, nullMap);
1782+
if (nullMap != null) {
1783+
logger.info("All values of the {} are null,null values are {}", deviceId, nullMap);
1784+
}
18331785
return true;
1834-
} else {
1786+
} else if (nullMap != null) {
18351787
logger.info("Some values of {} are null,null values are {}", deviceId, nullMap);
18361788
}
18371789
return false;
@@ -1867,18 +1819,22 @@ private void filterNullValueAndMeasurementWithStringType(
18671819
*/
18681820
private boolean filterNullValueAndMeasurementWithStringType(
18691821
List<String> valuesList, String deviceId, List<String> measurementsList) {
1870-
Map<String, Object> nullMap = new HashMap<>();
1822+
Map<String, Object> nullMap = logger.isInfoEnabled() ? new HashMap<>() : null;
18711823
for (int i = valuesList.size() - 1; i >= 0; i--) {
18721824
if (valuesList.get(i) == null) {
1873-
nullMap.put(measurementsList.get(i), valuesList.get(i));
1825+
if (nullMap != null) {
1826+
nullMap.put(measurementsList.get(i), valuesList.get(i));
1827+
}
18741828
valuesList.remove(i);
18751829
measurementsList.remove(i);
18761830
}
18771831
}
18781832
if (valuesList.isEmpty()) {
1879-
logger.info("All values of the {} are null,null values are {}", deviceId, nullMap);
1833+
if (nullMap != null) {
1834+
logger.info("All values of the {} are null,null values are {}", deviceId, nullMap);
1835+
}
18801836
return true;
1881-
} else {
1837+
} else if (nullMap != null) {
18821838
logger.info("Some values of {} are null,null values are {}", deviceId, nullMap);
18831839
}
18841840
return false;
@@ -2622,7 +2578,65 @@ private TSInsertStringRecordsOfOneDeviceReq genTSInsertStringRecordsOfOneDeviceR
26222578
* @return ordered list
26232579
*/
26242580
private static <T> List<T> sortList(List<T> source, Integer[] index) {
2625-
return Arrays.stream(index).map(source::get).collect(Collectors.toList());
2581+
List<T> sortedList = new ArrayList<>(index.length);
2582+
for (int position : index) {
2583+
sortedList.add(source.get(position));
2584+
}
2585+
return sortedList;
2586+
}
2587+
2588+
private static List<Integer> toDataTypeOrdinals(List<TSDataType> dataTypes) {
2589+
List<Integer> ordinals = new ArrayList<>(dataTypes.size());
2590+
for (TSDataType dataType : dataTypes) {
2591+
ordinals.add(dataType.ordinal());
2592+
}
2593+
return ordinals;
2594+
}
2595+
2596+
private static List<Integer> toEncodingOrdinals(List<TSEncoding> encodings) {
2597+
List<Integer> ordinals = new ArrayList<>(encodings.size());
2598+
for (TSEncoding encoding : encodings) {
2599+
ordinals.add(encoding.ordinal());
2600+
}
2601+
return ordinals;
2602+
}
2603+
2604+
private static List<Integer> toCompressionOrdinals(List<CompressionType> compressors) {
2605+
List<Integer> ordinals = new ArrayList<>(compressors.size());
2606+
for (CompressionType compression : compressors) {
2607+
ordinals.add((int) compression.serialize());
2608+
}
2609+
return ordinals;
2610+
}
2611+
2612+
private static List<Byte> toEnumOrdinalsAsBytes(List<? extends Enum<?>> enumValues) {
2613+
List<Byte> ordinals = new ArrayList<>(enumValues.size());
2614+
for (Enum<?> enumValue : enumValues) {
2615+
ordinals.add((byte) enumValue.ordinal());
2616+
}
2617+
return ordinals;
2618+
}
2619+
2620+
private static List<String> replaceNullStrings(List<String> values) {
2621+
if (values == null) {
2622+
return null;
2623+
}
2624+
List<String> replacedValues = new ArrayList<>(values.size());
2625+
for (String value : values) {
2626+
replacedValues.add(value != null ? value : "");
2627+
}
2628+
return replacedValues;
2629+
}
2630+
2631+
private static List<Map<String, String>> replaceNullMaps(List<Map<String, String>> values) {
2632+
if (values == null) {
2633+
return null;
2634+
}
2635+
List<Map<String, String>> replacedValues = new ArrayList<>(values.size());
2636+
for (Map<String, String> value : values) {
2637+
replacedValues.add(value != null ? value : new HashMap<>());
2638+
}
2639+
return replacedValues;
26262640
}
26272641

26282642
private List<ByteBuffer> objectValuesListToByteBufferList(
@@ -2820,10 +2834,7 @@ public void insertRelationalTablet(Tablet tablet)
28202834
} else {
28212835
TSInsertTabletReq request = genTSInsertTabletReq(tablet, false, false);
28222836
request.setWriteToTable(true);
2823-
request.setColumnCategories(
2824-
tablet.getColumnTypes().stream()
2825-
.map(t -> (byte) t.ordinal())
2826-
.collect(Collectors.toList()));
2837+
request.setColumnCategories(toEnumOrdinalsAsBytes(tablet.getColumnTypes()));
28272838
try {
28282839
getDefaultSessionConnection().insertTablet(request);
28292840
} catch (RedirectException ignored) {
@@ -2889,8 +2900,7 @@ private void insertRelationalTabletOnce(Map<SessionConnection, Tablet> relationa
28892900
Tablet tablet = entry.getValue();
28902901
TSInsertTabletReq request = genTSInsertTabletReq(tablet, false, false);
28912902
request.setWriteToTable(true);
2892-
request.setColumnCategories(
2893-
tablet.getColumnTypes().stream().map(t -> (byte) t.ordinal()).collect(Collectors.toList()));
2903+
request.setColumnCategories(toEnumOrdinalsAsBytes(tablet.getColumnTypes()));
28942904
try {
28952905
connection.insertTablet(request);
28962906
} catch (RedirectException e) {
@@ -2932,9 +2942,7 @@ private void insertRelationalTabletByGroup(Map<SessionConnection, Tablet> relati
29322942
TSInsertTabletReq request = genTSInsertTabletReq(subTablet, false, false);
29332943
request.setWriteToTable(true);
29342944
request.setColumnCategories(
2935-
subTablet.getColumnTypes().stream()
2936-
.map(t -> (byte) t.ordinal())
2937-
.collect(Collectors.toList()));
2945+
toEnumOrdinalsAsBytes(subTablet.getColumnTypes()));
29382946
InsertConsumer<TSInsertTabletReq> insertConsumer =
29392947
SessionConnection::insertTablet;
29402948
try {
@@ -3904,10 +3912,9 @@ public void addAlignedMeasurementsInTemplate(
39043912
TSAppendSchemaTemplateReq req = new TSAppendSchemaTemplateReq();
39053913
req.setName(templateName);
39063914
req.setMeasurements(measurementsPath);
3907-
req.setDataTypes(dataTypes.stream().map(TSDataType::ordinal).collect(Collectors.toList()));
3908-
req.setEncodings(encodings.stream().map(TSEncoding::ordinal).collect(Collectors.toList()));
3909-
req.setCompressors(
3910-
compressors.stream().map(i -> (int) i.serialize()).collect(Collectors.toList()));
3915+
req.setDataTypes(toDataTypeOrdinals(dataTypes));
3916+
req.setEncodings(toEncodingOrdinals(encodings));
3917+
req.setCompressors(toCompressionOrdinals(compressors));
39113918
req.setIsAligned(true);
39123919
getDefaultSessionConnection().appendSchemaTemplate(req);
39133920
}
@@ -3950,10 +3957,9 @@ public void addUnalignedMeasurementsInTemplate(
39503957
TSAppendSchemaTemplateReq req = new TSAppendSchemaTemplateReq();
39513958
req.setName(templateName);
39523959
req.setMeasurements(measurementsPath);
3953-
req.setDataTypes(dataTypes.stream().map(TSDataType::ordinal).collect(Collectors.toList()));
3954-
req.setEncodings(encodings.stream().map(TSEncoding::ordinal).collect(Collectors.toList()));
3955-
req.setCompressors(
3956-
compressors.stream().map(i -> (int) i.serialize()).collect(Collectors.toList()));
3960+
req.setDataTypes(toDataTypeOrdinals(dataTypes));
3961+
req.setEncodings(toEncodingOrdinals(encodings));
3962+
req.setCompressors(toCompressionOrdinals(compressors));
39573963
req.setIsAligned(false);
39583964
getDefaultSessionConnection().appendSchemaTemplate(req);
39593965
}

0 commit comments

Comments
 (0)