blob: 07eb8fbeda16e28ab97b0b9e196ea19ec56364a9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.iotdb.db.metadata.schemaregion.rocksdb.mnode;
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.path.MeasurementPath;
import org.apache.iotdb.db.engine.trigger.executor.TriggerExecutor;
import org.apache.iotdb.db.metadata.lastCache.container.ILastCacheContainer;
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.MNodeType;
import org.apache.iotdb.db.metadata.mnode.container.IMNodeContainer;
import org.apache.iotdb.db.metadata.schemaregion.rocksdb.RSchemaConstants;
import org.apache.iotdb.db.metadata.schemaregion.rocksdb.RSchemaReadWriteHandler;
import org.apache.iotdb.db.metadata.schemaregion.rocksdb.RSchemaUtils;
import org.apache.iotdb.db.metadata.template.Template;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
import org.rocksdb.RocksDBException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Map;
public class RMeasurementMNode extends RMNode implements IMeasurementMNode {
protected String alias;
private IMeasurementSchema schema;
private Map<String, String> tags;
private Map<String, String> attributes;
/**
* Constructor of MNode.
*
* @param fullPath
*/
public RMeasurementMNode(String fullPath, RSchemaReadWriteHandler readWriteHandler) {
super(fullPath, readWriteHandler);
}
@Override
void updateChildNode(String childName, int childNameMaxLevel) throws MetadataException {
String innerName =
RSchemaUtils.convertPartialPathToInner(
childName, childNameMaxLevel, RMNodeType.MEASUREMENT.getValue());
// todo all existing attributes of the measurementNode need to be written
try {
readWriteHandler.updateNode(innerName.getBytes(), new byte[] {});
} catch (RocksDBException e) {
throw new MetadataException(e);
}
}
public RMeasurementMNode(
String fullPath, byte[] value, RSchemaReadWriteHandler readWriteHandler) {
super(fullPath, readWriteHandler);
deserialize(value);
}
@Override
public IEntityMNode getParent() {
if (super.getParent() == null) {
return null;
}
return parent.getAsEntityMNode();
}
@Override
public MeasurementPath getMeasurementPath() {
MeasurementPath result = new MeasurementPath(super.getPartialPath(), schema);
result.setUnderAlignedEntity(getParent().isAligned());
if (alias != null && !alias.isEmpty()) {
result.setMeasurementAlias(alias);
}
return result;
}
@Override
public IMeasurementSchema getSchema() {
return schema;
}
@Override
public TSDataType getDataType(String measurementId) {
return schema.getType();
}
// unsupported exceptions
@Override
public long getOffset() {
throw new UnsupportedOperationException();
}
@Override
public void setOffset(long offset) {
throw new UnsupportedOperationException();
}
@Override
public String getAlias() {
return alias;
}
@Override
public void setAlias(String alias) {
this.alias = alias;
}
@Override
public TriggerExecutor getTriggerExecutor() {
return null;
}
@Override
public void setTriggerExecutor(TriggerExecutor triggerExecutor) {
throw new UnsupportedOperationException();
}
@Override
public ILastCacheContainer getLastCacheContainer() {
throw new UnsupportedOperationException();
}
@Override
public void setLastCacheContainer(ILastCacheContainer lastCacheContainer) {
throw new UnsupportedOperationException();
}
@Override
public boolean isPreDeleted() {
return false;
}
@Override
public void setPreDeleted(boolean preDeleted) {}
@Override
public void serializeTo(MLogWriter logWriter) throws IOException {
throw new UnsupportedOperationException();
}
private void deserialize(byte[] value) {
ByteBuffer byteBuffer = ByteBuffer.wrap(value);
// skip the version flag and node type flag
ReadWriteIOUtils.readBytes(byteBuffer, 2);
while (byteBuffer.hasRemaining()) {
byte blockType = ReadWriteIOUtils.readByte(byteBuffer);
switch (blockType) {
case RSchemaConstants.DATA_BLOCK_TYPE_ALIAS:
alias = ReadWriteIOUtils.readString(byteBuffer);
break;
case RSchemaConstants.DATA_BLOCK_TYPE_SCHEMA:
schema = MeasurementSchema.deserializeFrom(byteBuffer);
break;
case RSchemaConstants.DATA_BLOCK_TYPE_TAGS:
tags = ReadWriteIOUtils.readMap(byteBuffer);
break;
case RSchemaConstants.DATA_BLOCK_TYPE_ATTRIBUTES:
attributes = ReadWriteIOUtils.readMap(byteBuffer);
break;
default:
break;
}
}
}
@Override
public boolean hasChild(String name) {
return false;
}
@Override
public IMNode getChild(String name) {
throw new RuntimeException(
String.format(
"current node %s is a MeasurementMNode, can not get child %s", super.name, name));
}
@Override
public IMNode addChild(String name, IMNode child) {
// Do nothing
return child;
}
@Override
public IMNode addChild(IMNode child) {
return null;
}
@Override
public IMNode deleteChild(String name) {
// Do nothing
return null;
}
@Override
public void replaceChild(String oldChildName, IMNode newChildNode) {}
@Override
public IMNodeContainer getChildren() {
throw new UnsupportedOperationException();
}
@Override
public Template getUpperTemplate() {
throw new UnsupportedOperationException();
}
@Override
public void setSchemaTemplate(Template schemaTemplate) {}
@Override
public Template getSchemaTemplate() {
throw new RuntimeException(
String.format("current node %s is a MeasurementMNode, can not get Device Template", name));
}
@Override
public void setUseTemplate(boolean useTemplate) {}
@Override
public boolean isMeasurement() {
return true;
}
@Override
public MNodeType getMNodeType(Boolean isConfig) {
return MNodeType.MEASUREMENT;
}
public Map<String, String> getTags() {
return tags;
}
public Map<String, String> getAttributes() {
return attributes;
}
public void setTags(Map<String, String> tags) {
this.tags = tags;
}
public void setAttributes(Map<String, String> attributes) {
this.attributes = attributes;
}
public byte[] getRocksDBValue() throws IOException {
return RSchemaUtils.buildMeasurementNodeValue(schema, alias, tags, attributes);
}
}