This is an automated email from the ASF dual-hosted git repository.
qiaojialin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 516bf65 [IOTDB-1361] Support delete an aligned timeseries (#4166)
516bf65 is described below
commit 516bf6588d18a58deb2088524cd042f1e938cc64
Author: Marcos_Zyk <[email protected]>
AuthorDate: Wed Oct 20 17:24:48 2021 +0800
[IOTDB-1361] Support delete an aligned timeseries (#4166)
---
.../apache/iotdb/cluster/metadata/CMManager.java | 18 ++---
.../iotdb/cluster/query/LocalQueryExecutor.java | 3 +-
.../iotdb/db/engine/memtable/AbstractMemTable.java | 16 +----
.../iotdb/db/engine/merge/recover/LogAnalyzer.java | 2 +-
.../org/apache/iotdb/db/metadata/MManager.java | 79 ++++++++++-----------
.../org/apache/iotdb/db/metadata/PartialPath.java | 18 ++++-
.../iotdb/db/metadata/mnode/IEntityMNode.java | 19 -----
.../org/apache/iotdb/db/metadata/mnode/IMNode.java | 4 +-
.../iotdb/db/metadata/mnode/InternalMNode.java | 13 ----
.../org/apache/iotdb/db/metadata/mnode/MNode.java | 10 +++
.../mnode/{IEntityMNode.java => MNodeUtils.java} | 58 +++++++++-------
.../iotdb/db/metadata/mnode/MeasurementMNode.java | 5 --
.../org/apache/iotdb/db/metadata/mtree/MTree.java | 80 ++++++++++++++--------
.../apache/iotdb/db/metadata/utils/MetaUtils.java | 11 ---
.../apache/iotdb/db/qp/executor/PlanExecutor.java | 9 +--
.../iotdb/db/qp/logical/crud/QueryOperator.java | 2 +-
.../qp/strategy/optimizer/ConcatPathOptimizer.java | 2 +-
.../apache/iotdb/db/qp/utils/WildcardsRemover.java | 2 +-
.../org/apache/iotdb/db/service/TSServiceImpl.java | 2 +-
.../iotdb/db/metadata/MManagerAdvancedTest.java | 12 ++--
.../iotdb/db/metadata/MManagerBasicTest.java | 40 ++++++++---
.../org/apache/iotdb/db/metadata/MTreeTest.java | 18 ++---
.../apache/iotdb/db/metadata/PartialPathTest.java | 7 ++
.../apache/iotdb/session/IoTDBSessionSimpleIT.java | 3 +-
24 files changed, 232 insertions(+), 201 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 f28308d..bca7810 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
@@ -171,11 +171,11 @@ public class CMManager extends MManager {
}
@Override
- public String deleteTimeseries(PartialPath prefixPath) throws
MetadataException {
+ public String deleteTimeseries(PartialPath pathPattern) throws
MetadataException {
cacheLock.writeLock().lock();
- mRemoteMetaCache.removeItem(prefixPath);
+ mRemoteMetaCache.removeItem(pathPattern);
cacheLock.writeLock().unlock();
- return super.deleteTimeseries(prefixPath);
+ return super.deleteTimeseries(pathPattern);
}
@Override
@@ -751,7 +751,7 @@ public class CMManager extends MManager {
throws IllegalPathException {
List<String> measurements = new ArrayList<>();
for (String series : seriesList) {
- measurements.addAll(MetaUtils.getMeasurementsInPartialPath(new
PartialPath(series)));
+ measurements.add((new PartialPath(series)).getMeasurement());
}
List<TSDataType> dataTypes = new ArrayList<>(measurements.size());
@@ -1019,9 +1019,9 @@ public class CMManager extends MManager {
private List<PartialPath> getMatchedPathsLocally(PartialPath partialPath,
boolean withAlias)
throws MetadataException {
if (!withAlias) {
- return getAllTimeseriesPath(partialPath);
+ return getFlatMeasurementPaths(partialPath);
} else {
- return super.getAllTimeseriesPathWithAlias(partialPath, -1, -1).left;
+ return super.getFlatMeasurementPathsWithAlias(partialPath, -1, -1).left;
}
}
@@ -1222,7 +1222,7 @@ public class CMManager extends MManager {
/** Similar to method getAllTimeseriesPath(), but return Path with alias
alias. */
@Override
- public Pair<List<PartialPath>, Integer> getAllTimeseriesPathWithAlias(
+ public Pair<List<PartialPath>, Integer> getFlatMeasurementPathsWithAlias(
PartialPath pathPattern, int limit, int offset) throws MetadataException
{
Map<String, String> sgPathMap = groupPathByStorageGroup(pathPattern);
List<PartialPath> result = getMatchedPaths(sgPathMap, true);
@@ -1305,7 +1305,7 @@ public class CMManager extends MManager {
public List<String> getAllPaths(List<String> paths) throws MetadataException
{
List<String> ret = new ArrayList<>();
for (String path : paths) {
- getAllTimeseriesPath(new PartialPath(path)).stream()
+ getFlatMeasurementPaths(new PartialPath(path)).stream()
.map(PartialPath::getFullPath)
.forEach(ret::add);
}
@@ -1721,7 +1721,7 @@ public class CMManager extends MManager {
if (withAlias) {
for (String path : paths) {
List<PartialPath> allTimeseriesPathWithAlias =
- super.getAllTimeseriesPathWithAlias(new PartialPath(path), -1,
-1).left;
+ super.getFlatMeasurementPathsWithAlias(new PartialPath(path), -1,
-1).left;
for (PartialPath timeseriesPathWithAlias : allTimeseriesPathWithAlias)
{
retPaths.add(timeseriesPathWithAlias.getFullPath());
alias.add(timeseriesPathWithAlias.getMeasurementAlias());
diff --git
a/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java
b/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java
index 571d1c3..7300827 100644
---
a/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java
+++
b/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java
@@ -778,7 +778,8 @@ public class LocalQueryExecutor {
List<String> result = new ArrayList<>();
for (String seriesPath : timeseriesList) {
try {
- List<PartialPath> path = getCMManager().getAllTimeseriesPath(new
PartialPath(seriesPath));
+ List<PartialPath> path =
+ getCMManager().getFlatMeasurementPaths(new
PartialPath(seriesPath));
if (path.size() != 1) {
throw new MetadataException(
String.format("Timeseries number of the name [%s] is not 1.",
seriesPath));
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 58501a9..cbbf421 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
@@ -24,7 +24,6 @@ import org.apache.iotdb.db.exception.WriteProcessException;
import org.apache.iotdb.db.exception.query.QueryProcessException;
import org.apache.iotdb.db.metadata.PartialPath;
import org.apache.iotdb.db.metadata.mnode.IMeasurementMNode;
-import org.apache.iotdb.db.metadata.utils.MetaUtils;
import org.apache.iotdb.db.qp.physical.crud.InsertRowPlan;
import org.apache.iotdb.db.qp.physical.crud.InsertTabletPlan;
import org.apache.iotdb.db.rescon.TVListAllocator;
@@ -365,26 +364,17 @@ public abstract class AbstractMemTable implements
IMemTable {
while (iter.hasNext()) {
Entry<String, IWritableMemChunk> entry = iter.next();
IWritableMemChunk chunk = entry.getValue();
+ // the key is measurement rather than component of multiMeasurement
PartialPath fullPath = devicePath.concatNode(entry.getKey());
- IMeasurementSchema schema = chunk.getSchema();
if (originalPath.matchFullPath(fullPath)) {
+ // matchFullPath ensures this branch could work on delete data of
unary or multi measurement
+ // and delete timeseries or aligned timeseries
if (startTimestamp == Long.MIN_VALUE && endTimestamp ==
Long.MAX_VALUE) {
iter.remove();
}
int deletedPointsNumber = chunk.delete(startTimestamp, endTimestamp);
totalPointsNum -= deletedPointsNumber;
}
- // for vector type
- else if (schema.getType() == TSDataType.VECTOR) {
- List<String> measurements =
MetaUtils.getMeasurementsInPartialPath(originalPath);
- if (measurements.containsAll(schema.getSubMeasurementsList())) {
- if (startTimestamp == Long.MIN_VALUE && endTimestamp ==
Long.MAX_VALUE) {
- iter.remove();
- }
- int deletedPointsNumber = chunk.delete(startTimestamp, endTimestamp);
- totalPointsNum -= deletedPointsNumber;
- }
- }
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/merge/recover/LogAnalyzer.java
b/server/src/main/java/org/apache/iotdb/db/engine/merge/recover/LogAnalyzer.java
index 9693d3c..61cea2d 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/merge/recover/LogAnalyzer.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/merge/recover/LogAnalyzer.java
@@ -103,7 +103,7 @@ public class LogAnalyzer {
analyzeUnseqFiles(bufferedReader);
List<PartialPath> storageGroupPaths =
- IoTDB.metaManager.getAllTimeseriesPath(new
PartialPath(storageGroupName + ".*"));
+ IoTDB.metaManager.getFlatMeasurementPaths(new
PartialPath(storageGroupName + ".*"));
unmergedPaths = new ArrayList<>();
unmergedPaths.addAll(storageGroupPaths);
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 bc9e520..153fcbf 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
@@ -24,7 +24,6 @@ import org.apache.iotdb.db.engine.StorageEngine;
import org.apache.iotdb.db.engine.fileSystem.SystemFileFactory;
import org.apache.iotdb.db.engine.trigger.executor.TriggerEngine;
import org.apache.iotdb.db.exception.metadata.AliasAlreadyExistException;
-import org.apache.iotdb.db.exception.metadata.AlignedTimeseriesException;
import org.apache.iotdb.db.exception.metadata.DataTypeMismatchException;
import org.apache.iotdb.db.exception.metadata.DeleteFailedException;
import org.apache.iotdb.db.exception.metadata.MNodeTypeMismatchException;
@@ -619,36 +618,23 @@ public class MManager {
}
/**
- * Delete all timeseries matching the given path pattern, may cross
different storage group
+ * Delete all timeseries matching the given path pattern, may cross
different storage group The
+ * given pathPattern only match measurement but not flat measurement. For
example, given MTree:
+ * root.sg.d.vector(s1, s2), root.sg.d.s2; give pathPattern root.**.s2 and
then only root.sg.d.s2
+ * will be deleted; give pathPattern like root.sg.d.* or root.sg.d.vector
and then the deletion
+ * will work on root.sg.d.vector(s1, s2)
*
- * @param prefixPath path to be deleted, could be root or a prefix path or a
full path
+ * @param pathPattern path to be deleted
* @return deletion failed Timeseries
*/
- public String deleteTimeseries(PartialPath prefixPath) throws
MetadataException {
- if (isStorageGroup(prefixPath)) {
- mNodeCache.clear();
- }
+ public String deleteTimeseries(PartialPath pathPattern) throws
MetadataException {
try {
- List<PartialPath> allTimeseries = mtree.getAllTimeseriesPath(prefixPath);
+ List<PartialPath> allTimeseries = mtree.getMeasurementPaths(pathPattern);
if (allTimeseries.isEmpty()) {
- throw new PathNotExistException(prefixPath.getFullPath());
- }
-
- // for not support deleting part of aligned timeseies
- // should be removed after partial deletion is supported
- IMNode lastNode = mtree.getNodeByPath(allTimeseries.get(0));
- if (lastNode.isMeasurement()) {
- IMeasurementMNode measurementMNode = lastNode.getAsMeasurementMNode();
- if (measurementMNode.isMultiMeasurement()) {
- if
(measurementMNode.getAsMultiMeasurementMNode().getSubMeasurementList().size()
- != allTimeseries.size()) {
- throw new AlignedTimeseriesException(
- "Not support deleting part of aligned timeseies!",
prefixPath.getFullPath());
- } else {
- allTimeseries.clear();
- allTimeseries.add(lastNode.getPartialPath());
- }
- }
+ throw new MetadataException(
+ String.format(
+ "No matched timeseries or aligned timeseries for Path [%s]",
+ pathPattern.getFullPath()));
}
// Monitor storage group seriesPath is not allowed to be deleted
@@ -705,8 +691,17 @@ public class MManager {
// drop trigger with no exceptions
TriggerEngine.drop(pair.right);
- // TODO: delete the path node and all its ancestors
- mNodeCache.clear();
+ IMNode node = measurementMNode.getParent();
+
+ if (node.isUseTemplate() &&
node.getSchemaTemplate().hasSchema(measurementMNode.getName())) {
+ // measurement represent by template doesn't affect the MTree structure
and memory control
+ return storageGroupPath;
+ }
+
+ while (node.isEmptyInternal()) {
+ mNodeCache.removeObject(node.getPartialPath());
+ node = node.getParent();
+ }
totalSeriesNumber.addAndGet(-timeseriesNum);
if (!allowToCreateNewSeries
&& totalSeriesNumber.get() * ESTIMATED_SERIES_SIZE <
MTREE_SIZE_THRESHOLD) {
@@ -1111,22 +1106,24 @@ public class MManager {
}
/**
- * Return all paths for given path if the path is abstract. Or return the
path itself. Regular
- * expression in this method is formed by the amalgamation of seriesPath and
the character '*'.
+ * Return all flat measurement paths for given path if the path is abstract.
Or return the path
+ * itself. Regular expression in this method is formed by the amalgamation
of seriesPath and the
+ * character '*'.
*
* @param pathPattern can be a pattern or a full path of timeseries.
*/
- public List<PartialPath> getAllTimeseriesPath(PartialPath pathPattern)
throws MetadataException {
- return mtree.getAllTimeseriesPath(pathPattern);
+ public List<PartialPath> getFlatMeasurementPaths(PartialPath pathPattern)
+ throws MetadataException {
+ return mtree.getFlatMeasurementPaths(pathPattern);
}
/**
* Similar to method getAllTimeseriesPath(), but return Path with alias and
filter the result by
* limit and offset.
*/
- public Pair<List<PartialPath>, Integer> getAllTimeseriesPathWithAlias(
+ public Pair<List<PartialPath>, Integer> getFlatMeasurementPathsWithAlias(
PartialPath pathPattern, int limit, int offset) throws MetadataException
{
- return mtree.getAllTimeseriesPathWithAlias(pathPattern, limit, offset);
+ return mtree.getFlatMeasurementPathsWithAlias(pathPattern, limit, offset);
}
public List<ShowTimeSeriesResult> showTimeseries(ShowTimeSeriesPlan plan,
QueryContext context)
@@ -1194,9 +1191,9 @@ public class MManager {
ShowTimeSeriesPlan plan, QueryContext context) throws MetadataException {
List<Pair<PartialPath, String[]>> ans;
if (plan.isOrderByHeat()) {
- ans = mtree.getAllMeasurementSchemaByHeatOrder(plan, context);
+ ans = mtree.getAllFlatMeasurementSchemaByHeatOrder(plan, context);
} else {
- ans = mtree.getAllMeasurementSchema(plan);
+ ans = mtree.getAllFlatMeasurementSchema(plan);
}
List<ShowTimeSeriesResult> res = new LinkedList<>();
for (Pair<PartialPath, String[]> ansString : ans) {
@@ -1276,7 +1273,7 @@ public class MManager {
* @return MeasurementSchema or VectorMeasurementSchema
*/
public IMeasurementSchema getSeriesSchema(PartialPath fullPath) throws
MetadataException {
- IMeasurementMNode leaf = mtree.getMeasurementMNode(fullPath);
+ IMeasurementMNode leaf = getMeasurementMNode(fullPath);
return getSeriesSchema(fullPath, leaf);
}
@@ -1375,7 +1372,7 @@ public class MManager {
IMeasurementMNode[] mNodes = new IMeasurementMNode[measurements.length];
for (int i = 0; i < mNodes.length; i++) {
try {
- mNodes[i] =
mtree.getMeasurementMNode(deviceId.concatNode(measurements[i]));
+ mNodes[i] = getMeasurementMNode(deviceId.concatNode(measurements[i]));
} catch (PathNotExistException | MNodeTypeMismatchException ignored) {
logger.warn("MeasurementMNode {} does not exist in {}",
measurements[i], deviceId);
}
@@ -1698,7 +1695,7 @@ public class MManager {
Long latestFlushedTime) {
IMeasurementMNode node;
try {
- node = mtree.getMeasurementMNode(seriesPath);
+ node = getMeasurementMNode(seriesPath);
} catch (MetadataException e) {
logger.warn("failed to update last cache for the {}, err:{}",
seriesPath, e.getMessage());
return;
@@ -1768,7 +1765,7 @@ public class MManager {
public TimeValuePair getLastCache(PartialPath seriesPath) {
IMeasurementMNode node;
try {
- node = mtree.getMeasurementMNode(seriesPath);
+ node = getMeasurementMNode(seriesPath);
} catch (MetadataException e) {
logger.warn("failed to get last cache for the {}, err:{}", seriesPath,
e.getMessage());
return null;
@@ -1814,7 +1811,7 @@ public class MManager {
public void resetLastCache(PartialPath seriesPath) {
IMeasurementMNode node;
try {
- node = mtree.getMeasurementMNode(seriesPath);
+ node = getMeasurementMNode(seriesPath);
} catch (MetadataException e) {
logger.warn("failed to reset last cache for the {}, err:{}", seriesPath,
e.getMessage());
return;
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/PartialPath.java
b/server/src/main/java/org/apache/iotdb/db/metadata/PartialPath.java
index 04f6abc..c052161 100755
--- a/server/src/main/java/org/apache/iotdb/db/metadata/PartialPath.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/PartialPath.java
@@ -128,14 +128,26 @@ public class PartialPath extends Path implements
Comparable<Path> {
}
/**
- * Construct a new PartialPath by resetting the prefix nodes to prefixPath
+ * Construct a new PartialPath by resetting the prefix nodes with
prefixPath. If the prefix nodes
+ * contains **, then the prefixPath will be set before **. For example, give
this = root.**.d and
+ * prefixPath = root.a.sg, then the result will be root.a.sg.**.d
*
* @param prefixPath the prefix path used to replace current nodes
* @return A new PartialPath with altered prefix
*/
public PartialPath alterPrefixPath(PartialPath prefixPath) {
- String[] newNodes = Arrays.copyOf(nodes, Math.max(nodes.length,
prefixPath.getNodeLength()));
- System.arraycopy(prefixPath.getNodes(), 0, newNodes, 0,
prefixPath.getNodeLength());
+ int newLength = Math.max(nodes.length, prefixPath.getNodeLength());
+ int startIndex = Math.min(nodes.length, prefixPath.getNodeLength());
+ for (int i = 0; i < startIndex; i++) {
+ if (nodes[i].equals(MULTI_LEVEL_PATH_WILDCARD)) {
+ newLength += startIndex - i;
+ startIndex = i;
+ break;
+ }
+ }
+ String[] newNodes = Arrays.copyOf(prefixPath.getNodes(), newLength);
+ System.arraycopy(
+ nodes, startIndex, newNodes, prefixPath.getNodeLength(), nodes.length
- startIndex);
return new PartialPath(newNodes);
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IEntityMNode.java
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IEntityMNode.java
index dc23d7b..a77abe62 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IEntityMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IEntityMNode.java
@@ -39,23 +39,4 @@ public interface IEntityMNode extends IMNode {
ILastCacheContainer getLastCacheContainer(String measurementId);
Map<String, ILastCacheContainer> getTemplateLastCaches();
-
- static IEntityMNode setToEntity(IMNode node) {
- IEntityMNode entityMNode;
- if (node.isEntity()) {
- entityMNode = node.getAsEntityMNode();
- } else {
- if (node.isStorageGroup()) {
- entityMNode =
- new StorageGroupEntityMNode(
- node.getParent(), node.getName(), ((StorageGroupMNode)
node).getDataTTL());
- } else {
- entityMNode = new EntityMNode(node.getParent(), node.getName());
- }
- if (node.getParent() != null) {
- node.getParent().replaceChild(node.getName(), entityMNode);
- }
- }
- return entityMNode;
- }
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
index 9b0c3f2..dbbd02a 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
@@ -67,7 +67,9 @@ public interface IMNode extends Serializable {
void setSchemaTemplate(Template schemaTemplate);
- int getMeasurementMNodeCount();
+ // EmptyInternal means there's no child or template under this node
+ // and this node is not the root nor a storageGroup nor a measurement.
+ boolean isEmptyInternal();
boolean isStorageGroup();
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
index c6585cf..4a07b53 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
@@ -212,19 +212,6 @@ public class InternalMNode extends MNode {
this.schemaTemplate = schemaTemplate;
}
- /** get the count of all MeasurementMNode whose ancestor is current node */
- @Override
- public int getMeasurementMNodeCount() {
- if (children == null) {
- return 0;
- }
- int measurementMNodeCount = 0;
- for (IMNode child : children.values()) {
- measurementMNodeCount += child.getMeasurementMNodeCount();
- }
- return measurementMNodeCount;
- }
-
@Override
public void serializeTo(MLogWriter logWriter) throws IOException {
serializeChildren(logWriter);
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
index bf0240f..9f6e075 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
@@ -122,6 +122,16 @@ public abstract class MNode implements IMNode {
}
@Override
+ public boolean isEmptyInternal() {
+ return !IoTDBConstant.PATH_ROOT.equals(name)
+ && !isStorageGroup()
+ && !isMeasurement()
+ && getSchemaTemplate() == null
+ && !isUseTemplate()
+ && getChildren().size() == 0;
+ }
+
+ @Override
public boolean isUseTemplate() {
return false;
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IEntityMNode.java
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNodeUtils.java
similarity index 50%
copy from
server/src/main/java/org/apache/iotdb/db/metadata/mnode/IEntityMNode.java
copy to server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNodeUtils.java
index dc23d7b..0e41f28 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IEntityMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNodeUtils.java
@@ -18,29 +18,17 @@
*/
package org.apache.iotdb.db.metadata.mnode;
-import org.apache.iotdb.db.metadata.lastCache.container.ILastCacheContainer;
+public class MNodeUtils {
-import java.util.Map;
-
-public interface IEntityMNode extends IMNode {
-
- boolean addAlias(String alias, IMeasurementMNode child);
-
- void deleteAliasChild(String alias);
-
- Map<String, IMeasurementMNode> getAliasChildren();
-
- void setAliasChildren(Map<String, IMeasurementMNode> aliasChildren);
-
- boolean isUseTemplate();
-
- void setUseTemplate(boolean useTemplate);
-
- ILastCacheContainer getLastCacheContainer(String measurementId);
-
- Map<String, ILastCacheContainer> getTemplateLastCaches();
-
- static IEntityMNode setToEntity(IMNode node) {
+ /**
+ * When a measurement, represented by template or MeasurementMNode, is going
to be added to a
+ * node, the node should be set to entity. Before invoking this method, lock
the related MTree
+ * part first.
+ *
+ * @param node node to be transformed
+ * @return generated entityMNode
+ */
+ public static IEntityMNode setToEntity(IMNode node) {
IEntityMNode entityMNode;
if (node.isEntity()) {
entityMNode = node.getAsEntityMNode();
@@ -48,7 +36,7 @@ public interface IEntityMNode extends IMNode {
if (node.isStorageGroup()) {
entityMNode =
new StorageGroupEntityMNode(
- node.getParent(), node.getName(), ((StorageGroupMNode)
node).getDataTTL());
+ node.getParent(), node.getName(),
node.getAsStorageGroupMNode().getDataTTL());
} else {
entityMNode = new EntityMNode(node.getParent(), node.getName());
}
@@ -58,4 +46,28 @@ public interface IEntityMNode extends IMNode {
}
return entityMNode;
}
+
+ /**
+ * When there's no measurement, represented by template or MeasurementMNode,
is under this
+ * entityMNode, it should not act as entity anymore. Before invoking this
method, lock related
+ * MTree structure first.
+ *
+ * @param entityMNode node to be transformed
+ * @return generated NoEntity node
+ */
+ public static IMNode setToInternal(IEntityMNode entityMNode) {
+ IMNode node;
+ IMNode parent = entityMNode.getParent();
+ if (entityMNode.isStorageGroup()) {
+ node =
+ new StorageGroupMNode(
+ parent, entityMNode.getName(),
entityMNode.getAsStorageGroupMNode().getDataTTL());
+ } else {
+ node = new InternalMNode(parent, entityMNode.getName());
+ }
+ if (parent != null) {
+ parent.replaceChild(entityMNode.getName(), node);
+ }
+ return node;
+ }
}
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 2d96a40..e094a34 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
@@ -87,11 +87,6 @@ public abstract class MeasurementMNode extends MNode
implements IMeasurementMNod
public abstract IMeasurementSchema getSchema();
@Override
- public int getMeasurementMNodeCount() {
- return 1;
- }
-
- @Override
public abstract int getMeasurementCount();
/**
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTree.java
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTree.java
index b48dc47..219b27d 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTree.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTree.java
@@ -34,13 +34,7 @@ import org.apache.iotdb.db.metadata.MetadataConstant;
import org.apache.iotdb.db.metadata.PartialPath;
import org.apache.iotdb.db.metadata.logfile.MLogReader;
import org.apache.iotdb.db.metadata.logfile.MLogWriter;
-import org.apache.iotdb.db.metadata.mnode.IEntityMNode;
-import org.apache.iotdb.db.metadata.mnode.IMNode;
-import org.apache.iotdb.db.metadata.mnode.IMeasurementMNode;
-import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
-import org.apache.iotdb.db.metadata.mnode.InternalMNode;
-import org.apache.iotdb.db.metadata.mnode.MeasurementMNode;
-import org.apache.iotdb.db.metadata.mnode.StorageGroupMNode;
+import org.apache.iotdb.db.metadata.mnode.*;
import org.apache.iotdb.db.metadata.mtree.traverser.PathGrouperByStorageGroup;
import
org.apache.iotdb.db.metadata.mtree.traverser.collector.BelongedEntityPathCollector;
import
org.apache.iotdb.db.metadata.mtree.traverser.collector.EntityPathCollector;
@@ -259,7 +253,7 @@ public class MTree implements Serializable {
childrenMap.put(child.getName(), child);
if (child.isMeasurement()) {
if (!node.isEntity()) {
- node = IEntityMNode.setToEntity(node);
+ node = MNodeUtils.setToEntity(node);
}
String alias = child.getAsMeasurementMNode().getAlias();
if (alias != null) {
@@ -392,7 +386,7 @@ public class MTree implements Serializable {
throw new AliasAlreadyExistException(path.getFullPath(), alias);
}
- IEntityMNode entityMNode = IEntityMNode.setToEntity(cur);
+ IEntityMNode entityMNode = MNodeUtils.setToEntity(cur);
IMeasurementMNode measurementMNode =
MeasurementMNode.getMeasurementMNode(
@@ -465,7 +459,7 @@ public class MTree implements Serializable {
throw new PathAlreadyExistException(devicePath.getFullPath() + "." +
leafName);
}
- IEntityMNode entityMNode = IEntityMNode.setToEntity(cur);
+ IEntityMNode entityMNode = MNodeUtils.setToEntity(cur);
int measurementsSize = measurements.size();
@@ -498,17 +492,30 @@ public class MTree implements Serializable {
}
IMeasurementMNode deletedNode = getMeasurementMNode(path);
- IMNode curNode = deletedNode;
+ IEntityMNode parent = deletedNode.getParent();
// delete the last node of path
- curNode.getParent().deleteChild(path.getMeasurement());
+ parent.deleteChild(path.getMeasurement());
if (deletedNode.getAlias() != null) {
-
deletedNode.getParent().deleteAliasChild((curNode.getAsMeasurementMNode().getAlias()));
+ parent.deleteAliasChild((deletedNode.getAlias()));
}
- curNode = curNode.getParent();
+ IMNode curNode = parent;
+ if (!parent.isUseTemplate()) {
+ boolean hasMeasurement = false;
+ for (IMNode child : parent.getChildren().values()) {
+ if (child.isMeasurement()) {
+ hasMeasurement = true;
+ break;
+ }
+ }
+ if (!hasMeasurement) {
+ synchronized (this) {
+ curNode = MNodeUtils.setToInternal(parent);
+ }
+ }
+ }
+
// delete all empty ancestors except storage group and MeasurementMNode
- while (!IoTDBConstant.PATH_ROOT.equals(curNode.getName())
- && !(curNode.isUseTemplate())
- && curNode.getChildren().size() == 0) {
+ while (curNode.isEmptyInternal()) {
// if current storage group has no time series, return the storage group
name
if (curNode.isStorageGroup()) {
return new Pair<>(curNode.getPartialPath(), deletedNode);
@@ -562,7 +569,7 @@ public class MTree implements Serializable {
// synchronize check and replace, we need replaceChild become atomic
operation
// only write on mtree will be synchronized
synchronized (this) {
- return IEntityMNode.setToEntity(node);
+ return MNodeUtils.setToEntity(node);
}
}
// endregion
@@ -869,22 +876,41 @@ public class MTree implements Serializable {
}
/**
- * Get all timeseries matching the given path pattern
+ * Get all measurement paths matching the given path pattern
+ *
+ * @param pathPattern a path pattern or a full path, may contain wildcard.
+ */
+ public List<PartialPath> getMeasurementPaths(PartialPath pathPattern) throws
MetadataException {
+ MeasurementCollector<List<PartialPath>> collector =
+ new MeasurementCollector<List<PartialPath>>(root, pathPattern) {
+ @Override
+ protected void collectMeasurement(IMeasurementMNode node) {
+ resultSet.add(node.getPartialPath());
+ }
+ };
+ collector.setResultSet(new LinkedList<>());
+ collector.traverse();
+ return collector.getResult();
+ }
+
+ /**
+ * Get all flat measurement paths matching the given path pattern
*
* @param pathPattern a path pattern or a full path, may contain wildcard.
*/
- public List<PartialPath> getAllTimeseriesPath(PartialPath pathPattern)
throws MetadataException {
- return getAllTimeseriesPathWithAlias(pathPattern, 0, 0).left;
+ public List<PartialPath> getFlatMeasurementPaths(PartialPath pathPattern)
+ throws MetadataException {
+ return getFlatMeasurementPathsWithAlias(pathPattern, 0, 0).left;
}
/**
- * Get all timeseries paths matching the given path pattern
+ * Get all flat measurement paths matching the given path pattern
*
* @param pathPattern a path pattern or a full path, may contain wildcard
* @return Pair.left contains all the satisfied paths Pair.right means the
current offset or zero
* if we don't set offset.
*/
- public Pair<List<PartialPath>, Integer> getAllTimeseriesPathWithAlias(
+ public Pair<List<PartialPath>, Integer> getFlatMeasurementPathsWithAlias(
PartialPath pathPattern, int limit, int offset) throws MetadataException
{
FlatMeasurementPathCollector collector =
new FlatMeasurementPathCollector(root, pathPattern, limit, offset);
@@ -895,11 +921,11 @@ public class MTree implements Serializable {
}
/**
- * Get all time series schema matching the given path pattern order by
insert frequency
+ * Get all flat measurement schema matching the given path pattern order by
insert frequency
*
* <p>result: [name, alias, storage group, dataType, encoding, compression,
offset]
*/
- public List<Pair<PartialPath, String[]>> getAllMeasurementSchemaByHeatOrder(
+ public List<Pair<PartialPath, String[]>>
getAllFlatMeasurementSchemaByHeatOrder(
ShowTimeSeriesPlan plan, QueryContext queryContext) throws
MetadataException {
FlatMeasurementSchemaCollector collector =
new FlatMeasurementSchemaCollector(root, plan.getPath());
@@ -925,11 +951,11 @@ public class MTree implements Serializable {
}
/**
- * Get all time series schema matching the given path pattern
+ * Get all flat measurement schema matching the given path pattern
*
* <p>result: [name, alias, storage group, dataType, encoding, compression,
offset]
*/
- public List<Pair<PartialPath, String[]>>
getAllMeasurementSchema(ShowTimeSeriesPlan plan)
+ public List<Pair<PartialPath, String[]>>
getAllFlatMeasurementSchema(ShowTimeSeriesPlan plan)
throws MetadataException {
FlatMeasurementSchemaCollector collector =
new FlatMeasurementSchemaCollector(root, plan.getPath(),
plan.getLimit(), plan.getOffset());
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/utils/MetaUtils.java
b/server/src/main/java/org/apache/iotdb/db/metadata/utils/MetaUtils.java
index af39a0f..47b4062 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/utils/MetaUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/utils/MetaUtils.java
@@ -26,7 +26,6 @@ import org.apache.iotdb.db.metadata.mnode.IMNode;
import org.apache.iotdb.db.utils.TestOnly;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -105,16 +104,6 @@ public class MetaUtils {
return new PartialPath(storageGroupNodes);
}
- /**
- * get aligned measurements in partial path FIXME maybe called by prefix path
- *
- * @param fullPath partial. For example: root.sg1.d1.(s1, s2, s3)
- * @return measurement names. For example: [s1, s2, s3]
- */
- public static List<String> getMeasurementsInPartialPath(PartialPath
fullPath) {
- return Arrays.asList(fullPath.getMeasurement());
- }
-
@TestOnly
public static List<String> getMultiFullPaths(IMNode node) {
if (node == null) {
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index 9aad5bf..86691a6 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -708,7 +708,7 @@ public class PlanExecutor implements IPlanExecutor {
}
protected List<PartialPath> getPathsName(PartialPath path) throws
MetadataException {
- return IoTDB.metaManager.getAllTimeseriesPath(path);
+ return IoTDB.metaManager.getFlatMeasurementPaths(path);
}
protected List<PartialPath> getNodesList(PartialPath schemaPattern, int
level)
@@ -1203,7 +1203,8 @@ public class PlanExecutor implements IPlanExecutor {
}
}
for (PartialPath path :
-
IoTDB.metaManager.getAllTimeseriesPath(devicePath.concatNode(ONE_LEVEL_PATH_WILDCARD)))
{
+ IoTDB.metaManager.getFlatMeasurementPaths(
+ devicePath.concatNode(ONE_LEVEL_PATH_WILDCARD))) {
existSeriesSet.add(path.getMeasurement());
existSeriesSet.add(path.getMeasurementAlias());
}
@@ -1949,10 +1950,6 @@ public class PlanExecutor implements IPlanExecutor {
return dataSet;
}
- protected String deleteTimeSeries(PartialPath path) throws MetadataException
{
- return IoTDB.metaManager.deleteTimeseries(path);
- }
-
@SuppressWarnings("unused") // for the distributed version
protected void loadConfiguration(LoadConfigurationPlan plan) throws
QueryProcessException {
IoTDBDescriptor.getInstance().loadHotModifiedProps();
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 c0afd30..8ad429f 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
@@ -501,7 +501,7 @@ public class QueryOperator extends Operator {
}
protected List<PartialPath> getMatchedTimeseries(PartialPath path) throws
MetadataException {
- return IoTDB.metaManager.getAllTimeseriesPath(path);
+ return IoTDB.metaManager.getFlatMeasurementPaths(path);
}
public boolean isEnableTracing() {
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
b/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
index a2754c1..4031a5c 100644
---
a/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
+++
b/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
@@ -238,7 +238,7 @@ public class ConcatPathOptimizer implements
ILogicalOptimizer {
try {
for (PartialPath originalPath : originalPaths) {
List<PartialPath> all =
- IoTDB.metaManager.getAllTimeseriesPathWithAlias(originalPath, 0,
0).left;
+ IoTDB.metaManager.getFlatMeasurementPathsWithAlias(originalPath,
0, 0).left;
if (all.isEmpty()) {
throw new LogicalOptimizeException(
String.format("Unknown time series %s in `where clause`",
originalPath));
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/utils/WildcardsRemover.java
b/server/src/main/java/org/apache/iotdb/db/qp/utils/WildcardsRemover.java
index a3c664e..3fbc71c 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/utils/WildcardsRemover.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/utils/WildcardsRemover.java
@@ -59,7 +59,7 @@ public class WildcardsRemover {
public List<PartialPath> removeWildcardFrom(PartialPath path) throws
LogicalOptimizeException {
try {
Pair<List<PartialPath>, Integer> pair =
- IoTDB.metaManager.getAllTimeseriesPathWithAlias(path, currentLimit,
currentOffset);
+ IoTDB.metaManager.getFlatMeasurementPathsWithAlias(path,
currentLimit, currentOffset);
consumed += pair.right;
if (currentOffset != 0) {
diff --git
a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index 2753527..3c658a9 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -387,7 +387,7 @@ public class TSServiceImpl implements TSIService.Iface {
}
protected List<PartialPath> getPaths(PartialPath path) throws
MetadataException {
- return IoTDB.metaManager.getAllTimeseriesPath(path);
+ return IoTDB.metaManager.getFlatMeasurementPaths(path);
}
private boolean executeInsertRowsPlan(InsertRowsPlan insertRowsPlan,
List<TSStatus> result) {
diff --git
a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
index 7e2c23c..7c133d8 100644
---
a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
@@ -151,17 +151,17 @@ public class MManagerAdvancedTest {
new PartialPath("root.vehicle.d0"),
mmanager.getBelongedStorageGroup(new
PartialPath("root.vehicle.d0.s1")));
List<PartialPath> pathList =
- mmanager.getAllTimeseriesPath(new PartialPath("root.vehicle.d1.**"));
+ mmanager.getFlatMeasurementPaths(new
PartialPath("root.vehicle.d1.**"));
assertEquals(6, pathList.size());
- pathList = mmanager.getAllTimeseriesPath(new
PartialPath("root.vehicle.d0.**"));
+ pathList = mmanager.getFlatMeasurementPaths(new
PartialPath("root.vehicle.d0.**"));
assertEquals(6, pathList.size());
- pathList = mmanager.getAllTimeseriesPath(new
PartialPath("root.vehicle.d*.**"));
+ pathList = mmanager.getFlatMeasurementPaths(new
PartialPath("root.vehicle.d*.**"));
assertEquals(12, pathList.size());
- pathList = mmanager.getAllTimeseriesPath(new PartialPath("root.ve*.**"));
+ pathList = mmanager.getFlatMeasurementPaths(new
PartialPath("root.ve*.**"));
assertEquals(12, pathList.size());
- pathList = mmanager.getAllTimeseriesPath(new
PartialPath("root.vehicle*.d*.s1"));
+ pathList = mmanager.getFlatMeasurementPaths(new
PartialPath("root.vehicle*.d*.s1"));
assertEquals(2, pathList.size());
- pathList = mmanager.getAllTimeseriesPath(new
PartialPath("root.vehicle.d2.**"));
+ pathList = mmanager.getFlatMeasurementPaths(new
PartialPath("root.vehicle.d2.**"));
assertEquals(0, pathList.size());
} catch (MetadataException e) {
e.printStackTrace();
diff --git
a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
index 8cdf119..6bd54a1 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
@@ -247,7 +247,7 @@ public class MManagerBasicTest {
@SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity
warning
@Test
- public void testCreateAlignedTimeseries() throws IllegalPathException {
+ public void testCreateAlignedTimeseries() throws MetadataException {
MManager manager = IoTDB.metaManager;
try {
manager.setStorageGroup(new PartialPath("root.laptop"));
@@ -290,17 +290,19 @@ public class MManagerBasicTest {
manager.deleteTimeseries(new PartialPath("root.laptop.d1.vector.s2"));
} catch (MetadataException e) {
assertEquals(
- "Not support deleting part of aligned timeseies! (Path:
root.laptop.d1.vector.s2)",
- e.getMessage());
+ e.getMessage(),
+ "No matched timeseries or aligned timeseries for Path
[root.laptop.d1.vector.s2]");
}
try {
manager.deleteTimeseries(new PartialPath("root.laptop.d1.vector.*"));
} catch (MetadataException e) {
- e.printStackTrace();
- fail(e.getMessage());
+ assertEquals(
+ e.getMessage(),
+ "No matched timeseries or aligned timeseries for Path
[root.laptop.d1.vector.*]");
}
+ manager.deleteTimeseries(new PartialPath("root.laptop.d1.vector"));
assertTrue(manager.isPathExist(new PartialPath("root.laptop.d1")));
assertTrue(manager.isPathExist(new PartialPath("root.laptop.d1.s0")));
assertFalse(manager.isPathExist(new PartialPath("root.laptop.d1.vector")));
@@ -543,7 +545,7 @@ public class MManagerBasicTest {
MManager manager = IoTDB.metaManager;
try {
- assertTrue(manager.getAllTimeseriesPath(new
PartialPath("root")).isEmpty());
+ assertTrue(manager.getFlatMeasurementPaths(new
PartialPath("root")).isEmpty());
assertTrue(manager.getBelongedStorageGroups(new
PartialPath("root")).isEmpty());
assertTrue(manager.getBelongedStorageGroups(new
PartialPath("root.vehicle")).isEmpty());
assertTrue(
@@ -1446,6 +1448,29 @@ public class MManagerBasicTest {
Assert.assertEquals(2, manager.getDevicesNum(new
PartialPath("root.laptop.*")));
Assert.assertEquals(2, manager.getDevicesNum(new
PartialPath("root.laptop.**")));
+ manager.createTimeseries(
+ new PartialPath("root.laptop.d1.a.s3"),
+ TSDataType.INT32,
+ TSEncoding.PLAIN,
+ CompressionType.GZIP,
+ null);
+
+ manager.createTimeseries(
+ new PartialPath("root.laptop.d2.a.s3"),
+ TSDataType.INT32,
+ TSEncoding.PLAIN,
+ CompressionType.GZIP,
+ null);
+
+ Assert.assertEquals(4, manager.getDevicesNum(new
PartialPath("root.laptop.**")));
+
+ manager.deleteTimeseries(new PartialPath("root.laptop.d2.s1"));
+ Assert.assertEquals(3, manager.getDevicesNum(new
PartialPath("root.laptop.**")));
+ manager.deleteTimeseries(new PartialPath("root.laptop.d2.a.s3"));
+ Assert.assertEquals(2, manager.getDevicesNum(new
PartialPath("root.laptop.**")));
+ manager.deleteTimeseries(new PartialPath("root.laptop.d1.a.s3"));
+ Assert.assertEquals(1, manager.getDevicesNum(new
PartialPath("root.laptop.**")));
+
} catch (MetadataException e) {
e.printStackTrace();
fail(e.getMessage());
@@ -1566,7 +1591,6 @@ public class MManagerBasicTest {
IMNode node = manager.getSeriesSchemasAndReadLockDevice(insertRowPlan);
assertEquals(1,
manager.getAllTimeseriesCount(node.getPartialPath().concatNode("**")));
assertEquals(3,
manager.getAllTimeseriesFlatCount(node.getPartialPath().concatNode("**")));
- assertEquals(1, node.getMeasurementMNodeCount());
assertNull(insertRowPlan.getMeasurementMNodes()[0]);
assertNull(insertRowPlan.getMeasurementMNodes()[1]);
assertNull(insertRowPlan.getMeasurementMNodes()[2]);
@@ -1652,7 +1676,7 @@ public class MManagerBasicTest {
// call getSeriesSchemasAndReadLockDevice
IMNode node = manager.getSeriesSchemasAndReadLockDevice(insertRowPlan);
- assertEquals(1, node.getMeasurementMNodeCount());
+ assertEquals(1,
manager.getAllTimeseriesCount(node.getPartialPath().concatNode("**")));
assertNull(insertRowPlan.getMeasurementMNodes()[0]);
assertEquals(1, insertRowPlan.getFailedMeasurementNumber());
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
b/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
index f65a0a0..51f1ff3 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
@@ -206,12 +206,12 @@ public class MTreeTest {
}
try {
- List<PartialPath> result = root.getAllTimeseriesPath(new
PartialPath("root.a.*.s0"));
+ List<PartialPath> result = root.getFlatMeasurementPaths(new
PartialPath("root.a.*.s0"));
assertEquals(2, result.size());
assertEquals("root.a.d0.s0", result.get(0).getFullPath());
assertEquals("root.a.d1.s0", result.get(1).getFullPath());
- result = root.getAllTimeseriesPath(new PartialPath("root.a.*.*.s0"));
+ result = root.getFlatMeasurementPaths(new PartialPath("root.a.*.*.s0"));
assertEquals("root.a.b.d0.s0", result.get(0).getFullPath());
} catch (MetadataException e) {
e.printStackTrace();
@@ -273,18 +273,18 @@ public class MTreeTest {
}
try {
- List<PartialPath> result = root.getAllTimeseriesPath(new
PartialPath("root.a.*.s0"));
+ List<PartialPath> result = root.getFlatMeasurementPaths(new
PartialPath("root.a.*.s0"));
assertEquals(2, result.size());
assertEquals("root.a.d0.s0", result.get(0).getFullPath());
assertEquals("root.a.d1.s0", result.get(1).getFullPath());
- result = root.getAllTimeseriesPath(new
PartialPath("root.a.*.temperature"));
+ result = root.getFlatMeasurementPaths(new
PartialPath("root.a.*.temperature"));
assertEquals(2, result.size());
assertEquals("root.a.d0.s0", result.get(0).getFullPath());
assertEquals("root.a.d1.s0", result.get(1).getFullPath());
List<PartialPath> result2 =
- root.getAllTimeseriesPathWithAlias(new PartialPath("root.a.*.s0"),
0, 0).left;
+ root.getFlatMeasurementPathsWithAlias(new
PartialPath("root.a.*.s0"), 0, 0).left;
assertEquals(2, result2.size());
assertEquals("root.a.d0.s0", result2.get(0).getFullPath());
assertFalse(result2.get(0).isMeasurementAliasExists());
@@ -292,13 +292,13 @@ public class MTreeTest {
assertFalse(result2.get(1).isMeasurementAliasExists());
result2 =
- root.getAllTimeseriesPathWithAlias(new
PartialPath("root.a.*.temperature"), 0, 0).left;
+ root.getFlatMeasurementPathsWithAlias(new
PartialPath("root.a.*.temperature"), 0, 0).left;
assertEquals(2, result2.size());
assertEquals("root.a.d0.temperature",
result2.get(0).getFullPathWithAlias());
assertEquals("root.a.d1.temperature",
result2.get(1).getFullPathWithAlias());
Pair<List<PartialPath>, Integer> result3 =
- root.getAllTimeseriesPathWithAlias(new PartialPath("root.a.**"), 2,
0);
+ root.getFlatMeasurementPathsWithAlias(new PartialPath("root.a.**"),
2, 0);
assertEquals(2, result3.left.size());
assertEquals(2, result3.right.intValue());
@@ -724,9 +724,9 @@ public class MTreeTest {
assertEquals(2, root.getDevices(new PartialPath("root"), true).size());
assertEquals(2, root.getDevices(new PartialPath("root.**"), false).size());
assertEquals(2, root.getAllTimeseriesCount(new PartialPath("root.**")));
- assertEquals(2, root.getAllTimeseriesPath(new
PartialPath("root.**")).size());
+ assertEquals(2, root.getFlatMeasurementPaths(new
PartialPath("root.**")).size());
assertEquals(
- 2, root.getAllTimeseriesPathWithAlias(new PartialPath("root.**"), 0,
0).left.size());
+ 2, root.getFlatMeasurementPathsWithAlias(new PartialPath("root.**"),
0, 0).left.size());
}
@Test
diff --git
a/server/src/test/java/org/apache/iotdb/db/metadata/PartialPathTest.java
b/server/src/test/java/org/apache/iotdb/db/metadata/PartialPathTest.java
index 5838b3e..5c189a5 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/PartialPathTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/PartialPathTest.java
@@ -87,6 +87,13 @@ public class PartialPathTest {
Assert.assertEquals("root.sg2.d1.s1", p2.getFullPath());
Assert.assertEquals("root.sg2.d1.d2.s3", p3.getFullPath());
+
+ PartialPath p4 = new PartialPath("root.**.d.s");
+ PartialPath p5 = p4.alterPrefixPath(new PartialPath("root.sg"));
+ Assert.assertEquals("root.sg.**.d.s", p5.getFullPath());
+ PartialPath p6 = new PartialPath("root.a.**.d.s");
+ PartialPath p7 = p5.alterPrefixPath(new PartialPath("root.b.sg"));
+ Assert.assertEquals("root.b.sg.**.d.s", p7.getFullPath());
}
@Test
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 bd0f4e1..712f8d2 100644
--- a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java
+++ b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java
@@ -538,7 +538,8 @@ public class IoTDBSessionSimpleIT {
try {
session.deleteTimeseries(Arrays.asList("root.sg1.d1.t6",
"root.sg1.d1.t2", "root.sg1.d1.t3"));
} catch (BatchExecutionException e) {
- assertEquals("Path [root.sg1.d1.t6] does not exist;", e.getMessage());
+ assertEquals(
+ "No matched timeseries or aligned timeseries for Path
[root.sg1.d1.t6];", e.getMessage());
}
assertTrue(session.checkTimeseriesExists("root.sg1.d1.t1"));
assertFalse(session.checkTimeseriesExists("root.sg1.d1.t2"));