This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch new_vector in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 463cf70765a6c9dfd3ea72a8a2e87a01c233e261 Merge: 875816b 1e43fc7 Author: JackieTien97 <[email protected]> AuthorDate: Sun Nov 14 15:21:06 2021 +0800 fix conflicts .../cluster/query/fill/ClusterFillExecutor.java | 2 +- .../iotdb/cluster/query/reader/DataSourceInfo.java | 5 +- .../query/reader/mult/MultDataSourceInfo.java | 5 +- docs/Development/ContributeGuide.md | 2 +- pom.xml | 1 + .../WrappedSingleThreadScheduledExecutor.java | 17 ++ .../org/apache/iotdb/db/engine/StorageEngine.java | 5 - .../AbstractCrossSpaceCompactionSelector.java | 1 + .../AbstractInnerSpaceCompactionSelector.java | 1 + .../SizeTieredCompactionRecoverTask.java | 1 + .../compaction/task/AbstractCompactionTask.java | 1 + .../apache/iotdb/db/engine/flush/FlushManager.java | 1 + .../modification/utils/TracedBufferedReader.java | 8 + .../iotdb/db/metadata/mnode/IEntityMNode.java | 1 + .../iotdb/db/metadata/mnode/InternalMNode.java | 1 + .../iotdb/db/metadata/template/Template.java | 56 +++-- .../db/qp/physical/crud/CreateTemplatePlan.java | 103 ++++++++- .../db/qp/physical/crud/InsertMultiTabletPlan.java | 2 + .../physical/crud/InsertRowsOfOneDevicePlan.java | 1 + .../iotdb/db/qp/physical/crud/InsertRowsPlan.java | 1 + .../qp/physical/sys/CreateMultiTimeSeriesPlan.java | 1 + .../iotdb/db/qp/utils/EmptyOutputStream.java | 1 + .../iotdb/db/query/control/QueryFileManager.java | 38 +-- .../dataset/RawQueryDataSetWithValueFilter.java | 4 +- .../db/query/executor/AggregationExecutor.java | 6 +- .../iotdb/db/metadata/MManagerBasicTest.java | 1 + .../org/apache/iotdb/db/metadata/TemplateTest.java | 254 +++++++++++++++++++++ .../iotdb/db/metadata/mlog/MLogUpgraderTest.java | 72 ++++++ 28 files changed, 524 insertions(+), 68 deletions(-) diff --cc server/src/main/java/org/apache/iotdb/db/qp/physical/crud/CreateTemplatePlan.java index 0fd43b3,da7e7b3..24f2673 --- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/CreateTemplatePlan.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/CreateTemplatePlan.java @@@ -20,9 -20,10 +20,10 @@@ package org.apache.iotdb.db.qp.physical.crud; import org.apache.iotdb.db.exception.metadata.MetadataException; -import org.apache.iotdb.db.metadata.PartialPath; +import org.apache.iotdb.db.metadata.path.PartialPath; import org.apache.iotdb.db.qp.logical.Operator.OperatorType; import org.apache.iotdb.db.qp.physical.PhysicalPlan; + import org.apache.iotdb.db.utils.TestOnly; import org.apache.iotdb.tsfile.common.constant.TsFileConstant; import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; diff --cc server/src/main/java/org/apache/iotdb/db/query/dataset/RawQueryDataSetWithValueFilter.java index fdbd5c3,8289683..b0d9f5b --- a/server/src/main/java/org/apache/iotdb/db/query/dataset/RawQueryDataSetWithValueFilter.java +++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/RawQueryDataSetWithValueFilter.java @@@ -118,21 -118,14 +118,21 @@@ public class RawQueryDataSetWithValueFi // 3. use values in results to fill row record for (int j = 0; j < cachedTimeCnt; j++) { - if (results[j] == null) { + if (results == null || results[j] == null) { rowRecords[j].addField(null); } else { - hasField[j] = true; if (dataTypes.get(i) == TSDataType.VECTOR) { TsPrimitiveType[] result = (TsPrimitiveType[]) results[j]; - rowRecords[j].addField(result[0].getValue(), result[0].getDataType()); + for (TsPrimitiveType value : result) { + if (value == null) { + rowRecords[j].addField(null); + } else { + hasField[j] = true; + rowRecords[j].addField(value.getValue(), value.getDataType()); + } + } } else { + hasField[j] = true; rowRecords[j].addField(results[j], dataTypes.get(i)); } } diff --cc server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java index 23368ae,8549589..e4257c3 --- a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java +++ b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java @@@ -849,132 -858,7 +849,133 @@@ public class MManagerBasicTest } } + @Test + public void testTemplate() throws MetadataException { + CreateTemplatePlan plan = getCreateTemplatePlan(); + + MManager manager = IoTDB.metaManager; + manager.createSchemaTemplate(plan); + + // set device template + SetSchemaTemplatePlan setSchemaTemplatePlan = + new SetSchemaTemplatePlan("template1", "root.sg1.d1"); + + manager.setSchemaTemplate(setSchemaTemplatePlan); + + IMNode node = manager.getDeviceNode(new PartialPath("root.sg1.d1")); + node = manager.setUsingSchemaTemplate(node); + + UnaryMeasurementSchema s11 = + new UnaryMeasurementSchema("s11", TSDataType.INT64, TSEncoding.RLE, CompressionType.SNAPPY); + assertNotNull(node.getSchemaTemplate()); + + Set<IMeasurementSchema> allSchema = + new HashSet<>(node.getSchemaTemplate().getSchemaMap().values()); + for (MeasurementPath measurementPath : + manager.getMeasurementPaths(new PartialPath("root.sg1.d1.*"))) { + allSchema.remove(measurementPath.getMeasurementSchema()); + } + + assertTrue(allSchema.isEmpty()); + + IMeasurementMNode mNode = manager.getMeasurementMNode(new PartialPath("root.sg1.d1.s11")); + IMeasurementMNode mNode2 = + manager.getMeasurementMNode(new PartialPath("root.sg1.d1.vector.s2")); + assertNotNull(mNode); + assertEquals(mNode.getSchema(), s11); + assertNotNull(mNode2); + assertEquals( + mNode2.getSchema(), manager.getTemplate("template1").getSchemaMap().get("vector.s2")); + + try { + manager.getMeasurementMNode(new PartialPath("root.sg1.d1.s100")); + fail(); + } catch (PathNotExistException e) { + assertEquals("Path [root.sg1.d1.s100] does not exist", e.getMessage()); + } + } + + @Test + public void testTemplateInnerTree() { + CreateTemplatePlan plan = getTreeTemplatePlan(); + Template template; + MManager manager = IoTDB.metaManager; + + try { + manager.createSchemaTemplate(plan); + template = manager.getTemplate("treeTemplate"); + assertEquals(4, template.getMeasurementsCount()); + assertEquals("d1", template.getPathNodeInTemplate("d1").getName()); + assertNull(template.getPathNodeInTemplate("notExists")); + assertEquals("[GPS]", template.getAllAlignedPrefix().toString()); + + String[] alignedMeasurements = {"to.be.prefix.s1", "to.be.prefix.s2"}; + TSDataType[] dataTypes = {TSDataType.INT32, TSDataType.INT32}; + TSEncoding[] encodings = {TSEncoding.RLE, TSEncoding.RLE}; + CompressionType[] compressionTypes = {CompressionType.SNAPPY, CompressionType.SNAPPY}; + template.addAlignedMeasurements(alignedMeasurements, dataTypes, encodings, compressionTypes); + + assertEquals("[GPS, to.be.prefix]", template.getAllAlignedPrefix().toString()); + assertEquals("[s1, s2]", template.getAlignedMeasurements("to.be.prefix").toString()); + + template.deleteAlignedPrefix("to.be.prefix"); + + assertEquals("[GPS]", template.getAllAlignedPrefix().toString()); + assertEquals(null, template.getDirectNode("prefix")); + assertEquals("to", template.getDirectNode("to").getName()); + + try { + template.deleteMeasurements("a.single"); + fail(); + } catch (IllegalPathException e) { + assertEquals("a.single is not a legal path, because Path does not exist", e.getMessage()); + } + assertEquals( + "[d1.s1, GPS.x, to.be.prefix.s2, GPS.y, to.be.prefix.s1, s2]", + template.getAllMeasurementsPaths().toString()); + + template.deleteSeriesCascade("to"); + + assertEquals("[d1.s1, GPS.x, GPS.y, s2]", template.getAllMeasurementsPaths().toString()); + + } catch (MetadataException e) { + e.printStackTrace(); + } + } + + private CreateTemplatePlan getTreeTemplatePlan() { + /** + * Construct a template like: create schema template treeTemplate ( (d1.s1 INT32 GORILLA + * SNAPPY), (s2 INT32 GORILLA SNAPPY), (GPS.x FLOAT RLE SNAPPY), (GPS.y FLOAT RLE SNAPPY), )with + * aligned (GPS) + * + * <p>Check aligned path whether with same prefix? Construct tree + */ + List<List<String>> measurementList = new ArrayList<>(); + measurementList.add(Collections.singletonList("d1.s1")); + measurementList.add(Collections.singletonList("s2")); + measurementList.add(Arrays.asList("GPS.x", "GPS.y")); + + List<List<TSDataType>> dataTypeList = new ArrayList<>(); + dataTypeList.add(Collections.singletonList(TSDataType.INT32)); + dataTypeList.add(Collections.singletonList(TSDataType.INT32)); + dataTypeList.add(Arrays.asList(TSDataType.FLOAT, TSDataType.FLOAT)); + + List<List<TSEncoding>> encodingList = new ArrayList<>(); + encodingList.add(Collections.singletonList(TSEncoding.GORILLA)); + encodingList.add(Collections.singletonList(TSEncoding.GORILLA)); + encodingList.add(Arrays.asList(TSEncoding.RLE, TSEncoding.RLE)); + + List<List<CompressionType>> compressionTypes = new ArrayList<>(); + compressionTypes.add(Collections.singletonList(CompressionType.SDT)); + compressionTypes.add(Collections.singletonList(CompressionType.SNAPPY)); + compressionTypes.add(Arrays.asList(CompressionType.SNAPPY, CompressionType.SNAPPY)); + + return new CreateTemplatePlan( + "treeTemplate", measurementList, dataTypeList, encodingList, compressionTypes); + } + + @SuppressWarnings("Duplicates") private CreateTemplatePlan getCreateTemplatePlan() { List<List<String>> measurementList = new ArrayList<>(); measurementList.add(Collections.singletonList("s11")); diff --cc server/src/test/java/org/apache/iotdb/db/metadata/mlog/MLogUpgraderTest.java index 4f37ba3,e0b59c9..456a2a9 --- a/server/src/test/java/org/apache/iotdb/db/metadata/mlog/MLogUpgraderTest.java +++ b/server/src/test/java/org/apache/iotdb/db/metadata/mlog/MLogUpgraderTest.java @@@ -22,10 -22,12 +22,12 @@@ import org.apache.iotdb.db.conf.IoTDBDe import org.apache.iotdb.db.exception.metadata.MetadataException; import org.apache.iotdb.db.metadata.MManager; import org.apache.iotdb.db.metadata.MetadataConstant; -import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.metadata.logfile.MLogTxtWriter; import org.apache.iotdb.db.metadata.logfile.MLogUpgrader; +import org.apache.iotdb.db.metadata.path.PartialPath; import org.apache.iotdb.db.metadata.tag.TagLogFile; + import org.apache.iotdb.db.qp.physical.PhysicalPlan; + import org.apache.iotdb.db.qp.physical.crud.CreateTemplatePlan; import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan; import org.apache.iotdb.db.qp.physical.sys.ShowTimeSeriesPlan; import org.apache.iotdb.db.query.dataset.ShowTimeSeriesResult;
