blob: df261cfc175a4158089aad6a508215e128563446 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.iotdb.db.integration.m4;
import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.engine.compaction.CompactionStrategy;
import org.apache.iotdb.db.utils.EnvironmentUtils;
import org.apache.iotdb.jdbc.Config;
import org.apache.iotdb.jdbc.IoTDBStatement;
import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Locale;
import static org.junit.Assert.fail;
public class MyTest8 {
// test MinMax-LSM
private static final String TIMESTAMP_STR = "Time";
private static String[] creationSqls =
new String[] {
"SET STORAGE GROUP TO root.vehicle.d0",
"CREATE TIMESERIES root.vehicle.d0.s0 WITH DATATYPE=INT64, ENCODING=PLAIN",
// IoTDB int data type does not support plain encoding, so use long data type
};
private final String d0s0 = "root.vehicle.d0.s0";
private static final String insertTemplate =
"INSERT INTO root.vehicle.d0(timestamp,s0)" + " VALUES(%d,%d)";
private static final IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
private static boolean originalEnableCPV;
private static boolean originalUseMad;
private static CompactionStrategy originalCompactionStrategy;
@Before
public void setUp() throws Exception {
TSFileDescriptor.getInstance().getConfig().setEnableMinMaxLSM(true);
TSFileDescriptor.getInstance().getConfig().setTimeEncoder("PLAIN");
originalCompactionStrategy = config.getCompactionStrategy();
config.setCompactionStrategy(CompactionStrategy.NO_COMPACTION);
originalEnableCPV = config.isEnableCPV();
config.setEnableCPV(true); // CPV
originalUseMad = TSFileDescriptor.getInstance().getConfig().isUseMad();
TSFileDescriptor.getInstance().getConfig().setUseMad(true);
TSFileDescriptor.getInstance().getConfig().setErrorParam(10);
EnvironmentUtils.envSetUp();
Class.forName(Config.JDBC_DRIVER_NAME);
config.setTimestampPrecision("ms");
}
@After
public void tearDown() throws Exception {
TSFileDescriptor.getInstance().getConfig().setEnableMinMaxLSM(false);
EnvironmentUtils.cleanEnv();
config.setCompactionStrategy(originalCompactionStrategy);
config.setEnableCPV(originalEnableCPV);
// TSFileDescriptor.getInstance().getConfig().setUseTimeIndex(originalUseChunkIndex);
TSFileDescriptor.getInstance().getConfig().setUseMad(originalUseMad);
}
@Test
public void test1() throws Exception {
prepareData1();
String[] res =
new String[] {"0,5[1],30[10]", "25,8[25],40[30]", "50,8[52],18[54]", "75,null,null"};
try (Connection connection =
DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
/*
* Sql format: SELECT min_time(s0), max_time(s0), first_value(s0), last_value(s0), min_value(s0),
* max_value(s0) ROM root.xx group by ([tqs,tqe),IntervalLength). Requirements: (1) Don't change the
* sequence of the above six aggregates (2) Make sure (tqe-tqs) is divisible by IntervalLength. (3)
* Assume each chunk has only one page.
*/
boolean hasResultSet =
statement.execute(
"SELECT min_value(s0), max_value(s0)"
+ " FROM root.vehicle.d0 group by ([0,100),25ms)");
Assert.assertTrue(hasResultSet);
try (ResultSet resultSet = statement.getResultSet()) {
int i = 0;
while (resultSet.next()) {
String ans =
resultSet.getString(TIMESTAMP_STR)
+ ","
+ resultSet.getString(String.format("min_value(%s)", d0s0))
+ ","
+ resultSet.getString(String.format("max_value(%s)", d0s0));
System.out.println(ans);
Assert.assertEquals(res[i++], ans);
}
}
System.out.println(((IoTDBStatement) statement).executeFinish());
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
@Test
public void test5() throws Exception {
prepareData5();
String[] res =
new String[] {"0,5[1],30[10]", "25,8[25],40[30]", "50,null,null", "75,null,null"};
try (Connection connection =
DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
boolean hasResultSet =
statement.execute(
"SELECT min_value(s0), max_value(s0)"
+ " FROM root.vehicle.d0 group by ([0,100),25ms)");
Assert.assertTrue(hasResultSet);
try (ResultSet resultSet = statement.getResultSet()) {
int i = 0;
while (resultSet.next()) {
String ans =
resultSet.getString(TIMESTAMP_STR)
+ ","
+ resultSet.getString(String.format("min_value(%s)", d0s0))
+ ","
+ resultSet.getString(String.format("max_value(%s)", d0s0));
System.out.println(ans);
Assert.assertEquals(res[i++], ans);
}
}
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
private static void prepareData1() {
// data:
// https://user-images.githubusercontent.com/33376433/151985070-73158010-8ba0-409d-a1c1-df69bad1aaee.png
try (Connection connection =
DriverManager.getConnection(
Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
for (String sql : creationSqls) {
statement.execute(sql);
}
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 1, 5));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 2, 15));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 1));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 25, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 3));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 120, 8));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 5, 10));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 8, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 10, 30));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 20));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 27, 20));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 30, 40));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 35, 10));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 40, 20));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 33, 9));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 45, 30));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 52, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 18));
statement.execute("FLUSH");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void prepareData5() {
// data:
// https://user-images.githubusercontent.com/33376433/151985070-73158010-8ba0-409d-a1c1-df69bad1aaee.png
try (Connection connection =
DriverManager.getConnection(
Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
for (String sql : creationSqls) {
statement.execute(sql);
}
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 1, 5));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 2, 15));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 1));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 25, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 3));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 120, 8));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 5, 10));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 8, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 10, 30));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 20));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 27, 20));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 30, 40));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 35, 10));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 40, 20));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 33, 9));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 45, 30));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 52, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 18));
statement.execute("FLUSH");
statement.execute("delete from root.vehicle.d0.s0 where time>=52 and time<=54");
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void test2() { // add deletes
prepareData2();
String[] res =
new String[] {"0,5[1],30[10]", "25,8[25],20[27]", "50,null,null", "75,null,null"};
try (Connection connection =
DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
boolean hasResultSet =
statement.execute(
"SELECT min_value(s0), max_value(s0)"
+ " FROM root.vehicle.d0 group by ([0,100),25ms)"); // don't change the
// sequence!!!
Assert.assertTrue(hasResultSet);
try (ResultSet resultSet = statement.getResultSet()) {
int i = 0;
while (resultSet.next()) {
String ans =
resultSet.getString(TIMESTAMP_STR)
+ ","
+ resultSet.getString(String.format("min_value(%s)", d0s0))
+ ","
+ resultSet.getString(String.format("max_value(%s)", d0s0));
System.out.println(ans);
Assert.assertEquals(res[i++], ans);
}
}
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
private static void prepareData2() {
// data:
// https://user-images.githubusercontent.com/33376433/151995378-07a2f8df-5cac-499a-ae88-e3b017eee07a.png
try (Connection connection =
DriverManager.getConnection(
Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
for (String sql : creationSqls) {
statement.execute(sql);
}
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 1, 5));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 2, 15));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 1));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 25, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 3));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 120, 8));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 5, 10));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 8, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 10, 30));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 20));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 27, 20));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 30, 40));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 35, 10));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 40, 20));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 33, 9));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 45, 30));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 52, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 18));
statement.execute("FLUSH");
statement.execute("delete from root.vehicle.d0.s0 where time>=28 and time<=60");
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void test2_2() { // use data2 but change the sql from group by ([0,100),25ms) to group by
// ([0,150),25ms)
prepareData2();
String[] res =
new String[] {
"0,5[1],30[10]",
"25,8[25],20[27]",
"50,null,null",
"75,null,null",
"100,8[120],8[120]",
"125,null,null"
};
try (Connection connection =
DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
boolean hasResultSet =
statement.execute(
"SELECT min_value(s0), max_value(s0)"
+ " FROM root.vehicle.d0 group by ([0,150),25ms)"); // don't change the
// sequence!!!
Assert.assertTrue(hasResultSet);
try (ResultSet resultSet = statement.getResultSet()) {
int i = 0;
while (resultSet.next()) {
String ans =
resultSet.getString(TIMESTAMP_STR)
+ ","
+ resultSet.getString(String.format("min_value(%s)", d0s0))
+ ","
+ resultSet.getString(String.format("max_value(%s)", d0s0));
System.out.println(ans);
Assert.assertEquals(res[i++], ans);
}
}
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
@Test
public void test3() { // all seq
prepareData3();
String[] res =
new String[] {"0,1[10],10[2]", "25,2[40],8[30]", "50,4[72],20[62]", "75,1[90],11[80]"};
try (Connection connection =
DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
boolean hasResultSet =
statement.execute(
"SELECT min_value(s0), max_value(s0)"
+ " FROM root.vehicle.d0 group by ([0,100),25ms)"); // don't change the
// sequence!!!
Assert.assertTrue(hasResultSet);
try (ResultSet resultSet = statement.getResultSet()) {
int i = 0;
while (resultSet.next()) {
String ans =
resultSet.getString(TIMESTAMP_STR)
+ ","
+ resultSet.getString(String.format("min_value(%s)", d0s0))
+ ","
+ resultSet.getString(String.format("max_value(%s)", d0s0));
System.out.println(ans);
Assert.assertEquals(res[i++], ans);
}
}
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
private static void prepareData3() {
// data:
// https://user-images.githubusercontent.com/33376433/152003603-6b4e7494-00ff-47e4-bf6e-cab3c8600ce2.png
try (Connection connection =
DriverManager.getConnection(
Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
for (String sql : creationSqls) {
statement.execute(sql);
}
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 1, 5));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 2, 10));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 10, 1));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 5));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 22, 4));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 30, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 40, 2));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 55, 5));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 60, 15));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 62, 20));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 65, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 70, 18));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 72, 4));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 80, 11));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 90, 1));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 105, 7));
statement.execute("FLUSH");
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void test3_2() { // not seq but no overlap
prepareData3_2();
String[] res =
new String[] {"0,1[10],10[2]", "25,2[40],8[30]", "50,4[72],20[62]", "75,1[90],11[80]"};
try (Connection connection =
DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
boolean hasResultSet =
statement.execute(
"SELECT min_value(s0), max_value(s0)"
+ " FROM root.vehicle.d0 group by ([0,100),25ms)"); // don't change the
// sequence!!!
Assert.assertTrue(hasResultSet);
try (ResultSet resultSet = statement.getResultSet()) {
int i = 0;
while (resultSet.next()) {
String ans =
resultSet.getString(TIMESTAMP_STR)
+ ","
+ resultSet.getString(String.format("min_value(%s)", d0s0))
+ ","
+ resultSet.getString(String.format("max_value(%s)", d0s0));
System.out.println(ans);
Assert.assertEquals(res[i++], ans);
}
}
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
private static void prepareData3_2() {
// data:
// https://user-images.githubusercontent.com/33376433/152003603-6b4e7494-00ff-47e4-bf6e-cab3c8600ce2.png
try (Connection connection =
DriverManager.getConnection(
Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
for (String sql : creationSqls) {
statement.execute(sql);
}
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 72, 4));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 80, 11));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 90, 1));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 105, 7));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 1, 5));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 2, 10));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 10, 1));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 5));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 22, 4));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 30, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 40, 2));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 55, 5));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 60, 15));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 62, 20));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 65, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 70, 18));
statement.execute("FLUSH");
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void test4() { // delete sequence move forward
prepareData4();
String[] res =
new String[] {"0,5[1],30[10]", "25,8[25],30[45]", "50,8[52],18[54]", "75,null,null"};
try (Connection connection =
DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
boolean hasResultSet =
statement.execute(
"SELECT min_value(s0), max_value(s0)"
+ " FROM root.vehicle.d0 group by ([0,100),25ms)"); // don't change the
// sequence!!!
Assert.assertTrue(hasResultSet);
try (ResultSet resultSet = statement.getResultSet()) {
int i = 0;
while (resultSet.next()) {
String ans =
resultSet.getString(TIMESTAMP_STR)
+ ","
+ resultSet.getString(String.format("min_value(%s)", d0s0))
+ ","
+ resultSet.getString(String.format("max_value(%s)", d0s0));
System.out.println(ans);
Assert.assertEquals(res[i++], ans);
}
}
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
private static void prepareData4() {
// data:
// https://user-images.githubusercontent.com/33376433/152006061-f1d95952-3f5c-4d88-b34e-45d3bb61b600.png
try (Connection connection =
DriverManager.getConnection(
Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
for (String sql : creationSqls) {
statement.execute(sql);
}
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 1, 5));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 2, 15));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 1));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 25, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 3));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 120, 8));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 5, 10));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 8, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 10, 30));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 20, 20));
statement.execute("FLUSH");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 27, 20));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 30, 40));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 35, 10));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 40, 20));
statement.execute("FLUSH");
statement.execute("delete from root.vehicle.d0.s0 where time>=28 and time<=42");
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 33, 9));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 45, 30));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 52, 8));
statement.execute(String.format(Locale.ENGLISH, insertTemplate, 54, 18));
statement.execute("FLUSH");
} catch (Exception e) {
e.printStackTrace();
}
}
}