Merge pull request #1091 from thingsboard/feature/hybrid-db
Feature/hybrid db
This commit is contained in:
commit
5c6df92e1f
@ -24,9 +24,10 @@ import org.springframework.context.annotation.Profile;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.server.service.component.ComponentDiscoveryService;
|
import org.thingsboard.server.service.component.ComponentDiscoveryService;
|
||||||
import org.thingsboard.server.service.install.DataUpdateService;
|
import org.thingsboard.server.service.install.DataUpdateService;
|
||||||
import org.thingsboard.server.service.install.DatabaseSchemaService;
|
|
||||||
import org.thingsboard.server.service.install.DatabaseUpgradeService;
|
import org.thingsboard.server.service.install.DatabaseUpgradeService;
|
||||||
|
import org.thingsboard.server.service.install.EntityDatabaseSchemaService;
|
||||||
import org.thingsboard.server.service.install.SystemDataLoaderService;
|
import org.thingsboard.server.service.install.SystemDataLoaderService;
|
||||||
|
import org.thingsboard.server.service.install.TsDatabaseSchemaService;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Profile("install")
|
@Profile("install")
|
||||||
@ -43,7 +44,10 @@ public class ThingsboardInstallService {
|
|||||||
private Boolean loadDemo;
|
private Boolean loadDemo;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DatabaseSchemaService databaseSchemaService;
|
private EntityDatabaseSchemaService entityDatabaseSchemaService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private TsDatabaseSchemaService tsDatabaseSchemaService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DatabaseUpgradeService databaseUpgradeService;
|
private DatabaseUpgradeService databaseUpgradeService;
|
||||||
@ -114,9 +118,13 @@ public class ThingsboardInstallService {
|
|||||||
|
|
||||||
log.info("Starting ThingsBoard Installation...");
|
log.info("Starting ThingsBoard Installation...");
|
||||||
|
|
||||||
log.info("Installing DataBase schema...");
|
log.info("Installing DataBase schema for entities...");
|
||||||
|
|
||||||
databaseSchemaService.createDatabaseSchema();
|
entityDatabaseSchemaService.createDatabaseSchema();
|
||||||
|
|
||||||
|
log.info("Installing DataBase schema for timeseries...");
|
||||||
|
|
||||||
|
tsDatabaseSchemaService.createDatabaseSchema();
|
||||||
|
|
||||||
log.info("Loading system data...");
|
log.info("Loading system data...");
|
||||||
|
|
||||||
|
|||||||
@ -17,24 +17,17 @@ package org.thingsboard.server.service.install;
|
|||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.context.annotation.Profile;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import org.thingsboard.server.dao.cassandra.CassandraInstallCluster;
|
import org.thingsboard.server.dao.cassandra.CassandraInstallCluster;
|
||||||
import org.thingsboard.server.dao.util.NoSqlDao;
|
|
||||||
import org.thingsboard.server.service.install.cql.CQLStatementsParser;
|
import org.thingsboard.server.service.install.cql.CQLStatementsParser;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Service
|
|
||||||
@NoSqlDao
|
|
||||||
@Profile("install")
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class CassandraDatabaseSchemaService implements DatabaseSchemaService {
|
public abstract class CassandraAbstractDatabaseSchemaService implements DatabaseSchemaService {
|
||||||
|
|
||||||
private static final String CASSANDRA_DIR = "cassandra";
|
private static final String CASSANDRA_DIR = "cassandra";
|
||||||
private static final String SCHEMA_CQL = "schema.cql";
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private CassandraInstallCluster cluster;
|
private CassandraInstallCluster cluster;
|
||||||
@ -42,10 +35,16 @@ public class CassandraDatabaseSchemaService implements DatabaseSchemaService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private InstallScripts installScripts;
|
private InstallScripts installScripts;
|
||||||
|
|
||||||
|
private final String schemaCql;
|
||||||
|
|
||||||
|
protected CassandraAbstractDatabaseSchemaService(String schemaCql) {
|
||||||
|
this.schemaCql = schemaCql;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createDatabaseSchema() throws Exception {
|
public void createDatabaseSchema() throws Exception {
|
||||||
log.info("Installing Cassandra DataBase schema...");
|
log.info("Installing Cassandra DataBase schema part: " + schemaCql);
|
||||||
Path schemaFile = Paths.get(installScripts.getDataDir(), CASSANDRA_DIR, SCHEMA_CQL);
|
Path schemaFile = Paths.get(installScripts.getDataDir(), CASSANDRA_DIR, schemaCql);
|
||||||
loadCql(schemaFile);
|
loadCql(schemaFile);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed 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.thingsboard.server.service.install;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Profile;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.thingsboard.server.dao.util.NoSqlDao;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@NoSqlDao
|
||||||
|
@Profile("install")
|
||||||
|
public class CassandraEntityDatabaseSchemaService extends CassandraAbstractDatabaseSchemaService
|
||||||
|
implements EntityDatabaseSchemaService {
|
||||||
|
public CassandraEntityDatabaseSchemaService() {
|
||||||
|
super("schema-entities.cql");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed 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.thingsboard.server.service.install;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Profile;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.thingsboard.server.dao.util.NoSqlTsDao;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@NoSqlTsDao
|
||||||
|
@Profile("install")
|
||||||
|
public class CassandraTsDatabaseSchemaService extends CassandraAbstractDatabaseSchemaService
|
||||||
|
implements TsDatabaseSchemaService {
|
||||||
|
public CassandraTsDatabaseSchemaService() {
|
||||||
|
super("schema-ts.cql");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed 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.thingsboard.server.service.install;
|
||||||
|
|
||||||
|
public interface EntityDatabaseSchemaService extends DatabaseSchemaService {
|
||||||
|
}
|
||||||
@ -18,9 +18,6 @@ package org.thingsboard.server.service.install;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Profile;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import org.thingsboard.server.dao.util.SqlDao;
|
|
||||||
|
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
@ -29,14 +26,10 @@ import java.nio.file.Paths;
|
|||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.DriverManager;
|
import java.sql.DriverManager;
|
||||||
|
|
||||||
@Service
|
|
||||||
@Profile("install")
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@SqlDao
|
public abstract class SqlAbstractDatabaseSchemaService implements DatabaseSchemaService {
|
||||||
public class SqlDatabaseSchemaService implements DatabaseSchemaService {
|
|
||||||
|
|
||||||
private static final String SQL_DIR = "sql";
|
private static final String SQL_DIR = "sql";
|
||||||
private static final String SCHEMA_SQL = "schema.sql";
|
|
||||||
|
|
||||||
@Value("${spring.datasource.url}")
|
@Value("${spring.datasource.url}")
|
||||||
private String dbUrl;
|
private String dbUrl;
|
||||||
@ -50,12 +43,18 @@ public class SqlDatabaseSchemaService implements DatabaseSchemaService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private InstallScripts installScripts;
|
private InstallScripts installScripts;
|
||||||
|
|
||||||
|
private final String schemaSql;
|
||||||
|
|
||||||
|
protected SqlAbstractDatabaseSchemaService(String schemaSql) {
|
||||||
|
this.schemaSql = schemaSql;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createDatabaseSchema() throws Exception {
|
public void createDatabaseSchema() throws Exception {
|
||||||
|
|
||||||
log.info("Installing SQL DataBase schema...");
|
log.info("Installing SQL DataBase schema part: " + schemaSql);
|
||||||
|
|
||||||
Path schemaFile = Paths.get(installScripts.getDataDir(), SQL_DIR, SCHEMA_SQL);
|
Path schemaFile = Paths.get(installScripts.getDataDir(), SQL_DIR, schemaSql);
|
||||||
try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) {
|
try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) {
|
||||||
String sql = new String(Files.readAllBytes(schemaFile), Charset.forName("UTF-8"));
|
String sql = new String(Files.readAllBytes(schemaFile), Charset.forName("UTF-8"));
|
||||||
conn.createStatement().execute(sql); //NOSONAR, ignoring because method used to load initial thingsboard database schema
|
conn.createStatement().execute(sql); //NOSONAR, ignoring because method used to load initial thingsboard database schema
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed 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.thingsboard.server.service.install;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Profile;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.thingsboard.server.dao.util.SqlDao;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@SqlDao
|
||||||
|
@Profile("install")
|
||||||
|
public class SqlEntityDatabaseSchemaService extends SqlAbstractDatabaseSchemaService
|
||||||
|
implements EntityDatabaseSchemaService {
|
||||||
|
public SqlEntityDatabaseSchemaService() {
|
||||||
|
super("schema-entities.sql");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed 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.thingsboard.server.service.install;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Profile;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.thingsboard.server.dao.util.SqlTsDao;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@SqlTsDao
|
||||||
|
@Profile("install")
|
||||||
|
public class SqlTsDatabaseSchemaService extends SqlAbstractDatabaseSchemaService
|
||||||
|
implements TsDatabaseSchemaService {
|
||||||
|
public SqlTsDatabaseSchemaService() {
|
||||||
|
super("schema-ts.sql");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed 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.thingsboard.server.service.install;
|
||||||
|
|
||||||
|
public interface TsDatabaseSchemaService extends DatabaseSchemaService {
|
||||||
|
}
|
||||||
@ -159,7 +159,11 @@ quota:
|
|||||||
intervalMin: 2
|
intervalMin: 2
|
||||||
|
|
||||||
database:
|
database:
|
||||||
type: "${DATABASE_TYPE:sql}" # cassandra OR sql
|
entities:
|
||||||
|
type: "${DATABASE_TS_TYPE:sql}" # cassandra OR sql
|
||||||
|
ts:
|
||||||
|
type: "${DATABASE_CASSANDRA_TYPE:sql}" # cassandra OR sql (for hybrid mode, only this value should be cassandra)
|
||||||
|
|
||||||
|
|
||||||
# Cassandra driver configuration parameters
|
# Cassandra driver configuration parameters
|
||||||
cassandra:
|
cassandra:
|
||||||
@ -206,7 +210,7 @@ cassandra:
|
|||||||
write_consistency_level: "${CASSANDRA_WRITE_CONSISTENCY_LEVEL:ONE}"
|
write_consistency_level: "${CASSANDRA_WRITE_CONSISTENCY_LEVEL:ONE}"
|
||||||
default_fetch_size: "${CASSANDRA_DEFAULT_FETCH_SIZE:2000}"
|
default_fetch_size: "${CASSANDRA_DEFAULT_FETCH_SIZE:2000}"
|
||||||
# Specify partitioning size for timestamp key-value storage. Example MINUTES, HOURS, DAYS, MONTHS,INDEFINITE
|
# Specify partitioning size for timestamp key-value storage. Example MINUTES, HOURS, DAYS, MONTHS,INDEFINITE
|
||||||
ts_key_value_partitioning: "${TS_KV_PARTITIONING:MONTHS}"
|
ts_key_value_partitioning: "${TS_KV_PARTITIONING:INDEFINITE}"
|
||||||
ts_key_value_ttl: "${TS_KV_TTL:0}"
|
ts_key_value_ttl: "${TS_KV_TTL:0}"
|
||||||
buffer_size: "${CASSANDRA_QUERY_BUFFER_SIZE:200000}"
|
buffer_size: "${CASSANDRA_QUERY_BUFFER_SIZE:200000}"
|
||||||
concurrent_limit: "${CASSANDRA_QUERY_CONCURRENT_LIMIT:1000}"
|
concurrent_limit: "${CASSANDRA_QUERY_CONCURRENT_LIMIT:1000}"
|
||||||
|
|||||||
@ -32,7 +32,8 @@ public class ControllerNoSqlTestSuite {
|
|||||||
public static CustomCassandraCQLUnit cassandraUnit =
|
public static CustomCassandraCQLUnit cassandraUnit =
|
||||||
new CustomCassandraCQLUnit(
|
new CustomCassandraCQLUnit(
|
||||||
Arrays.asList(
|
Arrays.asList(
|
||||||
new ClassPathCQLDataSet("cassandra/schema.cql", false, false),
|
new ClassPathCQLDataSet("cassandra/schema-ts.cql", false, false),
|
||||||
|
new ClassPathCQLDataSet("cassandra/schema-entities.cql", false, false),
|
||||||
new ClassPathCQLDataSet("cassandra/system-data.cql", false, false),
|
new ClassPathCQLDataSet("cassandra/system-data.cql", false, false),
|
||||||
new ClassPathCQLDataSet("cassandra/system-test.cql", false, false)),
|
new ClassPathCQLDataSet("cassandra/system-test.cql", false, false)),
|
||||||
"cassandra-test.yaml", 30000l);
|
"cassandra-test.yaml", 30000l);
|
||||||
|
|||||||
@ -30,7 +30,7 @@ public class ControllerSqlTestSuite {
|
|||||||
|
|
||||||
@ClassRule
|
@ClassRule
|
||||||
public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
|
public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
|
||||||
Arrays.asList("sql/schema.sql", "sql/system-data.sql"),
|
Arrays.asList("sql/schema-ts.sql", "sql/schema-entities.sql", "sql/system-data.sql"),
|
||||||
"sql/drop-all-tables.sql",
|
"sql/drop-all-tables.sql",
|
||||||
"sql-test.properties");
|
"sql-test.properties");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,7 +32,8 @@ public class MqttNoSqlTestSuite {
|
|||||||
public static CustomCassandraCQLUnit cassandraUnit =
|
public static CustomCassandraCQLUnit cassandraUnit =
|
||||||
new CustomCassandraCQLUnit(
|
new CustomCassandraCQLUnit(
|
||||||
Arrays.asList(
|
Arrays.asList(
|
||||||
new ClassPathCQLDataSet("cassandra/schema.cql", false, false),
|
new ClassPathCQLDataSet("cassandra/schema-ts.cql", false, false),
|
||||||
|
new ClassPathCQLDataSet("cassandra/schema-entities.cql", false, false),
|
||||||
new ClassPathCQLDataSet("cassandra/system-data.cql", false, false)),
|
new ClassPathCQLDataSet("cassandra/system-data.cql", false, false)),
|
||||||
"cassandra-test.yaml", 30000l);
|
"cassandra-test.yaml", 30000l);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,11 +15,9 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.mqtt;
|
package org.thingsboard.server.mqtt;
|
||||||
|
|
||||||
import org.cassandraunit.dataset.cql.ClassPathCQLDataSet;
|
|
||||||
import org.junit.ClassRule;
|
import org.junit.ClassRule;
|
||||||
import org.junit.extensions.cpsuite.ClasspathSuite;
|
import org.junit.extensions.cpsuite.ClasspathSuite;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.thingsboard.server.dao.CustomCassandraCQLUnit;
|
|
||||||
import org.thingsboard.server.dao.CustomSqlUnit;
|
import org.thingsboard.server.dao.CustomSqlUnit;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@ -31,7 +29,7 @@ public class MqttSqlTestSuite {
|
|||||||
|
|
||||||
@ClassRule
|
@ClassRule
|
||||||
public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
|
public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
|
||||||
Arrays.asList("sql/schema.sql", "sql/system-data.sql"),
|
Arrays.asList("sql/schema-ts.sql", "sql/schema-entities.sql", "sql/system-data.sql"),
|
||||||
"sql/drop-all-tables.sql",
|
"sql/drop-all-tables.sql",
|
||||||
"sql-test.properties");
|
"sql-test.properties");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,7 +35,8 @@ public class RuleEngineNoSqlTestSuite {
|
|||||||
public static CustomCassandraCQLUnit cassandraUnit =
|
public static CustomCassandraCQLUnit cassandraUnit =
|
||||||
new CustomCassandraCQLUnit(
|
new CustomCassandraCQLUnit(
|
||||||
Arrays.asList(
|
Arrays.asList(
|
||||||
new ClassPathCQLDataSet("cassandra/schema.cql", false, false),
|
new ClassPathCQLDataSet("cassandra/schema-ts.cql", false, false),
|
||||||
|
new ClassPathCQLDataSet("cassandra/schema-entities.cql", false, false),
|
||||||
new ClassPathCQLDataSet("cassandra/system-data.cql", false, false)),
|
new ClassPathCQLDataSet("cassandra/system-data.cql", false, false)),
|
||||||
"cassandra-test.yaml", 30000l);
|
"cassandra-test.yaml", 30000l);
|
||||||
|
|
||||||
|
|||||||
@ -30,7 +30,7 @@ public class RuleEngineSqlTestSuite {
|
|||||||
|
|
||||||
@ClassRule
|
@ClassRule
|
||||||
public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
|
public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
|
||||||
Arrays.asList("sql/schema.sql", "sql/system-data.sql"),
|
Arrays.asList("sql/schema-ts.sql", "sql/schema-entities.sql", "sql/system-data.sql"),
|
||||||
"sql/drop-all-tables.sql",
|
"sql/drop-all-tables.sql",
|
||||||
"sql-test.properties");
|
"sql-test.properties");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,7 +34,8 @@ public class SystemNoSqlTestSuite {
|
|||||||
public static CustomCassandraCQLUnit cassandraUnit =
|
public static CustomCassandraCQLUnit cassandraUnit =
|
||||||
new CustomCassandraCQLUnit(
|
new CustomCassandraCQLUnit(
|
||||||
Arrays.asList(
|
Arrays.asList(
|
||||||
new ClassPathCQLDataSet("cassandra/schema.cql", false, false),
|
new ClassPathCQLDataSet("cassandra/schema-ts.cql", false, false),
|
||||||
|
new ClassPathCQLDataSet("cassandra/schema-entities.cql", false, false),
|
||||||
new ClassPathCQLDataSet("cassandra/system-data.cql", false, false)),
|
new ClassPathCQLDataSet("cassandra/system-data.cql", false, false)),
|
||||||
"cassandra-test.yaml", 30000l);
|
"cassandra-test.yaml", 30000l);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -31,7 +31,7 @@ public class SystemSqlTestSuite {
|
|||||||
|
|
||||||
@ClassRule
|
@ClassRule
|
||||||
public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
|
public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
|
||||||
Arrays.asList("sql/schema.sql", "sql/system-data.sql"),
|
Arrays.asList("sql/schema-ts.sql", "sql/schema-entities.sql", "sql/system-data.sql"),
|
||||||
"sql/drop-all-tables.sql",
|
"sql/drop-all-tables.sql",
|
||||||
"sql-test.properties");
|
"sql-test.properties");
|
||||||
|
|
||||||
|
|||||||
@ -17,12 +17,12 @@ package org.thingsboard.server.dao.cassandra;
|
|||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.thingsboard.server.dao.util.NoSqlDao;
|
import org.thingsboard.server.dao.util.NoSqlAnyDao;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@NoSqlDao
|
@NoSqlAnyDao
|
||||||
public class CassandraCluster extends AbstractCassandraCluster {
|
public class CassandraCluster extends AbstractCassandraCluster {
|
||||||
|
|
||||||
@Value("${cassandra.keyspace_name}")
|
@Value("${cassandra.keyspace_name}")
|
||||||
|
|||||||
@ -17,12 +17,12 @@ package org.thingsboard.server.dao.cassandra;
|
|||||||
|
|
||||||
import org.springframework.context.annotation.Profile;
|
import org.springframework.context.annotation.Profile;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.thingsboard.server.dao.util.NoSqlDao;
|
import org.thingsboard.server.dao.util.NoSqlAnyDao;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@NoSqlDao
|
@NoSqlAnyDao
|
||||||
@Profile("install")
|
@Profile("install")
|
||||||
public class CassandraInstallCluster extends AbstractCassandraCluster {
|
public class CassandraInstallCluster extends AbstractCassandraCluster {
|
||||||
|
|
||||||
|
|||||||
@ -21,14 +21,14 @@ import lombok.Data;
|
|||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.thingsboard.server.dao.util.NoSqlDao;
|
import org.thingsboard.server.dao.util.NoSqlAnyDao;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Configuration
|
@Configuration
|
||||||
@Data
|
@Data
|
||||||
@NoSqlDao
|
@NoSqlAnyDao
|
||||||
public class CassandraQueryOptions {
|
public class CassandraQueryOptions {
|
||||||
|
|
||||||
@Value("${cassandra.query.default_fetch_size}")
|
@Value("${cassandra.query.default_fetch_size}")
|
||||||
|
|||||||
@ -20,14 +20,14 @@ import lombok.Data;
|
|||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.thingsboard.server.dao.util.NoSqlDao;
|
import org.thingsboard.server.dao.util.NoSqlAnyDao;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Configuration
|
@Configuration
|
||||||
@Data
|
@Data
|
||||||
@NoSqlDao
|
@NoSqlAnyDao
|
||||||
public class CassandraSocketOptions {
|
public class CassandraSocketOptions {
|
||||||
|
|
||||||
@Value("${cassandra.socket.connect_timeout}")
|
@Value("${cassandra.socket.connect_timeout}")
|
||||||
|
|||||||
@ -44,6 +44,7 @@ import org.thingsboard.server.dao.sql.JpaAbstractDaoListeningExecutorService;
|
|||||||
import org.thingsboard.server.dao.timeseries.TimeseriesDao;
|
import org.thingsboard.server.dao.timeseries.TimeseriesDao;
|
||||||
import org.thingsboard.server.dao.timeseries.TsInsertExecutorType;
|
import org.thingsboard.server.dao.timeseries.TsInsertExecutorType;
|
||||||
import org.thingsboard.server.dao.util.SqlDao;
|
import org.thingsboard.server.dao.util.SqlDao;
|
||||||
|
import org.thingsboard.server.dao.util.SqlTsDao;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
@ -60,7 +61,7 @@ import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID;
|
|||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@SqlDao
|
@SqlTsDao
|
||||||
public class JpaTimeseriesDao extends JpaAbstractDaoListeningExecutorService implements TimeseriesDao {
|
public class JpaTimeseriesDao extends JpaAbstractDaoListeningExecutorService implements TimeseriesDao {
|
||||||
|
|
||||||
@Value("${sql.ts_inserts_executor_type}")
|
@Value("${sql.ts_inserts_executor_type}")
|
||||||
|
|||||||
@ -49,6 +49,7 @@ import org.thingsboard.server.common.data.kv.TsKvEntry;
|
|||||||
import org.thingsboard.server.dao.model.ModelConstants;
|
import org.thingsboard.server.dao.model.ModelConstants;
|
||||||
import org.thingsboard.server.dao.nosql.CassandraAbstractAsyncDao;
|
import org.thingsboard.server.dao.nosql.CassandraAbstractAsyncDao;
|
||||||
import org.thingsboard.server.dao.util.NoSqlDao;
|
import org.thingsboard.server.dao.util.NoSqlDao;
|
||||||
|
import org.thingsboard.server.dao.util.NoSqlTsDao;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
@ -70,7 +71,7 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
|
|||||||
*/
|
*/
|
||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@NoSqlDao
|
@NoSqlTsDao
|
||||||
public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implements TimeseriesDao {
|
public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implements TimeseriesDao {
|
||||||
|
|
||||||
private static final int MIN_AGGREGATION_STEP_MS = 1000;
|
private static final int MIN_AGGREGATION_STEP_MS = 1000;
|
||||||
|
|||||||
@ -34,7 +34,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@NoSqlDao
|
@NoSqlAnyDao
|
||||||
public class BufferedRateLimiter implements AsyncRateLimiter {
|
public class BufferedRateLimiter implements AsyncRateLimiter {
|
||||||
|
|
||||||
private final ListeningExecutorService pool = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
|
private final ListeningExecutorService pool = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
|
||||||
|
|||||||
@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed 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.thingsboard.server.dao.util;
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
|
||||||
|
|
||||||
|
@ConditionalOnExpression("'${database.ts.type}'=='cassandra' || '${database.entities.type}'=='cassandra'")
|
||||||
|
public @interface NoSqlAnyDao {
|
||||||
|
}
|
||||||
@ -17,6 +17,6 @@ package org.thingsboard.server.dao.util;
|
|||||||
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
|
|
||||||
@ConditionalOnProperty(prefix = "database", value = "type", havingValue = "cassandra")
|
@ConditionalOnProperty(prefix = "database.entities", value = "type", havingValue = "cassandra")
|
||||||
public @interface NoSqlDao {
|
public @interface NoSqlDao {
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed 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.thingsboard.server.dao.util;
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
|
|
||||||
|
@ConditionalOnProperty(prefix = "database.ts", value = "type", havingValue = "cassandra")
|
||||||
|
public @interface NoSqlTsDao {
|
||||||
|
}
|
||||||
@ -17,6 +17,6 @@ package org.thingsboard.server.dao.util;
|
|||||||
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
|
|
||||||
@ConditionalOnProperty(prefix = "database", value = "type", havingValue = "sql")
|
@ConditionalOnProperty(prefix = "database.entities", value = "type", havingValue = "sql")
|
||||||
public @interface SqlDao {
|
public @interface SqlDao {
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed 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.thingsboard.server.dao.util;
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
|
|
||||||
|
@ConditionalOnProperty(prefix = "database.ts", value = "type", havingValue = "sql")
|
||||||
|
public @interface SqlTsDao {
|
||||||
|
}
|
||||||
@ -378,41 +378,6 @@ CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.dashboard_by_tenant_and_searc
|
|||||||
PRIMARY KEY ( tenant_id, search_text, id )
|
PRIMARY KEY ( tenant_id, search_text, id )
|
||||||
WITH CLUSTERING ORDER BY ( search_text ASC, id DESC );
|
WITH CLUSTERING ORDER BY ( search_text ASC, id DESC );
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS thingsboard.ts_kv_cf (
|
|
||||||
entity_type text, // (DEVICE, CUSTOMER, TENANT)
|
|
||||||
entity_id timeuuid,
|
|
||||||
key text,
|
|
||||||
partition bigint,
|
|
||||||
ts bigint,
|
|
||||||
bool_v boolean,
|
|
||||||
str_v text,
|
|
||||||
long_v bigint,
|
|
||||||
dbl_v double,
|
|
||||||
PRIMARY KEY (( entity_type, entity_id, key, partition ), ts)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS thingsboard.ts_kv_partitions_cf (
|
|
||||||
entity_type text, // (DEVICE, CUSTOMER, TENANT)
|
|
||||||
entity_id timeuuid,
|
|
||||||
key text,
|
|
||||||
partition bigint,
|
|
||||||
PRIMARY KEY (( entity_type, entity_id, key ), partition)
|
|
||||||
) WITH CLUSTERING ORDER BY ( partition ASC )
|
|
||||||
AND compaction = { 'class' : 'LeveledCompactionStrategy' };
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS thingsboard.ts_kv_latest_cf (
|
|
||||||
entity_type text, // (DEVICE, CUSTOMER, TENANT)
|
|
||||||
entity_id timeuuid,
|
|
||||||
key text,
|
|
||||||
ts bigint,
|
|
||||||
bool_v boolean,
|
|
||||||
str_v text,
|
|
||||||
long_v bigint,
|
|
||||||
dbl_v double,
|
|
||||||
PRIMARY KEY (( entity_type, entity_id ), key)
|
|
||||||
) WITH compaction = { 'class' : 'LeveledCompactionStrategy' };
|
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS thingsboard.attributes_kv_cf (
|
CREATE TABLE IF NOT EXISTS thingsboard.attributes_kv_cf (
|
||||||
entity_type text, // (DEVICE, CUSTOMER, TENANT)
|
entity_type text, // (DEVICE, CUSTOMER, TENANT)
|
||||||
entity_id timeuuid,
|
entity_id timeuuid,
|
||||||
55
dao/src/main/resources/cassandra/schema-ts.cql
Normal file
55
dao/src/main/resources/cassandra/schema-ts.cql
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
--
|
||||||
|
-- Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
--
|
||||||
|
-- Licensed 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.
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE KEYSPACE IF NOT EXISTS thingsboard
|
||||||
|
WITH replication = {
|
||||||
|
'class' : 'SimpleStrategy',
|
||||||
|
'replication_factor' : 1
|
||||||
|
};
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS thingsboard.ts_kv_cf (
|
||||||
|
entity_type text, // (DEVICE, CUSTOMER, TENANT)
|
||||||
|
entity_id timeuuid,
|
||||||
|
key text,
|
||||||
|
partition bigint,
|
||||||
|
ts bigint,
|
||||||
|
bool_v boolean,
|
||||||
|
str_v text,
|
||||||
|
long_v bigint,
|
||||||
|
dbl_v double,
|
||||||
|
PRIMARY KEY (( entity_type, entity_id, key, partition ), ts)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS thingsboard.ts_kv_partitions_cf (
|
||||||
|
entity_type text, // (DEVICE, CUSTOMER, TENANT)
|
||||||
|
entity_id timeuuid,
|
||||||
|
key text,
|
||||||
|
partition bigint,
|
||||||
|
PRIMARY KEY (( entity_type, entity_id, key ), partition)
|
||||||
|
) WITH CLUSTERING ORDER BY ( partition ASC )
|
||||||
|
AND compaction = { 'class' : 'LeveledCompactionStrategy' };
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS thingsboard.ts_kv_latest_cf (
|
||||||
|
entity_type text, // (DEVICE, CUSTOMER, TENANT)
|
||||||
|
entity_id timeuuid,
|
||||||
|
key text,
|
||||||
|
ts bigint,
|
||||||
|
bool_v boolean,
|
||||||
|
str_v text,
|
||||||
|
long_v bigint,
|
||||||
|
dbl_v double,
|
||||||
|
PRIMARY KEY (( entity_type, entity_id ), key)
|
||||||
|
) WITH compaction = { 'class' : 'LeveledCompactionStrategy' };
|
||||||
@ -179,30 +179,6 @@ CREATE TABLE IF NOT EXISTS tenant (
|
|||||||
zip varchar(255)
|
zip varchar(255)
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS ts_kv (
|
|
||||||
entity_type varchar(255) NOT NULL,
|
|
||||||
entity_id varchar(31) NOT NULL,
|
|
||||||
key varchar(255) NOT NULL,
|
|
||||||
ts bigint NOT NULL,
|
|
||||||
bool_v boolean,
|
|
||||||
str_v varchar(10000000),
|
|
||||||
long_v bigint,
|
|
||||||
dbl_v double precision,
|
|
||||||
CONSTRAINT ts_kv_unq_key UNIQUE (entity_type, entity_id, key, ts)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS ts_kv_latest (
|
|
||||||
entity_type varchar(255) NOT NULL,
|
|
||||||
entity_id varchar(31) NOT NULL,
|
|
||||||
key varchar(255) NOT NULL,
|
|
||||||
ts bigint NOT NULL,
|
|
||||||
bool_v boolean,
|
|
||||||
str_v varchar(10000000),
|
|
||||||
long_v bigint,
|
|
||||||
dbl_v double precision,
|
|
||||||
CONSTRAINT ts_kv_latest_unq_key UNIQUE (entity_type, entity_id, key)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS user_credentials (
|
CREATE TABLE IF NOT EXISTS user_credentials (
|
||||||
id varchar(31) NOT NULL CONSTRAINT user_credentials_pkey PRIMARY KEY,
|
id varchar(31) NOT NULL CONSTRAINT user_credentials_pkey PRIMARY KEY,
|
||||||
activate_token varchar(255) UNIQUE,
|
activate_token varchar(255) UNIQUE,
|
||||||
39
dao/src/main/resources/sql/schema-ts.sql
Normal file
39
dao/src/main/resources/sql/schema-ts.sql
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
--
|
||||||
|
-- Copyright © 2016-2018 The Thingsboard Authors
|
||||||
|
--
|
||||||
|
-- Licensed 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.
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS ts_kv (
|
||||||
|
entity_type varchar(255) NOT NULL,
|
||||||
|
entity_id varchar(31) NOT NULL,
|
||||||
|
key varchar(255) NOT NULL,
|
||||||
|
ts bigint NOT NULL,
|
||||||
|
bool_v boolean,
|
||||||
|
str_v varchar(10000000),
|
||||||
|
long_v bigint,
|
||||||
|
dbl_v double precision,
|
||||||
|
CONSTRAINT ts_kv_unq_key UNIQUE (entity_type, entity_id, key, ts)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS ts_kv_latest (
|
||||||
|
entity_type varchar(255) NOT NULL,
|
||||||
|
entity_id varchar(31) NOT NULL,
|
||||||
|
key varchar(255) NOT NULL,
|
||||||
|
ts bigint NOT NULL,
|
||||||
|
bool_v boolean,
|
||||||
|
str_v varchar(10000000),
|
||||||
|
long_v bigint,
|
||||||
|
dbl_v double precision,
|
||||||
|
CONSTRAINT ts_kv_latest_unq_key UNIQUE (entity_type, entity_id, key)
|
||||||
|
);
|
||||||
@ -30,7 +30,7 @@ public class JpaDaoTestSuite {
|
|||||||
|
|
||||||
@ClassRule
|
@ClassRule
|
||||||
public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
|
public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
|
||||||
Arrays.asList("sql/schema.sql", "sql/system-data.sql"),
|
Arrays.asList("sql/schema-ts.sql", "sql/schema-entities.sql", "sql/system-data.sql"),
|
||||||
"sql/drop-all-tables.sql",
|
"sql/drop-all-tables.sql",
|
||||||
"sql-test.properties"
|
"sql-test.properties"
|
||||||
);
|
);
|
||||||
|
|||||||
@ -34,7 +34,9 @@ public class NoSqlDaoServiceTestSuite {
|
|||||||
@ClassRule
|
@ClassRule
|
||||||
public static CustomCassandraCQLUnit cassandraUnit =
|
public static CustomCassandraCQLUnit cassandraUnit =
|
||||||
new CustomCassandraCQLUnit(
|
new CustomCassandraCQLUnit(
|
||||||
Arrays.asList(new ClassPathCQLDataSet("cassandra/schema.cql", false, false),
|
Arrays.asList(
|
||||||
|
new ClassPathCQLDataSet("cassandra/schema-ts.cql", false, false),
|
||||||
|
new ClassPathCQLDataSet("cassandra/schema-entities.cql", false, false),
|
||||||
new ClassPathCQLDataSet("cassandra/system-data.cql", false, false),
|
new ClassPathCQLDataSet("cassandra/system-data.cql", false, false),
|
||||||
new ClassPathCQLDataSet("cassandra/system-test.cql", false, false)),
|
new ClassPathCQLDataSet("cassandra/system-test.cql", false, false)),
|
||||||
"cassandra-test.yaml", 30000L);
|
"cassandra-test.yaml", 30000L);
|
||||||
|
|||||||
@ -30,7 +30,7 @@ public class SqlDaoServiceTestSuite {
|
|||||||
|
|
||||||
@ClassRule
|
@ClassRule
|
||||||
public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
|
public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
|
||||||
Arrays.asList("sql/schema.sql", "sql/system-data.sql", "sql/system-test.sql"),
|
Arrays.asList("sql/schema-ts.sql", "sql/schema-entities.sql", "sql/system-data.sql", "sql/system-test.sql"),
|
||||||
"sql/drop-all-tables.sql",
|
"sql/drop-all-tables.sql",
|
||||||
"sql-test.properties"
|
"sql-test.properties"
|
||||||
);
|
);
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
database.type=cassandra
|
database.entities.type=cassandra
|
||||||
|
database.ts.type=cassandra
|
||||||
|
|
||||||
cassandra.queue.partitioning=HOURS
|
cassandra.queue.partitioning=HOURS
|
||||||
cassandra.queue.ack.ttl=3600
|
cassandra.queue.ack.ttl=3600
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
database.type=sql
|
database.ts.type=sql
|
||||||
|
database.entities.type=sql
|
||||||
|
|
||||||
sql.ts_inserts_executor_type=fixed
|
sql.ts_inserts_executor_type=fixed
|
||||||
sql.ts_inserts_fixed_thread_pool_size=10
|
sql.ts_inserts_fixed_thread_pool_size=10
|
||||||
|
|||||||
@ -30,7 +30,9 @@ spec:
|
|||||||
value: "cassandra-headless"
|
value: "cassandra-headless"
|
||||||
- name : CASSANDRA_PORT
|
- name : CASSANDRA_PORT
|
||||||
value: "9042"
|
value: "9042"
|
||||||
- name : DATABASE_TYPE
|
- name : DATABASE_ENTITIES_TYPE
|
||||||
|
value: "cassandra"
|
||||||
|
- name : DATABASE_TS_TYPE
|
||||||
value: "cassandra"
|
value: "cassandra"
|
||||||
- name : CASSANDRA_URL
|
- name : CASSANDRA_URL
|
||||||
value: "cassandra-headless:9042"
|
value: "cassandra-headless:9042"
|
||||||
|
|||||||
@ -30,7 +30,9 @@ spec:
|
|||||||
value: "cassandra-headless"
|
value: "cassandra-headless"
|
||||||
- name : CASSANDRA_PORT
|
- name : CASSANDRA_PORT
|
||||||
value: "9042"
|
value: "9042"
|
||||||
- name : DATABASE_TYPE
|
- name : DATABASE_ENTITIES_TYPE
|
||||||
|
value: "cassandra"
|
||||||
|
- name : DATABASE_TS_TYPE
|
||||||
value: "cassandra"
|
value: "cassandra"
|
||||||
- name : CASSANDRA_URL
|
- name : CASSANDRA_URL
|
||||||
value: "cassandra-headless:9042"
|
value: "cassandra-headless:9042"
|
||||||
|
|||||||
@ -120,7 +120,12 @@ spec:
|
|||||||
configMapKeyRef:
|
configMapKeyRef:
|
||||||
name: tb-config
|
name: tb-config
|
||||||
key: cassandra.url
|
key: cassandra.url
|
||||||
- name: DATABASE_TYPE
|
- name: DATABASE_ENTITIES_TYPE
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: tb-config
|
||||||
|
key: database.type
|
||||||
|
- name: DATABASE_TS_TYPE
|
||||||
valueFrom:
|
valueFrom:
|
||||||
configMapKeyRef:
|
configMapKeyRef:
|
||||||
name: tb-config
|
name: tb-config
|
||||||
|
|||||||
@ -8,7 +8,8 @@ COAP_BIND_PORT=5683
|
|||||||
ZOOKEEPER_URL=zk:2181
|
ZOOKEEPER_URL=zk:2181
|
||||||
|
|
||||||
# type of database to use: sql[DEFAULT] or cassandra
|
# type of database to use: sql[DEFAULT] or cassandra
|
||||||
DATABASE_TYPE=sql
|
DATABASE_TS_TYPE=sql
|
||||||
|
DATABASE_ENTITIES_TYPE=sql
|
||||||
|
|
||||||
# cassandra db config
|
# cassandra db config
|
||||||
CASSANDRA_URL=cassandra:9042
|
CASSANDRA_URL=cassandra:9042
|
||||||
|
|||||||
@ -23,7 +23,7 @@ printenv | awk -F "=" '{print "export " $1 "='\''" $2 "'\''"}' >> /usr/share/thi
|
|||||||
|
|
||||||
cat /usr/share/thingsboard/conf/thingsboard.conf
|
cat /usr/share/thingsboard/conf/thingsboard.conf
|
||||||
|
|
||||||
if [ "$DATABASE_TYPE" == "cassandra" ]; then
|
if [ "$DATABASE_ENTITIES_TYPE" == "cassandra" ]; then
|
||||||
until nmap $CASSANDRA_HOST -p $CASSANDRA_PORT | grep "$CASSANDRA_PORT/tcp open\|filtered"
|
until nmap $CASSANDRA_HOST -p $CASSANDRA_PORT | grep "$CASSANDRA_PORT/tcp open\|filtered"
|
||||||
do
|
do
|
||||||
echo "Wait for cassandra db to start..."
|
echo "Wait for cassandra db to start..."
|
||||||
@ -31,7 +31,7 @@ if [ "$DATABASE_TYPE" == "cassandra" ]; then
|
|||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$DATABASE_TYPE" == "sql" ]; then
|
if [ "$DATABASE_ENTITIES_TYPE" == "sql" ]; then
|
||||||
if [ "$SPRING_DRIVER_CLASS_NAME" == "org.postgresql.Driver" ]; then
|
if [ "$SPRING_DRIVER_CLASS_NAME" == "org.postgresql.Driver" ]; then
|
||||||
until nmap $POSTGRES_HOST -p $POSTGRES_PORT | grep "$POSTGRES_PORT/tcp open"
|
until nmap $POSTGRES_HOST -p $POSTGRES_PORT | grep "$POSTGRES_PORT/tcp open"
|
||||||
do
|
do
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user