blob: 4064376cd96f05059f4fcbc5ac752e3ad0fb5a4d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.iotdb.db.metadata.schemaRegion;
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.path.MeasurementPath;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.path.PathPatternTree;
import org.apache.iotdb.commons.schema.filter.SchemaFilterFactory;
import org.apache.iotdb.commons.schema.node.MNodeType;
import org.apache.iotdb.db.exception.metadata.AliasAlreadyExistException;
import org.apache.iotdb.db.exception.metadata.MeasurementAlreadyExistException;
import org.apache.iotdb.db.exception.metadata.PathAlreadyExistException;
import org.apache.iotdb.db.queryengine.common.schematree.ClusterSchemaTree;
import org.apache.iotdb.db.schemaengine.schemaregion.ISchemaRegion;
import org.apache.iotdb.db.schemaengine.schemaregion.read.resp.info.IDeviceSchemaInfo;
import org.apache.iotdb.db.schemaengine.schemaregion.read.resp.info.ITimeSeriesSchemaInfo;
import org.apache.iotdb.db.schemaengine.schemaregion.read.resp.info.impl.ShowDevicesResult;
import org.apache.iotdb.db.schemaengine.schemaregion.read.resp.info.impl.ShowNodesResult;
import org.apache.iotdb.db.schemaengine.schemaregion.write.req.SchemaRegionWritePlanFactory;
import org.apache.commons.lang3.StringUtils;
import org.apache.tsfile.enums.TSDataType;
import org.apache.tsfile.file.metadata.enums.CompressionType;
import org.apache.tsfile.file.metadata.enums.TSEncoding;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import static org.apache.iotdb.commons.schema.SchemaConstant.ALL_MATCH_PATTERN;
import static org.apache.iotdb.commons.schema.SchemaConstant.ALL_MATCH_SCOPE;
import static org.apache.iotdb.db.metadata.schemaRegion.SchemaRegionTestUtil.getAllTimeseriesCount;
import static org.apache.iotdb.db.metadata.schemaRegion.SchemaRegionTestUtil.getChildNodePathInNextLevel;
import static org.apache.iotdb.db.metadata.schemaRegion.SchemaRegionTestUtil.getDevicesNum;
import static org.apache.iotdb.db.metadata.schemaRegion.SchemaRegionTestUtil.getMeasurementCountGroupByLevel;
import static org.apache.iotdb.db.metadata.schemaRegion.SchemaRegionTestUtil.getNodesListInGivenLevel;
/**
* This class define test cases for {@link ISchemaRegion}. All test cases will be run in both Memory
* and PBTree modes. In PBTree mode, there are three kinds of test environment: full memory, partial
* memory and non memory.
*/
public class SchemaRegionBasicTest extends AbstractSchemaRegionTest {
public SchemaRegionBasicTest(SchemaRegionTestParams testParams) {
super(testParams);
}
@Test
@Ignore
public void testFetchSchemaPerfomance() throws Exception {
System.out.println(testParams.getTestModeName());
int deviceNum = 1000;
int measurementNum = 40;
ISchemaRegion schemaRegion = getSchemaRegion("root.sg", 0);
for (int i = 0; i < deviceNum; i++) {
for (int j = 0; j < measurementNum; j++) {
schemaRegion.createTimeseries(
SchemaRegionWritePlanFactory.getCreateTimeSeriesPlan(
new PartialPath("root.sg.d" + i + ".s" + j),
TSDataType.BOOLEAN,
TSEncoding.PLAIN,
CompressionType.SNAPPY,
null,
null,
null,
null),
-1);
}
}
PathPatternTree patternTree = new PathPatternTree();
for (int i = 0; i < deviceNum; i++) {
for (int j = 0; j < measurementNum; j++) {
patternTree.appendFullPath(new PartialPath("root.sg.d" + i + ".s" + j));
}
}
patternTree.constructTree();
schemaRegion.fetchSchema(patternTree, Collections.EMPTY_MAP, false, true);
long startTime;
startTime = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
schemaRegion.fetchSchema(patternTree, Collections.EMPTY_MAP, false, true);
}
System.out.println("cost time: " + (System.currentTimeMillis() - startTime));
}
@Test
public void testFetchSchema() throws Exception {
ISchemaRegion schemaRegion = getSchemaRegion("root.sg", 0);
schemaRegion.createTimeseries(
SchemaRegionWritePlanFactory.getCreateTimeSeriesPlan(
new PartialPath("root.sg.wf01.wt01.status"),
TSDataType.BOOLEAN,
TSEncoding.PLAIN,
CompressionType.SNAPPY,
null,
null,
null,
null),
-1);
schemaRegion.createTimeseries(
SchemaRegionWritePlanFactory.getCreateTimeSeriesPlan(
new PartialPath("root.sg.wf01.wt01.temperature"),
TSDataType.FLOAT,
TSEncoding.RLE,
CompressionType.GZIP,
null,
new HashMap<String, String>() {
{
put("tag1", "t1");
put("tag2", "t2");
}
},
new HashMap<String, String>() {
{
put("attr1", "a1");
put("attr2", "a2");
}
},
"temp"),
-1);
PathPatternTree patternTree = new PathPatternTree();
patternTree.appendPathPattern(new PartialPath("root.sg.wf01.wt01.*"));
patternTree.constructTree();
;
ClusterSchemaTree schemas =
schemaRegion.fetchSchema(patternTree, Collections.EMPTY_MAP, true, true);
List<MeasurementPath> measurementPaths =
schemas.searchMeasurementPaths(new PartialPath("root.sg.wf01.wt01.*")).left;
Assert.assertEquals(measurementPaths.size(), 2);
for (MeasurementPath measurementPath : measurementPaths) {
if (measurementPath.getFullPath().equals("root.sg.wf01.wt01.status")) {
Assert.assertTrue(StringUtils.isEmpty(measurementPath.getMeasurementAlias()));
Assert.assertEquals(0, measurementPath.getTagMap().size());
Assert.assertEquals(TSDataType.BOOLEAN, measurementPath.getMeasurementSchema().getType());
Assert.assertEquals(
TSEncoding.PLAIN, measurementPath.getMeasurementSchema().getEncodingType());
Assert.assertEquals(
CompressionType.SNAPPY, measurementPath.getMeasurementSchema().getCompressor());
} else if (measurementPath.getFullPath().equals("root.sg.wf01.wt01.temperature")) {
// only when user query with alias, the alias in path will be set
Assert.assertEquals("", measurementPath.getMeasurementAlias());
Assert.assertEquals(2, measurementPath.getTagMap().size());
Assert.assertEquals(TSDataType.FLOAT, measurementPath.getMeasurementSchema().getType());
Assert.assertEquals(
TSEncoding.RLE, measurementPath.getMeasurementSchema().getEncodingType());
Assert.assertEquals(
CompressionType.GZIP, measurementPath.getMeasurementSchema().getCompressor());
} else {
Assert.fail("Unexpected MeasurementPath " + measurementPath);
}
}
patternTree = new PathPatternTree();
patternTree.appendPathPattern(new PartialPath("root.sg.wf01.wt01.temp"));
patternTree.constructTree();
schemas = schemaRegion.fetchSchema(patternTree, Collections.EMPTY_MAP, false, true);
measurementPaths =
schemas.searchMeasurementPaths(new PartialPath("root.sg.wf01.wt01.temp")).left;
Assert.assertEquals(measurementPaths.size(), 1);
Assert.assertEquals("root.sg.wf01.wt01.temperature", measurementPaths.get(0).getFullPath());
Assert.assertEquals("temp", measurementPaths.get(0).getMeasurementAlias());
Assert.assertNull(measurementPaths.get(0).getTagMap());
Assert.assertEquals(TSDataType.FLOAT, measurementPaths.get(0).getMeasurementSchema().getType());
Assert.assertEquals(
TSEncoding.RLE, measurementPaths.get(0).getMeasurementSchema().getEncodingType());
Assert.assertEquals(
CompressionType.GZIP, measurementPaths.get(0).getMeasurementSchema().getCompressor());
}
@Test
public void testCreateAlignedTimeseries() throws Exception {
ISchemaRegion schemaRegion = getSchemaRegion("root.sg", 0);
schemaRegion.createAlignedTimeSeries(
SchemaRegionWritePlanFactory.getCreateAlignedTimeSeriesPlan(
new PartialPath("root.sg.wf02.wt01"),
Arrays.asList("temperature", "status"),
Arrays.asList(TSDataType.valueOf("FLOAT"), TSDataType.valueOf("INT32")),
Arrays.asList(TSEncoding.valueOf("RLE"), TSEncoding.valueOf("RLE")),
Arrays.asList(CompressionType.SNAPPY, CompressionType.SNAPPY),
null,
null,
null));
Map<Integer, MetadataException> checkRes =
schemaRegion.checkMeasurementExistence(
new PartialPath("root.sg.wf02.wt01"), Arrays.asList("temperature", "status"), null);
Assert.assertEquals(2, checkRes.size());
Assert.assertTrue(checkRes.get(0) instanceof MeasurementAlreadyExistException);
Assert.assertTrue(checkRes.get(1) instanceof MeasurementAlreadyExistException);
}
@Test
public void testCheckMeasurementExistence() throws Exception {
ISchemaRegion schemaRegion = getSchemaRegion("root.sg", 0);
schemaRegion.createTimeseries(
SchemaRegionWritePlanFactory.getCreateTimeSeriesPlan(
new PartialPath("root.sg.wf01.wt01.status"),
TSDataType.BOOLEAN,
TSEncoding.PLAIN,
CompressionType.SNAPPY,
null,
null,
null,
null),
-1);
schemaRegion.createTimeseries(
SchemaRegionWritePlanFactory.getCreateTimeSeriesPlan(
new PartialPath("root.sg.wf01.wt01.v1.s1"),
TSDataType.BOOLEAN,
TSEncoding.PLAIN,
CompressionType.SNAPPY,
null,
null,
null,
null),
-1);
schemaRegion.createTimeseries(
SchemaRegionWritePlanFactory.getCreateTimeSeriesPlan(
new PartialPath("root.sg.wf01.wt01.temperature"),
TSDataType.FLOAT,
TSEncoding.RLE,
CompressionType.GZIP,
null,
new HashMap<String, String>() {
{
put("tag1", "t1");
put("tag2", "t2");
}
},
new HashMap<String, String>() {
{
put("attr1", "a1");
put("attr2", "a2");
}
},
"temp"),
-1);
// all non exist
Map<Integer, MetadataException> res1 =
schemaRegion.checkMeasurementExistence(
new PartialPath("root.sg.wf01.wt01"),
IntStream.range(0, 5).mapToObj(i -> "s" + i).collect(Collectors.toList()),
IntStream.range(0, 5).mapToObj(i -> "alias" + i).collect(Collectors.toList()));
Assert.assertEquals(0, res1.size());
Map<Integer, MetadataException> res2 =
schemaRegion.checkMeasurementExistence(
new PartialPath("root.sg.wf01"),
Collections.singletonList("wt01"),
Collections.singletonList("alias1"));
Assert.assertEquals(0, res2.size());
// all exist
Map<Integer, MetadataException> res3 =
schemaRegion.checkMeasurementExistence(
new PartialPath("root.sg.wf01.wt01"),
Arrays.asList("status", "s1", "v1"),
Arrays.asList("", "temp", ""));
Assert.assertEquals(3, res3.size());
Assert.assertTrue(res3.get(0) instanceof MeasurementAlreadyExistException);
Assert.assertTrue(res3.get(1) instanceof AliasAlreadyExistException);
Assert.assertTrue(res3.get(2) instanceof PathAlreadyExistException);
}
/**
* Test {@link ISchemaRegion#constructSchemaBlackList}, {@link
* ISchemaRegion#rollbackSchemaBlackList}, {@link ISchemaRegion#fetchSchemaBlackList} and{@link
* ISchemaRegion#deleteTimeseriesInBlackList}
*/
@Test
public void testDeleteTimeseries() throws Exception {
ISchemaRegion schemaRegion = getSchemaRegion("root.sg", 0);
schemaRegion.createTimeseries(
SchemaRegionWritePlanFactory.getCreateTimeSeriesPlan(
new PartialPath("root.sg.wf01.wt01.status"),
TSDataType.BOOLEAN,
TSEncoding.PLAIN,
CompressionType.SNAPPY,
null,
null,
null,
null),
-1);
schemaRegion.createTimeseries(
SchemaRegionWritePlanFactory.getCreateTimeSeriesPlan(
new PartialPath("root.sg.wf01.wt02.status"),
TSDataType.BOOLEAN,
TSEncoding.PLAIN,
CompressionType.SNAPPY,
null,
null,
null,
null),
-1);
schemaRegion.createTimeseries(
SchemaRegionWritePlanFactory.getCreateTimeSeriesPlan(
new PartialPath("root.sg.wf01.wt01.temperature"),
TSDataType.FLOAT,
TSEncoding.RLE,
CompressionType.SNAPPY,
null,
null,
null,
null),
-1);
schemaRegion.createTimeseries(
SchemaRegionWritePlanFactory.getCreateTimeSeriesPlan(
new PartialPath("root.sg.wf02.wt01.temperature"),
TSDataType.FLOAT,
TSEncoding.RLE,
CompressionType.SNAPPY,
null,
null,
null,
null),
-1);
PathPatternTree patternTree = new PathPatternTree();
patternTree.appendPathPattern(new PartialPath("root.sg.wf01.wt01.*"));
patternTree.appendPathPattern(new PartialPath("root.sg.wf01.*.status"));
patternTree.appendPathPattern(new PartialPath("root.sg.wf02.wt01.temperature"));
patternTree.constructTree();
Assert.assertTrue(schemaRegion.constructSchemaBlackList(patternTree) >= 4);
Assert.assertEquals(
new HashSet<>(
Arrays.asList(
new PartialPath("root.sg.wf01.wt01.*"),
new PartialPath("root.sg.wf01.wt02.status"),
new PartialPath("root.sg.wf01.wt01.status"),
new PartialPath("root.sg.wf02.wt01.temperature"))),
schemaRegion.fetchSchemaBlackList(patternTree));
PathPatternTree rollbackTree = new PathPatternTree();
rollbackTree.appendPathPattern(new PartialPath("root.sg.wf02.wt01.temperature"));
rollbackTree.constructTree();
schemaRegion.rollbackSchemaBlackList(rollbackTree);
Assert.assertEquals(
new HashSet<>(
Arrays.asList(
new PartialPath("root.sg.wf01.wt01.*"),
new PartialPath("root.sg.wf01.wt02.status"),
new PartialPath("root.sg.wf01.wt01.status"))),
schemaRegion.fetchSchemaBlackList(patternTree));
schemaRegion.deleteTimeseriesInBlackList(patternTree);
List<MeasurementPath> schemas =
schemaRegion
.fetchSchema(ALL_MATCH_SCOPE, Collections.EMPTY_MAP, false, true)
.searchMeasurementPaths(ALL_MATCH_PATTERN)
.left;
Assert.assertEquals(1, schemas.size());
Assert.assertEquals("root.sg.wf02.wt01.temperature", schemas.get(0).getFullPath());
}
@Test
public void testGetAllTimeseriesCount() throws Exception {
ISchemaRegion schemaRegion = getSchemaRegion("root.laptop", 0);
SchemaRegionTestUtil.createSimpleTimeseriesByList(
schemaRegion,
Arrays.asList(
"root.laptop.d0",
"root.laptop.d1.s1",
"root.laptop.d1.s2.t1",
"root.laptop.d1.s3",
"root.laptop.d2.s1",
"root.laptop.d2.s2"));
// for Non prefix matched path
Assert.assertEquals(
6, getAllTimeseriesCount(schemaRegion, new PartialPath("root.**"), null, false));
Assert.assertEquals(
6, getAllTimeseriesCount(schemaRegion, new PartialPath("root.laptop.**"), null, false));
Assert.assertEquals(
1, getAllTimeseriesCount(schemaRegion, new PartialPath("root.laptop.*"), null, false));
Assert.assertEquals(
4, getAllTimeseriesCount(schemaRegion, new PartialPath("root.laptop.*.*"), null, false));
Assert.assertEquals(
5, getAllTimeseriesCount(schemaRegion, new PartialPath("root.laptop.*.**"), null, false));
Assert.assertEquals(
1, getAllTimeseriesCount(schemaRegion, new PartialPath("root.laptop.*.*.t1"), null, false));
Assert.assertEquals(
2, getAllTimeseriesCount(schemaRegion, new PartialPath("root.laptop.*.s1"), null, false));
Assert.assertEquals(
3, getAllTimeseriesCount(schemaRegion, new PartialPath("root.laptop.d1.**"), null, false));
Assert.assertEquals(
2, getAllTimeseriesCount(schemaRegion, new PartialPath("root.laptop.d1.*"), null, false));
Assert.assertEquals(
1, getAllTimeseriesCount(schemaRegion, new PartialPath("root.laptop.d2.s1"), null, false));
Assert.assertEquals(
2, getAllTimeseriesCount(schemaRegion, new PartialPath("root.laptop.d2.**"), null, false));
Assert.assertEquals(
0, getAllTimeseriesCount(schemaRegion, new PartialPath("root.laptop"), null, false));
Assert.assertEquals(
0, getAllTimeseriesCount(schemaRegion, new PartialPath("root.laptop.d3.s1"), null, false));
// for prefix matched path
Assert.assertEquals(
6, getAllTimeseriesCount(schemaRegion, new PartialPath("root"), null, true));
Assert.assertEquals(
6, getAllTimeseriesCount(schemaRegion, new PartialPath("root.laptop"), null, true));
Assert.assertEquals(
2, getAllTimeseriesCount(schemaRegion, new PartialPath("root.laptop.d2"), null, true));
}
@Test
public void testGetMeasurementCountGroupByLevel() throws Exception {
ISchemaRegion schemaRegion = getSchemaRegion("root.laptop", 0);
SchemaRegionTestUtil.createSimpleTimeseriesByList(
schemaRegion,
Arrays.asList(
"root.laptop.d0",
"root.laptop.d1.s1",
"root.laptop.d1.s2.t1",
"root.laptop.d1.s3",
"root.laptop.d2.s1",
"root.laptop.d2.s2"));
Map<PartialPath, Long> expected = new HashMap<>();
expected.put(new PartialPath("root"), (long) 6);
Assert.assertEquals(
expected,
getMeasurementCountGroupByLevel(schemaRegion, new PartialPath("root.**"), 0, false));
expected.clear();
expected.put(new PartialPath("root.laptop"), (long) 1);
Assert.assertEquals(
expected,
getMeasurementCountGroupByLevel(schemaRegion, new PartialPath("root.laptop.*"), 1, false));
expected.clear();
expected.put(new PartialPath("root.laptop.d0"), (long) 1);
Assert.assertEquals(
expected,
getMeasurementCountGroupByLevel(schemaRegion, new PartialPath("root.laptop.d0"), 2, false));
expected.clear();
expected.put(new PartialPath("root.laptop.d1"), (long) 2);
Assert.assertEquals(
expected,
getMeasurementCountGroupByLevel(
schemaRegion, new PartialPath("root.laptop.d1.*"), 2, false));
expected.clear();
expected.put(new PartialPath("root.laptop.d1"), (long) 3);
Assert.assertEquals(
expected,
getMeasurementCountGroupByLevel(
schemaRegion, new PartialPath("root.laptop.d1.**"), 2, false));
expected.clear();
expected.put(new PartialPath("root.laptop.d2"), (long) 2);
Assert.assertEquals(
expected,
getMeasurementCountGroupByLevel(
schemaRegion, new PartialPath("root.laptop.d2.*"), 2, false));
expected.clear();
expected.put(new PartialPath("root.laptop"), (long) 2);
Assert.assertEquals(
expected,
getMeasurementCountGroupByLevel(
schemaRegion, new PartialPath("root.laptop.*.s1"), 1, false));
expected.clear();
expected.put(new PartialPath("root.laptop.d1"), (long) 1);
expected.put(new PartialPath("root.laptop.d2"), (long) 1);
Assert.assertEquals(
expected,
getMeasurementCountGroupByLevel(
schemaRegion, new PartialPath("root.laptop.*.s1"), 2, false));
expected.clear();
expected.put(new PartialPath("root.laptop"), (long) 1);
Assert.assertEquals(
expected,
getMeasurementCountGroupByLevel(
schemaRegion, new PartialPath("root.laptop.*.s2"), 1, false));
expected.clear();
expected.put(new PartialPath("root.laptop.d1"), (long) 2);
expected.put(new PartialPath("root.laptop.d2"), (long) 2);
Assert.assertEquals(
expected,
getMeasurementCountGroupByLevel(
schemaRegion, new PartialPath("root.laptop.*.*"), 2, false));
expected.clear();
// for prefix matched path
expected.put(new PartialPath("root"), (long) 6);
Assert.assertEquals(
expected, getMeasurementCountGroupByLevel(schemaRegion, new PartialPath("root"), 0, true));
expected.clear();
expected.put(new PartialPath("root.laptop.d1"), (long) 3);
Assert.assertEquals(
expected,
getMeasurementCountGroupByLevel(schemaRegion, new PartialPath("root.laptop.d1"), 2, true));
expected.clear();
}
@Test
public void testGetDevicesNum() throws Exception {
ISchemaRegion schemaRegion = getSchemaRegion("root.laptop", 0);
SchemaRegionTestUtil.createSimpleTimeseriesByList(
schemaRegion,
Arrays.asList(
"root.laptop.d0",
"root.laptop.d1.s1",
"root.laptop.d1.s2.t1",
"root.laptop.d1.s3",
"root.laptop.d2.s1",
"root.laptop.d2.s2"));
Assert.assertEquals(4, getDevicesNum(schemaRegion, new PartialPath("root.**"), false));
Assert.assertEquals(1, getDevicesNum(schemaRegion, new PartialPath("root.laptop"), false));
Assert.assertEquals(2, getDevicesNum(schemaRegion, new PartialPath("root.laptop.*"), false));
Assert.assertEquals(0, getDevicesNum(schemaRegion, new PartialPath("root.laptop.d0"), false));
Assert.assertEquals(1, getDevicesNum(schemaRegion, new PartialPath("root.laptop.d1"), false));
Assert.assertEquals(
1, getDevicesNum(schemaRegion, new PartialPath("root.laptop.d1.s2"), false));
Assert.assertEquals(1, getDevicesNum(schemaRegion, new PartialPath("root.laptop.d2"), false));
Assert.assertEquals(2, getDevicesNum(schemaRegion, new PartialPath("root.laptop.d*"), false));
Assert.assertEquals(2, getDevicesNum(schemaRegion, new PartialPath("root.*.d*"), false));
Assert.assertEquals(1, getDevicesNum(schemaRegion, new PartialPath("root.**.s2"), false));
// for prefix matched path
Assert.assertEquals(4, getDevicesNum(schemaRegion, new PartialPath("root"), true));
Assert.assertEquals(4, getDevicesNum(schemaRegion, new PartialPath("root.laptop"), true));
Assert.assertEquals(3, getDevicesNum(schemaRegion, new PartialPath("root.laptop.d*"), true));
Assert.assertEquals(1, getDevicesNum(schemaRegion, new PartialPath("root.laptop.d1.*"), true));
}
@Test
public void testGetNodesListInGivenLevel() throws Exception {
ISchemaRegion schemaRegion = getSchemaRegion("root.laptop", 0);
SchemaRegionTestUtil.createSimpleTimeseriesByList(
schemaRegion,
Arrays.asList(
"root.laptop.d0",
"root.laptop.d1.s1",
"root.laptop.d1.s2.t1",
"root.laptop.d1.s3",
"root.laptop.d2.s1",
"root.laptop.d2.s2"));
Assert.assertEquals(
new LinkedList<>(Collections.singletonList(new PartialPath("root"))),
getNodesListInGivenLevel(schemaRegion, new PartialPath("root.**"), 0, false));
Assert.assertEquals(
new LinkedList<>(Collections.singletonList(new PartialPath("root.laptop"))),
getNodesListInGivenLevel(schemaRegion, new PartialPath("root.**"), 1, false));
Assert.assertEquals(
new LinkedList<>(Collections.singletonList(new PartialPath("root.laptop"))),
getNodesListInGivenLevel(schemaRegion, new PartialPath("root.laptop"), 1, false));
Assert.assertEquals(
new HashSet<>(
Arrays.asList(
new PartialPath("root.laptop.d0"),
new PartialPath("root.laptop.d1"),
new PartialPath("root.laptop.d2"))),
new HashSet<>(
getNodesListInGivenLevel(schemaRegion, new PartialPath("root.laptop.**"), 2, false)));
Assert.assertEquals(
new HashSet<>(
Arrays.asList(
new PartialPath("root.laptop.d1.s1"),
new PartialPath("root.laptop.d1.s2"),
new PartialPath("root.laptop.d1.s3"),
new PartialPath("root.laptop.d2.s1"),
new PartialPath("root.laptop.d2.s2"))),
new HashSet<>(
getNodesListInGivenLevel(schemaRegion, new PartialPath("root.laptop.**"), 3, false)));
Assert.assertEquals(
new HashSet<>(
Arrays.asList(
new PartialPath("root.laptop.d1.s1"), new PartialPath("root.laptop.d2.s1"))),
new HashSet<>(
getNodesListInGivenLevel(schemaRegion, new PartialPath("root.laptop.*.s1"), 3, false)));
// Empty return
Assert.assertEquals(
new HashSet<>(Collections.emptyList()),
new HashSet<>(
getNodesListInGivenLevel(
schemaRegion, new PartialPath("root.laptop.notExists"), 1, false)));
}
@Test
public void testGetChildNodePathInNextLevel() throws Exception {
ISchemaRegion schemaRegion = getSchemaRegion("root.laptop", 0);
SchemaRegionTestUtil.createSimpleTimeseriesByList(
schemaRegion,
Arrays.asList(
"root.laptop.d0",
"root.laptop.d1.s1",
"root.laptop.d1.s2.t1",
"root.laptop.d1.s3",
"root.laptop.d2.s1",
"root.laptop.d2.s2"));
Assert.assertEquals(
new HashSet<>(Collections.emptyList()),
getChildNodePathInNextLevel(schemaRegion, new PartialPath("root.laptop.d0")));
Assert.assertEquals(
new HashSet<>(
Arrays.asList(
new ShowNodesResult("root.laptop.d1.s1", MNodeType.MEASUREMENT),
new ShowNodesResult("root.laptop.d1.s2", MNodeType.DEVICE),
new ShowNodesResult("root.laptop.d1.s3", MNodeType.MEASUREMENT))),
getChildNodePathInNextLevel(schemaRegion, new PartialPath("root.laptop.d1")));
Assert.assertEquals(
new HashSet<>(
Arrays.asList(
new ShowNodesResult("root.laptop.d2.s1", MNodeType.MEASUREMENT),
new ShowNodesResult("root.laptop.d2.s2", MNodeType.MEASUREMENT))),
getChildNodePathInNextLevel(schemaRegion, new PartialPath("root.laptop.d2")));
Assert.assertEquals(
new HashSet<>(
Arrays.asList(
new ShowNodesResult("root.laptop.d0", MNodeType.MEASUREMENT),
new ShowNodesResult("root.laptop.d1", MNodeType.DEVICE),
new ShowNodesResult("root.laptop.d2", MNodeType.DEVICE))),
getChildNodePathInNextLevel(schemaRegion, new PartialPath("root.laptop")));
Assert.assertEquals(
new HashSet<>(
Collections.singletonList(
new ShowNodesResult("root.laptop.d1.s2.t1", MNodeType.MEASUREMENT))),
getChildNodePathInNextLevel(schemaRegion, new PartialPath("root.**.s2")));
}
@Test
public void testGetMatchedDevices() throws Exception {
ISchemaRegion schemaRegion = getSchemaRegion("root.laptop", 0);
SchemaRegionTestUtil.createSimpleTimeseriesByList(
schemaRegion,
Arrays.asList(
"root.laptop.d0",
"root.laptop.d1.s1",
"root.laptop.d1.s2.t1",
"root.laptop.d1.s3",
"root.laptop.d2.s1",
"root.laptop.d2.s2"));
// CASE 01. Query a timeseries, result should be empty set.
Assert.assertEquals(
Collections.emptyList(),
SchemaRegionTestUtil.getMatchedDevices(schemaRegion, new PartialPath("root.laptop.d0")));
// CASE 02. Query an existing device.
Assert.assertEquals(
Collections.singletonList(new ShowDevicesResult("root.laptop.d1", false, -1)),
SchemaRegionTestUtil.getMatchedDevices(schemaRegion, new PartialPath("root.laptop.d1")));
Assert.assertEquals(
Collections.singletonList(new ShowDevicesResult("root.laptop.d2", false, -1)),
SchemaRegionTestUtil.getMatchedDevices(schemaRegion, new PartialPath("root.laptop.d2")));
// CASE 03. Query an existing device, which has a sub device
Assert.assertEquals(
Collections.singletonList(new ShowDevicesResult("root.laptop", false, -1)),
SchemaRegionTestUtil.getMatchedDevices(schemaRegion, new PartialPath("root.laptop")));
// CASE 04. Query devices using '*'
Assert.assertEquals(
Collections.singletonList(new ShowDevicesResult("root.laptop", false, -1)),
SchemaRegionTestUtil.getMatchedDevices(schemaRegion, new PartialPath("root.*")));
// CASE 05. Query all devices using 'root.**'
List<IDeviceSchemaInfo> expectedList =
Arrays.asList(
new ShowDevicesResult("root.laptop", false, -1),
new ShowDevicesResult("root.laptop.d1", false, -1),
new ShowDevicesResult("root.laptop.d2", false, -1),
new ShowDevicesResult("root.laptop.d1.s2", false, -1));
List<IDeviceSchemaInfo> actualResult =
SchemaRegionTestUtil.getMatchedDevices(schemaRegion, new PartialPath("root.**"));
// Compare hash sets because the order does not matter.
HashSet<IDeviceSchemaInfo> expectedHashset = new HashSet<>(expectedList);
HashSet<IDeviceSchemaInfo> actualHashset = new HashSet<>(actualResult);
Assert.assertEquals(expectedHashset, actualHashset);
// CASE 06. show devices root.**.d*
expectedList =
Arrays.asList(
new ShowDevicesResult("root.laptop.d1", false, -1),
new ShowDevicesResult("root.laptop.d2", false, -1));
actualResult =
SchemaRegionTestUtil.getMatchedDevices(schemaRegion, new PartialPath("root.**.d*"));
// Compare hash sets because the order does not matter.
expectedHashset = new HashSet<>(expectedList);
actualHashset = new HashSet<>(actualResult);
Assert.assertEquals(expectedHashset, actualHashset);
// CASE 07. show devices root.** limit 3 offset 0
actualResult =
SchemaRegionTestUtil.getMatchedDevices(
schemaRegion, new PartialPath("root.**"), 3, 0, false);
Assert.assertEquals(3, actualResult.size());
// CASE 08. show devices root.** limit 3 offset 1
actualResult =
SchemaRegionTestUtil.getMatchedDevices(
schemaRegion, new PartialPath("root.**"), 3, 1, false);
Assert.assertEquals(3, actualResult.size());
// CASE 09. show devices root.** limit 3 offset 2
actualResult =
SchemaRegionTestUtil.getMatchedDevices(
schemaRegion, new PartialPath("root.**"), 3, 2, false);
Assert.assertEquals(2, actualResult.size());
// CASE 10. show devices root.** limit 3 offset 99
actualResult =
SchemaRegionTestUtil.getMatchedDevices(
schemaRegion, new PartialPath("root.**"), 3, 99, false);
Assert.assertEquals(0, actualResult.size());
// CASE 11. show devices root.** where device contains 'laptop'
expectedList =
Arrays.asList(
new ShowDevicesResult("root.laptop", false, -1),
new ShowDevicesResult("root.laptop.d1", false, -1),
new ShowDevicesResult("root.laptop.d1.s2", false, -1),
new ShowDevicesResult("root.laptop.d2", false, -1));
actualResult =
SchemaRegionTestUtil.getMatchedDevices(
schemaRegion,
new PartialPath("root.**"),
0,
0,
false,
SchemaFilterFactory.createPathContainsFilter("laptop"));
expectedHashset = new HashSet<>(expectedList);
actualHashset = new HashSet<>(actualResult);
Assert.assertEquals(expectedHashset, actualHashset);
// CASE 11. show devices root.** where device contains 'laptop.d' limit 2 offset 0
expectedList =
Arrays.asList(
new ShowDevicesResult("root.laptop.d1", false, -1),
new ShowDevicesResult("root.laptop.d1.s2", false, -1));
actualResult =
SchemaRegionTestUtil.getMatchedDevices(
schemaRegion,
new PartialPath("root.**"),
2,
0,
false,
SchemaFilterFactory.createPathContainsFilter("laptop.d"));
expectedHashset = new HashSet<>(expectedList);
actualHashset = new HashSet<>(actualResult);
Assert.assertEquals(expectedHashset, actualHashset);
}
@Test
public void testShowTimeseries() throws Exception {
ISchemaRegion schemaRegion = getSchemaRegion("root.laptop", 0);
SchemaRegionTestUtil.createSimpleTimeseriesByList(
schemaRegion,
Arrays.asList(
"root.laptop.d0",
"root.laptop.d1.s1",
"root.laptop.d1.s2.t1",
"root.laptop.d1.s3",
"root.laptop.d2.s1",
"root.laptop.d2.s2"));
// CASE 01: all timeseries
List<ITimeSeriesSchemaInfo> result =
SchemaRegionTestUtil.showTimeseries(schemaRegion, new PartialPath("root.**"));
Set<String> expectedPathList =
new HashSet<>(
Arrays.asList(
"root.laptop.d0",
"root.laptop.d1.s1",
"root.laptop.d1.s2.t1",
"root.laptop.d1.s3",
"root.laptop.d2.s1",
"root.laptop.d2.s2"));
int expectedSize = 6;
Assert.assertEquals(expectedSize, result.size());
Set<String> actualPathList = new HashSet<>();
for (int index = 0; index < expectedSize; index++) {
actualPathList.add(result.get(index).getFullPath());
}
Assert.assertEquals(expectedPathList, actualPathList);
// CASE 02: some timeseries, pattern "root.**.s*"
result = SchemaRegionTestUtil.showTimeseries(schemaRegion, new PartialPath("root.**.s*"));
expectedPathList =
new HashSet<>(
Arrays.asList(
"root.laptop.d1.s1",
"root.laptop.d1.s3",
"root.laptop.d2.s1",
"root.laptop.d2.s2"));
expectedSize = 4;
Assert.assertEquals(expectedSize, result.size());
actualPathList = new HashSet<>();
for (int index = 0; index < expectedSize; index++) {
actualPathList.add(result.get(index).getFullPath());
}
Assert.assertEquals(expectedPathList, actualPathList);
// CASE 03: show timeseries where path contains "s"
result =
SchemaRegionTestUtil.showTimeseries(
schemaRegion,
new PartialPath("root.**"),
Collections.emptyMap(),
0,
0,
false,
SchemaFilterFactory.createPathContainsFilter("s"),
false);
expectedPathList =
new HashSet<>(
Arrays.asList(
"root.laptop.d1.s1",
"root.laptop.d1.s2.t1",
"root.laptop.d1.s3",
"root.laptop.d2.s1",
"root.laptop.d2.s2"));
expectedSize = expectedPathList.size();
Assert.assertEquals(expectedSize, result.size());
actualPathList = new HashSet<>();
for (int index = 0; index < expectedSize; index++) {
actualPathList.add(result.get(index).getFullPath());
}
Assert.assertEquals(expectedPathList, actualPathList);
// CASE 04: show timeseries where path contains "1"
result =
SchemaRegionTestUtil.showTimeseries(
schemaRegion,
new PartialPath("root.**"),
Collections.emptyMap(),
0,
0,
false,
SchemaFilterFactory.createPathContainsFilter("1"),
false);
expectedPathList =
new HashSet<>(
Arrays.asList(
"root.laptop.d1.s1",
"root.laptop.d1.s2.t1",
"root.laptop.d1.s3",
"root.laptop.d2.s1"));
expectedSize = expectedPathList.size();
Assert.assertEquals(expectedSize, result.size());
actualPathList = new HashSet<>();
for (int index = 0; index < expectedSize; index++) {
actualPathList.add(result.get(index).getFullPath());
}
Assert.assertEquals(expectedPathList, actualPathList);
// CASE 05: show timeseries where path contains "laptop.d"
result =
SchemaRegionTestUtil.showTimeseries(
schemaRegion,
new PartialPath("root.**"),
Collections.emptyMap(),
0,
0,
false,
SchemaFilterFactory.createPathContainsFilter("laptop.d"),
false);
expectedPathList =
new HashSet<>(
Arrays.asList(
"root.laptop.d0",
"root.laptop.d1.s1",
"root.laptop.d1.s2.t1",
"root.laptop.d1.s3",
"root.laptop.d2.s1",
"root.laptop.d2.s2"));
expectedSize = expectedPathList.size();
Assert.assertEquals(expectedSize, result.size());
actualPathList = new HashSet<>();
for (int index = 0; index < expectedSize; index++) {
actualPathList.add(result.get(index).getFullPath());
}
Assert.assertEquals(expectedPathList, actualPathList);
// CASE 06: show timeseries where dataType=INT64
result =
SchemaRegionTestUtil.showTimeseries(
schemaRegion,
new PartialPath("root.**"),
Collections.emptyMap(),
0,
0,
false,
SchemaFilterFactory.createDataTypeFilter(TSDataType.INT64),
false);
expectedPathList =
new HashSet<>(
Arrays.asList(
"root.laptop.d0",
"root.laptop.d1.s1",
"root.laptop.d1.s2.t1",
"root.laptop.d1.s3",
"root.laptop.d2.s1",
"root.laptop.d2.s2"));
expectedSize = expectedPathList.size();
Assert.assertEquals(expectedSize, result.size());
actualPathList = new HashSet<>();
for (int index = 0; index < expectedSize; index++) {
actualPathList.add(result.get(index).getFullPath());
}
Assert.assertEquals(expectedPathList, actualPathList);
// CASE 07: show timeseries where dataType=BOOLEAN
result =
SchemaRegionTestUtil.showTimeseries(
schemaRegion,
new PartialPath("root.**"),
Collections.emptyMap(),
0,
0,
false,
SchemaFilterFactory.createDataTypeFilter(TSDataType.BOOLEAN),
false);
expectedPathList = new HashSet<>(Collections.emptyList());
expectedSize = expectedPathList.size();
Assert.assertEquals(expectedSize, result.size());
actualPathList = new HashSet<>();
for (int index = 0; index < expectedSize; index++) {
actualPathList.add(result.get(index).getFullPath());
}
Assert.assertEquals(expectedPathList, actualPathList);
}
@Test
public void testGetMatchedDevicesWithSpecialPattern() throws Exception {
ISchemaRegion schemaRegion = getSchemaRegion("root.test", 0);
SchemaRegionTestUtil.createSimpleTimeseriesByList(
schemaRegion,
Arrays.asList("root.test.d1.s", "root.test.dac.device1.s", "root.test.dac.device1.d1.s"));
List<IDeviceSchemaInfo> expectedList =
Arrays.asList(
new ShowDevicesResult("root.test.d1", false, -1),
new ShowDevicesResult("root.test.dac.device1", false, -1),
new ShowDevicesResult("root.test.dac.device1.d1", false, -1));
List<IDeviceSchemaInfo> actualResult =
SchemaRegionTestUtil.getMatchedDevices(schemaRegion, new PartialPath("root.**.d*"));
// Compare hash sets because the order does not matter.
Set<IDeviceSchemaInfo> expectedHashset = new HashSet<>(expectedList);
Set<IDeviceSchemaInfo> actualHashset = new HashSet<>(actualResult);
Assert.assertEquals(expectedHashset, actualHashset);
List<ITimeSeriesSchemaInfo> result =
SchemaRegionTestUtil.showTimeseries(schemaRegion, new PartialPath("root.**.d*.*"));
Set<String> expectedPathList =
new HashSet<>(
Arrays.asList(
"root.test.d1.s", "root.test.dac.device1.s", "root.test.dac.device1.d1.s"));
int expectedSize = 3;
Assert.assertEquals(expectedSize, result.size());
Set<String> actualPathList = new HashSet<>();
for (int index = 0; index < expectedSize; index++) {
actualPathList.add(result.get(index).getFullPath());
}
Assert.assertEquals(expectedPathList, actualPathList);
}
@Test
public void testGetMatchedDevicesWithSpecialPattern2() throws Exception {
ISchemaRegion schemaRegion = getSchemaRegion("root.test", 0);
SchemaRegionTestUtil.createSimpleTimeseriesByList(
schemaRegion,
Arrays.asList(
"root.test.abc57.bcde22.def89.efg1",
"root.test.abc57.bcde22.def89.efg2",
"root.test.abc57.bcd22.def89.efg1",
"root.test.abc57.bcd22.def89.efg2"));
// case1: show devices root.**.*b*.*
List<IDeviceSchemaInfo> expectedList =
Arrays.asList(
new ShowDevicesResult("root.test.abc57.bcde22.def89", false, -1),
new ShowDevicesResult("root.test.abc57.bcd22.def89", false, -1));
List<IDeviceSchemaInfo> actualResult =
SchemaRegionTestUtil.getMatchedDevices(schemaRegion, new PartialPath("root.**.*b*.*"));
// Compare hash sets because the order does not matter.
Set<IDeviceSchemaInfo> expectedHashset = new HashSet<>(expectedList);
Set<IDeviceSchemaInfo> actualHashset = new HashSet<>(actualResult);
Assert.assertEquals(expectedHashset, actualHashset);
// case2: show timeseries root.**.*e*.*e*
List<ITimeSeriesSchemaInfo> result =
SchemaRegionTestUtil.showTimeseries(schemaRegion, new PartialPath("root.**.*e*.*e*"));
Set<String> expectedPathList =
new HashSet<>(
Arrays.asList(
"root.test.abc57.bcde22.def89.efg1",
"root.test.abc57.bcde22.def89.efg2",
"root.test.abc57.bcd22.def89.efg1",
"root.test.abc57.bcd22.def89.efg2"));
int expectedSize = expectedPathList.size();
Assert.assertEquals(expectedSize, result.size());
Set<String> actualPathList = new HashSet<>();
for (int index = 0; index < expectedSize; index++) {
actualPathList.add(result.get(index).getFullPath());
}
Assert.assertEquals(expectedPathList, actualPathList);
// case3: show timeseries root.**.*e*
result = SchemaRegionTestUtil.showTimeseries(schemaRegion, new PartialPath("root.**.*e*"));
Assert.assertEquals(expectedSize, result.size());
actualPathList = new HashSet<>();
for (int index = 0; index < expectedSize; index++) {
actualPathList.add(result.get(index).getFullPath());
}
Assert.assertEquals(expectedPathList, actualPathList);
}
}