blob: fbe261b5d98751d88e4fca34b6ccc7417f72e6aa [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.idtable;
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.path.AlignedPath;
import org.apache.iotdb.commons.path.MeasurementPath;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.utils.TestOnly;
import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.metadata.idtable.entry.DeviceEntry;
import org.apache.iotdb.db.metadata.idtable.entry.DeviceIDFactory;
import org.apache.iotdb.db.metadata.idtable.entry.DiskSchemaEntry;
import org.apache.iotdb.db.metadata.idtable.entry.IDeviceID;
import org.apache.iotdb.db.metadata.idtable.entry.SchemaEntry;
import org.apache.iotdb.db.metadata.idtable.entry.TimeseriesID;
import org.apache.iotdb.db.metadata.mnode.IMeasurementMNode;
import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
import org.apache.iotdb.db.qp.physical.sys.CreateAlignedTimeSeriesPlan;
import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
import org.apache.iotdb.tsfile.read.TimeValuePair;
import org.apache.iotdb.tsfile.utils.Pair;
import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;
public interface IDTable {
/** logger */
Logger logger = LoggerFactory.getLogger(IDTable.class);
/** iotdb config */
IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
/**
* create aligned timeseries
*
* @param plan create aligned timeseries plan
* @throws MetadataException if the device is not aligned, throw it
*/
void createAlignedTimeseries(CreateAlignedTimeSeriesPlan plan) throws MetadataException;
/**
* create timeseries
*
* @param plan create timeseries plan
* @throws MetadataException if the device is aligned, throw it
*/
void createTimeseries(CreateTimeSeriesPlan plan) throws MetadataException;
/**
* Delete all timeseries matching the given paths
*
* @param fullPaths paths to be deleted
* @return deletion failed Timeseries
* @throws MetadataException
*/
Pair<Integer, Set<String>> deleteTimeseries(List<PartialPath> fullPaths) throws MetadataException;
/**
* check inserting timeseries existence and fill their measurement mnode
*
* @param plan insert plan
* @return reusable device id
* @throws MetadataException if insert plan's aligned value is inconsistent with device
*/
IDeviceID getSeriesSchemas(InsertPlan plan) throws MetadataException;
/**
* register trigger to the timeseries
*
* @param fullPath full path of the timeseries
* @param measurementMNode the timeseries measurement mnode
* @throws MetadataException if the timeseries is not exits
*/
void registerTrigger(PartialPath fullPath, IMeasurementMNode measurementMNode)
throws MetadataException;
/**
* deregister trigger to the timeseries
*
* @param fullPath full path of the timeseries
* @param measurementMNode the timeseries measurement mnode
* @throws MetadataException if the timeseries is not exits
*/
void deregisterTrigger(PartialPath fullPath, IMeasurementMNode measurementMNode)
throws MetadataException;
/**
* get last cache of the timeseies
*
* @param timeseriesID timeseries ID of the timeseries
* @throws MetadataException if the timeseries is not exits
*/
TimeValuePair getLastCache(TimeseriesID timeseriesID) throws MetadataException;
/**
* update last cache of the timeseies
*
* @param timeseriesID timeseries ID of the timeseries
* @param pair last time value pair
* @param highPriorityUpdate is high priority update
* @param latestFlushedTime last flushed time
* @throws MetadataException if the timeseries is not exits
*/
void updateLastCache(
TimeseriesID timeseriesID,
TimeValuePair pair,
boolean highPriorityUpdate,
Long latestFlushedTime)
throws MetadataException;
/** clear id table and close file */
void clear() throws IOException;
/**
* get device entry from device path
*
* @param deviceName device name of the time series
* @return device entry of the timeseries
*/
DeviceEntry getDeviceEntry(String deviceName);
/**
* get schema from device and measurements
*
* @param deviceName device name of the time series
* @param measurementName measurement name of the time series
* @return schema entry of the timeseries
*/
IMeasurementSchema getSeriesSchema(String deviceName, String measurementName);
/**
* get all device entries
*
* @return all device entries
*/
List<DeviceEntry> getAllDeviceEntry();
/**
* put schema entry to id table, currently used in recover
*
* @param devicePath device path (can be device id formed path)
* @param measurement measurement name
* @param schemaEntry schema entry to put
* @param isAligned is the device aligned
*/
void putSchemaEntry(
String devicePath, String measurement, SchemaEntry schemaEntry, boolean isAligned)
throws MetadataException;
/**
* translate query path's device path to device id
*
* @param fullPath full query path
* @return translated query path
*/
static PartialPath translateQueryPath(PartialPath fullPath) {
// if not enable id table, just return original path
if (!config.isEnableIDTable()) {
return fullPath;
}
try {
// handle aligned path
if (fullPath instanceof AlignedPath) {
AlignedPath cur = (AlignedPath) fullPath;
return new AlignedPath(
DeviceIDFactory.getInstance().getDeviceID(cur).toStringID(),
cur.getMeasurementList(),
cur.getSchemaList());
}
// normal path
TimeseriesID timeseriesID = new TimeseriesID(fullPath);
return new MeasurementPath(
timeseriesID.getDeviceID().toStringID(),
timeseriesID.getMeasurement(),
fullPath.getMeasurementSchema());
} catch (MetadataException e) {
logger.error("Error when translate query path: " + fullPath);
throw new IllegalArgumentException("can't translate path to device id, path is: " + fullPath);
}
}
/**
* get DiskSchemaEntries from disk file
*
* @param schemaEntries get the disk pointers from schemaEntries
* @return DiskSchemaEntries
*/
@TestOnly
List<DiskSchemaEntry> getDiskSchemaEntries(List<SchemaEntry> schemaEntries);
@TestOnly
Map<IDeviceID, DeviceEntry>[] getIdTables();
@TestOnly
IDiskSchemaManager getIDiskSchemaManager();
}