[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:
Boris 2019-10-17 20:00:35 +08:00 committed by Jialin Qiao
parent 53dbf8412c
commit a8d283e077
19 changed files with 279 additions and 256 deletions

View File

@ -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>

View File

@ -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.
*

View File

@ -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.
*/

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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

View File

@ -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();

View File

@ -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

View File

@ -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);

View File

@ -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();

View File

@ -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);

View File

@ -198,7 +198,6 @@ public class Utils {
}
}
assertEquals(metadata1.getCurrentVersion(), metadata2.getCurrentVersion());
assertEquals(metadata1.getCreatedBy(), metadata2.getCreatedBy());
}
}

View File

@ -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());
}
}

View File

@ -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();

View File

@ -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));
}
}

View File

@ -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();
}

View File

@ -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));
}
}

View File

@ -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

View File

@ -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());