You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by zy...@apache.org on 2023/05/31 18:08:22 UTC
[iotdb] branch master updated: Push down SchemaFilter processing to SchemaReader (#10005)
This is an automated email from the ASF dual-hosted git repository.
zyk 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 dd35304ede5 Push down SchemaFilter processing to SchemaReader (#10005)
dd35304ede5 is described below
commit dd35304ede56800cba742aeb9ecdf31d761cc0d8
Author: Chen YZ <43...@users.noreply.github.com>
AuthorDate: Thu Jun 1 02:08:15 2023 +0800
Push down SchemaFilter processing to SchemaReader (#10005)
---
.../commons/schema/view/LogicalViewSchema.java | 7 +-
.../db/metadata/mtree/MTreeBelowSGCachedImpl.java | 101 ++++++-----
.../db/metadata/mtree/MTreeBelowSGMemoryImpl.java | 101 ++++++-----
.../db/metadata/mtree/traverser/Traverser.java | 7 -
.../mtree/traverser/basic/EntityTraverser.java | 31 +---
.../traverser/basic/MeasurementTraverser.java | 36 +---
.../schemaregion/result/ShowTimeSeriesResult.java | 5 +
.../metadata/query/info/ITimeSeriesSchemaInfo.java | 2 +
.../metadata/query/info/TimeseriesSchemaInfo.java | 92 ++++++++++
.../reader/TimeseriesReaderWithViewFetch.java | 186 +++++++++++++++++++++
.../db/metadata/visitor/DeviceFilterVisitor.java | 40 +++++
.../metadata/visitor/TimeseriesFilterVisitor.java | 46 +++++
.../operator/schema/SchemaQueryScanOperator.java | 1 -
.../operator/schema/source/DeviceSchemaSource.java | 5 -
.../operator/schema/source/ISchemaSource.java | 10 --
.../schema/source/LogicalViewSchemaSource.java | 122 ++------------
.../operator/schema/source/NodeSchemaSource.java | 5 -
.../schema/source/PathsUsingTemplateSource.java | 5 -
.../schema/source/TimeSeriesSchemaSource.java | 123 +-------------
.../iotdb/db/rescon/PrimitiveArrayManager.java | 2 +-
.../db/metadata/idtable/entry/SchemaEntryTest.java | 2 +-
.../tsfile/file/metadata/enums/TSDataType.java | 7 +-
22 files changed, 511 insertions(+), 425 deletions(-)
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/schema/view/LogicalViewSchema.java b/node-commons/src/main/java/org/apache/iotdb/commons/schema/view/LogicalViewSchema.java
index b91b6f7963a..d13c5c0f28d 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/schema/view/LogicalViewSchema.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/schema/view/LogicalViewSchema.java
@@ -48,6 +48,8 @@ public class LogicalViewSchema
private ViewExpression expression;
+ private TSDataType dataType = TSDataType.UNKNOWN;
+
public LogicalViewSchema(String measurementId, ViewExpression expression) {
this.measurementId = measurementId;
this.expression = expression;
@@ -86,8 +88,7 @@ public class LogicalViewSchema
@Override
public TSDataType getType() {
- // TODO: CRTODO: use a dynamic method to compute data type
- return TSDataType.BOOLEAN;
+ return dataType;
}
@Override
@@ -97,7 +98,7 @@ public class LogicalViewSchema
@Override
public void setType(TSDataType dataType) {
- // do nothing
+ this.dataType = dataType;
}
@Override
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
index f558815258b..92400aa0563 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
@@ -41,8 +41,6 @@ import org.apache.iotdb.db.metadata.MetadataConstant;
import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
import org.apache.iotdb.db.metadata.mnode.schemafile.factory.CacheMNodeFactory;
import org.apache.iotdb.db.metadata.mtree.store.CachedMTreeStore;
-import org.apache.iotdb.db.metadata.mtree.traverser.Traverser;
-import org.apache.iotdb.db.metadata.mtree.traverser.TraverserWithLimitOffsetWrapper;
import org.apache.iotdb.db.metadata.mtree.traverser.collector.EntityCollector;
import org.apache.iotdb.db.metadata.mtree.traverser.collector.MNodeCollector;
import org.apache.iotdb.db.metadata.mtree.traverser.collector.MeasurementCollector;
@@ -57,10 +55,14 @@ import org.apache.iotdb.db.metadata.plan.schemaregion.result.ShowNodesResult;
import org.apache.iotdb.db.metadata.query.info.IDeviceSchemaInfo;
import org.apache.iotdb.db.metadata.query.info.INodeSchemaInfo;
import org.apache.iotdb.db.metadata.query.info.ITimeSeriesSchemaInfo;
+import org.apache.iotdb.db.metadata.query.info.TimeseriesSchemaInfo;
import org.apache.iotdb.db.metadata.query.reader.ISchemaReader;
+import org.apache.iotdb.db.metadata.query.reader.SchemaReaderLimitOffsetWrapper;
+import org.apache.iotdb.db.metadata.query.reader.TimeseriesReaderWithViewFetch;
import org.apache.iotdb.db.metadata.rescon.CachedSchemaRegionStatistics;
import org.apache.iotdb.db.metadata.template.Template;
import org.apache.iotdb.db.metadata.utils.MetaFormatUtils;
+import org.apache.iotdb.db.metadata.visitor.DeviceFilterVisitor;
import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -1028,32 +1030,46 @@ public class MTreeBelowSGCachedImpl {
if (showDevicesPlan.usingSchemaTemplate()) {
collector.setSchemaTemplateFilter(showDevicesPlan.getSchemaTemplateId());
}
- collector.setSchemaFilter(showDevicesPlan.getSchemaFilter());
- TraverserWithLimitOffsetWrapper<IDeviceSchemaInfo, ICachedMNode> traverser =
- new TraverserWithLimitOffsetWrapper<>(
- collector, showDevicesPlan.getLimit(), showDevicesPlan.getOffset());
- return new ISchemaReader<IDeviceSchemaInfo>() {
+ ISchemaReader<IDeviceSchemaInfo> reader =
+ new ISchemaReader<IDeviceSchemaInfo>() {
- public boolean isSuccess() {
- return traverser.isSuccess();
- }
+ private final DeviceFilterVisitor filterVisitor = new DeviceFilterVisitor();
+ private IDeviceSchemaInfo next;
- public Throwable getFailure() {
- return traverser.getFailure();
- }
+ public boolean isSuccess() {
+ return collector.isSuccess();
+ }
- public void close() {
- traverser.close();
- }
+ public Throwable getFailure() {
+ return collector.getFailure();
+ }
- public boolean hasNext() {
- return traverser.hasNext();
- }
+ public void close() {
+ collector.close();
+ }
- public IDeviceSchemaInfo next() {
- return traverser.next();
- }
- };
+ public boolean hasNext() {
+ while (next == null && collector.hasNext()) {
+ IDeviceSchemaInfo temp = collector.next();
+ if (filterVisitor.process(showDevicesPlan.getSchemaFilter(), temp)) {
+ next = temp;
+ }
+ }
+ return next != null;
+ }
+
+ public IDeviceSchemaInfo next() {
+ IDeviceSchemaInfo result = next;
+ next = null;
+ return result;
+ }
+ };
+ if (showDevicesPlan.getLimit() > 0 || showDevicesPlan.getOffset() > 0) {
+ return new SchemaReaderLimitOffsetWrapper<>(
+ reader, showDevicesPlan.getLimit(), showDevicesPlan.getOffset());
+ } else {
+ return reader;
+ }
}
public ISchemaReader<ITimeSeriesSchemaInfo> getTimeSeriesReader(
@@ -1107,42 +1123,25 @@ public class MTreeBelowSGCachedImpl {
public PartialPath getPartialPath() {
return getPartialPathFromRootToNode(node.getAsMNode());
}
+
+ @Override
+ public ITimeSeriesSchemaInfo snapshot() {
+ return new TimeseriesSchemaInfo(
+ node, getPartialPath(), getTags(), getAttributes(), isUnderAlignedDevice());
+ }
};
}
};
collector.setTemplateMap(showTimeSeriesPlan.getRelatedTemplate(), nodeFactory);
- collector.setSchemaFilter(showTimeSeriesPlan.getSchemaFilter());
- Traverser<ITimeSeriesSchemaInfo, ICachedMNode> traverser;
+ ISchemaReader<ITimeSeriesSchemaInfo> reader =
+ new TimeseriesReaderWithViewFetch(collector, showTimeSeriesPlan.getSchemaFilter());
if (showTimeSeriesPlan.getLimit() > 0 || showTimeSeriesPlan.getOffset() > 0) {
- traverser =
- new TraverserWithLimitOffsetWrapper<>(
- collector, showTimeSeriesPlan.getLimit(), showTimeSeriesPlan.getOffset());
+ return new SchemaReaderLimitOffsetWrapper<>(
+ reader, showTimeSeriesPlan.getLimit(), showTimeSeriesPlan.getOffset());
} else {
- traverser = collector;
+ return reader;
}
- return new ISchemaReader<ITimeSeriesSchemaInfo>() {
-
- public boolean isSuccess() {
- return traverser.isSuccess();
- }
-
- public Throwable getFailure() {
- return traverser.getFailure();
- }
-
- public void close() {
- traverser.close();
- }
-
- public boolean hasNext() {
- return traverser.hasNext();
- }
-
- public ITimeSeriesSchemaInfo next() {
- return traverser.next();
- }
- };
}
public ISchemaReader<INodeSchemaInfo> getNodeReader(IShowNodesPlan showNodesPlan)
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
index 508825aca0d..9ff493f2ee4 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
@@ -46,8 +46,6 @@ import org.apache.iotdb.db.metadata.mnode.mem.IMemMNode;
import org.apache.iotdb.db.metadata.mnode.mem.factory.MemMNodeFactory;
import org.apache.iotdb.db.metadata.mnode.mem.info.LogicalViewInfo;
import org.apache.iotdb.db.metadata.mtree.store.MemMTreeStore;
-import org.apache.iotdb.db.metadata.mtree.traverser.Traverser;
-import org.apache.iotdb.db.metadata.mtree.traverser.TraverserWithLimitOffsetWrapper;
import org.apache.iotdb.db.metadata.mtree.traverser.collector.EntityCollector;
import org.apache.iotdb.db.metadata.mtree.traverser.collector.MNodeCollector;
import org.apache.iotdb.db.metadata.mtree.traverser.collector.MeasurementCollector;
@@ -62,10 +60,14 @@ import org.apache.iotdb.db.metadata.plan.schemaregion.result.ShowNodesResult;
import org.apache.iotdb.db.metadata.query.info.IDeviceSchemaInfo;
import org.apache.iotdb.db.metadata.query.info.INodeSchemaInfo;
import org.apache.iotdb.db.metadata.query.info.ITimeSeriesSchemaInfo;
+import org.apache.iotdb.db.metadata.query.info.TimeseriesSchemaInfo;
import org.apache.iotdb.db.metadata.query.reader.ISchemaReader;
+import org.apache.iotdb.db.metadata.query.reader.SchemaReaderLimitOffsetWrapper;
+import org.apache.iotdb.db.metadata.query.reader.TimeseriesReaderWithViewFetch;
import org.apache.iotdb.db.metadata.rescon.MemSchemaRegionStatistics;
import org.apache.iotdb.db.metadata.template.Template;
import org.apache.iotdb.db.metadata.utils.MetaFormatUtils;
+import org.apache.iotdb.db.metadata.visitor.DeviceFilterVisitor;
import org.apache.iotdb.db.quotas.DataNodeSpaceQuotaManager;
import org.apache.iotdb.rpc.TSStatusCode;
import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
@@ -867,32 +869,46 @@ public class MTreeBelowSGMemoryImpl {
if (showDevicesPlan.usingSchemaTemplate()) {
collector.setSchemaTemplateFilter(showDevicesPlan.getSchemaTemplateId());
}
- collector.setSchemaFilter(showDevicesPlan.getSchemaFilter());
- TraverserWithLimitOffsetWrapper<IDeviceSchemaInfo, IMemMNode> traverser =
- new TraverserWithLimitOffsetWrapper<>(
- collector, showDevicesPlan.getLimit(), showDevicesPlan.getOffset());
- return new ISchemaReader<IDeviceSchemaInfo>() {
+ ISchemaReader<IDeviceSchemaInfo> reader =
+ new ISchemaReader<IDeviceSchemaInfo>() {
- public boolean isSuccess() {
- return traverser.isSuccess();
- }
+ private final DeviceFilterVisitor filterVisitor = new DeviceFilterVisitor();
+ private IDeviceSchemaInfo next;
- public Throwable getFailure() {
- return traverser.getFailure();
- }
+ public boolean isSuccess() {
+ return collector.isSuccess();
+ }
- public void close() {
- traverser.close();
- }
+ public Throwable getFailure() {
+ return collector.getFailure();
+ }
- public boolean hasNext() {
- return traverser.hasNext();
- }
+ public void close() {
+ collector.close();
+ }
- public IDeviceSchemaInfo next() {
- return traverser.next();
- }
- };
+ public boolean hasNext() {
+ while (next == null && collector.hasNext()) {
+ IDeviceSchemaInfo temp = collector.next();
+ if (filterVisitor.process(showDevicesPlan.getSchemaFilter(), temp)) {
+ next = temp;
+ }
+ }
+ return next != null;
+ }
+
+ public IDeviceSchemaInfo next() {
+ IDeviceSchemaInfo result = next;
+ next = null;
+ return result;
+ }
+ };
+ if (showDevicesPlan.getLimit() > 0 || showDevicesPlan.getOffset() > 0) {
+ return new SchemaReaderLimitOffsetWrapper<>(
+ reader, showDevicesPlan.getLimit(), showDevicesPlan.getOffset());
+ } else {
+ return reader;
+ }
}
public ISchemaReader<ITimeSeriesSchemaInfo> getTimeSeriesReader(
@@ -946,42 +962,25 @@ public class MTreeBelowSGMemoryImpl {
public PartialPath getPartialPath() {
return getPartialPathFromRootToNode(node.getAsMNode());
}
+
+ @Override
+ public ITimeSeriesSchemaInfo snapshot() {
+ return new TimeseriesSchemaInfo(
+ node, getPartialPath(), getTags(), getAttributes(), isUnderAlignedDevice());
+ }
};
}
};
- collector.setSchemaFilter(showTimeSeriesPlan.getSchemaFilter());
collector.setTemplateMap(showTimeSeriesPlan.getRelatedTemplate(), nodeFactory);
- Traverser<ITimeSeriesSchemaInfo, IMemMNode> traverser;
+ ISchemaReader<ITimeSeriesSchemaInfo> reader =
+ new TimeseriesReaderWithViewFetch(collector, showTimeSeriesPlan.getSchemaFilter());
if (showTimeSeriesPlan.getLimit() > 0 || showTimeSeriesPlan.getOffset() > 0) {
- traverser =
- new TraverserWithLimitOffsetWrapper<>(
- collector, showTimeSeriesPlan.getLimit(), showTimeSeriesPlan.getOffset());
+ return new SchemaReaderLimitOffsetWrapper<>(
+ reader, showTimeSeriesPlan.getLimit(), showTimeSeriesPlan.getOffset());
} else {
- traverser = collector;
+ return reader;
}
- return new ISchemaReader<ITimeSeriesSchemaInfo>() {
-
- public boolean isSuccess() {
- return traverser.isSuccess();
- }
-
- public Throwable getFailure() {
- return traverser.getFailure();
- }
-
- public void close() {
- traverser.close();
- }
-
- public boolean hasNext() {
- return traverser.hasNext();
- }
-
- public ITimeSeriesSchemaInfo next() {
- return traverser.next();
- }
- };
}
public ISchemaReader<INodeSchemaInfo> getNodeReader(IShowNodesPlan showNodesPlan)
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/Traverser.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/Traverser.java
index c17320c1daa..9b66c9fb4ae 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/Traverser.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/Traverser.java
@@ -23,7 +23,6 @@ import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.path.fa.IFAState;
import org.apache.iotdb.commons.path.fa.IFATransition;
-import org.apache.iotdb.commons.schema.filter.SchemaFilter;
import org.apache.iotdb.commons.schema.node.IMNode;
import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
import org.apache.iotdb.commons.schema.node.utils.IMNodeIterator;
@@ -72,8 +71,6 @@ public abstract class Traverser<R, N extends IMNode<N>> extends AbstractTreeVisi
// default false means fullPath pattern match
protected boolean isPrefixMatch = false;
- protected SchemaFilter schemaFilter;
-
protected Traverser() {}
/**
@@ -181,10 +178,6 @@ public abstract class Traverser<R, N extends IMNode<N>> extends AbstractTreeVisi
this.nodeFactory = nodeFactory;
}
- public void setSchemaFilter(SchemaFilter schemaFilter) {
- this.schemaFilter = schemaFilter;
- }
-
public void setSkipPreDeletedSchema(boolean skipPreDeletedSchema) {
this.skipPreDeletedSchema = skipPreDeletedSchema;
}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/EntityTraverser.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/EntityTraverser.java
index fef5abe778a..92b2ab67ac6 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/EntityTraverser.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/EntityTraverser.java
@@ -18,23 +18,16 @@
*/
package org.apache.iotdb.db.metadata.mtree.traverser.basic;
-import org.apache.iotdb.commons.conf.IoTDBConstant;
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.commons.schema.filter.SchemaFilter;
-import org.apache.iotdb.commons.schema.filter.SchemaFilterVisitor;
-import org.apache.iotdb.commons.schema.filter.impl.PathContainsFilter;
import org.apache.iotdb.commons.schema.node.IMNode;
import org.apache.iotdb.db.metadata.mtree.store.IMTreeStore;
import org.apache.iotdb.db.metadata.mtree.traverser.Traverser;
-import org.apache.commons.lang.StringUtils;
-
public abstract class EntityTraverser<R, N extends IMNode<N>> extends Traverser<R, N> {
private boolean usingTemplate = false;
private int schemaTemplateId = -1;
- private final DeviceFilterVisitor filterVisitor = new DeviceFilterVisitor();
/**
* To traverse subtree under root.sg, e.g., init Traverser(root, "root.sg.**")
@@ -53,8 +46,7 @@ public abstract class EntityTraverser<R, N extends IMNode<N>> extends Traverser<
@Override
protected boolean mayTargetNodeType(N node) {
if (node.isDevice()) {
- return (!usingTemplate || schemaTemplateId == node.getAsDeviceMNode().getSchemaTemplateId())
- && filterVisitor.process(schemaFilter, node);
+ return (!usingTemplate || schemaTemplateId == node.getAsDeviceMNode().getSchemaTemplateId());
}
return false;
}
@@ -62,8 +54,7 @@ public abstract class EntityTraverser<R, N extends IMNode<N>> extends Traverser<
@Override
protected boolean acceptFullMatchedNode(N node) {
if (node.isDevice()) {
- return (!usingTemplate || schemaTemplateId == node.getAsDeviceMNode().getSchemaTemplateId())
- && filterVisitor.process(schemaFilter, node);
+ return (!usingTemplate || schemaTemplateId == node.getAsDeviceMNode().getSchemaTemplateId());
}
return false;
}
@@ -87,22 +78,4 @@ public abstract class EntityTraverser<R, N extends IMNode<N>> extends Traverser<
this.usingTemplate = true;
this.schemaTemplateId = schemaTemplateId;
}
-
- class DeviceFilterVisitor extends SchemaFilterVisitor<Boolean, N> {
- @Override
- public Boolean visitNode(SchemaFilter filter, N node) {
- return true;
- }
-
- @Override
- public Boolean visitPathContainsFilter(PathContainsFilter pathContainsFilter, N node) {
- if (pathContainsFilter.getContainString() == null) {
- return true;
- }
- return StringUtils.join(
- getFullPathFromRootToNode(node.getAsMNode()), IoTDBConstant.PATH_SEPARATOR)
- .toLowerCase()
- .contains(pathContainsFilter.getContainString());
- }
- }
}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/MeasurementTraverser.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/MeasurementTraverser.java
index 882852d052c..c2b7dff8359 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/MeasurementTraverser.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/MeasurementTraverser.java
@@ -18,23 +18,14 @@
*/
package org.apache.iotdb.db.metadata.mtree.traverser.basic;
-import org.apache.iotdb.commons.conf.IoTDBConstant;
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.commons.schema.filter.SchemaFilter;
-import org.apache.iotdb.commons.schema.filter.SchemaFilterVisitor;
-import org.apache.iotdb.commons.schema.filter.impl.DataTypeFilter;
-import org.apache.iotdb.commons.schema.filter.impl.PathContainsFilter;
import org.apache.iotdb.commons.schema.node.IMNode;
import org.apache.iotdb.db.metadata.mtree.store.IMTreeStore;
import org.apache.iotdb.db.metadata.mtree.traverser.Traverser;
-import org.apache.commons.lang.StringUtils;
-
public abstract class MeasurementTraverser<R, N extends IMNode<N>> extends Traverser<R, N> {
- private final MeasurementFilterVisitor filterVisitor = new MeasurementFilterVisitor();
-
/**
* To traverse subtree under root.sg, e.g., init Traverser(root, "root.sg.**")
*
@@ -52,12 +43,12 @@ public abstract class MeasurementTraverser<R, N extends IMNode<N>> extends Trave
@Override
protected boolean mayTargetNodeType(N node) {
- return node.isMeasurement() && filterVisitor.process(schemaFilter, node);
+ return node.isMeasurement();
}
@Override
protected boolean acceptFullMatchedNode(N node) {
- return node.isMeasurement() && filterVisitor.process(schemaFilter, node);
+ return node.isMeasurement();
}
@Override
@@ -74,27 +65,4 @@ public abstract class MeasurementTraverser<R, N extends IMNode<N>> extends Trave
protected boolean shouldVisitSubtreeOfInternalMatchedNode(N node) {
return !node.isMeasurement();
}
-
- class MeasurementFilterVisitor extends SchemaFilterVisitor<Boolean, N> {
- @Override
- public Boolean visitNode(SchemaFilter filter, N node) {
- return true;
- }
-
- @Override
- public Boolean visitPathContainsFilter(PathContainsFilter pathContainsFilter, N node) {
- if (pathContainsFilter.getContainString() == null) {
- return true;
- }
- return StringUtils.join(
- getFullPathFromRootToNode(node.getAsMNode()), IoTDBConstant.PATH_SEPARATOR)
- .toLowerCase()
- .contains(pathContainsFilter.getContainString());
- }
-
- @Override
- public Boolean visitDataTypeFilter(DataTypeFilter dataTypeFilter, N node) {
- return node.getAsMeasurementMNode().getSchema().getType() == dataTypeFilter.getDataType();
- }
- }
}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/result/ShowTimeSeriesResult.java b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/result/ShowTimeSeriesResult.java
index 6341c508507..b8e58fa2ff8 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/result/ShowTimeSeriesResult.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/result/ShowTimeSeriesResult.java
@@ -86,6 +86,11 @@ public class ShowTimeSeriesResult extends ShowSchemaResult implements ITimeSerie
return this.measurementSchema.isLogicalView();
}
+ @Override
+ public ITimeSeriesSchemaInfo snapshot() {
+ return this;
+ }
+
public TSDataType getDataType() {
return measurementSchema.getType();
}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/query/info/ITimeSeriesSchemaInfo.java b/server/src/main/java/org/apache/iotdb/db/metadata/query/info/ITimeSeriesSchemaInfo.java
index 577d5f49b33..1ca86c6d987 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/query/info/ITimeSeriesSchemaInfo.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/query/info/ITimeSeriesSchemaInfo.java
@@ -36,4 +36,6 @@ public interface ITimeSeriesSchemaInfo extends ISchemaInfo {
boolean isUnderAlignedDevice();
boolean isLogicalView();
+
+ ITimeSeriesSchemaInfo snapshot();
}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/query/info/TimeseriesSchemaInfo.java b/server/src/main/java/org/apache/iotdb/db/metadata/query/info/TimeseriesSchemaInfo.java
new file mode 100644
index 00000000000..7bcb9892a74
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/query/info/TimeseriesSchemaInfo.java
@@ -0,0 +1,92 @@
+/*
+ * 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.query.info;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
+import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
+
+import java.util.Map;
+
+public class TimeseriesSchemaInfo implements ITimeSeriesSchemaInfo {
+
+ private final IMeasurementMNode<?> node;
+ private final PartialPath fullPath;
+ private final Map<String, String> tags;
+ private final Map<String, String> attributes;
+ private final boolean isUnderAlignedDevice;
+
+ public TimeseriesSchemaInfo(
+ IMeasurementMNode<?> node,
+ PartialPath fullPath,
+ Map<String, String> tags,
+ Map<String, String> attributes,
+ boolean isUnderAlignedDevice) {
+ this.node = node;
+ this.fullPath = fullPath;
+ this.tags = tags;
+ this.attributes = attributes;
+ this.isUnderAlignedDevice = isUnderAlignedDevice;
+ }
+
+ @Override
+ public String getFullPath() {
+ return fullPath.getFullPath();
+ }
+
+ @Override
+ public PartialPath getPartialPath() {
+ return fullPath;
+ }
+
+ @Override
+ public String getAlias() {
+ return node.getAlias();
+ }
+
+ @Override
+ public IMeasurementSchema getSchema() {
+ return node.getSchema();
+ }
+
+ @Override
+ public Map<String, String> getTags() {
+ return tags;
+ }
+
+ @Override
+ public Map<String, String> getAttributes() {
+ return attributes;
+ }
+
+ @Override
+ public boolean isUnderAlignedDevice() {
+ return isUnderAlignedDevice;
+ }
+
+ @Override
+ public boolean isLogicalView() {
+ return node.isLogicalView();
+ }
+
+ @Override
+ public ITimeSeriesSchemaInfo snapshot() {
+ return this;
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/query/reader/TimeseriesReaderWithViewFetch.java b/server/src/main/java/org/apache/iotdb/db/metadata/query/reader/TimeseriesReaderWithViewFetch.java
new file mode 100644
index 00000000000..c93d4daf74d
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/query/reader/TimeseriesReaderWithViewFetch.java
@@ -0,0 +1,186 @@
+/*
+ * 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.query.reader;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.path.PathPatternTree;
+import org.apache.iotdb.commons.schema.filter.SchemaFilter;
+import org.apache.iotdb.commons.schema.view.LogicalViewSchema;
+import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
+import org.apache.iotdb.db.metadata.mtree.traverser.Traverser;
+import org.apache.iotdb.db.metadata.query.info.ITimeSeriesSchemaInfo;
+import org.apache.iotdb.db.metadata.view.viewExpression.visitor.GetSourcePathsVisitor;
+import org.apache.iotdb.db.metadata.view.viewExpression.visitor.TransformToExpressionVisitor;
+import org.apache.iotdb.db.metadata.visitor.TimeseriesFilterVisitor;
+import org.apache.iotdb.db.mpp.common.NodeRef;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
+import org.apache.iotdb.db.mpp.plan.analyze.ExpressionTypeAnalyzer;
+import org.apache.iotdb.db.mpp.plan.analyze.schema.ClusterSchemaFetcher;
+import org.apache.iotdb.db.mpp.plan.expression.Expression;
+import org.apache.iotdb.db.mpp.plan.expression.visitor.CompleteMeasurementSchemaVisitor;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Queue;
+
+public class TimeseriesReaderWithViewFetch implements ISchemaReader<ITimeSeriesSchemaInfo> {
+
+ private final Traverser<ITimeSeriesSchemaInfo, ?> traverser;
+ private final Queue<ITimeSeriesSchemaInfo> cachedViewList = new ArrayDeque<>();
+ private ITimeSeriesSchemaInfo next = null;
+ private boolean consumeView = false;
+ private final SchemaFilter schemaFilter;
+
+ private static final int BATCH_CACHED_SIZE = 1000;
+ private static final TimeseriesFilterVisitor FILTER_VISITOR = new TimeseriesFilterVisitor();
+
+ public TimeseriesReaderWithViewFetch(
+ Traverser<ITimeSeriesSchemaInfo, ?> traverser, SchemaFilter schemaFilter) {
+ this.traverser = traverser;
+ this.schemaFilter = schemaFilter;
+ }
+
+ public boolean isSuccess() {
+ return traverser.isSuccess();
+ }
+
+ public Throwable getFailure() {
+ return traverser.getFailure();
+ }
+
+ public void close() {
+ traverser.close();
+ }
+
+ public boolean hasNext() {
+ if (next == null && !consumeView) {
+ fetchAndCacheNextResult();
+ }
+ if (consumeView) {
+ return !cachedViewList.isEmpty();
+ } else {
+ return next != null;
+ }
+ }
+
+ public ITimeSeriesSchemaInfo next() {
+ if (!hasNext()) {
+ throw new NoSuchElementException();
+ }
+ ITimeSeriesSchemaInfo result;
+ if (!consumeView) {
+ result = next;
+ next = null;
+ } else {
+ result = cachedViewList.poll();
+ consumeView = !cachedViewList.isEmpty();
+ }
+ return result;
+ }
+
+ /**
+ * Fetch ITimeSeriesSchemaInfo from the traverser and return only in the following three cases
+ *
+ * <ol>
+ * <li>successfully fetched an info of normal time series. consumeView is false and next is not
+ * null.
+ * <li>successfully fetched batch info of view time series. consumeView is true and next is
+ * null.
+ * <li>no more info to be fetched. consumeView is false and next is null.
+ * </ol>
+ */
+ private void fetchAndCacheNextResult() {
+ ITimeSeriesSchemaInfo temp;
+ while (traverser.hasNext()) {
+ temp = traverser.next();
+ if (temp.isLogicalView()) {
+ cachedViewList.add(temp.snapshot());
+ if (cachedViewList.size() >= BATCH_CACHED_SIZE) {
+ fetchViewTimeSeriesSchemaInfo();
+ if (consumeView) {
+ break;
+ }
+ }
+ } else {
+ if (FILTER_VISITOR.process(schemaFilter, temp)) {
+ next = temp;
+ break;
+ }
+ }
+ }
+ if (next == null && !cachedViewList.isEmpty()) {
+ // all schema info has been fetched, but there mau be still some view schema info in
+ // cachedViewList
+ fetchViewTimeSeriesSchemaInfo();
+ }
+ }
+
+ private void fetchViewTimeSeriesSchemaInfo() {
+ List<ITimeSeriesSchemaInfo> delayedLogicalViewList = new ArrayList<>();
+ List<ViewExpression> viewExpressionList = new ArrayList<>();
+
+ GetSourcePathsVisitor getSourcePathsVisitor = new GetSourcePathsVisitor();
+ List<PartialPath> sourcePathsNeedFetch;
+ PathPatternTree patternTree = new PathPatternTree();
+ for (ITimeSeriesSchemaInfo series : cachedViewList) {
+ delayedLogicalViewList.add(series);
+ ViewExpression viewExpression = ((LogicalViewSchema) series.getSchema()).getExpression();
+ viewExpressionList.add(((LogicalViewSchema) series.getSchema()).getExpression());
+ sourcePathsNeedFetch = getSourcePathsVisitor.process(viewExpression, null);
+ for (PartialPath path : sourcePathsNeedFetch) {
+ patternTree.appendFullPath(path);
+ }
+ }
+ // clear cachedViewList, all cached view will be added in the last step
+ cachedViewList.clear();
+ ISchemaTree schemaTree = ClusterSchemaFetcher.getInstance().fetchSchema(patternTree, null);
+ // process each view expression and get data type
+ TransformToExpressionVisitor transformToExpressionVisitor = new TransformToExpressionVisitor();
+ CompleteMeasurementSchemaVisitor completeMeasurementSchemaVisitor =
+ new CompleteMeasurementSchemaVisitor();
+ Map<NodeRef<Expression>, TSDataType> expressionTypes = new HashMap<>();
+ for (int i = 0; i < delayedLogicalViewList.size(); i++) {
+ ViewExpression viewExpression = viewExpressionList.get(i);
+ Expression expression = null;
+ boolean viewIsBroken = false;
+ try {
+ expression = transformToExpressionVisitor.process(viewExpression, null);
+ expression = completeMeasurementSchemaVisitor.process(expression, schemaTree);
+ ExpressionTypeAnalyzer.analyzeExpression(expressionTypes, expression);
+ } catch (Exception e) {
+ viewIsBroken = true;
+ }
+ delayedLogicalViewList
+ .get(i)
+ .getSchema()
+ .setType(viewIsBroken ? TSDataType.UNKNOWN : expressionTypes.get(NodeRef.of(expression)));
+ if (FILTER_VISITOR.process(schemaFilter, delayedLogicalViewList.get(i))) {
+ cachedViewList.add(delayedLogicalViewList.get(i));
+ }
+ }
+ if (!cachedViewList.isEmpty()) {
+ consumeView = true;
+ }
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/visitor/DeviceFilterVisitor.java b/server/src/main/java/org/apache/iotdb/db/metadata/visitor/DeviceFilterVisitor.java
new file mode 100644
index 00000000000..09dd2848d88
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/visitor/DeviceFilterVisitor.java
@@ -0,0 +1,40 @@
+/*
+ * 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.visitor;
+
+import org.apache.iotdb.commons.schema.filter.SchemaFilter;
+import org.apache.iotdb.commons.schema.filter.SchemaFilterVisitor;
+import org.apache.iotdb.commons.schema.filter.impl.PathContainsFilter;
+import org.apache.iotdb.db.metadata.query.info.IDeviceSchemaInfo;
+
+public class DeviceFilterVisitor extends SchemaFilterVisitor<Boolean, IDeviceSchemaInfo> {
+ @Override
+ public Boolean visitNode(SchemaFilter filter, IDeviceSchemaInfo info) {
+ return true;
+ }
+
+ @Override
+ public Boolean visitPathContainsFilter(
+ PathContainsFilter pathContainsFilter, IDeviceSchemaInfo info) {
+ if (pathContainsFilter.getContainString() == null) {
+ return true;
+ }
+ return info.getFullPath().toLowerCase().contains(pathContainsFilter.getContainString());
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/visitor/TimeseriesFilterVisitor.java b/server/src/main/java/org/apache/iotdb/db/metadata/visitor/TimeseriesFilterVisitor.java
new file mode 100644
index 00000000000..743c209722d
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/visitor/TimeseriesFilterVisitor.java
@@ -0,0 +1,46 @@
+/*
+ * 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.visitor;
+
+import org.apache.iotdb.commons.schema.filter.SchemaFilter;
+import org.apache.iotdb.commons.schema.filter.SchemaFilterVisitor;
+import org.apache.iotdb.commons.schema.filter.impl.DataTypeFilter;
+import org.apache.iotdb.commons.schema.filter.impl.PathContainsFilter;
+import org.apache.iotdb.db.metadata.query.info.ITimeSeriesSchemaInfo;
+
+public class TimeseriesFilterVisitor extends SchemaFilterVisitor<Boolean, ITimeSeriesSchemaInfo> {
+ @Override
+ public Boolean visitNode(SchemaFilter filter, ITimeSeriesSchemaInfo info) {
+ return true;
+ }
+
+ @Override
+ public Boolean visitPathContainsFilter(
+ PathContainsFilter pathContainsFilter, ITimeSeriesSchemaInfo info) {
+ if (pathContainsFilter.getContainString() == null) {
+ return true;
+ }
+ return info.getFullPath().toLowerCase().contains(pathContainsFilter.getContainString());
+ }
+
+ @Override
+ public Boolean visitDataTypeFilter(DataTypeFilter dataTypeFilter, ITimeSeriesSchemaInfo info) {
+ return info.getSchema().getType() == dataTypeFilter.getDataType();
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaQueryScanOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaQueryScanOperator.java
index 55bf93932b5..d9879f511da 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaQueryScanOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaQueryScanOperator.java
@@ -142,7 +142,6 @@ public class SchemaQueryScanOperator<T extends ISchemaInfo> implements SourceOpe
if (!schemaReader.isSuccess()) {
throw new RuntimeException(schemaReader.getFailure());
}
- schemaSource.processDelayedTask(tsBlockBuilder, getDatabase());
return tsBlockBuilder.build();
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/DeviceSchemaSource.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/DeviceSchemaSource.java
index 078df53450c..edc4cc3b82c 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/DeviceSchemaSource.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/DeviceSchemaSource.java
@@ -105,9 +105,4 @@ public class DeviceSchemaSource implements ISchemaSource<IDeviceSchemaInfo> {
public long getSchemaStatistic(ISchemaRegion schemaRegion) {
return schemaRegion.getSchemaRegionStatistics().getDevicesNumber();
}
-
- @Override
- public void processDelayedTask(TsBlockBuilder tsBlockBuilder, String database) {
- // There is no delayed tasks. So, do nothing.
- }
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/ISchemaSource.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/ISchemaSource.java
index 45343a15839..d7a8cd73252 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/ISchemaSource.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/ISchemaSource.java
@@ -51,14 +51,4 @@ public interface ISchemaSource<T extends ISchemaInfo> {
boolean hasSchemaStatistic(ISchemaRegion schemaRegion);
long getSchemaStatistic(ISchemaRegion schemaRegion);
-
- /**
- * Some tasks may be delayed, and will be processed before building and returning of
- * tsBlockBuilder. Those delayed tasks will be processed here. For example, in 'show timeseries'
- * statement, tasks of processing series of views will be delayed. These tasks will be processed
- * here, make counts of schema fetching come down.
- *
- * @param tsBlockBuilder complete delayed tasks on given tsBlock builder.
- */
- void processDelayedTask(TsBlockBuilder tsBlockBuilder, String database);
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/LogicalViewSchemaSource.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/LogicalViewSchemaSource.java
index d324452997a..1e1fc529987 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/LogicalViewSchemaSource.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/LogicalViewSchemaSource.java
@@ -21,32 +21,18 @@ package org.apache.iotdb.db.mpp.execution.operator.schema.source;
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.commons.path.PathPatternTree;
import org.apache.iotdb.commons.schema.filter.SchemaFilter;
import org.apache.iotdb.commons.schema.view.LogicalViewSchema;
-import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
import org.apache.iotdb.db.metadata.plan.schemaregion.impl.read.SchemaRegionReadPlanFactory;
-import org.apache.iotdb.db.metadata.plan.schemaregion.result.ShowTimeSeriesResult;
import org.apache.iotdb.db.metadata.query.info.ITimeSeriesSchemaInfo;
import org.apache.iotdb.db.metadata.query.reader.ISchemaReader;
import org.apache.iotdb.db.metadata.query.reader.SchemaReaderLimitOffsetWrapper;
import org.apache.iotdb.db.metadata.schemaregion.ISchemaRegion;
-import org.apache.iotdb.db.metadata.view.viewExpression.visitor.GetSourcePathsVisitor;
-import org.apache.iotdb.db.metadata.view.viewExpression.visitor.TransformToExpressionVisitor;
-import org.apache.iotdb.db.mpp.common.NodeRef;
import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
-import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
-import org.apache.iotdb.db.mpp.plan.analyze.ExpressionTypeAnalyzer;
-import org.apache.iotdb.db.mpp.plan.analyze.schema.ClusterSchemaFetcher;
-import org.apache.iotdb.db.mpp.plan.expression.Expression;
-import org.apache.iotdb.db.mpp.plan.expression.visitor.CompleteMeasurementSchemaVisitor;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
-import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
@@ -62,15 +48,6 @@ public class LogicalViewSchemaSource implements ISchemaSource<ITimeSeriesSchemaI
private final long offset;
private final SchemaFilter schemaFilter;
-
- /**
- * The task of processing logical views will be delayed. Those infos will be stored here in
- * function transformToTsBlockColumns(). <b>If there is no delayed infos of logical views, this
- * variable may be null.</b>
- */
- private List<ITimeSeriesSchemaInfo> delayedLogicalViewList;
-
- private static final String unknownDataTypeString = "UNKNOWN";
private static final String viewTypeOfLogicalView = "logical";
LogicalViewSchemaSource(
@@ -81,8 +58,6 @@ public class LogicalViewSchemaSource implements ISchemaSource<ITimeSeriesSchemaI
this.offset = offset;
this.schemaFilter = schemaFilter;
-
- this.delayedLogicalViewList = new ArrayList<>();
}
@Override
@@ -108,20 +83,24 @@ public class LogicalViewSchemaSource implements ISchemaSource<ITimeSeriesSchemaI
@Override
public void transformToTsBlockColumns(
ITimeSeriesSchemaInfo series, TsBlockBuilder builder, String database) {
- // delay all tasks
- this.delayedLogicalViewList.add(
- new ShowTimeSeriesResult(
- series.getFullPath(),
- series.getAlias(),
- series.getSchema(),
- series.getTags(),
- series.getAttributes(),
- series.isUnderAlignedDevice()));
+ builder.getTimeColumnBuilder().writeLong(0);
+ builder.writeNullableText(0, series.getFullPath());
+ builder.writeNullableText(1, database);
+
+ builder.writeNullableText(2, series.getSchema().getType().toString());
+
+ builder.writeNullableText(3, mapToString(series.getTags()));
+ builder.writeNullableText(4, mapToString(series.getAttributes()));
+
+ builder.writeNullableText(5, viewTypeOfLogicalView);
+ builder.writeNullableText(
+ 6, ((LogicalViewSchema) series.getSchema()).getExpression().toString());
+ builder.declarePosition();
}
@Override
public boolean hasSchemaStatistic(ISchemaRegion schemaRegion) {
- return pathPattern.equals(ALL_MATCH_PATTERN) && (schemaFilter == null);
+ return pathPattern.equals(ALL_MATCH_PATTERN);
}
@Override
@@ -129,78 +108,6 @@ public class LogicalViewSchemaSource implements ISchemaSource<ITimeSeriesSchemaI
return schemaRegion.getSchemaRegionStatistics().getSeriesNumber();
}
- private List<String> analyzeDataTypeOfDelayedViews() {
- if (this.delayedLogicalViewList == null || this.delayedLogicalViewList.size() <= 0) {
- return new ArrayList<>();
- }
- // fetch schema of source paths of views
- List<ViewExpression> viewExpressionList = new ArrayList<>();
- for (ITimeSeriesSchemaInfo series : this.delayedLogicalViewList) {
- viewExpressionList.add(((LogicalViewSchema) series.getSchema()).getExpression());
- }
- GetSourcePathsVisitor getSourcePathsVisitor = new GetSourcePathsVisitor();
- List<PartialPath> sourcePathsNeedFetch;
- PathPatternTree patternTree = new PathPatternTree();
- for (ViewExpression viewExpression : viewExpressionList) {
- sourcePathsNeedFetch = getSourcePathsVisitor.process(viewExpression, null);
- for (PartialPath path : sourcePathsNeedFetch) {
- patternTree.appendFullPath(path);
- }
- }
- ISchemaTree schemaTree = ClusterSchemaFetcher.getInstance().fetchSchema(patternTree, null);
- // process each view expression and get data type
- TransformToExpressionVisitor transformToExpressionVisitor = new TransformToExpressionVisitor();
- CompleteMeasurementSchemaVisitor completeMeasurementSchemaVisitor =
- new CompleteMeasurementSchemaVisitor();
- Map<NodeRef<Expression>, TSDataType> expressionTypes = new HashMap<>();
- List<String> dataTypeStringList = new ArrayList<>();
- for (ViewExpression viewExpression : viewExpressionList) {
- Expression expression = null;
- boolean viewIsBroken = false;
- try {
- expression = transformToExpressionVisitor.process(viewExpression, null);
- expression = completeMeasurementSchemaVisitor.process(expression, schemaTree);
- ExpressionTypeAnalyzer.analyzeExpression(expressionTypes, expression);
- } catch (Exception e) {
- viewIsBroken = true;
- }
- if (viewIsBroken) {
- dataTypeStringList.add(unknownDataTypeString);
- } else {
- dataTypeStringList.add(expressionTypes.get(NodeRef.of(expression)).toString());
- }
- }
- return dataTypeStringList;
- }
-
- @Override
- public void processDelayedTask(TsBlockBuilder builder, String database) {
- // There is no delayed tasks. So, do nothing.
- if (this.delayedLogicalViewList == null || this.delayedLogicalViewList.size() <= 0) {
- return;
- }
- List<String> dataTypeStringList = this.analyzeDataTypeOfDelayedViews();
- // process delayed tasks
- for (int index = 0; index < this.delayedLogicalViewList.size(); index++) {
- ITimeSeriesSchemaInfo series = this.delayedLogicalViewList.get(index);
- String expressionTypeOfThisView = dataTypeStringList.get(index);
-
- builder.getTimeColumnBuilder().writeLong(0);
- builder.writeNullableText(0, series.getFullPath());
- builder.writeNullableText(1, database);
-
- builder.writeNullableText(2, expressionTypeOfThisView);
-
- builder.writeNullableText(3, mapToString(series.getTags()));
- builder.writeNullableText(4, mapToString(series.getAttributes()));
-
- builder.writeNullableText(5, viewTypeOfLogicalView);
- builder.writeNullableText(
- 6, ((LogicalViewSchema) series.getSchema()).getExpression().toString());
- builder.declarePosition();
- }
- }
-
private String mapToString(Map<String, String> map) {
if (map == null || map.isEmpty()) {
return null;
@@ -212,6 +119,7 @@ public class LogicalViewSchemaSource implements ISchemaSource<ITimeSeriesSchemaI
return "{" + content + "}";
}
+ // TODO: this reader may be replaced by filter in the future
private static class LogicalViewSchemaReader implements ISchemaReader<ITimeSeriesSchemaInfo> {
private final ISchemaReader<ITimeSeriesSchemaInfo> timeSeriesReader;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/NodeSchemaSource.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/NodeSchemaSource.java
index 575da732333..78b4d8d18f5 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/NodeSchemaSource.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/NodeSchemaSource.java
@@ -88,9 +88,4 @@ public class NodeSchemaSource implements ISchemaSource<INodeSchemaInfo> {
public long getSchemaStatistic(ISchemaRegion schemaRegion) {
return 0;
}
-
- @Override
- public void processDelayedTask(TsBlockBuilder tsBlockBuilder, String database) {
- // There is no delayed tasks. So, do nothing.
- }
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/PathsUsingTemplateSource.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/PathsUsingTemplateSource.java
index 27742499285..70e612d7573 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/PathsUsingTemplateSource.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/PathsUsingTemplateSource.java
@@ -71,11 +71,6 @@ public class PathsUsingTemplateSource implements ISchemaSource<IDeviceSchemaInfo
return schemaRegion.getSchemaRegionStatistics().getTemplateActivatedNumber();
}
- @Override
- public void processDelayedTask(TsBlockBuilder tsBlockBuilder, String database) {
- // There is no delayed tasks. So, do nothing.
- }
-
private class DevicesUsingTemplateReader implements ISchemaReader<IDeviceSchemaInfo> {
final Iterator<PartialPath> pathPatternIterator;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/TimeSeriesSchemaSource.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/TimeSeriesSchemaSource.java
index e4ef3e38900..d202e1e4c39 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/TimeSeriesSchemaSource.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/TimeSeriesSchemaSource.java
@@ -21,33 +21,18 @@ package org.apache.iotdb.db.mpp.execution.operator.schema.source;
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.commons.path.PathPatternTree;
import org.apache.iotdb.commons.schema.filter.SchemaFilter;
-import org.apache.iotdb.commons.schema.view.LogicalViewSchema;
-import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
import org.apache.iotdb.db.metadata.plan.schemaregion.impl.read.SchemaRegionReadPlanFactory;
-import org.apache.iotdb.db.metadata.plan.schemaregion.result.ShowTimeSeriesResult;
import org.apache.iotdb.db.metadata.query.info.ITimeSeriesSchemaInfo;
import org.apache.iotdb.db.metadata.query.reader.ISchemaReader;
import org.apache.iotdb.db.metadata.schemaregion.ISchemaRegion;
import org.apache.iotdb.db.metadata.template.Template;
import org.apache.iotdb.db.metadata.utils.MetaUtils;
-import org.apache.iotdb.db.metadata.view.viewExpression.visitor.GetSourcePathsVisitor;
-import org.apache.iotdb.db.metadata.view.viewExpression.visitor.TransformToExpressionVisitor;
-import org.apache.iotdb.db.mpp.common.NodeRef;
import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
-import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
-import org.apache.iotdb.db.mpp.plan.analyze.ExpressionTypeAnalyzer;
-import org.apache.iotdb.db.mpp.plan.analyze.schema.ClusterSchemaFetcher;
-import org.apache.iotdb.db.mpp.plan.expression.Expression;
-import org.apache.iotdb.db.mpp.plan.expression.visitor.CompleteMeasurementSchemaVisitor;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
import org.apache.iotdb.tsfile.utils.Pair;
-import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -65,15 +50,6 @@ public class TimeSeriesSchemaSource implements ISchemaSource<ITimeSeriesSchemaIn
private final SchemaFilter schemaFilter;
private final Map<Integer, Template> templateMap;
-
- /**
- * The task of processing logical views will be delayed. Those infos will be stored here in
- * function transformToTsBlockColumns(). <b>If there is no delayed infos of logical views, this
- * variable may be null.</b>
- */
- private List<ITimeSeriesSchemaInfo> delayedLogicalViewList;
-
- private static final String unknownDataTypeString = "UNKNOWN";
private static final String viewTypeOfLogicalView = "logical";
private static final String viewTypeOfNonView = "";
@@ -114,33 +90,25 @@ public class TimeSeriesSchemaSource implements ISchemaSource<ITimeSeriesSchemaIn
@Override
public void transformToTsBlockColumns(
ITimeSeriesSchemaInfo series, TsBlockBuilder builder, String database) {
- if (series.isLogicalView()) {
- if (this.delayedLogicalViewList == null) {
- this.delayedLogicalViewList = new ArrayList<>();
- }
- this.delayedLogicalViewList.add(
- new ShowTimeSeriesResult(
- series.getFullPath(),
- series.getAlias(),
- series.getSchema(),
- series.getTags(),
- series.getAttributes(),
- series.isUnderAlignedDevice()));
- return;
- }
Pair<String, String> deadbandInfo = MetaUtils.parseDeadbandInfo(series.getSchema().getProps());
builder.getTimeColumnBuilder().writeLong(0);
builder.writeNullableText(0, series.getFullPath());
builder.writeNullableText(1, series.getAlias());
builder.writeNullableText(2, database);
builder.writeNullableText(3, series.getSchema().getType().toString());
- builder.writeNullableText(4, series.getSchema().getEncodingType().toString());
- builder.writeNullableText(5, series.getSchema().getCompressor().toString());
+ if (series.isLogicalView()) {
+ builder.writeNullableText(4, null);
+ builder.writeNullableText(5, null);
+ builder.writeNullableText(10, viewTypeOfLogicalView);
+ } else {
+ builder.writeNullableText(4, series.getSchema().getEncodingType().toString());
+ builder.writeNullableText(5, series.getSchema().getCompressor().toString());
+ builder.writeNullableText(10, viewTypeOfNonView);
+ }
builder.writeNullableText(6, mapToString(series.getTags()));
builder.writeNullableText(7, mapToString(series.getAttributes()));
builder.writeNullableText(8, deadbandInfo.left);
builder.writeNullableText(9, deadbandInfo.right);
- builder.writeNullableText(10, viewTypeOfNonView);
builder.declarePosition();
}
@@ -154,79 +122,6 @@ public class TimeSeriesSchemaSource implements ISchemaSource<ITimeSeriesSchemaIn
return schemaRegion.getSchemaRegionStatistics().getSeriesNumber();
}
- private List<String> analyzeDataTypeOfDelayedViews() {
- if (this.delayedLogicalViewList == null || this.delayedLogicalViewList.size() <= 0) {
- return new ArrayList<>();
- }
- // fetch schema of source paths of views
- List<ViewExpression> viewExpressionList = new ArrayList<>();
- for (ITimeSeriesSchemaInfo series : this.delayedLogicalViewList) {
- viewExpressionList.add(((LogicalViewSchema) series.getSchema()).getExpression());
- }
- GetSourcePathsVisitor getSourcePathsVisitor = new GetSourcePathsVisitor();
- List<PartialPath> sourcePathsNeedFetch;
- PathPatternTree patternTree = new PathPatternTree();
- for (ViewExpression viewExpression : viewExpressionList) {
- sourcePathsNeedFetch = getSourcePathsVisitor.process(viewExpression, null);
- for (PartialPath path : sourcePathsNeedFetch) {
- patternTree.appendFullPath(path);
- }
- }
- ISchemaTree schemaTree = ClusterSchemaFetcher.getInstance().fetchSchema(patternTree, null);
- // process each view expression and get data type
- TransformToExpressionVisitor transformToExpressionVisitor = new TransformToExpressionVisitor();
- CompleteMeasurementSchemaVisitor completeMeasurementSchemaVisitor =
- new CompleteMeasurementSchemaVisitor();
- Map<NodeRef<Expression>, TSDataType> expressionTypes = new HashMap<>();
- List<String> dataTypeStringList = new ArrayList<>();
- for (ViewExpression viewExpression : viewExpressionList) {
- Expression expression = null;
- boolean viewIsBroken = false;
- try {
- expression = transformToExpressionVisitor.process(viewExpression, null);
- expression = completeMeasurementSchemaVisitor.process(expression, schemaTree);
- ExpressionTypeAnalyzer.analyzeExpression(expressionTypes, expression);
- } catch (Exception e) {
- viewIsBroken = true;
- }
- if (viewIsBroken) {
- dataTypeStringList.add(unknownDataTypeString);
- } else {
- dataTypeStringList.add(expressionTypes.get(NodeRef.of(expression)).toString());
- }
- }
- return dataTypeStringList;
- }
-
- @Override
- public void processDelayedTask(TsBlockBuilder builder, String database) {
- if (this.delayedLogicalViewList == null || this.delayedLogicalViewList.size() <= 0) {
- return;
- }
- List<String> dataTypeStringList = this.analyzeDataTypeOfDelayedViews();
- // process delayed tasks
- for (int index = 0; index < this.delayedLogicalViewList.size(); index++) {
- ITimeSeriesSchemaInfo series = this.delayedLogicalViewList.get(index);
- String expressionTypeOfThisView = dataTypeStringList.get(index);
-
- Pair<String, String> deadbandInfo =
- MetaUtils.parseDeadbandInfo(series.getSchema().getProps());
- builder.getTimeColumnBuilder().writeLong(0);
- builder.writeNullableText(0, series.getFullPath());
- builder.writeNullableText(1, series.getAlias());
- builder.writeNullableText(2, database);
- builder.writeNullableText(3, expressionTypeOfThisView);
- builder.writeNullableText(4, null);
- builder.writeNullableText(5, null);
- builder.writeNullableText(6, mapToString(series.getTags()));
- builder.writeNullableText(7, mapToString(series.getAttributes()));
- builder.writeNullableText(8, deadbandInfo.left);
- builder.writeNullableText(9, deadbandInfo.right);
- builder.writeNullableText(10, viewTypeOfLogicalView);
- builder.declarePosition();
- }
- }
-
private String mapToString(Map<String, String> map) {
if (map == null || map.isEmpty()) {
return null;
diff --git a/server/src/main/java/org/apache/iotdb/db/rescon/PrimitiveArrayManager.java b/server/src/main/java/org/apache/iotdb/db/rescon/PrimitiveArrayManager.java
index d10c00cc06f..c0075afe2dd 100644
--- a/server/src/main/java/org/apache/iotdb/db/rescon/PrimitiveArrayManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/rescon/PrimitiveArrayManager.java
@@ -90,7 +90,7 @@ public class PrimitiveArrayManager {
int totalDataTypeSize = 0;
for (TSDataType dataType : TSDataType.values()) {
// VECTOR is ignored
- if (dataType.equals(TSDataType.VECTOR)) {
+ if (dataType.equals(TSDataType.VECTOR) || dataType.equals(TSDataType.UNKNOWN)) {
continue;
}
totalDataTypeSize += dataType.getDataTypeSize();
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/idtable/entry/SchemaEntryTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/idtable/entry/SchemaEntryTest.java
index 630c7550ea7..21b0ccdad57 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/idtable/entry/SchemaEntryTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/idtable/entry/SchemaEntryTest.java
@@ -33,7 +33,7 @@ public class SchemaEntryTest {
public void schemaEntryBuildTest() throws IllegalPathException {
for (TSDataType type : TSDataType.values()) {
// omit vector
- if (type == TSDataType.VECTOR) {
+ if (type == TSDataType.VECTOR || type == TSDataType.UNKNOWN) {
continue;
}
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/enums/TSDataType.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/enums/TSDataType.java
index f4b88db27ca..583a6cd5a24 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/enums/TSDataType.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/enums/TSDataType.java
@@ -44,7 +44,10 @@ public enum TSDataType {
TEXT((byte) 5),
/** VECTOR */
- VECTOR((byte) 6);
+ VECTOR((byte) 6),
+
+ /** UNKNOWN */
+ UNKNOWN((byte) 7);
private final byte type;
@@ -82,6 +85,8 @@ public enum TSDataType {
return TSDataType.TEXT;
case 6:
return TSDataType.VECTOR;
+ case 7:
+ return TSDataType.UNKNOWN;
default:
throw new IllegalArgumentException("Invalid input: " + type);
}