This is an automated email from the ASF dual-hosted git repository.
Caideyipi pushed a commit to branch performance
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/performance by this push:
new 508c7e512cd Opt
508c7e512cd is described below
commit 508c7e512cdf7909fc39c581e2582808409b64f2
Author: Caideyipi <[email protected]>
AuthorDate: Thu May 14 09:51:57 2026 +0800
Opt
---
.../org/apache/iotdb/rpc/IoTDBJDBCDataSet.java | 47 ++++--
.../iotdb/rpc/stmt/PreparedParameterSerde.java | 13 +-
.../java/org/apache/iotdb/session/Session.java | 186 +++++++++++----------
.../fetcher/cache/TableDeviceSchemaCache.java | 6 +-
.../apache/iotdb/db/schemaengine/SchemaEngine.java | 8 +-
.../iotdb/db/storageengine/StorageEngine.java | 4 +-
.../filescan/impl/ClosedFileScanHandleImpl.java | 26 ++-
.../filescan/impl/UnclosedFileScanHandleImpl.java | 80 ++++++---
.../dataregion/tsfile/TsFileManager.java | 21 +--
.../tsfile/timeindex/ArrayDeviceTimeIndex.java | 2 +-
.../apache/iotdb/db/utils/ModificationUtils.java | 57 ++++---
.../apache/iotdb/db/utils/QueryDataSetUtils.java | 82 +++------
.../org/apache/iotdb/commons/path/PartialPath.java | 28 +++-
13 files changed, 321 insertions(+), 239 deletions(-)
diff --git
a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBJDBCDataSet.java
b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBJDBCDataSet.java
index 43064ecdaa9..0b07e1556aa 100644
---
a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBJDBCDataSet.java
+++
b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBJDBCDataSet.java
@@ -127,20 +127,15 @@ public class IoTDBJDBCDataSet {
// deduplicate and map
if (columnNameIndex != null) {
- int deduplicatedColumnSize = (int)
columnNameIndex.values().stream().distinct().count();
- this.columnTypeDeduplicatedList = new
ArrayList<>(deduplicatedColumnSize);
- for (int i = 0; i < deduplicatedColumnSize; i++) {
- columnTypeDeduplicatedList.add(null);
- }
+ this.columnTypeDeduplicatedList =
+
initDeduplicatedColumnTypes(getDeduplicatedColumnSize(columnNameIndex));
for (int i = 0; i < columnNameList.size(); i++) {
String name = columnNameList.get(i);
this.columnNameList.add(name);
this.columnTypeList.add(columnTypeList.get(i));
if (!columnOrdinalMap.containsKey(name)) {
int index = columnNameIndex.get(name);
- if (!columnOrdinalMap.containsValue(index + START_INDEX)) {
- columnTypeDeduplicatedList.set(index,
TSDataType.valueOf(columnTypeList.get(i)));
- }
+ setColumnTypeIfAbsent(columnTypeDeduplicatedList, index,
columnTypeList.get(i));
columnOrdinalMap.put(name, index + START_INDEX);
}
}
@@ -242,11 +237,8 @@ public class IoTDBJDBCDataSet {
// deduplicate and map
if (columnNameIndex != null) {
- int deduplicatedColumnSize = (int)
columnNameIndex.values().stream().distinct().count();
- this.columnTypeDeduplicatedList = new
ArrayList<>(deduplicatedColumnSize);
- for (int i = 0; i < deduplicatedColumnSize; i++) {
- columnTypeDeduplicatedList.add(null);
- }
+ this.columnTypeDeduplicatedList =
+
initDeduplicatedColumnTypes(getDeduplicatedColumnSize(columnNameIndex));
for (int i = 0; i < columnNameList.size(); i++) {
String name = "";
if (sgList != null
@@ -262,9 +254,7 @@ public class IoTDBJDBCDataSet {
// "Time".equals(name) -> to allow the Time column appear in value
columns
if (!columnOrdinalMap.containsKey(name) || "Time".equals(name)) {
int index = columnNameIndex.get(name);
- if (!columnOrdinalMap.containsValue(index + START_INDEX)) {
- columnTypeDeduplicatedList.set(index,
TSDataType.valueOf(columnTypeList.get(i)));
- }
+ setColumnTypeIfAbsent(columnTypeDeduplicatedList, index,
columnTypeList.get(i));
columnOrdinalMap.put(name, index + START_INDEX);
}
}
@@ -320,6 +310,31 @@ public class IoTDBJDBCDataSet {
this.emptyResultSet = (queryDataSet == null ||
!queryDataSet.time.hasRemaining());
}
+ private static int getDeduplicatedColumnSize(Map<String, Integer>
columnNameIndex) {
+ int deduplicatedColumnSize = 0;
+ for (Integer index : columnNameIndex.values()) {
+ if (index != null && index + 1 > deduplicatedColumnSize) {
+ deduplicatedColumnSize = index + 1;
+ }
+ }
+ return deduplicatedColumnSize;
+ }
+
+ private static List<TSDataType> initDeduplicatedColumnTypes(int
deduplicatedColumnSize) {
+ List<TSDataType> columnTypes = new ArrayList<>(deduplicatedColumnSize);
+ for (int i = 0; i < deduplicatedColumnSize; i++) {
+ columnTypes.add(null);
+ }
+ return columnTypes;
+ }
+
+ private static void setColumnTypeIfAbsent(
+ List<TSDataType> columnTypeDeduplicatedList, int index, String
columnType) {
+ if (columnTypeDeduplicatedList.get(index) == null) {
+ columnTypeDeduplicatedList.set(index, TSDataType.valueOf(columnType));
+ }
+ }
+
public void close() throws StatementExecutionException, TException {
if (isClosed) {
return;
diff --git
a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/stmt/PreparedParameterSerde.java
b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/stmt/PreparedParameterSerde.java
index 51a23a6af4c..3dbf156ef78 100644
---
a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/stmt/PreparedParameterSerde.java
+++
b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/stmt/PreparedParameterSerde.java
@@ -34,6 +34,8 @@ import java.util.List;
/** Serializer for PreparedStatement parameters. */
public class PreparedParameterSerde {
+ private static final char[] HEX_DIGITS = "0123456789ABCDEF".toCharArray();
+
public static class DeserializedParam {
public final TSDataType type;
public final Object value;
@@ -166,10 +168,13 @@ public class PreparedParameterSerde {
/** Convert byte array to hexadecimal string representation. */
public static String bytesToHex(byte[] bytes) {
- StringBuilder sb = new StringBuilder(bytes.length * 2);
- for (byte b : bytes) {
- sb.append(String.format("%02X", b));
+ char[] chars = new char[bytes.length * 2];
+ for (int i = 0; i < bytes.length; i++) {
+ int value = bytes[i] & 0xFF;
+ int index = i * 2;
+ chars[index] = HEX_DIGITS[value >>> 4];
+ chars[index + 1] = HEX_DIGITS[value & 0x0F];
}
- return sb.toString();
+ return new String(chars);
}
}
diff --git
a/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java
b/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java
index c38bff5e9d4..457465959a8 100644
--- a/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java
+++ b/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java
@@ -852,31 +852,12 @@ public class Session implements ISession {
TSCreateAlignedTimeseriesReq request = new TSCreateAlignedTimeseriesReq();
request.setPrefixPath(prefixPath);
request.setMeasurements(measurements);
-
request.setDataTypes(dataTypes.stream().map(TSDataType::ordinal).collect(Collectors.toList()));
-
request.setEncodings(encodings.stream().map(TSEncoding::ordinal).collect(Collectors.toList()));
- request.setCompressors(
- compressors.stream().map(i -> (int)
i.serialize()).collect(Collectors.toList()));
- if (measurementAliasList != null) {
- measurementAliasList =
- measurementAliasList.stream()
- .map(value -> value != null ? value : "")
- .collect(Collectors.toList());
- }
- request.setMeasurementAlias(measurementAliasList);
- if (tagsList != null) {
- tagsList =
- tagsList.stream()
- .map(value -> value != null ? value : new HashMap<String,
String>())
- .collect(Collectors.toList());
- }
- request.setTagsList(tagsList);
- if (attributesList != null) {
- attributesList =
- attributesList.stream()
- .map(value -> value != null ? value : new HashMap<String,
String>())
- .collect(Collectors.toList());
- }
- request.setAttributesList(attributesList);
+ request.setDataTypes(toDataTypeOrdinals(dataTypes));
+ request.setEncodings(toEncodingOrdinals(encodings));
+ request.setCompressors(toCompressionOrdinals(compressors));
+ request.setMeasurementAlias(replaceNullStrings(measurementAliasList));
+ request.setTagsList(replaceNullMaps(tagsList));
+ request.setAttributesList(replaceNullMaps(attributesList));
return request;
}
@@ -916,47 +897,14 @@ public class Session implements ISession {
TSCreateMultiTimeseriesReq request = new TSCreateMultiTimeseriesReq();
request.setPaths(paths);
-
- List<Integer> dataTypeOrdinals = new ArrayList<>(dataTypes.size());
- for (TSDataType dataType : dataTypes) {
- dataTypeOrdinals.add(dataType.ordinal());
- }
- request.setDataTypes(dataTypeOrdinals);
-
- List<Integer> encodingOrdinals = new ArrayList<>(dataTypes.size());
- for (TSEncoding encoding : encodings) {
- encodingOrdinals.add(encoding.ordinal());
- }
- request.setEncodings(encodingOrdinals);
-
- List<Integer> compressionOrdinals = new ArrayList<>(paths.size());
- for (CompressionType compression : compressors) {
- compressionOrdinals.add((int) compression.serialize());
- }
- request.setCompressors(compressionOrdinals);
+ request.setDataTypes(toDataTypeOrdinals(dataTypes));
+ request.setEncodings(toEncodingOrdinals(encodings));
+ request.setCompressors(toCompressionOrdinals(compressors));
request.setPropsList(propsList);
- if (tagsList != null) {
- tagsList =
- tagsList.stream()
- .map(value -> value != null ? value : new HashMap<String,
String>())
- .collect(Collectors.toList());
- }
- request.setTagsList(tagsList);
- if (attributesList != null) {
- attributesList =
- attributesList.stream()
- .map(value -> value != null ? value : new HashMap<String,
String>())
- .collect(Collectors.toList());
- }
- request.setAttributesList(attributesList);
- if (measurementAliasList != null) {
- measurementAliasList =
- measurementAliasList.stream()
- .map(value -> value != null ? value : "")
- .collect(Collectors.toList());
- }
- request.setMeasurementAliasList(measurementAliasList);
+ request.setTagsList(replaceNullMaps(tagsList));
+ request.setAttributesList(replaceNullMaps(attributesList));
+ request.setMeasurementAliasList(replaceNullStrings(measurementAliasList));
return request;
}
@@ -1819,19 +1767,23 @@ public class Session implements ISession {
List<String> measurementsList,
List<TSDataType> types,
List<Object> valuesList) {
- Map<String, Object> nullMap = new HashMap<>();
+ Map<String, Object> nullMap = logger.isInfoEnabled() ? new HashMap<>() :
null;
for (int i = valuesList.size() - 1; i >= 0; i--) {
if (valuesList.get(i) == null) {
- nullMap.put(measurementsList.get(i), valuesList.get(i));
+ if (nullMap != null) {
+ nullMap.put(measurementsList.get(i), valuesList.get(i));
+ }
valuesList.remove(i);
measurementsList.remove(i);
types.remove(i);
}
}
if (valuesList.isEmpty()) {
- logger.info("All values of the {} are null,null values are {}",
deviceId, nullMap);
+ if (nullMap != null) {
+ logger.info("All values of the {} are null,null values are {}",
deviceId, nullMap);
+ }
return true;
- } else {
+ } else if (nullMap != null) {
logger.info("Some values of {} are null,null values are {}", deviceId,
nullMap);
}
return false;
@@ -1867,18 +1819,22 @@ public class Session implements ISession {
*/
private boolean filterNullValueAndMeasurementWithStringType(
List<String> valuesList, String deviceId, List<String> measurementsList)
{
- Map<String, Object> nullMap = new HashMap<>();
+ Map<String, Object> nullMap = logger.isInfoEnabled() ? new HashMap<>() :
null;
for (int i = valuesList.size() - 1; i >= 0; i--) {
if (valuesList.get(i) == null) {
- nullMap.put(measurementsList.get(i), valuesList.get(i));
+ if (nullMap != null) {
+ nullMap.put(measurementsList.get(i), valuesList.get(i));
+ }
valuesList.remove(i);
measurementsList.remove(i);
}
}
if (valuesList.isEmpty()) {
- logger.info("All values of the {} are null,null values are {}",
deviceId, nullMap);
+ if (nullMap != null) {
+ logger.info("All values of the {} are null,null values are {}",
deviceId, nullMap);
+ }
return true;
- } else {
+ } else if (nullMap != null) {
logger.info("Some values of {} are null,null values are {}", deviceId,
nullMap);
}
return false;
@@ -2622,7 +2578,65 @@ public class Session implements ISession {
* @return ordered list
*/
private static <T> List<T> sortList(List<T> source, Integer[] index) {
- return Arrays.stream(index).map(source::get).collect(Collectors.toList());
+ List<T> sortedList = new ArrayList<>(index.length);
+ for (int position : index) {
+ sortedList.add(source.get(position));
+ }
+ return sortedList;
+ }
+
+ private static List<Integer> toDataTypeOrdinals(List<TSDataType> dataTypes) {
+ List<Integer> ordinals = new ArrayList<>(dataTypes.size());
+ for (TSDataType dataType : dataTypes) {
+ ordinals.add(dataType.ordinal());
+ }
+ return ordinals;
+ }
+
+ private static List<Integer> toEncodingOrdinals(List<TSEncoding> encodings) {
+ List<Integer> ordinals = new ArrayList<>(encodings.size());
+ for (TSEncoding encoding : encodings) {
+ ordinals.add(encoding.ordinal());
+ }
+ return ordinals;
+ }
+
+ private static List<Integer> toCompressionOrdinals(List<CompressionType>
compressors) {
+ List<Integer> ordinals = new ArrayList<>(compressors.size());
+ for (CompressionType compression : compressors) {
+ ordinals.add((int) compression.serialize());
+ }
+ return ordinals;
+ }
+
+ private static List<Byte> toEnumOrdinalsAsBytes(List<? extends Enum<?>>
enumValues) {
+ List<Byte> ordinals = new ArrayList<>(enumValues.size());
+ for (Enum<?> enumValue : enumValues) {
+ ordinals.add((byte) enumValue.ordinal());
+ }
+ return ordinals;
+ }
+
+ private static List<String> replaceNullStrings(List<String> values) {
+ if (values == null) {
+ return null;
+ }
+ List<String> replacedValues = new ArrayList<>(values.size());
+ for (String value : values) {
+ replacedValues.add(value != null ? value : "");
+ }
+ return replacedValues;
+ }
+
+ private static List<Map<String, String>> replaceNullMaps(List<Map<String,
String>> values) {
+ if (values == null) {
+ return null;
+ }
+ List<Map<String, String>> replacedValues = new ArrayList<>(values.size());
+ for (Map<String, String> value : values) {
+ replacedValues.add(value != null ? value : new HashMap<>());
+ }
+ return replacedValues;
}
private List<ByteBuffer> objectValuesListToByteBufferList(
@@ -2820,10 +2834,7 @@ public class Session implements ISession {
} else {
TSInsertTabletReq request = genTSInsertTabletReq(tablet, false, false);
request.setWriteToTable(true);
- request.setColumnCategories(
- tablet.getColumnTypes().stream()
- .map(t -> (byte) t.ordinal())
- .collect(Collectors.toList()));
+
request.setColumnCategories(toEnumOrdinalsAsBytes(tablet.getColumnTypes()));
try {
getDefaultSessionConnection().insertTablet(request);
} catch (RedirectException ignored) {
@@ -2889,8 +2900,7 @@ public class Session implements ISession {
Tablet tablet = entry.getValue();
TSInsertTabletReq request = genTSInsertTabletReq(tablet, false, false);
request.setWriteToTable(true);
- request.setColumnCategories(
- tablet.getColumnTypes().stream().map(t -> (byte)
t.ordinal()).collect(Collectors.toList()));
+
request.setColumnCategories(toEnumOrdinalsAsBytes(tablet.getColumnTypes()));
try {
connection.insertTablet(request);
} catch (RedirectException e) {
@@ -2932,9 +2942,7 @@ public class Session implements ISession {
TSInsertTabletReq request =
genTSInsertTabletReq(subTablet, false, false);
request.setWriteToTable(true);
request.setColumnCategories(
- subTablet.getColumnTypes().stream()
- .map(t -> (byte) t.ordinal())
- .collect(Collectors.toList()));
+ toEnumOrdinalsAsBytes(subTablet.getColumnTypes()));
InsertConsumer<TSInsertTabletReq> insertConsumer =
SessionConnection::insertTablet;
try {
@@ -3904,10 +3912,9 @@ public class Session implements ISession {
TSAppendSchemaTemplateReq req = new TSAppendSchemaTemplateReq();
req.setName(templateName);
req.setMeasurements(measurementsPath);
-
req.setDataTypes(dataTypes.stream().map(TSDataType::ordinal).collect(Collectors.toList()));
-
req.setEncodings(encodings.stream().map(TSEncoding::ordinal).collect(Collectors.toList()));
- req.setCompressors(
- compressors.stream().map(i -> (int)
i.serialize()).collect(Collectors.toList()));
+ req.setDataTypes(toDataTypeOrdinals(dataTypes));
+ req.setEncodings(toEncodingOrdinals(encodings));
+ req.setCompressors(toCompressionOrdinals(compressors));
req.setIsAligned(true);
getDefaultSessionConnection().appendSchemaTemplate(req);
}
@@ -3950,10 +3957,9 @@ public class Session implements ISession {
TSAppendSchemaTemplateReq req = new TSAppendSchemaTemplateReq();
req.setName(templateName);
req.setMeasurements(measurementsPath);
-
req.setDataTypes(dataTypes.stream().map(TSDataType::ordinal).collect(Collectors.toList()));
-
req.setEncodings(encodings.stream().map(TSEncoding::ordinal).collect(Collectors.toList()));
- req.setCompressors(
- compressors.stream().map(i -> (int)
i.serialize()).collect(Collectors.toList()));
+ req.setDataTypes(toDataTypeOrdinals(dataTypes));
+ req.setEncodings(toEncodingOrdinals(encodings));
+ req.setCompressors(toCompressionOrdinals(compressors));
req.setIsAligned(false);
getDefaultSessionConnection().appendSchemaTemplate(req);
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java
index eed26dadc29..c667e5f5170 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java
@@ -482,7 +482,7 @@ public class TableDeviceSchemaCache {
},
cachedDeviceID -> {
try {
- return new PartialPath(cachedDeviceID).matchFullPath(devicePath);
+ return devicePath.matchFullPath(cachedDeviceID);
} catch (final IllegalPathException e) {
logger.warn(
"Illegal deviceID {} found in cache when invalidating by
path {}, invalidate it anyway",
@@ -521,8 +521,8 @@ public class TableDeviceSchemaCache {
cachedDeviceID -> {
try {
return isMultiLevelWildcardMeasurement
- ? devicePath.matchPrefixPath(new PartialPath(cachedDeviceID))
- : devicePath.matchFullPath(new PartialPath(cachedDeviceID));
+ ? devicePath.matchPrefixPath(cachedDeviceID)
+ : devicePath.matchFullPath(cachedDeviceID);
} catch (final IllegalPathException e) {
logger.warn(
"Illegal deviceID {} found in cache when invalidating by
path {}, invalidate it anyway",
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/SchemaEngine.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/SchemaEngine.java
index ede0ba13a85..6ffec5d89c3 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/SchemaEngine.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/SchemaEngine.java
@@ -368,11 +368,13 @@ public class SchemaEngine {
public Map<Integer, Long> countDeviceNumBySchemaRegion(final List<Integer>
schemaIds) {
final Map<Integer, Long> deviceNum = new HashMap<>();
+ final java.util.Collection<Integer> targetSchemaIds =
+ schemaIds.size() > 1 ? new java.util.HashSet<>(schemaIds) : schemaIds;
schemaRegionMap.entrySet().stream()
.filter(
entry ->
- schemaIds.contains(entry.getKey().getId())
+ targetSchemaIds.contains(entry.getKey().getId())
&&
SchemaRegionConsensusImpl.getInstance().isLeader(entry.getKey()))
.forEach(
entry ->
@@ -384,10 +386,12 @@ public class SchemaEngine {
public Map<Integer, Long> countTimeSeriesNumBySchemaRegion(final
List<Integer> schemaIds) {
final Map<Integer, Long> timeSeriesNum = new HashMap<>();
+ final java.util.Collection<Integer> targetSchemaIds =
+ schemaIds.size() > 1 ? new java.util.HashSet<>(schemaIds) : schemaIds;
schemaRegionMap.entrySet().stream()
.filter(
entry ->
- schemaIds.contains(entry.getKey().getId())
+ targetSchemaIds.contains(entry.getKey().getId())
&&
SchemaRegionConsensusImpl.getInstance().isLeader(entry.getKey())
&& !entry
.getValue()
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java
index ff294b36ed3..f752e68b2c8 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/StorageEngine.java
@@ -1086,9 +1086,11 @@ public class StorageEngine implements IService {
public void getDiskSizeByDataRegion(
Map<Integer, Long> dataRegionDisk, List<Integer> dataRegionIds) {
+ final java.util.Collection<Integer> targetDataRegionIds =
+ dataRegionIds.size() > 1 ? new java.util.HashSet<>(dataRegionIds) :
dataRegionIds;
dataRegionMap.forEach(
(dataRegionId, dataRegion) -> {
- if (dataRegionIds.contains(dataRegionId.getId())) {
+ if (targetDataRegionIds.contains(dataRegionId.getId())) {
dataRegionDisk.put(dataRegionId.getId(),
dataRegion.countRegionDiskSize());
}
});
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/filescan/impl/ClosedFileScanHandleImpl.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/filescan/impl/ClosedFileScanHandleImpl.java
index 6ebb6f7073b..9c1ffd0b57f 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/filescan/impl/ClosedFileScanHandleImpl.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/filescan/impl/ClosedFileScanHandleImpl.java
@@ -63,12 +63,14 @@ public class ClosedFileScanHandleImpl implements
IFileScanHandle {
private final TsFileResource tsFileResource;
private final QueryContext queryContext;
private PatternTreeMap<ModEntry, PatternTreeMapFactory.ModsSerializer>
curFileModEntries = null;
+ private final Map<IDeviceID, List<TimeRange>> deviceToDeletionRanges;
// Used to cache the modifications of each timeseries
private final Map<IDeviceID, Map<String, List<TimeRange>>>
deviceToModifications;
public ClosedFileScanHandleImpl(TsFileResource tsFileResource, QueryContext
context) {
this.tsFileResource = tsFileResource;
this.queryContext = context;
+ this.deviceToDeletionRanges = new HashMap<>();
this.deviceToModifications = new HashMap<>();
}
@@ -87,10 +89,22 @@ public class ClosedFileScanHandleImpl implements
IFileScanHandle {
curFileModEntries != null
? curFileModEntries
: queryContext.loadAllModificationsFromDisk(tsFileResource);
- List<ModEntry> modifications =
queryContext.getPathModifications(curFileModEntries, deviceID);
- List<TimeRange> timeRangeList =
-
modifications.stream().map(ModEntry::getTimeRange).collect(Collectors.toList());
- return ModificationUtils.isPointDeletedWithoutOrderedRange(timestamp,
timeRangeList);
+ List<TimeRange> timeRangeList = deviceToDeletionRanges.get(deviceID);
+ if (timeRangeList == null) {
+ timeRangeList =
+
getMergedTimeRanges(queryContext.getPathModifications(curFileModEntries,
deviceID));
+ deviceToDeletionRanges.put(deviceID, timeRangeList);
+ }
+ return ModificationUtils.isPointDeleted(timestamp, timeRangeList);
+ }
+
+ private static List<TimeRange> getMergedTimeRanges(List<ModEntry>
modifications) {
+ List<TimeRange> timeRangeList = new ArrayList<>(modifications.size());
+ for (ModEntry modification : modifications) {
+ timeRangeList.add(modification.getTimeRange());
+ }
+ TimeRange.sortAndMerge(timeRangeList);
+ return timeRangeList;
}
@Override
@@ -107,9 +121,7 @@ public class ClosedFileScanHandleImpl implements
IFileScanHandle {
List<ModEntry> modifications =
queryContext.getPathModifications(curFileModEntries, deviceID,
timeSeriesName);
- List<TimeRange> timeRangeList =
-
modifications.stream().map(ModEntry::getTimeRange).collect(Collectors.toList());
- TimeRange.sortAndMerge(timeRangeList);
+ List<TimeRange> timeRangeList = getMergedTimeRanges(modifications);
deviceToModifications
.computeIfAbsent(deviceID, k -> new HashMap<>())
.put(timeSeriesName, timeRangeList);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/filescan/impl/UnclosedFileScanHandleImpl.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/filescan/impl/UnclosedFileScanHandleImpl.java
index ba03f69a11a..eb2a2b9dc2e 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/filescan/impl/UnclosedFileScanHandleImpl.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/filescan/impl/UnclosedFileScanHandleImpl.java
@@ -29,6 +29,7 @@ import
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
import
org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ArrayDeviceTimeIndex;
import
org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ITimeIndex;
import
org.apache.iotdb.db.storageengine.dataregion.utils.TsFileDeviceStartEndTimeIterator;
+import org.apache.iotdb.db.utils.ModificationUtils;
import org.apache.tsfile.file.metadata.AlignedChunkMetadata;
import org.apache.tsfile.file.metadata.IChunkMetadata;
@@ -39,6 +40,8 @@ import org.apache.tsfile.read.common.TimeRange;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -48,6 +51,8 @@ public class UnclosedFileScanHandleImpl implements
IFileScanHandle {
private final TsFileResource tsFileResource;
private final Map<IDeviceID, Map<String, List<IChunkMetadata>>>
deviceToChunkMetadataMap;
private final Map<IDeviceID, Map<String, List<IChunkHandle>>>
deviceToMemChunkHandleMap;
+ private final Map<IDeviceID, List<TimeRange>> deviceToDeletionRanges;
+ private final Map<IDeviceID, Map<String, List<TimeRange>>>
deviceToTimeSeriesDeletionRanges;
public UnclosedFileScanHandleImpl(
Map<IDeviceID, Map<String, List<IChunkMetadata>>>
deviceToChunkMetadataMap,
@@ -56,6 +61,8 @@ public class UnclosedFileScanHandleImpl implements
IFileScanHandle {
this.deviceToChunkMetadataMap = deviceToChunkMetadataMap;
this.deviceToMemChunkHandleMap = deviceToMemChunkHandleMap;
this.tsFileResource = tsFileResource;
+ this.deviceToDeletionRanges = new HashMap<>();
+ this.deviceToTimeSeriesDeletionRanges = new HashMap<>();
}
@Override
@@ -68,19 +75,12 @@ public class UnclosedFileScanHandleImpl implements
IFileScanHandle {
@Override
public boolean isDeviceTimeDeleted(IDeviceID deviceID, long timeArray) {
- Map<String, List<IChunkMetadata>> chunkMetadataMap =
deviceToChunkMetadataMap.get(deviceID);
- for (List<IChunkMetadata> chunkMetadataList : chunkMetadataMap.values()) {
- for (IChunkMetadata chunkMetadata : chunkMetadataList) {
- if (chunkMetadata.getDeleteIntervalList() != null) {
- for (TimeRange deleteInterval :
chunkMetadata.getDeleteIntervalList()) {
- if (deleteInterval.contains(timeArray)) {
- return true;
- }
- }
- }
- }
+ List<TimeRange> deletionRanges = deviceToDeletionRanges.get(deviceID);
+ if (deletionRanges == null) {
+ deletionRanges = collectDeviceDeletionRanges(deviceID);
+ deviceToDeletionRanges.put(deviceID, deletionRanges);
}
- return false;
+ return ModificationUtils.isPointDeleted(timeArray, deletionRanges);
}
@Override
@@ -121,19 +121,14 @@ public class UnclosedFileScanHandleImpl implements
IFileScanHandle {
@Override
public boolean isTimeSeriesTimeDeleted(
IDeviceID deviceID, String timeSeriesName, long timestamp) {
- List<IChunkMetadata> chunkMetadataList =
- deviceToChunkMetadataMap.get(deviceID).get(timeSeriesName);
- // check if timestamp is deleted by deleteInterval
- for (IChunkMetadata chunkMetadata : chunkMetadataList) {
- if (chunkMetadata.getDeleteIntervalList() != null) {
- for (TimeRange deleteInterval : chunkMetadata.getDeleteIntervalList())
{
- if (deleteInterval.contains(timestamp)) {
- return true;
- }
- }
- }
+ Map<String, List<TimeRange>> timeSeriesDeletionRanges =
+ deviceToTimeSeriesDeletionRanges.computeIfAbsent(deviceID, key -> new
HashMap<>());
+ List<TimeRange> deletionRanges =
timeSeriesDeletionRanges.get(timeSeriesName);
+ if (deletionRanges == null) {
+ deletionRanges = collectTimeSeriesDeletionRanges(deviceID,
timeSeriesName);
+ timeSeriesDeletionRanges.put(timeSeriesName, deletionRanges);
}
- return false;
+ return ModificationUtils.isPointDeleted(timestamp, deletionRanges);
}
@Override
@@ -167,4 +162,41 @@ public class UnclosedFileScanHandleImpl implements
IFileScanHandle {
public TsFileResource getTsResource() {
return tsFileResource;
}
+
+ private List<TimeRange> collectDeviceDeletionRanges(IDeviceID deviceID) {
+ Map<String, List<IChunkMetadata>> chunkMetadataMap =
deviceToChunkMetadataMap.get(deviceID);
+ if (chunkMetadataMap == null || chunkMetadataMap.isEmpty()) {
+ return Collections.emptyList();
+ }
+ List<TimeRange> deletionRanges = new ArrayList<>();
+ for (List<IChunkMetadata> chunkMetadataList : chunkMetadataMap.values()) {
+ appendDeletionRanges(deletionRanges, chunkMetadataList);
+ }
+ TimeRange.sortAndMerge(deletionRanges);
+ return deletionRanges;
+ }
+
+ private List<TimeRange> collectTimeSeriesDeletionRanges(IDeviceID deviceID,
String timeSeriesName) {
+ Map<String, List<IChunkMetadata>> chunkMetadataMap =
deviceToChunkMetadataMap.get(deviceID);
+ if (chunkMetadataMap == null) {
+ return Collections.emptyList();
+ }
+ List<IChunkMetadata> chunkMetadataList =
chunkMetadataMap.get(timeSeriesName);
+ if (chunkMetadataList == null || chunkMetadataList.isEmpty()) {
+ return Collections.emptyList();
+ }
+ List<TimeRange> deletionRanges = new ArrayList<>();
+ appendDeletionRanges(deletionRanges, chunkMetadataList);
+ TimeRange.sortAndMerge(deletionRanges);
+ return deletionRanges;
+ }
+
+ private void appendDeletionRanges(
+ List<TimeRange> deletionRanges, List<IChunkMetadata> chunkMetadataList) {
+ for (IChunkMetadata chunkMetadata : chunkMetadataList) {
+ if (chunkMetadata.getDeleteIntervalList() != null) {
+ deletionRanges.addAll(chunkMetadata.getDeleteIntervalList());
+ }
+ }
+ }
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileManager.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileManager.java
index 86890370c31..b2cb7886010 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileManager.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileManager.java
@@ -206,14 +206,7 @@ public class TsFileManager {
public void remove(TsFileResource tsFileResource, boolean sequence) {
writeLock("remove");
try {
- Map<Long, TsFileResourceList> selectedMap = sequence ? sequenceFiles :
unsequenceFiles;
- for (Map.Entry<Long, TsFileResourceList> entry : selectedMap.entrySet())
{
- if (entry.getValue().contains(tsFileResource)) {
- entry.getValue().remove(tsFileResource);
-
TsFileResourceManager.getInstance().removeTsFileResource(tsFileResource);
- break;
- }
- }
+ removeFromPartitionFileList(tsFileResource, sequence);
} finally {
writeUnlock();
}
@@ -223,10 +216,18 @@ public class TsFileManager {
writeLock("removeAll");
try {
for (TsFileResource resource : tsFileResourceList) {
- remove(resource, sequence);
+ removeFromPartitionFileList(resource, sequence);
}
} finally {
- writeLock("removeAll");
+ writeUnlock();
+ }
+ }
+
+ private void removeFromPartitionFileList(TsFileResource tsFileResource,
boolean sequence) {
+ Map<Long, TsFileResourceList> selectedMap = sequence ? sequenceFiles :
unsequenceFiles;
+ TsFileResourceList tsFileResources =
selectedMap.get(tsFileResource.getTimePartition());
+ if (tsFileResources != null && tsFileResources.remove(tsFileResource)) {
+ TsFileResourceManager.getInstance().removeTsFileResource(tsFileResource);
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ArrayDeviceTimeIndex.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ArrayDeviceTimeIndex.java
index caca8e9fdba..f03d57c8344 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ArrayDeviceTimeIndex.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ArrayDeviceTimeIndex.java
@@ -467,7 +467,7 @@ public class ArrayDeviceTimeIndex implements ITimeIndex {
endTime = endTimes[entry.getValue()];
}
} else {
- if (devicePattern.matchFullPath(new PartialPath(entry.getKey()))) {
+ if (devicePattern.matchFullPath(entry.getKey())) {
deviceMatchInfo.add(entry.getKey());
hasMatchedDevice = true;
if (startTimes[entry.getValue()] < startTime) {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java
index 351e64650a7..142e5b9d188 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java
@@ -81,7 +81,11 @@ public class ModificationUtils {
if (range.contains(metaData.getStartTime(),
metaData.getEndTime())) {
return true;
} else {
- if (range.overlaps(new TimeRange(metaData.getStartTime(),
metaData.getEndTime()))) {
+ if (overlap(
+ metaData.getStartTime(),
+ metaData.getEndTime(),
+ range.getMin(),
+ range.getMax())) {
metaData.setModified(true);
}
}
@@ -143,9 +147,11 @@ public class ModificationUtils {
currentRemoved = true;
break;
} else {
- if (range.overlaps(
- new TimeRange(
- valueChunkMetadata.getStartTime(),
valueChunkMetadata.getEndTime()))) {
+ if (overlap(
+ valueChunkMetadata.getStartTime(),
+ valueChunkMetadata.getEndTime(),
+ range.getMin(),
+ range.getMax())) {
valueChunkMetadata.setModified(true);
modified = true;
}
@@ -193,10 +199,11 @@ public class ModificationUtils {
// all rows are deleted
return true;
} else {
- if (range.overlaps(
- new TimeRange(
- timeColumnChunkMetadata.getStartTime(),
- timeColumnChunkMetadata.getEndTime()))) {
+ if (overlap(
+ timeColumnChunkMetadata.getStartTime(),
+ timeColumnChunkMetadata.getEndTime(),
+ range.getMin(),
+ range.getMax())) {
timeColumnChunkMetadata.setModified(true);
modified = true;
}
@@ -328,16 +335,17 @@ public class ModificationUtils {
if (measurementList.isEmpty()) {
return Collections.emptyList();
}
- List<ModEntry> modifications =
- ModificationUtils.getModificationsForMemtable(memTable,
modsToMemtable);
- List<List<TimeRange>> deletionList = new ArrayList<>();
+ List<ModEntry> deviceModifications =
+ filterDeviceModifications(
+ deviceID,
+ ModificationUtils.getModificationsForMemtable(memTable,
modsToMemtable),
+ timeLowerBound);
+ List<List<TimeRange>> deletionList = new
ArrayList<>(measurementList.size());
for (String measurement : measurementList) {
List<TimeRange> columnDeletionList = new ArrayList<>();
columnDeletionList.add(new TimeRange(Long.MIN_VALUE, timeLowerBound));
- for (ModEntry modification : modifications) {
- if (modification.affects(deviceID)
- && modification.affects(measurement)
- && modification.getEndTime() > timeLowerBound) {
+ for (ModEntry modification : deviceModifications) {
+ if (modification.affects(measurement)) {
long lowerBound = Math.max(modification.getStartTime(),
timeLowerBound);
columnDeletionList.add(new TimeRange(lowerBound,
modification.getEndTime()));
}
@@ -361,10 +369,10 @@ public class ModificationUtils {
long timeLowerBound) {
List<TimeRange> deletionList = new ArrayList<>();
deletionList.add(new TimeRange(Long.MIN_VALUE, timeLowerBound));
- for (ModEntry modification : getModificationsForMemtable(memTable,
modsToMemtable)) {
- if (modification.affects(deviceID)
- && modification.affects(measurement)
- && modification.getEndTime() > timeLowerBound) {
+ for (ModEntry modification :
+ filterDeviceModifications(
+ deviceID, getModificationsForMemtable(memTable, modsToMemtable),
timeLowerBound)) {
+ if (modification.affects(measurement)) {
long lowerBound = Math.max(modification.getStartTime(),
timeLowerBound);
deletionList.add(new TimeRange(lowerBound, modification.getEndTime()));
}
@@ -385,6 +393,17 @@ public class ModificationUtils {
return modifications;
}
+ private static List<ModEntry> filterDeviceModifications(
+ IDeviceID deviceID, List<ModEntry> modifications, long timeLowerBound) {
+ List<ModEntry> deviceModifications = new ArrayList<>();
+ for (ModEntry modification : modifications) {
+ if (modification.affects(deviceID) && modification.getEndTime() >
timeLowerBound) {
+ deviceModifications.add(modification);
+ }
+ }
+ return deviceModifications;
+ }
+
public static boolean canMerge(TimeRange left, TimeRange right) {
// [1,3] can merge with [4, 5]
// [1,3] cannot merge with [5,6]
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/QueryDataSetUtils.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/QueryDataSetUtils.java
index 6220623dd3b..5bfb18c52cc 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/QueryDataSetUtils.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/QueryDataSetUtils.java
@@ -32,15 +32,14 @@ import org.apache.tsfile.utils.Binary;
import org.apache.tsfile.utils.BitMap;
import org.apache.tsfile.utils.BytesUtils;
import org.apache.tsfile.utils.Pair;
+import org.apache.tsfile.utils.PublicBAOS;
import org.apache.tsfile.write.UnSupportedDataTypeException;
-import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
-import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
@@ -65,9 +64,9 @@ public class QueryDataSetUtils {
// indicate whether it is a null
int columnNumWithTime = columnNum * 2 + 1;
DataOutputStream[] dataOutputStreams = new
DataOutputStream[columnNumWithTime];
- ByteArrayOutputStream[] byteArrayOutputStreams = new
ByteArrayOutputStream[columnNumWithTime];
+ PublicBAOS[] byteArrayOutputStreams = new PublicBAOS[columnNumWithTime];
for (int i = 0; i < columnNumWithTime; i++) {
- byteArrayOutputStreams[i] = new ByteArrayOutputStream();
+ byteArrayOutputStreams[i] = new PublicBAOS();
dataOutputStreams[i] = new DataOutputStream(byteArrayOutputStreams[i]);
}
@@ -117,9 +116,9 @@ public class QueryDataSetUtils {
int columnNum = 1;
int columnNumWithTime = columnNum * 2 + 1;
DataOutputStream[] dataOutputStreams = new
DataOutputStream[columnNumWithTime];
- ByteArrayOutputStream[] byteArrayOutputStreams = new
ByteArrayOutputStream[columnNumWithTime];
+ PublicBAOS[] byteArrayOutputStreams = new PublicBAOS[columnNumWithTime];
for (int i = 0; i < columnNumWithTime; i++) {
- byteArrayOutputStreams[i] = new ByteArrayOutputStream();
+ byteArrayOutputStreams[i] = new PublicBAOS();
dataOutputStreams[i] = new DataOutputStream(byteArrayOutputStreams[i]);
}
@@ -277,27 +276,14 @@ public class QueryDataSetUtils {
}
// calculate the time buffer size
- int timeOccupation = rowCount * 8;
- ByteBuffer timeBuffer = ByteBuffer.allocate(timeOccupation);
- timeBuffer.put(byteArrayOutputStreams[0].toByteArray());
- timeBuffer.flip();
- tsQueryDataSet.setTime(timeBuffer);
+ tsQueryDataSet.setTime(wrapBuffer(byteArrayOutputStreams[0]));
// calculate the bitmap buffer size
- int bitmapOccupation = (rowCount + 7) / 8;
-
- List<ByteBuffer> bitmapList = new LinkedList<>();
- List<ByteBuffer> valueList = new LinkedList<>();
+ List<ByteBuffer> bitmapList = new ArrayList<>(columnNum);
+ List<ByteBuffer> valueList = new ArrayList<>(columnNum);
for (int i = 1; i < byteArrayOutputStreams.length; i += 2) {
- ByteBuffer valueBuffer = ByteBuffer.allocate(valueOccupation[(i - 1) /
2]);
- valueBuffer.put(byteArrayOutputStreams[i].toByteArray());
- valueBuffer.flip();
- valueList.add(valueBuffer);
-
- ByteBuffer bitmapBuffer = ByteBuffer.allocate(bitmapOccupation);
- bitmapBuffer.put(byteArrayOutputStreams[i + 1].toByteArray());
- bitmapBuffer.flip();
- bitmapList.add(bitmapBuffer);
+ valueList.add(wrapBuffer(byteArrayOutputStreams[i]));
+ bitmapList.add(wrapBuffer(byteArrayOutputStreams[i + 1]));
}
tsQueryDataSet.setBitmapList(bitmapList);
tsQueryDataSet.setValueList(valueList);
@@ -572,40 +558,30 @@ public class QueryDataSetUtils {
}
private static void fillTimeColumn(
- int rowCount, ByteArrayOutputStream[] byteArrayOutputStreams,
TSQueryDataSet tsQueryDataSet) {
- // calculate the time buffer size
- int timeOccupation = rowCount * 8;
- ByteBuffer timeBuffer = ByteBuffer.allocate(timeOccupation);
- timeBuffer.put(byteArrayOutputStreams[0].toByteArray());
- timeBuffer.flip();
- tsQueryDataSet.setTime(timeBuffer);
+ int rowCount, PublicBAOS[] byteArrayOutputStreams, TSQueryDataSet
tsQueryDataSet) {
+ tsQueryDataSet.setTime(wrapBuffer(byteArrayOutputStreams[0]));
}
private static void fillValueColumnsAndBitMaps(
int rowCount,
- ByteArrayOutputStream[] byteArrayOutputStreams,
+ PublicBAOS[] byteArrayOutputStreams,
int[] valueOccupation,
TSQueryDataSet tsQueryDataSet) {
- // calculate the bitmap buffer size
- int bitmapOccupation = (rowCount + 7) / 8;
-
- List<ByteBuffer> bitmapList = new LinkedList<>();
- List<ByteBuffer> valueList = new LinkedList<>();
+ int columnNum = valueOccupation.length;
+ List<ByteBuffer> bitmapList = new ArrayList<>(columnNum);
+ List<ByteBuffer> valueList = new ArrayList<>(columnNum);
for (int i = 1; i < byteArrayOutputStreams.length; i += 2) {
- ByteBuffer valueBuffer = ByteBuffer.allocate(valueOccupation[(i - 1) /
2]);
- valueBuffer.put(byteArrayOutputStreams[i].toByteArray());
- valueBuffer.flip();
- valueList.add(valueBuffer);
-
- ByteBuffer bitmapBuffer = ByteBuffer.allocate(bitmapOccupation);
- bitmapBuffer.put(byteArrayOutputStreams[i + 1].toByteArray());
- bitmapBuffer.flip();
- bitmapList.add(bitmapBuffer);
+ valueList.add(wrapBuffer(byteArrayOutputStreams[i]));
+ bitmapList.add(wrapBuffer(byteArrayOutputStreams[i + 1]));
}
tsQueryDataSet.setBitmapList(bitmapList);
tsQueryDataSet.setValueList(valueList);
}
+ private static ByteBuffer wrapBuffer(PublicBAOS outputStream) {
+ return ByteBuffer.wrap(outputStream.getBuf(), 0, outputStream.size());
+ }
+
/**
* To fetch required amounts of data and combine them through List
*
@@ -668,9 +644,7 @@ public class QueryDataSetUtils {
boolean hasBitMap = BytesUtils.byteToBool(buffer.get());
if (hasBitMap) {
byte[] bytes = new byte[BitMap.getSizeOfBytes(size)];
- for (int j = 0; j < bytes.length; j++) {
- bytes[j] = buffer.get();
- }
+ buffer.get(bytes);
bitMaps[i] = new BitMap(size, bytes);
}
}
@@ -687,9 +661,7 @@ public class QueryDataSetUtils {
boolean hasBitMap = BytesUtils.byteToBool(stream.readByte());
if (hasBitMap) {
byte[] bytes = new byte[BitMap.getSizeOfBytes(size)];
- for (int j = 0; j < bytes.length; j++) {
- bytes[j] = stream.readByte();
- }
+ stream.readFully(bytes);
bitMaps[i] = new BitMap(size, bytes);
}
}
@@ -865,11 +837,7 @@ public class QueryDataSetUtils {
for (int index = 0; index < size; index++) {
int binarySize = stream.readInt();
byte[] binaryValue = new byte[binarySize];
- int actualReadSize = stream.read(binaryValue);
- if (actualReadSize != binarySize) {
- throw new IllegalStateException(
- "Expect to read " + binarySize + " bytes, actually read " +
actualReadSize + "bytes.");
- }
+ stream.readFully(binaryValue);
binaryValues[index] = new Binary(binaryValue);
}
values[columnIndex] = binaryValues;
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PartialPath.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PartialPath.java
index b0f2c3fe051..902a14333d0 100644
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PartialPath.java
+++
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PartialPath.java
@@ -424,16 +424,19 @@ public class PartialPath extends Path implements
Comparable<Path>, Cloneable {
return matchPath(rPath.getNodes(), 0, 0, false, false);
}
+ public boolean matchFullPath(IDeviceID deviceID) throws IllegalPathException
{
+ return matchPath(getDeviceNodes(deviceID), 0, 0, false, false);
+ }
+
public boolean matchFullPath(IDeviceID deviceID, String measurement) {
- // TODO change this way
- PartialPath devicePath;
try {
- devicePath = new PartialPath(deviceID.toString());
+ String[] deviceNodes = getDeviceNodes(deviceID);
+ String[] fullPathNodes = Arrays.copyOf(deviceNodes, deviceNodes.length +
1);
+ fullPathNodes[deviceNodes.length] = measurement;
+ return matchPath(fullPathNodes, 0, 0, false, false);
} catch (IllegalPathException e) {
throw new RuntimeException(e);
}
- return matchPath(
- devicePath.concatAsMeasurementPath(measurement).getNodes(), 0, 0,
false, false);
}
/**
@@ -470,6 +473,21 @@ public class PartialPath extends Path implements
Comparable<Path>, Cloneable {
return matchPath(prefixPath.getNodes(), 0, 0, false, true);
}
+ public boolean matchPrefixPath(IDeviceID deviceID) throws
IllegalPathException {
+ return matchPath(getDeviceNodes(deviceID), 0, 0, false, true);
+ }
+
+ private static String[] getDeviceNodes(IDeviceID deviceID) throws
IllegalPathException {
+ String[] tableNameSegments =
PathUtils.splitPathToDetachedNodes(deviceID.getTableName());
+ String[] deviceNodes = new String[deviceID.segmentNum() - 1 +
tableNameSegments.length];
+ System.arraycopy(tableNameSegments, 0, deviceNodes, 0,
tableNameSegments.length);
+ for (int i = 0; i < deviceID.segmentNum() - 1; i++) {
+ deviceNodes[i + tableNameSegments.length] =
+ deviceID.segment(i + 1) != null ? deviceID.segment(i + 1).toString()
: null;
+ }
+ return deviceNodes;
+ }
+
private boolean matchPath(
String[] pathNodes,
int pathIndex,