This is an automated email from the ASF dual-hosted git repository. xiangweiwei pushed a commit to branch optPhysical in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 8008857c4ee2c85445711f4adfba651e268da17f Author: Alima777 <[email protected]> AuthorDate: Fri Jun 25 17:32:46 2021 +0800 Optimize vector query logic version 1 --- .../apache/iotdb/cluster/metadata/CMManager.java | 2 +- .../iotdb/AlignedTimeseriesSessionExample.java | 4 +- .../iotdb/db/engine/memtable/AbstractMemTable.java | 16 +- .../db/engine/memtable/PrimitiveMemTable.java | 2 +- .../db/engine/querycontext/ReadOnlyMemChunk.java | 18 +- .../engine/storagegroup/StorageGroupProcessor.java | 2 +- .../db/engine/storagegroup/TsFileProcessor.java | 20 +- .../org/apache/iotdb/db/metadata/MManager.java | 20 +- .../java/org/apache/iotdb/db/metadata/MTree.java | 239 +++++++++++++++------ .../iotdb/db/metadata/VectorPartialPath.java | 1 - .../iotdb/db/metadata/mnode/MeasurementMNode.java | 4 +- .../iotdb/db/metadata/template/Template.java | 2 +- .../iotdb/db/qp/logical/crud/QueryOperator.java | 2 +- .../iotdb/db/qp/physical/crud/InsertRowPlan.java | 2 +- .../db/qp/physical/crud/RawDataQueryPlan.java | 2 +- .../java/org/apache/iotdb/db/utils/MemUtils.java | 2 +- .../iotdb/db/writelog/recover/LogReplayer.java | 4 +- .../java/org/apache/iotdb/session/Session.java | 10 +- .../org/apache/iotdb/session/SessionUtils.java | 4 +- .../apache/iotdb/session/IoTDBSessionSimpleIT.java | 6 +- .../tsfile/write/chunk/VectorChunkWriterImpl.java | 8 +- .../apache/iotdb/tsfile/write/record/Tablet.java | 16 +- .../tsfile/write/schema/IMeasurementSchema.java | 10 +- .../tsfile/write/schema/MeasurementSchema.java | 10 +- .../write/schema/VectorMeasurementSchema.java | 66 +++--- .../write/writer/VectorMeasurementSchemaStub.java | 10 +- 26 files changed, 299 insertions(+), 183 deletions(-) diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java index 170ef49..20a3225 100644 --- a/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java +++ b/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java @@ -226,7 +226,7 @@ public class CMManager extends MManager { new MeasurementMNode( null, measurementSchema.getMeasurementId(), measurementSchema, null); if (measurementSchema instanceof VectorMeasurementSchema) { - for (String subSensorId : measurementSchema.getValueMeasurementIdList()) { + for (String subSensorId : measurementSchema.getSubMeasurementsList()) { cacheMeta(new PartialPath(path.getDevice(), subSensorId), measurementMNode, false); } cacheMeta( diff --git a/example/session/src/main/java/org/apache/iotdb/AlignedTimeseriesSessionExample.java b/example/session/src/main/java/org/apache/iotdb/AlignedTimeseriesSessionExample.java index 2bbde9a..bf43a61 100644 --- a/example/session/src/main/java/org/apache/iotdb/AlignedTimeseriesSessionExample.java +++ b/example/session/src/main/java/org/apache/iotdb/AlignedTimeseriesSessionExample.java @@ -255,11 +255,11 @@ public class AlignedTimeseriesSessionExample { int rowIndex = tablet.rowSize++; tablet.addTimestamp(rowIndex, timestamp); tablet.addValue( - schemaList.get(0).getValueMeasurementIdList().get(0), + schemaList.get(0).getSubMeasurementsList().get(0), rowIndex, new SecureRandom().nextLong()); tablet.addValue( - schemaList.get(0).getValueMeasurementIdList().get(1), + schemaList.get(0).getSubMeasurementsList().get(1), rowIndex, new SecureRandom().nextInt()); diff --git a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java index 170f49c..f12f73a 100644 --- a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java +++ b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java @@ -129,14 +129,14 @@ public abstract class AbstractMemTable implements IMemTable { if (measurementMNode != null) { // write vector Object[] vectorValue = - new Object[measurementMNode.getSchema().getValueTSDataTypeList().size()]; + new Object[measurementMNode.getSchema().getSubMeasurementsTSDataTypeList().size()]; for (int j = 0; j < vectorValue.length; j++) { vectorValue[j] = values[columnIndex]; columnIndex++; } memSize += MemUtils.getVectorRecordSize( - measurementMNode.getSchema().getValueTSDataTypeList(), + measurementMNode.getSchema().getSubMeasurementsTSDataTypeList(), vectorValue, disableMemControl); write( @@ -207,9 +207,9 @@ public abstract class AbstractMemTable implements IMemTable { if (insertTabletPlan.isAligned()) { VectorMeasurementSchema vectorSchema = (VectorMeasurementSchema) insertTabletPlan.getMeasurementMNodes()[i].getSchema(); - Object[] columns = new Object[vectorSchema.getValueMeasurementIdList().size()]; - BitMap[] bitMaps = new BitMap[vectorSchema.getValueMeasurementIdList().size()]; - for (int j = 0; j < vectorSchema.getValueMeasurementIdList().size(); j++) { + Object[] columns = new Object[vectorSchema.getSubMeasurementsList().size()]; + BitMap[] bitMaps = new BitMap[vectorSchema.getSubMeasurementsList().size()]; + for (int j = 0; j < vectorSchema.getSubMeasurementsList().size(); j++) { columns[j] = insertTabletPlan.getColumns()[columnIndex]; if (insertTabletPlan.getBitMaps() != null) { bitMaps[j] = insertTabletPlan.getBitMaps()[columnIndex]; @@ -319,11 +319,11 @@ public abstract class AbstractMemTable implements IMemTable { return null; } - List<String> measurementIdList = partialVectorSchema.getValueMeasurementIdList(); + List<String> measurementIdList = partialVectorSchema.getSubMeasurementsList(); List<Integer> columns = new ArrayList<>(); IMeasurementSchema vectorSchema = vectorMemChunk.getSchema(); for (String queryingMeasurement : measurementIdList) { - columns.add(vectorSchema.getValueMeasurementIdList().indexOf(queryingMeasurement)); + columns.add(vectorSchema.getSubMeasurementsList().indexOf(queryingMeasurement)); } // get sorted tv list is synchronized so different query can get right sorted list reference TVList vectorTvListCopy = vectorMemChunk.getSortedTvListForQuery(columns); @@ -374,7 +374,7 @@ public abstract class AbstractMemTable implements IMemTable { // for vector type else if (schema.getType() == TSDataType.VECTOR) { List<String> measurements = MetaUtils.getMeasurementsInPartialPath(originalPath); - if (measurements.containsAll(schema.getValueMeasurementIdList())) { + if (measurements.containsAll(schema.getSubMeasurementsList())) { if (startTimestamp == Long.MIN_VALUE && endTimestamp == Long.MAX_VALUE) { iter.remove(); } diff --git a/server/src/main/java/org/apache/iotdb/db/engine/memtable/PrimitiveMemTable.java b/server/src/main/java/org/apache/iotdb/db/engine/memtable/PrimitiveMemTable.java index e13bbf2..dc809e3 100644 --- a/server/src/main/java/org/apache/iotdb/db/engine/memtable/PrimitiveMemTable.java +++ b/server/src/main/java/org/apache/iotdb/db/engine/memtable/PrimitiveMemTable.java @@ -42,7 +42,7 @@ public class PrimitiveMemTable extends AbstractMemTable { protected IWritableMemChunk genMemSeries(IMeasurementSchema schema) { if (schema.getType() == TSDataType.VECTOR) { return new WritableMemChunk( - schema, TVListAllocator.getInstance().allocate(schema.getValueTSDataTypeList())); + schema, TVListAllocator.getInstance().allocate(schema.getSubMeasurementsTSDataTypeList())); } return new WritableMemChunk(schema, TVListAllocator.getInstance().allocate(schema.getType())); } diff --git a/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java b/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java index e7e83db..ebdf793 100644 --- a/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java +++ b/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java @@ -173,13 +173,13 @@ public class ReadOnlyMemChunk { IChunkMetadata timeChunkMetadata = new ChunkMetadata(measurementUid, TSDataType.VECTOR, 0, timeStatistics); List<IChunkMetadata> valueChunkMetadataList = new ArrayList<>(); - Statistics[] valueStatistics = new Statistics[schema.getValueTSDataTypeList().size()]; - for (int i = 0; i < schema.getValueTSDataTypeList().size(); i++) { - valueStatistics[i] = Statistics.getStatsByType(schema.getValueTSDataTypeList().get(i)); + Statistics[] valueStatistics = new Statistics[schema.getSubMeasurementsTSDataTypeList().size()]; + for (int i = 0; i < schema.getSubMeasurementsTSDataTypeList().size(); i++) { + valueStatistics[i] = Statistics.getStatsByType(schema.getSubMeasurementsTSDataTypeList().get(i)); IChunkMetadata valueChunkMetadata = new ChunkMetadata( - schema.getValueMeasurementIdList().get(i), - schema.getValueTSDataTypeList().get(i), + schema.getSubMeasurementsList().get(i), + schema.getSubMeasurementsTSDataTypeList().get(i), 0, valueStatistics[i]); valueChunkMetadataList.add(valueChunkMetadata); @@ -190,7 +190,7 @@ public class ReadOnlyMemChunk { while (iterator.hasNextTimeValuePair()) { TimeValuePair timeValuePair = iterator.nextTimeValuePair(); timeStatistics.update(timeValuePair.getTimestamp()); - if (schema.getValueTSDataTypeList().size() == 1) { + if (schema.getSubMeasurementsTSDataTypeList().size() == 1) { updateValueStatisticsForSingleColumn(schema, valueStatistics, timeValuePair); } else { updateValueStatistics(schema, valueStatistics, timeValuePair); @@ -212,7 +212,7 @@ public class ReadOnlyMemChunk { private void updateValueStatisticsForSingleColumn( IMeasurementSchema schema, Statistics[] valueStatistics, TimeValuePair timeValuePair) throws QueryProcessException { - switch (schema.getValueTSDataTypeList().get(0)) { + switch (schema.getSubMeasurementsTSDataTypeList().get(0)) { case BOOLEAN: valueStatistics[0].update( timeValuePair.getTimestamp(), timeValuePair.getValue().getBoolean()); @@ -243,11 +243,11 @@ public class ReadOnlyMemChunk { private void updateValueStatistics( IMeasurementSchema schema, Statistics[] valueStatistics, TimeValuePair timeValuePair) throws QueryProcessException { - for (int i = 0; i < schema.getValueTSDataTypeList().size(); i++) { + for (int i = 0; i < schema.getSubMeasurementsTSDataTypeList().size(); i++) { if (timeValuePair.getValue().getVector()[i] == null) { continue; } - switch (schema.getValueTSDataTypeList().get(i)) { + switch (schema.getSubMeasurementsTSDataTypeList().get(i)) { case BOOLEAN: valueStatistics[i].update( timeValuePair.getTimestamp(), timeValuePair.getValue().getVector()[i].getBoolean()); diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java index 2b2185d..d86b74b 100755 --- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java +++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java @@ -1060,7 +1060,7 @@ public class StorageGroupProcessor { for (int i = 0; i < mNodes.length; i++) { // Don't update cached last value for vector type if (mNodes[i] != null && plan.isAligned()) { - columnIndex += mNodes[i].getSchema().getValueMeasurementIdList().size(); + columnIndex += mNodes[i].getSchema().getSubMeasurementsList().size(); } else { if (plan.getColumns()[i] == null) { columnIndex++; diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java index 28f0f6e..9d401b5 100644 --- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java +++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java @@ -321,11 +321,11 @@ public class TsFileProcessor { IMeasurementSchema schema = insertRowPlan.getMeasurementMNodes()[i].getSchema(); if (schema.getType() == TSDataType.VECTOR) { chunkMetadataIncrement += - schema.getValueTSDataTypeList().size() + schema.getSubMeasurementsTSDataTypeList().size() * ChunkMetadata.calculateRamSize( - schema.getValueMeasurementIdList().get(0), - schema.getValueTSDataTypeList().get(0)); - memTableIncrement += TVList.vectorTvListArrayMemSize(schema.getValueTSDataTypeList()); + schema.getSubMeasurementsList().get(0), + schema.getSubMeasurementsTSDataTypeList().get(0)); + memTableIncrement += TVList.vectorTvListArrayMemSize(schema.getSubMeasurementsTSDataTypeList()); } else { chunkMetadataIncrement += ChunkMetadata.calculateRamSize( @@ -365,8 +365,8 @@ public class TsFileProcessor { if (insertTabletPlan.isAligned()) { VectorMeasurementSchema vectorSchema = (VectorMeasurementSchema) insertTabletPlan.getMeasurementMNodes()[i].getSchema(); - Object[] columns = new Object[vectorSchema.getValueMeasurementIdList().size()]; - for (int j = 0; j < vectorSchema.getValueMeasurementIdList().size(); j++) { + Object[] columns = new Object[vectorSchema.getSubMeasurementsList().size()]; + for (int j = 0; j < vectorSchema.getSubMeasurementsList().size(); j++) { columns[j] = insertTabletPlan.getColumns()[columnIndex++]; } updateVectorMemCost(vectorSchema, deviceId, start, end, memIncrements, columns); @@ -437,8 +437,8 @@ public class TsFileProcessor { Object[] columns) { // memIncrements = [memTable, text, chunk metadata] respectively - List<String> measurementIds = vectorSchema.getValueMeasurementIdList(); - List<TSDataType> dataTypes = vectorSchema.getValueTSDataTypeList(); + List<String> measurementIds = vectorSchema.getSubMeasurementsList(); + List<TSDataType> dataTypes = vectorSchema.getSubMeasurementsTSDataTypeList(); if (workMemTable.checkIfChunkDoesNotExist(deviceId, vectorSchema.getMeasurementId())) { // ChunkMetadataIncrement memIncrements[2] += @@ -1220,8 +1220,8 @@ public class TsFileProcessor { List<ChunkMetadata> timeChunkMetadataList = writer.getVisibleMetadataList(deviceId, measurementId, schema.getType()); List<List<ChunkMetadata>> valueChunkMetadataList = new ArrayList<>(); - List<String> valueMeasurementIdList = schema.getValueMeasurementIdList(); - List<TSDataType> valueDataTypeList = schema.getValueTSDataTypeList(); + List<String> valueMeasurementIdList = schema.getSubMeasurementsList(); + List<TSDataType> valueDataTypeList = schema.getSubMeasurementsTSDataTypeList(); for (int i = 0; i < valueMeasurementIdList.size(); i++) { valueChunkMetadataList.add( writer.getVisibleMetadataList( diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java index 3859995..30e49a4 100644 --- a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java +++ b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java @@ -593,7 +593,7 @@ public class MManager { if (lastNode instanceof MeasurementMNode) { IMeasurementSchema schema = ((MeasurementMNode) lastNode).getSchema(); if (schema instanceof VectorMeasurementSchema) { - if (schema.getValueMeasurementIdList().size() != allTimeseries.size()) { + if (schema.getSubMeasurementsList().size() != allTimeseries.size()) { throw new AlignedTimeseriesException( "Not support deleting part of aligned timeseies!", prefixPath.getFullPath()); } else { @@ -692,7 +692,7 @@ public class MManager { updateSchemaDataTypeNumMap(schema.getType(), -1); timeseriesNum = 1; } else if (schema instanceof VectorMeasurementSchema) { - for (TSDataType dataType : schema.getValueTSDataTypeList()) { + for (TSDataType dataType : schema.getSubMeasurementsTSDataTypeList()) { updateSchemaDataTypeNumMap(dataType, -1); timeseriesNum++; } @@ -833,8 +833,10 @@ public class MManager { if (schema instanceof MeasurementSchema) { return schema.getType(); } else { - List<String> measurements = schema.getValueMeasurementIdList(); - return schema.getValueTSDataTypeList().get(measurements.indexOf(path.getMeasurement())); + List<String> measurements = schema.getSubMeasurementsList(); + return schema + .getSubMeasurementsTSDataTypeList() + .get(measurements.indexOf(path.getMeasurement())); } } @@ -1165,15 +1167,15 @@ public class MManager { if (schema == null || schema.getType() != TSDataType.VECTOR) { return schema; } - List<String> measurementsInLeaf = schema.getValueMeasurementIdList(); + List<String> measurementsInLeaf = schema.getSubMeasurementsList(); List<PartialPath> measurements = ((VectorPartialPath) fullPath).getSubSensorsPathList(); TSDataType[] types = new TSDataType[measurements.size()]; TSEncoding[] encodings = new TSEncoding[measurements.size()]; for (int i = 0; i < measurements.size(); i++) { int index = measurementsInLeaf.indexOf(measurements.get(i).getMeasurement()); - types[i] = schema.getValueTSDataTypeList().get(index); - encodings[i] = schema.getValueTSEncodingList().get(index); + types[i] = schema.getSubMeasurementsTSDataTypeList().get(index); + encodings[i] = schema.getSubMeasurementsTSEncodingList().get(index); } String[] array = new String[measurements.size()]; for (int i = 0; i < array.length; i++) { @@ -2221,7 +2223,7 @@ public class MManager { if (plan instanceof InsertRowPlan || plan instanceof InsertTabletPlan) { if (plan.isAligned()) { TSDataType dataTypeInNode = - measurementMNode.getSchema().getValueTSDataTypeList().get(i); + measurementMNode.getSchema().getSubMeasurementsTSDataTypeList().get(i); insertDataType = plan.getDataTypes()[i]; if (insertDataType == null) { insertDataType = dataTypeInNode; @@ -2229,7 +2231,7 @@ public class MManager { if (dataTypeInNode != insertDataType) { logger.warn( "DataType mismatch, Insert measurement {} in {} type {}, metadata tree type {}", - measurementMNode.getSchema().getValueMeasurementIdList().get(i), + measurementMNode.getSchema().getSubMeasurementsList().get(i), measurementList[i], insertDataType, dataTypeInNode); diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java index efb6d2e..379594c 100644 --- a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java +++ b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java @@ -1209,7 +1209,9 @@ public class MTree implements Serializable { } /** - * Iterate through MTree to fetch metadata info of all leaf nodes under the given seriesPath + * For show timeseries. + * + * <p>Iterate through MTree to fetch metadata info of all leaf nodes under the given seriesPath * * @param needLast if false, lastTimeStamp in timeseriesSchemaList will be null * @param timeseriesSchemaList List<timeseriesSchema> result: [name, alias, storage group, @@ -1217,55 +1219,172 @@ public class MTree implements Serializable { */ @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning private void findPath( - MNode node, + MNode curNode, String[] nodes, - int idx, + int childIndex, List<Pair<PartialPath, String[]>> timeseriesSchemaList, boolean hasLimit, boolean needLast, QueryContext queryContext, Template upperTemplate) throws MetadataException { - if (node instanceof MeasurementMNode - && (nodes.length <= idx - || ((MeasurementMNode) node).getSchema() instanceof VectorMeasurementSchema)) { + if (curNode instanceof MeasurementMNode + // For example: nodes: [root, sg, d1, s1, ss1], mtree: root.sg.d1.s1 + // node: root.sg.d1.s1, idx = 4 < length, will not be chosen + && (nodes.length <= childIndex + || ((MeasurementMNode) curNode).getSchema() instanceof VectorMeasurementSchema)) { + MeasurementMNode measurementMNode = (MeasurementMNode) curNode; + timeseriesSchemaList.add(getTimeseriesInfo(measurementMNode, needLast, queryContext)); + + IMeasurementSchema measurementSchema = ((MeasurementMNode) curNode).getSchema(); + + if (measurementSchema instanceof MeasurementSchema) { + + } else if (measurementSchema instanceof VectorMeasurementSchema) { + addVectorMeasurementSchema( + measurementMNode, + timeseriesSchemaList, + needLast, + queryContext, + measurementSchema, + MetaUtils.getNodeRegByIdx(childIndex, nodes)); + } if (hasLimit) { - curOffset.set(curOffset.get() + 1); - if (curOffset.get() < offset.get() || count.get().intValue() == limit.get().intValue()) { + count.set(count.get() + 1); + } + } + + String nodeReg = MetaUtils.getNodeRegByIdx(childIndex, nodes); + if (curNode.getDeviceTemplate() != null) { + upperTemplate = curNode.getDeviceTemplate(); + } + + // we should use template when all children are measurements or this node has no child + if (!nodeReg.contains(PATH_WILDCARD)) { + MNode next = curNode.getChild(nodeReg); + if (next != null) { + findPath( + next, + nodes, + childIndex + 1, + timeseriesSchemaList, + hasLimit, + needLast, + queryContext, + upperTemplate); + } + } else { + for (MNode child : curNode.getChildren().values()) { + if (!Pattern.matches(nodeReg.replace("*", ".*"), child.getName())) { + continue; + } + findPath( + child, + nodes, + childIndex + 1, + timeseriesSchemaList, + hasLimit, + needLast, + queryContext, + upperTemplate); + if (hasLimit && count.get().intValue() == limit.get().intValue()) { return; } } - IMeasurementSchema measurementSchema = ((MeasurementMNode) node).getSchema(); + } + + // template part + if (!(curNode instanceof MeasurementMNode) && curNode.isUseTemplate()) { + if (upperTemplate != null) { + HashSet<IMeasurementSchema> set = new HashSet<>(); + for (IMeasurementSchema schema : upperTemplate.getSchemaMap().values()) { + if (set.add(schema)) { + if (schema instanceof MeasurementSchema) { + getMeasurementSchema( + new MeasurementMNode(curNode, schema.getMeasurementId(), schema, null), + timeseriesSchemaList, + needLast, + queryContext, + schema, + nodeReg); + } else if (schema instanceof VectorMeasurementSchema) { + VectorMeasurementSchema vectorMeasurementSchema = (VectorMeasurementSchema) schema; + if (Pattern.matches( + nodeReg.replace("*", ".*"), vectorMeasurementSchema.getMeasurementId())) { + String firstNode = schema.getSubMeasurementsList().get(0); + addVectorMeasurementSchemaForTemplate( + new MeasurementMNode(curNode, firstNode, schema, null), + timeseriesSchemaList, + needLast, + queryContext, + schema, + MetaUtils.getNodeRegByIdx(childIndex + 1, nodes), + vectorMeasurementSchema.getMeasurementId()); + } + } + } + } + } + } + } + + /** + * For query + * + * <p>Iterate through MTree to fetch metadata info of all leaf nodes under the given seriesPath + * + * @param needLast if false, lastTimeStamp in timeseriesSchemaList will be null + * @param timeseriesSchemaList List<timeseriesSchema> result: [name, alias, storage group, + * dataType, encoding, compression, offset, lastTimeStamp] + */ + @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning + private void findPath( + MNode curNode, + String[] nodes, + int childIndex, + List<Pair<PartialPath, String[]>> timeseriesSchemaList, + boolean hasLimit, + boolean needLast, + QueryContext queryContext, + Template upperTemplate) + throws MetadataException { + if (curNode instanceof MeasurementMNode + // For example: nodes: [root, sg, d1, s1, ss1], mtree: root.sg.d1.s1 + // node: root.sg.d1.s1, idx = 4 < length, will not be chosen + && (nodes.length <= childIndex + || ((MeasurementMNode) curNode).getSchema() instanceof VectorMeasurementSchema)) { + MeasurementMNode measurementMNode = (MeasurementMNode) curNode; + IMeasurementSchema measurementSchema = ((MeasurementMNode) curNode).getSchema(); if (measurementSchema instanceof MeasurementSchema) { - addMeasurementSchema( - node, timeseriesSchemaList, needLast, queryContext, measurementSchema, "*"); + timeseriesSchemaList.add( + getTimeseriesInfo(measurementMNode, needLast, queryContext, measurementSchema)); } else if (measurementSchema instanceof VectorMeasurementSchema) { addVectorMeasurementSchema( - node, + measurementMNode, timeseriesSchemaList, needLast, queryContext, measurementSchema, - idx < nodes.length ? nodes[idx] : "*"); + MetaUtils.getNodeRegByIdx(childIndex, nodes)); } if (hasLimit) { count.set(count.get() + 1); } } - String nodeReg = MetaUtils.getNodeRegByIdx(idx, nodes); - if (node.getDeviceTemplate() != null) { - upperTemplate = node.getDeviceTemplate(); + String nodeReg = MetaUtils.getNodeRegByIdx(childIndex, nodes); + if (curNode.getDeviceTemplate() != null) { + upperTemplate = curNode.getDeviceTemplate(); } - // we should use template when all child is measurement or this node has no child + // we should use template when all children are measurements or this node has no child if (!nodeReg.contains(PATH_WILDCARD)) { - MNode next = node.getChild(nodeReg); + MNode next = curNode.getChild(nodeReg); if (next != null) { findPath( next, nodes, - idx + 1, + childIndex + 1, timeseriesSchemaList, hasLimit, needLast, @@ -1273,14 +1392,14 @@ public class MTree implements Serializable { upperTemplate); } } else { - for (MNode child : node.getChildren().values()) { + for (MNode child : curNode.getChildren().values()) { if (!Pattern.matches(nodeReg.replace("*", ".*"), child.getName())) { continue; } findPath( child, nodes, - idx + 1, + childIndex + 1, timeseriesSchemaList, hasLimit, needLast, @@ -1293,14 +1412,14 @@ public class MTree implements Serializable { } // template part - if (!(node instanceof MeasurementMNode) && node.isUseTemplate()) { + if (!(curNode instanceof MeasurementMNode) && curNode.isUseTemplate()) { if (upperTemplate != null) { HashSet<IMeasurementSchema> set = new HashSet<>(); for (IMeasurementSchema schema : upperTemplate.getSchemaMap().values()) { if (set.add(schema)) { if (schema instanceof MeasurementSchema) { - addMeasurementSchema( - new MeasurementMNode(node, schema.getMeasurementId(), schema, null), + getMeasurementSchema( + new MeasurementMNode(curNode, schema.getMeasurementId(), schema, null), timeseriesSchemaList, needLast, queryContext, @@ -1310,14 +1429,14 @@ public class MTree implements Serializable { VectorMeasurementSchema vectorMeasurementSchema = (VectorMeasurementSchema) schema; if (Pattern.matches( nodeReg.replace("*", ".*"), vectorMeasurementSchema.getMeasurementId())) { - String firstNode = schema.getValueMeasurementIdList().get(0); + String firstNode = schema.getSubMeasurementsList().get(0); addVectorMeasurementSchemaForTemplate( - new MeasurementMNode(node, firstNode, schema, null), + new MeasurementMNode(curNode, firstNode, schema, null), timeseriesSchemaList, needLast, queryContext, schema, - MetaUtils.getNodeRegByIdx(idx + 1, nodes), + MetaUtils.getNodeRegByIdx(childIndex + 1, nodes), vectorMeasurementSchema.getMeasurementId()); } } @@ -1327,55 +1446,55 @@ public class MTree implements Serializable { } } - private void addMeasurementSchema( - MNode node, - List<Pair<PartialPath, String[]>> timeseriesSchemaList, - boolean needLast, - QueryContext queryContext, - IMeasurementSchema measurementSchema, - String reg) + /** For show timeseries */ + private String[] getTimeseriesInfo( + MeasurementMNode node, boolean needLast, QueryContext queryContext) throws StorageGroupNotSetException { - if (Pattern.matches(reg.replace("*", ".*"), measurementSchema.getMeasurementId())) { - PartialPath nodePath = node.getPartialPath(); - String[] tsRow = new String[7]; - tsRow[0] = ((MeasurementMNode) node).getAlias(); - tsRow[1] = getStorageGroupPath(nodePath).getFullPath(); - tsRow[2] = measurementSchema.getType().toString(); - tsRow[3] = measurementSchema.getEncodingType().toString(); - tsRow[4] = measurementSchema.getCompressor().toString(); - tsRow[5] = String.valueOf(((MeasurementMNode) node).getOffset()); - tsRow[6] = - needLast ? String.valueOf(getLastTimeStamp((MeasurementMNode) node, queryContext)) : null; - Pair<PartialPath, String[]> temp = new Pair<>(nodePath, tsRow); - timeseriesSchemaList.add(temp); - } + MeasurementSchema measurementSchema = (MeasurementSchema) node.getSchema(); + if (measurementSchema instanceof VectorMeasurementSchema) {} + + String[] tsRow = new String[7]; + tsRow[0] = node.getAlias(); + tsRow[1] = getStorageGroupPath(node.getPartialPath()).getFullPath(); + tsRow[2] = measurementSchema.getType().toString(); + tsRow[3] = measurementSchema.getEncodingType().toString(); + tsRow[4] = measurementSchema.getCompressor().toString(); + tsRow[5] = String.valueOf(node.getOffset()); + tsRow[6] = needLast ? String.valueOf(getLastTimeStamp(node, queryContext)) : null; + return tsRow; + } + + /** For query */ + private List<PartialPath> getMeasurementPaths(MeasurementMNode node) { + List<PartialPath> pathArrayList = new ArrayList<>(); + pathArrayList.add(node.getPartialPath()); + return pathArrayList; } private void addVectorMeasurementSchema( - MNode node, + MeasurementMNode node, List<Pair<PartialPath, String[]>> timeseriesSchemaList, boolean needLast, QueryContext queryContext, IMeasurementSchema schema, String reg) throws StorageGroupNotSetException, IllegalPathException { - List<String> measurements = schema.getValueMeasurementIdList(); - for (int i = 0; i < measurements.size(); i++) { - if (!Pattern.matches(reg.replace("*", ".*"), measurements.get(i))) { + List<String> subMeasurements = schema.getSubMeasurementsList(); + for (int i = 0; i < subMeasurements.size(); i++) { + if (!Pattern.matches(reg.replace("*", ".*"), subMeasurements.get(i))) { continue; } PartialPath devicePath = node.getPartialPath(); String[] tsRow = new String[7]; tsRow[0] = null; tsRow[1] = getStorageGroupPath(devicePath).getFullPath(); - tsRow[2] = schema.getValueTSDataTypeList().get(i).toString(); - tsRow[3] = schema.getValueTSEncodingList().get(i).toString(); + tsRow[2] = schema.getSubMeasurementsTSDataTypeList().get(i).toString(); + tsRow[3] = schema.getSubMeasurementsTSEncodingList().get(i).toString(); tsRow[4] = schema.getCompressor().toString(); tsRow[5] = "-1"; - tsRow[6] = - needLast ? String.valueOf(getLastTimeStamp((MeasurementMNode) node, queryContext)) : null; + tsRow[6] = needLast ? String.valueOf(getLastTimeStamp(node, queryContext)) : null; Pair<PartialPath, String[]> temp = - new Pair<>(new PartialPath(devicePath.getFullPath(), measurements.get(i)), tsRow); + new Pair<>(new PartialPath(devicePath.getFullPath(), subMeasurements.get(i)), tsRow); timeseriesSchemaList.add(temp); } } @@ -1389,7 +1508,7 @@ public class MTree implements Serializable { String reg, String vectorId) throws StorageGroupNotSetException, IllegalPathException { - List<String> measurements = schema.getValueMeasurementIdList(); + List<String> measurements = schema.getSubMeasurementsList(); for (int i = 0; i < measurements.size(); i++) { if (!Pattern.matches(reg.replace("*", ".*"), measurements.get(i))) { continue; @@ -1399,8 +1518,8 @@ public class MTree implements Serializable { String[] tsRow = new String[7]; tsRow[0] = null; tsRow[1] = getStorageGroupPath(devicePath).getFullPath(); - tsRow[2] = schema.getValueTSDataTypeList().get(i).toString(); - tsRow[3] = schema.getValueTSEncodingList().get(i).toString(); + tsRow[2] = schema.getSubMeasurementsTSDataTypeList().get(i).toString(); + tsRow[3] = schema.getSubMeasurementsTSEncodingList().get(i).toString(); tsRow[4] = schema.getCompressor().toString(); tsRow[5] = "-1"; tsRow[6] = diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/VectorPartialPath.java b/server/src/main/java/org/apache/iotdb/db/metadata/VectorPartialPath.java index 65ef534..a16caf4 100644 --- a/server/src/main/java/org/apache/iotdb/db/metadata/VectorPartialPath.java +++ b/server/src/main/java/org/apache/iotdb/db/metadata/VectorPartialPath.java @@ -28,7 +28,6 @@ import java.util.Objects; * VectorPartialPath represents a vector's fullPath. It not only contains the full path of vector's * own name, but also has subSensorsPathList which contain all the fullPath of vector's sub sensors. * e.g. VectorPartialPath1(root.sg1.d1.vector1, [root.sg1.d1.vector1.s1, root.sg1.d1.vector1.s2]) - * VectorPartialPath2(root.sg1.d1.vector2, [root.sg1.d1.vector2.s1, root.sg1.d1.vector2.s2]) */ public class VectorPartialPath extends PartialPath { diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java index e2d309b..edda52d 100644 --- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java +++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java @@ -201,8 +201,8 @@ public class MeasurementMNode extends MNode { if (schema instanceof MeasurementSchema) { return schema.getType(); } else { - int index = schema.getMeasurementIdColumnIndex(measurementId); - return schema.getValueTSDataTypeList().get(index); + int index = schema.getSubMeasurementColumnIndex(measurementId); + return schema.getSubMeasurementsTSDataTypeList().get(index); } } } diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/template/Template.java b/server/src/main/java/org/apache/iotdb/db/metadata/template/Template.java index 5a59c52..4c9384d 100644 --- a/server/src/main/java/org/apache/iotdb/db/metadata/template/Template.java +++ b/server/src/main/java/org/apache/iotdb/db/metadata/template/Template.java @@ -163,7 +163,7 @@ public class Template { if (schemaEntry.getValue() instanceof VectorMeasurementSchema) { VectorMeasurementSchema vectorMeasurementSchema = (VectorMeasurementSchema) schemaEntry.getValue(); - res.put(schemaEntry.getKey(), vectorMeasurementSchema.getValueMeasurementIdList()); + res.put(schemaEntry.getKey(), vectorMeasurementSchema.getSubMeasurementsList()); } else { res.put(schemaEntry.getKey(), new ArrayList<>()); } diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java index f2668d3..ce02133 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java @@ -185,7 +185,7 @@ public class QueryOperator extends Operator { List<TSDataType> seriesTypes = generator.getSeriesTypes(filterPaths); HashMap<PartialPath, TSDataType> pathTSDataTypeHashMap = new HashMap<>(); for (int i = 0; i < filterPaths.size(); i++) { - rawDataQueryPlan.addFilterPathInDeviceToMeasurements(filterPaths.get(i)); + rawDataQueryPlan.addPathToDeviceToMeasurements(filterPaths.get(i)); pathTSDataTypeHashMap.put(filterPaths.get(i), seriesTypes.get(i)); } IExpression expression = filterOperator.transformToExpression(pathTSDataTypeHashMap); diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowPlan.java index 6990fec..18d7c86 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowPlan.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowPlan.java @@ -280,7 +280,7 @@ public class InsertRowPlan extends InsertPlan { } // for aligned timeseries else { - for (TSDataType dataType : measurementMNodes[i].getSchema().getValueTSDataTypeList()) { + for (TSDataType dataType : measurementMNodes[i].getSchema().getSubMeasurementsTSDataTypeList()) { dataTypes[columnIndex] = dataType; try { values[columnIndex] = diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/RawDataQueryPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/RawDataQueryPlan.java index 43c474e..cbaa214 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/RawDataQueryPlan.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/RawDataQueryPlan.java @@ -167,7 +167,7 @@ public class RawDataQueryPlan extends QueryPlan { return deviceToMeasurements.getOrDefault(device, new HashSet<>()); } - public void addFilterPathInDeviceToMeasurements(Path path) { + public void addPathToDeviceToMeasurements(Path path) { deviceToMeasurements .computeIfAbsent(path.getDevice(), key -> new HashSet<>()) .add(path.getMeasurement()); diff --git a/server/src/main/java/org/apache/iotdb/db/utils/MemUtils.java b/server/src/main/java/org/apache/iotdb/db/utils/MemUtils.java index 667a984..564c39d 100644 --- a/server/src/main/java/org/apache/iotdb/db/utils/MemUtils.java +++ b/server/src/main/java/org/apache/iotdb/db/utils/MemUtils.java @@ -112,7 +112,7 @@ public class MemUtils { // time and index column memSize memSize += (end - start) * (8L + 4L); // value columns memSize - for (TSDataType type : schema.getValueTSDataTypeList()) { + for (TSDataType type : schema.getSubMeasurementsTSDataTypeList()) { if (type == TSDataType.TEXT && addingTextDataSize) { for (int j = start; j < end; j++) { memSize += getBinarySize(((Binary[]) insertTabletPlan.getColumns()[columnCount])[j]); diff --git a/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java b/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java index 52fbd1f..8b4c452 100644 --- a/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java +++ b/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java @@ -199,7 +199,7 @@ public class LogReplayer { + tPlan.getMeasurements()[i])); columnIndex++; } else if (tPlan.isAligned()) { - List<TSDataType> datatypes = mNodes[i].getSchema().getValueTSDataTypeList(); + List<TSDataType> datatypes = mNodes[i].getSchema().getSubMeasurementsTSDataTypeList(); for (int j = 0; j < datatypes.size(); j++) { if (tPlan.getDataTypes()[columnIndex] == null) { tPlan.getDataTypes()[columnIndex] = datatypes.get(j); @@ -207,7 +207,7 @@ public class LogReplayer { tPlan.markFailedMeasurementInsertion( i, new DataTypeMismatchException( - mNodes[i].getSchema().getValueMeasurementIdList().get(j), + mNodes[i].getSchema().getSubMeasurementsList().get(j), tPlan.getDataTypes()[columnIndex], datatypes.get(j))); } diff --git a/session/src/main/java/org/apache/iotdb/session/Session.java b/session/src/main/java/org/apache/iotdb/session/Session.java index 447c2b5..6322499 100644 --- a/session/src/main/java/org/apache/iotdb/session/Session.java +++ b/session/src/main/java/org/apache/iotdb/session/Session.java @@ -1253,10 +1253,10 @@ public class Session { request.setIsAligned(true); IMeasurementSchema measurementSchema = tablet.getSchemas().get(0); request.setPrefixPath(tablet.prefixPath); - int measurementsSize = measurementSchema.getValueMeasurementIdList().size(); + int measurementsSize = measurementSchema.getSubMeasurementsList().size(); for (int i = 0; i < measurementsSize; i++) { - request.addToMeasurements(measurementSchema.getValueMeasurementIdList().get(i)); - request.addToTypes(measurementSchema.getValueTSDataTypeList().get(i).ordinal()); + request.addToMeasurements(measurementSchema.getSubMeasurementsList().get(i)); + request.addToTypes(measurementSchema.getSubMeasurementsTSDataTypeList().get(i).ordinal()); } request.setIsAligned(true); } else { @@ -1666,10 +1666,10 @@ public class Session { } columnIndex++; } else { - int measurementSize = schema.getValueMeasurementIdList().size(); + int measurementSize = schema.getSubMeasurementsList().size(); for (int j = 0; j < measurementSize; j++) { tablet.values[columnIndex] = - sortList(tablet.values[columnIndex], schema.getValueTSDataTypeList().get(j), index); + sortList(tablet.values[columnIndex], schema.getSubMeasurementsTSDataTypeList().get(j), index); if (tablet.bitMaps != null && tablet.bitMaps[columnIndex] != null) { tablet.bitMaps[columnIndex] = sortBitMap(tablet.bitMaps[columnIndex], index); } diff --git a/session/src/main/java/org/apache/iotdb/session/SessionUtils.java b/session/src/main/java/org/apache/iotdb/session/SessionUtils.java index f028990..9705d7f 100644 --- a/session/src/main/java/org/apache/iotdb/session/SessionUtils.java +++ b/session/src/main/java/org/apache/iotdb/session/SessionUtils.java @@ -50,9 +50,9 @@ public class SessionUtils { getValueBufferOfDataType(schema.getType(), tablet, indexOfValues, valueBuffer); indexOfValues++; } else { - for (int j = 0; j < schema.getValueTSDataTypeList().size(); j++) { + for (int j = 0; j < schema.getSubMeasurementsTSDataTypeList().size(); j++) { getValueBufferOfDataType( - schema.getValueTSDataTypeList().get(j), tablet, indexOfValues, valueBuffer); + schema.getSubMeasurementsTSDataTypeList().get(j), tablet, indexOfValues, valueBuffer); indexOfValues++; } } diff --git a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java index 15bd740..c37b6ad 100644 --- a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java +++ b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java @@ -393,15 +393,15 @@ public class IoTDBSessionSimpleIT { int rowIndex = tablet.rowSize++; tablet.addTimestamp(rowIndex, timestamp); tablet.addValue( - schemaList.get(0).getValueMeasurementIdList().get(0), + schemaList.get(0).getSubMeasurementsList().get(0), rowIndex, new SecureRandom().nextLong()); tablet.addValue( - schemaList.get(0).getValueMeasurementIdList().get(1), + schemaList.get(0).getSubMeasurementsList().get(1), rowIndex, new SecureRandom().nextInt()); tablet.addValue( - schemaList.get(0).getValueMeasurementIdList().get(2), rowIndex, new Binary("test")); + schemaList.get(0).getSubMeasurementsList().get(2), rowIndex, new Binary("test")); timestamp++; } diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/VectorChunkWriterImpl.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/VectorChunkWriterImpl.java index 8f1e907..3447560 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/VectorChunkWriterImpl.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/VectorChunkWriterImpl.java @@ -44,10 +44,10 @@ public class VectorChunkWriterImpl implements IChunkWriter { schema.getTimeTSEncoding(), schema.getTimeEncoder()); - List<String> valueMeasurementIdList = schema.getValueMeasurementIdList(); - List<TSDataType> valueTSDataTypeList = schema.getValueTSDataTypeList(); - List<TSEncoding> valueTSEncodingList = schema.getValueTSEncodingList(); - List<Encoder> valueEncoderList = schema.getValueEncoderList(); + List<String> valueMeasurementIdList = schema.getSubMeasurementsList(); + List<TSDataType> valueTSDataTypeList = schema.getSubMeasurementsTSDataTypeList(); + List<TSEncoding> valueTSEncodingList = schema.getSubMeasurementsTSEncodingList(); + List<Encoder> valueEncoderList = schema.getSubMeasurementsEncoderList(); valueChunkWriterList = new ArrayList<>(valueMeasurementIdList.size()); for (int i = 0; i < valueMeasurementIdList.size(); i++) { diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/Tablet.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/Tablet.java index 2c8d958..86eb0dd 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/Tablet.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/Tablet.java @@ -98,7 +98,7 @@ public class Tablet { int indexInSchema = 0; for (IMeasurementSchema schema : schemas) { if (schema.getType() == TSDataType.VECTOR) { - for (String measurementId : schema.getValueMeasurementIdList()) { + for (String measurementId : schema.getSubMeasurementsList()) { measurementIndex.put(measurementId, indexInSchema); } } else { @@ -124,8 +124,8 @@ public class Tablet { int indexOfSchema = measurementIndex.get(measurementId); IMeasurementSchema measurementSchema = schemas.get(indexOfSchema); if (measurementSchema.getType().equals(TSDataType.VECTOR)) { - int indexInVector = measurementSchema.getMeasurementIdColumnIndex(measurementId); - TSDataType dataType = measurementSchema.getValueTSDataTypeList().get(indexInVector); + int indexInVector = measurementSchema.getSubMeasurementColumnIndex(measurementId); + TSDataType dataType = measurementSchema.getSubMeasurementsTSDataTypeList().get(indexInVector); addValueOfDataType(dataType, rowIndex, indexInVector, value); } else { addValueOfDataType(measurementSchema.getType(), rowIndex, indexOfSchema, value); @@ -210,7 +210,7 @@ public class Tablet { int valueColumnsSize = 0; for (IMeasurementSchema schema : schemas) { if (schema instanceof VectorMeasurementSchema) { - valueColumnsSize += schema.getValueMeasurementIdList().size(); + valueColumnsSize += schema.getSubMeasurementsList().size(); } else { valueColumnsSize++; } @@ -231,8 +231,8 @@ public class Tablet { } private int buildVectorColumns(VectorMeasurementSchema schema, int idx) { - for (int i = 0; i < schema.getValueMeasurementIdList().size(); i++) { - TSDataType dataType = schema.getValueTSDataTypeList().get(i); + for (int i = 0; i < schema.getSubMeasurementsList().size(); i++) { + TSDataType dataType = schema.getSubMeasurementsTSDataTypeList().get(i); values[idx] = createValueColumnOfDataType(dataType); idx++; } @@ -281,8 +281,8 @@ public class Tablet { valueOccupation += calOccupationOfOneColumn(schema.getType(), columnIndex); columnIndex++; } else { - for (int j = 0; j < schema.getValueTSDataTypeList().size(); j++) { - TSDataType dataType = schema.getValueTSDataTypeList().get(j); + for (int j = 0; j < schema.getSubMeasurementsTSDataTypeList().size(); j++) { + TSDataType dataType = schema.getSubMeasurementsTSDataTypeList().get(j); valueOccupation += calOccupationOfOneColumn(dataType, columnIndex); columnIndex++; } diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/IMeasurementSchema.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/IMeasurementSchema.java index fb3358d..8898bf1 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/IMeasurementSchema.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/IMeasurementSchema.java @@ -49,15 +49,15 @@ public interface IMeasurementSchema { Map<String, String> getProps(); - List<String> getValueMeasurementIdList(); + List<String> getSubMeasurementsList(); - List<TSDataType> getValueTSDataTypeList(); + List<TSDataType> getSubMeasurementsTSDataTypeList(); - List<TSEncoding> getValueTSEncodingList(); + List<TSEncoding> getSubMeasurementsTSEncodingList(); - List<Encoder> getValueEncoderList(); + List<Encoder> getSubMeasurementsEncoderList(); - int getMeasurementIdColumnIndex(String measurementId); + int getSubMeasurementColumnIndex(String measurementId); int serializeTo(ByteBuffer buffer); diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/MeasurementSchema.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/MeasurementSchema.java index 4778ca6..26e6060 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/MeasurementSchema.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/MeasurementSchema.java @@ -223,22 +223,22 @@ public class MeasurementSchema } @Override - public List<String> getValueMeasurementIdList() { + public List<String> getSubMeasurementsList() { throw new UnsupportedOperationException("unsupported method for MeasurementSchema"); } @Override - public List<TSDataType> getValueTSDataTypeList() { + public List<TSDataType> getSubMeasurementsTSDataTypeList() { throw new UnsupportedOperationException("unsupported method for MeasurementSchema"); } @Override - public List<TSEncoding> getValueTSEncodingList() { + public List<TSEncoding> getSubMeasurementsTSEncodingList() { throw new UnsupportedOperationException("unsupported method for MeasurementSchema"); } @Override - public List<Encoder> getValueEncoderList() { + public List<Encoder> getSubMeasurementsEncoderList() { throw new UnsupportedOperationException("unsupported method for MeasurementSchema"); } @@ -393,7 +393,7 @@ public class MeasurementSchema } @Override - public int getMeasurementIdColumnIndex(String measurementId) { + public int getSubMeasurementColumnIndex(String measurementId) { return 0; } } diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/VectorMeasurementSchema.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/VectorMeasurementSchema.java index f9eb2b6..480c94d 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/VectorMeasurementSchema.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/VectorMeasurementSchema.java @@ -43,8 +43,8 @@ import java.util.Objects; public class VectorMeasurementSchema implements IMeasurementSchema, Comparable<VectorMeasurementSchema>, Serializable { - private String vectorMeausurementId; - private Map<String, Integer> measurementsToIndexMap; + private String vectorMeasurementId; + private Map<String, Integer> subMeasurementsIndexMap; private byte[] types; private byte[] encodings; private TSEncodingBuilder[] encodingConverters; @@ -58,10 +58,10 @@ public class VectorMeasurementSchema TSDataType[] types, TSEncoding[] encodings, CompressionType compressionType) { - this.vectorMeausurementId = measurementId; - this.measurementsToIndexMap = new HashMap<>(); + this.vectorMeasurementId = measurementId; + this.subMeasurementsIndexMap = new HashMap<>(); for (int i = 0; i < measurements.length; i++) { - measurementsToIndexMap.put(measurements[i], i); + subMeasurementsIndexMap.put(measurements[i], i); } byte[] typesInByte = new byte[types.length]; for (int i = 0; i < types.length; i++) { @@ -79,10 +79,10 @@ public class VectorMeasurementSchema } public VectorMeasurementSchema(String measurementId, String[] measurements, TSDataType[] types) { - this.vectorMeausurementId = measurementId; - this.measurementsToIndexMap = new HashMap<>(); + this.vectorMeasurementId = measurementId; + this.subMeasurementsIndexMap = new HashMap<>(); for (int i = 0; i < measurements.length; i++) { - measurementsToIndexMap.put(measurements[i], i); + subMeasurementsIndexMap.put(measurements[i], i); } this.types = new byte[types.length]; for (int i = 0; i < types.length; i++) { @@ -111,7 +111,7 @@ public class VectorMeasurementSchema @Override public String getMeasurementId() { - return vectorMeausurementId; + return vectorMeasurementId; } @Override @@ -159,16 +159,12 @@ public class VectorMeasurementSchema } @Override - public List<String> getValueMeasurementIdList() { - String[] measurements = new String[measurementsToIndexMap.size()]; - for (Map.Entry<String, Integer> entry : measurementsToIndexMap.entrySet()) { - measurements[entry.getValue()] = entry.getKey(); - } - return Arrays.asList(measurements); + public List<String> getSubMeasurementsList() { + return new ArrayList<>(subMeasurementsIndexMap.keySet()); } @Override - public List<TSDataType> getValueTSDataTypeList() { + public List<TSDataType> getSubMeasurementsTSDataTypeList() { List<TSDataType> dataTypeList = new ArrayList<>(); for (byte dataType : types) { dataTypeList.add(TSDataType.deserialize(dataType)); @@ -177,7 +173,7 @@ public class VectorMeasurementSchema } @Override - public List<TSEncoding> getValueTSEncodingList() { + public List<TSEncoding> getSubMeasurementsTSEncodingList() { List<TSEncoding> encodingList = new ArrayList<>(); for (byte encoding : encodings) { encodingList.add(TSEncoding.deserialize(encoding)); @@ -186,7 +182,7 @@ public class VectorMeasurementSchema } @Override - public List<Encoder> getValueEncoderList() { + public List<Encoder> getSubMeasurementsEncoderList() { List<Encoder> encoderList = new ArrayList<>(); for (int i = 0; i < encodings.length; i++) { TSEncoding encoding = TSEncoding.deserialize(encodings[i]); @@ -202,17 +198,17 @@ public class VectorMeasurementSchema } @Override - public int getMeasurementIdColumnIndex(String measurementId) { - return measurementsToIndexMap.get(measurementId); + public int getSubMeasurementColumnIndex(String measurementId) { + return subMeasurementsIndexMap.get(measurementId); } @Override public int serializeTo(ByteBuffer buffer) { int byteLen = 0; - byteLen += ReadWriteIOUtils.write(vectorMeausurementId, buffer); - byteLen += ReadWriteIOUtils.write(measurementsToIndexMap.size(), buffer); + byteLen += ReadWriteIOUtils.write(vectorMeasurementId, buffer); + byteLen += ReadWriteIOUtils.write(subMeasurementsIndexMap.size(), buffer); - for (Map.Entry<String, Integer> entry : measurementsToIndexMap.entrySet()) { + for (Map.Entry<String, Integer> entry : subMeasurementsIndexMap.entrySet()) { byteLen += ReadWriteIOUtils.write(entry.getKey(), buffer); byteLen += ReadWriteIOUtils.write(entry.getValue(), buffer); } @@ -230,10 +226,10 @@ public class VectorMeasurementSchema @Override public int serializeTo(OutputStream outputStream) throws IOException { int byteLen = 0; - byteLen += ReadWriteIOUtils.write(vectorMeausurementId, outputStream); - byteLen += ReadWriteIOUtils.write(measurementsToIndexMap.size(), outputStream); + byteLen += ReadWriteIOUtils.write(vectorMeasurementId, outputStream); + byteLen += ReadWriteIOUtils.write(subMeasurementsIndexMap.size(), outputStream); - for (Map.Entry<String, Integer> entry : measurementsToIndexMap.entrySet()) { + for (Map.Entry<String, Integer> entry : subMeasurementsIndexMap.entrySet()) { byteLen += ReadWriteIOUtils.write(entry.getKey(), outputStream); byteLen += ReadWriteIOUtils.write(entry.getValue(), outputStream); } @@ -267,7 +263,7 @@ public class VectorMeasurementSchema public static VectorMeasurementSchema deserializeFrom(InputStream inputStream) throws IOException { VectorMeasurementSchema vectorMeasurementSchema = new VectorMeasurementSchema(); - vectorMeasurementSchema.vectorMeausurementId = ReadWriteIOUtils.readString(inputStream); + vectorMeasurementSchema.vectorMeasurementId = ReadWriteIOUtils.readString(inputStream); int measurementSize = ReadWriteIOUtils.readInt(inputStream); Map<String, Integer> measurementsToIndexMap = new HashMap<>(); @@ -275,7 +271,7 @@ public class VectorMeasurementSchema measurementsToIndexMap.put( ReadWriteIOUtils.readString(inputStream), ReadWriteIOUtils.readInt(inputStream)); } - vectorMeasurementSchema.measurementsToIndexMap = measurementsToIndexMap; + vectorMeasurementSchema.subMeasurementsIndexMap = measurementsToIndexMap; byte[] types = new byte[measurementSize]; for (int i = 0; i < measurementSize; i++) { @@ -295,14 +291,14 @@ public class VectorMeasurementSchema public static VectorMeasurementSchema deserializeFrom(ByteBuffer buffer) { VectorMeasurementSchema vectorMeasurementSchema = new VectorMeasurementSchema(); - vectorMeasurementSchema.vectorMeausurementId = ReadWriteIOUtils.readString(buffer); + vectorMeasurementSchema.vectorMeasurementId = ReadWriteIOUtils.readString(buffer); int measurementSize = ReadWriteIOUtils.readInt(buffer); Map<String, Integer> measurementsToIndexMap = new HashMap<>(); for (int i = 0; i < measurementSize; i++) { measurementsToIndexMap.put( ReadWriteIOUtils.readString(buffer), ReadWriteIOUtils.readInt(buffer)); } - vectorMeasurementSchema.measurementsToIndexMap = measurementsToIndexMap; + vectorMeasurementSchema.subMeasurementsIndexMap = measurementsToIndexMap; byte[] types = new byte[measurementSize]; for (int i = 0; i < measurementSize; i++) { @@ -331,13 +327,13 @@ public class VectorMeasurementSchema VectorMeasurementSchema that = (VectorMeasurementSchema) o; return Arrays.equals(types, that.types) && Arrays.equals(encodings, that.encodings) - && Objects.equals(vectorMeausurementId, that.vectorMeausurementId) + && Objects.equals(vectorMeasurementId, that.vectorMeasurementId) && Objects.equals(compressor, that.compressor); } @Override public int hashCode() { - return Objects.hash(vectorMeausurementId, types, encodings, compressor); + return Objects.hash(vectorMeasurementId, types, encodings, compressor); } /** compare by vector name */ @@ -346,16 +342,16 @@ public class VectorMeasurementSchema if (equals(o)) { return 0; } else { - return this.vectorMeausurementId.compareTo(o.vectorMeausurementId); + return this.vectorMeasurementId.compareTo(o.vectorMeasurementId); } } @Override public String toString() { StringContainer sc = new StringContainer(""); - sc.addTail(vectorMeausurementId, ","); + sc.addTail(vectorMeasurementId, ","); // string is not in real order - for (Map.Entry<String, Integer> entry : measurementsToIndexMap.entrySet()) { + for (Map.Entry<String, Integer> entry : subMeasurementsIndexMap.entrySet()) { sc.addTail( "[", entry.getKey(), diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorMeasurementSchemaStub.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorMeasurementSchemaStub.java index d4fbef2..4763f22 100644 --- a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorMeasurementSchemaStub.java +++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorMeasurementSchemaStub.java @@ -79,22 +79,22 @@ public class VectorMeasurementSchemaStub implements IMeasurementSchema { } @Override - public List<String> getValueMeasurementIdList() { + public List<String> getSubMeasurementsList() { return Arrays.asList("s1", "s2", "s3"); } @Override - public List<TSDataType> getValueTSDataTypeList() { + public List<TSDataType> getSubMeasurementsTSDataTypeList() { return Arrays.asList(TSDataType.FLOAT, TSDataType.INT32, TSDataType.DOUBLE); } @Override - public List<TSEncoding> getValueTSEncodingList() { + public List<TSEncoding> getSubMeasurementsTSEncodingList() { return Arrays.asList(TSEncoding.PLAIN, TSEncoding.PLAIN, TSEncoding.PLAIN); } @Override - public List<Encoder> getValueEncoderList() { + public List<Encoder> getSubMeasurementsEncoderList() { return Arrays.asList( new PlainEncoder(TSDataType.FLOAT, 0), new PlainEncoder(TSDataType.INT32, 0), @@ -122,7 +122,7 @@ public class VectorMeasurementSchemaStub implements IMeasurementSchema { } @Override - public int getMeasurementIdColumnIndex(String measurementId) { + public int getSubMeasurementColumnIndex(String measurementId) { return 0; } }
