Showing
18 changed files
with
181 additions
and
76 deletions
... | ... | @@ -14,6 +14,38 @@ |
14 | 14 | -- limitations under the License. |
15 | 15 | -- |
16 | 16 | |
17 | +DROP MATERIALIZED VIEW IF EXISTS thingsboard.rule_chain_by_tenant_and_search_text; | |
18 | + | |
19 | +DROP TABLE IF EXISTS thingsboard.rule_chain; | |
20 | + | |
21 | +CREATE TABLE IF NOT EXISTS thingsboard.rule_chain ( | |
22 | + id uuid, | |
23 | + tenant_id uuid, | |
24 | + name text, | |
25 | + type text, | |
26 | + search_text text, | |
27 | + first_rule_node_id uuid, | |
28 | + root boolean, | |
29 | + debug_mode boolean, | |
30 | + configuration text, | |
31 | + additional_info text, | |
32 | + PRIMARY KEY (id, tenant_id, type) | |
33 | +); | |
34 | + | |
35 | +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.rule_chain_by_tenant_and_search_text AS | |
36 | + SELECT * | |
37 | + from thingsboard.rule_chain | |
38 | + WHERE tenant_id IS NOT NULL AND search_text IS NOT NULL AND id IS NOT NULL AND type IS NOT NULL | |
39 | + PRIMARY KEY ( tenant_id, search_text, id, type ) | |
40 | + WITH CLUSTERING ORDER BY ( search_text ASC, id DESC ); | |
41 | + | |
42 | +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.rule_chain_by_tenant_by_type_and_search_text AS | |
43 | + SELECT * | |
44 | + from thingsboard.rule_chain | |
45 | + WHERE tenant_id IS NOT NULL AND search_text IS NOT NULL AND id IS NOT NULL AND type IS NOT NULL | |
46 | + PRIMARY KEY ( tenant_id, type, search_text, id ) | |
47 | + WITH CLUSTERING ORDER BY ( type ASC, search_text ASC, id DESC ); | |
48 | + | |
17 | 49 | CREATE TABLE IF NOT EXISTS thingsboard.edge ( |
18 | 50 | id timeuuid, |
19 | 51 | tenant_id timeuuid, |
... | ... | @@ -37,12 +69,12 @@ CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_tenant_and_name AS |
37 | 69 | PRIMARY KEY ( tenant_id, name, id, customer_id, type) |
38 | 70 | WITH CLUSTERING ORDER BY ( name ASC, id DESC, customer_id DESC); |
39 | 71 | |
40 | -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_tenant_and_routing_key AS | |
72 | +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_routing_key AS | |
41 | 73 | SELECT * |
42 | 74 | from thingsboard.edge |
43 | 75 | WHERE tenant_id IS NOT NULL AND customer_id IS NOT NULL AND type IS NOT NULL AND routing_key IS NOT NULL AND id IS NOT NULL |
44 | - PRIMARY KEY ( tenant_id, routing_key, id, customer_id, type) | |
45 | - WITH CLUSTERING ORDER BY ( routing_key ASC, id DESC, customer_id DESC); | |
76 | + PRIMARY KEY ( routing_key, tenant_id, id, customer_id, type) | |
77 | + WITH CLUSTERING ORDER BY ( tenant_id DESC, id DESC, customer_id DESC); | |
46 | 78 | |
47 | 79 | CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_tenant_and_search_text AS |
48 | 80 | SELECT * | ... | ... |
... | ... | @@ -152,6 +152,15 @@ public class ThingsboardInstallService { |
152 | 152 | databaseTsUpgradeService.upgradeDatabase("2.5.4"); |
153 | 153 | } |
154 | 154 | |
155 | + case "2.5.5": | |
156 | + log.info("Upgrading ThingsBoard from version 2.5.5 to 2.6.0 ..."); | |
157 | + if (databaseTsUpgradeService != null) { | |
158 | + databaseTsUpgradeService.upgradeDatabase("2.5.5"); | |
159 | + } | |
160 | + databaseEntitiesUpgradeService.upgradeDatabase("2.5.5"); | |
161 | + | |
162 | + dataUpdateService.updateData("2.5.5"); | |
163 | + | |
155 | 164 | log.info("Updating system data..."); |
156 | 165 | |
157 | 166 | systemDataLoaderService.deleteSystemWidgetBundle("charts"); | ... | ... |
... | ... | @@ -150,6 +150,9 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i |
150 | 150 | } |
151 | 151 | } catch (Exception e) { |
152 | 152 | log.warn("Failed to process messages handling!", e); |
153 | + try { | |
154 | + Thread.sleep(1000); | |
155 | + } catch (InterruptedException ignore) {} | |
153 | 156 | } |
154 | 157 | } |
155 | 158 | }); | ... | ... |
... | ... | @@ -252,52 +252,54 @@ public final class EdgeGrpcSession implements Closeable { |
252 | 252 | } |
253 | 253 | |
254 | 254 | void processHandleMessages() throws ExecutionException, InterruptedException { |
255 | - Long queueStartTs = getQueueStartTs().get(); | |
256 | - TimePageLink pageLink = new TimePageLink(ctx.getEdgeEventStorageSettings().getMaxReadRecordsCount(), queueStartTs, null, true); | |
257 | - TimePageData<EdgeEvent> pageData; | |
258 | - UUID ifOffset = null; | |
259 | - boolean success = true; | |
260 | - do { | |
261 | - pageData = ctx.getEdgeNotificationService().findEdgeEvents(edge.getTenantId(), edge.getId(), pageLink); | |
262 | - if (isConnected() && !pageData.getData().isEmpty()) { | |
263 | - log.trace("[{}] [{}] event(s) are going to be processed.", this.sessionId, pageData.getData().size()); | |
264 | - List<DownlinkMsg> downlinkMsgsPack = convertToDownlinkMsgsPack(pageData.getData()); | |
265 | - log.trace("[{}] downlink msg(s) are going to be send.", downlinkMsgsPack.size()); | |
266 | - | |
267 | - latch = new CountDownLatch(downlinkMsgsPack.size()); | |
268 | - for (DownlinkMsg downlinkMsg : downlinkMsgsPack) { | |
269 | - sendResponseMsg(ResponseMsg.newBuilder() | |
270 | - .setDownlinkMsg(downlinkMsg) | |
271 | - .build()); | |
272 | - } | |
255 | + if (isConnected()) { | |
256 | + Long queueStartTs = getQueueStartTs().get(); | |
257 | + TimePageLink pageLink = new TimePageLink(ctx.getEdgeEventStorageSettings().getMaxReadRecordsCount(), queueStartTs, null, true); | |
258 | + TimePageData<EdgeEvent> pageData; | |
259 | + UUID ifOffset = null; | |
260 | + boolean success = true; | |
261 | + do { | |
262 | + pageData = ctx.getEdgeNotificationService().findEdgeEvents(edge.getTenantId(), edge.getId(), pageLink); | |
263 | + if (isConnected() && !pageData.getData().isEmpty()) { | |
264 | + log.trace("[{}] [{}] event(s) are going to be processed.", this.sessionId, pageData.getData().size()); | |
265 | + List<DownlinkMsg> downlinkMsgsPack = convertToDownlinkMsgsPack(pageData.getData()); | |
266 | + log.trace("[{}] downlink msg(s) are going to be send.", downlinkMsgsPack.size()); | |
267 | + | |
268 | + latch = new CountDownLatch(downlinkMsgsPack.size()); | |
269 | + for (DownlinkMsg downlinkMsg : downlinkMsgsPack) { | |
270 | + sendResponseMsg(ResponseMsg.newBuilder() | |
271 | + .setDownlinkMsg(downlinkMsg) | |
272 | + .build()); | |
273 | + } | |
273 | 274 | |
274 | - ifOffset = pageData.getData().get(pageData.getData().size() - 1).getUuidId(); | |
275 | + ifOffset = pageData.getData().get(pageData.getData().size() - 1).getUuidId(); | |
275 | 276 | |
276 | - success = latch.await(10, TimeUnit.SECONDS); | |
277 | - if (!success) { | |
278 | - log.warn("Failed to deliver the batch: {}", downlinkMsgsPack); | |
279 | - } | |
280 | - } | |
281 | - if (isConnected() && (!success || pageData.hasNext())) { | |
282 | - try { | |
283 | - Thread.sleep(ctx.getEdgeEventStorageSettings().getSleepIntervalBetweenBatches()); | |
284 | - } catch (InterruptedException e) { | |
285 | - log.error("Error during sleep between batches", e); | |
277 | + success = latch.await(10, TimeUnit.SECONDS); | |
278 | + if (!success) { | |
279 | + log.warn("Failed to deliver the batch: {}", downlinkMsgsPack); | |
280 | + } | |
286 | 281 | } |
287 | - if (success) { | |
288 | - pageLink = pageData.getNextPageLink(); | |
282 | + if (isConnected() && (!success || pageData.hasNext())) { | |
283 | + try { | |
284 | + Thread.sleep(ctx.getEdgeEventStorageSettings().getSleepIntervalBetweenBatches()); | |
285 | + } catch (InterruptedException e) { | |
286 | + log.error("Error during sleep between batches", e); | |
287 | + } | |
288 | + if (success) { | |
289 | + pageLink = pageData.getNextPageLink(); | |
290 | + } | |
289 | 291 | } |
290 | - } | |
291 | - } while (isConnected() && (!success || pageData.hasNext())); | |
292 | + } while (isConnected() && (!success || pageData.hasNext())); | |
292 | 293 | |
293 | - if (ifOffset != null) { | |
294 | - Long newStartTs = UUIDs.unixTimestamp(ifOffset); | |
295 | - updateQueueStartTs(newStartTs); | |
296 | - } | |
297 | - try { | |
298 | - Thread.sleep(ctx.getEdgeEventStorageSettings().getNoRecordsSleepInterval()); | |
299 | - } catch (InterruptedException e) { | |
300 | - log.error("Error during sleep", e); | |
294 | + if (ifOffset != null) { | |
295 | + Long newStartTs = UUIDs.unixTimestamp(ifOffset); | |
296 | + updateQueueStartTs(newStartTs); | |
297 | + } | |
298 | + try { | |
299 | + Thread.sleep(ctx.getEdgeEventStorageSettings().getNoRecordsSleepInterval()); | |
300 | + } catch (InterruptedException e) { | |
301 | + log.error("Error during sleep", e); | |
302 | + } | |
301 | 303 | } |
302 | 304 | } |
303 | 305 | ... | ... |
... | ... | @@ -50,7 +50,7 @@ public abstract class AbstractSqlTsDatabaseUpgradeService { |
50 | 50 | @Autowired |
51 | 51 | protected InstallScripts installScripts; |
52 | 52 | |
53 | - protected abstract void loadSql(Connection conn, String fileName); | |
53 | + protected abstract void loadSql(Connection conn, String version, String fileName); | |
54 | 54 | |
55 | 55 | protected void loadFunctions(Path sqlFile, Connection conn) throws Exception { |
56 | 56 | String sql = new String(Files.readAllBytes(sqlFile), StandardCharsets.UTF_8); | ... | ... |
... | ... | @@ -21,6 +21,7 @@ import lombok.extern.slf4j.Slf4j; |
21 | 21 | import org.springframework.beans.factory.annotation.Autowired; |
22 | 22 | import org.springframework.context.annotation.Profile; |
23 | 23 | import org.springframework.stereotype.Service; |
24 | +import org.thingsboard.server.common.data.rule.RuleChainType; | |
24 | 25 | import org.thingsboard.server.dao.dashboard.DashboardService; |
25 | 26 | import org.thingsboard.server.dao.util.NoSqlDao; |
26 | 27 | import org.thingsboard.server.service.install.cql.CassandraDbHelper; |
... | ... | @@ -44,6 +45,7 @@ import static org.thingsboard.server.service.install.DatabaseHelper.ENTITY_VIEWS |
44 | 45 | import static org.thingsboard.server.service.install.DatabaseHelper.ID; |
45 | 46 | import static org.thingsboard.server.service.install.DatabaseHelper.KEYS; |
46 | 47 | import static org.thingsboard.server.service.install.DatabaseHelper.NAME; |
48 | +import static org.thingsboard.server.service.install.DatabaseHelper.RULE_CHAIN; | |
47 | 49 | import static org.thingsboard.server.service.install.DatabaseHelper.SEARCH_TEXT; |
48 | 50 | import static org.thingsboard.server.service.install.DatabaseHelper.START_TS; |
49 | 51 | import static org.thingsboard.server.service.install.DatabaseHelper.TENANT_ID; |
... | ... | @@ -306,17 +308,39 @@ public class CassandraDatabaseUpgradeService extends AbstractCassandraDatabaseUp |
306 | 308 | } |
307 | 309 | log.info("Schema updated."); |
308 | 310 | break; |
309 | - case "2.5.0": | |
311 | + case "2.5.5": | |
312 | + | |
313 | + log.info("Upgrading Cassandra DataBase from version {} to 2.6.0 ...", fromVersion); | |
314 | + | |
315 | + // Dump rule chains | |
316 | + | |
317 | + cluster.getSession(); | |
318 | + | |
319 | + ks = cluster.getCluster().getMetadata().getKeyspace(cluster.getKeyspaceName()); | |
320 | + | |
321 | + log.info("Dumping rule chains ..."); | |
322 | + Path ruleChainsDump = CassandraDbHelper.dumpCfIfExists(ks, cluster.getSession(), RULE_CHAIN, | |
323 | + new String[]{ID, TENANT_ID, NAME, SEARCH_TEXT, "first_rule_node_id", "root", "debug_mode", CONFIGURATION, ADDITIONAL_INFO, TYPE}, | |
324 | + new String[]{"", "", "", "", "", "", "", "", "", RuleChainType.CORE.name()}, | |
325 | + "tb-rule-chains"); | |
326 | + log.info("Rule chains dumped."); | |
327 | + | |
310 | 328 | log.info("Updating schema ..."); |
311 | 329 | schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "2.6.0", SCHEMA_UPDATE_CQL); |
312 | 330 | loadCql(schemaUpdateFile); |
313 | - | |
314 | - try { | |
315 | - cluster.getSession().execute("alter table rule_chain add type text"); | |
316 | - Thread.sleep(2500); | |
317 | - } catch (InvalidQueryException e) {} | |
318 | 331 | log.info("Schema updated."); |
332 | + | |
333 | + // Restore rule chains | |
334 | + | |
335 | + log.info("Restoring rule chains ..."); | |
336 | + if (ruleChainsDump != null) { | |
337 | + CassandraDbHelper.loadCf(ks, cluster.getSession(), RULE_CHAIN, | |
338 | + new String[]{ID, TENANT_ID, NAME, SEARCH_TEXT, "first_rule_node_id", "root", "debug_mode", CONFIGURATION, ADDITIONAL_INFO, TYPE}, ruleChainsDump); | |
339 | + Files.deleteIfExists(ruleChainsDump); | |
340 | + } | |
341 | + log.info("Rule chains restored."); | |
319 | 342 | break; |
343 | + | |
320 | 344 | default: |
321 | 345 | throw new RuntimeException("Unable to upgrade Cassandra database, unsupported fromVersion: " + fromVersion); |
322 | 346 | } | ... | ... |
... | ... | @@ -50,6 +50,7 @@ public class CassandraTsDatabaseUpgradeService extends AbstractCassandraDatabase |
50 | 50 | break; |
51 | 51 | case "2.5.0": |
52 | 52 | case "2.5.4": |
53 | + case "2.5.5": | |
53 | 54 | break; |
54 | 55 | default: |
55 | 56 | throw new RuntimeException("Unable to upgrade Cassandra database, unsupported fromVersion: " + fromVersion); | ... | ... |
... | ... | @@ -57,6 +57,7 @@ public class DatabaseHelper { |
57 | 57 | public static final String DASHBOARD = "dashboard"; |
58 | 58 | public static final String ENTITY_VIEWS = "entity_views"; |
59 | 59 | public static final String ENTITY_VIEW = "entity_view"; |
60 | + public static final String RULE_CHAIN = "rule_chain"; | |
60 | 61 | public static final String ID = "id"; |
61 | 62 | public static final String TITLE = "title"; |
62 | 63 | public static final String TYPE = "type"; | ... | ... |
... | ... | @@ -115,6 +115,11 @@ public class InstallScripts { |
115 | 115 | } |
116 | 116 | } |
117 | 117 | |
118 | + public void createDefaultEdgeRuleChains(TenantId tenantId) { | |
119 | + Path tenantChainsDir = getTenantRuleChainsDir(); | |
120 | + loadRuleChainFromFile(tenantId, tenantChainsDir.resolve("edge_root_rule_chain.json")); | |
121 | + } | |
122 | + | |
118 | 123 | public void loadSystemWidgets() throws Exception { |
119 | 124 | Path widgetBundlesDir = Paths.get(getDataDir(), JSON_DIR, SYSTEM_DIR, WIDGET_BUNDLES_DIR); |
120 | 125 | try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(widgetBundlesDir, path -> path.toString().endsWith(JSON_EXT))) { | ... | ... |
... | ... | @@ -94,7 +94,7 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe |
94 | 94 | log.info("PostgreSQL version is valid!"); |
95 | 95 | if (isOldSchema(conn, 2004003)) { |
96 | 96 | log.info("Load upgrade functions ..."); |
97 | - loadSql(conn, LOAD_FUNCTIONS_SQL); | |
97 | + loadSql(conn, "2.4.3", LOAD_FUNCTIONS_SQL); | |
98 | 98 | log.info("Updating timeseries schema ..."); |
99 | 99 | executeQuery(conn, CALL_CREATE_PARTITION_TS_KV_TABLE); |
100 | 100 | if (!partitionType.equals("INDEFINITE")) { |
... | ... | @@ -179,9 +179,9 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe |
179 | 179 | } |
180 | 180 | |
181 | 181 | log.info("Load TTL functions ..."); |
182 | - loadSql(conn, LOAD_TTL_FUNCTIONS_SQL); | |
182 | + loadSql(conn, "2.4.3", LOAD_TTL_FUNCTIONS_SQL); | |
183 | 183 | log.info("Load Drop Partitions functions ..."); |
184 | - loadSql(conn, LOAD_DROP_PARTITIONS_FUNCTIONS_SQL); | |
184 | + loadSql(conn, "2.4.3", LOAD_DROP_PARTITIONS_FUNCTIONS_SQL); | |
185 | 185 | |
186 | 186 | executeQuery(conn, "UPDATE tb_schema_settings SET schema_version = 2005000"); |
187 | 187 | |
... | ... | @@ -198,7 +198,13 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe |
198 | 198 | case "2.5.4": |
199 | 199 | try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) { |
200 | 200 | log.info("Load Drop Partitions functions ..."); |
201 | - loadSql(conn, LOAD_DROP_PARTITIONS_FUNCTIONS_SQL); | |
201 | + loadSql(conn, "2.4.3", LOAD_DROP_PARTITIONS_FUNCTIONS_SQL); | |
202 | + } | |
203 | + break; | |
204 | + case "2.5.5": | |
205 | + try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) { | |
206 | + log.info("Load TTL functions ..."); | |
207 | + loadSql(conn, "2.6.0", LOAD_TTL_FUNCTIONS_SQL); | |
202 | 208 | } |
203 | 209 | break; |
204 | 210 | default: |
... | ... | @@ -236,8 +242,8 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe |
236 | 242 | } |
237 | 243 | |
238 | 244 | @Override |
239 | - protected void loadSql(Connection conn, String fileName) { | |
240 | - Path schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "2.4.3", fileName); | |
245 | + protected void loadSql(Connection conn, String version, String fileName) { | |
246 | + Path schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", version, fileName); | |
241 | 247 | try { |
242 | 248 | loadFunctions(schemaUpdateFile, conn); |
243 | 249 | log.info("Functions successfully loaded!"); | ... | ... |
... | ... | @@ -233,7 +233,7 @@ public class SqlDatabaseUpgradeService implements DatabaseEntitiesUpgradeService |
233 | 233 | log.info("Schema updated."); |
234 | 234 | } |
235 | 235 | break; |
236 | - case "2.5.0": | |
236 | + case "2.5.5": | |
237 | 237 | try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) { |
238 | 238 | log.info("Updating schema ..."); |
239 | 239 | schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "2.6.0", SCHEMA_UPDATE_SQL); | ... | ... |
... | ... | @@ -89,7 +89,7 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr |
89 | 89 | log.info("PostgreSQL version is valid!"); |
90 | 90 | if (isOldSchema(conn, 2004003)) { |
91 | 91 | log.info("Load upgrade functions ..."); |
92 | - loadSql(conn, LOAD_FUNCTIONS_SQL); | |
92 | + loadSql(conn, "2.4.3", LOAD_FUNCTIONS_SQL); | |
93 | 93 | log.info("Updating timescale schema ..."); |
94 | 94 | executeQuery(conn, CALL_CREATE_TS_KV_LATEST_TABLE); |
95 | 95 | executeQuery(conn, CALL_CREATE_NEW_TENANT_TS_KV_TABLE); |
... | ... | @@ -165,7 +165,7 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr |
165 | 165 | } |
166 | 166 | |
167 | 167 | log.info("Load TTL functions ..."); |
168 | - loadSql(conn, LOAD_TTL_FUNCTIONS_SQL); | |
168 | + loadSql(conn, "2.4.3", LOAD_TTL_FUNCTIONS_SQL); | |
169 | 169 | |
170 | 170 | executeQuery(conn, "UPDATE tb_schema_settings SET schema_version = 2005000"); |
171 | 171 | log.info("schema timescale updated!"); |
... | ... | @@ -179,6 +179,8 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr |
179 | 179 | break; |
180 | 180 | case "2.5.4": |
181 | 181 | break; |
182 | + case "2.5.5": | |
183 | + break; | |
182 | 184 | default: |
183 | 185 | throw new RuntimeException("Unable to upgrade SQL database, unsupported fromVersion: " + fromVersion); |
184 | 186 | } |
... | ... | @@ -200,8 +202,8 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr |
200 | 202 | } |
201 | 203 | |
202 | 204 | @Override |
203 | - protected void loadSql(Connection conn, String fileName) { | |
204 | - Path schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "2.4.3", fileName); | |
205 | + protected void loadSql(Connection conn, String version, String fileName) { | |
206 | + Path schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", version, fileName); | |
205 | 207 | try { |
206 | 208 | loadFunctions(schemaUpdateFile, conn); |
207 | 209 | log.info("Functions successfully loaded!"); | ... | ... |
... | ... | @@ -157,6 +157,8 @@ public class CassandraDbHelper { |
157 | 157 | str = new Float(row.getFloat(index)).toString(); |
158 | 158 | } else if (type == DataType.timestamp()) { |
159 | 159 | str = ""+row.getTimestamp(index).getTime(); |
160 | + } else if (type == DataType.cboolean()) { | |
161 | + str = ""+ row.getBool(index); | |
160 | 162 | } else { |
161 | 163 | str = row.getString(index); |
162 | 164 | } |
... | ... | @@ -205,6 +207,8 @@ public class CassandraDbHelper { |
205 | 207 | boundStatement.setFloat(column, Float.valueOf(value)); |
206 | 208 | } else if (type == DataType.timestamp()) { |
207 | 209 | boundStatement.setTimestamp(column, new Date(Long.valueOf(value))); |
210 | + } else if (type == DataType.cboolean()) { | |
211 | + boundStatement.setBool(column, Boolean.valueOf(value)); | |
208 | 212 | } else { |
209 | 213 | boundStatement.setString(column, value); |
210 | 214 | } | ... | ... |
... | ... | @@ -19,9 +19,7 @@ import lombok.extern.slf4j.Slf4j; |
19 | 19 | import org.springframework.beans.factory.annotation.Autowired; |
20 | 20 | import org.springframework.context.annotation.Profile; |
21 | 21 | import org.springframework.stereotype.Service; |
22 | -import org.thingsboard.server.common.data.SearchTextBased; | |
23 | 22 | import org.thingsboard.server.common.data.Tenant; |
24 | -import org.thingsboard.server.common.data.id.UUIDBased; | |
25 | 23 | import org.thingsboard.server.common.data.page.TextPageData; |
26 | 24 | import org.thingsboard.server.common.data.page.TextPageLink; |
27 | 25 | import org.thingsboard.server.common.data.rule.RuleChain; |
... | ... | @@ -50,6 +48,10 @@ public class DefaultDataUpdateService implements DataUpdateService { |
50 | 48 | log.info("Updating data from version 1.4.0 to 2.0.0 ..."); |
51 | 49 | tenantsDefaultRuleChainUpdater.updateEntities(null); |
52 | 50 | break; |
51 | + case "2.5.5": | |
52 | + log.info("Updating data from version 2.5.5 to 2.6.0 ..."); | |
53 | + tenantsDefaultEdgeRuleChainUpdater.updateEntities(null); | |
54 | + break; | |
53 | 55 | default: |
54 | 56 | throw new RuntimeException("Unable to update data, unsupported fromVersion: " + fromVersion); |
55 | 57 | } |
... | ... | @@ -76,4 +78,24 @@ public class DefaultDataUpdateService implements DataUpdateService { |
76 | 78 | } |
77 | 79 | }; |
78 | 80 | |
81 | + private PaginatedUpdater<String, Tenant> tenantsDefaultEdgeRuleChainUpdater = | |
82 | + new PaginatedUpdater<String, Tenant>() { | |
83 | + | |
84 | + @Override | |
85 | + protected TextPageData<Tenant> findEntities(String region, TextPageLink pageLink) { | |
86 | + return tenantService.findTenants(pageLink); | |
87 | + } | |
88 | + | |
89 | + @Override | |
90 | + protected void updateEntity(Tenant tenant) { | |
91 | + try { | |
92 | + RuleChain defaultEdgeRuleChain = ruleChainService.getDefaultRootEdgeRuleChain(tenant.getId()); | |
93 | + if (defaultEdgeRuleChain == null) { | |
94 | + installScripts.createDefaultEdgeRuleChains(tenant.getId()); | |
95 | + } | |
96 | + } catch (Exception e) { | |
97 | + log.error("Unable to update Tenant", e); | |
98 | + } | |
99 | + } | |
100 | + }; | |
79 | 101 | } |
\ No newline at end of file | ... | ... |
... | ... | @@ -27,7 +27,6 @@ import com.google.common.util.concurrent.MoreExecutors; |
27 | 27 | import lombok.extern.slf4j.Slf4j; |
28 | 28 | import org.springframework.beans.factory.annotation.Autowired; |
29 | 29 | import org.springframework.stereotype.Component; |
30 | -import org.thingsboard.server.common.data.Device; | |
31 | 30 | import org.thingsboard.server.common.data.EntitySubtype; |
32 | 31 | import org.thingsboard.server.common.data.EntityType; |
33 | 32 | import org.thingsboard.server.common.data.edge.Edge; |
... | ... | @@ -57,8 +56,8 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.in; |
57 | 56 | import static com.datastax.driver.core.querybuilder.QueryBuilder.select; |
58 | 57 | import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME; |
59 | 58 | import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_CUSTOMER_BY_TYPE_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME; |
59 | +import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_ROUTING_KEY_VIEW_NAME; | |
60 | 60 | import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_TENANT_AND_NAME_VIEW_NAME; |
61 | -import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_TENANT_AND_ROUTING_KEY_VIEW_NAME; | |
62 | 61 | import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME; |
63 | 62 | import static org.thingsboard.server.dao.model.ModelConstants.EDGE_BY_TENANT_BY_TYPE_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME; |
64 | 63 | import static org.thingsboard.server.dao.model.ModelConstants.EDGE_COLUMN_FAMILY_NAME; |
... | ... | @@ -203,9 +202,8 @@ public class CassandraEdgeDao extends CassandraAbstractSearchTextDao<EdgeEntity, |
203 | 202 | |
204 | 203 | @Override |
205 | 204 | public Optional<Edge> findByRoutingKey(UUID tenantId, String routingKey) { |
206 | - Select select = select().from(EDGE_BY_TENANT_AND_ROUTING_KEY_VIEW_NAME); | |
205 | + Select select = select().from(EDGE_BY_ROUTING_KEY_VIEW_NAME); | |
207 | 206 | Select.Where query = select.where(); |
208 | - query.and(eq(EDGE_TENANT_ID_PROPERTY, tenantId)); | |
209 | 207 | query.and(eq(EDGE_ROUTING_KEY_PROPERTY, routingKey)); |
210 | 208 | return Optional.ofNullable(DaoUtil.getData(findOneByStatement(new TenantId(tenantId), query))); |
211 | 209 | } | ... | ... |
... | ... | @@ -373,7 +373,7 @@ public class ModelConstants { |
373 | 373 | public static final String EDGE_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME = "edge_by_customer_and_search_text"; |
374 | 374 | public static final String EDGE_BY_CUSTOMER_BY_TYPE_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME = "edge_by_customer_by_type_and_search_text"; |
375 | 375 | public static final String EDGE_BY_TENANT_AND_NAME_VIEW_NAME = "edge_by_tenant_and_name"; |
376 | - public static final String EDGE_BY_TENANT_AND_ROUTING_KEY_VIEW_NAME = "edge_by_tenant_and_routing_key"; | |
376 | + public static final String EDGE_BY_ROUTING_KEY_VIEW_NAME = "edge_by_routing_key"; | |
377 | 377 | |
378 | 378 | public static final String EDGE_ROUTING_KEY_PROPERTY = "routing_key"; |
379 | 379 | public static final String EDGE_SECRET_PROPERTY = "secret"; | ... | ... |
... | ... | @@ -22,9 +22,7 @@ import lombok.extern.slf4j.Slf4j; |
22 | 22 | import org.springframework.beans.factory.annotation.Autowired; |
23 | 23 | import org.springframework.stereotype.Component; |
24 | 24 | import org.thingsboard.server.common.data.EntityType; |
25 | -import org.thingsboard.server.common.data.edge.Edge; | |
26 | 25 | import org.thingsboard.server.common.data.id.EdgeId; |
27 | -import org.thingsboard.server.common.data.id.RuleChainId; | |
28 | 26 | import org.thingsboard.server.common.data.id.TenantId; |
29 | 27 | import org.thingsboard.server.common.data.page.TextPageLink; |
30 | 28 | import org.thingsboard.server.common.data.page.TimePageLink; |
... | ... | @@ -45,8 +43,6 @@ import java.util.List; |
45 | 43 | import java.util.UUID; |
46 | 44 | |
47 | 45 | import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; |
48 | -import static org.thingsboard.server.dao.model.ModelConstants.DEVICE_TENANT_ID_PROPERTY; | |
49 | -import static org.thingsboard.server.dao.model.ModelConstants.DEVICE_TYPE_PROPERTY; | |
50 | 46 | import static org.thingsboard.server.dao.model.ModelConstants.RULE_CHAIN_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME; |
51 | 47 | import static org.thingsboard.server.dao.model.ModelConstants.RULE_CHAIN_BY_TENANT_BY_TYPE_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME; |
52 | 48 | import static org.thingsboard.server.dao.model.ModelConstants.RULE_CHAIN_COLUMN_FAMILY_NAME; | ... | ... |
... | ... | @@ -749,12 +749,12 @@ CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_tenant_and_name AS |
749 | 749 | PRIMARY KEY ( tenant_id, name, id, customer_id, type) |
750 | 750 | WITH CLUSTERING ORDER BY ( name ASC, id DESC, customer_id DESC); |
751 | 751 | |
752 | -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_tenant_and_routing_key AS | |
752 | +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_routing_key AS | |
753 | 753 | SELECT * |
754 | 754 | from thingsboard.edge |
755 | 755 | WHERE tenant_id IS NOT NULL AND customer_id IS NOT NULL AND type IS NOT NULL AND routing_key IS NOT NULL AND id IS NOT NULL |
756 | - PRIMARY KEY ( tenant_id, routing_key, id, customer_id, type) | |
757 | - WITH CLUSTERING ORDER BY ( routing_key ASC, id DESC, customer_id DESC); | |
756 | + PRIMARY KEY ( routing_key, tenant_id, id, customer_id, type) | |
757 | + WITH CLUSTERING ORDER BY ( tenant_id DESC, id DESC, customer_id DESC); | |
758 | 758 | |
759 | 759 | CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.edge_by_tenant_and_search_text AS |
760 | 760 | SELECT * | ... | ... |