Commit a7d5392f3729148a2463d099a99efbecec305c1d
Merge branch 'develop/3.0' of https://github.com/thingsboard/thingsboard into map/3.0
Showing
95 changed files
with
1379 additions
and
1382 deletions
Too many changes to show.
To preserve performance only 95 of 168 files are displayed.
@@ -111,6 +111,10 @@ | @@ -111,6 +111,10 @@ | ||
111 | <groupId>org.slf4j</groupId> | 111 | <groupId>org.slf4j</groupId> |
112 | <artifactId>slf4j-log4j12</artifactId> | 112 | <artifactId>slf4j-log4j12</artifactId> |
113 | </exclusion> | 113 | </exclusion> |
114 | + <exclusion> | ||
115 | + <groupId>org.hibernate</groupId> | ||
116 | + <artifactId>hibernate-validator</artifactId> | ||
117 | + </exclusion> | ||
114 | </exclusions> | 118 | </exclusions> |
115 | <scope>test</scope> | 119 | <scope>test</scope> |
116 | </dependency> | 120 | </dependency> |
@@ -241,6 +245,12 @@ | @@ -241,6 +245,12 @@ | ||
241 | <groupId>org.springframework.boot</groupId> | 245 | <groupId>org.springframework.boot</groupId> |
242 | <artifactId>spring-boot-starter-test</artifactId> | 246 | <artifactId>spring-boot-starter-test</artifactId> |
243 | <scope>test</scope> | 247 | <scope>test</scope> |
248 | + <exclusions> | ||
249 | + <exclusion> | ||
250 | + <groupId>com.vaadin.external.google</groupId> | ||
251 | + <artifactId>android-json</artifactId> | ||
252 | + </exclusion> | ||
253 | + </exclusions> | ||
244 | </dependency> | 254 | </dependency> |
245 | <dependency> | 255 | <dependency> |
246 | <groupId>org.springframework.security</groupId> | 256 | <groupId>org.springframework.security</groupId> |
@@ -164,25 +164,24 @@ BEGIN | @@ -164,25 +164,24 @@ BEGIN | ||
164 | END; | 164 | END; |
165 | $$; | 165 | $$; |
166 | 166 | ||
167 | --- call insert_into_ts_kv(); | 167 | +CREATE OR REPLACE FUNCTION to_uuid(IN entity_id varchar, OUT uuid_id uuid) AS |
168 | +$$ | ||
169 | +BEGIN | ||
170 | + uuid_id := substring(entity_id, 8, 8) || '-' || substring(entity_id, 4, 4) || '-1' || substring(entity_id, 1, 3) || | ||
171 | + '-' || substring(entity_id, 16, 4) || '-' || substring(entity_id, 20, 12); | ||
172 | +END; | ||
173 | +$$ LANGUAGE plpgsql; | ||
168 | 174 | ||
169 | -CREATE OR REPLACE PROCEDURE insert_into_ts_kv() LANGUAGE plpgsql AS $$ | ||
170 | -DECLARE | ||
171 | - insert_size CONSTANT integer := 10000; | ||
172 | - insert_counter integer DEFAULT 0; | ||
173 | - insert_record RECORD; | ||
174 | - insert_cursor CURSOR FOR SELECT CONCAT(entity_id_uuid_first_part, '-', entity_id_uuid_second_part, '-1', entity_id_uuid_third_part, '-', entity_id_uuid_fourth_part, '-', entity_id_uuid_fifth_part)::uuid AS entity_id, | 175 | +CREATE OR REPLACE PROCEDURE insert_into_ts_kv(IN path_to_file varchar) LANGUAGE plpgsql AS $$ |
176 | +BEGIN | ||
177 | + EXECUTE format ('COPY (SELECT to_uuid(entity_id) AS entity_id, | ||
175 | ts_kv_records.key AS key, | 178 | ts_kv_records.key AS key, |
176 | ts_kv_records.ts AS ts, | 179 | ts_kv_records.ts AS ts, |
177 | ts_kv_records.bool_v AS bool_v, | 180 | ts_kv_records.bool_v AS bool_v, |
178 | ts_kv_records.str_v AS str_v, | 181 | ts_kv_records.str_v AS str_v, |
179 | ts_kv_records.long_v AS long_v, | 182 | ts_kv_records.long_v AS long_v, |
180 | ts_kv_records.dbl_v AS dbl_v | 183 | ts_kv_records.dbl_v AS dbl_v |
181 | - FROM (SELECT SUBSTRING(entity_id, 8, 8) AS entity_id_uuid_first_part, | ||
182 | - SUBSTRING(entity_id, 4, 4) AS entity_id_uuid_second_part, | ||
183 | - SUBSTRING(entity_id, 1, 3) AS entity_id_uuid_third_part, | ||
184 | - SUBSTRING(entity_id, 16, 4) AS entity_id_uuid_fourth_part, | ||
185 | - SUBSTRING(entity_id, 20) AS entity_id_uuid_fifth_part, | 184 | + FROM (SELECT entity_id AS entity_id, |
186 | key_id AS key, | 185 | key_id AS key, |
187 | ts, | 186 | ts, |
188 | bool_v, | 187 | bool_v, |
@@ -190,46 +189,23 @@ DECLARE | @@ -190,46 +189,23 @@ DECLARE | ||
190 | long_v, | 189 | long_v, |
191 | dbl_v | 190 | dbl_v |
192 | FROM ts_kv_old | 191 | FROM ts_kv_old |
193 | - INNER JOIN ts_kv_dictionary ON (ts_kv_old.key = ts_kv_dictionary.key)) AS ts_kv_records; | ||
194 | -BEGIN | ||
195 | - OPEN insert_cursor; | ||
196 | - LOOP | ||
197 | - insert_counter := insert_counter + 1; | ||
198 | - FETCH insert_cursor INTO insert_record; | ||
199 | - IF NOT FOUND THEN | ||
200 | - RAISE NOTICE '% records have been inserted into the partitioned ts_kv!',insert_counter - 1; | ||
201 | - EXIT; | ||
202 | - END IF; | ||
203 | - INSERT INTO ts_kv(entity_id, key, ts, bool_v, str_v, long_v, dbl_v) | ||
204 | - VALUES (insert_record.entity_id, insert_record.key, insert_record.ts, insert_record.bool_v, insert_record.str_v, | ||
205 | - insert_record.long_v, insert_record.dbl_v); | ||
206 | - IF MOD(insert_counter, insert_size) = 0 THEN | ||
207 | - RAISE NOTICE '% records have been inserted into the partitioned ts_kv!',insert_counter; | ||
208 | - END IF; | ||
209 | - END LOOP; | ||
210 | - CLOSE insert_cursor; | ||
211 | -END; | 192 | + INNER JOIN ts_kv_dictionary ON (ts_kv_old.key = ts_kv_dictionary.key)) AS ts_kv_records) TO %L;', path_to_file); |
193 | + EXECUTE format ('COPY ts_kv FROM %L', path_to_file); | ||
194 | +END | ||
212 | $$; | 195 | $$; |
213 | 196 | ||
214 | -- call insert_into_ts_kv_latest(); | 197 | -- call insert_into_ts_kv_latest(); |
215 | 198 | ||
216 | -CREATE OR REPLACE PROCEDURE insert_into_ts_kv_latest() LANGUAGE plpgsql AS $$ | ||
217 | -DECLARE | ||
218 | - insert_size CONSTANT integer := 10000; | ||
219 | - insert_counter integer DEFAULT 0; | ||
220 | - insert_record RECORD; | ||
221 | - insert_cursor CURSOR FOR SELECT CONCAT(entity_id_uuid_first_part, '-', entity_id_uuid_second_part, '-1', entity_id_uuid_third_part, '-', entity_id_uuid_fourth_part, '-', entity_id_uuid_fifth_part)::uuid AS entity_id, | 199 | +CREATE OR REPLACE PROCEDURE insert_into_ts_kv_latest(IN path_to_file varchar) LANGUAGE plpgsql AS $$ |
200 | +BEGIN | ||
201 | + EXECUTE format ('COPY (SELECT to_uuid(entity_id) AS entity_id, | ||
222 | ts_kv_latest_records.key AS key, | 202 | ts_kv_latest_records.key AS key, |
223 | ts_kv_latest_records.ts AS ts, | 203 | ts_kv_latest_records.ts AS ts, |
224 | ts_kv_latest_records.bool_v AS bool_v, | 204 | ts_kv_latest_records.bool_v AS bool_v, |
225 | ts_kv_latest_records.str_v AS str_v, | 205 | ts_kv_latest_records.str_v AS str_v, |
226 | ts_kv_latest_records.long_v AS long_v, | 206 | ts_kv_latest_records.long_v AS long_v, |
227 | ts_kv_latest_records.dbl_v AS dbl_v | 207 | ts_kv_latest_records.dbl_v AS dbl_v |
228 | - FROM (SELECT SUBSTRING(entity_id, 8, 8) AS entity_id_uuid_first_part, | ||
229 | - SUBSTRING(entity_id, 4, 4) AS entity_id_uuid_second_part, | ||
230 | - SUBSTRING(entity_id, 1, 3) AS entity_id_uuid_third_part, | ||
231 | - SUBSTRING(entity_id, 16, 4) AS entity_id_uuid_fourth_part, | ||
232 | - SUBSTRING(entity_id, 20) AS entity_id_uuid_fifth_part, | 208 | + FROM (SELECT entity_id AS entity_id, |
233 | key_id AS key, | 209 | key_id AS key, |
234 | ts, | 210 | ts, |
235 | bool_v, | 211 | bool_v, |
@@ -237,24 +213,8 @@ DECLARE | @@ -237,24 +213,8 @@ DECLARE | ||
237 | long_v, | 213 | long_v, |
238 | dbl_v | 214 | dbl_v |
239 | FROM ts_kv_latest_old | 215 | FROM ts_kv_latest_old |
240 | - INNER JOIN ts_kv_dictionary ON (ts_kv_latest_old.key = ts_kv_dictionary.key)) AS ts_kv_latest_records; | ||
241 | -BEGIN | ||
242 | - OPEN insert_cursor; | ||
243 | - LOOP | ||
244 | - insert_counter := insert_counter + 1; | ||
245 | - FETCH insert_cursor INTO insert_record; | ||
246 | - IF NOT FOUND THEN | ||
247 | - RAISE NOTICE '% records have been inserted into the ts_kv_latest!',insert_counter - 1; | ||
248 | - EXIT; | ||
249 | - END IF; | ||
250 | - INSERT INTO ts_kv_latest(entity_id, key, ts, bool_v, str_v, long_v, dbl_v) | ||
251 | - VALUES (insert_record.entity_id, insert_record.key, insert_record.ts, insert_record.bool_v, insert_record.str_v, | ||
252 | - insert_record.long_v, insert_record.dbl_v); | ||
253 | - IF MOD(insert_counter, insert_size) = 0 THEN | ||
254 | - RAISE NOTICE '% records have been inserted into the ts_kv_latest!',insert_counter; | ||
255 | - END IF; | ||
256 | - END LOOP; | ||
257 | - CLOSE insert_cursor; | 216 | + INNER JOIN ts_kv_dictionary ON (ts_kv_latest_old.key = ts_kv_dictionary.key)) AS ts_kv_latest_records) TO %L;', path_to_file); |
217 | + EXECUTE format ('COPY ts_kv_latest FROM %L', path_to_file); | ||
258 | END; | 218 | END; |
259 | $$; | 219 | $$; |
260 | 220 |
@@ -96,51 +96,36 @@ BEGIN | @@ -96,51 +96,36 @@ BEGIN | ||
96 | END; | 96 | END; |
97 | $$; | 97 | $$; |
98 | 98 | ||
99 | --- call insert_into_ts_kv(); | 99 | +CREATE OR REPLACE FUNCTION to_uuid(IN entity_id varchar, OUT uuid_id uuid) AS |
100 | +$$ | ||
101 | +BEGIN | ||
102 | + uuid_id := substring(entity_id, 8, 8) || '-' || substring(entity_id, 4, 4) || '-1' || substring(entity_id, 1, 3) || | ||
103 | + '-' || substring(entity_id, 16, 4) || '-' || substring(entity_id, 20, 12); | ||
104 | +END; | ||
105 | +$$ LANGUAGE plpgsql; | ||
100 | 106 | ||
101 | -CREATE OR REPLACE PROCEDURE insert_into_ts_kv() LANGUAGE plpgsql AS $$ | 107 | +-- call insert_into_ts_kv(); |
102 | 108 | ||
103 | -DECLARE | ||
104 | - insert_size CONSTANT integer := 10000; | ||
105 | - insert_counter integer DEFAULT 0; | ||
106 | - insert_record RECORD; | ||
107 | - insert_cursor CURSOR FOR SELECT CONCAT(entity_id_uuid_first_part, '-', entity_id_uuid_second_part, '-1', entity_id_uuid_third_part, '-', entity_id_uuid_fourth_part, '-', entity_id_uuid_fifth_part)::uuid AS entity_id, | ||
108 | - new_ts_kv_records.key AS key, | ||
109 | - new_ts_kv_records.ts AS ts, | ||
110 | - new_ts_kv_records.bool_v AS bool_v, | ||
111 | - new_ts_kv_records.str_v AS str_v, | ||
112 | - new_ts_kv_records.long_v AS long_v, | ||
113 | - new_ts_kv_records.dbl_v AS dbl_v | ||
114 | - FROM (SELECT SUBSTRING(entity_id, 8, 8) AS entity_id_uuid_first_part, | ||
115 | - SUBSTRING(entity_id, 4, 4) AS entity_id_uuid_second_part, | ||
116 | - SUBSTRING(entity_id, 1, 3) AS entity_id_uuid_third_part, | ||
117 | - SUBSTRING(entity_id, 16, 4) AS entity_id_uuid_fourth_part, | ||
118 | - SUBSTRING(entity_id, 20) AS entity_id_uuid_fifth_part, | ||
119 | - key_id AS key, | ||
120 | - ts, | ||
121 | - bool_v, | ||
122 | - str_v, | ||
123 | - long_v, | ||
124 | - dbl_v | ||
125 | - FROM tenant_ts_kv_old | ||
126 | - INNER JOIN ts_kv_dictionary ON (tenant_ts_kv_old.key = ts_kv_dictionary.key)) AS new_ts_kv_records; | 109 | +CREATE OR REPLACE PROCEDURE insert_into_ts_kv(IN path_to_file varchar) LANGUAGE plpgsql AS $$ |
127 | BEGIN | 110 | BEGIN |
128 | - OPEN insert_cursor; | ||
129 | - LOOP | ||
130 | - insert_counter := insert_counter + 1; | ||
131 | - FETCH insert_cursor INTO insert_record; | ||
132 | - IF NOT FOUND THEN | ||
133 | - RAISE NOTICE '% records have been inserted into the new ts_kv table!',insert_counter - 1; | ||
134 | - EXIT; | ||
135 | - END IF; | ||
136 | - INSERT INTO ts_kv(entity_id, key, ts, bool_v, str_v, long_v, dbl_v) | ||
137 | - VALUES (insert_record.entity_id, insert_record.key, insert_record.ts, insert_record.bool_v, insert_record.str_v, | ||
138 | - insert_record.long_v, insert_record.dbl_v); | ||
139 | - IF MOD(insert_counter, insert_size) = 0 THEN | ||
140 | - RAISE NOTICE '% records have been inserted into the new ts_kv table!',insert_counter; | ||
141 | - END IF; | ||
142 | - END LOOP; | ||
143 | - CLOSE insert_cursor; | 111 | + |
112 | + EXECUTE format ('COPY (SELECT to_uuid(entity_id) AS entity_id, | ||
113 | + new_ts_kv_records.key AS key, | ||
114 | + new_ts_kv_records.ts AS ts, | ||
115 | + new_ts_kv_records.bool_v AS bool_v, | ||
116 | + new_ts_kv_records.str_v AS str_v, | ||
117 | + new_ts_kv_records.long_v AS long_v, | ||
118 | + new_ts_kv_records.dbl_v AS dbl_v | ||
119 | + FROM (SELECT entity_id AS entity_id, | ||
120 | + key_id AS key, | ||
121 | + ts, | ||
122 | + bool_v, | ||
123 | + str_v, | ||
124 | + long_v, | ||
125 | + dbl_v | ||
126 | + FROM tenant_ts_kv_old | ||
127 | + INNER JOIN ts_kv_dictionary ON (tenant_ts_kv_old.key = ts_kv_dictionary.key)) AS new_ts_kv_records) TO %L;', path_to_file); | ||
128 | + EXECUTE format ('COPY ts_kv FROM %L', path_to_file); | ||
144 | END; | 129 | END; |
145 | $$; | 130 | $$; |
146 | 131 |
@@ -16,7 +16,6 @@ | @@ -16,7 +16,6 @@ | ||
16 | package org.thingsboard.server.actors.ruleChain; | 16 | package org.thingsboard.server.actors.ruleChain; |
17 | 17 | ||
18 | import akka.actor.ActorRef; | 18 | import akka.actor.ActorRef; |
19 | -import com.datastax.driver.core.ResultSetFuture; | ||
20 | import com.fasterxml.jackson.core.JsonProcessingException; | 19 | import com.fasterxml.jackson.core.JsonProcessingException; |
21 | import com.fasterxml.jackson.databind.ObjectMapper; | 20 | import com.fasterxml.jackson.databind.ObjectMapper; |
22 | import io.netty.channel.EventLoopGroup; | 21 | import io.netty.channel.EventLoopGroup; |
@@ -53,6 +52,7 @@ import org.thingsboard.server.dao.dashboard.DashboardService; | @@ -53,6 +52,7 @@ import org.thingsboard.server.dao.dashboard.DashboardService; | ||
53 | import org.thingsboard.server.dao.device.DeviceService; | 52 | import org.thingsboard.server.dao.device.DeviceService; |
54 | import org.thingsboard.server.dao.entityview.EntityViewService; | 53 | import org.thingsboard.server.dao.entityview.EntityViewService; |
55 | import org.thingsboard.server.dao.nosql.CassandraStatementTask; | 54 | import org.thingsboard.server.dao.nosql.CassandraStatementTask; |
55 | +import org.thingsboard.server.dao.nosql.TbResultSetFuture; | ||
56 | import org.thingsboard.server.dao.relation.RelationService; | 56 | import org.thingsboard.server.dao.relation.RelationService; |
57 | import org.thingsboard.server.dao.rule.RuleChainService; | 57 | import org.thingsboard.server.dao.rule.RuleChainService; |
58 | import org.thingsboard.server.dao.tenant.TenantService; | 58 | import org.thingsboard.server.dao.tenant.TenantService; |
@@ -405,7 +405,7 @@ class DefaultTbContext implements TbContext { | @@ -405,7 +405,7 @@ class DefaultTbContext implements TbContext { | ||
405 | } | 405 | } |
406 | 406 | ||
407 | @Override | 407 | @Override |
408 | - public ResultSetFuture submitCassandraTask(CassandraStatementTask task) { | 408 | + public TbResultSetFuture submitCassandraTask(CassandraStatementTask task) { |
409 | return mainCtx.getCassandraBufferedRateExecutor().submit(task); | 409 | return mainCtx.getCassandraBufferedRateExecutor().submit(task); |
410 | } | 410 | } |
411 | 411 |
@@ -15,7 +15,6 @@ | @@ -15,7 +15,6 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.controller; | 16 | package org.thingsboard.server.controller; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | ||
19 | import com.fasterxml.jackson.core.type.TypeReference; | 18 | import com.fasterxml.jackson.core.type.TypeReference; |
20 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
21 | import com.fasterxml.jackson.databind.ObjectMapper; | 20 | import com.fasterxml.jackson.databind.ObjectMapper; |
@@ -34,6 +34,9 @@ public abstract class AbstractSqlTsDatabaseUpgradeService { | @@ -34,6 +34,9 @@ public abstract class AbstractSqlTsDatabaseUpgradeService { | ||
34 | protected static final String CALL_REGEX = "call "; | 34 | protected static final String CALL_REGEX = "call "; |
35 | protected static final String DROP_TABLE = "DROP TABLE "; | 35 | protected static final String DROP_TABLE = "DROP TABLE "; |
36 | protected static final String DROP_PROCEDURE_IF_EXISTS = "DROP PROCEDURE IF EXISTS "; | 36 | protected static final String DROP_PROCEDURE_IF_EXISTS = "DROP PROCEDURE IF EXISTS "; |
37 | + protected static final String TS_KV_SQL = "ts_kv.sql"; | ||
38 | + protected static final String PATH_TO_USERS_PUBLIC_FOLDER = "C:\\Users\\Public"; | ||
39 | + protected static final String THINGSBOARD_WINDOWS_UPGRADE_DIR = "THINGSBOARD_WINDOWS_UPGRADE_DIR"; | ||
37 | 40 | ||
38 | @Value("${spring.datasource.url}") | 41 | @Value("${spring.datasource.url}") |
39 | protected String dbUrl; | 42 | protected String dbUrl; |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.service.install; | 16 | package org.thingsboard.server.service.install; |
17 | 17 | ||
18 | -import com.datastax.driver.core.exceptions.InvalidQueryException; | 18 | +import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; |
19 | import lombok.extern.slf4j.Slf4j; | 19 | import lombok.extern.slf4j.Slf4j; |
20 | import org.springframework.context.annotation.Profile; | 20 | import org.springframework.context.annotation.Profile; |
21 | import org.springframework.stereotype.Service; | 21 | import org.springframework.stereotype.Service; |
@@ -16,12 +16,17 @@ | @@ -16,12 +16,17 @@ | ||
16 | package org.thingsboard.server.service.install; | 16 | package org.thingsboard.server.service.install; |
17 | 17 | ||
18 | import lombok.extern.slf4j.Slf4j; | 18 | import lombok.extern.slf4j.Slf4j; |
19 | +import org.apache.commons.lang3.StringUtils; | ||
20 | +import org.apache.commons.lang3.SystemUtils; | ||
19 | import org.springframework.beans.factory.annotation.Value; | 21 | import org.springframework.beans.factory.annotation.Value; |
20 | import org.springframework.context.annotation.Profile; | 22 | import org.springframework.context.annotation.Profile; |
21 | import org.springframework.stereotype.Service; | 23 | import org.springframework.stereotype.Service; |
22 | import org.thingsboard.server.dao.util.PsqlDao; | 24 | import org.thingsboard.server.dao.util.PsqlDao; |
23 | import org.thingsboard.server.dao.util.SqlTsDao; | 25 | import org.thingsboard.server.dao.util.SqlTsDao; |
24 | 26 | ||
27 | +import java.io.File; | ||
28 | +import java.io.IOException; | ||
29 | +import java.nio.file.Files; | ||
25 | import java.nio.file.Path; | 30 | import java.nio.file.Path; |
26 | import java.nio.file.Paths; | 31 | import java.nio.file.Paths; |
27 | import java.sql.Connection; | 32 | import java.sql.Connection; |
@@ -37,6 +42,7 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe | @@ -37,6 +42,7 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe | ||
37 | @Value("${sql.postgres.ts_key_value_partitioning:MONTHS}") | 42 | @Value("${sql.postgres.ts_key_value_partitioning:MONTHS}") |
38 | private String partitionType; | 43 | private String partitionType; |
39 | 44 | ||
45 | + private static final String TS_KV_LATEST_SQL = "ts_kv_latest.sql"; | ||
40 | private static final String LOAD_FUNCTIONS_SQL = "schema_update_psql_ts.sql"; | 46 | private static final String LOAD_FUNCTIONS_SQL = "schema_update_psql_ts.sql"; |
41 | private static final String LOAD_TTL_FUNCTIONS_SQL = "schema_update_ttl.sql"; | 47 | private static final String LOAD_TTL_FUNCTIONS_SQL = "schema_update_ttl.sql"; |
42 | private static final String LOAD_DROP_PARTITIONS_FUNCTIONS_SQL = "schema_update_psql_drop_partitions.sql"; | 48 | private static final String LOAD_DROP_PARTITIONS_FUNCTIONS_SQL = "schema_update_psql_drop_partitions.sql"; |
@@ -49,15 +55,13 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe | @@ -49,15 +55,13 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe | ||
49 | private static final String CREATE_PARTITIONS = "create_partitions(IN partition_type varchar)"; | 55 | private static final String CREATE_PARTITIONS = "create_partitions(IN partition_type varchar)"; |
50 | private static final String CREATE_TS_KV_DICTIONARY_TABLE = "create_ts_kv_dictionary_table()"; | 56 | private static final String CREATE_TS_KV_DICTIONARY_TABLE = "create_ts_kv_dictionary_table()"; |
51 | private static final String INSERT_INTO_DICTIONARY = "insert_into_dictionary()"; | 57 | private static final String INSERT_INTO_DICTIONARY = "insert_into_dictionary()"; |
52 | - private static final String INSERT_INTO_TS_KV = "insert_into_ts_kv()"; | ||
53 | - private static final String INSERT_INTO_TS_KV_LATEST = "insert_into_ts_kv_latest()"; | 58 | + private static final String INSERT_INTO_TS_KV = "insert_into_ts_kv(IN path_to_file varchar)"; |
59 | + private static final String INSERT_INTO_TS_KV_LATEST = "insert_into_ts_kv_latest(IN path_to_file varchar)"; | ||
54 | 60 | ||
55 | private static final String CALL_CREATE_PARTITION_TS_KV_TABLE = CALL_REGEX + CREATE_PARTITION_TS_KV_TABLE; | 61 | private static final String CALL_CREATE_PARTITION_TS_KV_TABLE = CALL_REGEX + CREATE_PARTITION_TS_KV_TABLE; |
56 | private static final String CALL_CREATE_NEW_TS_KV_LATEST_TABLE = CALL_REGEX + CREATE_NEW_TS_KV_LATEST_TABLE; | 62 | private static final String CALL_CREATE_NEW_TS_KV_LATEST_TABLE = CALL_REGEX + CREATE_NEW_TS_KV_LATEST_TABLE; |
57 | private static final String CALL_CREATE_TS_KV_DICTIONARY_TABLE = CALL_REGEX + CREATE_TS_KV_DICTIONARY_TABLE; | 63 | private static final String CALL_CREATE_TS_KV_DICTIONARY_TABLE = CALL_REGEX + CREATE_TS_KV_DICTIONARY_TABLE; |
58 | private static final String CALL_INSERT_INTO_DICTIONARY = CALL_REGEX + INSERT_INTO_DICTIONARY; | 64 | private static final String CALL_INSERT_INTO_DICTIONARY = CALL_REGEX + INSERT_INTO_DICTIONARY; |
59 | - private static final String CALL_INSERT_INTO_TS_KV = CALL_REGEX + INSERT_INTO_TS_KV; | ||
60 | - private static final String CALL_INSERT_INTO_TS_KV_LATEST = CALL_REGEX + INSERT_INTO_TS_KV_LATEST; | ||
61 | 65 | ||
62 | private static final String DROP_TABLE_TS_KV_OLD = DROP_TABLE + TS_KV_OLD; | 66 | private static final String DROP_TABLE_TS_KV_OLD = DROP_TABLE + TS_KV_OLD; |
63 | private static final String DROP_TABLE_TS_KV_LATEST_OLD = DROP_TABLE + TS_KV_LATEST_OLD; | 67 | private static final String DROP_TABLE_TS_KV_LATEST_OLD = DROP_TABLE + TS_KV_LATEST_OLD; |
@@ -94,9 +98,58 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe | @@ -94,9 +98,58 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe | ||
94 | } | 98 | } |
95 | executeQuery(conn, CALL_CREATE_TS_KV_DICTIONARY_TABLE); | 99 | executeQuery(conn, CALL_CREATE_TS_KV_DICTIONARY_TABLE); |
96 | executeQuery(conn, CALL_INSERT_INTO_DICTIONARY); | 100 | executeQuery(conn, CALL_INSERT_INTO_DICTIONARY); |
97 | - executeQuery(conn, CALL_INSERT_INTO_TS_KV); | ||
98 | - executeQuery(conn, CALL_CREATE_NEW_TS_KV_LATEST_TABLE); | ||
99 | - executeQuery(conn, CALL_INSERT_INTO_TS_KV_LATEST); | 101 | + |
102 | + Path pathToTempTsKvFile; | ||
103 | + Path pathToTempTsKvLatestFile; | ||
104 | + if (SystemUtils.IS_OS_WINDOWS) { | ||
105 | + log.info("Lookup for environment variable: {} ...", THINGSBOARD_WINDOWS_UPGRADE_DIR); | ||
106 | + Path pathToDir; | ||
107 | + String thingsboardWindowsUpgradeDir = System.getenv("THINGSBOARD_WINDOWS_UPGRADE_DIR"); | ||
108 | + if (StringUtils.isNotEmpty(thingsboardWindowsUpgradeDir)) { | ||
109 | + log.info("Environment variable: {} was found!", THINGSBOARD_WINDOWS_UPGRADE_DIR); | ||
110 | + pathToDir = Paths.get(thingsboardWindowsUpgradeDir); | ||
111 | + } else { | ||
112 | + log.info("Failed to lookup environment variable: {}", THINGSBOARD_WINDOWS_UPGRADE_DIR); | ||
113 | + pathToDir = Paths.get(PATH_TO_USERS_PUBLIC_FOLDER); | ||
114 | + } | ||
115 | + log.info("Directory: {} will be used for creation temporary upgrade files!", pathToDir); | ||
116 | + try { | ||
117 | + Path tsKvFile = Files.createTempFile(pathToDir, "ts_kv", ".sql"); | ||
118 | + Path tsKvLatestFile = Files.createTempFile(pathToDir, "ts_kv_latest", ".sql"); | ||
119 | + pathToTempTsKvFile = tsKvFile.toAbsolutePath(); | ||
120 | + pathToTempTsKvLatestFile = tsKvLatestFile.toAbsolutePath(); | ||
121 | + executeQuery(conn, "call insert_into_ts_kv('" + pathToTempTsKvFile + "')"); | ||
122 | + executeQuery(conn, CALL_CREATE_NEW_TS_KV_LATEST_TABLE); | ||
123 | + executeQuery(conn, "call insert_into_ts_kv_latest('" + pathToTempTsKvLatestFile + "');"); | ||
124 | + } catch (IOException | SecurityException e) { | ||
125 | + throw new RuntimeException("Failed to create time-series upgrade files due to: " + e); | ||
126 | + } | ||
127 | + } else { | ||
128 | + Path tempDirPath = Files.createTempDirectory("ts_kv"); | ||
129 | + File tempDirAsFile = tempDirPath.toFile(); | ||
130 | + boolean writable = tempDirAsFile.setWritable(true, false); | ||
131 | + boolean readable = tempDirAsFile.setReadable(true, false); | ||
132 | + boolean executable = tempDirAsFile.setExecutable(true, false); | ||
133 | + if (writable && readable && executable) { | ||
134 | + pathToTempTsKvFile = tempDirPath.resolve(TS_KV_SQL).toAbsolutePath(); | ||
135 | + pathToTempTsKvLatestFile = tempDirPath.resolve(TS_KV_LATEST_SQL).toAbsolutePath(); | ||
136 | + executeQuery(conn, "call insert_into_ts_kv('" + pathToTempTsKvFile + "')"); | ||
137 | + executeQuery(conn, CALL_CREATE_NEW_TS_KV_LATEST_TABLE); | ||
138 | + executeQuery(conn, "call insert_into_ts_kv_latest('" + pathToTempTsKvLatestFile + "');"); | ||
139 | + } else { | ||
140 | + throw new RuntimeException("Failed to grant write permissions for the: " + tempDirPath + "folder!"); | ||
141 | + } | ||
142 | + } | ||
143 | + if (pathToTempTsKvFile.toFile().exists() && pathToTempTsKvLatestFile.toFile().exists()) { | ||
144 | + boolean deleteTsKvFile = pathToTempTsKvFile.toFile().delete(); | ||
145 | + if (deleteTsKvFile) { | ||
146 | + log.info("Successfully deleted the temp file for ts_kv table upgrade!"); | ||
147 | + } | ||
148 | + boolean deleteTsKvLatestFile = pathToTempTsKvLatestFile.toFile().delete(); | ||
149 | + if (deleteTsKvLatestFile) { | ||
150 | + log.info("Successfully deleted the temp file for ts_kv_latest table upgrade!"); | ||
151 | + } | ||
152 | + } | ||
100 | 153 | ||
101 | executeQuery(conn, DROP_TABLE_TS_KV_OLD); | 154 | executeQuery(conn, DROP_TABLE_TS_KV_OLD); |
102 | executeQuery(conn, DROP_TABLE_TS_KV_LATEST_OLD); | 155 | executeQuery(conn, DROP_TABLE_TS_KV_LATEST_OLD); |
@@ -16,6 +16,8 @@ | @@ -16,6 +16,8 @@ | ||
16 | package org.thingsboard.server.service.install; | 16 | package org.thingsboard.server.service.install; |
17 | 17 | ||
18 | import lombok.extern.slf4j.Slf4j; | 18 | import lombok.extern.slf4j.Slf4j; |
19 | +import org.apache.commons.lang3.StringUtils; | ||
20 | +import org.apache.commons.lang3.SystemUtils; | ||
19 | import org.springframework.beans.factory.annotation.Autowired; | 21 | import org.springframework.beans.factory.annotation.Autowired; |
20 | import org.springframework.beans.factory.annotation.Value; | 22 | import org.springframework.beans.factory.annotation.Value; |
21 | import org.springframework.context.annotation.Profile; | 23 | import org.springframework.context.annotation.Profile; |
@@ -23,6 +25,9 @@ import org.springframework.stereotype.Service; | @@ -23,6 +25,9 @@ import org.springframework.stereotype.Service; | ||
23 | import org.thingsboard.server.dao.util.PsqlDao; | 25 | import org.thingsboard.server.dao.util.PsqlDao; |
24 | import org.thingsboard.server.dao.util.TimescaleDBTsDao; | 26 | import org.thingsboard.server.dao.util.TimescaleDBTsDao; |
25 | 27 | ||
28 | +import java.io.File; | ||
29 | +import java.io.IOException; | ||
30 | +import java.nio.file.Files; | ||
26 | import java.nio.file.Path; | 31 | import java.nio.file.Path; |
27 | import java.nio.file.Paths; | 32 | import java.nio.file.Paths; |
28 | import java.sql.Connection; | 33 | import java.sql.Connection; |
@@ -47,14 +52,13 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr | @@ -47,14 +52,13 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr | ||
47 | private static final String CREATE_NEW_TS_KV_TABLE = "create_new_ts_kv_table()"; | 52 | private static final String CREATE_NEW_TS_KV_TABLE = "create_new_ts_kv_table()"; |
48 | private static final String CREATE_TS_KV_DICTIONARY_TABLE = "create_ts_kv_dictionary_table()"; | 53 | private static final String CREATE_TS_KV_DICTIONARY_TABLE = "create_ts_kv_dictionary_table()"; |
49 | private static final String INSERT_INTO_DICTIONARY = "insert_into_dictionary()"; | 54 | private static final String INSERT_INTO_DICTIONARY = "insert_into_dictionary()"; |
50 | - private static final String INSERT_INTO_TS_KV = "insert_into_ts_kv()"; | 55 | + private static final String INSERT_INTO_TS_KV = "insert_into_ts_kv(IN path_to_file varchar)"; |
51 | private static final String INSERT_INTO_TS_KV_LATEST = "insert_into_ts_kv_latest()"; | 56 | private static final String INSERT_INTO_TS_KV_LATEST = "insert_into_ts_kv_latest()"; |
52 | 57 | ||
53 | private static final String CALL_CREATE_TS_KV_LATEST_TABLE = CALL_REGEX + CREATE_TS_KV_LATEST_TABLE; | 58 | private static final String CALL_CREATE_TS_KV_LATEST_TABLE = CALL_REGEX + CREATE_TS_KV_LATEST_TABLE; |
54 | private static final String CALL_CREATE_NEW_TENANT_TS_KV_TABLE = CALL_REGEX + CREATE_NEW_TS_KV_TABLE; | 59 | private static final String CALL_CREATE_NEW_TENANT_TS_KV_TABLE = CALL_REGEX + CREATE_NEW_TS_KV_TABLE; |
55 | private static final String CALL_CREATE_TS_KV_DICTIONARY_TABLE = CALL_REGEX + CREATE_TS_KV_DICTIONARY_TABLE; | 60 | private static final String CALL_CREATE_TS_KV_DICTIONARY_TABLE = CALL_REGEX + CREATE_TS_KV_DICTIONARY_TABLE; |
56 | private static final String CALL_INSERT_INTO_DICTIONARY = CALL_REGEX + INSERT_INTO_DICTIONARY; | 61 | private static final String CALL_INSERT_INTO_DICTIONARY = CALL_REGEX + INSERT_INTO_DICTIONARY; |
57 | - private static final String CALL_INSERT_INTO_TS_KV = CALL_REGEX + INSERT_INTO_TS_KV; | ||
58 | private static final String CALL_INSERT_INTO_TS_KV_LATEST = CALL_REGEX + INSERT_INTO_TS_KV_LATEST; | 62 | private static final String CALL_INSERT_INTO_TS_KV_LATEST = CALL_REGEX + INSERT_INTO_TS_KV_LATEST; |
59 | 63 | ||
60 | private static final String DROP_OLD_TENANT_TS_KV_TABLE = DROP_TABLE + TENANT_TS_KV_OLD_TABLE; | 64 | private static final String DROP_OLD_TENANT_TS_KV_TABLE = DROP_TABLE + TENANT_TS_KV_OLD_TABLE; |
@@ -63,7 +67,7 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr | @@ -63,7 +67,7 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr | ||
63 | private static final String DROP_PROCEDURE_CREATE_TENANT_TS_KV_TABLE_COPY = DROP_PROCEDURE_IF_EXISTS + CREATE_NEW_TS_KV_TABLE; | 67 | private static final String DROP_PROCEDURE_CREATE_TENANT_TS_KV_TABLE_COPY = DROP_PROCEDURE_IF_EXISTS + CREATE_NEW_TS_KV_TABLE; |
64 | private static final String DROP_PROCEDURE_CREATE_TS_KV_DICTIONARY_TABLE = DROP_PROCEDURE_IF_EXISTS + CREATE_TS_KV_DICTIONARY_TABLE; | 68 | private static final String DROP_PROCEDURE_CREATE_TS_KV_DICTIONARY_TABLE = DROP_PROCEDURE_IF_EXISTS + CREATE_TS_KV_DICTIONARY_TABLE; |
65 | private static final String DROP_PROCEDURE_INSERT_INTO_DICTIONARY = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_DICTIONARY; | 69 | private static final String DROP_PROCEDURE_INSERT_INTO_DICTIONARY = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_DICTIONARY; |
66 | - private static final String DROP_PROCEDURE_INSERT_INTO_TENANT_TS_KV = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_TS_KV; | 70 | + private static final String DROP_PROCEDURE_INSERT_INTO_TS_KV = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_TS_KV; |
67 | private static final String DROP_PROCEDURE_INSERT_INTO_TS_KV_LATEST = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_TS_KV_LATEST; | 71 | private static final String DROP_PROCEDURE_INSERT_INTO_TS_KV_LATEST = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_TS_KV_LATEST; |
68 | 72 | ||
69 | @Autowired | 73 | @Autowired |
@@ -91,7 +95,49 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr | @@ -91,7 +95,49 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr | ||
91 | 95 | ||
92 | executeQuery(conn, CALL_CREATE_TS_KV_DICTIONARY_TABLE); | 96 | executeQuery(conn, CALL_CREATE_TS_KV_DICTIONARY_TABLE); |
93 | executeQuery(conn, CALL_INSERT_INTO_DICTIONARY); | 97 | executeQuery(conn, CALL_INSERT_INTO_DICTIONARY); |
94 | - executeQuery(conn, CALL_INSERT_INTO_TS_KV); | 98 | + |
99 | + Path pathToTempTsKvFile; | ||
100 | + if (SystemUtils.IS_OS_WINDOWS) { | ||
101 | + Path pathToDir; | ||
102 | + log.info("Lookup for environment variable: {} ...", THINGSBOARD_WINDOWS_UPGRADE_DIR); | ||
103 | + String thingsboardWindowsUpgradeDir = System.getenv(THINGSBOARD_WINDOWS_UPGRADE_DIR); | ||
104 | + if (StringUtils.isNotEmpty(thingsboardWindowsUpgradeDir)) { | ||
105 | + log.info("Environment variable: {} was found!", THINGSBOARD_WINDOWS_UPGRADE_DIR); | ||
106 | + pathToDir = Paths.get(thingsboardWindowsUpgradeDir); | ||
107 | + } else { | ||
108 | + log.info("Failed to lookup environment variable: {}", THINGSBOARD_WINDOWS_UPGRADE_DIR); | ||
109 | + pathToDir = Paths.get(PATH_TO_USERS_PUBLIC_FOLDER); | ||
110 | + } | ||
111 | + log.info("Directory: {} will be used for creation temporary upgrade file!", pathToDir); | ||
112 | + try { | ||
113 | + Path tsKvFile = Files.createTempFile(pathToDir, "ts_kv", ".sql"); | ||
114 | + pathToTempTsKvFile = tsKvFile.toAbsolutePath(); | ||
115 | + executeQuery(conn, "call insert_into_ts_kv('" + pathToTempTsKvFile + "')"); | ||
116 | + pathToTempTsKvFile.toFile().deleteOnExit(); | ||
117 | + } catch (IOException | SecurityException e) { | ||
118 | + throw new RuntimeException("Failed to create time-series upgrade files due to: " + e); | ||
119 | + } | ||
120 | + } else { | ||
121 | + Path tempDirPath = Files.createTempDirectory("ts_kv"); | ||
122 | + File tempDirAsFile = tempDirPath.toFile(); | ||
123 | + boolean writable = tempDirAsFile.setWritable(true, false); | ||
124 | + boolean readable = tempDirAsFile.setReadable(true, false); | ||
125 | + boolean executable = tempDirAsFile.setExecutable(true, false); | ||
126 | + if (writable && readable && executable) { | ||
127 | + pathToTempTsKvFile = tempDirPath.resolve(TS_KV_SQL).toAbsolutePath(); | ||
128 | + executeQuery(conn, "call insert_into_ts_kv('" + pathToTempTsKvFile + "')"); | ||
129 | + } else { | ||
130 | + throw new RuntimeException("Failed to grant write permissions for the: " + tempDirPath + "folder!"); | ||
131 | + } | ||
132 | + } | ||
133 | + | ||
134 | + if (pathToTempTsKvFile.toFile().exists()) { | ||
135 | + boolean deleteTsKvFile = pathToTempTsKvFile.toFile().delete(); | ||
136 | + if (deleteTsKvFile) { | ||
137 | + log.info("Successfully deleted the temp file for ts_kv table upgrade!"); | ||
138 | + } | ||
139 | + } | ||
140 | + | ||
95 | executeQuery(conn, CALL_INSERT_INTO_TS_KV_LATEST); | 141 | executeQuery(conn, CALL_INSERT_INTO_TS_KV_LATEST); |
96 | 142 | ||
97 | executeQuery(conn, DROP_OLD_TENANT_TS_KV_TABLE); | 143 | executeQuery(conn, DROP_OLD_TENANT_TS_KV_TABLE); |
@@ -100,7 +146,7 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr | @@ -100,7 +146,7 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr | ||
100 | executeQuery(conn, DROP_PROCEDURE_CREATE_TENANT_TS_KV_TABLE_COPY); | 146 | executeQuery(conn, DROP_PROCEDURE_CREATE_TENANT_TS_KV_TABLE_COPY); |
101 | executeQuery(conn, DROP_PROCEDURE_CREATE_TS_KV_DICTIONARY_TABLE); | 147 | executeQuery(conn, DROP_PROCEDURE_CREATE_TS_KV_DICTIONARY_TABLE); |
102 | executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_DICTIONARY); | 148 | executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_DICTIONARY); |
103 | - executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_TENANT_TS_KV); | 149 | + executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_TS_KV); |
104 | executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_TS_KV_LATEST); | 150 | executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_TS_KV_LATEST); |
105 | 151 | ||
106 | executeQuery(conn, "ALTER TABLE ts_kv ADD COLUMN IF NOT EXISTS json_v json;"); | 152 | executeQuery(conn, "ALTER TABLE ts_kv ADD COLUMN IF NOT EXISTS json_v json;"); |
@@ -15,25 +15,27 @@ | @@ -15,25 +15,27 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.service.install.cql; | 16 | package org.thingsboard.server.service.install.cql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.BoundStatement; | ||
19 | -import com.datastax.driver.core.DataType; | ||
20 | -import com.datastax.driver.core.KeyspaceMetadata; | ||
21 | -import com.datastax.driver.core.PreparedStatement; | ||
22 | -import com.datastax.driver.core.ResultSet; | ||
23 | -import com.datastax.driver.core.Row; | ||
24 | -import com.datastax.driver.core.Session; | ||
25 | -import com.datastax.driver.core.SimpleStatement; | ||
26 | -import com.datastax.driver.core.Statement; | ||
27 | -import com.datastax.driver.core.TableMetadata; | 18 | +import com.datastax.oss.driver.api.core.cql.BoundStatementBuilder; |
19 | +import com.datastax.oss.driver.api.core.cql.PreparedStatement; | ||
20 | +import com.datastax.oss.driver.api.core.cql.ResultSet; | ||
21 | +import com.datastax.oss.driver.api.core.cql.Row; | ||
22 | +import com.datastax.oss.driver.api.core.cql.SimpleStatement; | ||
23 | +import com.datastax.oss.driver.api.core.cql.Statement; | ||
24 | +import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; | ||
25 | +import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; | ||
26 | +import com.datastax.oss.driver.api.core.type.DataType; | ||
27 | +import com.datastax.oss.protocol.internal.ProtocolConstants; | ||
28 | import org.apache.commons.csv.CSVFormat; | 28 | import org.apache.commons.csv.CSVFormat; |
29 | import org.apache.commons.csv.CSVParser; | 29 | import org.apache.commons.csv.CSVParser; |
30 | import org.apache.commons.csv.CSVPrinter; | 30 | import org.apache.commons.csv.CSVPrinter; |
31 | import org.apache.commons.csv.CSVRecord; | 31 | import org.apache.commons.csv.CSVRecord; |
32 | +import org.thingsboard.server.dao.cassandra.guava.GuavaSession; | ||
32 | 33 | ||
33 | import java.io.IOException; | 34 | import java.io.IOException; |
34 | import java.nio.file.Files; | 35 | import java.nio.file.Files; |
35 | import java.nio.file.Path; | 36 | import java.nio.file.Path; |
36 | import java.nio.file.StandardCopyOption; | 37 | import java.nio.file.StandardCopyOption; |
38 | +import java.time.Instant; | ||
37 | import java.util.ArrayList; | 39 | import java.util.ArrayList; |
38 | import java.util.Date; | 40 | import java.util.Date; |
39 | import java.util.Iterator; | 41 | import java.util.Iterator; |
@@ -44,12 +46,12 @@ import static org.thingsboard.server.service.install.DatabaseHelper.CSV_DUMP_FOR | @@ -44,12 +46,12 @@ import static org.thingsboard.server.service.install.DatabaseHelper.CSV_DUMP_FOR | ||
44 | 46 | ||
45 | public class CassandraDbHelper { | 47 | public class CassandraDbHelper { |
46 | 48 | ||
47 | - public static Path dumpCfIfExists(KeyspaceMetadata ks, Session session, String cfName, | 49 | + public static Path dumpCfIfExists(KeyspaceMetadata ks, GuavaSession session, String cfName, |
48 | String[] columns, String[] defaultValues, String dumpPrefix) throws Exception { | 50 | String[] columns, String[] defaultValues, String dumpPrefix) throws Exception { |
49 | return dumpCfIfExists(ks, session, cfName, columns, defaultValues, dumpPrefix, false); | 51 | return dumpCfIfExists(ks, session, cfName, columns, defaultValues, dumpPrefix, false); |
50 | } | 52 | } |
51 | 53 | ||
52 | - public static Path dumpCfIfExists(KeyspaceMetadata ks, Session session, String cfName, | 54 | + public static Path dumpCfIfExists(KeyspaceMetadata ks, GuavaSession session, String cfName, |
53 | String[] columns, String[] defaultValues, String dumpPrefix, boolean printHeader) throws Exception { | 55 | String[] columns, String[] defaultValues, String dumpPrefix, boolean printHeader) throws Exception { |
54 | if (ks.getTable(cfName) != null) { | 56 | if (ks.getTable(cfName) != null) { |
55 | Path dumpFile = Files.createTempFile(dumpPrefix, null); | 57 | Path dumpFile = Files.createTempFile(dumpPrefix, null); |
@@ -59,8 +61,8 @@ public class CassandraDbHelper { | @@ -59,8 +61,8 @@ public class CassandraDbHelper { | ||
59 | csvFormat = csvFormat.withHeader(columns); | 61 | csvFormat = csvFormat.withHeader(columns); |
60 | } | 62 | } |
61 | try (CSVPrinter csvPrinter = new CSVPrinter(Files.newBufferedWriter(dumpFile), csvFormat)) { | 63 | try (CSVPrinter csvPrinter = new CSVPrinter(Files.newBufferedWriter(dumpFile), csvFormat)) { |
62 | - Statement stmt = new SimpleStatement("SELECT * FROM " + cfName); | ||
63 | - stmt.setFetchSize(1000); | 64 | + Statement stmt = SimpleStatement.newInstance("SELECT * FROM " + cfName); |
65 | + stmt.setPageSize(1000); | ||
64 | ResultSet rs = session.execute(stmt); | 66 | ResultSet rs = session.execute(stmt); |
65 | Iterator<Row> iter = rs.iterator(); | 67 | Iterator<Row> iter = rs.iterator(); |
66 | while (iter.hasNext()) { | 68 | while (iter.hasNext()) { |
@@ -95,12 +97,12 @@ public class CassandraDbHelper { | @@ -95,12 +97,12 @@ public class CassandraDbHelper { | ||
95 | Files.move(tmp, targetDumpFile, StandardCopyOption.REPLACE_EXISTING); | 97 | Files.move(tmp, targetDumpFile, StandardCopyOption.REPLACE_EXISTING); |
96 | } | 98 | } |
97 | 99 | ||
98 | - public static void loadCf(KeyspaceMetadata ks, Session session, String cfName, String[] columns, Path sourceFile) throws Exception { | 100 | + public static void loadCf(KeyspaceMetadata ks, GuavaSession session, String cfName, String[] columns, Path sourceFile) throws Exception { |
99 | loadCf(ks, session, cfName, columns, sourceFile, false); | 101 | loadCf(ks, session, cfName, columns, sourceFile, false); |
100 | } | 102 | } |
101 | 103 | ||
102 | - public static void loadCf(KeyspaceMetadata ks, Session session, String cfName, String[] columns, Path sourceFile, boolean parseHeader) throws Exception { | ||
103 | - TableMetadata tableMetadata = ks.getTable(cfName); | 104 | + public static void loadCf(KeyspaceMetadata ks, GuavaSession session, String cfName, String[] columns, Path sourceFile, boolean parseHeader) throws Exception { |
105 | + TableMetadata tableMetadata = ks.getTable(cfName).get(); | ||
104 | PreparedStatement prepared = session.prepare(createInsertStatement(cfName, columns)); | 106 | PreparedStatement prepared = session.prepare(createInsertStatement(cfName, columns)); |
105 | CSVFormat csvFormat = CSV_DUMP_FORMAT; | 107 | CSVFormat csvFormat = CSV_DUMP_FORMAT; |
106 | if (parseHeader) { | 108 | if (parseHeader) { |
@@ -110,11 +112,11 @@ public class CassandraDbHelper { | @@ -110,11 +112,11 @@ public class CassandraDbHelper { | ||
110 | } | 112 | } |
111 | try (CSVParser csvParser = new CSVParser(Files.newBufferedReader(sourceFile), csvFormat)) { | 113 | try (CSVParser csvParser = new CSVParser(Files.newBufferedReader(sourceFile), csvFormat)) { |
112 | csvParser.forEach(record -> { | 114 | csvParser.forEach(record -> { |
113 | - BoundStatement boundStatement = prepared.bind(); | 115 | + BoundStatementBuilder boundStatementBuilder = new BoundStatementBuilder(prepared.bind()); |
114 | for (String column : columns) { | 116 | for (String column : columns) { |
115 | - setColumnValue(tableMetadata, column, record, boundStatement); | 117 | + setColumnValue(tableMetadata, column, record, boundStatementBuilder); |
116 | } | 118 | } |
117 | - session.execute(boundStatement); | 119 | + session.execute(boundStatementBuilder.build()); |
118 | }); | 120 | }); |
119 | } | 121 | } |
120 | } | 122 | } |
@@ -136,27 +138,27 @@ public class CassandraDbHelper { | @@ -136,27 +138,27 @@ public class CassandraDbHelper { | ||
136 | } | 138 | } |
137 | 139 | ||
138 | private static String getColumnValue(String column, String defaultValue, Row row) { | 140 | private static String getColumnValue(String column, String defaultValue, Row row) { |
139 | - int index = row.getColumnDefinitions().getIndexOf(column); | 141 | + int index = row.getColumnDefinitions().firstIndexOf(column); |
140 | if (index > -1) { | 142 | if (index > -1) { |
141 | String str; | 143 | String str; |
142 | - DataType type = row.getColumnDefinitions().getType(index); | 144 | + DataType type = row.getColumnDefinitions().get(index).getType(); |
143 | try { | 145 | try { |
144 | if (row.isNull(index)) { | 146 | if (row.isNull(index)) { |
145 | return null; | 147 | return null; |
146 | - } else if (type == DataType.cdouble()) { | 148 | + } else if (type.getProtocolCode() == ProtocolConstants.DataType.DOUBLE) { |
147 | str = new Double(row.getDouble(index)).toString(); | 149 | str = new Double(row.getDouble(index)).toString(); |
148 | - } else if (type == DataType.cint()) { | 150 | + } else if (type.getProtocolCode() == ProtocolConstants.DataType.INT) { |
149 | str = new Integer(row.getInt(index)).toString(); | 151 | str = new Integer(row.getInt(index)).toString(); |
150 | - } else if (type == DataType.bigint()) { | 152 | + } else if (type.getProtocolCode() == ProtocolConstants.DataType.BIGINT) { |
151 | str = new Long(row.getLong(index)).toString(); | 153 | str = new Long(row.getLong(index)).toString(); |
152 | - } else if (type == DataType.uuid()) { | ||
153 | - str = row.getUUID(index).toString(); | ||
154 | - } else if (type == DataType.timeuuid()) { | ||
155 | - str = row.getUUID(index).toString(); | ||
156 | - } else if (type == DataType.cfloat()) { | 154 | + } else if (type.getProtocolCode() == ProtocolConstants.DataType.UUID) { |
155 | + str = row.getUuid(index).toString(); | ||
156 | + } else if (type.getProtocolCode() == ProtocolConstants.DataType.TIMEUUID) { | ||
157 | + str = row.getUuid(index).toString(); | ||
158 | + } else if (type.getProtocolCode() == ProtocolConstants.DataType.FLOAT) { | ||
157 | str = new Float(row.getFloat(index)).toString(); | 159 | str = new Float(row.getFloat(index)).toString(); |
158 | - } else if (type == DataType.timestamp()) { | ||
159 | - str = ""+row.getTimestamp(index).getTime(); | 160 | + } else if (type.getProtocolCode() == ProtocolConstants.DataType.TIMESTAMP) { |
161 | + str = ""+row.getInstant(index).toEpochMilli(); | ||
160 | } else { | 162 | } else { |
161 | str = row.getString(index); | 163 | str = row.getString(index); |
162 | } | 164 | } |
@@ -186,27 +188,27 @@ public class CassandraDbHelper { | @@ -186,27 +188,27 @@ public class CassandraDbHelper { | ||
186 | } | 188 | } |
187 | 189 | ||
188 | private static void setColumnValue(TableMetadata tableMetadata, String column, | 190 | private static void setColumnValue(TableMetadata tableMetadata, String column, |
189 | - CSVRecord record, BoundStatement boundStatement) { | 191 | + CSVRecord record, BoundStatementBuilder boundStatementBuilder) { |
190 | String value = record.get(column); | 192 | String value = record.get(column); |
191 | - DataType type = tableMetadata.getColumn(column).getType(); | 193 | + DataType type = tableMetadata.getColumn(column).get().getType(); |
192 | if (value == null) { | 194 | if (value == null) { |
193 | - boundStatement.setToNull(column); | ||
194 | - } else if (type == DataType.cdouble()) { | ||
195 | - boundStatement.setDouble(column, Double.valueOf(value)); | ||
196 | - } else if (type == DataType.cint()) { | ||
197 | - boundStatement.setInt(column, Integer.valueOf(value)); | ||
198 | - } else if (type == DataType.bigint()) { | ||
199 | - boundStatement.setLong(column, Long.valueOf(value)); | ||
200 | - } else if (type == DataType.uuid()) { | ||
201 | - boundStatement.setUUID(column, UUID.fromString(value)); | ||
202 | - } else if (type == DataType.timeuuid()) { | ||
203 | - boundStatement.setUUID(column, UUID.fromString(value)); | ||
204 | - } else if (type == DataType.cfloat()) { | ||
205 | - boundStatement.setFloat(column, Float.valueOf(value)); | ||
206 | - } else if (type == DataType.timestamp()) { | ||
207 | - boundStatement.setTimestamp(column, new Date(Long.valueOf(value))); | 195 | + boundStatementBuilder.setToNull(column); |
196 | + } else if (type.getProtocolCode() == ProtocolConstants.DataType.DOUBLE) { | ||
197 | + boundStatementBuilder.setDouble(column, Double.valueOf(value)); | ||
198 | + } else if (type.getProtocolCode() == ProtocolConstants.DataType.INT) { | ||
199 | + boundStatementBuilder.setInt(column, Integer.valueOf(value)); | ||
200 | + } else if (type.getProtocolCode() == ProtocolConstants.DataType.BIGINT) { | ||
201 | + boundStatementBuilder.setLong(column, Long.valueOf(value)); | ||
202 | + } else if (type.getProtocolCode() == ProtocolConstants.DataType.UUID) { | ||
203 | + boundStatementBuilder.setUuid(column, UUID.fromString(value)); | ||
204 | + } else if (type.getProtocolCode() == ProtocolConstants.DataType.TIMEUUID) { | ||
205 | + boundStatementBuilder.setUuid(column, UUID.fromString(value)); | ||
206 | + } else if (type.getProtocolCode() == ProtocolConstants.DataType.FLOAT) { | ||
207 | + boundStatementBuilder.setFloat(column, Float.valueOf(value)); | ||
208 | + } else if (type.getProtocolCode() == ProtocolConstants.DataType.TIMESTAMP) { | ||
209 | + boundStatementBuilder.setInstant(column, Instant.ofEpochMilli(Long.valueOf(value))); | ||
208 | } else { | 210 | } else { |
209 | - boundStatement.setString(column, value); | 211 | + boundStatementBuilder.setString(column, value); |
210 | } | 212 | } |
211 | } | 213 | } |
212 | 214 |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.service.install.migrate; | 16 | package org.thingsboard.server.service.install.migrate; |
17 | 17 | ||
18 | -import com.datastax.driver.core.Row; | 18 | +import com.datastax.oss.driver.api.core.cql.Row; |
19 | import lombok.Data; | 19 | import lombok.Data; |
20 | import org.thingsboard.server.common.data.UUIDConverter; | 20 | import org.thingsboard.server.common.data.UUIDConverter; |
21 | 21 | ||
@@ -105,7 +105,7 @@ public class CassandraToSqlColumn { | @@ -105,7 +105,7 @@ public class CassandraToSqlColumn { | ||
105 | } else { | 105 | } else { |
106 | switch (this.type) { | 106 | switch (this.type) { |
107 | case ID: | 107 | case ID: |
108 | - return UUIDConverter.fromTimeUUID(row.getUUID(index)); | 108 | + return UUIDConverter.fromTimeUUID(row.getUuid(index)); |
109 | case DOUBLE: | 109 | case DOUBLE: |
110 | return Double.toString(row.getDouble(index)); | 110 | return Double.toString(row.getDouble(index)); |
111 | case INTEGER: | 111 | case INTEGER: |
@@ -115,7 +115,7 @@ public class CassandraToSqlColumn { | @@ -115,7 +115,7 @@ public class CassandraToSqlColumn { | ||
115 | case BIGINT: | 115 | case BIGINT: |
116 | return Long.toString(row.getLong(index)); | 116 | return Long.toString(row.getLong(index)); |
117 | case BOOLEAN: | 117 | case BOOLEAN: |
118 | - return Boolean.toString(row.getBool(index)); | 118 | + return Boolean.toString(row.getBoolean(index)); |
119 | case STRING: | 119 | case STRING: |
120 | case JSON: | 120 | case JSON: |
121 | case ENUM_TO_INT: | 121 | case ENUM_TO_INT: |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.service.install.migrate; | 16 | package org.thingsboard.server.service.install.migrate; |
17 | 17 | ||
18 | -import com.datastax.driver.core.Row; | 18 | +import com.datastax.oss.driver.api.core.cql.Row; |
19 | 19 | ||
20 | import java.util.UUID; | 20 | import java.util.UUID; |
21 | 21 | ||
@@ -29,7 +29,7 @@ public class CassandraToSqlEventTsColumn extends CassandraToSqlColumn { | @@ -29,7 +29,7 @@ public class CassandraToSqlEventTsColumn extends CassandraToSqlColumn { | ||
29 | 29 | ||
30 | @Override | 30 | @Override |
31 | public String getColumnValue(Row row) { | 31 | public String getColumnValue(Row row) { |
32 | - UUID id = row.getUUID(getIndex()); | 32 | + UUID id = row.getUuid(getIndex()); |
33 | long ts = getTs(id); | 33 | long ts = getTs(id); |
34 | return ts + ""; | 34 | return ts + ""; |
35 | } | 35 | } |
@@ -37,4 +37,4 @@ public class CassandraToSqlEventTsColumn extends CassandraToSqlColumn { | @@ -37,4 +37,4 @@ public class CassandraToSqlEventTsColumn extends CassandraToSqlColumn { | ||
37 | private long getTs(UUID uuid) { | 37 | private long getTs(UUID uuid) { |
38 | return (uuid.timestamp() - EPOCH_DIFF) / 10000; | 38 | return (uuid.timestamp() - EPOCH_DIFF) / 10000; |
39 | } | 39 | } |
40 | -} | ||
40 | +} |
@@ -15,20 +15,17 @@ | @@ -15,20 +15,17 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.service.install.migrate; | 16 | package org.thingsboard.server.service.install.migrate; |
17 | 17 | ||
18 | -import com.datastax.driver.core.ResultSet; | ||
19 | -import com.datastax.driver.core.Row; | ||
20 | -import com.datastax.driver.core.Session; | ||
21 | -import com.datastax.driver.core.SimpleStatement; | ||
22 | -import com.datastax.driver.core.Statement; | 18 | +import com.datastax.oss.driver.api.core.cql.ResultSet; |
19 | +import com.datastax.oss.driver.api.core.cql.Row; | ||
20 | +import com.datastax.oss.driver.api.core.cql.SimpleStatement; | ||
21 | +import com.datastax.oss.driver.api.core.cql.Statement; | ||
23 | import lombok.Data; | 22 | import lombok.Data; |
24 | import lombok.extern.slf4j.Slf4j; | 23 | import lombok.extern.slf4j.Slf4j; |
25 | -import org.hibernate.exception.ConstraintViolationException; | ||
26 | import org.hibernate.internal.util.JdbcExceptionHelper; | 24 | import org.hibernate.internal.util.JdbcExceptionHelper; |
27 | import org.postgresql.util.PSQLException; | 25 | import org.postgresql.util.PSQLException; |
28 | import org.thingsboard.server.common.data.UUIDConverter; | 26 | import org.thingsboard.server.common.data.UUIDConverter; |
29 | -import org.thingsboard.server.dao.exception.DataValidationException; | 27 | +import org.thingsboard.server.dao.cassandra.guava.GuavaSession; |
30 | 28 | ||
31 | -import java.sql.BatchUpdateException; | ||
32 | import java.sql.Connection; | 29 | import java.sql.Connection; |
33 | import java.sql.DatabaseMetaData; | 30 | import java.sql.DatabaseMetaData; |
34 | import java.sql.PreparedStatement; | 31 | import java.sql.PreparedStatement; |
@@ -38,7 +35,6 @@ import java.util.Arrays; | @@ -38,7 +35,6 @@ import java.util.Arrays; | ||
38 | import java.util.Iterator; | 35 | import java.util.Iterator; |
39 | import java.util.List; | 36 | import java.util.List; |
40 | import java.util.Optional; | 37 | import java.util.Optional; |
41 | -import java.util.stream.Collectors; | ||
42 | 38 | ||
43 | @Data | 39 | @Data |
44 | @Slf4j | 40 | @Slf4j |
@@ -78,7 +74,7 @@ public class CassandraToSqlTable { | @@ -78,7 +74,7 @@ public class CassandraToSqlTable { | ||
78 | } | 74 | } |
79 | } | 75 | } |
80 | 76 | ||
81 | - public void migrateToSql(Session session, Connection conn) throws SQLException { | 77 | + public void migrateToSql(GuavaSession session, Connection conn) throws SQLException { |
82 | log.info("[{}] Migrating data from cassandra '{}' Column Family to '{}' SQL table...", this.sqlTableName, this.cassandraCf, this.sqlTableName); | 78 | log.info("[{}] Migrating data from cassandra '{}' Column Family to '{}' SQL table...", this.sqlTableName, this.cassandraCf, this.sqlTableName); |
83 | DatabaseMetaData metadata = conn.getMetaData(); | 79 | DatabaseMetaData metadata = conn.getMetaData(); |
84 | java.sql.ResultSet resultSet = metadata.getColumns(null, null, this.sqlTableName, null); | 80 | java.sql.ResultSet resultSet = metadata.getColumns(null, null, this.sqlTableName, null); |
@@ -92,7 +88,7 @@ public class CassandraToSqlTable { | @@ -92,7 +88,7 @@ public class CassandraToSqlTable { | ||
92 | } | 88 | } |
93 | this.sqlInsertStatement = createSqlInsertStatement(conn); | 89 | this.sqlInsertStatement = createSqlInsertStatement(conn); |
94 | Statement cassandraSelectStatement = createCassandraSelectStatement(); | 90 | Statement cassandraSelectStatement = createCassandraSelectStatement(); |
95 | - cassandraSelectStatement.setFetchSize(100); | 91 | + cassandraSelectStatement.setPageSize(100); |
96 | ResultSet rs = session.execute(cassandraSelectStatement); | 92 | ResultSet rs = session.execute(cassandraSelectStatement); |
97 | Iterator<Row> iter = rs.iterator(); | 93 | Iterator<Row> iter = rs.iterator(); |
98 | int rowCounter = 0; | 94 | int rowCounter = 0; |
@@ -281,7 +277,7 @@ public class CassandraToSqlTable { | @@ -281,7 +277,7 @@ public class CassandraToSqlTable { | ||
281 | } | 277 | } |
282 | selectStatementBuilder.deleteCharAt(selectStatementBuilder.length() - 1); | 278 | selectStatementBuilder.deleteCharAt(selectStatementBuilder.length() - 1); |
283 | selectStatementBuilder.append(" FROM ").append(cassandraCf); | 279 | selectStatementBuilder.append(" FROM ").append(cassandraCf); |
284 | - return new SimpleStatement(selectStatementBuilder.toString()); | 280 | + return SimpleStatement.newInstance(selectStatementBuilder.toString()); |
285 | } | 281 | } |
286 | 282 | ||
287 | private PreparedStatement createSqlInsertStatement(Connection conn) throws SQLException { | 283 | private PreparedStatement createSqlInsertStatement(Connection conn) throws SQLException { |
@@ -176,9 +176,9 @@ cassandra: | @@ -176,9 +176,9 @@ cassandra: | ||
176 | # Enable/disable secure connection | 176 | # Enable/disable secure connection |
177 | ssl: "${CASSANDRA_USE_SSL:false}" | 177 | ssl: "${CASSANDRA_USE_SSL:false}" |
178 | # Enable/disable JMX | 178 | # Enable/disable JMX |
179 | - jmx: "${CASSANDRA_USE_JMX:true}" | 179 | + jmx: "${CASSANDRA_USE_JMX:false}" |
180 | # Enable/disable metrics collection. | 180 | # Enable/disable metrics collection. |
181 | - metrics: "${CASSANDRA_DISABLE_METRICS:true}" | 181 | + metrics: "${CASSANDRA_USE_METRICS:false}" |
182 | # NONE SNAPPY LZ4 | 182 | # NONE SNAPPY LZ4 |
183 | compression: "${CASSANDRA_COMPRESSION:none}" | 183 | compression: "${CASSANDRA_COMPRESSION:none}" |
184 | # Specify cassandra cluster initialization timeout in milliseconds (if no hosts available during startup) | 184 | # Specify cassandra cluster initialization timeout in milliseconds (if no hosts available during startup) |
@@ -258,11 +258,11 @@ sql: | @@ -258,11 +258,11 @@ sql: | ||
258 | ttl: | 258 | ttl: |
259 | ts: | 259 | ts: |
260 | enabled: "${SQL_TTL_TS_ENABLED:true}" | 260 | enabled: "${SQL_TTL_TS_ENABLED:true}" |
261 | - execution_interval_ms: "${SQL_TTL_TS_EXECUTION_INTERVAL:86400000}" # Number of miliseconds. The current value corresponds to one day | 261 | + execution_interval_ms: "${SQL_TTL_TS_EXECUTION_INTERVAL:86400000}" # Number of milliseconds. The current value corresponds to one day |
262 | ts_key_value_ttl: "${SQL_TTL_TS_TS_KEY_VALUE_TTL:0}" # Number of seconds | 262 | ts_key_value_ttl: "${SQL_TTL_TS_TS_KEY_VALUE_TTL:0}" # Number of seconds |
263 | events: | 263 | events: |
264 | enabled: "${SQL_TTL_EVENTS_ENABLED:true}" | 264 | enabled: "${SQL_TTL_EVENTS_ENABLED:true}" |
265 | - execution_interval_ms: "${SQL_TTL_EVENTS_EXECUTION_INTERVAL:86400000}" # Number of miliseconds. The current value corresponds to one day | 265 | + execution_interval_ms: "${SQL_TTL_EVENTS_EXECUTION_INTERVAL:86400000}" # Number of milliseconds. The current value corresponds to one day |
266 | events_ttl: "${SQL_TTL_EVENTS_EVENTS_TTL:0}" # Number of seconds | 266 | events_ttl: "${SQL_TTL_EVENTS_EVENTS_TTL:0}" # Number of seconds |
267 | debug_events_ttl: "${SQL_TTL_EVENTS_DEBUG_EVENTS_TTL:604800}" # Number of seconds. The current value corresponds to one week | 267 | debug_events_ttl: "${SQL_TTL_EVENTS_DEBUG_EVENTS_TTL:604800}" # Number of seconds. The current value corresponds to one week |
268 | 268 | ||
@@ -583,6 +583,9 @@ queue: | @@ -583,6 +583,9 @@ queue: | ||
583 | linger.ms: "${TB_KAFKA_LINGER_MS:1}" | 583 | linger.ms: "${TB_KAFKA_LINGER_MS:1}" |
584 | buffer.memory: "${TB_BUFFER_MEMORY:33554432}" | 584 | buffer.memory: "${TB_BUFFER_MEMORY:33554432}" |
585 | replication_factor: "${TB_QUEUE_KAFKA_REPLICATION_FACTOR:1}" | 585 | replication_factor: "${TB_QUEUE_KAFKA_REPLICATION_FACTOR:1}" |
586 | + max_poll_records: "${TB_QUEUE_KAFKA_MAX_POLL_RECORDS:8192}" | ||
587 | + max_partition_fetch_bytes: "${TB_QUEUE_KAFKA_MAX_PARTITION_FETCH_BYTES:16777216}" | ||
588 | + fetch_max_bytes: "${TB_QUEUE_KAFKA_FETCH_MAX_BYTES:134217728}" | ||
586 | topic-properties: | 589 | topic-properties: |
587 | rule-engine: "${TB_QUEUE_KAFKA_RE_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:26214400;retention.bytes:1048576000}" | 590 | rule-engine: "${TB_QUEUE_KAFKA_RE_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:26214400;retention.bytes:1048576000}" |
588 | core: "${TB_QUEUE_KAFKA_CORE_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:26214400;retention.bytes:1048576000}" | 591 | core: "${TB_QUEUE_KAFKA_CORE_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:26214400;retention.bytes:1048576000}" |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.controller; | 16 | package org.thingsboard.server.controller; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.core.type.TypeReference; | 19 | import com.fasterxml.jackson.core.type.TypeReference; |
20 | import org.apache.commons.lang3.RandomStringUtils; | 20 | import org.apache.commons.lang3.RandomStringUtils; |
21 | import org.junit.After; | 21 | import org.junit.After; |
@@ -206,7 +206,7 @@ public abstract class BaseAssetControllerTest extends AbstractControllerTest { | @@ -206,7 +206,7 @@ public abstract class BaseAssetControllerTest extends AbstractControllerTest { | ||
206 | asset.setType("default"); | 206 | asset.setType("default"); |
207 | Asset savedAsset = doPost("/api/asset", asset, Asset.class); | 207 | Asset savedAsset = doPost("/api/asset", asset, Asset.class); |
208 | 208 | ||
209 | - doPost("/api/customer/" + UUIDs.timeBased().toString() | 209 | + doPost("/api/customer/" + Uuids.timeBased().toString() |
210 | + "/asset/" + savedAsset.getId().getId().toString()) | 210 | + "/asset/" + savedAsset.getId().getId().toString()) |
211 | .andExpect(status().isNotFound()); | 211 | .andExpect(status().isNotFound()); |
212 | } | 212 | } |
@@ -24,7 +24,7 @@ import java.util.ArrayList; | @@ -24,7 +24,7 @@ import java.util.ArrayList; | ||
24 | import java.util.Collections; | 24 | import java.util.Collections; |
25 | import java.util.List; | 25 | import java.util.List; |
26 | 26 | ||
27 | -import com.datastax.driver.core.utils.UUIDs; | 27 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
28 | import org.apache.commons.lang3.RandomStringUtils; | 28 | import org.apache.commons.lang3.RandomStringUtils; |
29 | import org.thingsboard.server.common.data.*; | 29 | import org.thingsboard.server.common.data.*; |
30 | import org.thingsboard.server.common.data.id.CustomerId; | 30 | import org.thingsboard.server.common.data.id.CustomerId; |
@@ -158,7 +158,7 @@ public abstract class BaseDashboardControllerTest extends AbstractControllerTest | @@ -158,7 +158,7 @@ public abstract class BaseDashboardControllerTest extends AbstractControllerTest | ||
158 | dashboard.setTitle("My dashboard"); | 158 | dashboard.setTitle("My dashboard"); |
159 | Dashboard savedDashboard = doPost("/api/dashboard", dashboard, Dashboard.class); | 159 | Dashboard savedDashboard = doPost("/api/dashboard", dashboard, Dashboard.class); |
160 | 160 | ||
161 | - doPost("/api/customer/" + UUIDs.timeBased().toString() | 161 | + doPost("/api/customer/" + Uuids.timeBased().toString() |
162 | + "/dashboard/" + savedDashboard.getId().getId().toString()) | 162 | + "/dashboard/" + savedDashboard.getId().getId().toString()) |
163 | .andExpect(status().isNotFound()); | 163 | .andExpect(status().isNotFound()); |
164 | } | 164 | } |
@@ -23,7 +23,7 @@ import java.util.ArrayList; | @@ -23,7 +23,7 @@ import java.util.ArrayList; | ||
23 | import java.util.Collections; | 23 | import java.util.Collections; |
24 | import java.util.List; | 24 | import java.util.List; |
25 | 25 | ||
26 | -import com.datastax.driver.core.utils.UUIDs; | 26 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
27 | import org.apache.commons.lang3.RandomStringUtils; | 27 | import org.apache.commons.lang3.RandomStringUtils; |
28 | import org.thingsboard.server.common.data.*; | 28 | import org.thingsboard.server.common.data.*; |
29 | import org.thingsboard.server.common.data.id.CustomerId; | 29 | import org.thingsboard.server.common.data.id.CustomerId; |
@@ -215,7 +215,7 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest { | @@ -215,7 +215,7 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest { | ||
215 | device.setType("default"); | 215 | device.setType("default"); |
216 | Device savedDevice = doPost("/api/device", device, Device.class); | 216 | Device savedDevice = doPost("/api/device", device, Device.class); |
217 | 217 | ||
218 | - doPost("/api/customer/" + UUIDs.timeBased().toString() | 218 | + doPost("/api/customer/" + Uuids.timeBased().toString() |
219 | + "/device/" + savedDevice.getId().getId().toString()) | 219 | + "/device/" + savedDevice.getId().getId().toString()) |
220 | .andExpect(status().isNotFound()); | 220 | .andExpect(status().isNotFound()); |
221 | } | 221 | } |
@@ -333,7 +333,7 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest { | @@ -333,7 +333,7 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest { | ||
333 | Device savedDevice = doPost("/api/device", device, Device.class); | 333 | Device savedDevice = doPost("/api/device", device, Device.class); |
334 | DeviceCredentials deviceCredentials = | 334 | DeviceCredentials deviceCredentials = |
335 | doGet("/api/device/" + savedDevice.getId().getId().toString() + "/credentials", DeviceCredentials.class); | 335 | doGet("/api/device/" + savedDevice.getId().getId().toString() + "/credentials", DeviceCredentials.class); |
336 | - DeviceCredentials newDeviceCredentials = new DeviceCredentials(new DeviceCredentialsId(UUIDs.timeBased())); | 336 | + DeviceCredentials newDeviceCredentials = new DeviceCredentials(new DeviceCredentialsId(Uuids.timeBased())); |
337 | newDeviceCredentials.setCreatedTime(deviceCredentials.getCreatedTime()); | 337 | newDeviceCredentials.setCreatedTime(deviceCredentials.getCreatedTime()); |
338 | newDeviceCredentials.setDeviceId(deviceCredentials.getDeviceId()); | 338 | newDeviceCredentials.setDeviceId(deviceCredentials.getDeviceId()); |
339 | newDeviceCredentials.setCredentialsType(deviceCredentials.getCredentialsType()); | 339 | newDeviceCredentials.setCredentialsType(deviceCredentials.getCredentialsType()); |
@@ -351,7 +351,7 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest { | @@ -351,7 +351,7 @@ public abstract class BaseDeviceControllerTest extends AbstractControllerTest { | ||
351 | Device savedDevice = doPost("/api/device", device, Device.class); | 351 | Device savedDevice = doPost("/api/device", device, Device.class); |
352 | DeviceCredentials deviceCredentials = | 352 | DeviceCredentials deviceCredentials = |
353 | doGet("/api/device/" + savedDevice.getId().getId().toString() + "/credentials", DeviceCredentials.class); | 353 | doGet("/api/device/" + savedDevice.getId().getId().toString() + "/credentials", DeviceCredentials.class); |
354 | - deviceCredentials.setDeviceId(new DeviceId(UUIDs.timeBased())); | 354 | + deviceCredentials.setDeviceId(new DeviceId(Uuids.timeBased())); |
355 | doPost("/api/device/credentials", deviceCredentials) | 355 | doPost("/api/device/credentials", deviceCredentials) |
356 | .andExpect(status().isNotFound()); | 356 | .andExpect(status().isNotFound()); |
357 | } | 357 | } |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.controller; | 16 | package org.thingsboard.server.controller; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.core.type.TypeReference; | 19 | import com.fasterxml.jackson.core.type.TypeReference; |
20 | import lombok.extern.slf4j.Slf4j; | 20 | import lombok.extern.slf4j.Slf4j; |
21 | import org.apache.commons.lang3.RandomStringUtils; | 21 | import org.apache.commons.lang3.RandomStringUtils; |
@@ -176,7 +176,7 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes | @@ -176,7 +176,7 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes | ||
176 | @Test | 176 | @Test |
177 | public void testAssignEntityViewToNonExistentCustomer() throws Exception { | 177 | public void testAssignEntityViewToNonExistentCustomer() throws Exception { |
178 | EntityView savedView = getNewSavedEntityView("Test entity view"); | 178 | EntityView savedView = getNewSavedEntityView("Test entity view"); |
179 | - doPost("/api/customer/" + UUIDs.timeBased().toString() + "/device/" + savedView.getId().getId().toString()) | 179 | + doPost("/api/customer/" + Uuids.timeBased().toString() + "/device/" + savedView.getId().getId().toString()) |
180 | .andExpect(status().isNotFound()); | 180 | .andExpect(status().isNotFound()); |
181 | } | 181 | } |
182 | 182 |
@@ -34,7 +34,7 @@ public class MqttNoSqlTestSuite { | @@ -34,7 +34,7 @@ public class MqttNoSqlTestSuite { | ||
34 | @ClassRule | 34 | @ClassRule |
35 | public static CustomSqlUnit sqlUnit = new CustomSqlUnit( | 35 | public static CustomSqlUnit sqlUnit = new CustomSqlUnit( |
36 | Arrays.asList("sql/schema-entities-hsql.sql", "sql/system-data.sql"), | 36 | Arrays.asList("sql/schema-entities-hsql.sql", "sql/system-data.sql"), |
37 | - "sql/drop-all-tables.sql", | 37 | + "sql/hsql/drop-all-tables.sql", |
38 | "nosql-test.properties"); | 38 | "nosql-test.properties"); |
39 | 39 | ||
40 | @ClassRule | 40 | @ClassRule |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.mqtt.rpc; | 16 | package org.thingsboard.server.mqtt.rpc; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import io.netty.handler.codec.mqtt.MqttQoS; | 19 | import io.netty.handler.codec.mqtt.MqttQoS; |
20 | import lombok.extern.slf4j.Slf4j; | 20 | import lombok.extern.slf4j.Slf4j; |
21 | import org.apache.commons.lang3.StringUtils; | 21 | import org.apache.commons.lang3.StringUtils; |
@@ -143,7 +143,7 @@ public abstract class AbstractMqttServerSideRpcIntegrationTest extends AbstractC | @@ -143,7 +143,7 @@ public abstract class AbstractMqttServerSideRpcIntegrationTest extends AbstractC | ||
143 | @Test | 143 | @Test |
144 | public void testServerMqttOneWayRpcDeviceDoesNotExist() throws Exception { | 144 | public void testServerMqttOneWayRpcDeviceDoesNotExist() throws Exception { |
145 | String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"25\",\"value\": 1}}"; | 145 | String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"25\",\"value\": 1}}"; |
146 | - String nonExistentDeviceId = UUIDs.timeBased().toString(); | 146 | + String nonExistentDeviceId = Uuids.timeBased().toString(); |
147 | 147 | ||
148 | String result = doPostAsync("/api/plugins/rpc/oneway/" + nonExistentDeviceId, setGpioRequest, String.class, | 148 | String result = doPostAsync("/api/plugins/rpc/oneway/" + nonExistentDeviceId, setGpioRequest, String.class, |
149 | status().isNotFound()); | 149 | status().isNotFound()); |
@@ -200,7 +200,7 @@ public abstract class AbstractMqttServerSideRpcIntegrationTest extends AbstractC | @@ -200,7 +200,7 @@ public abstract class AbstractMqttServerSideRpcIntegrationTest extends AbstractC | ||
200 | @Test | 200 | @Test |
201 | public void testServerMqttTwoWayRpcDeviceDoesNotExist() throws Exception { | 201 | public void testServerMqttTwoWayRpcDeviceDoesNotExist() throws Exception { |
202 | String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"28\",\"value\": 1}}"; | 202 | String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"28\",\"value\": 1}}"; |
203 | - String nonExistentDeviceId = UUIDs.timeBased().toString(); | 203 | + String nonExistentDeviceId = Uuids.timeBased().toString(); |
204 | 204 | ||
205 | String result = doPostAsync("/api/plugins/rpc/twoway/" + nonExistentDeviceId, setGpioRequest, String.class, | 205 | String result = doPostAsync("/api/plugins/rpc/twoway/" + nonExistentDeviceId, setGpioRequest, String.class, |
206 | status().isNotFound()); | 206 | status().isNotFound()); |
@@ -16,7 +16,6 @@ | @@ -16,7 +16,6 @@ | ||
16 | package org.thingsboard.server.rules.flow; | 16 | package org.thingsboard.server.rules.flow; |
17 | 17 | ||
18 | import akka.actor.ActorRef; | 18 | import akka.actor.ActorRef; |
19 | -import com.datastax.driver.core.utils.UUIDs; | ||
20 | import lombok.extern.slf4j.Slf4j; | 19 | import lombok.extern.slf4j.Slf4j; |
21 | import org.junit.After; | 20 | import org.junit.After; |
22 | import org.junit.Assert; | 21 | import org.junit.Assert; |
@@ -16,7 +16,6 @@ | @@ -16,7 +16,6 @@ | ||
16 | package org.thingsboard.server.rules.lifecycle; | 16 | package org.thingsboard.server.rules.lifecycle; |
17 | 17 | ||
18 | import akka.actor.ActorRef; | 18 | import akka.actor.ActorRef; |
19 | -import com.datastax.driver.core.utils.UUIDs; | ||
20 | import lombok.extern.slf4j.Slf4j; | 19 | import lombok.extern.slf4j.Slf4j; |
21 | import org.junit.After; | 20 | import org.junit.After; |
22 | import org.junit.Assert; | 21 | import org.junit.Assert; |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.service.cluster.routing; | 16 | package org.thingsboard.server.service.cluster.routing; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import lombok.extern.slf4j.Slf4j; | 19 | import lombok.extern.slf4j.Slf4j; |
20 | import org.junit.Assert; | 20 | import org.junit.Assert; |
21 | import org.junit.Before; | 21 | import org.junit.Before; |
@@ -101,7 +101,7 @@ public class HashPartitionServiceTest { | @@ -101,7 +101,7 @@ public class HashPartitionServiceTest { | ||
101 | public void testDispersionOnMillionDevices() { | 101 | public void testDispersionOnMillionDevices() { |
102 | List<DeviceId> devices = new ArrayList<>(); | 102 | List<DeviceId> devices = new ArrayList<>(); |
103 | for (int i = 0; i < ITERATIONS; i++) { | 103 | for (int i = 0; i < ITERATIONS; i++) { |
104 | - devices.add(new DeviceId(UUIDs.timeBased())); | 104 | + devices.add(new DeviceId(Uuids.timeBased())); |
105 | } | 105 | } |
106 | testDevicesDispersion(devices); | 106 | testDevicesDispersion(devices); |
107 | } | 107 | } |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.service.script; | 16 | package org.thingsboard.server.service.script; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.google.common.collect.Sets; | 19 | import com.google.common.collect.Sets; |
20 | import org.junit.After; | 20 | import org.junit.After; |
21 | import org.junit.Before; | 21 | import org.junit.Before; |
@@ -41,7 +41,7 @@ public class RuleNodeJsScriptEngineTest { | @@ -41,7 +41,7 @@ public class RuleNodeJsScriptEngineTest { | ||
41 | private ScriptEngine scriptEngine; | 41 | private ScriptEngine scriptEngine; |
42 | private TestNashornJsInvokeService jsSandboxService; | 42 | private TestNashornJsInvokeService jsSandboxService; |
43 | 43 | ||
44 | - private EntityId ruleNodeId = new RuleNodeId(UUIDs.timeBased()); | 44 | + private EntityId ruleNodeId = new RuleNodeId(Uuids.timeBased()); |
45 | 45 | ||
46 | @Before | 46 | @Before |
47 | public void beforeTest() throws Exception { | 47 | public void beforeTest() throws Exception { |
@@ -247,4 +247,4 @@ public class RuleNodeJsScriptEngineTest { | @@ -247,4 +247,4 @@ public class RuleNodeJsScriptEngineTest { | ||
247 | } | 247 | } |
248 | } | 248 | } |
249 | 249 | ||
250 | -} | ||
250 | +} |
@@ -78,18 +78,13 @@ | @@ -78,18 +78,13 @@ | ||
78 | <scope>provided</scope> | 78 | <scope>provided</scope> |
79 | </dependency> | 79 | </dependency> |
80 | <dependency> | 80 | <dependency> |
81 | - <groupId>com.datastax.cassandra</groupId> | ||
82 | - <artifactId>cassandra-driver-core</artifactId> | 81 | + <groupId>com.datastax.oss</groupId> |
82 | + <artifactId>java-driver-core</artifactId> | ||
83 | <scope>provided</scope> | 83 | <scope>provided</scope> |
84 | </dependency> | 84 | </dependency> |
85 | <dependency> | 85 | <dependency> |
86 | - <groupId>com.datastax.cassandra</groupId> | ||
87 | - <artifactId>cassandra-driver-mapping</artifactId> | ||
88 | - <scope>provided</scope> | ||
89 | - </dependency> | ||
90 | - <dependency> | ||
91 | - <groupId>com.datastax.cassandra</groupId> | ||
92 | - <artifactId>cassandra-driver-extras</artifactId> | 86 | + <groupId>io.dropwizard.metrics</groupId> |
87 | + <artifactId>metrics-jmx</artifactId> | ||
93 | <scope>provided</scope> | 88 | <scope>provided</scope> |
94 | </dependency> | 89 | </dependency> |
95 | <dependency> | 90 | <dependency> |
@@ -16,117 +16,50 @@ | @@ -16,117 +16,50 @@ | ||
16 | package org.thingsboard.server.dao.cassandra; | 16 | package org.thingsboard.server.dao.cassandra; |
17 | 17 | ||
18 | 18 | ||
19 | -import com.datastax.driver.core.Cluster; | ||
20 | -import com.datastax.driver.core.ConsistencyLevel; | ||
21 | -import com.datastax.driver.core.HostDistance; | ||
22 | -import com.datastax.driver.core.PoolingOptions; | ||
23 | -import com.datastax.driver.core.ProtocolOptions.Compression; | ||
24 | -import com.datastax.driver.core.Session; | ||
25 | -import com.datastax.driver.mapping.DefaultPropertyMapper; | ||
26 | -import com.datastax.driver.mapping.Mapper; | ||
27 | -import com.datastax.driver.mapping.MappingConfiguration; | ||
28 | -import com.datastax.driver.mapping.MappingManager; | ||
29 | -import com.datastax.driver.mapping.PropertyAccessStrategy; | 19 | +import com.codahale.metrics.MetricRegistry; |
20 | +import com.codahale.metrics.jmx.JmxReporter; | ||
21 | +import com.datastax.oss.driver.api.core.ConsistencyLevel; | ||
30 | import lombok.extern.slf4j.Slf4j; | 22 | import lombok.extern.slf4j.Slf4j; |
31 | -import org.apache.commons.lang3.StringUtils; | ||
32 | import org.springframework.beans.factory.annotation.Autowired; | 23 | import org.springframework.beans.factory.annotation.Autowired; |
33 | import org.springframework.beans.factory.annotation.Value; | 24 | import org.springframework.beans.factory.annotation.Value; |
34 | import org.springframework.core.env.Environment; | 25 | import org.springframework.core.env.Environment; |
26 | +import org.thingsboard.server.dao.cassandra.guava.GuavaSession; | ||
27 | +import org.thingsboard.server.dao.cassandra.guava.GuavaSessionBuilder; | ||
28 | +import org.thingsboard.server.dao.cassandra.guava.GuavaSessionUtils; | ||
35 | 29 | ||
36 | import javax.annotation.PreDestroy; | 30 | import javax.annotation.PreDestroy; |
37 | -import java.net.InetSocketAddress; | ||
38 | -import java.util.ArrayList; | ||
39 | -import java.util.Collections; | ||
40 | -import java.util.List; | ||
41 | 31 | ||
42 | @Slf4j | 32 | @Slf4j |
43 | public abstract class AbstractCassandraCluster { | 33 | public abstract class AbstractCassandraCluster { |
44 | 34 | ||
45 | - private static final String COMMA = ","; | ||
46 | - private static final String COLON = ":"; | ||
47 | - | ||
48 | - @Value("${cassandra.cluster_name}") | ||
49 | - private String clusterName; | ||
50 | - @Value("${cassandra.url}") | ||
51 | - private String url; | ||
52 | - @Value("${cassandra.compression}") | ||
53 | - private String compression; | ||
54 | - @Value("${cassandra.ssl}") | ||
55 | - private Boolean ssl; | ||
56 | @Value("${cassandra.jmx}") | 35 | @Value("${cassandra.jmx}") |
57 | private Boolean jmx; | 36 | private Boolean jmx; |
58 | @Value("${cassandra.metrics}") | 37 | @Value("${cassandra.metrics}") |
59 | private Boolean metrics; | 38 | private Boolean metrics; |
60 | - @Value("${cassandra.credentials}") | ||
61 | - private Boolean credentials; | ||
62 | - @Value("${cassandra.username}") | ||
63 | - private String username; | ||
64 | - @Value("${cassandra.password}") | ||
65 | - private String password; | ||
66 | - @Value("${cassandra.init_timeout_ms}") | ||
67 | - private long initTimeout; | ||
68 | - @Value("${cassandra.init_retry_interval_ms}") | ||
69 | - private long initRetryInterval; | ||
70 | - @Value("${cassandra.max_requests_per_connection_local:32768}") | ||
71 | - private int max_requests_local; | ||
72 | - @Value("${cassandra.max_requests_per_connection_remote:32768}") | ||
73 | - private int max_requests_remote; | ||
74 | 39 | ||
75 | @Autowired | 40 | @Autowired |
76 | - private CassandraSocketOptions socketOpts; | ||
77 | - | ||
78 | - @Autowired | ||
79 | - private CassandraQueryOptions queryOpts; | 41 | + private CassandraDriverOptions driverOptions; |
80 | 42 | ||
81 | @Autowired | 43 | @Autowired |
82 | private Environment environment; | 44 | private Environment environment; |
83 | 45 | ||
84 | - private Cluster cluster; | ||
85 | - private Cluster.Builder clusterBuilder; | 46 | + private GuavaSessionBuilder sessionBuilder; |
86 | 47 | ||
87 | - private Session session; | 48 | + private GuavaSession session; |
88 | 49 | ||
89 | - private MappingManager mappingManager; | ||
90 | - | ||
91 | - public <T> Mapper<T> getMapper(Class<T> clazz) { | ||
92 | - return mappingManager.mapper(clazz); | ||
93 | - } | 50 | + private JmxReporter reporter; |
94 | 51 | ||
95 | private String keyspaceName; | 52 | private String keyspaceName; |
96 | 53 | ||
97 | protected void init(String keyspaceName) { | 54 | protected void init(String keyspaceName) { |
98 | this.keyspaceName = keyspaceName; | 55 | this.keyspaceName = keyspaceName; |
99 | - this.clusterBuilder = Cluster.builder() | ||
100 | - .addContactPointsWithPorts(getContactPoints(url)) | ||
101 | - .withClusterName(clusterName) | ||
102 | - .withSocketOptions(socketOpts.getOpts()) | ||
103 | - .withPoolingOptions(new PoolingOptions() | ||
104 | - .setMaxRequestsPerConnection(HostDistance.LOCAL, max_requests_local) | ||
105 | - .setMaxRequestsPerConnection(HostDistance.REMOTE, max_requests_remote)); | ||
106 | - this.clusterBuilder.withQueryOptions(queryOpts.getOpts()); | ||
107 | - this.clusterBuilder.withCompression(StringUtils.isEmpty(compression) ? Compression.NONE : Compression.valueOf(compression.toUpperCase())); | ||
108 | - if (ssl) { | ||
109 | - this.clusterBuilder.withSSL(); | ||
110 | - } | ||
111 | - if (!jmx) { | ||
112 | - this.clusterBuilder.withoutJMXReporting(); | ||
113 | - } | ||
114 | - if (!metrics) { | ||
115 | - this.clusterBuilder.withoutMetrics(); | ||
116 | - } | ||
117 | - if (credentials) { | ||
118 | - this.clusterBuilder.withCredentials(username, password); | ||
119 | - } | 56 | + this.sessionBuilder = GuavaSessionUtils.builder().withConfigLoader(this.driverOptions.getLoader()); |
120 | if (!isInstall()) { | 57 | if (!isInstall()) { |
121 | initSession(); | 58 | initSession(); |
122 | } | 59 | } |
123 | } | 60 | } |
124 | 61 | ||
125 | - public Cluster getCluster() { | ||
126 | - return cluster; | ||
127 | - } | ||
128 | - | ||
129 | - public Session getSession() { | 62 | + public GuavaSession getSession() { |
130 | if (!isInstall()) { | 63 | if (!isInstall()) { |
131 | return session; | 64 | return session; |
132 | } else { | 65 | } else { |
@@ -146,64 +79,40 @@ public abstract class AbstractCassandraCluster { | @@ -146,64 +79,40 @@ public abstract class AbstractCassandraCluster { | ||
146 | } | 79 | } |
147 | 80 | ||
148 | private void initSession() { | 81 | private void initSession() { |
149 | - long endTime = System.currentTimeMillis() + initTimeout; | ||
150 | - while (System.currentTimeMillis() < endTime) { | ||
151 | - try { | ||
152 | - cluster = clusterBuilder.build(); | ||
153 | - cluster.init(); | ||
154 | - if (this.keyspaceName != null) { | ||
155 | - session = cluster.connect(keyspaceName); | ||
156 | - } else { | ||
157 | - session = cluster.connect(); | ||
158 | - } | ||
159 | -// For Cassandra Driver version 3.5.0 | ||
160 | - DefaultPropertyMapper propertyMapper = new DefaultPropertyMapper(); | ||
161 | - propertyMapper.setPropertyAccessStrategy(PropertyAccessStrategy.FIELDS); | ||
162 | - MappingConfiguration configuration = MappingConfiguration.builder().withPropertyMapper(propertyMapper).build(); | ||
163 | - mappingManager = new MappingManager(session, configuration); | ||
164 | -// For Cassandra Driver version 3.0.0 | ||
165 | -// mappingManager = new MappingManager(session); | ||
166 | - break; | ||
167 | - } catch (Exception e) { | ||
168 | - log.warn("Failed to initialize cassandra cluster due to {}. Will retry in {} ms", e.getMessage(), initRetryInterval); | ||
169 | - try { | ||
170 | - Thread.sleep(initRetryInterval); | ||
171 | - } catch (InterruptedException ie) { | ||
172 | - log.warn("Failed to wait until retry", ie); | ||
173 | - Thread.currentThread().interrupt(); | ||
174 | - } | ||
175 | - } | 82 | + if (this.keyspaceName != null) { |
83 | + this.sessionBuilder.withKeyspace(this.keyspaceName); | ||
84 | + } | ||
85 | + this.sessionBuilder.withLocalDatacenter("datacenter1"); | ||
86 | + session = sessionBuilder.build(); | ||
87 | + if (this.metrics && this.jmx) { | ||
88 | + MetricRegistry registry = | ||
89 | + session.getMetrics().orElseThrow( | ||
90 | + () -> new IllegalStateException("Metrics are disabled")) | ||
91 | + .getRegistry(); | ||
92 | + this.reporter = | ||
93 | + JmxReporter.forRegistry(registry) | ||
94 | + .inDomain("com.datastax.oss.driver") | ||
95 | + .build(); | ||
96 | + this.reporter.start(); | ||
176 | } | 97 | } |
177 | } | 98 | } |
178 | 99 | ||
179 | @PreDestroy | 100 | @PreDestroy |
180 | public void close() { | 101 | public void close() { |
181 | - if (cluster != null) { | ||
182 | - cluster.close(); | 102 | + if (reporter != null) { |
103 | + reporter.stop(); | ||
183 | } | 104 | } |
184 | - } | ||
185 | - | ||
186 | - private List<InetSocketAddress> getContactPoints(String url) { | ||
187 | - List<InetSocketAddress> result; | ||
188 | - if (StringUtils.isBlank(url)) { | ||
189 | - result = Collections.emptyList(); | ||
190 | - } else { | ||
191 | - result = new ArrayList<>(); | ||
192 | - for (String hostPort : url.split(COMMA)) { | ||
193 | - String host = hostPort.split(COLON)[0]; | ||
194 | - Integer port = Integer.valueOf(hostPort.split(COLON)[1]); | ||
195 | - result.add(new InetSocketAddress(host, port)); | ||
196 | - } | 105 | + if (session != null) { |
106 | + session.close(); | ||
197 | } | 107 | } |
198 | - return result; | ||
199 | } | 108 | } |
200 | 109 | ||
201 | public ConsistencyLevel getDefaultReadConsistencyLevel() { | 110 | public ConsistencyLevel getDefaultReadConsistencyLevel() { |
202 | - return queryOpts.getDefaultReadConsistencyLevel(); | 111 | + return driverOptions.getDefaultReadConsistencyLevel(); |
203 | } | 112 | } |
204 | 113 | ||
205 | public ConsistencyLevel getDefaultWriteConsistencyLevel() { | 114 | public ConsistencyLevel getDefaultWriteConsistencyLevel() { |
206 | - return queryOpts.getDefaultWriteConsistencyLevel(); | 115 | + return driverOptions.getDefaultWriteConsistencyLevel(); |
207 | } | 116 | } |
208 | 117 | ||
209 | } | 118 | } |
common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/CassandraDriverOptions.java
0 → 100644
1 | +/** | ||
2 | + * Copyright © 2016-2020 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.dao.cassandra; | ||
17 | + | ||
18 | +import com.datastax.oss.driver.api.core.ConsistencyLevel; | ||
19 | +import com.datastax.oss.driver.api.core.DefaultConsistencyLevel; | ||
20 | +import com.datastax.oss.driver.api.core.config.DefaultDriverOption; | ||
21 | +import com.datastax.oss.driver.api.core.config.DriverConfigLoader; | ||
22 | +import com.datastax.oss.driver.api.core.config.ProgrammaticDriverConfigLoaderBuilder; | ||
23 | +import com.datastax.oss.driver.api.core.metrics.DefaultSessionMetric; | ||
24 | +import com.datastax.oss.driver.api.core.metrics.DefaultNodeMetric; | ||
25 | +import lombok.Data; | ||
26 | +import org.apache.commons.lang3.StringUtils; | ||
27 | +import org.springframework.beans.factory.annotation.Value; | ||
28 | +import org.springframework.context.annotation.Configuration; | ||
29 | +import org.springframework.stereotype.Component; | ||
30 | +import org.thingsboard.server.dao.util.NoSqlAnyDao; | ||
31 | + | ||
32 | +import javax.annotation.PostConstruct; | ||
33 | +import java.time.Duration; | ||
34 | +import java.util.ArrayList; | ||
35 | +import java.util.Arrays; | ||
36 | +import java.util.Collections; | ||
37 | +import java.util.List; | ||
38 | + | ||
39 | +@Component | ||
40 | +@Configuration | ||
41 | +@Data | ||
42 | +@NoSqlAnyDao | ||
43 | +public class CassandraDriverOptions { | ||
44 | + | ||
45 | + private static final String COMMA = ","; | ||
46 | + | ||
47 | + @Value("${cassandra.cluster_name}") | ||
48 | + private String clusterName; | ||
49 | + @Value("${cassandra.url}") | ||
50 | + private String url; | ||
51 | + | ||
52 | + @Value("${cassandra.socket.connect_timeout}") | ||
53 | + private int connectTimeoutMillis; | ||
54 | + @Value("${cassandra.socket.read_timeout}") | ||
55 | + private int readTimeoutMillis; | ||
56 | + @Value("${cassandra.socket.keep_alive}") | ||
57 | + private Boolean keepAlive; | ||
58 | + @Value("${cassandra.socket.reuse_address}") | ||
59 | + private Boolean reuseAddress; | ||
60 | + @Value("${cassandra.socket.so_linger}") | ||
61 | + private Integer soLinger; | ||
62 | + @Value("${cassandra.socket.tcp_no_delay}") | ||
63 | + private Boolean tcpNoDelay; | ||
64 | + @Value("${cassandra.socket.receive_buffer_size}") | ||
65 | + private Integer receiveBufferSize; | ||
66 | + @Value("${cassandra.socket.send_buffer_size}") | ||
67 | + private Integer sendBufferSize; | ||
68 | + | ||
69 | + @Value("${cassandra.max_requests_per_connection_local:32768}") | ||
70 | + private int max_requests_local; | ||
71 | + @Value("${cassandra.max_requests_per_connection_remote:32768}") | ||
72 | + private int max_requests_remote; | ||
73 | + | ||
74 | + @Value("${cassandra.query.default_fetch_size}") | ||
75 | + private Integer defaultFetchSize; | ||
76 | + @Value("${cassandra.query.read_consistency_level}") | ||
77 | + private String readConsistencyLevel; | ||
78 | + @Value("${cassandra.query.write_consistency_level}") | ||
79 | + private String writeConsistencyLevel; | ||
80 | + | ||
81 | + @Value("${cassandra.compression}") | ||
82 | + private String compression; | ||
83 | + @Value("${cassandra.ssl}") | ||
84 | + private Boolean ssl; | ||
85 | + @Value("${cassandra.metrics}") | ||
86 | + private Boolean metrics; | ||
87 | + | ||
88 | + @Value("${cassandra.credentials}") | ||
89 | + private Boolean credentials; | ||
90 | + @Value("${cassandra.username}") | ||
91 | + private String username; | ||
92 | + @Value("${cassandra.password}") | ||
93 | + private String password; | ||
94 | + | ||
95 | + @Value("${cassandra.init_timeout_ms}") | ||
96 | + private long initTimeout; | ||
97 | + @Value("${cassandra.init_retry_interval_ms}") | ||
98 | + private long initRetryInterval; | ||
99 | + | ||
100 | + private DriverConfigLoader loader; | ||
101 | + | ||
102 | + private ConsistencyLevel defaultReadConsistencyLevel; | ||
103 | + private ConsistencyLevel defaultWriteConsistencyLevel; | ||
104 | + | ||
105 | + @PostConstruct | ||
106 | + public void initLoader() { | ||
107 | + ProgrammaticDriverConfigLoaderBuilder driverConfigBuilder = | ||
108 | + DriverConfigLoader.programmaticBuilder(); | ||
109 | + | ||
110 | + driverConfigBuilder | ||
111 | + .withStringList(DefaultDriverOption.CONTACT_POINTS, getContactPoints(url)) | ||
112 | + .withString(DefaultDriverOption.SESSION_NAME, clusterName); | ||
113 | + | ||
114 | + this.initSocketOptions(driverConfigBuilder); | ||
115 | + this.initPoolingOptions(driverConfigBuilder); | ||
116 | + this.initQueryOptions(driverConfigBuilder); | ||
117 | + | ||
118 | + driverConfigBuilder.withString(DefaultDriverOption.PROTOCOL_COMPRESSION, | ||
119 | + StringUtils.isEmpty(this.compression) ? "none" : this.compression.toLowerCase()); | ||
120 | + | ||
121 | + if (this.ssl) { | ||
122 | + driverConfigBuilder.withString(DefaultDriverOption.SSL_ENGINE_FACTORY_CLASS, | ||
123 | + "DefaultSslEngineFactory"); | ||
124 | + } | ||
125 | + | ||
126 | + if (this.metrics) { | ||
127 | + driverConfigBuilder.withStringList(DefaultDriverOption.METRICS_SESSION_ENABLED, | ||
128 | + Arrays.asList(DefaultSessionMetric.CONNECTED_NODES.getPath(), | ||
129 | + DefaultSessionMetric.CQL_REQUESTS.getPath())); | ||
130 | + driverConfigBuilder.withStringList(DefaultDriverOption.METRICS_NODE_ENABLED, | ||
131 | + Arrays.asList(DefaultNodeMetric.OPEN_CONNECTIONS.getPath(), | ||
132 | + DefaultNodeMetric.IN_FLIGHT.getPath())); | ||
133 | + } | ||
134 | + | ||
135 | + if (this.credentials) { | ||
136 | + driverConfigBuilder.withString(DefaultDriverOption.AUTH_PROVIDER_CLASS, | ||
137 | + "PlainTextAuthProvider"); | ||
138 | + driverConfigBuilder.withString(DefaultDriverOption.AUTH_PROVIDER_USER_NAME, | ||
139 | + this.username); | ||
140 | + driverConfigBuilder.withString(DefaultDriverOption.AUTH_PROVIDER_PASSWORD, | ||
141 | + this.password); | ||
142 | + } | ||
143 | + | ||
144 | + driverConfigBuilder.withBoolean(DefaultDriverOption.RECONNECT_ON_INIT, | ||
145 | + true); | ||
146 | + driverConfigBuilder.withString(DefaultDriverOption.RECONNECTION_POLICY_CLASS, | ||
147 | + "ExponentialReconnectionPolicy"); | ||
148 | + driverConfigBuilder.withDuration(DefaultDriverOption.RECONNECTION_BASE_DELAY, | ||
149 | + Duration.ofMillis(this.initRetryInterval)); | ||
150 | + driverConfigBuilder.withDuration(DefaultDriverOption.RECONNECTION_MAX_DELAY, | ||
151 | + Duration.ofMillis(this.initTimeout)); | ||
152 | + | ||
153 | + this.loader = driverConfigBuilder.build(); | ||
154 | + } | ||
155 | + | ||
156 | + protected ConsistencyLevel getDefaultReadConsistencyLevel() { | ||
157 | + if (defaultReadConsistencyLevel == null) { | ||
158 | + if (readConsistencyLevel != null) { | ||
159 | + defaultReadConsistencyLevel = DefaultConsistencyLevel.valueOf(readConsistencyLevel.toUpperCase()); | ||
160 | + } else { | ||
161 | + defaultReadConsistencyLevel = DefaultConsistencyLevel.ONE; | ||
162 | + } | ||
163 | + } | ||
164 | + return defaultReadConsistencyLevel; | ||
165 | + } | ||
166 | + | ||
167 | + protected ConsistencyLevel getDefaultWriteConsistencyLevel() { | ||
168 | + if (defaultWriteConsistencyLevel == null) { | ||
169 | + if (writeConsistencyLevel != null) { | ||
170 | + defaultWriteConsistencyLevel = DefaultConsistencyLevel.valueOf(writeConsistencyLevel.toUpperCase()); | ||
171 | + } else { | ||
172 | + defaultWriteConsistencyLevel = DefaultConsistencyLevel.ONE; | ||
173 | + } | ||
174 | + } | ||
175 | + return defaultWriteConsistencyLevel; | ||
176 | + } | ||
177 | + | ||
178 | + private void initSocketOptions(ProgrammaticDriverConfigLoaderBuilder driverConfigBuilder) { | ||
179 | + driverConfigBuilder.withDuration(DefaultDriverOption.CONNECTION_CONNECT_TIMEOUT, | ||
180 | + Duration.ofMillis(this.connectTimeoutMillis)); | ||
181 | + driverConfigBuilder.withDuration(DefaultDriverOption.REQUEST_TIMEOUT, | ||
182 | + Duration.ofMillis(this.readTimeoutMillis)); | ||
183 | + if (this.keepAlive != null) { | ||
184 | + driverConfigBuilder.withBoolean(DefaultDriverOption.SOCKET_KEEP_ALIVE, | ||
185 | + this.keepAlive); | ||
186 | + } | ||
187 | + if (this.reuseAddress != null) { | ||
188 | + driverConfigBuilder.withBoolean(DefaultDriverOption.SOCKET_REUSE_ADDRESS, | ||
189 | + this.reuseAddress); | ||
190 | + } | ||
191 | + if (this.soLinger != null) { | ||
192 | + driverConfigBuilder.withInt(DefaultDriverOption.SOCKET_LINGER_INTERVAL, | ||
193 | + this.soLinger); | ||
194 | + } | ||
195 | + if (this.tcpNoDelay != null) { | ||
196 | + driverConfigBuilder.withBoolean(DefaultDriverOption.SOCKET_TCP_NODELAY, | ||
197 | + this.tcpNoDelay); | ||
198 | + } | ||
199 | + if (this.receiveBufferSize != null) { | ||
200 | + driverConfigBuilder.withInt(DefaultDriverOption.SOCKET_RECEIVE_BUFFER_SIZE, | ||
201 | + this.receiveBufferSize); | ||
202 | + } | ||
203 | + if (this.sendBufferSize != null) { | ||
204 | + driverConfigBuilder.withInt(DefaultDriverOption.SOCKET_SEND_BUFFER_SIZE, | ||
205 | + this.sendBufferSize); | ||
206 | + } | ||
207 | + } | ||
208 | + | ||
209 | + private void initPoolingOptions(ProgrammaticDriverConfigLoaderBuilder driverConfigBuilder) { | ||
210 | + driverConfigBuilder.withInt(DefaultDriverOption.CONNECTION_MAX_REQUESTS, | ||
211 | + this.max_requests_local); | ||
212 | + } | ||
213 | + | ||
214 | + private void initQueryOptions(ProgrammaticDriverConfigLoaderBuilder driverConfigBuilder) { | ||
215 | + driverConfigBuilder.withInt(DefaultDriverOption.REQUEST_PAGE_SIZE, | ||
216 | + this.defaultFetchSize); | ||
217 | + } | ||
218 | + | ||
219 | + private List<String> getContactPoints(String url) { | ||
220 | + List<String> result; | ||
221 | + if (StringUtils.isBlank(url)) { | ||
222 | + result = Collections.emptyList(); | ||
223 | + } else { | ||
224 | + result = new ArrayList<>(); | ||
225 | + for (String hostPort : url.split(COMMA)) { | ||
226 | + result.add(hostPort); | ||
227 | + } | ||
228 | + } | ||
229 | + return result; | ||
230 | + } | ||
231 | + | ||
232 | +} |
common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/CassandraQueryOptions.java
deleted
100644 → 0
1 | -/** | ||
2 | - * Copyright © 2016-2020 The Thingsboard Authors | ||
3 | - * | ||
4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | - * you may not use this file except in compliance with the License. | ||
6 | - * You may obtain a copy of the License at | ||
7 | - * | ||
8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | - * | ||
10 | - * Unless required by applicable law or agreed to in writing, software | ||
11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | - * See the License for the specific language governing permissions and | ||
14 | - * limitations under the License. | ||
15 | - */ | ||
16 | -package org.thingsboard.server.dao.cassandra; | ||
17 | - | ||
18 | -import com.datastax.driver.core.ConsistencyLevel; | ||
19 | -import com.datastax.driver.core.QueryOptions; | ||
20 | -import lombok.Data; | ||
21 | -import org.springframework.beans.factory.annotation.Value; | ||
22 | -import org.springframework.context.annotation.Configuration; | ||
23 | -import org.springframework.stereotype.Component; | ||
24 | -import org.thingsboard.server.dao.util.NoSqlAnyDao; | ||
25 | - | ||
26 | -import javax.annotation.PostConstruct; | ||
27 | - | ||
28 | -@Component | ||
29 | -@Configuration | ||
30 | -@Data | ||
31 | -@NoSqlAnyDao | ||
32 | -public class CassandraQueryOptions { | ||
33 | - | ||
34 | - @Value("${cassandra.query.default_fetch_size}") | ||
35 | - private Integer defaultFetchSize; | ||
36 | - @Value("${cassandra.query.read_consistency_level}") | ||
37 | - private String readConsistencyLevel; | ||
38 | - @Value("${cassandra.query.write_consistency_level}") | ||
39 | - private String writeConsistencyLevel; | ||
40 | - | ||
41 | - private QueryOptions opts; | ||
42 | - | ||
43 | - private ConsistencyLevel defaultReadConsistencyLevel; | ||
44 | - private ConsistencyLevel defaultWriteConsistencyLevel; | ||
45 | - | ||
46 | - @PostConstruct | ||
47 | - public void initOpts(){ | ||
48 | - opts = new QueryOptions(); | ||
49 | - opts.setFetchSize(defaultFetchSize); | ||
50 | - } | ||
51 | - | ||
52 | - protected ConsistencyLevel getDefaultReadConsistencyLevel() { | ||
53 | - if (defaultReadConsistencyLevel == null) { | ||
54 | - if (readConsistencyLevel != null) { | ||
55 | - defaultReadConsistencyLevel = ConsistencyLevel.valueOf(readConsistencyLevel.toUpperCase()); | ||
56 | - } else { | ||
57 | - defaultReadConsistencyLevel = ConsistencyLevel.ONE; | ||
58 | - } | ||
59 | - } | ||
60 | - return defaultReadConsistencyLevel; | ||
61 | - } | ||
62 | - | ||
63 | - protected ConsistencyLevel getDefaultWriteConsistencyLevel() { | ||
64 | - if (defaultWriteConsistencyLevel == null) { | ||
65 | - if (writeConsistencyLevel != null) { | ||
66 | - defaultWriteConsistencyLevel = ConsistencyLevel.valueOf(writeConsistencyLevel.toUpperCase()); | ||
67 | - } else { | ||
68 | - defaultWriteConsistencyLevel = ConsistencyLevel.ONE; | ||
69 | - } | ||
70 | - } | ||
71 | - return defaultWriteConsistencyLevel; | ||
72 | - } | ||
73 | -} |
common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/CassandraSocketOptions.java
deleted
100644 → 0
1 | -/** | ||
2 | - * Copyright © 2016-2020 The Thingsboard Authors | ||
3 | - * | ||
4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | - * you may not use this file except in compliance with the License. | ||
6 | - * You may obtain a copy of the License at | ||
7 | - * | ||
8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | - * | ||
10 | - * Unless required by applicable law or agreed to in writing, software | ||
11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | - * See the License for the specific language governing permissions and | ||
14 | - * limitations under the License. | ||
15 | - */ | ||
16 | -package org.thingsboard.server.dao.cassandra; | ||
17 | - | ||
18 | -import com.datastax.driver.core.SocketOptions; | ||
19 | -import lombok.Data; | ||
20 | -import org.springframework.beans.factory.annotation.Value; | ||
21 | -import org.springframework.context.annotation.Configuration; | ||
22 | -import org.springframework.stereotype.Component; | ||
23 | -import org.thingsboard.server.dao.util.NoSqlAnyDao; | ||
24 | - | ||
25 | -import javax.annotation.PostConstruct; | ||
26 | - | ||
27 | -@Component | ||
28 | -@Configuration | ||
29 | -@Data | ||
30 | -@NoSqlAnyDao | ||
31 | -public class CassandraSocketOptions { | ||
32 | - | ||
33 | - @Value("${cassandra.socket.connect_timeout}") | ||
34 | - private int connectTimeoutMillis; | ||
35 | - @Value("${cassandra.socket.read_timeout}") | ||
36 | - private int readTimeoutMillis; | ||
37 | - @Value("${cassandra.socket.keep_alive}") | ||
38 | - private Boolean keepAlive; | ||
39 | - @Value("${cassandra.socket.reuse_address}") | ||
40 | - private Boolean reuseAddress; | ||
41 | - @Value("${cassandra.socket.so_linger}") | ||
42 | - private Integer soLinger; | ||
43 | - @Value("${cassandra.socket.tcp_no_delay}") | ||
44 | - private Boolean tcpNoDelay; | ||
45 | - @Value("${cassandra.socket.receive_buffer_size}") | ||
46 | - private Integer receiveBufferSize; | ||
47 | - @Value("${cassandra.socket.send_buffer_size}") | ||
48 | - private Integer sendBufferSize; | ||
49 | - | ||
50 | - private SocketOptions opts; | ||
51 | - | ||
52 | - @PostConstruct | ||
53 | - public void initOpts() { | ||
54 | - opts = new SocketOptions(); | ||
55 | - opts.setConnectTimeoutMillis(connectTimeoutMillis); | ||
56 | - opts.setReadTimeoutMillis(readTimeoutMillis); | ||
57 | - if (keepAlive != null) { | ||
58 | - opts.setKeepAlive(keepAlive); | ||
59 | - } | ||
60 | - if (reuseAddress != null) { | ||
61 | - opts.setReuseAddress(reuseAddress); | ||
62 | - } | ||
63 | - if (soLinger != null) { | ||
64 | - opts.setSoLinger(soLinger); | ||
65 | - } | ||
66 | - if (tcpNoDelay != null) { | ||
67 | - opts.setTcpNoDelay(tcpNoDelay); | ||
68 | - } | ||
69 | - if (receiveBufferSize != null) { | ||
70 | - opts.setReceiveBufferSize(receiveBufferSize); | ||
71 | - } | ||
72 | - if (sendBufferSize != null) { | ||
73 | - opts.setSendBufferSize(sendBufferSize); | ||
74 | - } | ||
75 | - } | ||
76 | -} |
common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/DefaultGuavaSession.java
renamed from
dao/src/main/java/org/thingsboard/server/dao/model/type/JsonCodec.java
@@ -13,15 +13,14 @@ | @@ -13,15 +13,14 @@ | ||
13 | * See the License for the specific language governing permissions and | 13 | * See the License for the specific language governing permissions and |
14 | * limitations under the License. | 14 | * limitations under the License. |
15 | */ | 15 | */ |
16 | -package org.thingsboard.server.dao.model.type; | 16 | +package org.thingsboard.server.dao.cassandra.guava; |
17 | 17 | ||
18 | -import com.datastax.driver.extras.codecs.json.JacksonJsonCodec; | ||
19 | -import com.fasterxml.jackson.databind.JsonNode; | 18 | +import com.datastax.oss.driver.api.core.session.Session; |
19 | +import com.datastax.oss.driver.internal.core.session.SessionWrapper; | ||
20 | 20 | ||
21 | -public class JsonCodec extends JacksonJsonCodec<JsonNode> { | 21 | +public class DefaultGuavaSession extends SessionWrapper implements GuavaSession { |
22 | 22 | ||
23 | - public JsonCodec() { | ||
24 | - super(JsonNode.class); | 23 | + public DefaultGuavaSession(Session delegate) { |
24 | + super(delegate); | ||
25 | } | 25 | } |
26 | - | ||
27 | } | 26 | } |
common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaDriverContext.java
0 → 100644
1 | +/** | ||
2 | + * Copyright © 2016-2020 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.dao.cassandra.guava; | ||
17 | + | ||
18 | +import com.datastax.oss.driver.api.core.config.DriverConfigLoader; | ||
19 | +import com.datastax.oss.driver.api.core.cql.PrepareRequest; | ||
20 | +import com.datastax.oss.driver.api.core.cql.Statement; | ||
21 | +import com.datastax.oss.driver.api.core.metadata.Node; | ||
22 | +import com.datastax.oss.driver.api.core.metadata.NodeStateListener; | ||
23 | +import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListener; | ||
24 | +import com.datastax.oss.driver.api.core.session.ProgrammaticArguments; | ||
25 | +import com.datastax.oss.driver.api.core.tracker.RequestTracker; | ||
26 | +import com.datastax.oss.driver.api.core.type.codec.TypeCodec; | ||
27 | +import com.datastax.oss.driver.internal.core.context.DefaultDriverContext; | ||
28 | +import com.datastax.oss.driver.internal.core.cql.CqlPrepareAsyncProcessor; | ||
29 | +import com.datastax.oss.driver.internal.core.cql.CqlPrepareSyncProcessor; | ||
30 | +import com.datastax.oss.driver.internal.core.cql.CqlRequestAsyncProcessor; | ||
31 | +import com.datastax.oss.driver.internal.core.cql.CqlRequestSyncProcessor; | ||
32 | +import com.datastax.oss.driver.internal.core.session.RequestProcessorRegistry; | ||
33 | +import java.util.List; | ||
34 | +import java.util.Map; | ||
35 | +import java.util.function.Predicate; | ||
36 | + | ||
37 | +/** | ||
38 | + * A Custom {@link DefaultDriverContext} that overrides {@link #getRequestProcessorRegistry()} to | ||
39 | + * return a {@link RequestProcessorRegistry} that includes processors for returning guava futures. | ||
40 | + */ | ||
41 | +public class GuavaDriverContext extends DefaultDriverContext { | ||
42 | + | ||
43 | + public GuavaDriverContext( | ||
44 | + DriverConfigLoader configLoader, | ||
45 | + List<TypeCodec<?>> typeCodecs, | ||
46 | + NodeStateListener nodeStateListener, | ||
47 | + SchemaChangeListener schemaChangeListener, | ||
48 | + RequestTracker requestTracker, | ||
49 | + Map<String, String> localDatacenters, | ||
50 | + Map<String, Predicate<Node>> nodeFilters, | ||
51 | + ClassLoader classLoader) { | ||
52 | + super( | ||
53 | + configLoader, | ||
54 | + ProgrammaticArguments.builder() | ||
55 | + .addTypeCodecs(typeCodecs.toArray(new TypeCodec<?>[0])) | ||
56 | + .withNodeStateListener(nodeStateListener) | ||
57 | + .withSchemaChangeListener(schemaChangeListener) | ||
58 | + .withRequestTracker(requestTracker) | ||
59 | + .withLocalDatacenters(localDatacenters) | ||
60 | + .withNodeFilters(nodeFilters) | ||
61 | + .withClassLoader(classLoader) | ||
62 | + .build()); | ||
63 | + } | ||
64 | + | ||
65 | + @Override | ||
66 | + public RequestProcessorRegistry buildRequestProcessorRegistry() { | ||
67 | + // Register the typical request processors, except instead of the normal async processors, | ||
68 | + // use GuavaRequestAsyncProcessor to return ListenableFutures in async methods. | ||
69 | + | ||
70 | + CqlRequestAsyncProcessor cqlRequestAsyncProcessor = new CqlRequestAsyncProcessor(); | ||
71 | + CqlPrepareAsyncProcessor cqlPrepareAsyncProcessor = new CqlPrepareAsyncProcessor(); | ||
72 | + CqlRequestSyncProcessor cqlRequestSyncProcessor = | ||
73 | + new CqlRequestSyncProcessor(cqlRequestAsyncProcessor); | ||
74 | + | ||
75 | + return new RequestProcessorRegistry( | ||
76 | + getSessionName(), | ||
77 | + cqlRequestSyncProcessor, | ||
78 | + new CqlPrepareSyncProcessor(cqlPrepareAsyncProcessor), | ||
79 | + new GuavaRequestAsyncProcessor<>( | ||
80 | + cqlRequestAsyncProcessor, Statement.class, GuavaSession.ASYNC), | ||
81 | + new GuavaRequestAsyncProcessor<>( | ||
82 | + cqlPrepareAsyncProcessor, PrepareRequest.class, GuavaSession.ASYNC_PREPARED)); | ||
83 | + } | ||
84 | +} |
1 | +/** | ||
2 | + * Copyright © 2016-2020 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.dao.cassandra.guava; | ||
17 | + | ||
18 | +import com.datastax.oss.driver.api.core.session.Request; | ||
19 | +import com.datastax.oss.driver.api.core.type.reflect.GenericType; | ||
20 | +import com.datastax.oss.driver.internal.core.context.InternalDriverContext; | ||
21 | +import com.datastax.oss.driver.internal.core.session.DefaultSession; | ||
22 | +import com.datastax.oss.driver.internal.core.session.RequestProcessor; | ||
23 | +import com.google.common.util.concurrent.Futures; | ||
24 | +import com.google.common.util.concurrent.ListenableFuture; | ||
25 | +import com.google.common.util.concurrent.SettableFuture; | ||
26 | +import java.util.concurrent.CompletionStage; | ||
27 | + | ||
28 | +/** | ||
29 | + * Wraps a {@link RequestProcessor} that returns {@link CompletionStage}s and converts them to a | ||
30 | + * {@link ListenableFuture}s. | ||
31 | + * | ||
32 | + * @param <T> The type of request | ||
33 | + * @param <U> The type of responses enclosed in the future response. | ||
34 | + */ | ||
35 | +public class GuavaRequestAsyncProcessor<T extends Request, U> | ||
36 | + implements RequestProcessor<T, ListenableFuture<U>> { | ||
37 | + | ||
38 | + private final RequestProcessor<T, CompletionStage<U>> subProcessor; | ||
39 | + | ||
40 | + private final GenericType resultType; | ||
41 | + | ||
42 | + private final Class<?> requestClass; | ||
43 | + | ||
44 | + GuavaRequestAsyncProcessor( | ||
45 | + RequestProcessor<T, CompletionStage<U>> subProcessor, | ||
46 | + Class<?> requestClass, | ||
47 | + GenericType resultType) { | ||
48 | + this.subProcessor = subProcessor; | ||
49 | + this.requestClass = requestClass; | ||
50 | + this.resultType = resultType; | ||
51 | + } | ||
52 | + | ||
53 | + @Override | ||
54 | + public boolean canProcess(Request request, GenericType resultType) { | ||
55 | + return requestClass.isInstance(request) && resultType.equals(this.resultType); | ||
56 | + } | ||
57 | + | ||
58 | + @Override | ||
59 | + public ListenableFuture<U> process( | ||
60 | + T request, DefaultSession session, InternalDriverContext context, String sessionLogPrefix) { | ||
61 | + SettableFuture<U> future = SettableFuture.create(); | ||
62 | + subProcessor | ||
63 | + .process(request, session, context, sessionLogPrefix) | ||
64 | + .whenComplete( | ||
65 | + (r, ex) -> { | ||
66 | + if (ex != null) { | ||
67 | + future.setException(ex); | ||
68 | + } else { | ||
69 | + future.set(r); | ||
70 | + } | ||
71 | + }); | ||
72 | + return future; | ||
73 | + } | ||
74 | + | ||
75 | + @Override | ||
76 | + public ListenableFuture<U> newFailure(RuntimeException error) { | ||
77 | + return Futures.immediateFailedFuture(error); | ||
78 | + } | ||
79 | +} |
common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaSession.java
renamed from
dao/src/main/java/org/thingsboard/server/dao/model/type/ComponentLifecycleStateCodec.java
@@ -13,15 +13,39 @@ | @@ -13,15 +13,39 @@ | ||
13 | * See the License for the specific language governing permissions and | 13 | * See the License for the specific language governing permissions and |
14 | * limitations under the License. | 14 | * limitations under the License. |
15 | */ | 15 | */ |
16 | -package org.thingsboard.server.dao.model.type; | 16 | +package org.thingsboard.server.dao.cassandra.guava; |
17 | 17 | ||
18 | -import com.datastax.driver.extras.codecs.enums.EnumNameCodec; | ||
19 | -import org.thingsboard.server.common.data.plugin.ComponentLifecycleState; | 18 | +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; |
19 | +import com.datastax.oss.driver.api.core.cql.PreparedStatement; | ||
20 | +import com.datastax.oss.driver.api.core.cql.SimpleStatement; | ||
21 | +import com.datastax.oss.driver.api.core.cql.Statement; | ||
22 | +import com.datastax.oss.driver.api.core.cql.SyncCqlSession; | ||
23 | +import com.datastax.oss.driver.api.core.session.Session; | ||
24 | +import com.datastax.oss.driver.api.core.type.reflect.GenericType; | ||
25 | +import com.datastax.oss.driver.internal.core.cql.DefaultPrepareRequest; | ||
26 | +import com.google.common.util.concurrent.ListenableFuture; | ||
20 | 27 | ||
21 | -public class ComponentLifecycleStateCodec extends EnumNameCodec<ComponentLifecycleState> { | 28 | +public interface GuavaSession extends Session, SyncCqlSession { |
22 | 29 | ||
23 | - public ComponentLifecycleStateCodec() { | ||
24 | - super(ComponentLifecycleState.class); | 30 | + GenericType<ListenableFuture<AsyncResultSet>> ASYNC = |
31 | + new GenericType<ListenableFuture<AsyncResultSet>>() {}; | ||
32 | + | ||
33 | + GenericType<ListenableFuture<PreparedStatement>> ASYNC_PREPARED = | ||
34 | + new GenericType<ListenableFuture<PreparedStatement>>() {}; | ||
35 | + | ||
36 | + default ListenableFuture<AsyncResultSet> executeAsync(Statement<?> statement) { | ||
37 | + return this.execute(statement, ASYNC); | ||
38 | + } | ||
39 | + | ||
40 | + default ListenableFuture<AsyncResultSet> executeAsync(String statement) { | ||
41 | + return this.executeAsync(SimpleStatement.newInstance(statement)); | ||
25 | } | 42 | } |
26 | 43 | ||
44 | + default ListenableFuture<PreparedStatement> prepareAsync(SimpleStatement statement) { | ||
45 | + return this.execute(new DefaultPrepareRequest(statement), ASYNC_PREPARED); | ||
46 | + } | ||
47 | + | ||
48 | + default ListenableFuture<PreparedStatement> prepareAsync(String statement) { | ||
49 | + return this.prepareAsync(SimpleStatement.newInstance(statement)); | ||
50 | + } | ||
27 | } | 51 | } |
common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaSessionBuilder.java
0 → 100644
1 | +/** | ||
2 | + * Copyright © 2016-2020 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.dao.cassandra.guava; | ||
17 | + | ||
18 | +import com.datastax.oss.driver.api.core.CqlSession; | ||
19 | +import com.datastax.oss.driver.api.core.config.DriverConfigLoader; | ||
20 | +import com.datastax.oss.driver.api.core.context.DriverContext; | ||
21 | +import com.datastax.oss.driver.api.core.metadata.Node; | ||
22 | +import com.datastax.oss.driver.api.core.metadata.NodeStateListener; | ||
23 | +import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListener; | ||
24 | +import com.datastax.oss.driver.api.core.session.SessionBuilder; | ||
25 | +import com.datastax.oss.driver.api.core.tracker.RequestTracker; | ||
26 | +import com.datastax.oss.driver.api.core.type.codec.TypeCodec; | ||
27 | +import edu.umd.cs.findbugs.annotations.NonNull; | ||
28 | +import java.util.List; | ||
29 | +import java.util.Map; | ||
30 | +import java.util.function.Predicate; | ||
31 | + | ||
32 | +public class GuavaSessionBuilder extends SessionBuilder<GuavaSessionBuilder, GuavaSession> { | ||
33 | + | ||
34 | + @Override | ||
35 | + protected DriverContext buildContext( | ||
36 | + DriverConfigLoader configLoader, | ||
37 | + List<TypeCodec<?>> typeCodecs, | ||
38 | + NodeStateListener nodeStateListener, | ||
39 | + SchemaChangeListener schemaChangeListener, | ||
40 | + RequestTracker requestTracker, | ||
41 | + Map<String, String> localDatacenters, | ||
42 | + Map<String, Predicate<Node>> nodeFilters, | ||
43 | + ClassLoader classLoader) { | ||
44 | + return new GuavaDriverContext( | ||
45 | + configLoader, | ||
46 | + typeCodecs, | ||
47 | + nodeStateListener, | ||
48 | + schemaChangeListener, | ||
49 | + requestTracker, | ||
50 | + localDatacenters, | ||
51 | + nodeFilters, | ||
52 | + classLoader); | ||
53 | + } | ||
54 | + | ||
55 | + @Override | ||
56 | + protected GuavaSession wrap(@NonNull CqlSession defaultSession) { | ||
57 | + return new DefaultGuavaSession(defaultSession); | ||
58 | + } | ||
59 | +} |
common/dao-api/src/main/java/org/thingsboard/server/dao/cassandra/guava/GuavaSessionUtils.java
renamed from
dao/src/main/java/org/thingsboard/server/dao/model/type/EntityTypeCodec.java
@@ -13,15 +13,10 @@ | @@ -13,15 +13,10 @@ | ||
13 | * See the License for the specific language governing permissions and | 13 | * See the License for the specific language governing permissions and |
14 | * limitations under the License. | 14 | * limitations under the License. |
15 | */ | 15 | */ |
16 | -package org.thingsboard.server.dao.model.type; | 16 | +package org.thingsboard.server.dao.cassandra.guava; |
17 | 17 | ||
18 | -import com.datastax.driver.extras.codecs.enums.EnumNameCodec; | ||
19 | -import org.thingsboard.server.common.data.EntityType; | ||
20 | - | ||
21 | -public class EntityTypeCodec extends EnumNameCodec<EntityType> { | ||
22 | - | ||
23 | - public EntityTypeCodec() { | ||
24 | - super(EntityType.class); | 18 | +public class GuavaSessionUtils { |
19 | + public static GuavaSessionBuilder builder() { | ||
20 | + return new GuavaSessionBuilder(); | ||
25 | } | 21 | } |
26 | - | ||
27 | } | 22 | } |
@@ -15,12 +15,17 @@ | @@ -15,12 +15,17 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.nosql; | 16 | package org.thingsboard.server.dao.nosql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.Session; | ||
19 | -import com.datastax.driver.core.Statement; | 18 | +import com.datastax.oss.driver.api.core.cql.Statement; |
19 | +import com.google.common.util.concurrent.Futures; | ||
20 | +import com.google.common.util.concurrent.ListenableFuture; | ||
21 | +import com.google.common.util.concurrent.MoreExecutors; | ||
20 | import lombok.Data; | 22 | import lombok.Data; |
21 | import org.thingsboard.server.common.data.id.TenantId; | 23 | import org.thingsboard.server.common.data.id.TenantId; |
24 | +import org.thingsboard.server.dao.cassandra.guava.GuavaSession; | ||
22 | import org.thingsboard.server.dao.util.AsyncTask; | 25 | import org.thingsboard.server.dao.util.AsyncTask; |
23 | 26 | ||
27 | +import java.util.function.Function; | ||
28 | + | ||
24 | /** | 29 | /** |
25 | * Created by ashvayka on 24.10.18. | 30 | * Created by ashvayka on 24.10.18. |
26 | */ | 31 | */ |
@@ -28,7 +33,14 @@ import org.thingsboard.server.dao.util.AsyncTask; | @@ -28,7 +33,14 @@ import org.thingsboard.server.dao.util.AsyncTask; | ||
28 | public class CassandraStatementTask implements AsyncTask { | 33 | public class CassandraStatementTask implements AsyncTask { |
29 | 34 | ||
30 | private final TenantId tenantId; | 35 | private final TenantId tenantId; |
31 | - private final Session session; | 36 | + private final GuavaSession session; |
32 | private final Statement statement; | 37 | private final Statement statement; |
33 | 38 | ||
39 | + public ListenableFuture<TbResultSet> executeAsync(Function<Statement, TbResultSetFuture> executeAsyncFunction) { | ||
40 | + return Futures.transform(session.executeAsync(statement), | ||
41 | + result -> new TbResultSet(statement, result, executeAsyncFunction), | ||
42 | + MoreExecutors.directExecutor() | ||
43 | + ); | ||
44 | + } | ||
45 | + | ||
34 | } | 46 | } |
1 | +/** | ||
2 | + * Copyright © 2016-2020 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.dao.nosql; | ||
17 | + | ||
18 | +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; | ||
19 | +import com.datastax.oss.driver.api.core.cql.ColumnDefinitions; | ||
20 | +import com.datastax.oss.driver.api.core.cql.ExecutionInfo; | ||
21 | +import com.datastax.oss.driver.api.core.cql.Row; | ||
22 | +import com.datastax.oss.driver.api.core.cql.Statement; | ||
23 | +import com.google.common.collect.Lists; | ||
24 | +import com.google.common.util.concurrent.FutureCallback; | ||
25 | +import com.google.common.util.concurrent.Futures; | ||
26 | +import com.google.common.util.concurrent.ListenableFuture; | ||
27 | +import com.google.common.util.concurrent.MoreExecutors; | ||
28 | +import com.google.common.util.concurrent.SettableFuture; | ||
29 | +import edu.umd.cs.findbugs.annotations.NonNull; | ||
30 | +import org.checkerframework.checker.nullness.qual.Nullable; | ||
31 | + | ||
32 | +import java.nio.ByteBuffer; | ||
33 | +import java.util.ArrayList; | ||
34 | +import java.util.List; | ||
35 | +import java.util.concurrent.CompletionStage; | ||
36 | +import java.util.concurrent.Executor; | ||
37 | +import java.util.function.Function; | ||
38 | + | ||
39 | +public class TbResultSet implements AsyncResultSet { | ||
40 | + | ||
41 | + private final Statement originalStatement; | ||
42 | + private final AsyncResultSet delegate; | ||
43 | + private final Function<Statement, TbResultSetFuture> executeAsyncFunction; | ||
44 | + | ||
45 | + public TbResultSet(Statement originalStatement, AsyncResultSet delegate, | ||
46 | + Function<Statement, TbResultSetFuture> executeAsyncFunction) { | ||
47 | + this.originalStatement = originalStatement; | ||
48 | + this.delegate = delegate; | ||
49 | + this.executeAsyncFunction = executeAsyncFunction; | ||
50 | + } | ||
51 | + | ||
52 | + @NonNull | ||
53 | + @Override | ||
54 | + public ColumnDefinitions getColumnDefinitions() { | ||
55 | + return delegate.getColumnDefinitions(); | ||
56 | + } | ||
57 | + | ||
58 | + @NonNull | ||
59 | + @Override | ||
60 | + public ExecutionInfo getExecutionInfo() { | ||
61 | + return delegate.getExecutionInfo(); | ||
62 | + } | ||
63 | + | ||
64 | + @Override | ||
65 | + public int remaining() { | ||
66 | + return delegate.remaining(); | ||
67 | + } | ||
68 | + | ||
69 | + @NonNull | ||
70 | + @Override | ||
71 | + public Iterable<Row> currentPage() { | ||
72 | + return delegate.currentPage(); | ||
73 | + } | ||
74 | + | ||
75 | + @Override | ||
76 | + public boolean hasMorePages() { | ||
77 | + return delegate.hasMorePages(); | ||
78 | + } | ||
79 | + | ||
80 | + @NonNull | ||
81 | + @Override | ||
82 | + public CompletionStage<AsyncResultSet> fetchNextPage() throws IllegalStateException { | ||
83 | + return delegate.fetchNextPage(); | ||
84 | + } | ||
85 | + | ||
86 | + @Override | ||
87 | + public boolean wasApplied() { | ||
88 | + return delegate.wasApplied(); | ||
89 | + } | ||
90 | + | ||
91 | + public ListenableFuture<List<Row>> allRows(Executor executor) { | ||
92 | + List<Row> allRows = new ArrayList<>(); | ||
93 | + SettableFuture<List<Row>> resultFuture = SettableFuture.create(); | ||
94 | + this.processRows(originalStatement, delegate, allRows, resultFuture, executor); | ||
95 | + return resultFuture; | ||
96 | + } | ||
97 | + | ||
98 | + private void processRows(Statement statement, | ||
99 | + AsyncResultSet resultSet, | ||
100 | + List<Row> allRows, | ||
101 | + SettableFuture<List<Row>> resultFuture, | ||
102 | + Executor executor) { | ||
103 | + allRows.addAll(loadRows(resultSet)); | ||
104 | + if (resultSet.hasMorePages()) { | ||
105 | + ByteBuffer nextPagingState = resultSet.getExecutionInfo().getPagingState(); | ||
106 | + Statement<?> nextStatement = statement.setPagingState(nextPagingState); | ||
107 | + TbResultSetFuture resultSetFuture = executeAsyncFunction.apply(nextStatement); | ||
108 | + Futures.addCallback(resultSetFuture, | ||
109 | + new FutureCallback<TbResultSet>() { | ||
110 | + @Override | ||
111 | + public void onSuccess(@Nullable TbResultSet result) { | ||
112 | + processRows(nextStatement, result, | ||
113 | + allRows, resultFuture, executor); | ||
114 | + } | ||
115 | + | ||
116 | + @Override | ||
117 | + public void onFailure(Throwable t) { | ||
118 | + resultFuture.setException(t); | ||
119 | + } | ||
120 | + }, executor != null ? executor : MoreExecutors.directExecutor() | ||
121 | + ); | ||
122 | + } else { | ||
123 | + resultFuture.set(allRows); | ||
124 | + } | ||
125 | + } | ||
126 | + | ||
127 | + List<Row> loadRows(AsyncResultSet resultSet) { | ||
128 | + return Lists.newArrayList(resultSet.currentPage()); | ||
129 | + } | ||
130 | + | ||
131 | +} |
common/dao-api/src/main/java/org/thingsboard/server/dao/nosql/TbResultSetFuture.java
renamed from
dao/src/main/java/org/thingsboard/server/dao/nosql/TbResultSetFuture.java
@@ -15,8 +15,8 @@ | @@ -15,8 +15,8 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.nosql; | 16 | package org.thingsboard.server.dao.nosql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.ResultSet; | ||
19 | -import com.datastax.driver.core.ResultSetFuture; | 18 | +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; |
19 | +import com.google.common.util.concurrent.ListenableFuture; | ||
20 | import com.google.common.util.concurrent.SettableFuture; | 20 | import com.google.common.util.concurrent.SettableFuture; |
21 | 21 | ||
22 | import java.util.concurrent.ExecutionException; | 22 | import java.util.concurrent.ExecutionException; |
@@ -27,21 +27,19 @@ import java.util.concurrent.TimeoutException; | @@ -27,21 +27,19 @@ import java.util.concurrent.TimeoutException; | ||
27 | /** | 27 | /** |
28 | * Created by ashvayka on 24.10.18. | 28 | * Created by ashvayka on 24.10.18. |
29 | */ | 29 | */ |
30 | -public class TbResultSetFuture implements ResultSetFuture { | 30 | +public class TbResultSetFuture implements ListenableFuture<TbResultSet> { |
31 | 31 | ||
32 | - private final SettableFuture<ResultSet> mainFuture; | 32 | + private final SettableFuture<TbResultSet> mainFuture; |
33 | 33 | ||
34 | - public TbResultSetFuture(SettableFuture<ResultSet> mainFuture) { | 34 | + public TbResultSetFuture(SettableFuture<TbResultSet> mainFuture) { |
35 | this.mainFuture = mainFuture; | 35 | this.mainFuture = mainFuture; |
36 | } | 36 | } |
37 | 37 | ||
38 | - @Override | ||
39 | - public ResultSet getUninterruptibly() { | 38 | + public TbResultSet getUninterruptibly() { |
40 | return getSafe(); | 39 | return getSafe(); |
41 | } | 40 | } |
42 | 41 | ||
43 | - @Override | ||
44 | - public ResultSet getUninterruptibly(long timeout, TimeUnit unit) throws TimeoutException { | 42 | + public TbResultSet getUninterruptibly(long timeout, TimeUnit unit) throws TimeoutException { |
45 | return getSafe(timeout, unit); | 43 | return getSafe(timeout, unit); |
46 | } | 44 | } |
47 | 45 | ||
@@ -61,12 +59,12 @@ public class TbResultSetFuture implements ResultSetFuture { | @@ -61,12 +59,12 @@ public class TbResultSetFuture implements ResultSetFuture { | ||
61 | } | 59 | } |
62 | 60 | ||
63 | @Override | 61 | @Override |
64 | - public ResultSet get() throws InterruptedException, ExecutionException { | 62 | + public TbResultSet get() throws InterruptedException, ExecutionException { |
65 | return mainFuture.get(); | 63 | return mainFuture.get(); |
66 | } | 64 | } |
67 | 65 | ||
68 | @Override | 66 | @Override |
69 | - public ResultSet get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { | 67 | + public TbResultSet get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { |
70 | return mainFuture.get(timeout, unit); | 68 | return mainFuture.get(timeout, unit); |
71 | } | 69 | } |
72 | 70 | ||
@@ -75,7 +73,7 @@ public class TbResultSetFuture implements ResultSetFuture { | @@ -75,7 +73,7 @@ public class TbResultSetFuture implements ResultSetFuture { | ||
75 | mainFuture.addListener(listener, executor); | 73 | mainFuture.addListener(listener, executor); |
76 | } | 74 | } |
77 | 75 | ||
78 | - private ResultSet getSafe() { | 76 | + private TbResultSet getSafe() { |
79 | try { | 77 | try { |
80 | return mainFuture.get(); | 78 | return mainFuture.get(); |
81 | } catch (InterruptedException | ExecutionException e) { | 79 | } catch (InterruptedException | ExecutionException e) { |
@@ -83,7 +81,7 @@ public class TbResultSetFuture implements ResultSetFuture { | @@ -83,7 +81,7 @@ public class TbResultSetFuture implements ResultSetFuture { | ||
83 | } | 81 | } |
84 | } | 82 | } |
85 | 83 | ||
86 | - private ResultSet getSafe(long timeout, TimeUnit unit) throws TimeoutException { | 84 | + private TbResultSet getSafe(long timeout, TimeUnit unit) throws TimeoutException { |
87 | try { | 85 | try { |
88 | return mainFuture.get(timeout, unit); | 86 | return mainFuture.get(timeout, unit); |
89 | } catch (InterruptedException | ExecutionException e) { | 87 | } catch (InterruptedException | ExecutionException e) { |
@@ -67,8 +67,8 @@ | @@ -67,8 +67,8 @@ | ||
67 | <scope>test</scope> | 67 | <scope>test</scope> |
68 | </dependency> | 68 | </dependency> |
69 | <dependency> | 69 | <dependency> |
70 | - <groupId>com.datastax.cassandra</groupId> | ||
71 | - <artifactId>cassandra-driver-core</artifactId> | 70 | + <groupId>com.datastax.oss</groupId> |
71 | + <artifactId>java-driver-core</artifactId> | ||
72 | <scope>test</scope> | 72 | <scope>test</scope> |
73 | </dependency> | 73 | </dependency> |
74 | </dependencies> | 74 | </dependencies> |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.common.data; | 16 | package org.thingsboard.server.common.data; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import org.junit.Assert; | 19 | import org.junit.Assert; |
20 | import org.junit.Test; | 20 | import org.junit.Test; |
21 | import org.junit.runner.RunWith; | 21 | import org.junit.runner.RunWith; |
@@ -61,8 +61,8 @@ public class UUIDConverterTest { | @@ -61,8 +61,8 @@ public class UUIDConverterTest { | ||
61 | before = tmp; | 61 | before = tmp; |
62 | } | 62 | } |
63 | 63 | ||
64 | - String beforeStr = UUIDConverter.fromTimeUUID(UUIDs.startOf(before)); | ||
65 | - String afterStr = UUIDConverter.fromTimeUUID(UUIDs.startOf(after)); | 64 | + String beforeStr = UUIDConverter.fromTimeUUID(Uuids.startOf(before)); |
65 | + String afterStr = UUIDConverter.fromTimeUUID(Uuids.startOf(after)); | ||
66 | 66 | ||
67 | if (afterStr.compareTo(beforeStr) < 0) { | 67 | if (afterStr.compareTo(beforeStr) < 0) { |
68 | System.out.println("Before: " + before + " | " + beforeStr); | 68 | System.out.println("Before: " + before + " | " + beforeStr); |
@@ -54,6 +54,9 @@ public class TbKafkaConsumerTemplate<T extends TbQueueMsg> extends AbstractTbQue | @@ -54,6 +54,9 @@ public class TbKafkaConsumerTemplate<T extends TbQueueMsg> extends AbstractTbQue | ||
54 | if (groupId != null) { | 54 | if (groupId != null) { |
55 | props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); | 55 | props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); |
56 | } | 56 | } |
57 | + props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, settings.getMaxPollRecords()); | ||
58 | + props.put(ConsumerConfig.MAX_PARTITION_FETCH_BYTES_CONFIG, settings.getMaxPartitionFetchBytes()); | ||
59 | + props.put(ConsumerConfig.FETCH_MAX_BYTES_CONFIG, settings.getFetchMaxBytes()); | ||
57 | props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, autoCommit); | 60 | props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, autoCommit); |
58 | props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, autoCommitIntervalMs); | 61 | props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, autoCommitIntervalMs); |
59 | props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); | 62 | props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); |
@@ -55,6 +55,18 @@ public class TbKafkaSettings { | @@ -55,6 +55,18 @@ public class TbKafkaSettings { | ||
55 | @Getter | 55 | @Getter |
56 | private short replicationFactor; | 56 | private short replicationFactor; |
57 | 57 | ||
58 | + @Value("${queue.kafka.max_poll_records:8192}") | ||
59 | + @Getter | ||
60 | + private int maxPollRecords; | ||
61 | + | ||
62 | + @Value("${queue.kafka.max_partition_fetch_bytes:16777216}") | ||
63 | + @Getter | ||
64 | + private int maxPartitionFetchBytes; | ||
65 | + | ||
66 | + @Value("${queue.kafka.fetch_max_bytes:134217728}") | ||
67 | + @Getter | ||
68 | + private int fetchMaxBytes; | ||
69 | + | ||
58 | @Value("${kafka.other:#{null}}") | 70 | @Value("${kafka.other:#{null}}") |
59 | private List<TbKafkaProperty> other; | 71 | private List<TbKafkaProperty> other; |
60 | 72 |
@@ -391,6 +391,7 @@ public class JsonConverter { | @@ -391,6 +391,7 @@ public class JsonConverter { | ||
391 | break; | 391 | break; |
392 | case JSON_V: | 392 | case JSON_V: |
393 | result.add(de.getKv().getKey(), JSON_PARSER.parse(de.getKv().getJsonV())); | 393 | result.add(de.getKv().getKey(), JSON_PARSER.parse(de.getKv().getJsonV())); |
394 | + break; | ||
394 | default: | 395 | default: |
395 | throw new IllegalArgumentException("Unsupported data type: " + de.getKv().getType()); | 396 | throw new IllegalArgumentException("Unsupported data type: " + de.getKv().getType()); |
396 | } | 397 | } |
@@ -120,18 +120,18 @@ | @@ -120,18 +120,18 @@ | ||
120 | <groupId>org.springframework.security</groupId> | 120 | <groupId>org.springframework.security</groupId> |
121 | <artifactId>spring-security-oauth2-client</artifactId> | 121 | <artifactId>spring-security-oauth2-client</artifactId> |
122 | </dependency> | 122 | </dependency> |
123 | - <dependency> | ||
124 | - <groupId>com.datastax.cassandra</groupId> | ||
125 | - <artifactId>cassandra-driver-core</artifactId> | ||
126 | - </dependency> | ||
127 | - <dependency> | ||
128 | - <groupId>com.datastax.cassandra</groupId> | ||
129 | - <artifactId>cassandra-driver-mapping</artifactId> | ||
130 | - </dependency> | ||
131 | - <dependency> | ||
132 | - <groupId>com.datastax.cassandra</groupId> | ||
133 | - <artifactId>cassandra-driver-extras</artifactId> | ||
134 | - </dependency> | 123 | + <dependency> |
124 | + <groupId>com.datastax.oss</groupId> | ||
125 | + <artifactId>java-driver-core</artifactId> | ||
126 | + </dependency> | ||
127 | + <dependency> | ||
128 | + <groupId>com.datastax.oss</groupId> | ||
129 | + <artifactId>java-driver-query-builder</artifactId> | ||
130 | + </dependency> | ||
131 | + <dependency> | ||
132 | + <groupId>io.dropwizard.metrics</groupId> | ||
133 | + <artifactId>metrics-jmx</artifactId> | ||
134 | + </dependency> | ||
135 | <dependency> | 135 | <dependency> |
136 | <groupId>io.takari.junit</groupId> | 136 | <groupId>io.takari.junit</groupId> |
137 | <artifactId>takari-cpsuite</artifactId> | 137 | <artifactId>takari-cpsuite</artifactId> |
@@ -149,6 +149,10 @@ | @@ -149,6 +149,10 @@ | ||
149 | <groupId>org.slf4j</groupId> | 149 | <groupId>org.slf4j</groupId> |
150 | <artifactId>slf4j-log4j12</artifactId> | 150 | <artifactId>slf4j-log4j12</artifactId> |
151 | </exclusion> | 151 | </exclusion> |
152 | + <exclusion> | ||
153 | + <groupId>org.hibernate</groupId> | ||
154 | + <artifactId>hibernate-validator</artifactId> | ||
155 | + </exclusion> | ||
152 | </exclusions> | 156 | </exclusions> |
153 | <scope>test</scope> | 157 | <scope>test</scope> |
154 | </dependency> | 158 | </dependency> |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao; | 16 | package org.thingsboard.server.dao; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import org.springframework.data.domain.Page; | 19 | import org.springframework.data.domain.Page; |
20 | import org.springframework.data.domain.PageRequest; | 20 | import org.springframework.data.domain.PageRequest; |
21 | import org.springframework.data.domain.Pageable; | 21 | import org.springframework.data.domain.Pageable; |
@@ -49,7 +49,7 @@ public abstract class DaoUtil { | @@ -49,7 +49,7 @@ public abstract class DaoUtil { | ||
49 | 49 | ||
50 | public static String startTimeToId(Long startTime) { | 50 | public static String startTimeToId(Long startTime) { |
51 | if (startTime != null) { | 51 | if (startTime != null) { |
52 | - UUID startOf = UUIDs.startOf(startTime); | 52 | + UUID startOf = Uuids.startOf(startTime); |
53 | return UUIDConverter.fromTimeUUID(startOf); | 53 | return UUIDConverter.fromTimeUUID(startOf); |
54 | } else { | 54 | } else { |
55 | return null; | 55 | return null; |
@@ -58,7 +58,7 @@ public abstract class DaoUtil { | @@ -58,7 +58,7 @@ public abstract class DaoUtil { | ||
58 | 58 | ||
59 | public static String endTimeToId(Long endTime) { | 59 | public static String endTimeToId(Long endTime) { |
60 | if (endTime != null) { | 60 | if (endTime != null) { |
61 | - UUID endOf = UUIDs.endOf(endTime); | 61 | + UUID endOf = Uuids.endOf(endTime); |
62 | return UUIDConverter.fromTimeUUID(endOf); | 62 | return UUIDConverter.fromTimeUUID(endOf); |
63 | } else { | 63 | } else { |
64 | return null; | 64 | return null; |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.audit; | 16 | package org.thingsboard.server.dao.audit; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import com.fasterxml.jackson.databind.ObjectMapper; | 20 | import com.fasterxml.jackson.databind.ObjectMapper; |
21 | import com.fasterxml.jackson.databind.node.ArrayNode; | 21 | import com.fasterxml.jackson.databind.node.ArrayNode; |
@@ -296,7 +296,7 @@ public class AuditLogServiceImpl implements AuditLogService { | @@ -296,7 +296,7 @@ public class AuditLogServiceImpl implements AuditLogService { | ||
296 | ActionStatus actionStatus, | 296 | ActionStatus actionStatus, |
297 | String actionFailureDetails) { | 297 | String actionFailureDetails) { |
298 | AuditLog result = new AuditLog(); | 298 | AuditLog result = new AuditLog(); |
299 | - result.setId(new AuditLogId(UUIDs.timeBased())); | 299 | + result.setId(new AuditLogId(Uuids.timeBased())); |
300 | result.setTenantId(tenantId); | 300 | result.setTenantId(tenantId); |
301 | result.setEntityId(entityId); | 301 | result.setEntityId(entityId); |
302 | result.setEntityName(entityName); | 302 | result.setEntityName(entityName); |
dao/src/main/java/org/thingsboard/server/dao/model/EntitySubtypeEntity.java
deleted
100644 → 0
1 | -/** | ||
2 | - * Copyright © 2016-2020 The Thingsboard Authors | ||
3 | - * | ||
4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | - * you may not use this file except in compliance with the License. | ||
6 | - * You may obtain a copy of the License at | ||
7 | - * | ||
8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | - * | ||
10 | - * Unless required by applicable law or agreed to in writing, software | ||
11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | - * See the License for the specific language governing permissions and | ||
14 | - * limitations under the License. | ||
15 | - */ | ||
16 | -package org.thingsboard.server.dao.model; | ||
17 | - | ||
18 | -import com.datastax.driver.mapping.annotations.Column; | ||
19 | -import com.datastax.driver.mapping.annotations.PartitionKey; | ||
20 | -import com.datastax.driver.mapping.annotations.Table; | ||
21 | -import org.thingsboard.server.common.data.EntitySubtype; | ||
22 | -import org.thingsboard.server.common.data.EntityType; | ||
23 | -import org.thingsboard.server.common.data.id.TenantId; | ||
24 | -import org.thingsboard.server.dao.model.type.EntityTypeCodec; | ||
25 | - | ||
26 | -import java.util.UUID; | ||
27 | - | ||
28 | -import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_SUBTYPE_COLUMN_FAMILY_NAME; | ||
29 | -import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_SUBTYPE_ENTITY_TYPE_PROPERTY; | ||
30 | -import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_SUBTYPE_TENANT_ID_PROPERTY; | ||
31 | -import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_SUBTYPE_TYPE_PROPERTY; | ||
32 | - | ||
33 | -@Table(name = ENTITY_SUBTYPE_COLUMN_FAMILY_NAME) | ||
34 | -public class EntitySubtypeEntity { | ||
35 | - | ||
36 | - @PartitionKey(value = 0) | ||
37 | - @Column(name = ENTITY_SUBTYPE_TENANT_ID_PROPERTY) | ||
38 | - private UUID tenantId; | ||
39 | - | ||
40 | - @PartitionKey(value = 1) | ||
41 | - @Column(name = ENTITY_SUBTYPE_ENTITY_TYPE_PROPERTY, codec = EntityTypeCodec.class) | ||
42 | - private EntityType entityType; | ||
43 | - | ||
44 | - @PartitionKey(value = 2) | ||
45 | - @Column(name = ENTITY_SUBTYPE_TYPE_PROPERTY) | ||
46 | - private String type; | ||
47 | - | ||
48 | - public EntitySubtypeEntity() { | ||
49 | - super(); | ||
50 | - } | ||
51 | - | ||
52 | - public EntitySubtypeEntity(EntitySubtype entitySubtype) { | ||
53 | - this.tenantId = entitySubtype.getTenantId().getId(); | ||
54 | - this.entityType = entitySubtype.getEntityType(); | ||
55 | - this.type = entitySubtype.getType(); | ||
56 | - } | ||
57 | - | ||
58 | - public UUID getTenantId() { | ||
59 | - return tenantId; | ||
60 | - } | ||
61 | - | ||
62 | - public void setTenantId(UUID tenantId) { | ||
63 | - this.tenantId = tenantId; | ||
64 | - } | ||
65 | - | ||
66 | - public EntityType getEntityType() { | ||
67 | - return entityType; | ||
68 | - } | ||
69 | - | ||
70 | - public void setEntityType(EntityType entityType) { | ||
71 | - this.entityType = entityType; | ||
72 | - } | ||
73 | - | ||
74 | - public String getType() { | ||
75 | - return type; | ||
76 | - } | ||
77 | - | ||
78 | - public void setType(String type) { | ||
79 | - this.type = type; | ||
80 | - } | ||
81 | - | ||
82 | - | ||
83 | - @Override | ||
84 | - public boolean equals(Object o) { | ||
85 | - if (this == o) return true; | ||
86 | - if (o == null || getClass() != o.getClass()) return false; | ||
87 | - | ||
88 | - EntitySubtypeEntity that = (EntitySubtypeEntity) o; | ||
89 | - | ||
90 | - if (tenantId != null ? !tenantId.equals(that.tenantId) : that.tenantId != null) return false; | ||
91 | - if (entityType != that.entityType) return false; | ||
92 | - return type != null ? type.equals(that.type) : that.type == null; | ||
93 | - | ||
94 | - } | ||
95 | - | ||
96 | - @Override | ||
97 | - public int hashCode() { | ||
98 | - int result = tenantId != null ? tenantId.hashCode() : 0; | ||
99 | - result = 31 * result + (entityType != null ? entityType.hashCode() : 0); | ||
100 | - result = 31 * result + (type != null ? type.hashCode() : 0); | ||
101 | - return result; | ||
102 | - } | ||
103 | - | ||
104 | - @Override | ||
105 | - public String toString() { | ||
106 | - final StringBuilder sb = new StringBuilder("EntitySubtypeEntity{"); | ||
107 | - sb.append("tenantId=").append(tenantId); | ||
108 | - sb.append(", entityType=").append(entityType); | ||
109 | - sb.append(", type='").append(type).append('\''); | ||
110 | - sb.append('}'); | ||
111 | - return sb.toString(); | ||
112 | - } | ||
113 | - | ||
114 | - public EntitySubtype toEntitySubtype() { | ||
115 | - EntitySubtype entitySubtype = new EntitySubtype(); | ||
116 | - entitySubtype.setTenantId(new TenantId(tenantId)); | ||
117 | - entitySubtype.setEntityType(entityType); | ||
118 | - entitySubtype.setType(type); | ||
119 | - return entitySubtype; | ||
120 | - } | ||
121 | -} |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model; | 16 | package org.thingsboard.server.dao.model; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import org.apache.commons.lang3.ArrayUtils; | 19 | import org.apache.commons.lang3.ArrayUtils; |
20 | import org.thingsboard.server.common.data.UUIDConverter; | 20 | import org.thingsboard.server.common.data.UUIDConverter; |
21 | import org.thingsboard.server.common.data.id.TenantId; | 21 | import org.thingsboard.server.common.data.id.TenantId; |
@@ -28,7 +28,7 @@ public class ModelConstants { | @@ -28,7 +28,7 @@ public class ModelConstants { | ||
28 | private ModelConstants() { | 28 | private ModelConstants() { |
29 | } | 29 | } |
30 | 30 | ||
31 | - public static final UUID NULL_UUID = UUIDs.startOf(0); | 31 | + public static final UUID NULL_UUID = Uuids.startOf(0); |
32 | public static final String NULL_UUID_STR = UUIDConverter.fromTimeUUID(NULL_UUID); | 32 | public static final String NULL_UUID_STR = UUIDConverter.fromTimeUUID(NULL_UUID); |
33 | public static final TenantId SYSTEM_TENANT = new TenantId(ModelConstants.NULL_UUID); | 33 | public static final TenantId SYSTEM_TENANT = new TenantId(ModelConstants.NULL_UUID); |
34 | 34 |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import lombok.Data; | 20 | import lombok.Data; |
21 | import lombok.EqualsAndHashCode; | 21 | import lombok.EqualsAndHashCode; |
@@ -154,7 +154,7 @@ public abstract class AbstractAlarmEntity<T extends Alarm> extends BaseSqlEntity | @@ -154,7 +154,7 @@ public abstract class AbstractAlarmEntity<T extends Alarm> extends BaseSqlEntity | ||
154 | 154 | ||
155 | protected Alarm toAlarm() { | 155 | protected Alarm toAlarm() { |
156 | Alarm alarm = new Alarm(new AlarmId(UUIDConverter.fromString(id))); | 156 | Alarm alarm = new Alarm(new AlarmId(UUIDConverter.fromString(id))); |
157 | - alarm.setCreatedTime(UUIDs.unixTimestamp(UUIDConverter.fromString(id))); | 157 | + alarm.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id))); |
158 | if (tenantId != null) { | 158 | if (tenantId != null) { |
159 | alarm.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); | 159 | alarm.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); |
160 | } | 160 | } |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import lombok.Data; | 20 | import lombok.Data; |
21 | import lombok.EqualsAndHashCode; | 21 | import lombok.EqualsAndHashCode; |
@@ -116,7 +116,7 @@ public abstract class AbstractAssetEntity<T extends Asset> extends BaseSqlEntity | @@ -116,7 +116,7 @@ public abstract class AbstractAssetEntity<T extends Asset> extends BaseSqlEntity | ||
116 | 116 | ||
117 | protected Asset toAsset() { | 117 | protected Asset toAsset() { |
118 | Asset asset = new Asset(new AssetId(UUIDConverter.fromString(id))); | 118 | Asset asset = new Asset(new AssetId(UUIDConverter.fromString(id))); |
119 | - asset.setCreatedTime(UUIDs.unixTimestamp(UUIDConverter.fromString(id))); | 119 | + asset.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id))); |
120 | if (tenantId != null) { | 120 | if (tenantId != null) { |
121 | asset.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); | 121 | asset.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); |
122 | } | 122 | } |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import lombok.Data; | 20 | import lombok.Data; |
21 | import lombok.EqualsAndHashCode; | 21 | import lombok.EqualsAndHashCode; |
@@ -104,7 +104,7 @@ public abstract class AbstractDeviceEntity<T extends Device> extends BaseSqlEnti | @@ -104,7 +104,7 @@ public abstract class AbstractDeviceEntity<T extends Device> extends BaseSqlEnti | ||
104 | 104 | ||
105 | protected Device toDevice() { | 105 | protected Device toDevice() { |
106 | Device device = new Device(new DeviceId(getUuid())); | 106 | Device device = new Device(new DeviceId(getUuid())); |
107 | - device.setCreatedTime(UUIDs.unixTimestamp(getUuid())); | 107 | + device.setCreatedTime(Uuids.unixTimestamp(getUuid())); |
108 | if (tenantId != null) { | 108 | if (tenantId != null) { |
109 | device.setTenantId(new TenantId(toUUID(tenantId))); | 109 | device.setTenantId(new TenantId(toUUID(tenantId))); |
110 | } | 110 | } |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import com.fasterxml.jackson.databind.ObjectMapper; | 20 | import com.fasterxml.jackson.databind.ObjectMapper; |
21 | import lombok.Data; | 21 | import lombok.Data; |
@@ -147,7 +147,7 @@ public abstract class AbstractEntityViewEntity<T extends EntityView> extends Bas | @@ -147,7 +147,7 @@ public abstract class AbstractEntityViewEntity<T extends EntityView> extends Bas | ||
147 | 147 | ||
148 | protected EntityView toEntityView() { | 148 | protected EntityView toEntityView() { |
149 | EntityView entityView = new EntityView(new EntityViewId(getUuid())); | 149 | EntityView entityView = new EntityView(new EntityViewId(getUuid())); |
150 | - entityView.setCreatedTime(UUIDs.unixTimestamp(getUuid())); | 150 | + entityView.setCreatedTime(Uuids.unixTimestamp(getUuid())); |
151 | 151 | ||
152 | if (entityId != null) { | 152 | if (entityId != null) { |
153 | entityView.setEntityId(EntityIdFactory.getByTypeAndId(entityType.name(), toUUID(entityId).toString())); | 153 | entityView.setEntityId(EntityIdFactory.getByTypeAndId(entityType.name(), toUUID(entityId).toString())); |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import lombok.Data; | 20 | import lombok.Data; |
21 | import lombok.EqualsAndHashCode; | 21 | import lombok.EqualsAndHashCode; |
@@ -65,10 +65,10 @@ public final class AdminSettingsEntity extends BaseSqlEntity<AdminSettings> impl | @@ -65,10 +65,10 @@ public final class AdminSettingsEntity extends BaseSqlEntity<AdminSettings> impl | ||
65 | @Override | 65 | @Override |
66 | public AdminSettings toData() { | 66 | public AdminSettings toData() { |
67 | AdminSettings adminSettings = new AdminSettings(new AdminSettingsId(UUIDConverter.fromString(id))); | 67 | AdminSettings adminSettings = new AdminSettings(new AdminSettingsId(UUIDConverter.fromString(id))); |
68 | - adminSettings.setCreatedTime(UUIDs.unixTimestamp(UUIDConverter.fromString(id))); | 68 | + adminSettings.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id))); |
69 | adminSettings.setKey(key); | 69 | adminSettings.setKey(key); |
70 | adminSettings.setJsonValue(jsonValue); | 70 | adminSettings.setJsonValue(jsonValue); |
71 | return adminSettings; | 71 | return adminSettings; |
72 | } | 72 | } |
73 | 73 | ||
74 | -} | ||
74 | +} |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import lombok.Data; | 20 | import lombok.Data; |
21 | import lombok.EqualsAndHashCode; | 21 | import lombok.EqualsAndHashCode; |
@@ -129,7 +129,7 @@ public class AuditLogEntity extends BaseSqlEntity<AuditLog> implements BaseEntit | @@ -129,7 +129,7 @@ public class AuditLogEntity extends BaseSqlEntity<AuditLog> implements BaseEntit | ||
129 | @Override | 129 | @Override |
130 | public AuditLog toData() { | 130 | public AuditLog toData() { |
131 | AuditLog auditLog = new AuditLog(new AuditLogId(this.getUuid())); | 131 | AuditLog auditLog = new AuditLog(new AuditLogId(this.getUuid())); |
132 | - auditLog.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); | 132 | + auditLog.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); |
133 | if (tenantId != null) { | 133 | if (tenantId != null) { |
134 | auditLog.setTenantId(new TenantId(toUUID(tenantId))); | 134 | auditLog.setTenantId(new TenantId(toUUID(tenantId))); |
135 | } | 135 | } |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import lombok.Data; | 20 | import lombok.Data; |
21 | import lombok.EqualsAndHashCode; | 21 | import lombok.EqualsAndHashCode; |
@@ -112,7 +112,7 @@ public final class CustomerEntity extends BaseSqlEntity<Customer> implements Sea | @@ -112,7 +112,7 @@ public final class CustomerEntity extends BaseSqlEntity<Customer> implements Sea | ||
112 | @Override | 112 | @Override |
113 | public Customer toData() { | 113 | public Customer toData() { |
114 | Customer customer = new Customer(new CustomerId(this.getUuid())); | 114 | Customer customer = new Customer(new CustomerId(this.getUuid())); |
115 | - customer.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); | 115 | + customer.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); |
116 | customer.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); | 116 | customer.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); |
117 | customer.setTitle(title); | 117 | customer.setTitle(title); |
118 | customer.setCountry(country); | 118 | customer.setCountry(country); |
@@ -126,4 +126,4 @@ public final class CustomerEntity extends BaseSqlEntity<Customer> implements Sea | @@ -126,4 +126,4 @@ public final class CustomerEntity extends BaseSqlEntity<Customer> implements Sea | ||
126 | customer.setAdditionalInfo(additionalInfo); | 126 | customer.setAdditionalInfo(additionalInfo); |
127 | return customer; | 127 | return customer; |
128 | } | 128 | } |
129 | -} | ||
129 | +} |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.core.JsonProcessingException; | 19 | import com.fasterxml.jackson.core.JsonProcessingException; |
20 | import com.fasterxml.jackson.databind.JavaType; | 20 | import com.fasterxml.jackson.databind.JavaType; |
21 | import com.fasterxml.jackson.databind.JsonNode; | 21 | import com.fasterxml.jackson.databind.JsonNode; |
@@ -104,7 +104,7 @@ public final class DashboardEntity extends BaseSqlEntity<Dashboard> implements S | @@ -104,7 +104,7 @@ public final class DashboardEntity extends BaseSqlEntity<Dashboard> implements S | ||
104 | @Override | 104 | @Override |
105 | public Dashboard toData() { | 105 | public Dashboard toData() { |
106 | Dashboard dashboard = new Dashboard(new DashboardId(this.getUuid())); | 106 | Dashboard dashboard = new Dashboard(new DashboardId(this.getUuid())); |
107 | - dashboard.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); | 107 | + dashboard.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); |
108 | if (tenantId != null) { | 108 | if (tenantId != null) { |
109 | dashboard.setTenantId(new TenantId(toUUID(tenantId))); | 109 | dashboard.setTenantId(new TenantId(toUUID(tenantId))); |
110 | } | 110 | } |
@@ -119,4 +119,4 @@ public final class DashboardEntity extends BaseSqlEntity<Dashboard> implements S | @@ -119,4 +119,4 @@ public final class DashboardEntity extends BaseSqlEntity<Dashboard> implements S | ||
119 | dashboard.setConfiguration(configuration); | 119 | dashboard.setConfiguration(configuration); |
120 | return dashboard; | 120 | return dashboard; |
121 | } | 121 | } |
122 | -} | ||
122 | +} |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.core.JsonProcessingException; | 19 | import com.fasterxml.jackson.core.JsonProcessingException; |
20 | import com.fasterxml.jackson.databind.JavaType; | 20 | import com.fasterxml.jackson.databind.JavaType; |
21 | import com.fasterxml.jackson.databind.ObjectMapper; | 21 | import com.fasterxml.jackson.databind.ObjectMapper; |
@@ -98,7 +98,7 @@ public class DashboardInfoEntity extends BaseSqlEntity<DashboardInfo> implements | @@ -98,7 +98,7 @@ public class DashboardInfoEntity extends BaseSqlEntity<DashboardInfo> implements | ||
98 | @Override | 98 | @Override |
99 | public DashboardInfo toData() { | 99 | public DashboardInfo toData() { |
100 | DashboardInfo dashboardInfo = new DashboardInfo(new DashboardId(this.getUuid())); | 100 | DashboardInfo dashboardInfo = new DashboardInfo(new DashboardId(this.getUuid())); |
101 | - dashboardInfo.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); | 101 | + dashboardInfo.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); |
102 | if (tenantId != null) { | 102 | if (tenantId != null) { |
103 | dashboardInfo.setTenantId(new TenantId(toUUID(tenantId))); | 103 | dashboardInfo.setTenantId(new TenantId(toUUID(tenantId))); |
104 | } | 104 | } |
@@ -113,4 +113,4 @@ public class DashboardInfoEntity extends BaseSqlEntity<DashboardInfo> implements | @@ -113,4 +113,4 @@ public class DashboardInfoEntity extends BaseSqlEntity<DashboardInfo> implements | ||
113 | return dashboardInfo; | 113 | return dashboardInfo; |
114 | } | 114 | } |
115 | 115 | ||
116 | -} | ||
116 | +} |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import lombok.Data; | 19 | import lombok.Data; |
20 | import lombok.EqualsAndHashCode; | 20 | import lombok.EqualsAndHashCode; |
21 | import org.thingsboard.server.common.data.id.DeviceCredentialsId; | 21 | import org.thingsboard.server.common.data.id.DeviceCredentialsId; |
@@ -70,7 +70,7 @@ public final class DeviceCredentialsEntity extends BaseSqlEntity<DeviceCredentia | @@ -70,7 +70,7 @@ public final class DeviceCredentialsEntity extends BaseSqlEntity<DeviceCredentia | ||
70 | @Override | 70 | @Override |
71 | public DeviceCredentials toData() { | 71 | public DeviceCredentials toData() { |
72 | DeviceCredentials deviceCredentials = new DeviceCredentials(new DeviceCredentialsId(this.getUuid())); | 72 | DeviceCredentials deviceCredentials = new DeviceCredentials(new DeviceCredentialsId(this.getUuid())); |
73 | - deviceCredentials.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); | 73 | + deviceCredentials.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); |
74 | if (deviceId != null) { | 74 | if (deviceId != null) { |
75 | deviceCredentials.setDeviceId(new DeviceId(toUUID(deviceId))); | 75 | deviceCredentials.setDeviceId(new DeviceId(toUUID(deviceId))); |
76 | } | 76 | } |
@@ -80,4 +80,4 @@ public final class DeviceCredentialsEntity extends BaseSqlEntity<DeviceCredentia | @@ -80,4 +80,4 @@ public final class DeviceCredentialsEntity extends BaseSqlEntity<DeviceCredentia | ||
80 | return deviceCredentials; | 80 | return deviceCredentials; |
81 | } | 81 | } |
82 | 82 | ||
83 | -} | ||
83 | +} |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import lombok.Data; | 20 | import lombok.Data; |
21 | import lombok.EqualsAndHashCode; | 21 | import lombok.EqualsAndHashCode; |
@@ -103,7 +103,7 @@ public class EventEntity extends BaseSqlEntity<Event> implements BaseEntity<Eve | @@ -103,7 +103,7 @@ public class EventEntity extends BaseSqlEntity<Event> implements BaseEntity<Eve | ||
103 | @Override | 103 | @Override |
104 | public Event toData() { | 104 | public Event toData() { |
105 | Event event = new Event(new EventId(this.getUuid())); | 105 | Event event = new Event(new EventId(this.getUuid())); |
106 | - event.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); | 106 | + event.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); |
107 | event.setTenantId(new TenantId(toUUID(tenantId))); | 107 | event.setTenantId(new TenantId(toUUID(tenantId))); |
108 | event.setEntityId(EntityIdFactory.getByTypeAndUuid(entityType, toUUID(entityId))); | 108 | event.setEntityId(EntityIdFactory.getByTypeAndUuid(entityType, toUUID(entityId))); |
109 | event.setBody(body); | 109 | event.setBody(body); |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import lombok.Data; | 20 | import lombok.Data; |
21 | import lombok.EqualsAndHashCode; | 21 | import lombok.EqualsAndHashCode; |
@@ -101,7 +101,7 @@ public class RuleChainEntity extends BaseSqlEntity<RuleChain> implements SearchT | @@ -101,7 +101,7 @@ public class RuleChainEntity extends BaseSqlEntity<RuleChain> implements SearchT | ||
101 | @Override | 101 | @Override |
102 | public RuleChain toData() { | 102 | public RuleChain toData() { |
103 | RuleChain ruleChain = new RuleChain(new RuleChainId(this.getUuid())); | 103 | RuleChain ruleChain = new RuleChain(new RuleChainId(this.getUuid())); |
104 | - ruleChain.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); | 104 | + ruleChain.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); |
105 | ruleChain.setTenantId(new TenantId(toUUID(tenantId))); | 105 | ruleChain.setTenantId(new TenantId(toUUID(tenantId))); |
106 | ruleChain.setName(name); | 106 | ruleChain.setName(name); |
107 | if (firstRuleNodeId != null) { | 107 | if (firstRuleNodeId != null) { |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import lombok.Data; | 20 | import lombok.Data; |
21 | import lombok.EqualsAndHashCode; | 21 | import lombok.EqualsAndHashCode; |
@@ -95,7 +95,7 @@ public class RuleNodeEntity extends BaseSqlEntity<RuleNode> implements SearchTex | @@ -95,7 +95,7 @@ public class RuleNodeEntity extends BaseSqlEntity<RuleNode> implements SearchTex | ||
95 | @Override | 95 | @Override |
96 | public RuleNode toData() { | 96 | public RuleNode toData() { |
97 | RuleNode ruleNode = new RuleNode(new RuleNodeId(this.getUuid())); | 97 | RuleNode ruleNode = new RuleNode(new RuleNodeId(this.getUuid())); |
98 | - ruleNode.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); | 98 | + ruleNode.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); |
99 | if (ruleChainId != null) { | 99 | if (ruleChainId != null) { |
100 | ruleNode.setRuleChainId(new RuleChainId(toUUID(ruleChainId))); | 100 | ruleNode.setRuleChainId(new RuleChainId(toUUID(ruleChainId))); |
101 | } | 101 | } |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import lombok.Data; | 20 | import lombok.Data; |
21 | import lombok.EqualsAndHashCode; | 21 | import lombok.EqualsAndHashCode; |
@@ -122,7 +122,7 @@ public final class TenantEntity extends BaseSqlEntity<Tenant> implements SearchT | @@ -122,7 +122,7 @@ public final class TenantEntity extends BaseSqlEntity<Tenant> implements SearchT | ||
122 | @Override | 122 | @Override |
123 | public Tenant toData() { | 123 | public Tenant toData() { |
124 | Tenant tenant = new Tenant(new TenantId(this.getUuid())); | 124 | Tenant tenant = new Tenant(new TenantId(this.getUuid())); |
125 | - tenant.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); | 125 | + tenant.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); |
126 | tenant.setTitle(title); | 126 | tenant.setTitle(title); |
127 | tenant.setRegion(region); | 127 | tenant.setRegion(region); |
128 | tenant.setCountry(country); | 128 | tenant.setCountry(country); |
@@ -140,4 +140,4 @@ public final class TenantEntity extends BaseSqlEntity<Tenant> implements SearchT | @@ -140,4 +140,4 @@ public final class TenantEntity extends BaseSqlEntity<Tenant> implements SearchT | ||
140 | } | 140 | } |
141 | 141 | ||
142 | 142 | ||
143 | -} | ||
143 | +} |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import lombok.Data; | 19 | import lombok.Data; |
20 | import lombok.EqualsAndHashCode; | 20 | import lombok.EqualsAndHashCode; |
21 | import org.thingsboard.server.common.data.id.UserCredentialsId; | 21 | import org.thingsboard.server.common.data.id.UserCredentialsId; |
@@ -70,7 +70,7 @@ public final class UserCredentialsEntity extends BaseSqlEntity<UserCredentials> | @@ -70,7 +70,7 @@ public final class UserCredentialsEntity extends BaseSqlEntity<UserCredentials> | ||
70 | @Override | 70 | @Override |
71 | public UserCredentials toData() { | 71 | public UserCredentials toData() { |
72 | UserCredentials userCredentials = new UserCredentials(new UserCredentialsId(this.getUuid())); | 72 | UserCredentials userCredentials = new UserCredentials(new UserCredentialsId(this.getUuid())); |
73 | - userCredentials.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); | 73 | + userCredentials.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); |
74 | if (userId != null) { | 74 | if (userId != null) { |
75 | userCredentials.setUserId(new UserId(toUUID(userId))); | 75 | userCredentials.setUserId(new UserId(toUUID(userId))); |
76 | } | 76 | } |
@@ -81,4 +81,4 @@ public final class UserCredentialsEntity extends BaseSqlEntity<UserCredentials> | @@ -81,4 +81,4 @@ public final class UserCredentialsEntity extends BaseSqlEntity<UserCredentials> | ||
81 | return userCredentials; | 81 | return userCredentials; |
82 | } | 82 | } |
83 | 83 | ||
84 | -} | ||
84 | +} |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import lombok.Data; | 20 | import lombok.Data; |
21 | import lombok.EqualsAndHashCode; | 21 | import lombok.EqualsAndHashCode; |
@@ -109,7 +109,7 @@ public class UserEntity extends BaseSqlEntity<User> implements SearchTextEntity< | @@ -109,7 +109,7 @@ public class UserEntity extends BaseSqlEntity<User> implements SearchTextEntity< | ||
109 | @Override | 109 | @Override |
110 | public User toData() { | 110 | public User toData() { |
111 | User user = new User(new UserId(this.getUuid())); | 111 | User user = new User(new UserId(this.getUuid())); |
112 | - user.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); | 112 | + user.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); |
113 | user.setAuthority(authority); | 113 | user.setAuthority(authority); |
114 | if (tenantId != null) { | 114 | if (tenantId != null) { |
115 | user.setTenantId(new TenantId(fromString(tenantId))); | 115 | user.setTenantId(new TenantId(fromString(tenantId))); |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import lombok.Data; | 20 | import lombok.Data; |
21 | import lombok.EqualsAndHashCode; | 21 | import lombok.EqualsAndHashCode; |
@@ -76,7 +76,7 @@ public final class WidgetTypeEntity extends BaseSqlEntity<WidgetType> implement | @@ -76,7 +76,7 @@ public final class WidgetTypeEntity extends BaseSqlEntity<WidgetType> implement | ||
76 | @Override | 76 | @Override |
77 | public WidgetType toData() { | 77 | public WidgetType toData() { |
78 | WidgetType widgetType = new WidgetType(new WidgetTypeId(this.getUuid())); | 78 | WidgetType widgetType = new WidgetType(new WidgetTypeId(this.getUuid())); |
79 | - widgetType.setCreatedTime(UUIDs.unixTimestamp(this.getUuid())); | 79 | + widgetType.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); |
80 | if (tenantId != null) { | 80 | if (tenantId != null) { |
81 | widgetType.setTenantId(new TenantId(toUUID(tenantId))); | 81 | widgetType.setTenantId(new TenantId(toUUID(tenantId))); |
82 | } | 82 | } |
@@ -16,7 +16,7 @@ | @@ -16,7 +16,7 @@ | ||
16 | package org.thingsboard.server.dao.model.sql; | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | ||
18 | 18 | ||
19 | -import com.datastax.driver.core.utils.UUIDs; | 19 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
20 | import lombok.Data; | 20 | import lombok.Data; |
21 | import lombok.EqualsAndHashCode; | 21 | import lombok.EqualsAndHashCode; |
22 | import org.thingsboard.server.common.data.UUIDConverter; | 22 | import org.thingsboard.server.common.data.UUIDConverter; |
@@ -77,7 +77,7 @@ public final class WidgetsBundleEntity extends BaseSqlEntity<WidgetsBundle> impl | @@ -77,7 +77,7 @@ public final class WidgetsBundleEntity extends BaseSqlEntity<WidgetsBundle> impl | ||
77 | @Override | 77 | @Override |
78 | public WidgetsBundle toData() { | 78 | public WidgetsBundle toData() { |
79 | WidgetsBundle widgetsBundle = new WidgetsBundle(new WidgetsBundleId(UUIDConverter.fromString(id))); | 79 | WidgetsBundle widgetsBundle = new WidgetsBundle(new WidgetsBundleId(UUIDConverter.fromString(id))); |
80 | - widgetsBundle.setCreatedTime(UUIDs.unixTimestamp(UUIDConverter.fromString(id))); | 80 | + widgetsBundle.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id))); |
81 | if (tenantId != null) { | 81 | if (tenantId != null) { |
82 | widgetsBundle.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); | 82 | widgetsBundle.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); |
83 | } | 83 | } |
1 | -/** | ||
2 | - * Copyright © 2016-2020 The Thingsboard Authors | ||
3 | - * | ||
4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | - * you may not use this file except in compliance with the License. | ||
6 | - * You may obtain a copy of the License at | ||
7 | - * | ||
8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | - * | ||
10 | - * Unless required by applicable law or agreed to in writing, software | ||
11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | - * See the License for the specific language governing permissions and | ||
14 | - * limitations under the License. | ||
15 | - */ | ||
16 | -package org.thingsboard.server.dao.model.wrapper; | ||
17 | - | ||
18 | - | ||
19 | -import com.datastax.driver.core.ResultSet; | ||
20 | - | ||
21 | -public class EntityResultSet<T> { | ||
22 | - | ||
23 | - private ResultSet resultSet; | ||
24 | - private T entity; | ||
25 | - | ||
26 | - public EntityResultSet(ResultSet resultSet, T entity) { | ||
27 | - this.resultSet = resultSet; | ||
28 | - this.entity = entity; | ||
29 | - } | ||
30 | - | ||
31 | - public T getEntity() { | ||
32 | - return entity; | ||
33 | - } | ||
34 | - | ||
35 | - public boolean wasApplied() { | ||
36 | - return resultSet.wasApplied(); | ||
37 | - } | ||
38 | -} |
@@ -15,9 +15,11 @@ | @@ -15,9 +15,11 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.nosql; | 16 | package org.thingsboard.server.dao.nosql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.ResultSet; | ||
19 | -import com.datastax.driver.core.ResultSetFuture; | 18 | +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; |
19 | +import com.datastax.oss.driver.api.core.cql.Row; | ||
20 | import com.google.common.base.Function; | 20 | import com.google.common.base.Function; |
21 | +import com.google.common.collect.Lists; | ||
22 | +import com.google.common.util.concurrent.AsyncFunction; | ||
21 | import com.google.common.util.concurrent.Futures; | 23 | import com.google.common.util.concurrent.Futures; |
22 | import com.google.common.util.concurrent.ListenableFuture; | 24 | import com.google.common.util.concurrent.ListenableFuture; |
23 | import org.thingsboard.common.util.ThingsBoardThreadFactory; | 25 | import org.thingsboard.common.util.ThingsBoardThreadFactory; |
@@ -25,8 +27,11 @@ import org.thingsboard.common.util.ThingsBoardThreadFactory; | @@ -25,8 +27,11 @@ import org.thingsboard.common.util.ThingsBoardThreadFactory; | ||
25 | import javax.annotation.Nullable; | 27 | import javax.annotation.Nullable; |
26 | import javax.annotation.PostConstruct; | 28 | import javax.annotation.PostConstruct; |
27 | import javax.annotation.PreDestroy; | 29 | import javax.annotation.PreDestroy; |
30 | +import java.util.ArrayList; | ||
31 | +import java.util.List; | ||
28 | import java.util.concurrent.ExecutorService; | 32 | import java.util.concurrent.ExecutorService; |
29 | import java.util.concurrent.Executors; | 33 | import java.util.concurrent.Executors; |
34 | +import java.util.stream.Collectors; | ||
30 | 35 | ||
31 | /** | 36 | /** |
32 | * Created by ashvayka on 21.02.17. | 37 | * Created by ashvayka on 21.02.17. |
@@ -47,13 +52,28 @@ public abstract class CassandraAbstractAsyncDao extends CassandraAbstractDao { | @@ -47,13 +52,28 @@ public abstract class CassandraAbstractAsyncDao extends CassandraAbstractDao { | ||
47 | } | 52 | } |
48 | } | 53 | } |
49 | 54 | ||
50 | - protected <T> ListenableFuture<T> getFuture(ResultSetFuture future, java.util.function.Function<ResultSet, T> transformer) { | ||
51 | - return Futures.transform(future, new Function<ResultSet, T>() { | 55 | + protected <T> ListenableFuture<T> getFuture(TbResultSetFuture future, java.util.function.Function<TbResultSet, T> transformer) { |
56 | + return Futures.transform(future, new Function<TbResultSet, T>() { | ||
52 | @Nullable | 57 | @Nullable |
53 | @Override | 58 | @Override |
54 | - public T apply(@Nullable ResultSet input) { | 59 | + public T apply(@Nullable TbResultSet input) { |
55 | return transformer.apply(input); | 60 | return transformer.apply(input); |
56 | } | 61 | } |
57 | }, readResultsProcessingExecutor); | 62 | }, readResultsProcessingExecutor); |
58 | } | 63 | } |
64 | + | ||
65 | + protected <T> ListenableFuture<T> getFutureAsync(TbResultSetFuture future, com.google.common.util.concurrent.AsyncFunction<TbResultSet, T> transformer) { | ||
66 | + return Futures.transformAsync(future, new AsyncFunction<TbResultSet, T>() { | ||
67 | + @Nullable | ||
68 | + @Override | ||
69 | + public ListenableFuture<T> apply(@Nullable TbResultSet input) { | ||
70 | + try { | ||
71 | + return transformer.apply(input); | ||
72 | + } catch (Exception e) { | ||
73 | + return Futures.immediateFailedFuture(e); | ||
74 | + } | ||
75 | + } | ||
76 | + }, readResultsProcessingExecutor); | ||
77 | + } | ||
78 | + | ||
59 | } | 79 | } |
@@ -15,16 +15,17 @@ | @@ -15,16 +15,17 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.nosql; | 16 | package org.thingsboard.server.dao.nosql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.*; | ||
19 | -import com.datastax.driver.core.exceptions.CodecNotFoundException; | 18 | +import com.datastax.oss.driver.api.core.ConsistencyLevel; |
19 | +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; | ||
20 | +import com.datastax.oss.driver.api.core.cql.BoundStatement; | ||
21 | +import com.datastax.oss.driver.api.core.cql.PreparedStatement; | ||
22 | +import com.datastax.oss.driver.api.core.cql.Statement; | ||
20 | import lombok.extern.slf4j.Slf4j; | 23 | import lombok.extern.slf4j.Slf4j; |
21 | import org.springframework.beans.factory.annotation.Autowired; | 24 | import org.springframework.beans.factory.annotation.Autowired; |
22 | import org.springframework.beans.factory.annotation.Qualifier; | 25 | import org.springframework.beans.factory.annotation.Qualifier; |
23 | import org.thingsboard.server.common.data.id.TenantId; | 26 | import org.thingsboard.server.common.data.id.TenantId; |
24 | import org.thingsboard.server.dao.cassandra.CassandraCluster; | 27 | import org.thingsboard.server.dao.cassandra.CassandraCluster; |
25 | -import org.thingsboard.server.dao.model.type.ComponentLifecycleStateCodec; | ||
26 | -import org.thingsboard.server.dao.model.type.EntityTypeCodec; | ||
27 | -import org.thingsboard.server.dao.model.type.JsonCodec; | 28 | +import org.thingsboard.server.dao.cassandra.guava.GuavaSession; |
28 | 29 | ||
29 | import java.util.concurrent.ConcurrentHashMap; | 30 | import java.util.concurrent.ConcurrentHashMap; |
30 | import java.util.concurrent.ConcurrentMap; | 31 | import java.util.concurrent.ConcurrentMap; |
@@ -41,20 +42,16 @@ public abstract class CassandraAbstractDao { | @@ -41,20 +42,16 @@ public abstract class CassandraAbstractDao { | ||
41 | @Autowired | 42 | @Autowired |
42 | private CassandraBufferedRateExecutor rateLimiter; | 43 | private CassandraBufferedRateExecutor rateLimiter; |
43 | 44 | ||
44 | - private Session session; | 45 | + private GuavaSession session; |
45 | 46 | ||
46 | private ConsistencyLevel defaultReadLevel; | 47 | private ConsistencyLevel defaultReadLevel; |
47 | private ConsistencyLevel defaultWriteLevel; | 48 | private ConsistencyLevel defaultWriteLevel; |
48 | 49 | ||
49 | - private Session getSession() { | 50 | + private GuavaSession getSession() { |
50 | if (session == null) { | 51 | if (session == null) { |
51 | session = cluster.getSession(); | 52 | session = cluster.getSession(); |
52 | defaultReadLevel = cluster.getDefaultReadConsistencyLevel(); | 53 | defaultReadLevel = cluster.getDefaultReadConsistencyLevel(); |
53 | defaultWriteLevel = cluster.getDefaultWriteConsistencyLevel(); | 54 | defaultWriteLevel = cluster.getDefaultWriteConsistencyLevel(); |
54 | - CodecRegistry registry = session.getCluster().getConfiguration().getCodecRegistry(); | ||
55 | - registerCodecIfNotFound(registry, new JsonCodec()); | ||
56 | - registerCodecIfNotFound(registry, new ComponentLifecycleStateCodec()); | ||
57 | - registerCodecIfNotFound(registry, new EntityTypeCodec()); | ||
58 | } | 55 | } |
59 | return session; | 56 | return session; |
60 | } | 57 | } |
@@ -63,38 +60,30 @@ public abstract class CassandraAbstractDao { | @@ -63,38 +60,30 @@ public abstract class CassandraAbstractDao { | ||
63 | return preparedStatementMap.computeIfAbsent(query, i -> getSession().prepare(i)); | 60 | return preparedStatementMap.computeIfAbsent(query, i -> getSession().prepare(i)); |
64 | } | 61 | } |
65 | 62 | ||
66 | - private void registerCodecIfNotFound(CodecRegistry registry, TypeCodec<?> codec) { | ||
67 | - try { | ||
68 | - registry.codecFor(codec.getCqlType(), codec.getJavaType()); | ||
69 | - } catch (CodecNotFoundException e) { | ||
70 | - registry.register(codec); | ||
71 | - } | ||
72 | - } | ||
73 | - | ||
74 | - protected ResultSet executeRead(TenantId tenantId, Statement statement) { | 63 | + protected AsyncResultSet executeRead(TenantId tenantId, Statement statement) { |
75 | return execute(tenantId, statement, defaultReadLevel); | 64 | return execute(tenantId, statement, defaultReadLevel); |
76 | } | 65 | } |
77 | 66 | ||
78 | - protected ResultSet executeWrite(TenantId tenantId, Statement statement) { | 67 | + protected AsyncResultSet executeWrite(TenantId tenantId, Statement statement) { |
79 | return execute(tenantId, statement, defaultWriteLevel); | 68 | return execute(tenantId, statement, defaultWriteLevel); |
80 | } | 69 | } |
81 | 70 | ||
82 | - protected ResultSetFuture executeAsyncRead(TenantId tenantId, Statement statement) { | 71 | + protected TbResultSetFuture executeAsyncRead(TenantId tenantId, Statement statement) { |
83 | return executeAsync(tenantId, statement, defaultReadLevel); | 72 | return executeAsync(tenantId, statement, defaultReadLevel); |
84 | } | 73 | } |
85 | 74 | ||
86 | - protected ResultSetFuture executeAsyncWrite(TenantId tenantId, Statement statement) { | 75 | + protected TbResultSetFuture executeAsyncWrite(TenantId tenantId, Statement statement) { |
87 | return executeAsync(tenantId, statement, defaultWriteLevel); | 76 | return executeAsync(tenantId, statement, defaultWriteLevel); |
88 | } | 77 | } |
89 | 78 | ||
90 | - private ResultSet execute(TenantId tenantId, Statement statement, ConsistencyLevel level) { | 79 | + private AsyncResultSet execute(TenantId tenantId, Statement statement, ConsistencyLevel level) { |
91 | if (log.isDebugEnabled()) { | 80 | if (log.isDebugEnabled()) { |
92 | log.debug("Execute cassandra statement {}", statementToString(statement)); | 81 | log.debug("Execute cassandra statement {}", statementToString(statement)); |
93 | } | 82 | } |
94 | return executeAsync(tenantId, statement, level).getUninterruptibly(); | 83 | return executeAsync(tenantId, statement, level).getUninterruptibly(); |
95 | } | 84 | } |
96 | 85 | ||
97 | - private ResultSetFuture executeAsync(TenantId tenantId, Statement statement, ConsistencyLevel level) { | 86 | + private TbResultSetFuture executeAsync(TenantId tenantId, Statement statement, ConsistencyLevel level) { |
98 | if (log.isDebugEnabled()) { | 87 | if (log.isDebugEnabled()) { |
99 | log.debug("Execute cassandra async statement {}", statementToString(statement)); | 88 | log.debug("Execute cassandra async statement {}", statementToString(statement)); |
100 | } | 89 | } |
@@ -106,9 +95,9 @@ public abstract class CassandraAbstractDao { | @@ -106,9 +95,9 @@ public abstract class CassandraAbstractDao { | ||
106 | 95 | ||
107 | private static String statementToString(Statement statement) { | 96 | private static String statementToString(Statement statement) { |
108 | if (statement instanceof BoundStatement) { | 97 | if (statement instanceof BoundStatement) { |
109 | - return ((BoundStatement) statement).preparedStatement().getQueryString(); | 98 | + return ((BoundStatement) statement).getPreparedStatement().getQuery(); |
110 | } else { | 99 | } else { |
111 | return statement.toString(); | 100 | return statement.toString(); |
112 | } | 101 | } |
113 | } | 102 | } |
114 | -} | ||
103 | +} |
@@ -15,8 +15,8 @@ | @@ -15,8 +15,8 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.nosql; | 16 | package org.thingsboard.server.dao.nosql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.ResultSet; | ||
19 | -import com.datastax.driver.core.ResultSetFuture; | 18 | +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; |
19 | +import com.google.common.util.concurrent.ListenableFuture; | ||
20 | import com.google.common.util.concurrent.SettableFuture; | 20 | import com.google.common.util.concurrent.SettableFuture; |
21 | import lombok.extern.slf4j.Slf4j; | 21 | import lombok.extern.slf4j.Slf4j; |
22 | import org.springframework.beans.factory.annotation.Autowired; | 22 | import org.springframework.beans.factory.annotation.Autowired; |
@@ -39,7 +39,7 @@ import java.util.Map; | @@ -39,7 +39,7 @@ import java.util.Map; | ||
39 | @Component | 39 | @Component |
40 | @Slf4j | 40 | @Slf4j |
41 | @NoSqlAnyDao | 41 | @NoSqlAnyDao |
42 | -public class CassandraBufferedRateExecutor extends AbstractBufferedRateExecutor<CassandraStatementTask, ResultSetFuture, ResultSet> { | 42 | +public class CassandraBufferedRateExecutor extends AbstractBufferedRateExecutor<CassandraStatementTask, TbResultSetFuture, TbResultSet> { |
43 | 43 | ||
44 | @Autowired | 44 | @Autowired |
45 | private EntityService entityService; | 45 | private EntityService entityService; |
@@ -107,19 +107,22 @@ public class CassandraBufferedRateExecutor extends AbstractBufferedRateExecutor< | @@ -107,19 +107,22 @@ public class CassandraBufferedRateExecutor extends AbstractBufferedRateExecutor< | ||
107 | } | 107 | } |
108 | 108 | ||
109 | @Override | 109 | @Override |
110 | - protected SettableFuture<ResultSet> create() { | 110 | + protected SettableFuture<TbResultSet> create() { |
111 | return SettableFuture.create(); | 111 | return SettableFuture.create(); |
112 | } | 112 | } |
113 | 113 | ||
114 | @Override | 114 | @Override |
115 | - protected ResultSetFuture wrap(CassandraStatementTask task, SettableFuture<ResultSet> future) { | 115 | + protected TbResultSetFuture wrap(CassandraStatementTask task, SettableFuture<TbResultSet> future) { |
116 | return new TbResultSetFuture(future); | 116 | return new TbResultSetFuture(future); |
117 | } | 117 | } |
118 | 118 | ||
119 | @Override | 119 | @Override |
120 | - protected ResultSetFuture execute(AsyncTaskContext<CassandraStatementTask, ResultSet> taskCtx) { | 120 | + protected ListenableFuture<TbResultSet> execute(AsyncTaskContext<CassandraStatementTask, TbResultSet> taskCtx) { |
121 | CassandraStatementTask task = taskCtx.getTask(); | 121 | CassandraStatementTask task = taskCtx.getTask(); |
122 | - return task.getSession().executeAsync(task.getStatement()); | 122 | + return task.executeAsync( |
123 | + statement -> | ||
124 | + this.submit(new CassandraStatementTask(task.getTenantId(), task.getSession(), statement)) | ||
125 | + ); | ||
123 | } | 126 | } |
124 | 127 | ||
125 | } | 128 | } |
dao/src/main/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFuture.java
deleted
100644 → 0
1 | -/** | ||
2 | - * Copyright © 2016-2020 The Thingsboard Authors | ||
3 | - * | ||
4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | - * you may not use this file except in compliance with the License. | ||
6 | - * You may obtain a copy of the License at | ||
7 | - * | ||
8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | - * | ||
10 | - * Unless required by applicable law or agreed to in writing, software | ||
11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | - * See the License for the specific language governing permissions and | ||
14 | - * limitations under the License. | ||
15 | - */ | ||
16 | -package org.thingsboard.server.dao.nosql; | ||
17 | - | ||
18 | -import com.datastax.driver.core.ResultSet; | ||
19 | -import com.datastax.driver.core.ResultSetFuture; | ||
20 | -import com.datastax.driver.core.Session; | ||
21 | -import com.datastax.driver.core.Statement; | ||
22 | -import com.google.common.util.concurrent.FutureCallback; | ||
23 | -import com.google.common.util.concurrent.Futures; | ||
24 | -import com.google.common.util.concurrent.ListenableFuture; | ||
25 | -import com.google.common.util.concurrent.MoreExecutors; | ||
26 | -import com.google.common.util.concurrent.Uninterruptibles; | ||
27 | -import org.thingsboard.server.dao.exception.BufferLimitException; | ||
28 | -import org.thingsboard.server.dao.util.AsyncRateLimiter; | ||
29 | - | ||
30 | -import javax.annotation.Nullable; | ||
31 | -import java.util.concurrent.CancellationException; | ||
32 | -import java.util.concurrent.ExecutionException; | ||
33 | -import java.util.concurrent.Executor; | ||
34 | -import java.util.concurrent.TimeUnit; | ||
35 | -import java.util.concurrent.TimeoutException; | ||
36 | - | ||
37 | -public class RateLimitedResultSetFuture implements ResultSetFuture { | ||
38 | - | ||
39 | - private final ListenableFuture<ResultSetFuture> originalFuture; | ||
40 | - private final ListenableFuture<Void> rateLimitFuture; | ||
41 | - | ||
42 | - public RateLimitedResultSetFuture(Session session, AsyncRateLimiter rateLimiter, Statement statement) { | ||
43 | - this.rateLimitFuture = Futures.catchingAsync(rateLimiter.acquireAsync(), Throwable.class, t -> { | ||
44 | - if (!(t instanceof BufferLimitException)) { | ||
45 | - rateLimiter.release(); | ||
46 | - } | ||
47 | - return Futures.immediateFailedFuture(t); | ||
48 | - }, MoreExecutors.directExecutor()); | ||
49 | - this.originalFuture = Futures.transform(rateLimitFuture, | ||
50 | - i -> executeAsyncWithRelease(rateLimiter, session, statement), MoreExecutors.directExecutor()); | ||
51 | - | ||
52 | - } | ||
53 | - | ||
54 | - @Override | ||
55 | - public ResultSet getUninterruptibly() { | ||
56 | - return safeGet().getUninterruptibly(); | ||
57 | - } | ||
58 | - | ||
59 | - @Override | ||
60 | - public ResultSet getUninterruptibly(long timeout, TimeUnit unit) throws TimeoutException { | ||
61 | - long rateLimitStart = System.nanoTime(); | ||
62 | - ResultSetFuture resultSetFuture = null; | ||
63 | - try { | ||
64 | - resultSetFuture = originalFuture.get(timeout, unit); | ||
65 | - } catch (InterruptedException | ExecutionException e) { | ||
66 | - throw new IllegalStateException(e); | ||
67 | - } | ||
68 | - long rateLimitDurationNano = System.nanoTime() - rateLimitStart; | ||
69 | - long innerTimeoutNano = unit.toNanos(timeout) - rateLimitDurationNano; | ||
70 | - if (innerTimeoutNano > 0) { | ||
71 | - return resultSetFuture.getUninterruptibly(innerTimeoutNano, TimeUnit.NANOSECONDS); | ||
72 | - } | ||
73 | - throw new TimeoutException("Timeout waiting for task."); | ||
74 | - } | ||
75 | - | ||
76 | - @Override | ||
77 | - public boolean cancel(boolean mayInterruptIfRunning) { | ||
78 | - if (originalFuture.isDone()) { | ||
79 | - return safeGet().cancel(mayInterruptIfRunning); | ||
80 | - } else { | ||
81 | - return originalFuture.cancel(mayInterruptIfRunning); | ||
82 | - } | ||
83 | - } | ||
84 | - | ||
85 | - @Override | ||
86 | - public boolean isCancelled() { | ||
87 | - if (originalFuture.isDone()) { | ||
88 | - return safeGet().isCancelled(); | ||
89 | - } | ||
90 | - | ||
91 | - return originalFuture.isCancelled(); | ||
92 | - } | ||
93 | - | ||
94 | - @Override | ||
95 | - public boolean isDone() { | ||
96 | - return originalFuture.isDone() && safeGet().isDone(); | ||
97 | - } | ||
98 | - | ||
99 | - @Override | ||
100 | - public ResultSet get() throws InterruptedException, ExecutionException { | ||
101 | - return safeGet().get(); | ||
102 | - } | ||
103 | - | ||
104 | - @Override | ||
105 | - public ResultSet get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { | ||
106 | - long rateLimitStart = System.nanoTime(); | ||
107 | - ResultSetFuture resultSetFuture = originalFuture.get(timeout, unit); | ||
108 | - long rateLimitDurationNano = System.nanoTime() - rateLimitStart; | ||
109 | - long innerTimeoutNano = unit.toNanos(timeout) - rateLimitDurationNano; | ||
110 | - if (innerTimeoutNano > 0) { | ||
111 | - return resultSetFuture.get(innerTimeoutNano, TimeUnit.NANOSECONDS); | ||
112 | - } | ||
113 | - throw new TimeoutException("Timeout waiting for task."); | ||
114 | - } | ||
115 | - | ||
116 | - @Override | ||
117 | - public void addListener(Runnable listener, Executor executor) { | ||
118 | - originalFuture.addListener(() -> { | ||
119 | - try { | ||
120 | - ResultSetFuture resultSetFuture = Uninterruptibles.getUninterruptibly(originalFuture); | ||
121 | - resultSetFuture.addListener(listener, executor); | ||
122 | - } catch (CancellationException | ExecutionException e) { | ||
123 | - Futures.immediateFailedFuture(e).addListener(listener, executor); | ||
124 | - } | ||
125 | - }, executor); | ||
126 | - } | ||
127 | - | ||
128 | - private ResultSetFuture safeGet() { | ||
129 | - try { | ||
130 | - return originalFuture.get(); | ||
131 | - } catch (InterruptedException | ExecutionException e) { | ||
132 | - throw new IllegalStateException(e); | ||
133 | - } | ||
134 | - } | ||
135 | - | ||
136 | - private ResultSetFuture executeAsyncWithRelease(AsyncRateLimiter rateLimiter, Session session, Statement statement) { | ||
137 | - try { | ||
138 | - ResultSetFuture resultSetFuture = session.executeAsync(statement); | ||
139 | - Futures.addCallback(resultSetFuture, new FutureCallback<ResultSet>() { | ||
140 | - @Override | ||
141 | - public void onSuccess(@Nullable ResultSet result) { | ||
142 | - rateLimiter.release(); | ||
143 | - } | ||
144 | - | ||
145 | - @Override | ||
146 | - public void onFailure(Throwable t) { | ||
147 | - rateLimiter.release(); | ||
148 | - } | ||
149 | - }, MoreExecutors.directExecutor()); | ||
150 | - return resultSetFuture; | ||
151 | - } catch (RuntimeException re) { | ||
152 | - rateLimiter.release(); | ||
153 | - throw re; | ||
154 | - } | ||
155 | - } | ||
156 | -} |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.sql; | 16 | package org.thingsboard.server.dao.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.google.common.collect.Lists; | 19 | import com.google.common.collect.Lists; |
20 | import com.google.common.util.concurrent.ListenableFuture; | 20 | import com.google.common.util.concurrent.ListenableFuture; |
21 | import lombok.extern.slf4j.Slf4j; | 21 | import lombok.extern.slf4j.Slf4j; |
@@ -59,7 +59,7 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D> | @@ -59,7 +59,7 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D> | ||
59 | setSearchText(entity); | 59 | setSearchText(entity); |
60 | log.debug("Saving entity {}", entity); | 60 | log.debug("Saving entity {}", entity); |
61 | if (entity.getUuid() == null) { | 61 | if (entity.getUuid() == null) { |
62 | - entity.setUuid(UUIDs.timeBased()); | 62 | + entity.setUuid(Uuids.timeBased()); |
63 | } | 63 | } |
64 | entity = getCrudRepository().save(entity); | 64 | entity = getCrudRepository().save(entity); |
65 | return DaoUtil.getData(entity); | 65 | return DaoUtil.getData(entity); |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.sql; | 16 | package org.thingsboard.server.dao.sql; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import org.springframework.data.jpa.domain.Specification; | 19 | import org.springframework.data.jpa.domain.Specification; |
20 | import org.thingsboard.server.common.data.UUIDConverter; | 20 | import org.thingsboard.server.common.data.UUIDConverter; |
21 | import org.thingsboard.server.common.data.page.TimePageLink; | 21 | import org.thingsboard.server.common.data.page.TimePageLink; |
@@ -40,12 +40,12 @@ public abstract class JpaAbstractSearchTimeDao<E extends BaseEntity<D>, D> exten | @@ -40,12 +40,12 @@ public abstract class JpaAbstractSearchTimeDao<E extends BaseEntity<D>, D> exten | ||
40 | public Predicate toPredicate(Root<T> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { | 40 | public Predicate toPredicate(Root<T> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { |
41 | List<Predicate> predicates = new ArrayList<>(); | 41 | List<Predicate> predicates = new ArrayList<>(); |
42 | if (pageLink.getStartTime() != null) { | 42 | if (pageLink.getStartTime() != null) { |
43 | - UUID startOf = UUIDs.startOf(pageLink.getStartTime()); | 43 | + UUID startOf = Uuids.startOf(pageLink.getStartTime()); |
44 | Predicate lowerBound = criteriaBuilder.greaterThanOrEqualTo(root.get(idColumn), UUIDConverter.fromTimeUUID(startOf)); | 44 | Predicate lowerBound = criteriaBuilder.greaterThanOrEqualTo(root.get(idColumn), UUIDConverter.fromTimeUUID(startOf)); |
45 | predicates.add(lowerBound); | 45 | predicates.add(lowerBound); |
46 | } | 46 | } |
47 | if (pageLink.getEndTime() != null) { | 47 | if (pageLink.getEndTime() != null) { |
48 | - UUID endOf = UUIDs.endOf(pageLink.getEndTime()); | 48 | + UUID endOf = Uuids.endOf(pageLink.getEndTime()); |
49 | Predicate upperBound = criteriaBuilder.lessThanOrEqualTo(root.get(idColumn), UUIDConverter.fromTimeUUID(endOf)); | 49 | Predicate upperBound = criteriaBuilder.lessThanOrEqualTo(root.get(idColumn), UUIDConverter.fromTimeUUID(endOf)); |
50 | predicates.add(upperBound); | 50 | predicates.add(upperBound); |
51 | } | 51 | } |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.sql.component; | 16 | package org.thingsboard.server.dao.sql.component; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import org.springframework.beans.factory.annotation.Autowired; | 19 | import org.springframework.beans.factory.annotation.Autowired; |
20 | import org.springframework.data.repository.CrudRepository; | 20 | import org.springframework.data.repository.CrudRepository; |
21 | import org.springframework.stereotype.Component; | 21 | import org.springframework.stereotype.Component; |
@@ -64,7 +64,7 @@ public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao<Comp | @@ -64,7 +64,7 @@ public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao<Comp | ||
64 | @Override | 64 | @Override |
65 | public Optional<ComponentDescriptor> saveIfNotExist(TenantId tenantId, ComponentDescriptor component) { | 65 | public Optional<ComponentDescriptor> saveIfNotExist(TenantId tenantId, ComponentDescriptor component) { |
66 | if (component.getId() == null) { | 66 | if (component.getId() == null) { |
67 | - component.setId(new ComponentDescriptorId(UUIDs.timeBased())); | 67 | + component.setId(new ComponentDescriptorId(Uuids.timeBased())); |
68 | } | 68 | } |
69 | if (!componentDescriptorRepository.existsById(UUIDConverter.fromTimeUUID(component.getId().getId()))) { | 69 | if (!componentDescriptorRepository.existsById(UUIDConverter.fromTimeUUID(component.getId().getId()))) { |
70 | ComponentDescriptorEntity componentDescriptorEntity = new ComponentDescriptorEntity(component); | 70 | ComponentDescriptorEntity componentDescriptorEntity = new ComponentDescriptorEntity(component); |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.sql.event; | 16 | package org.thingsboard.server.dao.sql.event; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.google.common.util.concurrent.ListenableFuture; | 19 | import com.google.common.util.concurrent.ListenableFuture; |
20 | import lombok.extern.slf4j.Slf4j; | 20 | import lombok.extern.slf4j.Slf4j; |
21 | import org.apache.commons.lang3.StringUtils; | 21 | import org.apache.commons.lang3.StringUtils; |
@@ -75,7 +75,7 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event | @@ -75,7 +75,7 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event | ||
75 | public Event save(TenantId tenantId, Event event) { | 75 | public Event save(TenantId tenantId, Event event) { |
76 | log.debug("Save event [{}] ", event); | 76 | log.debug("Save event [{}] ", event); |
77 | if (event.getId() == null) { | 77 | if (event.getId() == null) { |
78 | - event.setId(new EventId(UUIDs.timeBased())); | 78 | + event.setId(new EventId(Uuids.timeBased())); |
79 | } | 79 | } |
80 | if (StringUtils.isEmpty(event.getUid())) { | 80 | if (StringUtils.isEmpty(event.getUid())) { |
81 | event.setUid(event.getId().toString()); | 81 | event.setUid(event.getId().toString()); |
@@ -87,7 +87,7 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event | @@ -87,7 +87,7 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event | ||
87 | public ListenableFuture<Event> saveAsync(Event event) { | 87 | public ListenableFuture<Event> saveAsync(Event event) { |
88 | log.debug("Save event [{}] ", event); | 88 | log.debug("Save event [{}] ", event); |
89 | if (event.getId() == null) { | 89 | if (event.getId() == null) { |
90 | - event.setId(new EventId(UUIDs.timeBased())); | 90 | + event.setId(new EventId(Uuids.timeBased())); |
91 | } | 91 | } |
92 | if (StringUtils.isEmpty(event.getUid())) { | 92 | if (StringUtils.isEmpty(event.getUid())) { |
93 | event.setUid(event.getId().toString()); | 93 | event.setUid(event.getId().toString()); |
@@ -152,7 +152,7 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event | @@ -152,7 +152,7 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event | ||
152 | entity.setTenantId(UUIDConverter.fromTimeUUID(systemTenantId)); | 152 | entity.setTenantId(UUIDConverter.fromTimeUUID(systemTenantId)); |
153 | } | 153 | } |
154 | if (entity.getUuid() == null) { | 154 | if (entity.getUuid() == null) { |
155 | - entity.setUuid(UUIDs.timeBased()); | 155 | + entity.setUuid(Uuids.timeBased()); |
156 | } | 156 | } |
157 | if (StringUtils.isEmpty(entity.getEventUid())) { | 157 | if (StringUtils.isEmpty(entity.getEventUid())) { |
158 | entity.setEventUid(entity.getUuid().toString()); | 158 | entity.setEventUid(entity.getUuid().toString()); |
@@ -15,8 +15,10 @@ | @@ -15,8 +15,10 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.timeseries; | 16 | package org.thingsboard.server.dao.timeseries; |
17 | 17 | ||
18 | -import com.datastax.driver.core.ResultSet; | ||
19 | -import com.datastax.driver.core.Row; | 18 | +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; |
19 | +import com.datastax.oss.driver.api.core.cql.Row; | ||
20 | +import com.google.common.util.concurrent.Futures; | ||
21 | +import com.google.common.util.concurrent.ListenableFuture; | ||
20 | import lombok.extern.slf4j.Slf4j; | 22 | import lombok.extern.slf4j.Slf4j; |
21 | import org.thingsboard.server.common.data.kv.Aggregation; | 23 | import org.thingsboard.server.common.data.kv.Aggregation; |
22 | import org.thingsboard.server.common.data.kv.BasicTsKvEntry; | 24 | import org.thingsboard.server.common.data.kv.BasicTsKvEntry; |
@@ -27,16 +29,19 @@ import org.thingsboard.server.common.data.kv.JsonDataEntry; | @@ -27,16 +29,19 @@ import org.thingsboard.server.common.data.kv.JsonDataEntry; | ||
27 | import org.thingsboard.server.common.data.kv.LongDataEntry; | 29 | import org.thingsboard.server.common.data.kv.LongDataEntry; |
28 | import org.thingsboard.server.common.data.kv.StringDataEntry; | 30 | import org.thingsboard.server.common.data.kv.StringDataEntry; |
29 | import org.thingsboard.server.common.data.kv.TsKvEntry; | 31 | import org.thingsboard.server.common.data.kv.TsKvEntry; |
32 | +import org.thingsboard.server.dao.nosql.TbResultSet; | ||
30 | 33 | ||
31 | import javax.annotation.Nullable; | 34 | import javax.annotation.Nullable; |
32 | import java.util.List; | 35 | import java.util.List; |
33 | import java.util.Optional; | 36 | import java.util.Optional; |
37 | +import java.util.concurrent.Executor; | ||
38 | +import java.util.stream.Collectors; | ||
34 | 39 | ||
35 | /** | 40 | /** |
36 | * Created by ashvayka on 20.02.17. | 41 | * Created by ashvayka on 20.02.17. |
37 | */ | 42 | */ |
38 | @Slf4j | 43 | @Slf4j |
39 | -public class AggregatePartitionsFunction implements com.google.common.base.Function<List<ResultSet>, Optional<TsKvEntry>> { | 44 | +public class AggregatePartitionsFunction implements com.google.common.util.concurrent.AsyncFunction<List<TbResultSet>, Optional<TsKvEntry>> { |
40 | 45 | ||
41 | private static final int LONG_CNT_POS = 0; | 46 | private static final int LONG_CNT_POS = 0; |
42 | private static final int DOUBLE_CNT_POS = 1; | 47 | private static final int DOUBLE_CNT_POS = 1; |
@@ -52,33 +57,39 @@ public class AggregatePartitionsFunction implements com.google.common.base.Funct | @@ -52,33 +57,39 @@ public class AggregatePartitionsFunction implements com.google.common.base.Funct | ||
52 | private final Aggregation aggregation; | 57 | private final Aggregation aggregation; |
53 | private final String key; | 58 | private final String key; |
54 | private final long ts; | 59 | private final long ts; |
60 | + private final Executor executor; | ||
55 | 61 | ||
56 | - public AggregatePartitionsFunction(Aggregation aggregation, String key, long ts) { | 62 | + public AggregatePartitionsFunction(Aggregation aggregation, String key, long ts, Executor executor) { |
57 | this.aggregation = aggregation; | 63 | this.aggregation = aggregation; |
58 | this.key = key; | 64 | this.key = key; |
59 | this.ts = ts; | 65 | this.ts = ts; |
66 | + this.executor = executor; | ||
60 | } | 67 | } |
61 | 68 | ||
62 | @Override | 69 | @Override |
63 | - public Optional<TsKvEntry> apply(@Nullable List<ResultSet> rsList) { | ||
64 | - try { | ||
65 | - log.trace("[{}][{}][{}] Going to aggregate data", key, ts, aggregation); | ||
66 | - if (rsList == null || rsList.isEmpty()) { | ||
67 | - return Optional.empty(); | ||
68 | - } | ||
69 | - | ||
70 | - AggregationResult aggResult = new AggregationResult(); | ||
71 | - | ||
72 | - for (ResultSet rs : rsList) { | ||
73 | - for (Row row : rs.all()) { | ||
74 | - processResultSetRow(row, aggResult); | 70 | + public ListenableFuture<Optional<TsKvEntry>> apply(@Nullable List<TbResultSet> rsList) { |
71 | + log.trace("[{}][{}][{}] Going to aggregate data", key, ts, aggregation); | ||
72 | + if (rsList == null || rsList.isEmpty()) { | ||
73 | + return Futures.immediateFuture(Optional.empty()); | ||
74 | + } | ||
75 | + return Futures.transform( | ||
76 | + Futures.allAsList( | ||
77 | + rsList.stream().map(rs -> rs.allRows(this.executor)) | ||
78 | + .collect(Collectors.toList())), | ||
79 | + rowsList -> { | ||
80 | + try { | ||
81 | + AggregationResult aggResult = new AggregationResult(); | ||
82 | + for (List<Row> rs : rowsList) { | ||
83 | + for (Row row : rs) { | ||
84 | + processResultSetRow(row, aggResult); | ||
85 | + } | ||
75 | } | 86 | } |
87 | + return processAggregationResult(aggResult); | ||
88 | + } catch (Exception e) { | ||
89 | + log.error("[{}][{}][{}] Failed to aggregate data", key, ts, aggregation, e); | ||
90 | + return Optional.empty(); | ||
76 | } | 91 | } |
77 | - return processAggregationResult(aggResult); | ||
78 | - } catch (Exception e) { | ||
79 | - log.error("[{}][{}][{}] Failed to aggregate data", key, ts, aggregation, e); | ||
80 | - return Optional.empty(); | ||
81 | - } | 92 | + }, this.executor); |
82 | } | 93 | } |
83 | 94 | ||
84 | private void processResultSetRow(Row row, AggregationResult aggResult) { | 95 | private void processResultSetRow(Row row, AggregationResult aggResult) { |
@@ -181,7 +192,7 @@ public class AggregatePartitionsFunction implements com.google.common.base.Funct | @@ -181,7 +192,7 @@ public class AggregatePartitionsFunction implements com.google.common.base.Funct | ||
181 | 192 | ||
182 | private Boolean getBooleanValue(Row row) { | 193 | private Boolean getBooleanValue(Row row) { |
183 | if (aggregation == Aggregation.MIN || aggregation == Aggregation.MAX) { | 194 | if (aggregation == Aggregation.MIN || aggregation == Aggregation.MAX) { |
184 | - return row.getBool(BOOL_POS); | 195 | + return row.getBoolean(BOOL_POS); |
185 | } else { | 196 | } else { |
186 | return null; //NOSONAR, null is used for further comparison | 197 | return null; //NOSONAR, null is used for further comparison |
187 | } | 198 | } |
@@ -15,14 +15,14 @@ | @@ -15,14 +15,14 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.timeseries; | 16 | package org.thingsboard.server.dao.timeseries; |
17 | 17 | ||
18 | -import com.datastax.driver.core.BoundStatement; | ||
19 | -import com.datastax.driver.core.PreparedStatement; | ||
20 | -import com.datastax.driver.core.ResultSet; | ||
21 | -import com.datastax.driver.core.ResultSetFuture; | ||
22 | -import com.datastax.driver.core.Row; | ||
23 | -import com.datastax.driver.core.Statement; | ||
24 | -import com.datastax.driver.core.querybuilder.QueryBuilder; | ||
25 | -import com.datastax.driver.core.querybuilder.Select; | 18 | +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; |
19 | +import com.datastax.oss.driver.api.core.cql.BoundStatement; | ||
20 | +import com.datastax.oss.driver.api.core.cql.BoundStatementBuilder; | ||
21 | +import com.datastax.oss.driver.api.core.cql.PreparedStatement; | ||
22 | +import com.datastax.oss.driver.api.core.cql.Row; | ||
23 | +import com.datastax.oss.driver.api.core.cql.Statement; | ||
24 | +import com.datastax.oss.driver.api.querybuilder.QueryBuilder; | ||
25 | +import com.datastax.oss.driver.api.querybuilder.select.Select; | ||
26 | import com.google.common.base.Function; | 26 | import com.google.common.base.Function; |
27 | import com.google.common.util.concurrent.AsyncFunction; | 27 | import com.google.common.util.concurrent.AsyncFunction; |
28 | import com.google.common.util.concurrent.FutureCallback; | 28 | import com.google.common.util.concurrent.FutureCallback; |
@@ -52,6 +52,8 @@ import org.thingsboard.server.common.data.kv.StringDataEntry; | @@ -52,6 +52,8 @@ import org.thingsboard.server.common.data.kv.StringDataEntry; | ||
52 | import org.thingsboard.server.common.data.kv.TsKvEntry; | 52 | import org.thingsboard.server.common.data.kv.TsKvEntry; |
53 | import org.thingsboard.server.dao.model.ModelConstants; | 53 | import org.thingsboard.server.dao.model.ModelConstants; |
54 | import org.thingsboard.server.dao.nosql.CassandraAbstractAsyncDao; | 54 | import org.thingsboard.server.dao.nosql.CassandraAbstractAsyncDao; |
55 | +import org.thingsboard.server.dao.nosql.TbResultSet; | ||
56 | +import org.thingsboard.server.dao.nosql.TbResultSetFuture; | ||
55 | import org.thingsboard.server.dao.util.NoSqlTsDao; | 57 | import org.thingsboard.server.dao.util.NoSqlTsDao; |
56 | 58 | ||
57 | import javax.annotation.Nullable; | 59 | import javax.annotation.Nullable; |
@@ -69,7 +71,7 @@ import java.util.Optional; | @@ -69,7 +71,7 @@ import java.util.Optional; | ||
69 | import java.util.concurrent.ExecutionException; | 71 | import java.util.concurrent.ExecutionException; |
70 | import java.util.stream.Collectors; | 72 | import java.util.stream.Collectors; |
71 | 73 | ||
72 | -import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; | 74 | +import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.literal; |
73 | 75 | ||
74 | /** | 76 | /** |
75 | * @author Andrew Shvayka | 77 | * @author Andrew Shvayka |
@@ -189,8 +191,8 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -189,8 +191,8 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
189 | if (isFixedPartitioning()) { //no need to fetch partitions from DB | 191 | if (isFixedPartitioning()) { //no need to fetch partitions from DB |
190 | return Futures.immediateFuture(FIXED_PARTITION); | 192 | return Futures.immediateFuture(FIXED_PARTITION); |
191 | } | 193 | } |
192 | - ResultSetFuture partitionsFuture = fetchPartitions(tenantId, entityId, query.getKey(), minPartition, maxPartition); | ||
193 | - return Futures.transform(partitionsFuture, getPartitionsArrayFunction(), readResultsProcessingExecutor); | 194 | + TbResultSetFuture partitionsFuture = fetchPartitions(tenantId, entityId, query.getKey(), minPartition, maxPartition); |
195 | + return Futures.transformAsync(partitionsFuture, getPartitionsArrayFunction(), readResultsProcessingExecutor); | ||
194 | } | 196 | } |
195 | 197 | ||
196 | private ListenableFuture<List<TsKvEntry>> findAllAsyncWithLimit(TenantId tenantId, EntityId entityId, ReadTsKvQuery query) { | 198 | private ListenableFuture<List<TsKvEntry>> findAllAsyncWithLimit(TenantId tenantId, EntityId entityId, ReadTsKvQuery query) { |
@@ -225,20 +227,41 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -225,20 +227,41 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
225 | resultFuture.set(cursor.getData()); | 227 | resultFuture.set(cursor.getData()); |
226 | } else { | 228 | } else { |
227 | PreparedStatement proto = getFetchStmt(Aggregation.NONE, cursor.getOrderBy()); | 229 | PreparedStatement proto = getFetchStmt(Aggregation.NONE, cursor.getOrderBy()); |
228 | - BoundStatement stmt = proto.bind(); | ||
229 | - stmt.setString(0, cursor.getEntityType()); | ||
230 | - stmt.setUUID(1, cursor.getEntityId()); | ||
231 | - stmt.setString(2, cursor.getKey()); | ||
232 | - stmt.setLong(3, cursor.getNextPartition()); | ||
233 | - stmt.setLong(4, cursor.getStartTs()); | ||
234 | - stmt.setLong(5, cursor.getEndTs()); | ||
235 | - stmt.setInt(6, cursor.getCurrentLimit()); | ||
236 | - | ||
237 | - Futures.addCallback(executeAsyncRead(tenantId, stmt), new FutureCallback<ResultSet>() { | 230 | + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder(proto.bind()); |
231 | + | ||
232 | + stmtBuilder.setString(0, cursor.getEntityType()); | ||
233 | + stmtBuilder.setUuid(1, cursor.getEntityId()); | ||
234 | + stmtBuilder.setString(2, cursor.getKey()); | ||
235 | + stmtBuilder.setLong(3, cursor.getNextPartition()); | ||
236 | + stmtBuilder.setLong(4, cursor.getStartTs()); | ||
237 | + stmtBuilder.setLong(5, cursor.getEndTs()); | ||
238 | + stmtBuilder.setInt(6, cursor.getCurrentLimit()); | ||
239 | + | ||
240 | + BoundStatement stmt = stmtBuilder.build(); | ||
241 | + | ||
242 | + Futures.addCallback(executeAsyncRead(tenantId, stmt), new FutureCallback<TbResultSet>() { | ||
238 | @Override | 243 | @Override |
239 | - public void onSuccess(@Nullable ResultSet result) { | ||
240 | - cursor.addData(convertResultToTsKvEntryList(result == null ? Collections.emptyList() : result.all())); | ||
241 | - findAllAsyncSequentiallyWithLimit(tenantId, cursor, resultFuture); | 244 | + public void onSuccess(@Nullable TbResultSet result) { |
245 | + if (result == null) { | ||
246 | + cursor.addData(convertResultToTsKvEntryList(Collections.emptyList())); | ||
247 | + findAllAsyncSequentiallyWithLimit(tenantId, cursor, resultFuture); | ||
248 | + } else { | ||
249 | + Futures.addCallback(result.allRows(readResultsProcessingExecutor), new FutureCallback<List<Row>>() { | ||
250 | + | ||
251 | + @Override | ||
252 | + public void onSuccess(@Nullable List<Row> result) { | ||
253 | + cursor.addData(convertResultToTsKvEntryList(result == null ? Collections.emptyList() : result)); | ||
254 | + findAllAsyncSequentiallyWithLimit(tenantId, cursor, resultFuture); | ||
255 | + } | ||
256 | + | ||
257 | + @Override | ||
258 | + public void onFailure(Throwable t) { | ||
259 | + log.error("[{}][{}] Failed to fetch data for query {}-{}", stmt, t); | ||
260 | + } | ||
261 | + }, readResultsProcessingExecutor); | ||
262 | + | ||
263 | + | ||
264 | + } | ||
242 | } | 265 | } |
243 | 266 | ||
244 | @Override | 267 | @Override |
@@ -256,31 +279,35 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -256,31 +279,35 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
256 | final long endTs = query.getEndTs(); | 279 | final long endTs = query.getEndTs(); |
257 | final long ts = startTs + (endTs - startTs) / 2; | 280 | final long ts = startTs + (endTs - startTs) / 2; |
258 | ListenableFuture<List<Long>> partitionsListFuture = getPartitionsFuture(tenantId, query, entityId, minPartition, maxPartition); | 281 | ListenableFuture<List<Long>> partitionsListFuture = getPartitionsFuture(tenantId, query, entityId, minPartition, maxPartition); |
259 | - ListenableFuture<List<ResultSet>> aggregationChunks = Futures.transformAsync(partitionsListFuture, | 282 | + ListenableFuture<List<TbResultSet>> aggregationChunks = Futures.transformAsync(partitionsListFuture, |
260 | getFetchChunksAsyncFunction(tenantId, entityId, key, aggregation, startTs, endTs), readResultsProcessingExecutor); | 283 | getFetchChunksAsyncFunction(tenantId, entityId, key, aggregation, startTs, endTs), readResultsProcessingExecutor); |
261 | 284 | ||
262 | - return Futures.transform(aggregationChunks, new AggregatePartitionsFunction(aggregation, key, ts), readResultsProcessingExecutor); | 285 | + return Futures.transformAsync(aggregationChunks, new AggregatePartitionsFunction(aggregation, key, ts, readResultsProcessingExecutor), readResultsProcessingExecutor); |
263 | } | 286 | } |
264 | 287 | ||
265 | - private Function<ResultSet, List<Long>> getPartitionsArrayFunction() { | ||
266 | - return rows -> rows.all().stream() | ||
267 | - .map(row -> row.getLong(ModelConstants.PARTITION_COLUMN)).collect(Collectors.toList()); | 288 | + private AsyncFunction<TbResultSet, List<Long>> getPartitionsArrayFunction() { |
289 | + return rs -> | ||
290 | + Futures.transform(rs.allRows(readResultsProcessingExecutor), rows -> | ||
291 | + rows.stream() | ||
292 | + .map(row -> row.getLong(ModelConstants.PARTITION_COLUMN)).collect(Collectors.toList()), | ||
293 | + readResultsProcessingExecutor); | ||
268 | } | 294 | } |
269 | 295 | ||
270 | - private AsyncFunction<List<Long>, List<ResultSet>> getFetchChunksAsyncFunction(TenantId tenantId, EntityId entityId, String key, Aggregation aggregation, long startTs, long endTs) { | 296 | + private AsyncFunction<List<Long>, List<TbResultSet>> getFetchChunksAsyncFunction(TenantId tenantId, EntityId entityId, String key, Aggregation aggregation, long startTs, long endTs) { |
271 | return partitions -> { | 297 | return partitions -> { |
272 | try { | 298 | try { |
273 | PreparedStatement proto = getFetchStmt(aggregation, DESC_ORDER); | 299 | PreparedStatement proto = getFetchStmt(aggregation, DESC_ORDER); |
274 | - List<ResultSetFuture> futures = new ArrayList<>(partitions.size()); | 300 | + List<TbResultSetFuture> futures = new ArrayList<>(partitions.size()); |
275 | for (Long partition : partitions) { | 301 | for (Long partition : partitions) { |
276 | log.trace("Fetching data for partition [{}] for entityType {} and entityId {}", partition, entityId.getEntityType(), entityId.getId()); | 302 | log.trace("Fetching data for partition [{}] for entityType {} and entityId {}", partition, entityId.getEntityType(), entityId.getId()); |
277 | - BoundStatement stmt = proto.bind(); | ||
278 | - stmt.setString(0, entityId.getEntityType().name()); | ||
279 | - stmt.setUUID(1, entityId.getId()); | ||
280 | - stmt.setString(2, key); | ||
281 | - stmt.setLong(3, partition); | ||
282 | - stmt.setLong(4, startTs); | ||
283 | - stmt.setLong(5, endTs); | 303 | + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder(proto.bind()); |
304 | + stmtBuilder.setString(0, entityId.getEntityType().name()); | ||
305 | + stmtBuilder.setUuid(1, entityId.getId()); | ||
306 | + stmtBuilder.setString(2, key); | ||
307 | + stmtBuilder.setLong(3, partition); | ||
308 | + stmtBuilder.setLong(4, startTs); | ||
309 | + stmtBuilder.setLong(5, endTs); | ||
310 | + BoundStatement stmt = stmtBuilder.build(); | ||
284 | log.debug(GENERATED_QUERY_FOR_ENTITY_TYPE_AND_ENTITY_ID, stmt, entityId.getEntityType(), entityId.getId()); | 311 | log.debug(GENERATED_QUERY_FOR_ENTITY_TYPE_AND_ENTITY_ID, stmt, entityId.getEntityType(), entityId.getId()); |
285 | futures.add(executeAsyncRead(tenantId, stmt)); | 312 | futures.add(executeAsyncRead(tenantId, stmt)); |
286 | } | 313 | } |
@@ -294,21 +321,23 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -294,21 +321,23 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
294 | 321 | ||
295 | @Override | 322 | @Override |
296 | public ListenableFuture<TsKvEntry> findLatest(TenantId tenantId, EntityId entityId, String key) { | 323 | public ListenableFuture<TsKvEntry> findLatest(TenantId tenantId, EntityId entityId, String key) { |
297 | - BoundStatement stmt = getFindLatestStmt().bind(); | ||
298 | - stmt.setString(0, entityId.getEntityType().name()); | ||
299 | - stmt.setUUID(1, entityId.getId()); | ||
300 | - stmt.setString(2, key); | 324 | + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder(getFindLatestStmt().bind()); |
325 | + stmtBuilder.setString(0, entityId.getEntityType().name()); | ||
326 | + stmtBuilder.setUuid(1, entityId.getId()); | ||
327 | + stmtBuilder.setString(2, key); | ||
328 | + BoundStatement stmt = stmtBuilder.build(); | ||
301 | log.debug(GENERATED_QUERY_FOR_ENTITY_TYPE_AND_ENTITY_ID, stmt, entityId.getEntityType(), entityId.getId()); | 329 | log.debug(GENERATED_QUERY_FOR_ENTITY_TYPE_AND_ENTITY_ID, stmt, entityId.getEntityType(), entityId.getId()); |
302 | return getFuture(executeAsyncRead(tenantId, stmt), rs -> convertResultToTsKvEntry(key, rs.one())); | 330 | return getFuture(executeAsyncRead(tenantId, stmt), rs -> convertResultToTsKvEntry(key, rs.one())); |
303 | } | 331 | } |
304 | 332 | ||
305 | @Override | 333 | @Override |
306 | public ListenableFuture<List<TsKvEntry>> findAllLatest(TenantId tenantId, EntityId entityId) { | 334 | public ListenableFuture<List<TsKvEntry>> findAllLatest(TenantId tenantId, EntityId entityId) { |
307 | - BoundStatement stmt = getFindAllLatestStmt().bind(); | ||
308 | - stmt.setString(0, entityId.getEntityType().name()); | ||
309 | - stmt.setUUID(1, entityId.getId()); | 335 | + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder(getFindAllLatestStmt().bind()); |
336 | + stmtBuilder.setString(0, entityId.getEntityType().name()); | ||
337 | + stmtBuilder.setUuid(1, entityId.getId()); | ||
338 | + BoundStatement stmt = stmtBuilder.build(); | ||
310 | log.debug(GENERATED_QUERY_FOR_ENTITY_TYPE_AND_ENTITY_ID, stmt, entityId.getEntityType(), entityId.getId()); | 339 | log.debug(GENERATED_QUERY_FOR_ENTITY_TYPE_AND_ENTITY_ID, stmt, entityId.getEntityType(), entityId.getId()); |
311 | - return getFuture(executeAsyncRead(tenantId, stmt), rs -> convertResultToTsKvEntryList(rs.all())); | 340 | + return getFutureAsync(executeAsyncRead(tenantId, stmt), rs -> convertAsyncResultSetToTsKvEntryList(rs)); |
312 | } | 341 | } |
313 | 342 | ||
314 | @Override | 343 | @Override |
@@ -320,16 +349,17 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -320,16 +349,17 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
320 | if (setNullValuesEnabled) { | 349 | if (setNullValuesEnabled) { |
321 | processSetNullValues(tenantId, entityId, tsKvEntry, ttl, futures, partition, type); | 350 | processSetNullValues(tenantId, entityId, tsKvEntry, ttl, futures, partition, type); |
322 | } | 351 | } |
323 | - BoundStatement stmt = (ttl == 0 ? getSaveStmt(type) : getSaveTtlStmt(type)).bind(); | ||
324 | - stmt.setString(0, entityId.getEntityType().name()) | ||
325 | - .setUUID(1, entityId.getId()) | 352 | + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder((ttl == 0 ? getSaveStmt(type) : getSaveTtlStmt(type)).bind()); |
353 | + stmtBuilder.setString(0, entityId.getEntityType().name()) | ||
354 | + .setUuid(1, entityId.getId()) | ||
326 | .setString(2, tsKvEntry.getKey()) | 355 | .setString(2, tsKvEntry.getKey()) |
327 | .setLong(3, partition) | 356 | .setLong(3, partition) |
328 | .setLong(4, tsKvEntry.getTs()); | 357 | .setLong(4, tsKvEntry.getTs()); |
329 | - addValue(tsKvEntry, stmt, 5); | 358 | + addValue(tsKvEntry, stmtBuilder, 5); |
330 | if (ttl > 0) { | 359 | if (ttl > 0) { |
331 | - stmt.setInt(6, (int) ttl); | 360 | + stmtBuilder.setInt(6, (int) ttl); |
332 | } | 361 | } |
362 | + BoundStatement stmt = stmtBuilder.build(); | ||
333 | futures.add(getFuture(executeAsyncWrite(tenantId, stmt), rs -> null)); | 363 | futures.add(getFuture(executeAsyncWrite(tenantId, stmt), rs -> null)); |
334 | return Futures.transform(Futures.allAsList(futures), result -> null, MoreExecutors.directExecutor()); | 364 | return Futures.transform(Futures.allAsList(futures), result -> null, MoreExecutors.directExecutor()); |
335 | } | 365 | } |
@@ -370,16 +400,17 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -370,16 +400,17 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
370 | } | 400 | } |
371 | 401 | ||
372 | private ListenableFuture<Void> saveNull(TenantId tenantId, EntityId entityId, TsKvEntry tsKvEntry, long ttl, long partition, DataType type) { | 402 | private ListenableFuture<Void> saveNull(TenantId tenantId, EntityId entityId, TsKvEntry tsKvEntry, long ttl, long partition, DataType type) { |
373 | - BoundStatement stmt = (ttl == 0 ? getSaveStmt(type) : getSaveTtlStmt(type)).bind(); | ||
374 | - stmt.setString(0, entityId.getEntityType().name()) | ||
375 | - .setUUID(1, entityId.getId()) | 403 | + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder((ttl == 0 ? getSaveStmt(type) : getSaveTtlStmt(type)).bind()); |
404 | + stmtBuilder.setString(0, entityId.getEntityType().name()) | ||
405 | + .setUuid(1, entityId.getId()) | ||
376 | .setString(2, tsKvEntry.getKey()) | 406 | .setString(2, tsKvEntry.getKey()) |
377 | .setLong(3, partition) | 407 | .setLong(3, partition) |
378 | .setLong(4, tsKvEntry.getTs()); | 408 | .setLong(4, tsKvEntry.getTs()); |
379 | - stmt.setToNull(getColumnName(type)); | 409 | + stmtBuilder.setToNull(getColumnName(type)); |
380 | if (ttl > 0) { | 410 | if (ttl > 0) { |
381 | - stmt.setInt(6, (int) ttl); | 411 | + stmtBuilder.setInt(6, (int) ttl); |
382 | } | 412 | } |
413 | + BoundStatement stmt = stmtBuilder.build(); | ||
383 | return getFuture(executeAsyncWrite(tenantId, stmt), rs -> null); | 414 | return getFuture(executeAsyncWrite(tenantId, stmt), rs -> null); |
384 | } | 415 | } |
385 | 416 | ||
@@ -391,14 +422,15 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -391,14 +422,15 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
391 | ttl = computeTtl(ttl); | 422 | ttl = computeTtl(ttl); |
392 | long partition = toPartitionTs(tsKvEntryTs); | 423 | long partition = toPartitionTs(tsKvEntryTs); |
393 | log.debug("Saving partition {} for the entity [{}-{}] and key {}", partition, entityId.getEntityType(), entityId.getId(), key); | 424 | log.debug("Saving partition {} for the entity [{}-{}] and key {}", partition, entityId.getEntityType(), entityId.getId(), key); |
394 | - BoundStatement stmt = (ttl == 0 ? getPartitionInsertStmt() : getPartitionInsertTtlStmt()).bind(); | ||
395 | - stmt = stmt.setString(0, entityId.getEntityType().name()) | ||
396 | - .setUUID(1, entityId.getId()) | 425 | + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder((ttl == 0 ? getPartitionInsertStmt() : getPartitionInsertTtlStmt()).bind()); |
426 | + stmtBuilder.setString(0, entityId.getEntityType().name()) | ||
427 | + .setUuid(1, entityId.getId()) | ||
397 | .setLong(2, partition) | 428 | .setLong(2, partition) |
398 | .setString(3, key); | 429 | .setString(3, key); |
399 | if (ttl > 0) { | 430 | if (ttl > 0) { |
400 | - stmt.setInt(4, (int) ttl); | 431 | + stmtBuilder.setInt(4, (int) ttl); |
401 | } | 432 | } |
433 | + BoundStatement stmt = stmtBuilder.build(); | ||
402 | return getFuture(executeAsyncWrite(tenantId, stmt), rs -> null); | 434 | return getFuture(executeAsyncWrite(tenantId, stmt), rs -> null); |
403 | } | 435 | } |
404 | 436 | ||
@@ -415,9 +447,9 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -415,9 +447,9 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
415 | 447 | ||
416 | @Override | 448 | @Override |
417 | public ListenableFuture<Void> saveLatest(TenantId tenantId, EntityId entityId, TsKvEntry tsKvEntry) { | 449 | public ListenableFuture<Void> saveLatest(TenantId tenantId, EntityId entityId, TsKvEntry tsKvEntry) { |
418 | - BoundStatement stmt = getLatestStmt().bind() | ||
419 | - .setString(0, entityId.getEntityType().name()) | ||
420 | - .setUUID(1, entityId.getId()) | 450 | + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder(getLatestStmt().bind()); |
451 | + stmtBuilder.setString(0, entityId.getEntityType().name()) | ||
452 | + .setUuid(1, entityId.getId()) | ||
421 | .setString(2, tsKvEntry.getKey()) | 453 | .setString(2, tsKvEntry.getKey()) |
422 | .setLong(3, tsKvEntry.getTs()) | 454 | .setLong(3, tsKvEntry.getTs()) |
423 | .set(4, tsKvEntry.getBooleanValue().orElse(null), Boolean.class) | 455 | .set(4, tsKvEntry.getBooleanValue().orElse(null), Boolean.class) |
@@ -426,10 +458,11 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -426,10 +458,11 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
426 | .set(7, tsKvEntry.getDoubleValue().orElse(null), Double.class); | 458 | .set(7, tsKvEntry.getDoubleValue().orElse(null), Double.class); |
427 | Optional<String> jsonV = tsKvEntry.getJsonValue(); | 459 | Optional<String> jsonV = tsKvEntry.getJsonValue(); |
428 | if (jsonV.isPresent()) { | 460 | if (jsonV.isPresent()) { |
429 | - stmt.setString(8, tsKvEntry.getJsonValue().get()); | 461 | + stmtBuilder.setString(8, tsKvEntry.getJsonValue().get()); |
430 | } else { | 462 | } else { |
431 | - stmt.setToNull(8); | 463 | + stmtBuilder.setToNull(8); |
432 | } | 464 | } |
465 | + BoundStatement stmt = stmtBuilder.build(); | ||
433 | 466 | ||
434 | return getFuture(executeAsyncWrite(tenantId, stmt), rs -> null); | 467 | return getFuture(executeAsyncWrite(tenantId, stmt), rs -> null); |
435 | } | 468 | } |
@@ -439,10 +472,10 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -439,10 +472,10 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
439 | long minPartition = toPartitionTs(query.getStartTs()); | 472 | long minPartition = toPartitionTs(query.getStartTs()); |
440 | long maxPartition = toPartitionTs(query.getEndTs()); | 473 | long maxPartition = toPartitionTs(query.getEndTs()); |
441 | 474 | ||
442 | - ResultSetFuture partitionsFuture = fetchPartitions(tenantId, entityId, query.getKey(), minPartition, maxPartition); | 475 | + TbResultSetFuture partitionsFuture = fetchPartitions(tenantId, entityId, query.getKey(), minPartition, maxPartition); |
443 | 476 | ||
444 | final SimpleListenableFuture<Void> resultFuture = new SimpleListenableFuture<>(); | 477 | final SimpleListenableFuture<Void> resultFuture = new SimpleListenableFuture<>(); |
445 | - final ListenableFuture<List<Long>> partitionsListFuture = Futures.transform(partitionsFuture, getPartitionsArrayFunction(), readResultsProcessingExecutor); | 478 | + final ListenableFuture<List<Long>> partitionsListFuture = Futures.transformAsync(partitionsFuture, getPartitionsArrayFunction(), readResultsProcessingExecutor); |
446 | 479 | ||
447 | Futures.addCallback(partitionsListFuture, new FutureCallback<List<Long>>() { | 480 | Futures.addCallback(partitionsListFuture, new FutureCallback<List<Long>>() { |
448 | @Override | 481 | @Override |
@@ -464,17 +497,19 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -464,17 +497,19 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
464 | resultFuture.set(null); | 497 | resultFuture.set(null); |
465 | } else { | 498 | } else { |
466 | PreparedStatement proto = getDeleteStmt(); | 499 | PreparedStatement proto = getDeleteStmt(); |
467 | - BoundStatement stmt = proto.bind(); | ||
468 | - stmt.setString(0, cursor.getEntityType()); | ||
469 | - stmt.setUUID(1, cursor.getEntityId()); | ||
470 | - stmt.setString(2, cursor.getKey()); | ||
471 | - stmt.setLong(3, cursor.getNextPartition()); | ||
472 | - stmt.setLong(4, cursor.getStartTs()); | ||
473 | - stmt.setLong(5, cursor.getEndTs()); | ||
474 | - | ||
475 | - Futures.addCallback(executeAsyncWrite(tenantId, stmt), new FutureCallback<ResultSet>() { | 500 | + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder(proto.bind()); |
501 | + stmtBuilder.setString(0, cursor.getEntityType()); | ||
502 | + stmtBuilder.setUuid(1, cursor.getEntityId()); | ||
503 | + stmtBuilder.setString(2, cursor.getKey()); | ||
504 | + stmtBuilder.setLong(3, cursor.getNextPartition()); | ||
505 | + stmtBuilder.setLong(4, cursor.getStartTs()); | ||
506 | + stmtBuilder.setLong(5, cursor.getEndTs()); | ||
507 | + | ||
508 | + BoundStatement stmt = stmtBuilder.build(); | ||
509 | + | ||
510 | + Futures.addCallback(executeAsyncWrite(tenantId, stmt), new FutureCallback<AsyncResultSet>() { | ||
476 | @Override | 511 | @Override |
477 | - public void onSuccess(@Nullable ResultSet result) { | 512 | + public void onSuccess(@Nullable AsyncResultSet result) { |
478 | deleteAsync(tenantId, cursor, resultFuture); | 513 | deleteAsync(tenantId, cursor, resultFuture); |
479 | } | 514 | } |
480 | 515 | ||
@@ -568,10 +603,10 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -568,10 +603,10 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
568 | } | 603 | } |
569 | 604 | ||
570 | private ListenableFuture<Void> deleteLatest(TenantId tenantId, EntityId entityId, String key) { | 605 | private ListenableFuture<Void> deleteLatest(TenantId tenantId, EntityId entityId, String key) { |
571 | - Statement delete = QueryBuilder.delete().all().from(ModelConstants.TS_KV_LATEST_CF) | ||
572 | - .where(eq(ModelConstants.ENTITY_TYPE_COLUMN, entityId.getEntityType())) | ||
573 | - .and(eq(ModelConstants.ENTITY_ID_COLUMN, entityId.getId())) | ||
574 | - .and(eq(ModelConstants.KEY_COLUMN, key)); | 606 | + Statement delete = QueryBuilder.deleteFrom(ModelConstants.TS_KV_LATEST_CF) |
607 | + .whereColumn(ModelConstants.ENTITY_TYPE_COLUMN).isEqualTo(literal(entityId.getEntityType().name())) | ||
608 | + .whereColumn(ModelConstants.ENTITY_ID_COLUMN).isEqualTo(literal(entityId.getId())) | ||
609 | + .whereColumn(ModelConstants.KEY_COLUMN).isEqualTo(literal(key)).build(); | ||
575 | log.debug("Remove request: {}", delete.toString()); | 610 | log.debug("Remove request: {}", delete.toString()); |
576 | return getFuture(executeAsyncWrite(tenantId, delete), rs -> null); | 611 | return getFuture(executeAsyncWrite(tenantId, delete), rs -> null); |
577 | } | 612 | } |
@@ -583,10 +618,10 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -583,10 +618,10 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
583 | if (minPartition == maxPartition) { | 618 | if (minPartition == maxPartition) { |
584 | return Futures.immediateFuture(null); | 619 | return Futures.immediateFuture(null); |
585 | } else { | 620 | } else { |
586 | - ResultSetFuture partitionsFuture = fetchPartitions(tenantId, entityId, query.getKey(), minPartition, maxPartition); | 621 | + TbResultSetFuture partitionsFuture = fetchPartitions(tenantId, entityId, query.getKey(), minPartition, maxPartition); |
587 | 622 | ||
588 | final SimpleListenableFuture<Void> resultFuture = new SimpleListenableFuture<>(); | 623 | final SimpleListenableFuture<Void> resultFuture = new SimpleListenableFuture<>(); |
589 | - final ListenableFuture<List<Long>> partitionsListFuture = Futures.transform(partitionsFuture, getPartitionsArrayFunction(), readResultsProcessingExecutor); | 624 | + final ListenableFuture<List<Long>> partitionsListFuture = Futures.transformAsync(partitionsFuture, getPartitionsArrayFunction(), readResultsProcessingExecutor); |
590 | 625 | ||
591 | Futures.addCallback(partitionsListFuture, new FutureCallback<List<Long>>() { | 626 | Futures.addCallback(partitionsListFuture, new FutureCallback<List<Long>>() { |
592 | @Override | 627 | @Override |
@@ -617,15 +652,17 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -617,15 +652,17 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
617 | resultFuture.set(null); | 652 | resultFuture.set(null); |
618 | } else { | 653 | } else { |
619 | PreparedStatement proto = getDeletePartitionStmt(); | 654 | PreparedStatement proto = getDeletePartitionStmt(); |
620 | - BoundStatement stmt = proto.bind(); | ||
621 | - stmt.setString(0, cursor.getEntityType()); | ||
622 | - stmt.setUUID(1, cursor.getEntityId()); | ||
623 | - stmt.setLong(2, cursor.getNextPartition()); | ||
624 | - stmt.setString(3, cursor.getKey()); | 655 | + BoundStatementBuilder stmtBuilder = new BoundStatementBuilder(proto.bind()); |
656 | + stmtBuilder.setString(0, cursor.getEntityType()); | ||
657 | + stmtBuilder.setUuid(1, cursor.getEntityId()); | ||
658 | + stmtBuilder.setLong(2, cursor.getNextPartition()); | ||
659 | + stmtBuilder.setString(3, cursor.getKey()); | ||
625 | 660 | ||
626 | - Futures.addCallback(executeAsyncWrite(tenantId, stmt), new FutureCallback<ResultSet>() { | 661 | + BoundStatement stmt = stmtBuilder.build(); |
662 | + | ||
663 | + Futures.addCallback(executeAsyncWrite(tenantId, stmt), new FutureCallback<AsyncResultSet>() { | ||
627 | @Override | 664 | @Override |
628 | - public void onSuccess(@Nullable ResultSet result) { | 665 | + public void onSuccess(@Nullable AsyncResultSet result) { |
629 | deletePartitionAsync(tenantId, cursor, resultFuture); | 666 | deletePartitionAsync(tenantId, cursor, resultFuture); |
630 | } | 667 | } |
631 | 668 | ||
@@ -648,6 +685,11 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -648,6 +685,11 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
648 | return deletePartitionStmt; | 685 | return deletePartitionStmt; |
649 | } | 686 | } |
650 | 687 | ||
688 | + private ListenableFuture<List<TsKvEntry>> convertAsyncResultSetToTsKvEntryList(TbResultSet rs) { | ||
689 | + return Futures.transform(rs.allRows(readResultsProcessingExecutor), | ||
690 | + rows -> this.convertResultToTsKvEntryList(rows), readResultsProcessingExecutor); | ||
691 | + } | ||
692 | + | ||
651 | private List<TsKvEntry> convertResultToTsKvEntryList(List<Row> rows) { | 693 | private List<TsKvEntry> convertResultToTsKvEntryList(List<Row> rows) { |
652 | List<TsKvEntry> entries = new ArrayList<>(rows.size()); | 694 | List<TsKvEntry> entries = new ArrayList<>(rows.size()); |
653 | if (!rows.isEmpty()) { | 695 | if (!rows.isEmpty()) { |
@@ -706,12 +748,14 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -706,12 +748,14 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
706 | * Select existing partitions from the table | 748 | * Select existing partitions from the table |
707 | * <code>{@link ModelConstants#TS_KV_PARTITIONS_CF}</code> for the given entity | 749 | * <code>{@link ModelConstants#TS_KV_PARTITIONS_CF}</code> for the given entity |
708 | */ | 750 | */ |
709 | - private ResultSetFuture fetchPartitions(TenantId tenantId, EntityId entityId, String key, long minPartition, long maxPartition) { | ||
710 | - Select.Where select = QueryBuilder.select(ModelConstants.PARTITION_COLUMN).from(ModelConstants.TS_KV_PARTITIONS_CF).where(eq(ModelConstants.ENTITY_TYPE_COLUMN, entityId.getEntityType().name())) | ||
711 | - .and(eq(ModelConstants.ENTITY_ID_COLUMN, entityId.getId())).and(eq(ModelConstants.KEY_COLUMN, key)); | ||
712 | - select.and(QueryBuilder.gte(ModelConstants.PARTITION_COLUMN, minPartition)); | ||
713 | - select.and(QueryBuilder.lte(ModelConstants.PARTITION_COLUMN, maxPartition)); | ||
714 | - return executeAsyncRead(tenantId, select); | 751 | + private TbResultSetFuture fetchPartitions(TenantId tenantId, EntityId entityId, String key, long minPartition, long maxPartition) { |
752 | + Select select = QueryBuilder.selectFrom(ModelConstants.TS_KV_PARTITIONS_CF).column(ModelConstants.PARTITION_COLUMN) | ||
753 | + .whereColumn(ModelConstants.ENTITY_TYPE_COLUMN).isEqualTo(literal(entityId.getEntityType().name())) | ||
754 | + .whereColumn(ModelConstants.ENTITY_ID_COLUMN).isEqualTo(literal(entityId.getId())) | ||
755 | + .whereColumn(ModelConstants.KEY_COLUMN).isEqualTo(literal(key)) | ||
756 | + .whereColumn(ModelConstants.PARTITION_COLUMN).isGreaterThanOrEqualTo(literal(minPartition)) | ||
757 | + .whereColumn(ModelConstants.PARTITION_COLUMN).isLessThanOrEqualTo(literal(maxPartition)); | ||
758 | + return executeAsyncRead(tenantId, select.build()); | ||
715 | } | 759 | } |
716 | 760 | ||
717 | private PreparedStatement getSaveStmt(DataType dataType) { | 761 | private PreparedStatement getSaveStmt(DataType dataType) { |
@@ -882,11 +926,11 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -882,11 +926,11 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
882 | } | 926 | } |
883 | } | 927 | } |
884 | 928 | ||
885 | - private static void addValue(KvEntry kvEntry, BoundStatement stmt, int column) { | 929 | + private static void addValue(KvEntry kvEntry, BoundStatementBuilder stmt, int column) { |
886 | switch (kvEntry.getDataType()) { | 930 | switch (kvEntry.getDataType()) { |
887 | case BOOLEAN: | 931 | case BOOLEAN: |
888 | Optional<Boolean> booleanValue = kvEntry.getBooleanValue(); | 932 | Optional<Boolean> booleanValue = kvEntry.getBooleanValue(); |
889 | - booleanValue.ifPresent(b -> stmt.setBool(column, b)); | 933 | + booleanValue.ifPresent(b -> stmt.setBoolean(column, b)); |
890 | break; | 934 | break; |
891 | case STRING: | 935 | case STRING: |
892 | Optional<String> stringValue = kvEntry.getStrValue(); | 936 | Optional<String> stringValue = kvEntry.getStrValue(); |
@@ -15,7 +15,14 @@ | @@ -15,7 +15,14 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.util; | 16 | package org.thingsboard.server.dao.util; |
17 | 17 | ||
18 | -import com.datastax.driver.core.*; | 18 | +import com.datastax.oss.driver.api.core.ProtocolVersion; |
19 | +import com.datastax.oss.driver.api.core.cql.BoundStatement; | ||
20 | +import com.datastax.oss.driver.api.core.cql.ColumnDefinition; | ||
21 | +import com.datastax.oss.driver.api.core.cql.ColumnDefinitions; | ||
22 | +import com.datastax.oss.driver.api.core.cql.PreparedStatement; | ||
23 | +import com.datastax.oss.driver.api.core.type.DataType; | ||
24 | +import com.datastax.oss.driver.api.core.type.codec.TypeCodec; | ||
25 | +import com.datastax.oss.driver.api.core.type.codec.registry.CodecRegistry; | ||
19 | import com.google.common.util.concurrent.FutureCallback; | 26 | import com.google.common.util.concurrent.FutureCallback; |
20 | import com.google.common.util.concurrent.Futures; | 27 | import com.google.common.util.concurrent.Futures; |
21 | import com.google.common.util.concurrent.ListenableFuture; | 28 | import com.google.common.util.concurrent.ListenableFuture; |
@@ -212,7 +219,7 @@ public abstract class AbstractBufferedRateExecutor<T extends AsyncTask, F extend | @@ -212,7 +219,7 @@ public abstract class AbstractBufferedRateExecutor<T extends AsyncTask, F extend | ||
212 | CassandraStatementTask cassStmtTask = (CassandraStatementTask) taskCtx.getTask(); | 219 | CassandraStatementTask cassStmtTask = (CassandraStatementTask) taskCtx.getTask(); |
213 | if (cassStmtTask.getStatement() instanceof BoundStatement) { | 220 | if (cassStmtTask.getStatement() instanceof BoundStatement) { |
214 | BoundStatement stmt = (BoundStatement) cassStmtTask.getStatement(); | 221 | BoundStatement stmt = (BoundStatement) cassStmtTask.getStatement(); |
215 | - String query = stmt.preparedStatement().getQueryString(); | 222 | + String query = stmt.getPreparedStatement().getQuery(); |
216 | try { | 223 | try { |
217 | query = toStringWithValues(stmt, ProtocolVersion.V5); | 224 | query = toStringWithValues(stmt, ProtocolVersion.V5); |
218 | } catch (Exception e) { | 225 | } catch (Exception e) { |
@@ -225,16 +232,16 @@ public abstract class AbstractBufferedRateExecutor<T extends AsyncTask, F extend | @@ -225,16 +232,16 @@ public abstract class AbstractBufferedRateExecutor<T extends AsyncTask, F extend | ||
225 | } | 232 | } |
226 | 233 | ||
227 | private static String toStringWithValues(BoundStatement boundStatement, ProtocolVersion protocolVersion) { | 234 | private static String toStringWithValues(BoundStatement boundStatement, ProtocolVersion protocolVersion) { |
228 | - CodecRegistry codecRegistry = boundStatement.preparedStatement().getCodecRegistry(); | ||
229 | - PreparedStatement preparedStatement = boundStatement.preparedStatement(); | ||
230 | - String query = preparedStatement.getQueryString(); | ||
231 | - ColumnDefinitions defs = preparedStatement.getVariables(); | 235 | + CodecRegistry codecRegistry = boundStatement.codecRegistry(); |
236 | + PreparedStatement preparedStatement = boundStatement.getPreparedStatement(); | ||
237 | + String query = preparedStatement.getQuery(); | ||
238 | + ColumnDefinitions defs = preparedStatement.getVariableDefinitions(); | ||
232 | int index = 0; | 239 | int index = 0; |
233 | - for (ColumnDefinitions.Definition def : defs) { | 240 | + for (ColumnDefinition def : defs) { |
234 | DataType type = def.getType(); | 241 | DataType type = def.getType(); |
235 | TypeCodec<Object> codec = codecRegistry.codecFor(type); | 242 | TypeCodec<Object> codec = codecRegistry.codecFor(type); |
236 | if (boundStatement.getBytesUnsafe(index) != null) { | 243 | if (boundStatement.getBytesUnsafe(index) != null) { |
237 | - Object value = codec.deserialize(boundStatement.getBytesUnsafe(index), protocolVersion); | 244 | + Object value = codec.decode(boundStatement.getBytesUnsafe(index), protocolVersion); |
238 | String replacement = Matcher.quoteReplacement(codec.format(value)); | 245 | String replacement = Matcher.quoteReplacement(codec.format(value)); |
239 | query = query.replaceFirst("\\?", replacement); | 246 | query = query.replaceFirst("\\?", replacement); |
240 | } | 247 | } |
@@ -15,8 +15,7 @@ | @@ -15,8 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao; | 16 | package org.thingsboard.server.dao; |
17 | 17 | ||
18 | -import com.datastax.driver.core.Cluster; | ||
19 | -import com.datastax.driver.core.Session; | 18 | +import com.datastax.oss.driver.api.core.CqlSession; |
20 | import org.cassandraunit.BaseCassandraUnit; | 19 | import org.cassandraunit.BaseCassandraUnit; |
21 | import org.cassandraunit.CQLDataLoader; | 20 | import org.cassandraunit.CQLDataLoader; |
22 | import org.cassandraunit.dataset.CQLDataSet; | 21 | import org.cassandraunit.dataset.CQLDataSet; |
@@ -27,8 +26,7 @@ import java.util.List; | @@ -27,8 +26,7 @@ import java.util.List; | ||
27 | public class CustomCassandraCQLUnit extends BaseCassandraUnit { | 26 | public class CustomCassandraCQLUnit extends BaseCassandraUnit { |
28 | protected List<CQLDataSet> dataSets; | 27 | protected List<CQLDataSet> dataSets; |
29 | 28 | ||
30 | - public Session session; | ||
31 | - public Cluster cluster; | 29 | + public CqlSession session; |
32 | 30 | ||
33 | public CustomCassandraCQLUnit(List<CQLDataSet> dataSets) { | 31 | public CustomCassandraCQLUnit(List<CQLDataSet> dataSets) { |
34 | this.dataSets = dataSets; | 32 | this.dataSets = dataSets; |
@@ -65,11 +63,7 @@ public class CustomCassandraCQLUnit extends BaseCassandraUnit { | @@ -65,11 +63,7 @@ public class CustomCassandraCQLUnit extends BaseCassandraUnit { | ||
65 | 63 | ||
66 | @Override | 64 | @Override |
67 | protected void load() { | 65 | protected void load() { |
68 | - String hostIp = EmbeddedCassandraServerHelper.getHost(); | ||
69 | - int port = EmbeddedCassandraServerHelper.getNativeTransportPort(); | ||
70 | - cluster = new Cluster.Builder().addContactPoints(hostIp).withPort(port).withSocketOptions(getSocketOptions()) | ||
71 | - .build(); | ||
72 | - session = cluster.connect(); | 66 | + session = EmbeddedCassandraServerHelper.getSession(); |
73 | CQLDataLoader dataLoader = new CQLDataLoader(session); | 67 | CQLDataLoader dataLoader = new CQLDataLoader(session); |
74 | dataSets.forEach(dataLoader::load); | 68 | dataSets.forEach(dataLoader::load); |
75 | session = dataLoader.getSession(); | 69 | session = dataLoader.getSession(); |
@@ -79,20 +73,16 @@ public class CustomCassandraCQLUnit extends BaseCassandraUnit { | @@ -79,20 +73,16 @@ public class CustomCassandraCQLUnit extends BaseCassandraUnit { | ||
79 | @Override | 73 | @Override |
80 | protected void after() { | 74 | protected void after() { |
81 | super.after(); | 75 | super.after(); |
82 | - try (Cluster c = cluster; Session s = session) { | 76 | + try (CqlSession s = session) { |
83 | session = null; | 77 | session = null; |
84 | - cluster = null; | ||
85 | } | 78 | } |
86 | System.setSecurityManager(null); | 79 | System.setSecurityManager(null); |
87 | } | 80 | } |
88 | 81 | ||
89 | // Getters for those who do not like to directly access fields | 82 | // Getters for those who do not like to directly access fields |
90 | 83 | ||
91 | - public Session getSession() { | 84 | + public CqlSession getSession() { |
92 | return session; | 85 | return session; |
93 | } | 86 | } |
94 | 87 | ||
95 | - public Cluster getCluster() { | ||
96 | - return cluster; | ||
97 | - } | ||
98 | } | 88 | } |
@@ -32,7 +32,7 @@ public class NoSqlDaoServiceTestSuite { | @@ -32,7 +32,7 @@ public class NoSqlDaoServiceTestSuite { | ||
32 | @ClassRule | 32 | @ClassRule |
33 | public static CustomSqlUnit sqlUnit = new CustomSqlUnit( | 33 | public static CustomSqlUnit sqlUnit = new CustomSqlUnit( |
34 | Arrays.asList("sql/schema-entities-hsql.sql", "sql/schema-entities-idx.sql", "sql/system-data.sql", "sql/system-test.sql"), | 34 | Arrays.asList("sql/schema-entities-hsql.sql", "sql/schema-entities-idx.sql", "sql/system-data.sql", "sql/system-test.sql"), |
35 | - "sql/drop-all-tables.sql", | 35 | + "sql/hsql/drop-all-tables.sql", |
36 | "nosql-test.properties" | 36 | "nosql-test.properties" |
37 | ); | 37 | ); |
38 | 38 |
dao/src/test/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFutureTest.java
deleted
100644 → 0
1 | -/** | ||
2 | - * Copyright © 2016-2020 The Thingsboard Authors | ||
3 | - * | ||
4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | - * you may not use this file except in compliance with the License. | ||
6 | - * You may obtain a copy of the License at | ||
7 | - * | ||
8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | - * | ||
10 | - * Unless required by applicable law or agreed to in writing, software | ||
11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | - * See the License for the specific language governing permissions and | ||
14 | - * limitations under the License. | ||
15 | - */ | ||
16 | -package org.thingsboard.server.dao.nosql; | ||
17 | - | ||
18 | -import com.datastax.driver.core.ProtocolVersion; | ||
19 | -import com.datastax.driver.core.ResultSet; | ||
20 | -import com.datastax.driver.core.ResultSetFuture; | ||
21 | -import com.datastax.driver.core.Row; | ||
22 | -import com.datastax.driver.core.Session; | ||
23 | -import com.datastax.driver.core.Statement; | ||
24 | -import com.datastax.driver.core.exceptions.UnsupportedFeatureException; | ||
25 | -import com.google.common.util.concurrent.Futures; | ||
26 | -import com.google.common.util.concurrent.ListenableFuture; | ||
27 | -import com.google.common.util.concurrent.MoreExecutors; | ||
28 | -import org.junit.Test; | ||
29 | -import org.junit.runner.RunWith; | ||
30 | -import org.mockito.Mock; | ||
31 | -import org.mockito.Mockito; | ||
32 | -import org.mockito.runners.MockitoJUnitRunner; | ||
33 | -import org.mockito.stubbing.Answer; | ||
34 | -import org.thingsboard.server.dao.exception.BufferLimitException; | ||
35 | -import org.thingsboard.server.dao.util.AsyncRateLimiter; | ||
36 | - | ||
37 | -import java.util.concurrent.CountDownLatch; | ||
38 | -import java.util.concurrent.ExecutionException; | ||
39 | -import java.util.concurrent.Executors; | ||
40 | -import java.util.concurrent.TimeoutException; | ||
41 | - | ||
42 | -import static org.junit.Assert.assertSame; | ||
43 | -import static org.junit.Assert.assertTrue; | ||
44 | -import static org.junit.Assert.fail; | ||
45 | -import static org.mockito.Mockito.times; | ||
46 | -import static org.mockito.Mockito.verify; | ||
47 | -import static org.mockito.Mockito.verifyNoMoreInteractions; | ||
48 | -import static org.mockito.Mockito.when; | ||
49 | - | ||
50 | -@RunWith(MockitoJUnitRunner.class) | ||
51 | -public class RateLimitedResultSetFutureTest { | ||
52 | - | ||
53 | - private RateLimitedResultSetFuture resultSetFuture; | ||
54 | - | ||
55 | - @Mock | ||
56 | - private AsyncRateLimiter rateLimiter; | ||
57 | - @Mock | ||
58 | - private Session session; | ||
59 | - @Mock | ||
60 | - private Statement statement; | ||
61 | - @Mock | ||
62 | - private ResultSetFuture realFuture; | ||
63 | - @Mock | ||
64 | - private ResultSet rows; | ||
65 | - @Mock | ||
66 | - private Row row; | ||
67 | - | ||
68 | - @Test | ||
69 | - public void doNotReleasePermissionIfRateLimitFutureFailed() throws InterruptedException { | ||
70 | - when(rateLimiter.acquireAsync()).thenReturn(Futures.immediateFailedFuture(new BufferLimitException())); | ||
71 | - resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); | ||
72 | - Thread.sleep(1000L); | ||
73 | - verify(rateLimiter).acquireAsync(); | ||
74 | - try { | ||
75 | - assertTrue(resultSetFuture.isDone()); | ||
76 | - fail(); | ||
77 | - } catch (Exception e) { | ||
78 | - assertTrue(e instanceof IllegalStateException); | ||
79 | - Throwable actualCause = e.getCause(); | ||
80 | - assertTrue(actualCause instanceof ExecutionException); | ||
81 | - } | ||
82 | - verifyNoMoreInteractions(session, rateLimiter, statement); | ||
83 | - | ||
84 | - } | ||
85 | - | ||
86 | - @Test | ||
87 | - public void getUninterruptiblyDelegateToCassandra() throws InterruptedException, ExecutionException { | ||
88 | - when(rateLimiter.acquireAsync()).thenReturn(Futures.immediateFuture(null)); | ||
89 | - when(session.executeAsync(statement)).thenReturn(realFuture); | ||
90 | - Mockito.doAnswer((Answer<Void>) invocation -> { | ||
91 | - Object[] args = invocation.getArguments(); | ||
92 | - Runnable task = (Runnable) args[0]; | ||
93 | - task.run(); | ||
94 | - return null; | ||
95 | - }).when(realFuture).addListener(Mockito.any(), Mockito.any()); | ||
96 | - | ||
97 | - when(realFuture.getUninterruptibly()).thenReturn(rows); | ||
98 | - | ||
99 | - resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); | ||
100 | - ResultSet actual = resultSetFuture.getUninterruptibly(); | ||
101 | - assertSame(rows, actual); | ||
102 | - verify(rateLimiter, times(1)).acquireAsync(); | ||
103 | - verify(rateLimiter, times(1)).release(); | ||
104 | - } | ||
105 | - | ||
106 | - @Test | ||
107 | - public void addListenerAllowsFutureTransformation() throws InterruptedException, ExecutionException { | ||
108 | - when(rateLimiter.acquireAsync()).thenReturn(Futures.immediateFuture(null)); | ||
109 | - when(session.executeAsync(statement)).thenReturn(realFuture); | ||
110 | - Mockito.doAnswer((Answer<Void>) invocation -> { | ||
111 | - Object[] args = invocation.getArguments(); | ||
112 | - Runnable task = (Runnable) args[0]; | ||
113 | - task.run(); | ||
114 | - return null; | ||
115 | - }).when(realFuture).addListener(Mockito.any(), Mockito.any()); | ||
116 | - | ||
117 | - when(realFuture.get()).thenReturn(rows); | ||
118 | - when(rows.one()).thenReturn(row); | ||
119 | - | ||
120 | - resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); | ||
121 | - | ||
122 | - ListenableFuture<Row> transform = Futures.transform(resultSetFuture, ResultSet::one, MoreExecutors.directExecutor()); | ||
123 | - Row actualRow = transform.get(); | ||
124 | - | ||
125 | - assertSame(row, actualRow); | ||
126 | - verify(rateLimiter, times(1)).acquireAsync(); | ||
127 | - verify(rateLimiter, times(1)).release(); | ||
128 | - } | ||
129 | - | ||
130 | - @Test | ||
131 | - public void immidiateCassandraExceptionReturnsPermit() throws InterruptedException, ExecutionException { | ||
132 | - when(rateLimiter.acquireAsync()).thenReturn(Futures.immediateFuture(null)); | ||
133 | - when(session.executeAsync(statement)).thenThrow(new UnsupportedFeatureException(ProtocolVersion.V3, "hjg")); | ||
134 | - resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); | ||
135 | - ListenableFuture<Row> transform = Futures.transform(resultSetFuture, ResultSet::one, MoreExecutors.directExecutor()); | ||
136 | - try { | ||
137 | - transform.get(); | ||
138 | - fail(); | ||
139 | - } catch (Exception e) { | ||
140 | - assertTrue(e instanceof ExecutionException); | ||
141 | - } | ||
142 | - verify(rateLimiter, times(1)).acquireAsync(); | ||
143 | - verify(rateLimiter, times(1)).release(); | ||
144 | - } | ||
145 | - | ||
146 | - @Test | ||
147 | - public void queryTimeoutReturnsPermit() throws InterruptedException, ExecutionException { | ||
148 | - when(rateLimiter.acquireAsync()).thenReturn(Futures.immediateFuture(null)); | ||
149 | - when(session.executeAsync(statement)).thenReturn(realFuture); | ||
150 | - Mockito.doAnswer((Answer<Void>) invocation -> { | ||
151 | - Object[] args = invocation.getArguments(); | ||
152 | - Runnable task = (Runnable) args[0]; | ||
153 | - task.run(); | ||
154 | - return null; | ||
155 | - }).when(realFuture).addListener(Mockito.any(), Mockito.any()); | ||
156 | - | ||
157 | - when(realFuture.get()).thenThrow(new ExecutionException("Fail", new TimeoutException("timeout"))); | ||
158 | - resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); | ||
159 | - ListenableFuture<Row> transform = Futures.transform(resultSetFuture, ResultSet::one, MoreExecutors.directExecutor()); | ||
160 | - try { | ||
161 | - transform.get(); | ||
162 | - fail(); | ||
163 | - } catch (Exception e) { | ||
164 | - assertTrue(e instanceof ExecutionException); | ||
165 | - } | ||
166 | - verify(rateLimiter, times(1)).acquireAsync(); | ||
167 | - verify(rateLimiter, times(1)).release(); | ||
168 | - } | ||
169 | - | ||
170 | - @Test | ||
171 | - public void expiredQueryReturnPermit() throws InterruptedException, ExecutionException { | ||
172 | - CountDownLatch latch = new CountDownLatch(1); | ||
173 | - ListenableFuture<Void> future = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(1)).submit(() -> { | ||
174 | - latch.await(); | ||
175 | - return null; | ||
176 | - }); | ||
177 | - when(rateLimiter.acquireAsync()).thenReturn(future); | ||
178 | - resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); | ||
179 | - | ||
180 | - ListenableFuture<Row> transform = Futures.transform(resultSetFuture, ResultSet::one, MoreExecutors.directExecutor()); | ||
181 | -// TimeUnit.MILLISECONDS.sleep(200); | ||
182 | - future.cancel(false); | ||
183 | - latch.countDown(); | ||
184 | - | ||
185 | - try { | ||
186 | - transform.get(); | ||
187 | - fail(); | ||
188 | - } catch (Exception e) { | ||
189 | - assertTrue(e instanceof ExecutionException); | ||
190 | - } | ||
191 | - verify(rateLimiter, times(1)).acquireAsync(); | ||
192 | - verify(rateLimiter, times(1)).release(); | ||
193 | - } | ||
194 | - | ||
195 | -} |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.service; | 16 | package org.thingsboard.server.dao.service; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import com.fasterxml.jackson.databind.ObjectMapper; | 20 | import com.fasterxml.jackson.databind.ObjectMapper; |
21 | import org.junit.runner.RunWith; | 21 | import org.junit.runner.RunWith; |
@@ -134,7 +134,7 @@ public abstract class AbstractServiceTest { | @@ -134,7 +134,7 @@ public abstract class AbstractServiceTest { | ||
134 | 134 | ||
135 | protected Event generateEvent(TenantId tenantId, EntityId entityId, String eventType, String eventUid) throws IOException { | 135 | protected Event generateEvent(TenantId tenantId, EntityId entityId, String eventType, String eventUid) throws IOException { |
136 | if (tenantId == null) { | 136 | if (tenantId == null) { |
137 | - tenantId = new TenantId(UUIDs.timeBased()); | 137 | + tenantId = new TenantId(Uuids.timeBased()); |
138 | } | 138 | } |
139 | Event event = new Event(); | 139 | Event event = new Event(); |
140 | event.setTenantId(tenantId); | 140 | event.setTenantId(tenantId); |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.service; | 16 | package org.thingsboard.server.dao.service; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import org.junit.After; | 19 | import org.junit.After; |
20 | import org.junit.Assert; | 20 | import org.junit.Assert; |
21 | import org.junit.Before; | 21 | import org.junit.Before; |
@@ -59,8 +59,8 @@ public abstract class BaseAlarmServiceTest extends AbstractServiceTest { | @@ -59,8 +59,8 @@ public abstract class BaseAlarmServiceTest extends AbstractServiceTest { | ||
59 | 59 | ||
60 | @Test | 60 | @Test |
61 | public void testSaveAndFetchAlarm() throws ExecutionException, InterruptedException { | 61 | public void testSaveAndFetchAlarm() throws ExecutionException, InterruptedException { |
62 | - AssetId parentId = new AssetId(UUIDs.timeBased()); | ||
63 | - AssetId childId = new AssetId(UUIDs.timeBased()); | 62 | + AssetId parentId = new AssetId(Uuids.timeBased()); |
63 | + AssetId childId = new AssetId(Uuids.timeBased()); | ||
64 | 64 | ||
65 | EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); | 65 | EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); |
66 | 66 | ||
@@ -96,8 +96,8 @@ public abstract class BaseAlarmServiceTest extends AbstractServiceTest { | @@ -96,8 +96,8 @@ public abstract class BaseAlarmServiceTest extends AbstractServiceTest { | ||
96 | 96 | ||
97 | @Test | 97 | @Test |
98 | public void testFindAlarm() throws ExecutionException, InterruptedException { | 98 | public void testFindAlarm() throws ExecutionException, InterruptedException { |
99 | - AssetId parentId = new AssetId(UUIDs.timeBased()); | ||
100 | - AssetId childId = new AssetId(UUIDs.timeBased()); | 99 | + AssetId parentId = new AssetId(Uuids.timeBased()); |
100 | + AssetId childId = new AssetId(Uuids.timeBased()); | ||
101 | 101 | ||
102 | EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); | 102 | EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); |
103 | 103 | ||
@@ -197,8 +197,8 @@ public abstract class BaseAlarmServiceTest extends AbstractServiceTest { | @@ -197,8 +197,8 @@ public abstract class BaseAlarmServiceTest extends AbstractServiceTest { | ||
197 | 197 | ||
198 | @Test | 198 | @Test |
199 | public void testDeleteAlarm() throws ExecutionException, InterruptedException { | 199 | public void testDeleteAlarm() throws ExecutionException, InterruptedException { |
200 | - AssetId parentId = new AssetId(UUIDs.timeBased()); | ||
201 | - AssetId childId = new AssetId(UUIDs.timeBased()); | 200 | + AssetId parentId = new AssetId(Uuids.timeBased()); |
201 | + AssetId childId = new AssetId(Uuids.timeBased()); | ||
202 | 202 | ||
203 | EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); | 203 | EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); |
204 | 204 |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.service; | 16 | package org.thingsboard.server.dao.service; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import org.apache.commons.lang3.RandomStringUtils; | 19 | import org.apache.commons.lang3.RandomStringUtils; |
20 | import org.junit.After; | 20 | import org.junit.After; |
21 | import org.junit.Assert; | 21 | import org.junit.Assert; |
@@ -104,7 +104,7 @@ public abstract class BaseAssetServiceTest extends AbstractServiceTest { | @@ -104,7 +104,7 @@ public abstract class BaseAssetServiceTest extends AbstractServiceTest { | ||
104 | Asset asset = new Asset(); | 104 | Asset asset = new Asset(); |
105 | asset.setName("My asset"); | 105 | asset.setName("My asset"); |
106 | asset.setType("default"); | 106 | asset.setType("default"); |
107 | - asset.setTenantId(new TenantId(UUIDs.timeBased())); | 107 | + asset.setTenantId(new TenantId(Uuids.timeBased())); |
108 | assetService.saveAsset(asset); | 108 | assetService.saveAsset(asset); |
109 | } | 109 | } |
110 | 110 | ||
@@ -116,7 +116,7 @@ public abstract class BaseAssetServiceTest extends AbstractServiceTest { | @@ -116,7 +116,7 @@ public abstract class BaseAssetServiceTest extends AbstractServiceTest { | ||
116 | asset.setTenantId(tenantId); | 116 | asset.setTenantId(tenantId); |
117 | asset = assetService.saveAsset(asset); | 117 | asset = assetService.saveAsset(asset); |
118 | try { | 118 | try { |
119 | - assetService.assignAssetToCustomer(tenantId, asset.getId(), new CustomerId(UUIDs.timeBased())); | 119 | + assetService.assignAssetToCustomer(tenantId, asset.getId(), new CustomerId(Uuids.timeBased())); |
120 | } finally { | 120 | } finally { |
121 | assetService.deleteAsset(tenantId, asset.getId()); | 121 | assetService.deleteAsset(tenantId, asset.getId()); |
122 | } | 122 | } |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.service; | 16 | package org.thingsboard.server.dao.service; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import org.apache.commons.lang3.RandomStringUtils; | 19 | import org.apache.commons.lang3.RandomStringUtils; |
20 | import org.junit.After; | 20 | import org.junit.After; |
21 | import org.junit.Assert; | 21 | import org.junit.Assert; |
@@ -105,7 +105,7 @@ public abstract class BaseCustomerServiceTest extends AbstractServiceTest { | @@ -105,7 +105,7 @@ public abstract class BaseCustomerServiceTest extends AbstractServiceTest { | ||
105 | public void testSaveCustomerWithInvalidTenant() { | 105 | public void testSaveCustomerWithInvalidTenant() { |
106 | Customer customer = new Customer(); | 106 | Customer customer = new Customer(); |
107 | customer.setTitle("My customer"); | 107 | customer.setTitle("My customer"); |
108 | - customer.setTenantId(new TenantId(UUIDs.timeBased())); | 108 | + customer.setTenantId(new TenantId(Uuids.timeBased())); |
109 | customerService.saveCustomer(customer); | 109 | customerService.saveCustomer(customer); |
110 | } | 110 | } |
111 | 111 |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.service; | 16 | package org.thingsboard.server.dao.service; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import org.apache.commons.lang3.RandomStringUtils; | 19 | import org.apache.commons.lang3.RandomStringUtils; |
20 | import org.junit.After; | 20 | import org.junit.After; |
21 | import org.junit.Assert; | 21 | import org.junit.Assert; |
@@ -98,7 +98,7 @@ public abstract class BaseDashboardServiceTest extends AbstractServiceTest { | @@ -98,7 +98,7 @@ public abstract class BaseDashboardServiceTest extends AbstractServiceTest { | ||
98 | public void testSaveDashboardWithInvalidTenant() { | 98 | public void testSaveDashboardWithInvalidTenant() { |
99 | Dashboard dashboard = new Dashboard(); | 99 | Dashboard dashboard = new Dashboard(); |
100 | dashboard.setTitle("My dashboard"); | 100 | dashboard.setTitle("My dashboard"); |
101 | - dashboard.setTenantId(new TenantId(UUIDs.timeBased())); | 101 | + dashboard.setTenantId(new TenantId(Uuids.timeBased())); |
102 | dashboardService.saveDashboard(dashboard); | 102 | dashboardService.saveDashboard(dashboard); |
103 | } | 103 | } |
104 | 104 | ||
@@ -109,7 +109,7 @@ public abstract class BaseDashboardServiceTest extends AbstractServiceTest { | @@ -109,7 +109,7 @@ public abstract class BaseDashboardServiceTest extends AbstractServiceTest { | ||
109 | dashboard.setTenantId(tenantId); | 109 | dashboard.setTenantId(tenantId); |
110 | dashboard = dashboardService.saveDashboard(dashboard); | 110 | dashboard = dashboardService.saveDashboard(dashboard); |
111 | try { | 111 | try { |
112 | - dashboardService.assignDashboardToCustomer(tenantId, dashboard.getId(), new CustomerId(UUIDs.timeBased())); | 112 | + dashboardService.assignDashboardToCustomer(tenantId, dashboard.getId(), new CustomerId(Uuids.timeBased())); |
113 | } finally { | 113 | } finally { |
114 | dashboardService.deleteDashboard(tenantId, dashboard.getId()); | 114 | dashboardService.deleteDashboard(tenantId, dashboard.getId()); |
115 | } | 115 | } |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.service; | 16 | package org.thingsboard.server.dao.service; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import org.junit.After; | 19 | import org.junit.After; |
20 | import org.junit.Assert; | 20 | import org.junit.Assert; |
21 | import org.junit.Before; | 21 | import org.junit.Before; |
@@ -109,7 +109,7 @@ public abstract class BaseDeviceCredentialsServiceTest extends AbstractServiceTe | @@ -109,7 +109,7 @@ public abstract class BaseDeviceCredentialsServiceTest extends AbstractServiceTe | ||
109 | device.setTenantId(tenantId); | 109 | device.setTenantId(tenantId); |
110 | device = deviceService.saveDevice(device); | 110 | device = deviceService.saveDevice(device); |
111 | DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, device.getId()); | 111 | DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, device.getId()); |
112 | - DeviceCredentials newDeviceCredentials = new DeviceCredentials(new DeviceCredentialsId(UUIDs.timeBased())); | 112 | + DeviceCredentials newDeviceCredentials = new DeviceCredentials(new DeviceCredentialsId(Uuids.timeBased())); |
113 | newDeviceCredentials.setCreatedTime(deviceCredentials.getCreatedTime()); | 113 | newDeviceCredentials.setCreatedTime(deviceCredentials.getCreatedTime()); |
114 | newDeviceCredentials.setDeviceId(deviceCredentials.getDeviceId()); | 114 | newDeviceCredentials.setDeviceId(deviceCredentials.getDeviceId()); |
115 | newDeviceCredentials.setCredentialsType(deviceCredentials.getCredentialsType()); | 115 | newDeviceCredentials.setCredentialsType(deviceCredentials.getCredentialsType()); |
@@ -129,7 +129,7 @@ public abstract class BaseDeviceCredentialsServiceTest extends AbstractServiceTe | @@ -129,7 +129,7 @@ public abstract class BaseDeviceCredentialsServiceTest extends AbstractServiceTe | ||
129 | device.setTenantId(tenantId); | 129 | device.setTenantId(tenantId); |
130 | device = deviceService.saveDevice(device); | 130 | device = deviceService.saveDevice(device); |
131 | DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, device.getId()); | 131 | DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, device.getId()); |
132 | - deviceCredentials.setDeviceId(new DeviceId(UUIDs.timeBased())); | 132 | + deviceCredentials.setDeviceId(new DeviceId(Uuids.timeBased())); |
133 | try { | 133 | try { |
134 | deviceCredentialsService.updateDeviceCredentials(tenantId, deviceCredentials); | 134 | deviceCredentialsService.updateDeviceCredentials(tenantId, deviceCredentials); |
135 | } finally { | 135 | } finally { |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.service; | 16 | package org.thingsboard.server.dao.service; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import org.apache.commons.lang3.RandomStringUtils; | 19 | import org.apache.commons.lang3.RandomStringUtils; |
20 | import org.junit.After; | 20 | import org.junit.After; |
21 | import org.junit.Assert; | 21 | import org.junit.Assert; |
@@ -110,7 +110,7 @@ public abstract class BaseDeviceServiceTest extends AbstractServiceTest { | @@ -110,7 +110,7 @@ public abstract class BaseDeviceServiceTest extends AbstractServiceTest { | ||
110 | Device device = new Device(); | 110 | Device device = new Device(); |
111 | device.setName("My device"); | 111 | device.setName("My device"); |
112 | device.setType("default"); | 112 | device.setType("default"); |
113 | - device.setTenantId(new TenantId(UUIDs.timeBased())); | 113 | + device.setTenantId(new TenantId(Uuids.timeBased())); |
114 | deviceService.saveDevice(device); | 114 | deviceService.saveDevice(device); |
115 | } | 115 | } |
116 | 116 | ||
@@ -122,7 +122,7 @@ public abstract class BaseDeviceServiceTest extends AbstractServiceTest { | @@ -122,7 +122,7 @@ public abstract class BaseDeviceServiceTest extends AbstractServiceTest { | ||
122 | device.setTenantId(tenantId); | 122 | device.setTenantId(tenantId); |
123 | device = deviceService.saveDevice(device); | 123 | device = deviceService.saveDevice(device); |
124 | try { | 124 | try { |
125 | - deviceService.assignDeviceToCustomer(tenantId, device.getId(), new CustomerId(UUIDs.timeBased())); | 125 | + deviceService.assignDeviceToCustomer(tenantId, device.getId(), new CustomerId(Uuids.timeBased())); |
126 | } finally { | 126 | } finally { |
127 | deviceService.deleteDevice(tenantId, device.getId()); | 127 | deviceService.deleteDevice(tenantId, device.getId()); |
128 | } | 128 | } |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.service; | 16 | package org.thingsboard.server.dao.service; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import org.junit.After; | 19 | import org.junit.After; |
20 | import org.junit.Assert; | 20 | import org.junit.Assert; |
21 | import org.junit.Before; | 21 | import org.junit.Before; |
@@ -47,8 +47,8 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | @@ -47,8 +47,8 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | ||
47 | 47 | ||
48 | @Test | 48 | @Test |
49 | public void testSaveRelation() throws ExecutionException, InterruptedException { | 49 | public void testSaveRelation() throws ExecutionException, InterruptedException { |
50 | - AssetId parentId = new AssetId(UUIDs.timeBased()); | ||
51 | - AssetId childId = new AssetId(UUIDs.timeBased()); | 50 | + AssetId parentId = new AssetId(Uuids.timeBased()); |
51 | + AssetId childId = new AssetId(Uuids.timeBased()); | ||
52 | 52 | ||
53 | EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); | 53 | EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); |
54 | 54 | ||
@@ -65,9 +65,9 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | @@ -65,9 +65,9 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | ||
65 | 65 | ||
66 | @Test | 66 | @Test |
67 | public void testDeleteRelation() throws ExecutionException, InterruptedException { | 67 | public void testDeleteRelation() throws ExecutionException, InterruptedException { |
68 | - AssetId parentId = new AssetId(UUIDs.timeBased()); | ||
69 | - AssetId childId = new AssetId(UUIDs.timeBased()); | ||
70 | - AssetId subChildId = new AssetId(UUIDs.timeBased()); | 68 | + AssetId parentId = new AssetId(Uuids.timeBased()); |
69 | + AssetId childId = new AssetId(Uuids.timeBased()); | ||
70 | + AssetId subChildId = new AssetId(Uuids.timeBased()); | ||
71 | 71 | ||
72 | EntityRelation relationA = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); | 72 | EntityRelation relationA = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); |
73 | EntityRelation relationB = new EntityRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE); | 73 | EntityRelation relationB = new EntityRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE); |
@@ -86,9 +86,9 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | @@ -86,9 +86,9 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | ||
86 | 86 | ||
87 | @Test | 87 | @Test |
88 | public void testDeleteEntityRelations() throws ExecutionException, InterruptedException { | 88 | public void testDeleteEntityRelations() throws ExecutionException, InterruptedException { |
89 | - AssetId parentId = new AssetId(UUIDs.timeBased()); | ||
90 | - AssetId childId = new AssetId(UUIDs.timeBased()); | ||
91 | - AssetId subChildId = new AssetId(UUIDs.timeBased()); | 89 | + AssetId parentId = new AssetId(Uuids.timeBased()); |
90 | + AssetId childId = new AssetId(Uuids.timeBased()); | ||
91 | + AssetId subChildId = new AssetId(Uuids.timeBased()); | ||
92 | 92 | ||
93 | EntityRelation relationA = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); | 93 | EntityRelation relationA = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); |
94 | EntityRelation relationB = new EntityRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE); | 94 | EntityRelation relationB = new EntityRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE); |
@@ -105,10 +105,10 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | @@ -105,10 +105,10 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | ||
105 | 105 | ||
106 | @Test | 106 | @Test |
107 | public void testFindFrom() throws ExecutionException, InterruptedException { | 107 | public void testFindFrom() throws ExecutionException, InterruptedException { |
108 | - AssetId parentA = new AssetId(UUIDs.timeBased()); | ||
109 | - AssetId parentB = new AssetId(UUIDs.timeBased()); | ||
110 | - AssetId childA = new AssetId(UUIDs.timeBased()); | ||
111 | - AssetId childB = new AssetId(UUIDs.timeBased()); | 108 | + AssetId parentA = new AssetId(Uuids.timeBased()); |
109 | + AssetId parentB = new AssetId(Uuids.timeBased()); | ||
110 | + AssetId childA = new AssetId(Uuids.timeBased()); | ||
111 | + AssetId childB = new AssetId(Uuids.timeBased()); | ||
112 | 112 | ||
113 | EntityRelation relationA1 = new EntityRelation(parentA, childA, EntityRelation.CONTAINS_TYPE); | 113 | EntityRelation relationA1 = new EntityRelation(parentA, childA, EntityRelation.CONTAINS_TYPE); |
114 | EntityRelation relationA2 = new EntityRelation(parentA, childB, EntityRelation.CONTAINS_TYPE); | 114 | EntityRelation relationA2 = new EntityRelation(parentA, childB, EntityRelation.CONTAINS_TYPE); |
@@ -157,10 +157,10 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | @@ -157,10 +157,10 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | ||
157 | 157 | ||
158 | @Test | 158 | @Test |
159 | public void testFindTo() throws ExecutionException, InterruptedException { | 159 | public void testFindTo() throws ExecutionException, InterruptedException { |
160 | - AssetId parentA = new AssetId(UUIDs.timeBased()); | ||
161 | - AssetId parentB = new AssetId(UUIDs.timeBased()); | ||
162 | - AssetId childA = new AssetId(UUIDs.timeBased()); | ||
163 | - AssetId childB = new AssetId(UUIDs.timeBased()); | 160 | + AssetId parentA = new AssetId(Uuids.timeBased()); |
161 | + AssetId parentB = new AssetId(Uuids.timeBased()); | ||
162 | + AssetId childA = new AssetId(Uuids.timeBased()); | ||
163 | + AssetId childB = new AssetId(Uuids.timeBased()); | ||
164 | 164 | ||
165 | EntityRelation relationA1 = new EntityRelation(parentA, childA, EntityRelation.CONTAINS_TYPE); | 165 | EntityRelation relationA1 = new EntityRelation(parentA, childA, EntityRelation.CONTAINS_TYPE); |
166 | EntityRelation relationA2 = new EntityRelation(parentA, childB, EntityRelation.CONTAINS_TYPE); | 166 | EntityRelation relationA2 = new EntityRelation(parentA, childB, EntityRelation.CONTAINS_TYPE); |
@@ -207,9 +207,9 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | @@ -207,9 +207,9 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | ||
207 | @Test | 207 | @Test |
208 | public void testCyclicRecursiveRelation() throws ExecutionException, InterruptedException { | 208 | public void testCyclicRecursiveRelation() throws ExecutionException, InterruptedException { |
209 | // A -> B -> C -> A | 209 | // A -> B -> C -> A |
210 | - AssetId assetA = new AssetId(UUIDs.timeBased()); | ||
211 | - AssetId assetB = new AssetId(UUIDs.timeBased()); | ||
212 | - AssetId assetC = new AssetId(UUIDs.timeBased()); | 210 | + AssetId assetA = new AssetId(Uuids.timeBased()); |
211 | + AssetId assetB = new AssetId(Uuids.timeBased()); | ||
212 | + AssetId assetC = new AssetId(Uuids.timeBased()); | ||
213 | 213 | ||
214 | EntityRelation relationA = new EntityRelation(assetA, assetB, EntityRelation.CONTAINS_TYPE); | 214 | EntityRelation relationA = new EntityRelation(assetA, assetB, EntityRelation.CONTAINS_TYPE); |
215 | EntityRelation relationB = new EntityRelation(assetB, assetC, EntityRelation.CONTAINS_TYPE); | 215 | EntityRelation relationB = new EntityRelation(assetB, assetC, EntityRelation.CONTAINS_TYPE); |
@@ -239,10 +239,10 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | @@ -239,10 +239,10 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | ||
239 | @Test | 239 | @Test |
240 | public void testRecursiveRelation() throws ExecutionException, InterruptedException { | 240 | public void testRecursiveRelation() throws ExecutionException, InterruptedException { |
241 | // A -> B -> [C,D] | 241 | // A -> B -> [C,D] |
242 | - AssetId assetA = new AssetId(UUIDs.timeBased()); | ||
243 | - AssetId assetB = new AssetId(UUIDs.timeBased()); | ||
244 | - AssetId assetC = new AssetId(UUIDs.timeBased()); | ||
245 | - DeviceId deviceD = new DeviceId(UUIDs.timeBased()); | 242 | + AssetId assetA = new AssetId(Uuids.timeBased()); |
243 | + AssetId assetB = new AssetId(Uuids.timeBased()); | ||
244 | + AssetId assetC = new AssetId(Uuids.timeBased()); | ||
245 | + DeviceId deviceD = new DeviceId(Uuids.timeBased()); | ||
246 | 246 | ||
247 | EntityRelation relationAB = new EntityRelation(assetA, assetB, EntityRelation.CONTAINS_TYPE); | 247 | EntityRelation relationAB = new EntityRelation(assetA, assetB, EntityRelation.CONTAINS_TYPE); |
248 | EntityRelation relationBC = new EntityRelation(assetB, assetC, EntityRelation.CONTAINS_TYPE); | 248 | EntityRelation relationBC = new EntityRelation(assetB, assetC, EntityRelation.CONTAINS_TYPE); |
@@ -272,7 +272,7 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | @@ -272,7 +272,7 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | ||
272 | @Test(expected = DataValidationException.class) | 272 | @Test(expected = DataValidationException.class) |
273 | public void testSaveRelationWithEmptyFrom() throws ExecutionException, InterruptedException { | 273 | public void testSaveRelationWithEmptyFrom() throws ExecutionException, InterruptedException { |
274 | EntityRelation relation = new EntityRelation(); | 274 | EntityRelation relation = new EntityRelation(); |
275 | - relation.setTo(new AssetId(UUIDs.timeBased())); | 275 | + relation.setTo(new AssetId(Uuids.timeBased())); |
276 | relation.setType(EntityRelation.CONTAINS_TYPE); | 276 | relation.setType(EntityRelation.CONTAINS_TYPE); |
277 | Assert.assertTrue(saveRelation(relation)); | 277 | Assert.assertTrue(saveRelation(relation)); |
278 | } | 278 | } |
@@ -280,7 +280,7 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | @@ -280,7 +280,7 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | ||
280 | @Test(expected = DataValidationException.class) | 280 | @Test(expected = DataValidationException.class) |
281 | public void testSaveRelationWithEmptyTo() throws ExecutionException, InterruptedException { | 281 | public void testSaveRelationWithEmptyTo() throws ExecutionException, InterruptedException { |
282 | EntityRelation relation = new EntityRelation(); | 282 | EntityRelation relation = new EntityRelation(); |
283 | - relation.setFrom(new AssetId(UUIDs.timeBased())); | 283 | + relation.setFrom(new AssetId(Uuids.timeBased())); |
284 | relation.setType(EntityRelation.CONTAINS_TYPE); | 284 | relation.setType(EntityRelation.CONTAINS_TYPE); |
285 | Assert.assertTrue(saveRelation(relation)); | 285 | Assert.assertTrue(saveRelation(relation)); |
286 | } | 286 | } |
@@ -288,8 +288,8 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | @@ -288,8 +288,8 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { | ||
288 | @Test(expected = DataValidationException.class) | 288 | @Test(expected = DataValidationException.class) |
289 | public void testSaveRelationWithEmptyType() throws ExecutionException, InterruptedException { | 289 | public void testSaveRelationWithEmptyType() throws ExecutionException, InterruptedException { |
290 | EntityRelation relation = new EntityRelation(); | 290 | EntityRelation relation = new EntityRelation(); |
291 | - relation.setFrom(new AssetId(UUIDs.timeBased())); | ||
292 | - relation.setTo(new AssetId(UUIDs.timeBased())); | 291 | + relation.setFrom(new AssetId(Uuids.timeBased())); |
292 | + relation.setTo(new AssetId(Uuids.timeBased())); | ||
293 | Assert.assertTrue(saveRelation(relation)); | 293 | Assert.assertTrue(saveRelation(relation)); |
294 | } | 294 | } |
295 | } | 295 | } |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.service; | 16 | package org.thingsboard.server.dao.service; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.ObjectMapper; | 19 | import com.fasterxml.jackson.databind.ObjectMapper; |
20 | import org.apache.commons.lang3.RandomStringUtils; | 20 | import org.apache.commons.lang3.RandomStringUtils; |
21 | import org.junit.After; | 21 | import org.junit.After; |
@@ -94,7 +94,7 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest { | @@ -94,7 +94,7 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest { | ||
94 | public void testSaveRuleChainWithInvalidTenant() { | 94 | public void testSaveRuleChainWithInvalidTenant() { |
95 | RuleChain ruleChain = new RuleChain(); | 95 | RuleChain ruleChain = new RuleChain(); |
96 | ruleChain.setName("My RuleChain"); | 96 | ruleChain.setName("My RuleChain"); |
97 | - ruleChain.setTenantId(new TenantId(UUIDs.timeBased())); | 97 | + ruleChain.setTenantId(new TenantId(Uuids.timeBased())); |
98 | ruleChainService.saveRuleChain(ruleChain); | 98 | ruleChainService.saveRuleChain(ruleChain); |
99 | } | 99 | } |
100 | 100 |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.service; | 16 | package org.thingsboard.server.dao.service; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import com.fasterxml.jackson.databind.JsonNode; | 19 | import com.fasterxml.jackson.databind.JsonNode; |
20 | import com.fasterxml.jackson.databind.ObjectMapper; | 20 | import com.fasterxml.jackson.databind.ObjectMapper; |
21 | import org.junit.After; | 21 | import org.junit.After; |
@@ -141,7 +141,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest { | @@ -141,7 +141,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest { | ||
141 | WidgetsBundle savedWidgetsBundle = widgetsBundleService.saveWidgetsBundle(widgetsBundle); | 141 | WidgetsBundle savedWidgetsBundle = widgetsBundleService.saveWidgetsBundle(widgetsBundle); |
142 | 142 | ||
143 | WidgetType widgetType = new WidgetType(); | 143 | WidgetType widgetType = new WidgetType(); |
144 | - widgetType.setTenantId(new TenantId(UUIDs.timeBased())); | 144 | + widgetType.setTenantId(new TenantId(Uuids.timeBased())); |
145 | widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); | 145 | widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); |
146 | widgetType.setName("Widget Type"); | 146 | widgetType.setName("Widget Type"); |
147 | widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); | 147 | widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.service; | 16 | package org.thingsboard.server.dao.service; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import org.junit.After; | 19 | import org.junit.After; |
20 | import org.junit.Assert; | 20 | import org.junit.Assert; |
21 | import org.junit.Before; | 21 | import org.junit.Before; |
@@ -88,7 +88,7 @@ public abstract class BaseWidgetsBundleServiceTest extends AbstractServiceTest { | @@ -88,7 +88,7 @@ public abstract class BaseWidgetsBundleServiceTest extends AbstractServiceTest { | ||
88 | public void testSaveWidgetsBundleWithInvalidTenant() { | 88 | public void testSaveWidgetsBundleWithInvalidTenant() { |
89 | WidgetsBundle widgetsBundle = new WidgetsBundle(); | 89 | WidgetsBundle widgetsBundle = new WidgetsBundle(); |
90 | widgetsBundle.setTitle("My widgets bundle"); | 90 | widgetsBundle.setTitle("My widgets bundle"); |
91 | - widgetsBundle.setTenantId(new TenantId(UUIDs.timeBased())); | 91 | + widgetsBundle.setTenantId(new TenantId(Uuids.timeBased())); |
92 | widgetsBundleService.saveWidgetsBundle(widgetsBundle); | 92 | widgetsBundleService.saveWidgetsBundle(widgetsBundle); |
93 | } | 93 | } |
94 | 94 |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.service.attributes; | 16 | package org.thingsboard.server.dao.service.attributes; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import org.junit.Assert; | 19 | import org.junit.Assert; |
20 | import org.junit.Before; | 20 | import org.junit.Before; |
21 | import org.junit.Test; | 21 | import org.junit.Test; |
@@ -47,7 +47,7 @@ public abstract class BaseAttributesServiceTest extends AbstractServiceTest { | @@ -47,7 +47,7 @@ public abstract class BaseAttributesServiceTest extends AbstractServiceTest { | ||
47 | 47 | ||
48 | @Test | 48 | @Test |
49 | public void saveAndFetch() throws Exception { | 49 | public void saveAndFetch() throws Exception { |
50 | - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); | 50 | + DeviceId deviceId = new DeviceId(Uuids.timeBased()); |
51 | KvEntry attrValue = new StringDataEntry("attribute1", "value1"); | 51 | KvEntry attrValue = new StringDataEntry("attribute1", "value1"); |
52 | AttributeKvEntry attr = new BaseAttributeKvEntry(attrValue, 42L); | 52 | AttributeKvEntry attr = new BaseAttributeKvEntry(attrValue, 42L); |
53 | attributesService.save(SYSTEM_TENANT_ID, deviceId, DataConstants.CLIENT_SCOPE, Collections.singletonList(attr)).get(); | 53 | attributesService.save(SYSTEM_TENANT_ID, deviceId, DataConstants.CLIENT_SCOPE, Collections.singletonList(attr)).get(); |
@@ -58,7 +58,7 @@ public abstract class BaseAttributesServiceTest extends AbstractServiceTest { | @@ -58,7 +58,7 @@ public abstract class BaseAttributesServiceTest extends AbstractServiceTest { | ||
58 | 58 | ||
59 | @Test | 59 | @Test |
60 | public void saveMultipleTypeAndFetch() throws Exception { | 60 | public void saveMultipleTypeAndFetch() throws Exception { |
61 | - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); | 61 | + DeviceId deviceId = new DeviceId(Uuids.timeBased()); |
62 | KvEntry attrOldValue = new StringDataEntry("attribute1", "value1"); | 62 | KvEntry attrOldValue = new StringDataEntry("attribute1", "value1"); |
63 | AttributeKvEntry attrOld = new BaseAttributeKvEntry(attrOldValue, 42L); | 63 | AttributeKvEntry attrOld = new BaseAttributeKvEntry(attrOldValue, 42L); |
64 | 64 | ||
@@ -78,7 +78,7 @@ public abstract class BaseAttributesServiceTest extends AbstractServiceTest { | @@ -78,7 +78,7 @@ public abstract class BaseAttributesServiceTest extends AbstractServiceTest { | ||
78 | 78 | ||
79 | @Test | 79 | @Test |
80 | public void findAll() throws Exception { | 80 | public void findAll() throws Exception { |
81 | - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); | 81 | + DeviceId deviceId = new DeviceId(Uuids.timeBased()); |
82 | 82 | ||
83 | KvEntry attrAOldValue = new StringDataEntry("A", "value1"); | 83 | KvEntry attrAOldValue = new StringDataEntry("A", "value1"); |
84 | AttributeKvEntry attrAOld = new BaseAttributeKvEntry(attrAOldValue, 42L); | 84 | AttributeKvEntry attrAOld = new BaseAttributeKvEntry(attrAOldValue, 42L); |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.service.event; | 16 | package org.thingsboard.server.dao.service.event; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import org.junit.Assert; | 19 | import org.junit.Assert; |
20 | import org.junit.Test; | 20 | import org.junit.Test; |
21 | import org.thingsboard.server.common.data.DataConstants; | 21 | import org.thingsboard.server.common.data.DataConstants; |
@@ -40,8 +40,8 @@ public abstract class BaseEventServiceTest extends AbstractServiceTest { | @@ -40,8 +40,8 @@ public abstract class BaseEventServiceTest extends AbstractServiceTest { | ||
40 | 40 | ||
41 | @Test | 41 | @Test |
42 | public void saveEvent() throws Exception { | 42 | public void saveEvent() throws Exception { |
43 | - DeviceId devId = new DeviceId(UUIDs.timeBased()); | ||
44 | - Event event = generateEvent(null, devId, "ALARM", UUIDs.timeBased().toString()); | 43 | + DeviceId devId = new DeviceId(Uuids.timeBased()); |
44 | + Event event = generateEvent(null, devId, "ALARM", Uuids.timeBased().toString()); | ||
45 | Event saved = eventService.save(event); | 45 | Event saved = eventService.save(event); |
46 | Optional<Event> loaded = eventService.findEvent(event.getTenantId(), event.getEntityId(), event.getType(), event.getUid()); | 46 | Optional<Event> loaded = eventService.findEvent(event.getTenantId(), event.getEntityId(), event.getType(), event.getUid()); |
47 | Assert.assertTrue(loaded.isPresent()); | 47 | Assert.assertTrue(loaded.isPresent()); |
@@ -51,8 +51,8 @@ public abstract class BaseEventServiceTest extends AbstractServiceTest { | @@ -51,8 +51,8 @@ public abstract class BaseEventServiceTest extends AbstractServiceTest { | ||
51 | 51 | ||
52 | @Test | 52 | @Test |
53 | public void saveEventIfNotExists() throws Exception { | 53 | public void saveEventIfNotExists() throws Exception { |
54 | - DeviceId devId = new DeviceId(UUIDs.timeBased()); | ||
55 | - Event event = generateEvent(null, devId, "ALARM", UUIDs.timeBased().toString()); | 54 | + DeviceId devId = new DeviceId(Uuids.timeBased()); |
55 | + Event event = generateEvent(null, devId, "ALARM", Uuids.timeBased().toString()); | ||
56 | Optional<Event> saved = eventService.saveIfNotExists(event); | 56 | Optional<Event> saved = eventService.saveIfNotExists(event); |
57 | Assert.assertTrue(saved.isPresent()); | 57 | Assert.assertTrue(saved.isPresent()); |
58 | saved = eventService.saveIfNotExists(event); | 58 | saved = eventService.saveIfNotExists(event); |
@@ -67,8 +67,8 @@ public abstract class BaseEventServiceTest extends AbstractServiceTest { | @@ -67,8 +67,8 @@ public abstract class BaseEventServiceTest extends AbstractServiceTest { | ||
67 | long endTime = LocalDateTime.of(2016, Month.NOVEMBER, 1, 13, 0).toEpochSecond(ZoneOffset.UTC); | 67 | long endTime = LocalDateTime.of(2016, Month.NOVEMBER, 1, 13, 0).toEpochSecond(ZoneOffset.UTC); |
68 | long timeAfterEndTime = LocalDateTime.of(2016, Month.NOVEMBER, 1, 13, 30).toEpochSecond(ZoneOffset.UTC); | 68 | long timeAfterEndTime = LocalDateTime.of(2016, Month.NOVEMBER, 1, 13, 30).toEpochSecond(ZoneOffset.UTC); |
69 | 69 | ||
70 | - CustomerId customerId = new CustomerId(UUIDs.timeBased()); | ||
71 | - TenantId tenantId = new TenantId(UUIDs.timeBased()); | 70 | + CustomerId customerId = new CustomerId(Uuids.timeBased()); |
71 | + TenantId tenantId = new TenantId(Uuids.timeBased()); | ||
72 | saveEventWithProvidedTime(timeBeforeStartTime, customerId, tenantId); | 72 | saveEventWithProvidedTime(timeBeforeStartTime, customerId, tenantId); |
73 | Event savedEvent = saveEventWithProvidedTime(eventTime, customerId, tenantId); | 73 | Event savedEvent = saveEventWithProvidedTime(eventTime, customerId, tenantId); |
74 | Event savedEvent2 = saveEventWithProvidedTime(eventTime+1, customerId, tenantId); | 74 | Event savedEvent2 = saveEventWithProvidedTime(eventTime+1, customerId, tenantId); |
@@ -102,8 +102,8 @@ public abstract class BaseEventServiceTest extends AbstractServiceTest { | @@ -102,8 +102,8 @@ public abstract class BaseEventServiceTest extends AbstractServiceTest { | ||
102 | long endTime = LocalDateTime.of(2016, Month.NOVEMBER, 1, 13, 0).toEpochSecond(ZoneOffset.UTC); | 102 | long endTime = LocalDateTime.of(2016, Month.NOVEMBER, 1, 13, 0).toEpochSecond(ZoneOffset.UTC); |
103 | long timeAfterEndTime = LocalDateTime.of(2016, Month.NOVEMBER, 1, 13, 30).toEpochSecond(ZoneOffset.UTC); | 103 | long timeAfterEndTime = LocalDateTime.of(2016, Month.NOVEMBER, 1, 13, 30).toEpochSecond(ZoneOffset.UTC); |
104 | 104 | ||
105 | - CustomerId customerId = new CustomerId(UUIDs.timeBased()); | ||
106 | - TenantId tenantId = new TenantId(UUIDs.timeBased()); | 105 | + CustomerId customerId = new CustomerId(Uuids.timeBased()); |
106 | + TenantId tenantId = new TenantId(Uuids.timeBased()); | ||
107 | saveEventWithProvidedTime(timeBeforeStartTime, customerId, tenantId); | 107 | saveEventWithProvidedTime(timeBeforeStartTime, customerId, tenantId); |
108 | Event savedEvent = saveEventWithProvidedTime(eventTime, customerId, tenantId); | 108 | Event savedEvent = saveEventWithProvidedTime(eventTime, customerId, tenantId); |
109 | Event savedEvent2 = saveEventWithProvidedTime(eventTime+1, customerId, tenantId); | 109 | Event savedEvent2 = saveEventWithProvidedTime(eventTime+1, customerId, tenantId); |
@@ -131,7 +131,7 @@ public abstract class BaseEventServiceTest extends AbstractServiceTest { | @@ -131,7 +131,7 @@ public abstract class BaseEventServiceTest extends AbstractServiceTest { | ||
131 | 131 | ||
132 | private Event saveEventWithProvidedTime(long time, EntityId entityId, TenantId tenantId) throws IOException { | 132 | private Event saveEventWithProvidedTime(long time, EntityId entityId, TenantId tenantId) throws IOException { |
133 | Event event = generateEvent(tenantId, entityId, DataConstants.STATS, null); | 133 | Event event = generateEvent(tenantId, entityId, DataConstants.STATS, null); |
134 | - event.setId(new EventId(UUIDs.startOf(time))); | 134 | + event.setId(new EventId(Uuids.startOf(time))); |
135 | return eventService.save(event); | 135 | return eventService.save(event); |
136 | } | 136 | } |
137 | -} | ||
137 | +} |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.service.timeseries; | 16 | package org.thingsboard.server.dao.service.timeseries; |
17 | 17 | ||
18 | -import com.datastax.driver.core.utils.UUIDs; | 18 | +import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | import lombok.extern.slf4j.Slf4j; | 19 | import lombok.extern.slf4j.Slf4j; |
20 | import org.junit.*; | 20 | import org.junit.*; |
21 | import org.thingsboard.server.common.data.EntityView; | 21 | import org.thingsboard.server.common.data.EntityView; |
@@ -84,7 +84,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | @@ -84,7 +84,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | ||
84 | 84 | ||
85 | @Test | 85 | @Test |
86 | public void testFindAllLatest() throws Exception { | 86 | public void testFindAllLatest() throws Exception { |
87 | - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); | 87 | + DeviceId deviceId = new DeviceId(Uuids.timeBased()); |
88 | 88 | ||
89 | saveEntries(deviceId, TS - 2); | 89 | saveEntries(deviceId, TS - 2); |
90 | saveEntries(deviceId, TS - 1); | 90 | saveEntries(deviceId, TS - 1); |
@@ -132,7 +132,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | @@ -132,7 +132,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | ||
132 | 132 | ||
133 | @Test | 133 | @Test |
134 | public void testFindLatest() throws Exception { | 134 | public void testFindLatest() throws Exception { |
135 | - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); | 135 | + DeviceId deviceId = new DeviceId(Uuids.timeBased()); |
136 | 136 | ||
137 | saveEntries(deviceId, TS - 2); | 137 | saveEntries(deviceId, TS - 2); |
138 | saveEntries(deviceId, TS - 1); | 138 | saveEntries(deviceId, TS - 1); |
@@ -151,7 +151,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | @@ -151,7 +151,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | ||
151 | 151 | ||
152 | @Test | 152 | @Test |
153 | public void testFindByQueryAscOrder() throws Exception { | 153 | public void testFindByQueryAscOrder() throws Exception { |
154 | - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); | 154 | + DeviceId deviceId = new DeviceId(Uuids.timeBased()); |
155 | 155 | ||
156 | saveEntries(deviceId, TS - 2); | 156 | saveEntries(deviceId, TS - 2); |
157 | saveEntries(deviceId, TS - 1); | 157 | saveEntries(deviceId, TS - 1); |
@@ -177,7 +177,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | @@ -177,7 +177,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | ||
177 | 177 | ||
178 | @Test | 178 | @Test |
179 | public void testFindByQueryDescOrder() throws Exception { | 179 | public void testFindByQueryDescOrder() throws Exception { |
180 | - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); | 180 | + DeviceId deviceId = new DeviceId(Uuids.timeBased()); |
181 | 181 | ||
182 | saveEntries(deviceId, TS - 2); | 182 | saveEntries(deviceId, TS - 2); |
183 | saveEntries(deviceId, TS - 1); | 183 | saveEntries(deviceId, TS - 1); |
@@ -203,7 +203,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | @@ -203,7 +203,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | ||
203 | 203 | ||
204 | @Test | 204 | @Test |
205 | public void testDeleteDeviceTsDataWithOverwritingLatest() throws Exception { | 205 | public void testDeleteDeviceTsDataWithOverwritingLatest() throws Exception { |
206 | - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); | 206 | + DeviceId deviceId = new DeviceId(Uuids.timeBased()); |
207 | 207 | ||
208 | saveEntries(deviceId, 10000); | 208 | saveEntries(deviceId, 10000); |
209 | saveEntries(deviceId, 20000); | 209 | saveEntries(deviceId, 20000); |
@@ -223,7 +223,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | @@ -223,7 +223,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | ||
223 | 223 | ||
224 | @Test | 224 | @Test |
225 | public void testFindDeviceTsData() throws Exception { | 225 | public void testFindDeviceTsData() throws Exception { |
226 | - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); | 226 | + DeviceId deviceId = new DeviceId(Uuids.timeBased()); |
227 | List<TsKvEntry> entries = new ArrayList<>(); | 227 | List<TsKvEntry> entries = new ArrayList<>(); |
228 | 228 | ||
229 | entries.add(save(deviceId, 5000, 100)); | 229 | entries.add(save(deviceId, 5000, 100)); |
@@ -374,7 +374,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | @@ -374,7 +374,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | ||
374 | 374 | ||
375 | @Test | 375 | @Test |
376 | public void testFindDeviceLongAndDoubleTsData() throws Exception { | 376 | public void testFindDeviceLongAndDoubleTsData() throws Exception { |
377 | - DeviceId deviceId = new DeviceId(UUIDs.timeBased()); | 377 | + DeviceId deviceId = new DeviceId(Uuids.timeBased()); |
378 | List<TsKvEntry> entries = new ArrayList<>(); | 378 | List<TsKvEntry> entries = new ArrayList<>(); |
379 | 379 | ||
380 | entries.add(save(deviceId, 5000, 100)); | 380 | entries.add(save(deviceId, 5000, 100)); |