PSQL annotation and dialect cleanup.
This commit is contained in:
parent
0c1d3611cd
commit
c4bdee92db
@ -18,19 +18,17 @@ package org.thingsboard.server.service.install;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.context.annotation.Profile;
|
import org.springframework.context.annotation.Profile;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@PsqlDao
|
|
||||||
@Profile("install")
|
@Profile("install")
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class PsqlEntityDatabaseSchemaService extends SqlAbstractDatabaseSchemaService
|
public class SqlEntityDatabaseSchemaService extends SqlAbstractDatabaseSchemaService
|
||||||
implements EntityDatabaseSchemaService {
|
implements EntityDatabaseSchemaService {
|
||||||
public static final String SCHEMA_ENTITIES_SQL = "schema-entities.sql";
|
public static final String SCHEMA_ENTITIES_SQL = "schema-entities.sql";
|
||||||
public static final String SCHEMA_ENTITIES_IDX_SQL = "schema-entities-idx.sql";
|
public static final String SCHEMA_ENTITIES_IDX_SQL = "schema-entities-idx.sql";
|
||||||
public static final String SCHEMA_ENTITIES_IDX_PSQL_ADDON_SQL = "schema-entities-idx-psql-addon.sql";
|
public static final String SCHEMA_ENTITIES_IDX_PSQL_ADDON_SQL = "schema-entities-idx-psql-addon.sql";
|
||||||
|
|
||||||
public PsqlEntityDatabaseSchemaService() {
|
public SqlEntityDatabaseSchemaService() {
|
||||||
super(SCHEMA_ENTITIES_SQL, SCHEMA_ENTITIES_IDX_SQL);
|
super(SCHEMA_ENTITIES_SQL, SCHEMA_ENTITIES_IDX_SQL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -18,19 +18,17 @@ package org.thingsboard.server.service.install;
|
|||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Profile;
|
import org.springframework.context.annotation.Profile;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.SqlTsDao;
|
import org.thingsboard.server.dao.util.SqlTsDao;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@SqlTsDao
|
@SqlTsDao
|
||||||
@PsqlDao
|
|
||||||
@Profile("install")
|
@Profile("install")
|
||||||
public class PsqlTsDatabaseSchemaService extends SqlAbstractDatabaseSchemaService implements TsDatabaseSchemaService {
|
public class SqlTsDatabaseSchemaService extends SqlAbstractDatabaseSchemaService implements TsDatabaseSchemaService {
|
||||||
|
|
||||||
@Value("${sql.postgres.ts_key_value_partitioning:MONTHS}")
|
@Value("${sql.postgres.ts_key_value_partitioning:MONTHS}")
|
||||||
private String partitionType;
|
private String partitionType;
|
||||||
|
|
||||||
public PsqlTsDatabaseSchemaService() {
|
public SqlTsDatabaseSchemaService() {
|
||||||
super("schema-ts-psql.sql", null);
|
super("schema-ts-psql.sql", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -21,7 +21,6 @@ import org.apache.commons.lang3.SystemUtils;
|
|||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Profile;
|
import org.springframework.context.annotation.Profile;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.SqlTsDao;
|
import org.thingsboard.server.dao.util.SqlTsDao;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@ -36,8 +35,7 @@ import java.sql.DriverManager;
|
|||||||
@Profile("install")
|
@Profile("install")
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@SqlTsDao
|
@SqlTsDao
|
||||||
@PsqlDao
|
public class SqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeService implements DatabaseTsUpgradeService {
|
||||||
public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeService implements DatabaseTsUpgradeService {
|
|
||||||
|
|
||||||
@Value("${sql.postgres.ts_key_value_partitioning:MONTHS}")
|
@Value("${sql.postgres.ts_key_value_partitioning:MONTHS}")
|
||||||
private String partitionType;
|
private String partitionType;
|
||||||
@ -19,16 +19,10 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Profile;
|
import org.springframework.context.annotation.Profile;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.TimescaleDBTsDao;
|
import org.thingsboard.server.dao.util.TimescaleDBTsDao;
|
||||||
|
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.DriverManager;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@TimescaleDBTsDao
|
@TimescaleDBTsDao
|
||||||
@PsqlDao
|
|
||||||
@Profile("install")
|
@Profile("install")
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class TimescaleTsDatabaseSchemaService extends SqlAbstractDatabaseSchemaService implements TsDatabaseSchemaService {
|
public class TimescaleTsDatabaseSchemaService extends SqlAbstractDatabaseSchemaService implements TsDatabaseSchemaService {
|
||||||
|
|||||||
@ -22,7 +22,6 @@ 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.context.annotation.Profile;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.TimescaleDBTsDao;
|
import org.thingsboard.server.dao.util.TimescaleDBTsDao;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@ -37,7 +36,6 @@ import java.sql.DriverManager;
|
|||||||
@Profile("install")
|
@Profile("install")
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@TimescaleDBTsDao
|
@TimescaleDBTsDao
|
||||||
@PsqlDao
|
|
||||||
public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeService implements DatabaseTsUpgradeService {
|
public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeService implements DatabaseTsUpgradeService {
|
||||||
|
|
||||||
@Value("${sql.timescale.chunk_time_interval:86400000}")
|
@Value("${sql.timescale.chunk_time_interval:86400000}")
|
||||||
|
|||||||
@ -176,8 +176,6 @@ database:
|
|||||||
ts_latest:
|
ts_latest:
|
||||||
type: "${DATABASE_TS_LATEST_TYPE:sql}" # cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale)
|
type: "${DATABASE_TS_LATEST_TYPE:sql}" # cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale)
|
||||||
|
|
||||||
# note: timescale works only with postgreSQL database for DATABASE_ENTITIES_TYPE.
|
|
||||||
|
|
||||||
# Cassandra driver configuration parameters
|
# Cassandra driver configuration parameters
|
||||||
cassandra:
|
cassandra:
|
||||||
# Thingsboard cluster name
|
# Thingsboard cluster name
|
||||||
@ -535,7 +533,6 @@ spring:
|
|||||||
open-in-view: "false"
|
open-in-view: "false"
|
||||||
hibernate:
|
hibernate:
|
||||||
ddl-auto: "none"
|
ddl-auto: "none"
|
||||||
database-platform: "${SPRING_JPA_DATABASE_PLATFORM:org.hibernate.dialect.PostgreSQL10Dialect}"
|
|
||||||
datasource:
|
datasource:
|
||||||
driverClassName: "${SPRING_DRIVER_CLASS_NAME:org.postgresql.Driver}"
|
driverClassName: "${SPRING_DRIVER_CLASS_NAME:org.postgresql.Driver}"
|
||||||
url: "${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/thingsboard}"
|
url: "${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/thingsboard}"
|
||||||
|
|||||||
@ -23,31 +23,31 @@ import static org.mockito.Mockito.spy;
|
|||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
public class PsqlEntityDatabaseSchemaServiceTest {
|
public class SqlEntityDatabaseSchemaServiceTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenPsqlDbSchemaService_whenCreateDatabaseSchema_thenVerifyPsqlIndexSpecificCall() throws Exception {
|
public void givenPsqlDbSchemaService_whenCreateDatabaseSchema_thenVerifyPsqlIndexSpecificCall() throws Exception {
|
||||||
PsqlEntityDatabaseSchemaService service = spy(new PsqlEntityDatabaseSchemaService());
|
SqlEntityDatabaseSchemaService service = spy(new SqlEntityDatabaseSchemaService());
|
||||||
willDoNothing().given(service).executeQueryFromFile(anyString());
|
willDoNothing().given(service).executeQueryFromFile(anyString());
|
||||||
|
|
||||||
service.createDatabaseSchema();
|
service.createDatabaseSchema();
|
||||||
|
|
||||||
verify(service, times(1)).createDatabaseIndexes();
|
verify(service, times(1)).createDatabaseIndexes();
|
||||||
verify(service, times(1)).executeQueryFromFile(PsqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_SQL);
|
verify(service, times(1)).executeQueryFromFile(SqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_SQL);
|
||||||
verify(service, times(1)).executeQueryFromFile(PsqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_IDX_SQL);
|
verify(service, times(1)).executeQueryFromFile(SqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_IDX_SQL);
|
||||||
verify(service, times(1)).executeQueryFromFile(PsqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_IDX_PSQL_ADDON_SQL);
|
verify(service, times(1)).executeQueryFromFile(SqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_IDX_PSQL_ADDON_SQL);
|
||||||
verify(service, times(3)).executeQueryFromFile(anyString());
|
verify(service, times(3)).executeQueryFromFile(anyString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenPsqlDbSchemaService_whenCreateDatabaseIndexes_thenVerifyPsqlIndexSpecificCall() throws Exception {
|
public void givenPsqlDbSchemaService_whenCreateDatabaseIndexes_thenVerifyPsqlIndexSpecificCall() throws Exception {
|
||||||
PsqlEntityDatabaseSchemaService service = spy(new PsqlEntityDatabaseSchemaService());
|
SqlEntityDatabaseSchemaService service = spy(new SqlEntityDatabaseSchemaService());
|
||||||
willDoNothing().given(service).executeQueryFromFile(anyString());
|
willDoNothing().given(service).executeQueryFromFile(anyString());
|
||||||
|
|
||||||
service.createDatabaseIndexes();
|
service.createDatabaseIndexes();
|
||||||
|
|
||||||
verify(service, times(1)).executeQueryFromFile(PsqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_IDX_SQL);
|
verify(service, times(1)).executeQueryFromFile(SqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_IDX_SQL);
|
||||||
verify(service, times(1)).executeQueryFromFile(PsqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_IDX_PSQL_ADDON_SQL);
|
verify(service, times(1)).executeQueryFromFile(SqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_IDX_PSQL_ADDON_SQL);
|
||||||
verify(service, times(2)).executeQueryFromFile(anyString());
|
verify(service, times(2)).executeQueryFromFile(anyString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2022 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;
|
|
||||||
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
@ConditionalOnProperty(prefix = "spring.jpa", value = "database-platform", havingValue = "org.hibernate.dialect.HSQLDialect")
|
|
||||||
public @interface HsqlDao {
|
|
||||||
}
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2022 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;
|
|
||||||
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
@ConditionalOnProperty(prefix = "spring.jpa", value = "database-platform", havingValue = "org.hibernate.dialect.PostgreSQL10Dialect")
|
|
||||||
public @interface PsqlDao {
|
|
||||||
}
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2022 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;
|
|
||||||
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
@ConditionalOnExpression("('${database.ts_latest.type}'=='sql' || '${database.ts_latest.type}'=='timescale') " +
|
|
||||||
"&& '${spring.jpa.database-platform}'=='org.hibernate.dialect.PostgreSQL10Dialect'")
|
|
||||||
public @interface PsqlTsLatestAnyDao {
|
|
||||||
}
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2022 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;
|
|
||||||
|
|
||||||
import org.springframework.boot.autoconfigure.domain.EntityScan;
|
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
|
||||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
|
||||||
import org.thingsboard.server.dao.util.HsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.SqlTsLatestDao;
|
|
||||||
import org.thingsboard.server.dao.util.TbAutoConfiguration;
|
|
||||||
|
|
||||||
@Configuration
|
|
||||||
@TbAutoConfiguration
|
|
||||||
@ComponentScan({"org.thingsboard.server.dao.sqlts.hsql"})
|
|
||||||
@EnableJpaRepositories({"org.thingsboard.server.dao.sqlts.insert.latest.hsql", "org.thingsboard.server.dao.sqlts.latest"})
|
|
||||||
@EntityScan({"org.thingsboard.server.dao.model.sqlts.latest"})
|
|
||||||
@EnableTransactionManagement
|
|
||||||
@SqlTsLatestDao
|
|
||||||
@HsqlDao
|
|
||||||
public class HsqlTsLatestDaoConfig {
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2022 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;
|
|
||||||
|
|
||||||
import org.springframework.boot.autoconfigure.domain.EntityScan;
|
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
|
||||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.SqlTsDao;
|
|
||||||
import org.thingsboard.server.dao.util.TbAutoConfiguration;
|
|
||||||
|
|
||||||
@Configuration
|
|
||||||
@TbAutoConfiguration
|
|
||||||
@ComponentScan({"org.thingsboard.server.dao.sqlts.psql", "org.thingsboard.server.dao.sqlts.insert.psql"})
|
|
||||||
@EnableJpaRepositories({"org.thingsboard.server.dao.sqlts.ts", "org.thingsboard.server.dao.sqlts.insert.psql"})
|
|
||||||
@EntityScan({"org.thingsboard.server.dao.model.sqlts.ts"})
|
|
||||||
@EnableTransactionManagement
|
|
||||||
@PsqlDao
|
|
||||||
@SqlTsDao
|
|
||||||
public class PsqlTsDaoConfig {
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -20,18 +20,16 @@ import org.springframework.context.annotation.ComponentScan;
|
|||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
||||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||||
import org.thingsboard.server.dao.util.HsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.SqlTsDao;
|
import org.thingsboard.server.dao.util.SqlTsDao;
|
||||||
import org.thingsboard.server.dao.util.TbAutoConfiguration;
|
import org.thingsboard.server.dao.util.TbAutoConfiguration;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@TbAutoConfiguration
|
@TbAutoConfiguration
|
||||||
@ComponentScan({"org.thingsboard.server.dao.sqlts.hsql"})
|
@ComponentScan({"org.thingsboard.server.dao.sqlts.sql", "org.thingsboard.server.dao.sqlts.insert.sql"})
|
||||||
@EnableJpaRepositories({"org.thingsboard.server.dao.sqlts.ts", "org.thingsboard.server.dao.sqlts.insert.hsql"})
|
@EnableJpaRepositories({"org.thingsboard.server.dao.sqlts.ts", "org.thingsboard.server.dao.sqlts.insert.sql"})
|
||||||
@EntityScan({"org.thingsboard.server.dao.model.sqlts.ts"})
|
@EntityScan({"org.thingsboard.server.dao.model.sqlts.ts"})
|
||||||
@EnableTransactionManagement
|
@EnableTransactionManagement
|
||||||
@SqlTsDao
|
@SqlTsDao
|
||||||
@HsqlDao
|
public class SqlTsDaoConfig {
|
||||||
public class HsqlTsDaoConfig {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -20,18 +20,16 @@ import org.springframework.context.annotation.ComponentScan;
|
|||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
||||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.SqlTsLatestDao;
|
import org.thingsboard.server.dao.util.SqlTsLatestDao;
|
||||||
import org.thingsboard.server.dao.util.TbAutoConfiguration;
|
import org.thingsboard.server.dao.util.TbAutoConfiguration;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@TbAutoConfiguration
|
@TbAutoConfiguration
|
||||||
@ComponentScan({"org.thingsboard.server.dao.sqlts.psql"})
|
@ComponentScan({"org.thingsboard.server.dao.sqlts.sql"})
|
||||||
@EnableJpaRepositories({"org.thingsboard.server.dao.sqlts.insert.latest.psql", "org.thingsboard.server.dao.sqlts.latest"})
|
@EnableJpaRepositories({"org.thingsboard.server.dao.sqlts.insert.latest.sql", "org.thingsboard.server.dao.sqlts.latest"})
|
||||||
@EntityScan({"org.thingsboard.server.dao.model.sqlts.latest"})
|
@EntityScan({"org.thingsboard.server.dao.model.sqlts.latest"})
|
||||||
@EnableTransactionManagement
|
@EnableTransactionManagement
|
||||||
@SqlTsLatestDao
|
@SqlTsLatestDao
|
||||||
@PsqlDao
|
public class SqlTsLatestDaoConfig {
|
||||||
public class PsqlTsLatestDaoConfig {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -20,7 +20,6 @@ import org.springframework.context.annotation.ComponentScan;
|
|||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
||||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.TbAutoConfiguration;
|
import org.thingsboard.server.dao.util.TbAutoConfiguration;
|
||||||
import org.thingsboard.server.dao.util.TimescaleDBTsDao;
|
import org.thingsboard.server.dao.util.TimescaleDBTsDao;
|
||||||
|
|
||||||
@ -31,7 +30,6 @@ import org.thingsboard.server.dao.util.TimescaleDBTsDao;
|
|||||||
@EntityScan({"org.thingsboard.server.dao.model.sqlts.timescale"})
|
@EntityScan({"org.thingsboard.server.dao.model.sqlts.timescale"})
|
||||||
@EnableTransactionManagement
|
@EnableTransactionManagement
|
||||||
@TimescaleDBTsDao
|
@TimescaleDBTsDao
|
||||||
@PsqlDao
|
|
||||||
public class TimescaleDaoConfig {
|
public class TimescaleDaoConfig {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,18 +20,16 @@ import org.springframework.context.annotation.ComponentScan;
|
|||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
||||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.TbAutoConfiguration;
|
import org.thingsboard.server.dao.util.TbAutoConfiguration;
|
||||||
import org.thingsboard.server.dao.util.TimescaleDBTsLatestDao;
|
import org.thingsboard.server.dao.util.TimescaleDBTsLatestDao;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@TbAutoConfiguration
|
@TbAutoConfiguration
|
||||||
@ComponentScan({"org.thingsboard.server.dao.sqlts.timescale"})
|
@ComponentScan({"org.thingsboard.server.dao.sqlts.timescale"})
|
||||||
@EnableJpaRepositories({"org.thingsboard.server.dao.sqlts.insert.latest.psql", "org.thingsboard.server.dao.sqlts.latest"})
|
@EnableJpaRepositories({"org.thingsboard.server.dao.sqlts.insert.latest.sql", "org.thingsboard.server.dao.sqlts.latest"})
|
||||||
@EntityScan({"org.thingsboard.server.dao.model.sqlts.latest"})
|
@EntityScan({"org.thingsboard.server.dao.model.sqlts.latest"})
|
||||||
@EnableTransactionManagement
|
@EnableTransactionManagement
|
||||||
@TimescaleDBTsLatestDao
|
@TimescaleDBTsLatestDao
|
||||||
@PsqlDao
|
|
||||||
public class TimescaleTsLatestDaoConfig {
|
public class TimescaleTsLatestDaoConfig {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,76 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2022 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.sql.attributes;
|
|
||||||
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
import org.thingsboard.server.dao.model.sql.AttributeKvEntity;
|
|
||||||
import org.thingsboard.server.dao.util.HsqlDao;
|
|
||||||
|
|
||||||
import java.sql.Types;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@HsqlDao
|
|
||||||
@Repository
|
|
||||||
@Transactional
|
|
||||||
public class HsqlAttributesInsertRepository extends AttributeKvInsertRepository {
|
|
||||||
|
|
||||||
private static final String INSERT_OR_UPDATE =
|
|
||||||
"MERGE INTO attribute_kv USING(VALUES ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) " +
|
|
||||||
"A (entity_type, entity_id, attribute_type, attribute_key, str_v, long_v, dbl_v, bool_v, json_v, last_update_ts) " +
|
|
||||||
"ON (attribute_kv.entity_type=A.entity_type " +
|
|
||||||
"AND attribute_kv.entity_id=A.entity_id " +
|
|
||||||
"AND attribute_kv.attribute_type=A.attribute_type " +
|
|
||||||
"AND attribute_kv.attribute_key=A.attribute_key) " +
|
|
||||||
"WHEN MATCHED THEN UPDATE SET attribute_kv.str_v = A.str_v, attribute_kv.long_v = A.long_v, attribute_kv.dbl_v = A.dbl_v, attribute_kv.bool_v = A.bool_v, attribute_kv.json_v = A.json_v, attribute_kv.last_update_ts = A.last_update_ts " +
|
|
||||||
"WHEN NOT MATCHED THEN INSERT (entity_type, entity_id, attribute_type, attribute_key, str_v, long_v, dbl_v, bool_v, json_v, last_update_ts) " +
|
|
||||||
"VALUES (A.entity_type, A.entity_id, A.attribute_type, A.attribute_key, A.str_v, A.long_v, A.dbl_v, A.bool_v, A.json_v, A.last_update_ts)";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void saveOrUpdate(List<AttributeKvEntity> entities) {
|
|
||||||
entities.forEach(entity -> {
|
|
||||||
jdbcTemplate.update(INSERT_OR_UPDATE, ps -> {
|
|
||||||
ps.setString(1, entity.getId().getEntityType().name());
|
|
||||||
ps.setObject(2, entity.getId().getEntityId());
|
|
||||||
ps.setString(3, entity.getId().getAttributeType());
|
|
||||||
ps.setString(4, entity.getId().getAttributeKey());
|
|
||||||
ps.setString(5, entity.getStrValue());
|
|
||||||
|
|
||||||
if (entity.getLongValue() != null) {
|
|
||||||
ps.setLong(6, entity.getLongValue());
|
|
||||||
} else {
|
|
||||||
ps.setNull(6, Types.BIGINT);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (entity.getDoubleValue() != null) {
|
|
||||||
ps.setDouble(7, entity.getDoubleValue());
|
|
||||||
} else {
|
|
||||||
ps.setNull(7, Types.DOUBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (entity.getBooleanValue() != null) {
|
|
||||||
ps.setBoolean(8, entity.getBooleanValue());
|
|
||||||
} else {
|
|
||||||
ps.setNull(8, Types.BOOLEAN);
|
|
||||||
}
|
|
||||||
|
|
||||||
ps.setString(9, entity.getJsonValue());
|
|
||||||
|
|
||||||
ps.setLong(10, entity.getLastUpdateTs());
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -17,11 +17,9 @@ package org.thingsboard.server.dao.sql.attributes;
|
|||||||
|
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
|
|
||||||
@PsqlDao
|
|
||||||
@Repository
|
@Repository
|
||||||
@Transactional
|
@Transactional
|
||||||
public class PsqlAttributesInsertRepository extends AttributeKvInsertRepository {
|
public class SqlAttributesInsertRepository extends AttributeKvInsertRepository {
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1,65 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2022 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.sql.component;
|
|
||||||
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
|
|
||||||
import org.thingsboard.server.dao.util.HsqlDao;
|
|
||||||
|
|
||||||
import javax.persistence.Query;
|
|
||||||
|
|
||||||
@HsqlDao
|
|
||||||
@Repository
|
|
||||||
public class HsqlComponentDescriptorInsertRepository extends AbstractComponentDescriptorInsertRepository {
|
|
||||||
|
|
||||||
private static final String P_KEY_CONFLICT_STATEMENT = "(component_descriptor.id=UUID(I.id))";
|
|
||||||
private static final String UNQ_KEY_CONFLICT_STATEMENT = "(component_descriptor.clazz=I.clazz)";
|
|
||||||
|
|
||||||
private static final String INSERT_OR_UPDATE_ON_P_KEY_CONFLICT = getInsertString(P_KEY_CONFLICT_STATEMENT);
|
|
||||||
private static final String INSERT_OR_UPDATE_ON_UNQ_KEY_CONFLICT = getInsertString(UNQ_KEY_CONFLICT_STATEMENT);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ComponentDescriptorEntity saveOrUpdate(ComponentDescriptorEntity entity) {
|
|
||||||
return saveAndGet(entity, INSERT_OR_UPDATE_ON_P_KEY_CONFLICT, INSERT_OR_UPDATE_ON_UNQ_KEY_CONFLICT);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Query getQuery(ComponentDescriptorEntity entity, String query) {
|
|
||||||
return entityManager.createNativeQuery(query, ComponentDescriptorEntity.class)
|
|
||||||
.setParameter("id", entity.getUuid().toString())
|
|
||||||
.setParameter("created_time", entity.getCreatedTime())
|
|
||||||
.setParameter("actions", entity.getActions())
|
|
||||||
.setParameter("clazz", entity.getClazz())
|
|
||||||
.setParameter("configuration_descriptor", entity.getConfigurationDescriptor().toString())
|
|
||||||
.setParameter("name", entity.getName())
|
|
||||||
.setParameter("scope", entity.getScope().name())
|
|
||||||
.setParameter("search_text", entity.getSearchText())
|
|
||||||
.setParameter("type", entity.getType().name());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected ComponentDescriptorEntity doProcessSaveOrUpdate(ComponentDescriptorEntity entity, String query) {
|
|
||||||
getQuery(entity, query).executeUpdate();
|
|
||||||
return entityManager.find(ComponentDescriptorEntity.class, entity.getUuid());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String getInsertString(String conflictStatement) {
|
|
||||||
return "MERGE INTO component_descriptor USING (VALUES :id, :created_time, :actions, :clazz, :configuration_descriptor, :name, :scope, :search_text, :type) I (id, created_time, actions, clazz, configuration_descriptor, name, scope, search_text, type) ON "
|
|
||||||
+ conflictStatement
|
|
||||||
+ " WHEN MATCHED THEN UPDATE SET component_descriptor.id = UUID(I.id), component_descriptor.actions = I.actions, component_descriptor.clazz = I.clazz, component_descriptor.configuration_descriptor = I.configuration_descriptor, component_descriptor.name = I.name, component_descriptor.scope = I.scope, component_descriptor.search_text = I.search_text, component_descriptor.type = I.type" +
|
|
||||||
" WHEN NOT MATCHED THEN INSERT (id, created_time, actions, clazz, configuration_descriptor, name, scope, search_text, type) VALUES (UUID(I.id), I.created_time, I.actions, I.clazz, I.configuration_descriptor, I.name, I.scope, I.search_text, I.type)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -17,11 +17,9 @@ package org.thingsboard.server.dao.sql.component;
|
|||||||
|
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
|
import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
|
|
||||||
@PsqlDao
|
|
||||||
@Repository
|
@Repository
|
||||||
public class PsqlComponentDescriptorInsertRepository extends AbstractComponentDescriptorInsertRepository {
|
public class SqlComponentDescriptorInsertRepository extends AbstractComponentDescriptorInsertRepository {
|
||||||
|
|
||||||
private static final String ID = "id = :id";
|
private static final String ID = "id = :id";
|
||||||
private static final String CLAZZ_CLAZZ = "clazz = :clazz";
|
private static final String CLAZZ_CLAZZ = "clazz = :clazz";
|
||||||
@ -24,13 +24,12 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
|
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
|
||||||
import org.springframework.transaction.support.TransactionTemplate;
|
import org.springframework.transaction.support.TransactionTemplate;
|
||||||
import org.thingsboard.server.dao.model.sql.EdgeEventEntity;
|
import org.thingsboard.server.dao.model.sql.EdgeEventEntity;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@PsqlDao
|
|
||||||
@Repository
|
@Repository
|
||||||
@Transactional
|
@Transactional
|
||||||
public class EdgeEventInsertRepository {
|
public class EdgeEventInsertRepository {
|
||||||
|
|||||||
@ -25,14 +25,12 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
|
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
|
||||||
import org.springframework.transaction.support.TransactionTemplate;
|
import org.springframework.transaction.support.TransactionTemplate;
|
||||||
import org.thingsboard.server.dao.model.sql.EventEntity;
|
import org.thingsboard.server.dao.model.sql.EventEntity;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@PsqlDao
|
|
||||||
@Repository
|
@Repository
|
||||||
@Transactional
|
@Transactional
|
||||||
public class EventInsertRepository {
|
public class EventInsertRepository {
|
||||||
|
|||||||
@ -18,7 +18,6 @@ package org.thingsboard.server.dao.sql.event;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
import org.thingsboard.server.dao.sql.JpaAbstractDaoListeningExecutorService;
|
import org.thingsboard.server.dao.sql.JpaAbstractDaoListeningExecutorService;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
@ -27,9 +26,8 @@ import java.sql.SQLException;
|
|||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@PsqlDao
|
|
||||||
@Repository
|
@Repository
|
||||||
public class PsqlEventCleanupRepository extends JpaAbstractDaoListeningExecutorService implements EventCleanupRepository {
|
public class SqlEventCleanupRepository extends JpaAbstractDaoListeningExecutorService implements EventCleanupRepository {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void cleanupEvents(long regularEventStartTs, long regularEventEndTs, long debugEventStartTs, long debugEventEndTs) {
|
public void cleanupEvents(long regularEventStartTs, long regularEventEndTs, long debugEventStartTs, long debugEventEndTs) {
|
||||||
@ -1,63 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2022 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.sql.relation;
|
|
||||||
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
import org.thingsboard.server.dao.model.sql.RelationCompositeKey;
|
|
||||||
import org.thingsboard.server.dao.model.sql.RelationEntity;
|
|
||||||
import org.thingsboard.server.dao.util.HsqlDao;
|
|
||||||
|
|
||||||
import javax.persistence.Query;
|
|
||||||
|
|
||||||
@HsqlDao
|
|
||||||
@Repository
|
|
||||||
@Transactional
|
|
||||||
public class HsqlRelationInsertRepository extends AbstractRelationInsertRepository implements RelationInsertRepository {
|
|
||||||
|
|
||||||
private static final String INSERT_ON_CONFLICT_DO_UPDATE = "MERGE INTO relation USING (VALUES :fromId, :fromType, :toId, :toType, :relationTypeGroup, :relationType, :additionalInfo) R " +
|
|
||||||
"(from_id, from_type, to_id, to_type, relation_type_group, relation_type, additional_info) " +
|
|
||||||
"ON (relation.from_id = UUID(R.from_id) AND relation.from_type = R.from_type AND relation.relation_type_group = R.relation_type_group AND relation.relation_type = R.relation_type AND relation.to_id = UUID(R.to_id) AND relation.to_type = R.to_type) " +
|
|
||||||
"WHEN MATCHED THEN UPDATE SET relation.additional_info = R.additional_info " +
|
|
||||||
"WHEN NOT MATCHED THEN INSERT (from_id, from_type, to_id, to_type, relation_type_group, relation_type, additional_info) VALUES (UUID(R.from_id), R.from_type, UUID(R.to_id), R.to_type, R.relation_type_group, R.relation_type, R.additional_info)";
|
|
||||||
|
|
||||||
protected Query getQuery(RelationEntity entity, String query) {
|
|
||||||
Query nativeQuery = entityManager.createNativeQuery(query, RelationEntity.class);
|
|
||||||
if (entity.getAdditionalInfo() == null) {
|
|
||||||
nativeQuery.setParameter("additionalInfo", null);
|
|
||||||
} else {
|
|
||||||
nativeQuery.setParameter("additionalInfo", entity.getAdditionalInfo().toString());
|
|
||||||
}
|
|
||||||
return nativeQuery
|
|
||||||
.setParameter("fromId", entity.getFromId().toString())
|
|
||||||
.setParameter("fromType", entity.getFromType())
|
|
||||||
.setParameter("toId", entity.getToId().toString())
|
|
||||||
.setParameter("toType", entity.getToType())
|
|
||||||
.setParameter("relationTypeGroup", entity.getRelationTypeGroup())
|
|
||||||
.setParameter("relationType", entity.getRelationType());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RelationEntity saveOrUpdate(RelationEntity entity) {
|
|
||||||
return processSaveOrUpdate(entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected RelationEntity processSaveOrUpdate(RelationEntity entity) {
|
|
||||||
getQuery(entity, INSERT_ON_CONFLICT_DO_UPDATE).executeUpdate();
|
|
||||||
return entityManager.find(RelationEntity.class, new RelationCompositeKey(entity.toData()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -18,12 +18,10 @@ package org.thingsboard.server.dao.sql.relation;
|
|||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.thingsboard.server.dao.model.sql.RelationEntity;
|
import org.thingsboard.server.dao.model.sql.RelationEntity;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
|
|
||||||
@PsqlDao
|
|
||||||
@Repository
|
@Repository
|
||||||
@Transactional
|
@Transactional
|
||||||
public class PsqlRelationInsertRepository extends AbstractRelationInsertRepository implements RelationInsertRepository {
|
public class SqlRelationInsertRepository extends AbstractRelationInsertRepository implements RelationInsertRepository {
|
||||||
|
|
||||||
private static final String INSERT_ON_CONFLICT_DO_UPDATE = "INSERT INTO relation (from_id, from_type, to_id, to_type, relation_type_group, relation_type, additional_info)" +
|
private static final String INSERT_ON_CONFLICT_DO_UPDATE = "INSERT INTO relation (from_id, from_type, to_id, to_type, relation_type_group, relation_type, additional_info)" +
|
||||||
" VALUES (:fromId, :fromType, :toId, :toType, :relationTypeGroup, :relationType, :additionalInfo) " +
|
" VALUES (:fromId, :fromType, :toId, :toType, :relationTypeGroup, :relationType, :additionalInfo) " +
|
||||||
@ -1,62 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2022 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.sqlts.hsql;
|
|
||||||
|
|
||||||
import com.google.common.util.concurrent.Futures;
|
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
|
||||||
import com.google.common.util.concurrent.MoreExecutors;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import org.thingsboard.server.common.data.id.EntityId;
|
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
|
||||||
import org.thingsboard.server.common.data.kv.TsKvEntry;
|
|
||||||
import org.thingsboard.server.dao.model.sqlts.ts.TsKvEntity;
|
|
||||||
import org.thingsboard.server.dao.sqlts.AbstractChunkedAggregationTimeseriesDao;
|
|
||||||
import org.thingsboard.server.dao.timeseries.TimeseriesDao;
|
|
||||||
import org.thingsboard.server.dao.util.HsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.SqlTsDao;
|
|
||||||
|
|
||||||
|
|
||||||
@Component
|
|
||||||
@Slf4j
|
|
||||||
@SqlTsDao
|
|
||||||
@HsqlDao
|
|
||||||
public class JpaHsqlTimeseriesDao extends AbstractChunkedAggregationTimeseriesDao implements TimeseriesDao {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ListenableFuture<Integer> save(TenantId tenantId, EntityId entityId, TsKvEntry tsKvEntry, long ttl) {
|
|
||||||
int dataPointDays = getDataPointDays(tsKvEntry, computeTtl(ttl));
|
|
||||||
String strKey = tsKvEntry.getKey();
|
|
||||||
Integer keyId = getOrSaveKeyId(strKey);
|
|
||||||
TsKvEntity entity = new TsKvEntity();
|
|
||||||
entity.setEntityId(entityId.getId());
|
|
||||||
entity.setTs(tsKvEntry.getTs());
|
|
||||||
entity.setKey(keyId);
|
|
||||||
entity.setStrValue(tsKvEntry.getStrValue().orElse(null));
|
|
||||||
entity.setDoubleValue(tsKvEntry.getDoubleValue().orElse(null));
|
|
||||||
entity.setLongValue(tsKvEntry.getLongValue().orElse(null));
|
|
||||||
entity.setBooleanValue(tsKvEntry.getBooleanValue().orElse(null));
|
|
||||||
entity.setJsonValue(tsKvEntry.getJsonValue().orElse(null));
|
|
||||||
log.trace("Saving entity: {}", entity);
|
|
||||||
return Futures.transform(tsQueue.add(entity), v -> dataPointDays, MoreExecutors.directExecutor());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void cleanup(long systemTtl) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,87 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2022 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.sqlts.insert.hsql;
|
|
||||||
|
|
||||||
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
import org.thingsboard.server.dao.model.sqlts.ts.TsKvEntity;
|
|
||||||
import org.thingsboard.server.dao.sqlts.insert.AbstractInsertRepository;
|
|
||||||
import org.thingsboard.server.dao.sqlts.insert.InsertTsRepository;
|
|
||||||
import org.thingsboard.server.dao.util.HsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.SqlTsDao;
|
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.sql.Types;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@SqlTsDao
|
|
||||||
@HsqlDao
|
|
||||||
@Repository
|
|
||||||
@Transactional
|
|
||||||
public class HsqlInsertTsRepository extends AbstractInsertRepository implements InsertTsRepository<TsKvEntity> {
|
|
||||||
|
|
||||||
private static final String INSERT_OR_UPDATE =
|
|
||||||
"MERGE INTO ts_kv USING(VALUES ?, ?, ?, ?, ?, ?, ?, ?) " +
|
|
||||||
"T (entity_id, key, ts, bool_v, str_v, long_v, dbl_v, json_v) " +
|
|
||||||
"ON (ts_kv.entity_id=T.entity_id " +
|
|
||||||
"AND ts_kv.key=T.key " +
|
|
||||||
"AND ts_kv.ts=T.ts) " +
|
|
||||||
"WHEN MATCHED THEN UPDATE SET ts_kv.bool_v = T.bool_v, ts_kv.str_v = T.str_v, ts_kv.long_v = T.long_v, ts_kv.dbl_v = T.dbl_v ,ts_kv.json_v = T.json_v " +
|
|
||||||
"WHEN NOT MATCHED THEN INSERT (entity_id, key, ts, bool_v, str_v, long_v, dbl_v, json_v) " +
|
|
||||||
"VALUES (T.entity_id, T.key, T.ts, T.bool_v, T.str_v, T.long_v, T.dbl_v, T.json_v);";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void saveOrUpdate(List<TsKvEntity> entities) {
|
|
||||||
jdbcTemplate.batchUpdate(INSERT_OR_UPDATE, new BatchPreparedStatementSetter() {
|
|
||||||
@Override
|
|
||||||
public void setValues(PreparedStatement ps, int i) throws SQLException {
|
|
||||||
TsKvEntity tsKvEntity = entities.get(i);
|
|
||||||
ps.setObject(1, tsKvEntity.getEntityId());
|
|
||||||
ps.setInt(2, tsKvEntity.getKey());
|
|
||||||
ps.setLong(3, tsKvEntity.getTs());
|
|
||||||
|
|
||||||
if (tsKvEntity.getBooleanValue() != null) {
|
|
||||||
ps.setBoolean(4, tsKvEntity.getBooleanValue());
|
|
||||||
} else {
|
|
||||||
ps.setNull(4, Types.BOOLEAN);
|
|
||||||
}
|
|
||||||
|
|
||||||
ps.setString(5, tsKvEntity.getStrValue());
|
|
||||||
|
|
||||||
if (tsKvEntity.getLongValue() != null) {
|
|
||||||
ps.setLong(6, tsKvEntity.getLongValue());
|
|
||||||
} else {
|
|
||||||
ps.setNull(6, Types.BIGINT);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tsKvEntity.getDoubleValue() != null) {
|
|
||||||
ps.setDouble(7, tsKvEntity.getDoubleValue());
|
|
||||||
} else {
|
|
||||||
ps.setNull(7, Types.DOUBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
ps.setString(8, tsKvEntity.getJsonValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getBatchSize() {
|
|
||||||
return entities.size();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,85 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2022 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.sqlts.insert.latest.hsql;
|
|
||||||
|
|
||||||
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
import org.thingsboard.server.dao.model.sqlts.latest.TsKvLatestEntity;
|
|
||||||
import org.thingsboard.server.dao.sqlts.insert.AbstractInsertRepository;
|
|
||||||
import org.thingsboard.server.dao.sqlts.insert.latest.InsertLatestTsRepository;
|
|
||||||
import org.thingsboard.server.dao.util.HsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.SqlTsLatestDao;
|
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.sql.Types;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@SqlTsLatestDao
|
|
||||||
@HsqlDao
|
|
||||||
@Repository
|
|
||||||
@Transactional
|
|
||||||
public class HsqlLatestInsertTsRepository extends AbstractInsertRepository implements InsertLatestTsRepository {
|
|
||||||
|
|
||||||
private static final String INSERT_OR_UPDATE =
|
|
||||||
"MERGE INTO ts_kv_latest USING(VALUES ?, ?, ?, ?, ?, ?, ?, ?) " +
|
|
||||||
"T (entity_id, key, ts, bool_v, str_v, long_v, dbl_v, json_v) " +
|
|
||||||
"ON (ts_kv_latest.entity_id=T.entity_id " +
|
|
||||||
"AND ts_kv_latest.key=T.key) " +
|
|
||||||
"WHEN MATCHED THEN UPDATE SET ts_kv_latest.ts = T.ts, ts_kv_latest.bool_v = T.bool_v, ts_kv_latest.str_v = T.str_v, ts_kv_latest.long_v = T.long_v, ts_kv_latest.dbl_v = T.dbl_v, ts_kv_latest.json_v = T.json_v " +
|
|
||||||
"WHEN NOT MATCHED THEN INSERT (entity_id, key, ts, bool_v, str_v, long_v, dbl_v, json_v) " +
|
|
||||||
"VALUES (T.entity_id, T.key, T.ts, T.bool_v, T.str_v, T.long_v, T.dbl_v, T.json_v);";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void saveOrUpdate(List<TsKvLatestEntity> entities) {
|
|
||||||
jdbcTemplate.batchUpdate(INSERT_OR_UPDATE, new BatchPreparedStatementSetter() {
|
|
||||||
@Override
|
|
||||||
public void setValues(PreparedStatement ps, int i) throws SQLException {
|
|
||||||
ps.setObject(1, entities.get(i).getEntityId());
|
|
||||||
ps.setInt(2, entities.get(i).getKey());
|
|
||||||
ps.setLong(3, entities.get(i).getTs());
|
|
||||||
|
|
||||||
if (entities.get(i).getBooleanValue() != null) {
|
|
||||||
ps.setBoolean(4, entities.get(i).getBooleanValue());
|
|
||||||
} else {
|
|
||||||
ps.setNull(4, Types.BOOLEAN);
|
|
||||||
}
|
|
||||||
|
|
||||||
ps.setString(5, entities.get(i).getStrValue());
|
|
||||||
|
|
||||||
if (entities.get(i).getLongValue() != null) {
|
|
||||||
ps.setLong(6, entities.get(i).getLongValue());
|
|
||||||
} else {
|
|
||||||
ps.setNull(6, Types.BIGINT);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (entities.get(i).getDoubleValue() != null) {
|
|
||||||
ps.setDouble(7, entities.get(i).getDoubleValue());
|
|
||||||
} else {
|
|
||||||
ps.setNull(7, Types.DOUBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
ps.setString(8, entities.get(i).getJsonValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getBatchSize() {
|
|
||||||
return entities.size();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -13,7 +13,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.thingsboard.server.dao.sqlts.insert.latest.psql;
|
package org.thingsboard.server.dao.sqlts.insert.latest.sql;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
|
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
|
||||||
@ -24,7 +24,7 @@ import org.springframework.transaction.support.TransactionCallbackWithoutResult;
|
|||||||
import org.thingsboard.server.dao.model.sqlts.latest.TsKvLatestEntity;
|
import org.thingsboard.server.dao.model.sqlts.latest.TsKvLatestEntity;
|
||||||
import org.thingsboard.server.dao.sqlts.insert.AbstractInsertRepository;
|
import org.thingsboard.server.dao.sqlts.insert.AbstractInsertRepository;
|
||||||
import org.thingsboard.server.dao.sqlts.insert.latest.InsertLatestTsRepository;
|
import org.thingsboard.server.dao.sqlts.insert.latest.InsertLatestTsRepository;
|
||||||
import org.thingsboard.server.dao.util.PsqlTsLatestAnyDao;
|
import org.thingsboard.server.dao.util.SqlTsLatestAnyDao;
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
@ -33,10 +33,10 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
@PsqlTsLatestAnyDao
|
@SqlTsLatestAnyDao
|
||||||
@Repository
|
@Repository
|
||||||
@Transactional
|
@Transactional
|
||||||
public class PsqlLatestInsertTsRepository extends AbstractInsertRepository implements InsertLatestTsRepository {
|
public class SqlLatestInsertTsRepository extends AbstractInsertRepository implements InsertLatestTsRepository {
|
||||||
|
|
||||||
@Value("${sql.ts_latest.update_by_latest_ts:true}")
|
@Value("${sql.ts_latest.update_by_latest_ts:true}")
|
||||||
private Boolean updateByLatestTs;
|
private Boolean updateByLatestTs;
|
||||||
@ -13,7 +13,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.thingsboard.server.dao.sqlts.insert.psql;
|
package org.thingsboard.server.dao.sqlts.insert.sql;
|
||||||
|
|
||||||
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
|
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
@ -21,7 +21,6 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
import org.thingsboard.server.dao.model.sqlts.ts.TsKvEntity;
|
import org.thingsboard.server.dao.model.sqlts.ts.TsKvEntity;
|
||||||
import org.thingsboard.server.dao.sqlts.insert.AbstractInsertRepository;
|
import org.thingsboard.server.dao.sqlts.insert.AbstractInsertRepository;
|
||||||
import org.thingsboard.server.dao.sqlts.insert.InsertTsRepository;
|
import org.thingsboard.server.dao.sqlts.insert.InsertTsRepository;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.SqlTsDao;
|
import org.thingsboard.server.dao.util.SqlTsDao;
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
@ -30,10 +29,9 @@ import java.sql.Types;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@SqlTsDao
|
@SqlTsDao
|
||||||
@PsqlDao
|
|
||||||
@Repository
|
@Repository
|
||||||
@Transactional
|
@Transactional
|
||||||
public class PsqlInsertTsRepository extends AbstractInsertRepository implements InsertTsRepository<TsKvEntity> {
|
public class SqlInsertTsRepository extends AbstractInsertRepository implements InsertTsRepository<TsKvEntity> {
|
||||||
|
|
||||||
private static final String INSERT_ON_CONFLICT_DO_UPDATE = "INSERT INTO ts_kv (entity_id, key, ts, bool_v, str_v, long_v, dbl_v, json_v) VALUES (?, ?, ?, ?, ?, ?, ?, cast(? AS json)) " +
|
private static final String INSERT_ON_CONFLICT_DO_UPDATE = "INSERT INTO ts_kv (entity_id, key, ts, bool_v, str_v, long_v, dbl_v, json_v) VALUES (?, ?, ?, ?, ?, ?, ?, cast(? AS json)) " +
|
||||||
"ON CONFLICT (entity_id, key, ts) DO UPDATE SET bool_v = ?, str_v = ?, long_v = ?, dbl_v = ?, json_v = cast(? AS json);";
|
"ON CONFLICT (entity_id, key, ts) DO UPDATE SET bool_v = ?, str_v = ?, long_v = ?, dbl_v = ?, json_v = cast(? AS json);";
|
||||||
@ -13,27 +13,25 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.thingsboard.server.dao.sqlts.insert.psql;
|
package org.thingsboard.server.dao.sqlts.insert.sql;
|
||||||
|
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.thingsboard.server.dao.timeseries.PsqlPartition;
|
import org.thingsboard.server.dao.timeseries.SqlPartition;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.SqlTsDao;
|
import org.thingsboard.server.dao.util.SqlTsDao;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import javax.persistence.EntityManager;
|
||||||
import javax.persistence.PersistenceContext;
|
import javax.persistence.PersistenceContext;
|
||||||
|
|
||||||
@SqlTsDao
|
@SqlTsDao
|
||||||
@PsqlDao
|
|
||||||
@Repository
|
@Repository
|
||||||
@Transactional
|
@Transactional
|
||||||
public class PsqlPartitioningRepository {
|
public class SqlPartitioningRepository {
|
||||||
|
|
||||||
@PersistenceContext
|
@PersistenceContext
|
||||||
private EntityManager entityManager;
|
private EntityManager entityManager;
|
||||||
|
|
||||||
public void save(PsqlPartition partition) {
|
public void save(SqlPartition partition) {
|
||||||
entityManager.createNativeQuery(partition.getQuery())
|
entityManager.createNativeQuery(partition.getQuery())
|
||||||
.executeUpdate();
|
.executeUpdate();
|
||||||
}
|
}
|
||||||
@ -21,7 +21,6 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
import org.thingsboard.server.dao.model.sqlts.timescale.ts.TimescaleTsKvEntity;
|
import org.thingsboard.server.dao.model.sqlts.timescale.ts.TimescaleTsKvEntity;
|
||||||
import org.thingsboard.server.dao.sqlts.insert.AbstractInsertRepository;
|
import org.thingsboard.server.dao.sqlts.insert.AbstractInsertRepository;
|
||||||
import org.thingsboard.server.dao.sqlts.insert.InsertTsRepository;
|
import org.thingsboard.server.dao.sqlts.insert.InsertTsRepository;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.TimescaleDBTsDao;
|
import org.thingsboard.server.dao.util.TimescaleDBTsDao;
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
@ -30,7 +29,6 @@ import java.sql.Types;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@TimescaleDBTsDao
|
@TimescaleDBTsDao
|
||||||
@PsqlDao
|
|
||||||
@Repository
|
@Repository
|
||||||
@Transactional
|
@Transactional
|
||||||
public class TimescaleInsertTsRepository extends AbstractInsertRepository implements InsertTsRepository<TimescaleTsKvEntity> {
|
public class TimescaleInsertTsRepository extends AbstractInsertRepository implements InsertTsRepository<TimescaleTsKvEntity> {
|
||||||
|
|||||||
@ -13,7 +13,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.thingsboard.server.dao.sqlts.psql;
|
package org.thingsboard.server.dao.sqlts.sql;
|
||||||
|
|
||||||
import com.google.common.util.concurrent.Futures;
|
import com.google.common.util.concurrent.Futures;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
@ -29,10 +29,9 @@ import org.thingsboard.server.common.data.id.TenantId;
|
|||||||
import org.thingsboard.server.common.data.kv.TsKvEntry;
|
import org.thingsboard.server.common.data.kv.TsKvEntry;
|
||||||
import org.thingsboard.server.dao.model.sqlts.ts.TsKvEntity;
|
import org.thingsboard.server.dao.model.sqlts.ts.TsKvEntity;
|
||||||
import org.thingsboard.server.dao.sqlts.AbstractChunkedAggregationTimeseriesDao;
|
import org.thingsboard.server.dao.sqlts.AbstractChunkedAggregationTimeseriesDao;
|
||||||
import org.thingsboard.server.dao.sqlts.insert.psql.PsqlPartitioningRepository;
|
import org.thingsboard.server.dao.sqlts.insert.sql.SqlPartitioningRepository;
|
||||||
import org.thingsboard.server.dao.timeseries.PsqlPartition;
|
import org.thingsboard.server.dao.timeseries.SqlPartition;
|
||||||
import org.thingsboard.server.dao.timeseries.SqlTsPartitionDate;
|
import org.thingsboard.server.dao.timeseries.SqlTsPartitionDate;
|
||||||
import org.thingsboard.server.dao.util.PsqlDao;
|
|
||||||
import org.thingsboard.server.dao.util.SqlTsDao;
|
import org.thingsboard.server.dao.util.SqlTsDao;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
@ -52,15 +51,14 @@ import java.util.concurrent.locks.ReentrantLock;
|
|||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@PsqlDao
|
|
||||||
@SqlTsDao
|
@SqlTsDao
|
||||||
public class JpaPsqlTimeseriesDao extends AbstractChunkedAggregationTimeseriesDao {
|
public class JpaSqlTimeseriesDao extends AbstractChunkedAggregationTimeseriesDao {
|
||||||
|
|
||||||
private final Map<Long, PsqlPartition> partitions = new ConcurrentHashMap<>();
|
private final Map<Long, SqlPartition> partitions = new ConcurrentHashMap<>();
|
||||||
private static final ReentrantLock partitionCreationLock = new ReentrantLock();
|
private static final ReentrantLock partitionCreationLock = new ReentrantLock();
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private PsqlPartitioningRepository partitioningRepository;
|
private SqlPartitioningRepository partitioningRepository;
|
||||||
|
|
||||||
private SqlTsPartitionDate tsFormat;
|
private SqlTsPartitionDate tsFormat;
|
||||||
|
|
||||||
@ -134,24 +132,24 @@ public class JpaPsqlTimeseriesDao extends AbstractChunkedAggregationTimeseriesDa
|
|||||||
long partitionEndTs = toMills(localDateTimeEnd);
|
long partitionEndTs = toMills(localDateTimeEnd);
|
||||||
ZonedDateTime zonedDateTime = localDateTimeStart.atZone(ZoneOffset.UTC);
|
ZonedDateTime zonedDateTime = localDateTimeStart.atZone(ZoneOffset.UTC);
|
||||||
String partitionDate = zonedDateTime.format(DateTimeFormatter.ofPattern(tsFormat.getPattern()));
|
String partitionDate = zonedDateTime.format(DateTimeFormatter.ofPattern(tsFormat.getPattern()));
|
||||||
savePartition(new PsqlPartition(partitionStartTs, partitionEndTs, partitionDate));
|
savePartition(new SqlPartition(partitionStartTs, partitionEndTs, partitionDate));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void savePartition(PsqlPartition psqlPartition) {
|
private void savePartition(SqlPartition sqlPartition) {
|
||||||
if (!partitions.containsKey(psqlPartition.getStart())) {
|
if (!partitions.containsKey(sqlPartition.getStart())) {
|
||||||
partitionCreationLock.lock();
|
partitionCreationLock.lock();
|
||||||
try {
|
try {
|
||||||
log.trace("Saving partition: {}", psqlPartition);
|
log.trace("Saving partition: {}", sqlPartition);
|
||||||
partitioningRepository.save(psqlPartition);
|
partitioningRepository.save(sqlPartition);
|
||||||
log.trace("Adding partition to Set: {}", psqlPartition);
|
log.trace("Adding partition to Set: {}", sqlPartition);
|
||||||
partitions.put(psqlPartition.getStart(), psqlPartition);
|
partitions.put(sqlPartition.getStart(), sqlPartition);
|
||||||
} catch (DataIntegrityViolationException ex) {
|
} catch (DataIntegrityViolationException ex) {
|
||||||
log.trace("Error occurred during partition save:", ex);
|
log.trace("Error occurred during partition save:", ex);
|
||||||
if (ex.getCause() instanceof ConstraintViolationException) {
|
if (ex.getCause() instanceof ConstraintViolationException) {
|
||||||
log.warn("Saving partition [{}] rejected. Timeseries data will save to the ts_kv_indefinite (DEFAULT) partition.", psqlPartition.getPartitionDate());
|
log.warn("Saving partition [{}] rejected. Timeseries data will save to the ts_kv_indefinite (DEFAULT) partition.", sqlPartition.getPartitionDate());
|
||||||
partitions.put(psqlPartition.getStart(), psqlPartition);
|
partitions.put(sqlPartition.getStart(), sqlPartition);
|
||||||
} else {
|
} else {
|
||||||
throw new RuntimeException(ex);
|
throw new RuntimeException(ex);
|
||||||
}
|
}
|
||||||
@ -18,7 +18,7 @@ package org.thingsboard.server.dao.timeseries;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class PsqlPartition {
|
public class SqlPartition {
|
||||||
|
|
||||||
private static final String TABLE_REGEX = "ts_kv_";
|
private static final String TABLE_REGEX = "ts_kv_";
|
||||||
|
|
||||||
@ -27,7 +27,7 @@ public class PsqlPartition {
|
|||||||
private String partitionDate;
|
private String partitionDate;
|
||||||
private String query;
|
private String query;
|
||||||
|
|
||||||
public PsqlPartition(long start, long end, String partitionDate) {
|
public SqlPartition(long start, long end, String partitionDate) {
|
||||||
this.start = start;
|
this.start = start;
|
||||||
this.end = end;
|
this.end = end;
|
||||||
this.partitionDate = partitionDate;
|
this.partitionDate = partitionDate;
|
||||||
@ -28,7 +28,7 @@ import org.thingsboard.server.common.stats.StatsFactory;
|
|||||||
import org.thingsboard.server.dao.service.DaoSqlTest;
|
import org.thingsboard.server.dao.service.DaoSqlTest;
|
||||||
|
|
||||||
@RunWith(SpringRunner.class)
|
@RunWith(SpringRunner.class)
|
||||||
@ContextConfiguration(classes = {JpaDaoConfig.class, PsqlTsDaoConfig.class, PsqlTsLatestDaoConfig.class, SqlTimeseriesDaoConfig.class})
|
@ContextConfiguration(classes = {JpaDaoConfig.class, SqlTsDaoConfig.class, SqlTsLatestDaoConfig.class, SqlTimeseriesDaoConfig.class})
|
||||||
@DaoSqlTest
|
@DaoSqlTest
|
||||||
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
|
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
|
||||||
@TestExecutionListeners({
|
@TestExecutionListeners({
|
||||||
|
|||||||
@ -30,7 +30,7 @@ import org.thingsboard.server.dao.service.DaoSqlTest;
|
|||||||
* Created by Valerii Sosliuk on 4/22/2017.
|
* Created by Valerii Sosliuk on 4/22/2017.
|
||||||
*/
|
*/
|
||||||
@RunWith(SpringRunner.class)
|
@RunWith(SpringRunner.class)
|
||||||
@ContextConfiguration(classes = {JpaDaoConfig.class, PsqlTsDaoConfig.class, PsqlTsLatestDaoConfig.class, SqlTimeseriesDaoConfig.class})
|
@ContextConfiguration(classes = {JpaDaoConfig.class, SqlTsDaoConfig.class, SqlTsLatestDaoConfig.class, SqlTimeseriesDaoConfig.class})
|
||||||
@DaoSqlTest
|
@DaoSqlTest
|
||||||
@TestExecutionListeners({
|
@TestExecutionListeners({
|
||||||
DependencyInjectionTestExecutionListener.class,
|
DependencyInjectionTestExecutionListener.class,
|
||||||
|
|||||||
@ -1,40 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2022 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.jdbc.core.JdbcTemplate;
|
|
||||||
|
|
||||||
import java.sql.DriverManager;
|
|
||||||
|
|
||||||
public class DaoTestUtil {
|
|
||||||
private static final String POSTGRES_DRIVER_CLASS = "org.postgresql.Driver";
|
|
||||||
private static final String H2_DRIVER_CLASS = "org.hsqldb.jdbc.JDBCDriver";
|
|
||||||
|
|
||||||
|
|
||||||
public static SqlDbType getSqlDbType(JdbcTemplate template){
|
|
||||||
try {
|
|
||||||
String driverName = DriverManager.getDriver(template.getDataSource().getConnection().getMetaData().getURL()).getClass().getName();
|
|
||||||
if (POSTGRES_DRIVER_CLASS.equals(driverName)) {
|
|
||||||
return SqlDbType.POSTGRES;
|
|
||||||
} else if (H2_DRIVER_CLASS.equals(driverName)) {
|
|
||||||
return SqlDbType.H2;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2022 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;
|
|
||||||
|
|
||||||
public enum SqlDbType {
|
|
||||||
POSTGRES, H2;
|
|
||||||
}
|
|
||||||
@ -11,7 +11,6 @@ spring.jpa.properties.hibernate.jdbc.log.warnings=false
|
|||||||
spring.jpa.show-sql=false
|
spring.jpa.show-sql=false
|
||||||
|
|
||||||
spring.jpa.hibernate.ddl-auto=none
|
spring.jpa.hibernate.ddl-auto=none
|
||||||
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL10Dialect
|
|
||||||
spring.datasource.username=postgres
|
spring.datasource.username=postgres
|
||||||
spring.datasource.password=postgres
|
spring.datasource.password=postgres
|
||||||
spring.datasource.url=jdbc:tc:postgresql:12.8:///thingsboard?TC_DAEMON=true&TC_TMPFS=/testtmpfs:rw&?TC_INITFUNCTION=org.thingsboard.server.dao.PostgreSqlInitializer::initDb
|
spring.datasource.url=jdbc:tc:postgresql:12.8:///thingsboard?TC_DAEMON=true&TC_TMPFS=/testtmpfs:rw&?TC_INITFUNCTION=org.thingsboard.server.dao.PostgreSqlInitializer::initDb
|
||||||
|
|||||||
@ -12,7 +12,6 @@ spring.jpa.properties.hibernate.jdbc.log.warnings=false
|
|||||||
spring.jpa.show-sql=false
|
spring.jpa.show-sql=false
|
||||||
|
|
||||||
spring.jpa.hibernate.ddl-auto=none
|
spring.jpa.hibernate.ddl-auto=none
|
||||||
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL10Dialect
|
|
||||||
spring.datasource.username=postgres
|
spring.datasource.username=postgres
|
||||||
spring.datasource.password=postgres
|
spring.datasource.password=postgres
|
||||||
spring.datasource.url=jdbc:tc:postgresql:12.8:///thingsboard?TC_DAEMON=true&TC_TMPFS=/testtmpfs:rw&?TC_INITFUNCTION=org.thingsboard.server.dao.PostgreSqlInitializer::initDb
|
spring.datasource.url=jdbc:tc:postgresql:12.8:///thingsboard?TC_DAEMON=true&TC_TMPFS=/testtmpfs:rw&?TC_INITFUNCTION=org.thingsboard.server.dao.PostgreSqlInitializer::initDb
|
||||||
@ -32,7 +31,6 @@ service.type=monolith
|
|||||||
#spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
|
#spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
|
||||||
#spring.jpa.show-sql=false
|
#spring.jpa.show-sql=false
|
||||||
#spring.jpa.hibernate.ddl-auto=none
|
#spring.jpa.hibernate.ddl-auto=none
|
||||||
#spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL10Dialect
|
|
||||||
#
|
#
|
||||||
#spring.datasource.username=postgres
|
#spring.datasource.username=postgres
|
||||||
#spring.datasource.password=postgres
|
#spring.datasource.password=postgres
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
DATABASE_TS_TYPE=cassandra
|
DATABASE_TS_TYPE=cassandra
|
||||||
CASSANDRA_URL=cassandra:9042
|
CASSANDRA_URL=cassandra:9042
|
||||||
SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.PostgreSQL10Dialect
|
|
||||||
SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver
|
SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver
|
||||||
SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/thingsboard
|
SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/thingsboard
|
||||||
SPRING_DATASOURCE_USERNAME=postgres
|
SPRING_DATASOURCE_USERNAME=postgres
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
# ThingsBoard server configuration for PostgreSQL database
|
# ThingsBoard server configuration for PostgreSQL database
|
||||||
|
|
||||||
DATABASE_TS_TYPE=sql
|
DATABASE_TS_TYPE=sql
|
||||||
SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.PostgreSQL10Dialect
|
|
||||||
SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver
|
SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver
|
||||||
SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/thingsboard
|
SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/thingsboard
|
||||||
SPRING_DATASOURCE_USERNAME=postgres
|
SPRING_DATASOURCE_USERNAME=postgres
|
||||||
|
|||||||
@ -54,7 +54,6 @@ ENV DATABASE_TS_TYPE=cassandra
|
|||||||
ENV PGDATA=/data/db
|
ENV PGDATA=/data/db
|
||||||
ENV CASSANDRA_DATA=/data/cassandra
|
ENV CASSANDRA_DATA=/data/cassandra
|
||||||
|
|
||||||
ENV SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.PostgreSQL10Dialect
|
|
||||||
ENV SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver
|
ENV SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver
|
||||||
ENV SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/thingsboard
|
ENV SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/thingsboard
|
||||||
ENV SPRING_DATASOURCE_USERNAME=${pkg.user}
|
ENV SPRING_DATASOURCE_USERNAME=${pkg.user}
|
||||||
|
|||||||
@ -50,7 +50,6 @@ ENV DATABASE_TS_TYPE=sql
|
|||||||
ENV PGDATA=/data/db
|
ENV PGDATA=/data/db
|
||||||
ENV PATH=$PATH:/usr/lib/postgresql/$PG_MAJOR/bin
|
ENV PATH=$PATH:/usr/lib/postgresql/$PG_MAJOR/bin
|
||||||
|
|
||||||
ENV SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.PostgreSQL10Dialect
|
|
||||||
ENV SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver
|
ENV SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver
|
||||||
ENV SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/thingsboard
|
ENV SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/thingsboard
|
||||||
ENV SPRING_DATASOURCE_USERNAME=${pkg.user}
|
ENV SPRING_DATASOURCE_USERNAME=${pkg.user}
|
||||||
|
|||||||
@ -1,61 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright © 2016-2022 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.
|
|
||||||
#
|
|
||||||
|
|
||||||
FROM thingsboard/openjdk11
|
|
||||||
|
|
||||||
COPY logback.xml ${pkg.name}.conf start-db.sh stop-db.sh start-tb.sh upgrade-tb.sh install-tb.sh ${pkg.name}.deb /tmp/
|
|
||||||
|
|
||||||
RUN chmod a+x /tmp/*.sh \
|
|
||||||
&& mv /tmp/start-tb.sh /usr/bin \
|
|
||||||
&& mv /tmp/upgrade-tb.sh /usr/bin \
|
|
||||||
&& mv /tmp/install-tb.sh /usr/bin \
|
|
||||||
&& mv /tmp/start-db.sh /usr/bin \
|
|
||||||
&& mv /tmp/stop-db.sh /usr/bin
|
|
||||||
|
|
||||||
RUN dpkg -i /tmp/${pkg.name}.deb
|
|
||||||
RUN rm /tmp/${pkg.name}.deb
|
|
||||||
|
|
||||||
RUN systemctl --no-reload disable --now ${pkg.name}.service > /dev/null 2>&1 || :
|
|
||||||
|
|
||||||
RUN mv /tmp/logback.xml ${pkg.installFolder}/conf \
|
|
||||||
&& mv /tmp/${pkg.name}.conf ${pkg.installFolder}/conf
|
|
||||||
|
|
||||||
ENV DATA_FOLDER=/data
|
|
||||||
|
|
||||||
ENV HTTP_BIND_PORT=9090
|
|
||||||
ENV DATABASE_TS_TYPE=sql
|
|
||||||
|
|
||||||
ENV SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.HSQLDialect
|
|
||||||
ENV SPRING_DRIVER_CLASS_NAME=org.hsqldb.jdbc.JDBCDriver
|
|
||||||
ENV SPRING_DATASOURCE_URL=jdbc:hsqldb:file:/data/db/thingsboardDb;sql.enforce_size=false;hsqldb.log_size=5
|
|
||||||
ENV SPRING_DATASOURCE_USERNAME=sa
|
|
||||||
ENV SPRING_DATASOURCE_PASSWORD=
|
|
||||||
|
|
||||||
RUN mkdir -p /data
|
|
||||||
RUN chown -R ${pkg.user}:${pkg.user} /data
|
|
||||||
|
|
||||||
RUN chmod 555 ${pkg.installFolder}/bin/${pkg.name}.jar
|
|
||||||
|
|
||||||
USER ${pkg.user}
|
|
||||||
|
|
||||||
EXPOSE 9090
|
|
||||||
EXPOSE 1883
|
|
||||||
EXPOSE 5683/udp
|
|
||||||
EXPOSE 5685/udp
|
|
||||||
|
|
||||||
VOLUME ["/data"]
|
|
||||||
|
|
||||||
CMD ["start-tb.sh"]
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# Copyright © 2016-2022 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.
|
|
||||||
#
|
|
||||||
|
|
||||||
# Do nothing
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# Copyright © 2016-2022 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.
|
|
||||||
#
|
|
||||||
|
|
||||||
# Do nothing
|
|
||||||
132
msa/tb/pom.xml
132
msa/tb/pom.xml
@ -35,7 +35,6 @@
|
|||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<main.dir>${basedir}/../..</main.dir>
|
<main.dir>${basedir}/../..</main.dir>
|
||||||
<pkg.name>thingsboard</pkg.name>
|
<pkg.name>thingsboard</pkg.name>
|
||||||
<tb.docker.name>tb</tb.docker.name>
|
|
||||||
<tb-postgres.docker.name>tb-postgres</tb-postgres.docker.name>
|
<tb-postgres.docker.name>tb-postgres</tb-postgres.docker.name>
|
||||||
<tb-cassandra.docker.name>tb-cassandra</tb-cassandra.docker.name>
|
<tb-cassandra.docker.name>tb-cassandra</tb-cassandra.docker.name>
|
||||||
<pkg.installFolder>/usr/share/${pkg.name}</pkg.installFolder>
|
<pkg.installFolder>/usr/share/${pkg.name}</pkg.installFolder>
|
||||||
@ -59,25 +58,6 @@
|
|||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-dependency-plugin</artifactId>
|
<artifactId>maven-dependency-plugin</artifactId>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
|
||||||
<id>copy-tb-deb</id>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>copy</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<artifactItems>
|
|
||||||
<artifactItem>
|
|
||||||
<groupId>org.thingsboard</groupId>
|
|
||||||
<artifactId>application</artifactId>
|
|
||||||
<classifier>deb</classifier>
|
|
||||||
<type>deb</type>
|
|
||||||
<destFileName>${pkg.name}.deb</destFileName>
|
|
||||||
<outputDirectory>${project.build.directory}/docker-tb</outputDirectory>
|
|
||||||
</artifactItem>
|
|
||||||
</artifactItems>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
<execution>
|
||||||
<id>copy-tb-postgres-deb</id>
|
<id>copy-tb-postgres-deb</id>
|
||||||
<phase>package</phase>
|
<phase>package</phase>
|
||||||
@ -122,27 +102,7 @@
|
|||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-resources-plugin</artifactId>
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<id>copy-docker-tb-config</id>
|
|
||||||
<phase>process-resources</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>copy-resources</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<outputDirectory>${project.build.directory}/docker-tb</outputDirectory>
|
|
||||||
<resources>
|
|
||||||
<resource>
|
|
||||||
<directory>docker</directory>
|
|
||||||
<filtering>true</filtering>
|
|
||||||
</resource>
|
|
||||||
<resource>
|
|
||||||
<directory>docker-tb</directory>
|
|
||||||
<filtering>true</filtering>
|
|
||||||
</resource>
|
|
||||||
</resources>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>copy-docker-tb-postgres-config</id>
|
<id>copy-docker-tb-postgres-config</id>
|
||||||
<phase>process-resources</phase>
|
<phase>process-resources</phase>
|
||||||
<goals>
|
<goals>
|
||||||
@ -188,32 +148,6 @@
|
|||||||
<groupId>com.spotify</groupId>
|
<groupId>com.spotify</groupId>
|
||||||
<artifactId>dockerfile-maven-plugin</artifactId>
|
<artifactId>dockerfile-maven-plugin</artifactId>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
|
||||||
<id>build-docker-tb-image</id>
|
|
||||||
<phase>pre-integration-test</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>build</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<skip>${dockerfile.skip}</skip>
|
|
||||||
<repository>${docker.repo}/${tb.docker.name}</repository>
|
|
||||||
<verbose>true</verbose>
|
|
||||||
<googleContainerRegistryEnabled>false</googleContainerRegistryEnabled>
|
|
||||||
<contextDirectory>${project.build.directory}/docker-tb</contextDirectory>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>tag-docker-tb-image</id>
|
|
||||||
<phase>pre-integration-test</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>tag</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<skip>${dockerfile.skip}</skip>
|
|
||||||
<repository>${docker.repo}/${tb.docker.name}</repository>
|
|
||||||
<tag>${project.version}</tag>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
<execution>
|
||||||
<id>build-docker-tb-postgres-image</id>
|
<id>build-docker-tb-postgres-image</id>
|
||||||
<phase>pre-integration-test</phase>
|
<phase>pre-integration-test</phase>
|
||||||
@ -284,28 +218,6 @@
|
|||||||
<groupId>com.spotify</groupId>
|
<groupId>com.spotify</groupId>
|
||||||
<artifactId>dockerfile-maven-plugin</artifactId>
|
<artifactId>dockerfile-maven-plugin</artifactId>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
|
||||||
<id>push-latest-docker-tb-image</id>
|
|
||||||
<phase>pre-integration-test</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>push</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<tag>latest</tag>
|
|
||||||
<repository>${docker.repo}/${tb.docker.name}</repository>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>push-version-docker-tb-image</id>
|
|
||||||
<phase>pre-integration-test</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>push</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<tag>${project.version}</tag>
|
|
||||||
<repository>${docker.repo}/${tb.docker.name}</repository>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
<execution>
|
||||||
<id>push-latest-docker-tb-postgres-image</id>
|
<id>push-latest-docker-tb-postgres-image</id>
|
||||||
<phase>pre-integration-test</phase>
|
<phase>pre-integration-test</phase>
|
||||||
@ -368,48 +280,6 @@
|
|||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
<artifactId>exec-maven-plugin</artifactId>
|
<artifactId>exec-maven-plugin</artifactId>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
|
||||||
<id>push-latest-docker-amd-arm-tb-images</id>
|
|
||||||
<phase>pre-integration-test</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>exec</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<executable>docker</executable>
|
|
||||||
<workingDirectory>${project.build.directory}/docker-tb</workingDirectory>
|
|
||||||
<arguments>
|
|
||||||
<argument>buildx</argument>
|
|
||||||
<argument>build</argument>
|
|
||||||
<argument>-t</argument>
|
|
||||||
<argument>${docker.repo}/${tb.docker.name}:latest</argument>
|
|
||||||
<argument>--platform=linux/amd64,linux/arm64</argument>
|
|
||||||
<argument>-o</argument>
|
|
||||||
<argument>type=registry</argument>
|
|
||||||
<argument>.</argument>
|
|
||||||
</arguments>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>push-version-docker-amd-arm-tb-images</id>
|
|
||||||
<phase>pre-integration-test</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>exec</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<executable>docker</executable>
|
|
||||||
<workingDirectory>${project.build.directory}/docker-tb</workingDirectory>
|
|
||||||
<arguments>
|
|
||||||
<argument>buildx</argument>
|
|
||||||
<argument>build</argument>
|
|
||||||
<argument>-t</argument>
|
|
||||||
<argument>${docker.repo}/${tb.docker.name}:${project.version}</argument>
|
|
||||||
<argument>--platform=linux/amd64,linux/arm64</argument>
|
|
||||||
<argument>-o</argument>
|
|
||||||
<argument>type=registry</argument>
|
|
||||||
<argument>.</argument>
|
|
||||||
</arguments>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
<execution>
|
||||||
<id>push-latest-docker-amd-arm-tb-postgres-images</id>
|
<id>push-latest-docker-amd-arm-tb-postgres-images</id>
|
||||||
<phase>pre-integration-test</phase>
|
<phase>pre-integration-test</phase>
|
||||||
|
|||||||
6
pom.xml
6
pom.xml
@ -125,7 +125,6 @@
|
|||||||
<awaitility.version>4.1.0</awaitility.version>
|
<awaitility.version>4.1.0</awaitility.version>
|
||||||
<cassandra-unit.version>4.3.1.0</cassandra-unit.version>
|
<cassandra-unit.version>4.3.1.0</cassandra-unit.version>
|
||||||
<dbunit.version>2.7.2</dbunit.version>
|
<dbunit.version>2.7.2</dbunit.version>
|
||||||
<hsqldb.version>2.6.1</hsqldb.version>
|
|
||||||
<java-websocket.version>1.5.2</java-websocket.version>
|
<java-websocket.version>1.5.2</java-websocket.version>
|
||||||
<jupiter.version>5.7.2</jupiter.version> <!-- keep the same version as spring-boot-starter-test depend on jupiter-->
|
<jupiter.version>5.7.2</jupiter.version> <!-- keep the same version as spring-boot-starter-test depend on jupiter-->
|
||||||
<json-path.version>2.6.0</json-path.version>
|
<json-path.version>2.6.0</json-path.version>
|
||||||
@ -1659,11 +1658,6 @@
|
|||||||
<artifactId>bcpkix-jdk15on</artifactId>
|
<artifactId>bcpkix-jdk15on</artifactId>
|
||||||
<version>${bouncycastle.version}</version>
|
<version>${bouncycastle.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.hsqldb</groupId>
|
|
||||||
<artifactId>hsqldb</artifactId>
|
|
||||||
<version>${hsqldb.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.testcontainers</groupId>
|
<groupId>org.testcontainers</groupId>
|
||||||
<artifactId>postgresql</artifactId>
|
<artifactId>postgresql</artifactId>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user