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 org.springframework.context.annotation.Profile;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.server.dao.util.PsqlDao;
|
||||
|
||||
@Service
|
||||
@PsqlDao
|
||||
@Profile("install")
|
||||
@Slf4j
|
||||
public class PsqlEntityDatabaseSchemaService extends SqlAbstractDatabaseSchemaService
|
||||
public class SqlEntityDatabaseSchemaService extends SqlAbstractDatabaseSchemaService
|
||||
implements EntityDatabaseSchemaService {
|
||||
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_PSQL_ADDON_SQL = "schema-entities-idx-psql-addon.sql";
|
||||
|
||||
public PsqlEntityDatabaseSchemaService() {
|
||||
public SqlEntityDatabaseSchemaService() {
|
||||
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.context.annotation.Profile;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.server.dao.util.PsqlDao;
|
||||
import org.thingsboard.server.dao.util.SqlTsDao;
|
||||
|
||||
@Service
|
||||
@SqlTsDao
|
||||
@PsqlDao
|
||||
@Profile("install")
|
||||
public class PsqlTsDatabaseSchemaService extends SqlAbstractDatabaseSchemaService implements TsDatabaseSchemaService {
|
||||
public class SqlTsDatabaseSchemaService extends SqlAbstractDatabaseSchemaService implements TsDatabaseSchemaService {
|
||||
|
||||
@Value("${sql.postgres.ts_key_value_partitioning:MONTHS}")
|
||||
private String partitionType;
|
||||
|
||||
public PsqlTsDatabaseSchemaService() {
|
||||
public SqlTsDatabaseSchemaService() {
|
||||
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.context.annotation.Profile;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.server.dao.util.PsqlDao;
|
||||
import org.thingsboard.server.dao.util.SqlTsDao;
|
||||
|
||||
import java.io.File;
|
||||
@ -36,8 +35,7 @@ import java.sql.DriverManager;
|
||||
@Profile("install")
|
||||
@Slf4j
|
||||
@SqlTsDao
|
||||
@PsqlDao
|
||||
public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeService implements DatabaseTsUpgradeService {
|
||||
public class SqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeService implements DatabaseTsUpgradeService {
|
||||
|
||||
@Value("${sql.postgres.ts_key_value_partitioning:MONTHS}")
|
||||
private String partitionType;
|
||||
@ -19,16 +19,10 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Profile;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.server.dao.util.PsqlDao;
|
||||
import org.thingsboard.server.dao.util.TimescaleDBTsDao;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.SQLException;
|
||||
|
||||
@Service
|
||||
@TimescaleDBTsDao
|
||||
@PsqlDao
|
||||
@Profile("install")
|
||||
@Slf4j
|
||||
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.context.annotation.Profile;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.server.dao.util.PsqlDao;
|
||||
import org.thingsboard.server.dao.util.TimescaleDBTsDao;
|
||||
|
||||
import java.io.File;
|
||||
@ -37,7 +36,6 @@ import java.sql.DriverManager;
|
||||
@Profile("install")
|
||||
@Slf4j
|
||||
@TimescaleDBTsDao
|
||||
@PsqlDao
|
||||
public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeService implements DatabaseTsUpgradeService {
|
||||
|
||||
@Value("${sql.timescale.chunk_time_interval:86400000}")
|
||||
|
||||
@ -176,8 +176,6 @@ database:
|
||||
ts_latest:
|
||||
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:
|
||||
# Thingsboard cluster name
|
||||
@ -535,7 +533,6 @@ spring:
|
||||
open-in-view: "false"
|
||||
hibernate:
|
||||
ddl-auto: "none"
|
||||
database-platform: "${SPRING_JPA_DATABASE_PLATFORM:org.hibernate.dialect.PostgreSQL10Dialect}"
|
||||
datasource:
|
||||
driverClassName: "${SPRING_DRIVER_CLASS_NAME:org.postgresql.Driver}"
|
||||
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.verify;
|
||||
|
||||
public class PsqlEntityDatabaseSchemaServiceTest {
|
||||
public class SqlEntityDatabaseSchemaServiceTest {
|
||||
|
||||
@Test
|
||||
public void givenPsqlDbSchemaService_whenCreateDatabaseSchema_thenVerifyPsqlIndexSpecificCall() throws Exception {
|
||||
PsqlEntityDatabaseSchemaService service = spy(new PsqlEntityDatabaseSchemaService());
|
||||
SqlEntityDatabaseSchemaService service = spy(new SqlEntityDatabaseSchemaService());
|
||||
willDoNothing().given(service).executeQueryFromFile(anyString());
|
||||
|
||||
service.createDatabaseSchema();
|
||||
|
||||
verify(service, times(1)).createDatabaseIndexes();
|
||||
verify(service, times(1)).executeQueryFromFile(PsqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_SQL);
|
||||
verify(service, times(1)).executeQueryFromFile(PsqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_IDX_SQL);
|
||||
verify(service, times(1)).executeQueryFromFile(PsqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_IDX_PSQL_ADDON_SQL);
|
||||
verify(service, times(1)).executeQueryFromFile(SqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_SQL);
|
||||
verify(service, times(1)).executeQueryFromFile(SqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_IDX_SQL);
|
||||
verify(service, times(1)).executeQueryFromFile(SqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_IDX_PSQL_ADDON_SQL);
|
||||
verify(service, times(3)).executeQueryFromFile(anyString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenPsqlDbSchemaService_whenCreateDatabaseIndexes_thenVerifyPsqlIndexSpecificCall() throws Exception {
|
||||
PsqlEntityDatabaseSchemaService service = spy(new PsqlEntityDatabaseSchemaService());
|
||||
SqlEntityDatabaseSchemaService service = spy(new SqlEntityDatabaseSchemaService());
|
||||
willDoNothing().given(service).executeQueryFromFile(anyString());
|
||||
|
||||
service.createDatabaseIndexes();
|
||||
|
||||
verify(service, times(1)).executeQueryFromFile(PsqlEntityDatabaseSchemaService.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_SQL);
|
||||
verify(service, times(1)).executeQueryFromFile(SqlEntityDatabaseSchemaService.SCHEMA_ENTITIES_IDX_PSQL_ADDON_SQL);
|
||||
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.data.jpa.repository.config.EnableJpaRepositories;
|
||||
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.TbAutoConfiguration;
|
||||
|
||||
@Configuration
|
||||
@TbAutoConfiguration
|
||||
@ComponentScan({"org.thingsboard.server.dao.sqlts.hsql"})
|
||||
@EnableJpaRepositories({"org.thingsboard.server.dao.sqlts.ts", "org.thingsboard.server.dao.sqlts.insert.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.sql"})
|
||||
@EntityScan({"org.thingsboard.server.dao.model.sqlts.ts"})
|
||||
@EnableTransactionManagement
|
||||
@SqlTsDao
|
||||
@HsqlDao
|
||||
public class HsqlTsDaoConfig {
|
||||
public class SqlTsDaoConfig {
|
||||
|
||||
}
|
||||
@ -20,18 +20,16 @@ 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.SqlTsLatestDao;
|
||||
import org.thingsboard.server.dao.util.TbAutoConfiguration;
|
||||
|
||||
@Configuration
|
||||
@TbAutoConfiguration
|
||||
@ComponentScan({"org.thingsboard.server.dao.sqlts.psql"})
|
||||
@EnableJpaRepositories({"org.thingsboard.server.dao.sqlts.insert.latest.psql", "org.thingsboard.server.dao.sqlts.latest"})
|
||||
@ComponentScan({"org.thingsboard.server.dao.sqlts.sql"})
|
||||
@EnableJpaRepositories({"org.thingsboard.server.dao.sqlts.insert.latest.sql", "org.thingsboard.server.dao.sqlts.latest"})
|
||||
@EntityScan({"org.thingsboard.server.dao.model.sqlts.latest"})
|
||||
@EnableTransactionManagement
|
||||
@SqlTsLatestDao
|
||||
@PsqlDao
|
||||
public class PsqlTsLatestDaoConfig {
|
||||
public class SqlTsLatestDaoConfig {
|
||||
|
||||
}
|
||||
@ -20,7 +20,6 @@ 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.TbAutoConfiguration;
|
||||
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"})
|
||||
@EnableTransactionManagement
|
||||
@TimescaleDBTsDao
|
||||
@PsqlDao
|
||||
public class TimescaleDaoConfig {
|
||||
|
||||
}
|
||||
|
||||
@ -20,18 +20,16 @@ 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.TbAutoConfiguration;
|
||||
import org.thingsboard.server.dao.util.TimescaleDBTsLatestDao;
|
||||
|
||||
@Configuration
|
||||
@TbAutoConfiguration
|
||||
@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"})
|
||||
@EnableTransactionManagement
|
||||
@TimescaleDBTsLatestDao
|
||||
@PsqlDao
|
||||
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.transaction.annotation.Transactional;
|
||||
import org.thingsboard.server.dao.util.PsqlDao;
|
||||
|
||||
@PsqlDao
|
||||
@Repository
|
||||
@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.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
|
||||
import org.thingsboard.server.dao.util.PsqlDao;
|
||||
|
||||
@PsqlDao
|
||||
@Repository
|
||||
public class PsqlComponentDescriptorInsertRepository extends AbstractComponentDescriptorInsertRepository {
|
||||
public class SqlComponentDescriptorInsertRepository extends AbstractComponentDescriptorInsertRepository {
|
||||
|
||||
private static final String ID = "id = :id";
|
||||
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.TransactionTemplate;
|
||||
import org.thingsboard.server.dao.model.sql.EdgeEventEntity;
|
||||
import org.thingsboard.server.dao.util.PsqlDao;
|
||||
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.SQLException;
|
||||
import java.util.List;
|
||||
|
||||
@PsqlDao
|
||||
|
||||
@Repository
|
||||
@Transactional
|
||||
public class EdgeEventInsertRepository {
|
||||
|
||||
@ -25,14 +25,12 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
|
||||
import org.springframework.transaction.support.TransactionTemplate;
|
||||
import org.thingsboard.server.dao.model.sql.EventEntity;
|
||||
import org.thingsboard.server.dao.util.PsqlDao;
|
||||
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.SQLException;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@PsqlDao
|
||||
@Repository
|
||||
@Transactional
|
||||
public class EventInsertRepository {
|
||||
|
||||
@ -18,7 +18,6 @@ package org.thingsboard.server.dao.sql.event;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import org.thingsboard.server.dao.sql.JpaAbstractDaoListeningExecutorService;
|
||||
import org.thingsboard.server.dao.util.PsqlDao;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
@ -27,9 +26,8 @@ import java.sql.SQLException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@Slf4j
|
||||
@PsqlDao
|
||||
@Repository
|
||||
public class PsqlEventCleanupRepository extends JpaAbstractDaoListeningExecutorService implements EventCleanupRepository {
|
||||
public class SqlEventCleanupRepository extends JpaAbstractDaoListeningExecutorService implements EventCleanupRepository {
|
||||
|
||||
@Override
|
||||
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.transaction.annotation.Transactional;
|
||||
import org.thingsboard.server.dao.model.sql.RelationEntity;
|
||||
import org.thingsboard.server.dao.util.PsqlDao;
|
||||
|
||||
@PsqlDao
|
||||
@Repository
|
||||
@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)" +
|
||||
" 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
|
||||
* 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.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.sqlts.insert.AbstractInsertRepository;
|
||||
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.SQLException;
|
||||
@ -33,10 +33,10 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@PsqlTsLatestAnyDao
|
||||
@SqlTsLatestAnyDao
|
||||
@Repository
|
||||
@Transactional
|
||||
public class PsqlLatestInsertTsRepository extends AbstractInsertRepository implements InsertLatestTsRepository {
|
||||
public class SqlLatestInsertTsRepository extends AbstractInsertRepository implements InsertLatestTsRepository {
|
||||
|
||||
@Value("${sql.ts_latest.update_by_latest_ts:true}")
|
||||
private Boolean updateByLatestTs;
|
||||
@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* 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.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.sqlts.insert.AbstractInsertRepository;
|
||||
import org.thingsboard.server.dao.sqlts.insert.InsertTsRepository;
|
||||
import org.thingsboard.server.dao.util.PsqlDao;
|
||||
import org.thingsboard.server.dao.util.SqlTsDao;
|
||||
|
||||
import java.sql.PreparedStatement;
|
||||
@ -30,10 +29,9 @@ import java.sql.Types;
|
||||
import java.util.List;
|
||||
|
||||
@SqlTsDao
|
||||
@PsqlDao
|
||||
@Repository
|
||||
@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)) " +
|
||||
"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
|
||||
* 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.transaction.annotation.Transactional;
|
||||
import org.thingsboard.server.dao.timeseries.PsqlPartition;
|
||||
import org.thingsboard.server.dao.util.PsqlDao;
|
||||
import org.thingsboard.server.dao.timeseries.SqlPartition;
|
||||
import org.thingsboard.server.dao.util.SqlTsDao;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.PersistenceContext;
|
||||
|
||||
@SqlTsDao
|
||||
@PsqlDao
|
||||
@Repository
|
||||
@Transactional
|
||||
public class PsqlPartitioningRepository {
|
||||
public class SqlPartitioningRepository {
|
||||
|
||||
@PersistenceContext
|
||||
private EntityManager entityManager;
|
||||
|
||||
public void save(PsqlPartition partition) {
|
||||
public void save(SqlPartition partition) {
|
||||
entityManager.createNativeQuery(partition.getQuery())
|
||||
.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.sqlts.insert.AbstractInsertRepository;
|
||||
import org.thingsboard.server.dao.sqlts.insert.InsertTsRepository;
|
||||
import org.thingsboard.server.dao.util.PsqlDao;
|
||||
import org.thingsboard.server.dao.util.TimescaleDBTsDao;
|
||||
|
||||
import java.sql.PreparedStatement;
|
||||
@ -30,7 +29,6 @@ import java.sql.Types;
|
||||
import java.util.List;
|
||||
|
||||
@TimescaleDBTsDao
|
||||
@PsqlDao
|
||||
@Repository
|
||||
@Transactional
|
||||
public class TimescaleInsertTsRepository extends AbstractInsertRepository implements InsertTsRepository<TimescaleTsKvEntity> {
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* 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.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.dao.model.sqlts.ts.TsKvEntity;
|
||||
import org.thingsboard.server.dao.sqlts.AbstractChunkedAggregationTimeseriesDao;
|
||||
import org.thingsboard.server.dao.sqlts.insert.psql.PsqlPartitioningRepository;
|
||||
import org.thingsboard.server.dao.timeseries.PsqlPartition;
|
||||
import org.thingsboard.server.dao.sqlts.insert.sql.SqlPartitioningRepository;
|
||||
import org.thingsboard.server.dao.timeseries.SqlPartition;
|
||||
import org.thingsboard.server.dao.timeseries.SqlTsPartitionDate;
|
||||
import org.thingsboard.server.dao.util.PsqlDao;
|
||||
import org.thingsboard.server.dao.util.SqlTsDao;
|
||||
|
||||
import java.sql.Connection;
|
||||
@ -52,15 +51,14 @@ import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
@PsqlDao
|
||||
@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();
|
||||
|
||||
@Autowired
|
||||
private PsqlPartitioningRepository partitioningRepository;
|
||||
private SqlPartitioningRepository partitioningRepository;
|
||||
|
||||
private SqlTsPartitionDate tsFormat;
|
||||
|
||||
@ -134,24 +132,24 @@ public class JpaPsqlTimeseriesDao extends AbstractChunkedAggregationTimeseriesDa
|
||||
long partitionEndTs = toMills(localDateTimeEnd);
|
||||
ZonedDateTime zonedDateTime = localDateTimeStart.atZone(ZoneOffset.UTC);
|
||||
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) {
|
||||
if (!partitions.containsKey(psqlPartition.getStart())) {
|
||||
private void savePartition(SqlPartition sqlPartition) {
|
||||
if (!partitions.containsKey(sqlPartition.getStart())) {
|
||||
partitionCreationLock.lock();
|
||||
try {
|
||||
log.trace("Saving partition: {}", psqlPartition);
|
||||
partitioningRepository.save(psqlPartition);
|
||||
log.trace("Adding partition to Set: {}", psqlPartition);
|
||||
partitions.put(psqlPartition.getStart(), psqlPartition);
|
||||
log.trace("Saving partition: {}", sqlPartition);
|
||||
partitioningRepository.save(sqlPartition);
|
||||
log.trace("Adding partition to Set: {}", sqlPartition);
|
||||
partitions.put(sqlPartition.getStart(), sqlPartition);
|
||||
} catch (DataIntegrityViolationException ex) {
|
||||
log.trace("Error occurred during partition save:", ex);
|
||||
if (ex.getCause() instanceof ConstraintViolationException) {
|
||||
log.warn("Saving partition [{}] rejected. Timeseries data will save to the ts_kv_indefinite (DEFAULT) partition.", psqlPartition.getPartitionDate());
|
||||
partitions.put(psqlPartition.getStart(), psqlPartition);
|
||||
log.warn("Saving partition [{}] rejected. Timeseries data will save to the ts_kv_indefinite (DEFAULT) partition.", sqlPartition.getPartitionDate());
|
||||
partitions.put(sqlPartition.getStart(), sqlPartition);
|
||||
} else {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
@ -18,7 +18,7 @@ package org.thingsboard.server.dao.timeseries;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class PsqlPartition {
|
||||
public class SqlPartition {
|
||||
|
||||
private static final String TABLE_REGEX = "ts_kv_";
|
||||
|
||||
@ -27,7 +27,7 @@ public class PsqlPartition {
|
||||
private String partitionDate;
|
||||
private String query;
|
||||
|
||||
public PsqlPartition(long start, long end, String partitionDate) {
|
||||
public SqlPartition(long start, long end, String partitionDate) {
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
this.partitionDate = partitionDate;
|
||||
@ -28,7 +28,7 @@ import org.thingsboard.server.common.stats.StatsFactory;
|
||||
import org.thingsboard.server.dao.service.DaoSqlTest;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@ContextConfiguration(classes = {JpaDaoConfig.class, PsqlTsDaoConfig.class, PsqlTsLatestDaoConfig.class, SqlTimeseriesDaoConfig.class})
|
||||
@ContextConfiguration(classes = {JpaDaoConfig.class, SqlTsDaoConfig.class, SqlTsLatestDaoConfig.class, SqlTimeseriesDaoConfig.class})
|
||||
@DaoSqlTest
|
||||
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
|
||||
@TestExecutionListeners({
|
||||
|
||||
@ -30,7 +30,7 @@ import org.thingsboard.server.dao.service.DaoSqlTest;
|
||||
* Created by Valerii Sosliuk on 4/22/2017.
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@ContextConfiguration(classes = {JpaDaoConfig.class, PsqlTsDaoConfig.class, PsqlTsLatestDaoConfig.class, SqlTimeseriesDaoConfig.class})
|
||||
@ContextConfiguration(classes = {JpaDaoConfig.class, SqlTsDaoConfig.class, SqlTsLatestDaoConfig.class, SqlTimeseriesDaoConfig.class})
|
||||
@DaoSqlTest
|
||||
@TestExecutionListeners({
|
||||
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.hibernate.ddl-auto=none
|
||||
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL10Dialect
|
||||
spring.datasource.username=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
|
||||
|
||||
@ -12,7 +12,6 @@ spring.jpa.properties.hibernate.jdbc.log.warnings=false
|
||||
spring.jpa.show-sql=false
|
||||
|
||||
spring.jpa.hibernate.ddl-auto=none
|
||||
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL10Dialect
|
||||
spring.datasource.username=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
|
||||
@ -32,7 +31,6 @@ service.type=monolith
|
||||
#spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
|
||||
#spring.jpa.show-sql=false
|
||||
#spring.jpa.hibernate.ddl-auto=none
|
||||
#spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL10Dialect
|
||||
#
|
||||
#spring.datasource.username=postgres
|
||||
#spring.datasource.password=postgres
|
||||
|
||||
@ -2,7 +2,6 @@
|
||||
|
||||
DATABASE_TS_TYPE=cassandra
|
||||
CASSANDRA_URL=cassandra:9042
|
||||
SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.PostgreSQL10Dialect
|
||||
SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver
|
||||
SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/thingsboard
|
||||
SPRING_DATASOURCE_USERNAME=postgres
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
# ThingsBoard server configuration for PostgreSQL database
|
||||
|
||||
DATABASE_TS_TYPE=sql
|
||||
SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.PostgreSQL10Dialect
|
||||
SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver
|
||||
SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/thingsboard
|
||||
SPRING_DATASOURCE_USERNAME=postgres
|
||||
|
||||
@ -54,7 +54,6 @@ ENV DATABASE_TS_TYPE=cassandra
|
||||
ENV PGDATA=/data/db
|
||||
ENV CASSANDRA_DATA=/data/cassandra
|
||||
|
||||
ENV SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.PostgreSQL10Dialect
|
||||
ENV SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver
|
||||
ENV SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/thingsboard
|
||||
ENV SPRING_DATASOURCE_USERNAME=${pkg.user}
|
||||
|
||||
@ -50,7 +50,6 @@ ENV DATABASE_TS_TYPE=sql
|
||||
ENV PGDATA=/data/db
|
||||
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_DATASOURCE_URL=jdbc:postgresql://localhost:5432/thingsboard
|
||||
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
|
||||
130
msa/tb/pom.xml
130
msa/tb/pom.xml
@ -35,7 +35,6 @@
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<main.dir>${basedir}/../..</main.dir>
|
||||
<pkg.name>thingsboard</pkg.name>
|
||||
<tb.docker.name>tb</tb.docker.name>
|
||||
<tb-postgres.docker.name>tb-postgres</tb-postgres.docker.name>
|
||||
<tb-cassandra.docker.name>tb-cassandra</tb-cassandra.docker.name>
|
||||
<pkg.installFolder>/usr/share/${pkg.name}</pkg.installFolder>
|
||||
@ -59,25 +58,6 @@
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-dependency-plugin</artifactId>
|
||||
<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>
|
||||
<id>copy-tb-postgres-deb</id>
|
||||
<phase>package</phase>
|
||||
@ -122,26 +102,6 @@
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
<executions>
|
||||
<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>
|
||||
<phase>process-resources</phase>
|
||||
@ -188,32 +148,6 @@
|
||||
<groupId>com.spotify</groupId>
|
||||
<artifactId>dockerfile-maven-plugin</artifactId>
|
||||
<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>
|
||||
<id>build-docker-tb-postgres-image</id>
|
||||
<phase>pre-integration-test</phase>
|
||||
@ -284,28 +218,6 @@
|
||||
<groupId>com.spotify</groupId>
|
||||
<artifactId>dockerfile-maven-plugin</artifactId>
|
||||
<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>
|
||||
<id>push-latest-docker-tb-postgres-image</id>
|
||||
<phase>pre-integration-test</phase>
|
||||
@ -368,48 +280,6 @@
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<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>
|
||||
<id>push-latest-docker-amd-arm-tb-postgres-images</id>
|
||||
<phase>pre-integration-test</phase>
|
||||
|
||||
6
pom.xml
6
pom.xml
@ -125,7 +125,6 @@
|
||||
<awaitility.version>4.1.0</awaitility.version>
|
||||
<cassandra-unit.version>4.3.1.0</cassandra-unit.version>
|
||||
<dbunit.version>2.7.2</dbunit.version>
|
||||
<hsqldb.version>2.6.1</hsqldb.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-->
|
||||
<json-path.version>2.6.0</json-path.version>
|
||||
@ -1659,11 +1658,6 @@
|
||||
<artifactId>bcpkix-jdk15on</artifactId>
|
||||
<version>${bouncycastle.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hsqldb</groupId>
|
||||
<artifactId>hsqldb</artifactId>
|
||||
<version>${hsqldb.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.testcontainers</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user