blob: 7a0ccb0a32ce0be65e7f05e1e317b2c53acc08fc [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;
import org.apache.iotdb.db.constant.TestConstant;
import org.apache.iotdb.db.utils.EnvironmentUtils;
import org.apache.iotdb.jdbc.Config;
import org.apache.iotdb.jdbc.IoTDBSQLException;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
* Notice that, all test begins with "IoTDB" is integration test. All test which will start the
* IoTDB server should be defined as integration test.
*/
public class IoTDBAutoCreateSchemaIT {
private Statement statement;
private Connection connection;
@Before
public void setUp() throws Exception {
EnvironmentUtils.closeStatMonitor();
EnvironmentUtils.envSetUp();
Class.forName(Config.JDBC_DRIVER_NAME);
connection = DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
statement = connection.createStatement();
}
@After
public void tearDown() throws Exception {
statement.close();
connection.close();
EnvironmentUtils.cleanEnv();
}
/** create timeseries without setting storage group */
@Test
public void createTimeseriesTest() throws ClassNotFoundException {
String[] sqls = {
"CREATE TIMESERIES root.sg0.d1.s2 WITH DATATYPE=INT32,ENCODING=RLE",
"INSERT INTO root.sg0.d1(timestamp,s2) values(1,123)",
};
executeSQL(sqls);
}
/** insert data when storage group has been set but timeseries hasn't been created */
@Test
public void insertTest1() throws ClassNotFoundException {
String[] sqls = {
"SET STORAGE GROUP TO root.sg0",
"INSERT INTO root.sg0.d1(timestamp,s2) values(1,123.123)",
"INSERT INTO root.sg0.d1(timestamp,s3) values(1,\"abc\")",
};
executeSQL(sqls);
}
/** insert data when storage group hasn't been set and timeseries hasn't been created */
@Test
public void insertTest2() throws ClassNotFoundException {
String[] sqls = {
"INSERT INTO root.sg0.d1(timestamp,s2) values(1,\"abc\")",
"INSERT INTO root.sg0.d2(timestamp,s3) values(1,123.123)",
"INSERT INTO root.sg0.d2(timestamp,s4) values(1,123456)",
};
executeSQL(sqls);
}
private void executeSQL(String[] sqls) throws ClassNotFoundException {
Class.forName(Config.JDBC_DRIVER_NAME);
try (Connection connection =
DriverManager.getConnection(
Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
String result = "";
Long now_start = 0L;
boolean cmp = false;
for (String sql : sqls) {
if (cmp) {
Assert.assertEquals(sql, result);
cmp = false;
} else if (sql.equals("SHOW TIMESERIES")) {
DatabaseMetaData data = connection.getMetaData();
result = data.toString();
cmp = true;
} else {
if (sql.contains("NOW()") && now_start == 0L) {
now_start = System.currentTimeMillis();
}
statement.execute(sql);
if (sql.split(" ")[0].equals("SELECT")) {
ResultSet resultSet = statement.getResultSet();
ResultSetMetaData metaData = resultSet.getMetaData();
int count = metaData.getColumnCount();
String[] column = new String[count];
for (int i = 0; i < count; i++) {
column[i] = metaData.getColumnName(i + 1);
}
result = "";
while (resultSet.next()) {
for (int i = 1; i <= count; i++) {
if (now_start > 0L && column[i - 1].equals(TestConstant.TIMESTAMP_STR)) {
String timestr = resultSet.getString(i);
Long tn = Long.valueOf(timestr);
Long now = System.currentTimeMillis();
if (tn >= now_start && tn <= now) {
timestr = "NOW()";
}
result += timestr + ',';
} else {
result += resultSet.getString(i) + ',';
}
}
result += '\n';
}
cmp = true;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* insert data when the time series that is a prefix path of an existing time series hasn't been
* created
*/
@Test
public void testInsertAutoCreate1() throws Exception {
String[] timeSeriesArray = {"root.sg1.a.a", "root.sg1.a", "root.sg1.a.a.a"};
for (String timeSeries : timeSeriesArray) {
statement.execute(
String.format("INSERT INTO %s(timestamp, a) values(123, \"aabb\")", timeSeries));
}
// ensure that insert data in cache is right.
insertAutoCreate1Tool();
statement.close();
connection.close();
EnvironmentUtils.stopDaemon();
setUp();
// ensure that insert data in cache is right after recovered.
insertAutoCreate1Tool();
}
private void insertAutoCreate1Tool() throws SQLException {
boolean hasResult = statement.execute("select * from root.sg1");
Assert.assertTrue(hasResult);
Set<String> strSet = new HashSet<>();
String[] valueList = {};
try (ResultSet resultSet = statement.getResultSet()) {
while (resultSet.next()) {
valueList =
new String[] {
resultSet.getString("root.sg1.a.a"),
resultSet.getString("root.sg1.a.a.a"),
resultSet.getString("root.sg1.a.a.a.a")
};
strSet = new HashSet<>(Arrays.asList(valueList));
}
}
Assert.assertEquals(3, valueList.length);
Assert.assertEquals(1, strSet.size());
Assert.assertTrue(strSet.contains("aabb"));
}
/**
* test if automatically creating a time series will cause the storage group with same name to
* disappear
*/
@Test
public void testInsertAutoCreate2() throws Exception {
String storageGroup = "root.sg2.a.b.c";
String timeSeriesPrefix = "root.sg2.a.b";
statement.execute(String.format("SET storage group TO %s", storageGroup));
try {
statement.execute(
String.format("INSERT INTO %s(timestamp, c) values(123, \"aabb\")", timeSeriesPrefix));
} catch (IoTDBSQLException ignored) {
}
// ensure that current storage group in cache is right.
InsertAutoCreate2Tool(storageGroup, timeSeriesPrefix);
statement.close();
connection.close();
EnvironmentUtils.stopDaemon();
setUp();
// ensure that storage group in cache is right after recovered.
InsertAutoCreate2Tool(storageGroup, timeSeriesPrefix);
}
private void InsertAutoCreate2Tool(String storageGroup, String timeSeriesPrefix)
throws SQLException {
statement.execute("show timeseries");
Set<String> resultList = new HashSet<>();
try (ResultSet resultSet = statement.getResultSet()) {
while (resultSet.next()) {
String str = resultSet.getString("timeseries");
resultList.add(str);
}
}
Assert.assertFalse(resultList.contains(timeSeriesPrefix + "c"));
statement.execute("show storage group");
resultList.clear();
try (ResultSet resultSet = statement.getResultSet()) {
while (resultSet.next()) {
resultList.add(resultSet.getString("storage group"));
}
}
Assert.assertTrue(resultList.contains(storageGroup));
}
}