mirror of https://github.com/apache/iotdb
[IOTDB-165][TsFile] Delete a current version and add a number version and an exception. (#409)
* change magic string and add version in TsFile
This commit is contained in:
parent
53dbf8412c
commit
a8d283e077
2
pom.xml
2
pom.xml
|
@ -355,7 +355,7 @@
|
|||
<dependency>
|
||||
<groupId>org.xerial.snappy</groupId>
|
||||
<artifactId>snappy-java</artifactId>
|
||||
<version>1.0.5-M1</version>
|
||||
<version>1.1.7.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.thrift</groupId>
|
||||
|
|
|
@ -20,5 +20,6 @@
|
|||
-->
|
||||
|
||||
## 0.8.0 (version-0) -> version-1
|
||||
|
||||
format: #PR ID change
|
||||
#409 Genius_pig Delete a current version and add a number version.
|
||||
*
|
|
@ -50,11 +50,9 @@ public class TSFileConfig {
|
|||
public static final String STRING_ENCODING = "UTF-8";
|
||||
public static final Charset STRING_CHARSET = Charset.forName(STRING_ENCODING);
|
||||
public static final String CONFIG_FILE_NAME = "tsfile-format.properties";
|
||||
public static final String MAGIC_STRING = "TsFilev0.8.0";
|
||||
/**
|
||||
* Current version is 3.
|
||||
*/
|
||||
public static final int CURRENT_VERSION = 3;
|
||||
public static final String MAGIC_STRING = "TsFile";
|
||||
public static final String VERSION_NUMBER = "000001";
|
||||
|
||||
/**
|
||||
* The default grow size of class BatchData.
|
||||
*/
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* 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.tsfile.exception;
|
||||
|
||||
public class NotCompatibleException extends TsFileRuntimeException {
|
||||
|
||||
private static final long serialVersionUID = -3765109817887078265L;
|
||||
public NotCompatibleException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
|
@ -43,12 +43,7 @@ public class TsFileMetaData {
|
|||
* TSFile schema for this file. This schema contains metadata for all the measurements.
|
||||
*/
|
||||
private Map<String, MeasurementSchema> measurementSchema = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Version of this file.
|
||||
*/
|
||||
private int currentVersion;
|
||||
|
||||
|
||||
/**
|
||||
* String for application that wrote this file. This should be in the format [Application] version
|
||||
* [App Version](build [App Build Hash]). e.g. impala version 1.0 (build SHA-1_hash_code)
|
||||
|
@ -69,13 +64,11 @@ public class TsFileMetaData {
|
|||
* construct function for TsFileMetaData.
|
||||
*
|
||||
* @param measurementSchema - time series info list
|
||||
* @param currentVersion - current version
|
||||
*/
|
||||
public TsFileMetaData(Map<String, TsDeviceMetadataIndex> deviceMap,
|
||||
Map<String, MeasurementSchema> measurementSchema, int currentVersion) {
|
||||
Map<String, MeasurementSchema> measurementSchema) {
|
||||
this.deviceIndexMap = deviceMap;
|
||||
this.measurementSchema = measurementSchema;
|
||||
this.currentVersion = currentVersion;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -112,8 +105,6 @@ public class TsFileMetaData {
|
|||
}
|
||||
}
|
||||
|
||||
fileMetaData.currentVersion = ReadWriteIOUtils.readInt(inputStream);
|
||||
|
||||
if (ReadWriteIOUtils.readIsNull(inputStream)) {
|
||||
fileMetaData.createdBy = ReadWriteIOUtils.readString(inputStream);
|
||||
}
|
||||
|
@ -157,8 +148,6 @@ public class TsFileMetaData {
|
|||
}
|
||||
}
|
||||
|
||||
fileMetaData.currentVersion = ReadWriteIOUtils.readInt(buffer);
|
||||
|
||||
if (ReadWriteIOUtils.readIsNull(buffer)) {
|
||||
fileMetaData.createdBy = ReadWriteIOUtils.readString(buffer);
|
||||
}
|
||||
|
@ -180,16 +169,7 @@ public class TsFileMetaData {
|
|||
@Override
|
||||
public String toString() {
|
||||
return "TsFileMetaData{" + "deviceIndexMap=" + deviceIndexMap + ", measurementSchema="
|
||||
+ measurementSchema
|
||||
+ ", CURRENT_VERSION=" + currentVersion + ", createdBy='" + createdBy + '\'' + '}';
|
||||
}
|
||||
|
||||
public int getCurrentVersion() {
|
||||
return currentVersion;
|
||||
}
|
||||
|
||||
public void setCurrentVersion(int currentVersion) {
|
||||
this.currentVersion = currentVersion;
|
||||
+ measurementSchema + ", createdBy='" + createdBy + '\'' + '}';
|
||||
}
|
||||
|
||||
public String getCreatedBy() {
|
||||
|
@ -259,8 +239,6 @@ public class TsFileMetaData {
|
|||
byteLen += entry.getValue().serializeTo(outputStream);
|
||||
}
|
||||
|
||||
byteLen += ReadWriteIOUtils.write(currentVersion, outputStream);
|
||||
|
||||
byteLen += ReadWriteIOUtils.writeIsNull(createdBy, outputStream);
|
||||
if (createdBy != null) {
|
||||
byteLen += ReadWriteIOUtils.write(createdBy, outputStream);
|
||||
|
@ -293,8 +271,6 @@ public class TsFileMetaData {
|
|||
byteLen += entry.getValue().serializeTo(buffer);
|
||||
}
|
||||
|
||||
byteLen += ReadWriteIOUtils.write(currentVersion, buffer);
|
||||
|
||||
byteLen += ReadWriteIOUtils.writeIsNull(createdBy, buffer);
|
||||
if (createdBy != null) {
|
||||
byteLen += ReadWriteIOUtils.write(createdBy, buffer);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/*
|
||||
* 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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/*
|
||||
* 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
|
||||
|
@ -18,9 +18,21 @@
|
|||
*/
|
||||
package org.apache.iotdb.tsfile.read;
|
||||
|
||||
import static org.apache.iotdb.tsfile.write.writer.TsFileIOWriter.magicStringBytes;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
|
||||
import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
|
||||
import org.apache.iotdb.tsfile.compress.IUnCompressor;
|
||||
import org.apache.iotdb.tsfile.exception.NotCompatibleException;
|
||||
import org.apache.iotdb.tsfile.file.MetaMarker;
|
||||
import org.apache.iotdb.tsfile.file.footer.ChunkGroupFooter;
|
||||
import org.apache.iotdb.tsfile.file.header.ChunkHeader;
|
||||
|
@ -40,14 +52,6 @@ import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.*;
|
||||
|
||||
import static org.apache.iotdb.tsfile.write.writer.TsFileIOWriter.magicStringBytes;
|
||||
|
||||
public class TsFileSequenceReader implements AutoCloseable {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(TsFileSequenceReader.class);
|
||||
|
@ -66,8 +70,8 @@ public class TsFileSequenceReader implements AutoCloseable {
|
|||
|
||||
/**
|
||||
* Create a file reader of the given file. The reader will read the tail of the file to get the
|
||||
* file metadata size.Then the reader will skip the first TSFileConfig.MAGIC_STRING.length() bytes
|
||||
* of the file for preparing reading real data.
|
||||
* file metadata size.Then the reader will skip the first TSFileConfig.MAGIC_STRING.getBytes().length +
|
||||
* TSFileConfig.NUMBER_VERSION.getBytes().length bytes of the file for preparing reading real data.
|
||||
*
|
||||
* @param file the data file
|
||||
* @throws IOException If some I/O error occurs
|
||||
|
@ -80,7 +84,7 @@ public class TsFileSequenceReader implements AutoCloseable {
|
|||
* construct function for TsFileSequenceReader.
|
||||
*
|
||||
* @param file -given file name
|
||||
* @param loadMetadataSize -load meta data size
|
||||
* @param loadMetadataSize -whether load meta data size
|
||||
*/
|
||||
public TsFileSequenceReader(String file, boolean loadMetadataSize) throws IOException {
|
||||
this.file = file;
|
||||
|
@ -106,8 +110,8 @@ public class TsFileSequenceReader implements AutoCloseable {
|
|||
|
||||
/**
|
||||
* Create a file reader of the given file. The reader will read the tail of the file to get the
|
||||
* file metadata size.Then the reader will skip the first TSFileConfig.MAGIC_STRING.length() bytes
|
||||
* of the file for preparing reading real data.
|
||||
* file metadata size.Then the reader will skip the first TSFileConfig.MAGIC_STRING.getBytes().length +
|
||||
* TSFileConfig.NUMBER_VERSION.getBytes().length bytes of the file for preparing reading real data.
|
||||
*
|
||||
* @param input given input
|
||||
*/
|
||||
|
@ -152,14 +156,12 @@ public class TsFileSequenceReader implements AutoCloseable {
|
|||
public void loadMetadataSize() throws IOException {
|
||||
ByteBuffer metadataSize = ByteBuffer.allocate(Integer.BYTES);
|
||||
tsFileInput.read(metadataSize,
|
||||
tsFileInput.size() - TSFileConfig.MAGIC_STRING.length() - Integer.BYTES);
|
||||
tsFileInput.size() - TSFileConfig.MAGIC_STRING.getBytes().length - Integer.BYTES);
|
||||
metadataSize.flip();
|
||||
// read file metadata size and position
|
||||
fileMetadataSize = ReadWriteIOUtils.readInt(metadataSize);
|
||||
fileMetadataPos =
|
||||
tsFileInput.size() - TSFileConfig.MAGIC_STRING.length() - Integer.BYTES - fileMetadataSize;
|
||||
// skip the magic header
|
||||
tsFileInput.position(TSFileConfig.MAGIC_STRING.length());
|
||||
tsFileInput.size() - TSFileConfig.MAGIC_STRING.getBytes().length - Integer.BYTES - fileMetadataSize;
|
||||
}
|
||||
|
||||
public long getFileMetadataPos() {
|
||||
|
@ -176,8 +178,8 @@ public class TsFileSequenceReader implements AutoCloseable {
|
|||
public String readTailMagic() throws IOException {
|
||||
long totalSize = tsFileInput.size();
|
||||
|
||||
ByteBuffer magicStringBytes = ByteBuffer.allocate(TSFileConfig.MAGIC_STRING.length());
|
||||
tsFileInput.read(magicStringBytes, totalSize - TSFileConfig.MAGIC_STRING.length());
|
||||
ByteBuffer magicStringBytes = ByteBuffer.allocate(TSFileConfig.MAGIC_STRING.getBytes().length);
|
||||
tsFileInput.read(magicStringBytes, totalSize - TSFileConfig.MAGIC_STRING.getBytes().length);
|
||||
magicStringBytes.flip();
|
||||
return new String(magicStringBytes.array());
|
||||
}
|
||||
|
@ -186,8 +188,8 @@ public class TsFileSequenceReader implements AutoCloseable {
|
|||
* whether the file is a complete TsFile: only if the head magic and tail magic string exists.
|
||||
*/
|
||||
public boolean isComplete() throws IOException {
|
||||
return tsFileInput.size() >= TSFileConfig.MAGIC_STRING.length() * 2 && readTailMagic()
|
||||
.equals(readHeadMagic());
|
||||
return tsFileInput.size() >= TSFileConfig.MAGIC_STRING.getBytes().length * 2 + TSFileConfig.VERSION_NUMBER.getBytes().length &&
|
||||
readTailMagic().equals(readHeadMagic());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -204,7 +206,7 @@ public class TsFileSequenceReader implements AutoCloseable {
|
|||
* to the end of the magic head string.
|
||||
*/
|
||||
public String readHeadMagic(boolean movePosition) throws IOException {
|
||||
ByteBuffer magicStringBytes = ByteBuffer.allocate(TSFileConfig.MAGIC_STRING.length());
|
||||
ByteBuffer magicStringBytes = ByteBuffer.allocate(TSFileConfig.MAGIC_STRING.getBytes().length);
|
||||
if (movePosition) {
|
||||
tsFileInput.position(0);
|
||||
tsFileInput.read(magicStringBytes);
|
||||
|
@ -215,6 +217,21 @@ public class TsFileSequenceReader implements AutoCloseable {
|
|||
return new String(magicStringBytes.array());
|
||||
}
|
||||
|
||||
/**
|
||||
* this function reads version number and checks compatibility of TsFile.
|
||||
*/
|
||||
public String readVersionNumber() throws IOException, NotCompatibleException {
|
||||
ByteBuffer versionNumberBytes = ByteBuffer.allocate(TSFileConfig.VERSION_NUMBER.getBytes().length);
|
||||
tsFileInput.read(versionNumberBytes, TSFileConfig.MAGIC_STRING.getBytes().length);
|
||||
versionNumberBytes.flip();
|
||||
String versionNumberString = new String(versionNumberBytes.array());
|
||||
if(!versionNumberString.equals(TSFileConfig.VERSION_NUMBER)) {
|
||||
throw new NotCompatibleException("TsFile isn't compatible. " + TSFileConfig.MAGIC_STRING +
|
||||
TSFileConfig.VERSION_NUMBER + " is expected.");
|
||||
}
|
||||
return versionNumberString;
|
||||
}
|
||||
|
||||
/**
|
||||
* this function does not modify the position of the file reader.
|
||||
*/
|
||||
|
@ -237,7 +254,7 @@ public class TsFileSequenceReader implements AutoCloseable {
|
|||
return data.get();
|
||||
} else {
|
||||
//no real data
|
||||
return TSFileConfig.MAGIC_STRING.length();
|
||||
return TSFileConfig.MAGIC_STRING.getBytes().length + TSFileConfig.VERSION_NUMBER.getBytes().length;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -521,15 +538,16 @@ public class TsFileSequenceReader implements AutoCloseable {
|
|||
long endOffsetOfChunkGroup;
|
||||
long versionOfChunkGroup = 0;
|
||||
|
||||
if (fileSize < TSFileConfig.MAGIC_STRING.length()) {
|
||||
if (fileSize < TSFileConfig.MAGIC_STRING.getBytes().length + TSFileConfig.VERSION_NUMBER.getBytes().length) {
|
||||
return TsFileCheckStatus.INCOMPATIBLE_FILE;
|
||||
}
|
||||
String magic = readHeadMagic(true);
|
||||
tsFileInput.position(TSFileConfig.MAGIC_STRING.getBytes().length + TSFileConfig.VERSION_NUMBER.getBytes().length);
|
||||
if (!magic.equals(TSFileConfig.MAGIC_STRING)) {
|
||||
return TsFileCheckStatus.INCOMPATIBLE_FILE;
|
||||
}
|
||||
|
||||
if (fileSize == TSFileConfig.MAGIC_STRING.length()) {
|
||||
if (fileSize == TSFileConfig.MAGIC_STRING.getBytes().length + TSFileConfig.VERSION_NUMBER.getBytes().length) {
|
||||
return TsFileCheckStatus.ONLY_MAGIC_HEAD;
|
||||
} else if (readTailMagic().equals(magic)) {
|
||||
loadMetadataSize();
|
||||
|
|
|
@ -100,7 +100,7 @@ public class RestorableTsFileIOWriter extends TsFileIOWriter {
|
|||
String.format("%s is not in TsFile format.", file.getAbsolutePath()));
|
||||
} else if (truncatedPosition == TsFileCheckStatus.ONLY_MAGIC_HEAD) {
|
||||
crashed = true;
|
||||
out.truncate(TSFileConfig.MAGIC_STRING.length());
|
||||
out.truncate(TSFileConfig.MAGIC_STRING.getBytes().length + TSFileConfig.VERSION_NUMBER.getBytes().length);
|
||||
} else {
|
||||
crashed = true;
|
||||
//remove broken data
|
||||
|
|
|
@ -63,11 +63,13 @@ import org.slf4j.LoggerFactory;
|
|||
public class TsFileIOWriter {
|
||||
|
||||
public static final byte[] magicStringBytes;
|
||||
public static final byte[] versionNumberBytes;
|
||||
private static final Logger logger = LoggerFactory.getLogger(TsFileIOWriter.class);
|
||||
protected static final TSFileConfig config = TSFileDescriptor.getInstance().getConfig();
|
||||
|
||||
static {
|
||||
magicStringBytes = BytesUtils.stringToBytes(TSFileConfig.MAGIC_STRING);
|
||||
versionNumberBytes = TSFileConfig.VERSION_NUMBER.getBytes();
|
||||
}
|
||||
|
||||
protected TsFileOutput out;
|
||||
|
@ -141,6 +143,7 @@ public class TsFileIOWriter {
|
|||
|
||||
protected void startFile() throws IOException {
|
||||
out.write(magicStringBytes);
|
||||
out.write(versionNumberBytes);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -263,8 +266,7 @@ public class TsFileIOWriter {
|
|||
Map<String, TsDeviceMetadataIndex> tsDeviceMetadataIndexMap = flushTsDeviceMetaDataAndGetIndex(
|
||||
this.chunkGroupMetaDataList);
|
||||
|
||||
TsFileMetaData tsFileMetaData = new TsFileMetaData(tsDeviceMetadataIndexMap, schemaDescriptors,
|
||||
TSFileConfig.CURRENT_VERSION);
|
||||
TsFileMetaData tsFileMetaData = new TsFileMetaData(tsDeviceMetadataIndexMap, schemaDescriptors);
|
||||
tsFileMetaData.setTotalChunkNum(totalChunkNum);
|
||||
tsFileMetaData.setInvalidChunkNum(invalidChunkNum);
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@ import java.io.IOException;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
|
||||
import org.apache.iotdb.tsfile.exception.write.WriteProcessException;
|
||||
import org.apache.iotdb.tsfile.file.MetaMarker;
|
||||
import org.apache.iotdb.tsfile.file.header.ChunkHeader;
|
||||
|
@ -41,7 +42,7 @@ import org.junit.Test;
|
|||
public class ChunkGroupMetaDataTest {
|
||||
|
||||
public static final String DELTA_OBJECT_UID = "delta-3312";
|
||||
final static String PATH = "target/outputChunkGroup.tsfile";
|
||||
private final static String PATH = "target/outputChunkGroup.tsfile";
|
||||
private static String testDataFile;
|
||||
|
||||
@BeforeClass
|
||||
|
@ -64,6 +65,7 @@ public class ChunkGroupMetaDataTest {
|
|||
@Test
|
||||
public void testOffset() throws IOException {
|
||||
TsFileSequenceReader reader = new TsFileSequenceReader(testDataFile);
|
||||
reader.position(TSFileConfig.MAGIC_STRING.getBytes().length + TSFileConfig.VERSION_NUMBER.getBytes().length);
|
||||
TsFileMetaData metaData = reader.readFileMetadata();
|
||||
List<Pair<Long, Long>> offsetList = new ArrayList<>();
|
||||
long startOffset = reader.position();
|
||||
|
|
|
@ -53,8 +53,7 @@ public class TestHelper {
|
|||
private static final String LAST_VALUE = "222";
|
||||
|
||||
public static TsFileMetaData createSimpleFileMetaData() {
|
||||
TsFileMetaData metaData = new TsFileMetaData(generateDeviceIndexMetadataMap(), new HashMap<>(),
|
||||
TsFileMetaDataTest.VERSION);
|
||||
TsFileMetaData metaData = new TsFileMetaData(generateDeviceIndexMetadataMap(), new HashMap<>());
|
||||
metaData.addMeasurementSchema(TestHelper.createSimpleMeasurementSchema());
|
||||
metaData.addMeasurementSchema(TestHelper.createSimpleMeasurementSchema());
|
||||
metaData.setCreatedBy(TsFileMetaDataTest.CREATED_BY);
|
||||
|
|
|
@ -198,7 +198,6 @@ public class Utils {
|
|||
}
|
||||
}
|
||||
|
||||
assertEquals(metadata1.getCurrentVersion(), metadata2.getCurrentVersion());
|
||||
assertEquals(metadata1.getCreatedBy(), metadata2.getCreatedBy());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/*
|
||||
* 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
|
||||
|
@ -20,6 +20,7 @@
|
|||
package org.apache.iotdb.tsfile.read;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.io.File;
|
||||
|
@ -48,12 +49,13 @@ public class TsFileRestorableReaderTest {
|
|||
assertTrue(file.delete());
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
@Test
|
||||
public void testToReadDamagedFileNoRepair() throws IOException {
|
||||
File file = TSFileFactory.INSTANCE.getFile(FILE_PATH);
|
||||
|
||||
TsFileGeneratorForTest.writeFileWithOneIncompleteChunkHeader(file);
|
||||
// This should throw an Illegal Argument Exception
|
||||
TsFileSequenceReader reader = new TsFileRestorableReader(FILE_PATH, false);
|
||||
assertFalse(reader.isComplete());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/*
|
||||
* 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
|
||||
|
@ -24,6 +24,7 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
|
||||
import org.apache.iotdb.tsfile.exception.write.WriteProcessException;
|
||||
import org.apache.iotdb.tsfile.file.MetaMarker;
|
||||
import org.apache.iotdb.tsfile.file.header.ChunkHeader;
|
||||
|
@ -32,39 +33,36 @@ import org.apache.iotdb.tsfile.file.metadata.ChunkGroupMetaData;
|
|||
import org.apache.iotdb.tsfile.file.metadata.TsDeviceMetadata;
|
||||
import org.apache.iotdb.tsfile.file.metadata.TsDeviceMetadataIndex;
|
||||
import org.apache.iotdb.tsfile.file.metadata.TsFileMetaData;
|
||||
import org.apache.iotdb.tsfile.utils.FileGenerator;
|
||||
import org.apache.iotdb.tsfile.utils.Pair;
|
||||
import org.apache.iotdb.tsfile.utils.TsFileGeneratorForTest;
|
||||
import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class TsFileSequenceReaderTest {
|
||||
|
||||
private static final String FILE_PATH = TsFileGeneratorForTest.outputDataFile;
|
||||
private TsFileSequenceReader fileReader;
|
||||
private int rowCount = 1000;
|
||||
private static final String FILE_PATH = FileGenerator.outputDataFile;
|
||||
private ReadOnlyTsFile tsFile;
|
||||
|
||||
@Before
|
||||
public void before() throws InterruptedException, WriteProcessException, IOException {
|
||||
TsFileGeneratorForTest.generateFile(rowCount, 16 * 1024 * 1024, 10000);
|
||||
fileReader = new TsFileSequenceReader(FILE_PATH);
|
||||
int rowCount = 1000;
|
||||
FileGenerator.generateFile(rowCount, 10000);
|
||||
TsFileSequenceReader fileReader = new TsFileSequenceReader(FILE_PATH);
|
||||
tsFile = new ReadOnlyTsFile(fileReader);
|
||||
}
|
||||
|
||||
@After
|
||||
public void after() throws IOException {
|
||||
tsFile.close();
|
||||
TsFileGeneratorForTest.after();
|
||||
FileGenerator.after();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReadTsFileSequently() throws IOException {
|
||||
TsFileSequenceReader reader = new TsFileSequenceReader(FILE_PATH);
|
||||
reader.position(TSFileConfig.MAGIC_STRING.getBytes().length + TSFileConfig.VERSION_NUMBER.getBytes().length);
|
||||
TsFileMetaData metaData = reader.readFileMetadata();
|
||||
List<Pair<Long, Long>> offsetList = new ArrayList<>();
|
||||
long startOffset = reader.position();
|
||||
|
|
|
@ -38,79 +38,79 @@ public class DigestFilterTest {
|
|||
@Test
|
||||
public void testEq() {
|
||||
Filter timeEq = TimeFilter.eq(10L);
|
||||
Assert.assertEquals(true, timeEq.satisfy(digest1));
|
||||
Assert.assertEquals(false, timeEq.satisfy(digest2));
|
||||
Assert.assertEquals(false, timeEq.satisfy(digest3));
|
||||
Assert.assertTrue(timeEq.satisfy(digest1));
|
||||
Assert.assertFalse(timeEq.satisfy(digest2));
|
||||
Assert.assertFalse(timeEq.satisfy(digest3));
|
||||
|
||||
Filter valueEq = ValueFilter.eq(100);
|
||||
Assert.assertEquals(true, valueEq.satisfy(digest1));
|
||||
Assert.assertEquals(false, valueEq.satisfy(digest2));
|
||||
Assert.assertEquals(true, valueEq.satisfy(digest3));
|
||||
Assert.assertTrue(valueEq.satisfy(digest1));
|
||||
Assert.assertFalse(valueEq.satisfy(digest2));
|
||||
Assert.assertTrue(valueEq.satisfy(digest3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGt() {
|
||||
Filter timeGt = TimeFilter.gt(100L);
|
||||
Assert.assertEquals(false, timeGt.satisfy(digest1));
|
||||
Assert.assertEquals(true, timeGt.satisfy(digest2));
|
||||
Assert.assertEquals(true, timeGt.satisfy(digest3));
|
||||
Assert.assertFalse(timeGt.satisfy(digest1));
|
||||
Assert.assertTrue(timeGt.satisfy(digest2));
|
||||
Assert.assertTrue(timeGt.satisfy(digest3));
|
||||
|
||||
Filter valueGt = ValueFilter.gt(100);
|
||||
Assert.assertEquals(false, valueGt.satisfy(digest1));
|
||||
Assert.assertEquals(true, valueGt.satisfy(digest2));
|
||||
Assert.assertEquals(true, valueGt.satisfy(digest3));
|
||||
Assert.assertFalse(valueGt.satisfy(digest1));
|
||||
Assert.assertTrue(valueGt.satisfy(digest2));
|
||||
Assert.assertTrue(valueGt.satisfy(digest3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGtEq() {
|
||||
Filter timeGtEq = TimeFilter.gtEq(100L);
|
||||
Assert.assertEquals(true, timeGtEq.satisfy(digest1));
|
||||
Assert.assertEquals(true, timeGtEq.satisfy(digest2));
|
||||
Assert.assertEquals(true, timeGtEq.satisfy(digest3));
|
||||
Assert.assertTrue(timeGtEq.satisfy(digest1));
|
||||
Assert.assertTrue(timeGtEq.satisfy(digest2));
|
||||
Assert.assertTrue(timeGtEq.satisfy(digest3));
|
||||
|
||||
Filter valueGtEq = ValueFilter.gtEq(100);
|
||||
Assert.assertEquals(true, valueGtEq.satisfy(digest1));
|
||||
Assert.assertEquals(true, valueGtEq.satisfy(digest3));
|
||||
Assert.assertEquals(true, valueGtEq.satisfy(digest3));
|
||||
Assert.assertTrue(valueGtEq.satisfy(digest1));
|
||||
Assert.assertTrue(valueGtEq.satisfy(digest3));
|
||||
Assert.assertTrue(valueGtEq.satisfy(digest3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLt() {
|
||||
Filter timeLt = TimeFilter.lt(101L);
|
||||
Assert.assertEquals(true, timeLt.satisfy(digest1));
|
||||
Assert.assertEquals(false, timeLt.satisfy(digest2));
|
||||
Assert.assertEquals(false, timeLt.satisfy(digest3));
|
||||
Assert.assertTrue(timeLt.satisfy(digest1));
|
||||
Assert.assertFalse(timeLt.satisfy(digest2));
|
||||
Assert.assertFalse(timeLt.satisfy(digest3));
|
||||
|
||||
Filter valueLt = ValueFilter.lt(101);
|
||||
Assert.assertEquals(true, valueLt.satisfy(digest1));
|
||||
Assert.assertEquals(false, valueLt.satisfy(digest2));
|
||||
Assert.assertEquals(true, valueLt.satisfy(digest3));
|
||||
Assert.assertTrue(valueLt.satisfy(digest1));
|
||||
Assert.assertFalse(valueLt.satisfy(digest2));
|
||||
Assert.assertTrue(valueLt.satisfy(digest3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLtEq() {
|
||||
Filter timeLtEq = TimeFilter.ltEq(101L);
|
||||
Assert.assertEquals(true, timeLtEq.satisfy(digest1));
|
||||
Assert.assertEquals(true, timeLtEq.satisfy(digest2));
|
||||
Assert.assertEquals(true, timeLtEq.satisfy(digest3));
|
||||
Assert.assertTrue(timeLtEq.satisfy(digest1));
|
||||
Assert.assertTrue(timeLtEq.satisfy(digest2));
|
||||
Assert.assertTrue(timeLtEq.satisfy(digest3));
|
||||
|
||||
Filter valueLtEq = ValueFilter.ltEq(101);
|
||||
Assert.assertEquals(true, valueLtEq.satisfy(digest1));
|
||||
Assert.assertEquals(true, valueLtEq.satisfy(digest2));
|
||||
Assert.assertEquals(true, valueLtEq.satisfy(digest3));
|
||||
Assert.assertTrue(valueLtEq.satisfy(digest1));
|
||||
Assert.assertTrue(valueLtEq.satisfy(digest2));
|
||||
Assert.assertTrue(valueLtEq.satisfy(digest3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAndOr() {
|
||||
Filter andFilter = FilterFactory.and(TimeFilter.gt(10L), ValueFilter.lt(50));
|
||||
Assert.assertEquals(true, andFilter.satisfy(digest1));
|
||||
Assert.assertEquals(false, andFilter.satisfy(digest2));
|
||||
Assert.assertEquals(true, andFilter.satisfy(digest3));
|
||||
Assert.assertTrue(andFilter.satisfy(digest1));
|
||||
Assert.assertFalse(andFilter.satisfy(digest2));
|
||||
Assert.assertTrue(andFilter.satisfy(digest3));
|
||||
|
||||
Filter orFilter = FilterFactory.or(andFilter, TimeFilter.eq(200L));
|
||||
Assert.assertEquals(true, orFilter.satisfy(digest1));
|
||||
Assert.assertEquals(true, orFilter.satisfy(digest2));
|
||||
Assert.assertEquals(true, orFilter.satisfy(digest3));
|
||||
Assert.assertTrue(orFilter.satisfy(digest1));
|
||||
Assert.assertTrue(orFilter.satisfy(digest2));
|
||||
Assert.assertTrue(orFilter.satisfy(digest3));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -27,7 +27,6 @@ import org.apache.iotdb.tsfile.read.expression.impl.BinaryExpression;
|
|||
import org.apache.iotdb.tsfile.read.expression.impl.GlobalTimeExpression;
|
||||
import org.apache.iotdb.tsfile.read.expression.impl.SingleSeriesExpression;
|
||||
import org.apache.iotdb.tsfile.read.expression.util.ExpressionOptimizer;
|
||||
import org.apache.iotdb.tsfile.read.expression.util.ExpressionPrinter;
|
||||
import org.apache.iotdb.tsfile.read.filter.basic.Filter;
|
||||
import org.apache.iotdb.tsfile.read.filter.factory.FilterFactory;
|
||||
import org.junit.After;
|
||||
|
@ -67,7 +66,7 @@ public class IExpressionOptimizerTest {
|
|||
new GlobalTimeExpression(TimeFilter.gt(200L)));
|
||||
|
||||
} catch (QueryFilterOptimizationException e) {
|
||||
e.printStackTrace();
|
||||
Assert.fail();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -96,12 +95,11 @@ public class IExpressionOptimizerTest {
|
|||
IExpression expression = BinaryExpression
|
||||
.and(BinaryExpression.or(singleSeriesExp1, singleSeriesExp2),
|
||||
singleSeriesExp3);
|
||||
Assert.assertEquals(true,
|
||||
expression.toString()
|
||||
.equals(expressionOptimizer.optimize(expression, selectedSeries).toString()));
|
||||
Assert.assertEquals(expression.toString(),
|
||||
expressionOptimizer.optimize(expression, selectedSeries).toString());
|
||||
|
||||
} catch (QueryFilterOptimizationException e) {
|
||||
e.printStackTrace();
|
||||
Assert.fail();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -123,7 +121,7 @@ public class IExpressionOptimizerTest {
|
|||
try {
|
||||
String rightRet = "[[d2.s1:((value > 100 || value < 50) && time < 14001234)] || [d1.s2:((value > 100.5 || value < 50.6) && time < 14001234)]]";
|
||||
IExpression regularFilter = expressionOptimizer.optimize(expression, selectedSeries);
|
||||
Assert.assertEquals(true, rightRet.equals(regularFilter.toString()));
|
||||
Assert.assertEquals(rightRet, regularFilter.toString());
|
||||
} catch (QueryFilterOptimizationException e) {
|
||||
Assert.fail();
|
||||
}
|
||||
|
@ -147,7 +145,7 @@ public class IExpressionOptimizerTest {
|
|||
try {
|
||||
String rightRet = "[[[[[d1.s1:time > 1] || [d2.s1:time > 1]] || [d1.s2:time > 1]] || [d2.s2:time > 1]] || [d2.s1:((value > 100 || value < 50) && time < 14001234)]]";
|
||||
IExpression regularFilter = expressionOptimizer.optimize(expression, selectedSeries);
|
||||
Assert.assertEquals(true, rightRet.equals(regularFilter.toString()));
|
||||
Assert.assertEquals(rightRet, regularFilter.toString());
|
||||
} catch (QueryFilterOptimizationException e) {
|
||||
Assert.fail();
|
||||
}
|
||||
|
@ -167,7 +165,7 @@ public class IExpressionOptimizerTest {
|
|||
try {
|
||||
String rightRet = "[d2.s1:((value > 100 || value < 50) && time < 14001234)]";
|
||||
IExpression regularFilter = expressionOptimizer.optimize(expression, selectedSeries);
|
||||
Assert.assertEquals(true, rightRet.equals(regularFilter.toString()));
|
||||
Assert.assertEquals(rightRet, regularFilter.toString());
|
||||
} catch (QueryFilterOptimizationException e) {
|
||||
Assert.fail();
|
||||
}
|
||||
|
@ -194,7 +192,7 @@ public class IExpressionOptimizerTest {
|
|||
"[[[[[d1.s1:time < 14001234] || [d2.s1:time < 14001234]] || [d1.s2:time < 14001234]] "
|
||||
+ "|| [d2.s2:time < 14001234]] || [[d2.s1:(value > 100 || value < 50)] || [d1.s2:(value > 100.5 || value < 50.6)]]]";
|
||||
IExpression regularFilter = expressionOptimizer.optimize(expression, selectedSeries);
|
||||
Assert.assertEquals(true, rightRet.equals(regularFilter.toString()));
|
||||
Assert.assertEquals(rightRet, regularFilter.toString());
|
||||
} catch (QueryFilterOptimizationException e) {
|
||||
Assert.fail();
|
||||
}
|
||||
|
@ -222,7 +220,7 @@ public class IExpressionOptimizerTest {
|
|||
+ "&& time > 14001000)]] || [d1.s2:(time < 14001234 && time > 14001000)]] || [d2.s2:(time < 14001234 "
|
||||
+ "&& time > 14001000)]] || [[d2.s1:(value > 100 || value < 50)] || [d1.s2:(value > 100.5 || value < 50.6)]]]";
|
||||
IExpression regularFilter = expressionOptimizer.optimize(expression, selectedSeries);
|
||||
Assert.assertEquals(true, rightRet.equals(regularFilter.toString()));
|
||||
Assert.assertEquals(rightRet, regularFilter.toString());
|
||||
} catch (QueryFilterOptimizationException e) {
|
||||
Assert.fail();
|
||||
}
|
||||
|
@ -236,7 +234,7 @@ public class IExpressionOptimizerTest {
|
|||
"[[d2.s1:((value > 100 || value < 50) && (time < 14001234 && time > 14001000))] || "
|
||||
+ "[d1.s2:((value > 100.5 || value < 50.6) && (time < 14001234 && time > 14001000))]]";
|
||||
IExpression regularFilter2 = expressionOptimizer.optimize(expression2, selectedSeries);
|
||||
Assert.assertEquals(true, rightRet2.equals(regularFilter2.toString()));
|
||||
Assert.assertEquals(rightRet2, regularFilter2.toString());
|
||||
} catch (QueryFilterOptimizationException e) {
|
||||
Assert.fail();
|
||||
}
|
||||
|
|
|
@ -31,179 +31,179 @@ public class MinTimeMaxTimeFilterTest {
|
|||
@Test
|
||||
public void testEq() {
|
||||
Filter timeEq = TimeFilter.eq(10L);
|
||||
Assert.assertEquals(false, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
timeEq = TimeFilter.eq(100L);
|
||||
Assert.assertEquals(true, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, timeEq.containStartEndTime(minTime, minTime));
|
||||
Assert.assertTrue(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.containStartEndTime(minTime, minTime));
|
||||
|
||||
timeEq = TimeFilter.eq(150L);
|
||||
Assert.assertEquals(true, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
timeEq = TimeFilter.eq(200L);
|
||||
Assert.assertEquals(true, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
timeEq = TimeFilter.eq(300L);
|
||||
Assert.assertEquals(false, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
Filter valueEq = ValueFilter.eq(100);
|
||||
Assert.assertEquals(true, valueEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, valueEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(valueEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(valueEq.satisfyStartEndTime(minTime, maxTime));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGt() {
|
||||
Filter timeEq = TimeFilter.gt(10L);
|
||||
Assert.assertEquals(true, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
timeEq = TimeFilter.gt(100L);
|
||||
Assert.assertEquals(true, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
timeEq = TimeFilter.gt(200L);
|
||||
Assert.assertEquals(false, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
timeEq = TimeFilter.gt(300L);
|
||||
Assert.assertEquals(false, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
Filter valueEq = ValueFilter.gt(100);
|
||||
Assert.assertEquals(true, valueEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, valueEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(valueEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(valueEq.containStartEndTime(minTime, maxTime));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGtEq() {
|
||||
Filter timeEq = TimeFilter.gtEq(10L);
|
||||
Assert.assertEquals(true, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
timeEq = TimeFilter.gtEq(100L);
|
||||
Assert.assertEquals(true, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
timeEq = TimeFilter.gtEq(200L);
|
||||
Assert.assertEquals(true, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
timeEq = TimeFilter.gtEq(300L);
|
||||
Assert.assertEquals(false, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
Filter valueEq = ValueFilter.gtEq(100);
|
||||
Assert.assertEquals(true, valueEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, valueEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(valueEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(valueEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
valueEq = ValueFilter.gtEq(150);
|
||||
Assert.assertEquals(true, valueEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, valueEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(valueEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(valueEq.containStartEndTime(minTime, maxTime));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLt() {
|
||||
Filter timeEq = TimeFilter.lt(10L);
|
||||
Assert.assertEquals(false, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
timeEq = TimeFilter.lt(100L);
|
||||
Assert.assertEquals(false, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
timeEq = TimeFilter.lt(200L);
|
||||
Assert.assertEquals(true, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
timeEq = TimeFilter.lt(300L);
|
||||
Assert.assertEquals(true, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
Filter valueEq = ValueFilter.lt(100);
|
||||
Assert.assertEquals(true, valueEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, valueEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(valueEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(valueEq.containStartEndTime(minTime, maxTime));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLtEq() {
|
||||
Filter timeEq = TimeFilter.ltEq(10L);
|
||||
Assert.assertEquals(false, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
timeEq = TimeFilter.ltEq(100L);
|
||||
Assert.assertEquals(true, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
timeEq = TimeFilter.ltEq(200L);
|
||||
Assert.assertEquals(true, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
timeEq = TimeFilter.ltEq(300L);
|
||||
Assert.assertEquals(true, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, timeEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.containStartEndTime(minTime, maxTime));
|
||||
|
||||
Filter valueEq = ValueFilter.ltEq(100);
|
||||
Assert.assertEquals(true, valueEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, valueEq.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(valueEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(valueEq.containStartEndTime(minTime, maxTime));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAnd() {
|
||||
Filter andFilter = FilterFactory.and(TimeFilter.gt(10L), TimeFilter.lt(50));
|
||||
Assert.assertEquals(false, andFilter.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, andFilter.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(andFilter.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(andFilter.containStartEndTime(minTime, maxTime));
|
||||
|
||||
andFilter = FilterFactory.and(TimeFilter.gt(100L), TimeFilter.lt(200));
|
||||
Assert.assertEquals(true, andFilter.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, andFilter.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(andFilter.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(andFilter.containStartEndTime(minTime, maxTime));
|
||||
|
||||
andFilter = FilterFactory.and(TimeFilter.gt(99L), TimeFilter.lt(201));
|
||||
Assert.assertEquals(true, andFilter.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, andFilter.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(andFilter.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(andFilter.containStartEndTime(minTime, maxTime));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOr() {
|
||||
Filter orFilter = FilterFactory.or(TimeFilter.gt(10L), TimeFilter.lt(50));
|
||||
Assert.assertEquals(true, orFilter.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, orFilter.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(orFilter.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(orFilter.containStartEndTime(minTime, maxTime));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNotEq() {
|
||||
Filter timeEq = TimeFilter.notEq(10L);
|
||||
Assert.assertEquals(true, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(timeEq.satisfyStartEndTime(minTime, maxTime));
|
||||
|
||||
long startTime = 10, endTime = 10;
|
||||
Assert.assertEquals(false, timeEq.satisfyStartEndTime(startTime, endTime));
|
||||
Assert.assertEquals(false, timeEq.containStartEndTime(5, 50));
|
||||
Assert.assertFalse(timeEq.satisfyStartEndTime(startTime, endTime));
|
||||
Assert.assertFalse(timeEq.containStartEndTime(5, 50));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNot() {
|
||||
Filter not = FilterFactory.not(TimeFilter.ltEq(10L));
|
||||
Assert.assertEquals(true, not.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(true, not.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(not.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertTrue(not.containStartEndTime(minTime, maxTime));
|
||||
|
||||
not = FilterFactory.not(TimeFilter.ltEq(100L));
|
||||
Assert.assertEquals(false, not.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, not.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(not.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(not.containStartEndTime(minTime, maxTime));
|
||||
|
||||
not = FilterFactory.not(TimeFilter.ltEq(200L));
|
||||
Assert.assertEquals(false, not.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, not.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(not.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(not.containStartEndTime(minTime, maxTime));
|
||||
|
||||
not = FilterFactory.not(TimeFilter.ltEq(300L));
|
||||
Assert.assertEquals(false, not.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertEquals(false, not.containStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(not.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(not.containStartEndTime(minTime, maxTime));
|
||||
|
||||
not = FilterFactory.not(ValueFilter.ltEq(100));
|
||||
Assert.assertEquals(false, not.satisfyStartEndTime(minTime, maxTime));
|
||||
Assert.assertFalse(not.satisfyStartEndTime(minTime, maxTime));
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,115 +32,115 @@ public class OperatorTest {
|
|||
@Test
|
||||
public void testEq() {
|
||||
Filter timeEq = TimeFilter.eq(100L);
|
||||
Assert.assertEquals(true, timeEq.satisfy(100, 100));
|
||||
Assert.assertEquals(false, timeEq.satisfy(101, 100));
|
||||
Assert.assertTrue(timeEq.satisfy(100, 100));
|
||||
Assert.assertFalse(timeEq.satisfy(101, 100));
|
||||
|
||||
Filter filter2 = FilterFactory.and(TimeFilter.eq(100L), ValueFilter.eq(50));
|
||||
Assert.assertEquals(true, filter2.satisfy(100, 50));
|
||||
Assert.assertEquals(false, filter2.satisfy(100, 51));
|
||||
Assert.assertTrue(filter2.satisfy(100, 50));
|
||||
Assert.assertFalse(filter2.satisfy(100, 51));
|
||||
|
||||
|
||||
Filter filter3 = ValueFilter.eq(true);
|
||||
Assert.assertEquals(true, filter3.satisfy(100, true));
|
||||
Assert.assertEquals(false, filter3.satisfy(100, false));
|
||||
Assert.assertTrue(filter3.satisfy(100, true));
|
||||
Assert.assertFalse(filter3.satisfy(100, false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGt() {
|
||||
Filter timeGt = TimeFilter.gt(TESTED_TIMESTAMP);
|
||||
Assert.assertEquals(true, timeGt.satisfy(TESTED_TIMESTAMP + 1, 100));
|
||||
Assert.assertEquals(false, timeGt.satisfy(TESTED_TIMESTAMP, 100));
|
||||
Assert.assertEquals(false, timeGt.satisfy(TESTED_TIMESTAMP - 1, 100));
|
||||
Assert.assertTrue(timeGt.satisfy(TESTED_TIMESTAMP + 1, 100));
|
||||
Assert.assertFalse(timeGt.satisfy(TESTED_TIMESTAMP, 100));
|
||||
Assert.assertFalse(timeGt.satisfy(TESTED_TIMESTAMP - 1, 100));
|
||||
|
||||
Filter valueGt = ValueFilter.gt(0.01f);
|
||||
Assert.assertEquals(true, valueGt.satisfy(TESTED_TIMESTAMP, 0.02f));
|
||||
Assert.assertEquals(false, valueGt.satisfy(TESTED_TIMESTAMP, 0.01f));
|
||||
Assert.assertEquals(false, valueGt.satisfy(TESTED_TIMESTAMP, -0.01f));
|
||||
Assert.assertTrue(valueGt.satisfy(TESTED_TIMESTAMP, 0.02f));
|
||||
Assert.assertFalse(valueGt.satisfy(TESTED_TIMESTAMP, 0.01f));
|
||||
Assert.assertFalse(valueGt.satisfy(TESTED_TIMESTAMP, -0.01f));
|
||||
|
||||
Filter binaryFilter = ValueFilter.gt(new Binary("test1"));
|
||||
Assert.assertEquals(true, binaryFilter.satisfy(TESTED_TIMESTAMP, new Binary("test2")));
|
||||
Assert.assertEquals(false, binaryFilter.satisfy(TESTED_TIMESTAMP, new Binary("test0")));
|
||||
Assert.assertTrue(binaryFilter.satisfy(TESTED_TIMESTAMP, new Binary("test2")));
|
||||
Assert.assertFalse(binaryFilter.satisfy(TESTED_TIMESTAMP, new Binary("test0")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGtEq() {
|
||||
Filter timeGtEq = TimeFilter.gtEq(TESTED_TIMESTAMP);
|
||||
Assert.assertEquals(true, timeGtEq.satisfy(TESTED_TIMESTAMP + 1, 100));
|
||||
Assert.assertEquals(true, timeGtEq.satisfy(TESTED_TIMESTAMP, 100));
|
||||
Assert.assertEquals(false, timeGtEq.satisfy(TESTED_TIMESTAMP - 1, 100));
|
||||
Assert.assertTrue(timeGtEq.satisfy(TESTED_TIMESTAMP + 1, 100));
|
||||
Assert.assertTrue(timeGtEq.satisfy(TESTED_TIMESTAMP, 100));
|
||||
Assert.assertFalse(timeGtEq.satisfy(TESTED_TIMESTAMP - 1, 100));
|
||||
|
||||
Filter valueGtEq = ValueFilter.gtEq(0.01);
|
||||
Assert.assertEquals(true, valueGtEq.satisfy(TESTED_TIMESTAMP, 0.02));
|
||||
Assert.assertEquals(true, valueGtEq.satisfy(TESTED_TIMESTAMP, 0.01));
|
||||
Assert.assertEquals(false, valueGtEq.satisfy(TESTED_TIMESTAMP, -0.01));
|
||||
Assert.assertTrue(valueGtEq.satisfy(TESTED_TIMESTAMP, 0.02));
|
||||
Assert.assertTrue(valueGtEq.satisfy(TESTED_TIMESTAMP, 0.01));
|
||||
Assert.assertFalse(valueGtEq.satisfy(TESTED_TIMESTAMP, -0.01));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLt() {
|
||||
Filter timeLt = TimeFilter.lt(TESTED_TIMESTAMP);
|
||||
Assert.assertEquals(true, timeLt.satisfy(TESTED_TIMESTAMP - 1, 100));
|
||||
Assert.assertEquals(false, timeLt.satisfy(TESTED_TIMESTAMP, 100));
|
||||
Assert.assertEquals(false, timeLt.satisfy(TESTED_TIMESTAMP + 1, 100));
|
||||
Assert.assertTrue(timeLt.satisfy(TESTED_TIMESTAMP - 1, 100));
|
||||
Assert.assertFalse(timeLt.satisfy(TESTED_TIMESTAMP, 100));
|
||||
Assert.assertFalse(timeLt.satisfy(TESTED_TIMESTAMP + 1, 100));
|
||||
|
||||
Filter valueLt = ValueFilter.lt(100L);
|
||||
Assert.assertEquals(true, valueLt.satisfy(TESTED_TIMESTAMP, 99L));
|
||||
Assert.assertEquals(false, valueLt.satisfy(TESTED_TIMESTAMP, 100L));
|
||||
Assert.assertEquals(false, valueLt.satisfy(TESTED_TIMESTAMP, 101L));
|
||||
Assert.assertTrue(valueLt.satisfy(TESTED_TIMESTAMP, 99L));
|
||||
Assert.assertFalse(valueLt.satisfy(TESTED_TIMESTAMP, 100L));
|
||||
Assert.assertFalse(valueLt.satisfy(TESTED_TIMESTAMP, 101L));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLtEq() {
|
||||
Filter timeLtEq = TimeFilter.ltEq(TESTED_TIMESTAMP);
|
||||
Assert.assertEquals(true, timeLtEq.satisfy(TESTED_TIMESTAMP - 1, 100));
|
||||
Assert.assertEquals(true, timeLtEq.satisfy(TESTED_TIMESTAMP, 100));
|
||||
Assert.assertEquals(false, timeLtEq.satisfy(TESTED_TIMESTAMP + 1, 100));
|
||||
Assert.assertTrue(timeLtEq.satisfy(TESTED_TIMESTAMP - 1, 100));
|
||||
Assert.assertTrue(timeLtEq.satisfy(TESTED_TIMESTAMP, 100));
|
||||
Assert.assertFalse(timeLtEq.satisfy(TESTED_TIMESTAMP + 1, 100));
|
||||
|
||||
Filter valueLtEq = ValueFilter.ltEq(100L);
|
||||
Assert.assertEquals(true, valueLtEq.satisfy(TESTED_TIMESTAMP, 99L));
|
||||
Assert.assertEquals(true, valueLtEq.satisfy(TESTED_TIMESTAMP, 100L));
|
||||
Assert.assertEquals(false, valueLtEq.satisfy(TESTED_TIMESTAMP, 101L));
|
||||
Assert.assertTrue(valueLtEq.satisfy(TESTED_TIMESTAMP, 99L));
|
||||
Assert.assertTrue(valueLtEq.satisfy(TESTED_TIMESTAMP, 100L));
|
||||
Assert.assertFalse(valueLtEq.satisfy(TESTED_TIMESTAMP, 101L));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNot() {
|
||||
Filter timeLt = TimeFilter.not(TimeFilter.lt(TESTED_TIMESTAMP));
|
||||
Assert.assertEquals(false, timeLt.satisfy(TESTED_TIMESTAMP - 1, 100));
|
||||
Assert.assertEquals(true, timeLt.satisfy(TESTED_TIMESTAMP, 100));
|
||||
Assert.assertEquals(true, timeLt.satisfy(TESTED_TIMESTAMP + 1, 100));
|
||||
Assert.assertFalse(timeLt.satisfy(TESTED_TIMESTAMP - 1, 100));
|
||||
Assert.assertTrue(timeLt.satisfy(TESTED_TIMESTAMP, 100));
|
||||
Assert.assertTrue(timeLt.satisfy(TESTED_TIMESTAMP + 1, 100));
|
||||
|
||||
Filter valueLt = ValueFilter.not(ValueFilter.lt(100L));
|
||||
Assert.assertEquals(false, valueLt.satisfy(TESTED_TIMESTAMP, 99L));
|
||||
Assert.assertEquals(true, valueLt.satisfy(TESTED_TIMESTAMP, 100L));
|
||||
Assert.assertEquals(true, valueLt.satisfy(TESTED_TIMESTAMP, 101L));
|
||||
Assert.assertFalse(valueLt.satisfy(TESTED_TIMESTAMP, 99L));
|
||||
Assert.assertTrue(valueLt.satisfy(TESTED_TIMESTAMP, 100L));
|
||||
Assert.assertTrue(valueLt.satisfy(TESTED_TIMESTAMP, 101L));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNotEq() {
|
||||
Filter timeNotEq = TimeFilter.notEq(100L);
|
||||
Assert.assertEquals(false, timeNotEq.satisfy(100, 100));
|
||||
Assert.assertEquals(true, timeNotEq.satisfy(101, 100));
|
||||
Assert.assertFalse(timeNotEq.satisfy(100, 100));
|
||||
Assert.assertTrue(timeNotEq.satisfy(101, 100));
|
||||
|
||||
Filter valueNotEq = ValueFilter.notEq(50);
|
||||
Assert.assertEquals(false, valueNotEq.satisfy(100, 50));
|
||||
Assert.assertEquals(true, valueNotEq.satisfy(100, 51));
|
||||
Assert.assertFalse(valueNotEq.satisfy(100, 50));
|
||||
Assert.assertTrue(valueNotEq.satisfy(100, 51));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAndOr() {
|
||||
Filter andFilter = FilterFactory.and(TimeFilter.gt(100L), ValueFilter.lt(50.9));
|
||||
Assert.assertEquals(true, andFilter.satisfy(101L, 50d));
|
||||
Assert.assertEquals(false, andFilter.satisfy(101L, 60d));
|
||||
Assert.assertEquals(false, andFilter.satisfy(99L, 50d));
|
||||
Assert.assertTrue(andFilter.satisfy(101L, 50d));
|
||||
Assert.assertFalse(andFilter.satisfy(101L, 60d));
|
||||
Assert.assertFalse(andFilter.satisfy(99L, 50d));
|
||||
|
||||
Filter orFilter = FilterFactory.or(andFilter, TimeFilter.eq(1000L));
|
||||
Assert.assertEquals(true, orFilter.satisfy(101L, 50d));
|
||||
Assert.assertEquals(false, orFilter.satisfy(101L, 60d));
|
||||
Assert.assertEquals(true, orFilter.satisfy(1000L, 50d));
|
||||
Assert.assertTrue(orFilter.satisfy(101L, 50d));
|
||||
Assert.assertFalse(orFilter.satisfy(101L, 60d));
|
||||
Assert.assertTrue(orFilter.satisfy(1000L, 50d));
|
||||
|
||||
Filter andFilter2 = FilterFactory.and(orFilter, ValueFilter.notEq(50.0));
|
||||
Assert.assertEquals(false, andFilter2.satisfy(101L, 50d));
|
||||
Assert.assertEquals(false, andFilter2.satisfy(101L, 60d));
|
||||
Assert.assertEquals(true, andFilter2.satisfy(1000L, 51d));
|
||||
Assert.assertFalse(andFilter2.satisfy(101L, 50d));
|
||||
Assert.assertFalse(andFilter2.satisfy(101L, 60d));
|
||||
Assert.assertTrue(andFilter2.satisfy(1000L, 51d));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -21,6 +21,7 @@ package org.apache.iotdb.tsfile.write;
|
|||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
|
||||
import org.apache.iotdb.tsfile.exception.NotCompatibleException;
|
||||
import org.apache.iotdb.tsfile.file.MetaMarker;
|
||||
import org.apache.iotdb.tsfile.file.footer.ChunkGroupFooter;
|
||||
import org.apache.iotdb.tsfile.file.header.ChunkHeader;
|
||||
|
@ -75,14 +76,16 @@ public class TsFileIOWriterTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void endFileTest() throws IOException {
|
||||
public void endFileTest() throws IOException, NotCompatibleException {
|
||||
TsFileSequenceReader reader = new TsFileSequenceReader(tsfile);
|
||||
|
||||
// magic_string
|
||||
Assert.assertEquals(TSFileConfig.MAGIC_STRING, reader.readHeadMagic());
|
||||
Assert.assertEquals(TSFileConfig.VERSION_NUMBER, reader.readVersionNumber());
|
||||
Assert.assertEquals(TSFileConfig.MAGIC_STRING, reader.readTailMagic());
|
||||
|
||||
// chunk header
|
||||
reader.position(TSFileConfig.MAGIC_STRING.getBytes().length + TSFileConfig.VERSION_NUMBER.getBytes().length);
|
||||
Assert.assertEquals(MetaMarker.CHUNK_HEADER, reader.readMarker());
|
||||
ChunkHeader header = reader.readChunkHeader();
|
||||
Assert.assertEquals(TimeSeriesMetadataTest.measurementUID, header.getMeasurementID());
|
||||
|
|
Loading…
Reference in New Issue