Commit 188c3e5b636e981cc3534c74bd27fdaaf6173fcd
Committed by
GitHub
1 parent
aabc22d7
Upgrade Sql Ts & Timescale improvements (#2495)
* psql & timescale ts upgrade improved * fix typo * fix typo 2 * removed tenant_id from timescale db schema & upgade scipt logic
Showing
21 changed files
with
259 additions
and
376 deletions
@@ -14,33 +14,27 @@ | @@ -14,33 +14,27 @@ | ||
14 | -- limitations under the License. | 14 | -- limitations under the License. |
15 | -- | 15 | -- |
16 | 16 | ||
17 | --- select check_version(); | 17 | +-- call check_version(); |
18 | 18 | ||
19 | -CREATE OR REPLACE FUNCTION check_version() RETURNS boolean AS $$ | 19 | +CREATE OR REPLACE PROCEDURE check_version(INOUT valid_version boolean) LANGUAGE plpgsql AS $BODY$ |
20 | DECLARE | 20 | DECLARE |
21 | current_version integer; | 21 | current_version integer; |
22 | - valid_version boolean; | ||
23 | BEGIN | 22 | BEGIN |
24 | RAISE NOTICE 'Check the current installed PostgreSQL version...'; | 23 | RAISE NOTICE 'Check the current installed PostgreSQL version...'; |
25 | SELECT current_setting('server_version_num') INTO current_version; | 24 | SELECT current_setting('server_version_num') INTO current_version; |
26 | - IF current_version < 100000 THEN | ||
27 | - valid_version := FALSE; | ||
28 | - ELSE | ||
29 | - valid_version := TRUE; | ||
30 | - END IF; | ||
31 | - IF valid_version = FALSE THEN | ||
32 | - RAISE NOTICE 'Postgres version should be at least more than 10!'; | ||
33 | - ELSE | 25 | + IF current_version > 110000 THEN |
34 | RAISE NOTICE 'PostgreSQL version is valid!'; | 26 | RAISE NOTICE 'PostgreSQL version is valid!'; |
35 | RAISE NOTICE 'Schema update started...'; | 27 | RAISE NOTICE 'Schema update started...'; |
28 | + SELECT true INTO valid_version; | ||
29 | + ELSE | ||
30 | + RAISE NOTICE 'Postgres version should be at least more than 10!'; | ||
36 | END IF; | 31 | END IF; |
37 | - RETURN valid_version; | ||
38 | END; | 32 | END; |
39 | -$$ LANGUAGE 'plpgsql'; | 33 | +$BODY$; |
40 | 34 | ||
41 | --- select create_partition_ts_kv_table(); | 35 | +-- call create_partition_ts_kv_table(); |
42 | 36 | ||
43 | -CREATE OR REPLACE FUNCTION create_partition_ts_kv_table() RETURNS VOID AS $$ | 37 | +CREATE OR REPLACE PROCEDURE create_partition_ts_kv_table() LANGUAGE plpgsql AS $$ |
44 | 38 | ||
45 | BEGIN | 39 | BEGIN |
46 | ALTER TABLE ts_kv | 40 | ALTER TABLE ts_kv |
@@ -57,11 +51,11 @@ BEGIN | @@ -57,11 +51,11 @@ BEGIN | ||
57 | ALTER TABLE ts_kv | 51 | ALTER TABLE ts_kv |
58 | ALTER COLUMN key TYPE integer USING key::integer; | 52 | ALTER COLUMN key TYPE integer USING key::integer; |
59 | END; | 53 | END; |
60 | -$$ LANGUAGE 'plpgsql'; | 54 | +$$; |
61 | 55 | ||
62 | --- select create_new_ts_kv_latest_table(); | 56 | +-- call create_new_ts_kv_latest_table(); |
63 | 57 | ||
64 | -CREATE OR REPLACE FUNCTION create_new_ts_kv_latest_table() RETURNS VOID AS $$ | 58 | +CREATE OR REPLACE PROCEDURE create_new_ts_kv_latest_table() LANGUAGE plpgsql AS $$ |
65 | 59 | ||
66 | BEGIN | 60 | BEGIN |
67 | ALTER TABLE ts_kv_latest | 61 | ALTER TABLE ts_kv_latest |
@@ -81,13 +75,13 @@ BEGIN | @@ -81,13 +75,13 @@ BEGIN | ||
81 | ALTER TABLE ts_kv_latest | 75 | ALTER TABLE ts_kv_latest |
82 | ADD CONSTRAINT ts_kv_latest_pkey PRIMARY KEY (entity_id, key); | 76 | ADD CONSTRAINT ts_kv_latest_pkey PRIMARY KEY (entity_id, key); |
83 | END; | 77 | END; |
84 | -$$ LANGUAGE 'plpgsql'; | 78 | +$$; |
85 | 79 | ||
86 | 80 | ||
87 | --- select create_partitions(); | 81 | +-- call create_partitions(); |
82 | + | ||
83 | +CREATE OR REPLACE PROCEDURE create_partitions() LANGUAGE plpgsql AS $$ | ||
88 | 84 | ||
89 | -CREATE OR REPLACE FUNCTION create_partitions() RETURNS VOID AS | ||
90 | -$$ | ||
91 | DECLARE | 85 | DECLARE |
92 | partition_date varchar; | 86 | partition_date varchar; |
93 | from_ts bigint; | 87 | from_ts bigint; |
@@ -111,11 +105,11 @@ BEGIN | @@ -111,11 +105,11 @@ BEGIN | ||
111 | 105 | ||
112 | CLOSE key_cursor; | 106 | CLOSE key_cursor; |
113 | END; | 107 | END; |
114 | -$$ language 'plpgsql'; | 108 | +$$; |
115 | 109 | ||
116 | --- select create_ts_kv_dictionary_table(); | 110 | +-- call create_ts_kv_dictionary_table(); |
117 | 111 | ||
118 | -CREATE OR REPLACE FUNCTION create_ts_kv_dictionary_table() RETURNS VOID AS $$ | 112 | +CREATE OR REPLACE PROCEDURE create_ts_kv_dictionary_table() LANGUAGE plpgsql AS $$ |
119 | 113 | ||
120 | BEGIN | 114 | BEGIN |
121 | CREATE TABLE IF NOT EXISTS ts_kv_dictionary | 115 | CREATE TABLE IF NOT EXISTS ts_kv_dictionary |
@@ -125,12 +119,12 @@ BEGIN | @@ -125,12 +119,12 @@ BEGIN | ||
125 | CONSTRAINT ts_key_id_pkey PRIMARY KEY (key) | 119 | CONSTRAINT ts_key_id_pkey PRIMARY KEY (key) |
126 | ); | 120 | ); |
127 | END; | 121 | END; |
128 | -$$ LANGUAGE 'plpgsql'; | 122 | +$$; |
123 | + | ||
124 | +-- call insert_into_dictionary(); | ||
129 | 125 | ||
130 | --- select insert_into_dictionary(); | 126 | +CREATE OR REPLACE PROCEDURE insert_into_dictionary() LANGUAGE plpgsql AS $$ |
131 | 127 | ||
132 | -CREATE OR REPLACE FUNCTION insert_into_dictionary() RETURNS VOID AS | ||
133 | -$$ | ||
134 | DECLARE | 128 | DECLARE |
135 | insert_record RECORD; | 129 | insert_record RECORD; |
136 | key_cursor CURSOR FOR SELECT DISTINCT key | 130 | key_cursor CURSOR FOR SELECT DISTINCT key |
@@ -150,28 +144,27 @@ BEGIN | @@ -150,28 +144,27 @@ BEGIN | ||
150 | END LOOP; | 144 | END LOOP; |
151 | CLOSE key_cursor; | 145 | CLOSE key_cursor; |
152 | END; | 146 | END; |
153 | -$$ language 'plpgsql'; | 147 | +$$; |
154 | 148 | ||
155 | --- select insert_into_ts_kv(); | 149 | +-- call insert_into_ts_kv(); |
156 | 150 | ||
157 | -CREATE OR REPLACE FUNCTION insert_into_ts_kv() RETURNS void AS | ||
158 | -$$ | 151 | +CREATE OR REPLACE PROCEDURE insert_into_ts_kv() LANGUAGE plpgsql AS $$ |
159 | DECLARE | 152 | DECLARE |
160 | insert_size CONSTANT integer := 10000; | 153 | insert_size CONSTANT integer := 10000; |
161 | insert_counter integer DEFAULT 0; | 154 | insert_counter integer DEFAULT 0; |
162 | insert_record RECORD; | 155 | insert_record RECORD; |
163 | - insert_cursor CURSOR FOR SELECT CONCAT(first_part_uuid, '-', second_part_uuid, '-1', third_part_uuid, '-', fourth_part_uuid, '-', fifth_part_uuid)::uuid AS entity_id, | 156 | + 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, |
164 | ts_kv_records.key AS key, | 157 | ts_kv_records.key AS key, |
165 | ts_kv_records.ts AS ts, | 158 | ts_kv_records.ts AS ts, |
166 | ts_kv_records.bool_v AS bool_v, | 159 | ts_kv_records.bool_v AS bool_v, |
167 | ts_kv_records.str_v AS str_v, | 160 | ts_kv_records.str_v AS str_v, |
168 | ts_kv_records.long_v AS long_v, | 161 | ts_kv_records.long_v AS long_v, |
169 | ts_kv_records.dbl_v AS dbl_v | 162 | ts_kv_records.dbl_v AS dbl_v |
170 | - FROM (SELECT SUBSTRING(entity_id, 8, 8) AS first_part_uuid, | ||
171 | - SUBSTRING(entity_id, 4, 4) AS second_part_uuid, | ||
172 | - SUBSTRING(entity_id, 1, 3) AS third_part_uuid, | ||
173 | - SUBSTRING(entity_id, 16, 4) AS fourth_part_uuid, | ||
174 | - SUBSTRING(entity_id, 20) AS fifth_part_uuid, | 163 | + FROM (SELECT SUBSTRING(entity_id, 8, 8) AS entity_id_uuid_first_part, |
164 | + SUBSTRING(entity_id, 4, 4) AS entity_id_uuid_second_part, | ||
165 | + SUBSTRING(entity_id, 1, 3) AS entity_id_uuid_third_part, | ||
166 | + SUBSTRING(entity_id, 16, 4) AS entity_id_uuid_fourth_part, | ||
167 | + SUBSTRING(entity_id, 20) AS entity_id_uuid_fifth_part, | ||
175 | key_id AS key, | 168 | key_id AS key, |
176 | ts, | 169 | ts, |
177 | bool_v, | 170 | bool_v, |
@@ -198,28 +191,27 @@ BEGIN | @@ -198,28 +191,27 @@ BEGIN | ||
198 | END LOOP; | 191 | END LOOP; |
199 | CLOSE insert_cursor; | 192 | CLOSE insert_cursor; |
200 | END; | 193 | END; |
201 | -$$ LANGUAGE 'plpgsql'; | 194 | +$$; |
202 | 195 | ||
203 | --- select insert_into_ts_kv_latest(); | 196 | +-- call insert_into_ts_kv_latest(); |
204 | 197 | ||
205 | -CREATE OR REPLACE FUNCTION insert_into_ts_kv_latest() RETURNS void AS | ||
206 | -$$ | 198 | +CREATE OR REPLACE PROCEDURE insert_into_ts_kv_latest() LANGUAGE plpgsql AS $$ |
207 | DECLARE | 199 | DECLARE |
208 | insert_size CONSTANT integer := 10000; | 200 | insert_size CONSTANT integer := 10000; |
209 | insert_counter integer DEFAULT 0; | 201 | insert_counter integer DEFAULT 0; |
210 | insert_record RECORD; | 202 | insert_record RECORD; |
211 | - insert_cursor CURSOR FOR SELECT CONCAT(first_part_uuid, '-', second_part_uuid, '-1', third_part_uuid, '-', fourth_part_uuid, '-', fifth_part_uuid)::uuid AS entity_id, | 203 | + 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, |
212 | ts_kv_latest_records.key AS key, | 204 | ts_kv_latest_records.key AS key, |
213 | ts_kv_latest_records.ts AS ts, | 205 | ts_kv_latest_records.ts AS ts, |
214 | ts_kv_latest_records.bool_v AS bool_v, | 206 | ts_kv_latest_records.bool_v AS bool_v, |
215 | ts_kv_latest_records.str_v AS str_v, | 207 | ts_kv_latest_records.str_v AS str_v, |
216 | ts_kv_latest_records.long_v AS long_v, | 208 | ts_kv_latest_records.long_v AS long_v, |
217 | ts_kv_latest_records.dbl_v AS dbl_v | 209 | ts_kv_latest_records.dbl_v AS dbl_v |
218 | - FROM (SELECT SUBSTRING(entity_id, 8, 8) AS first_part_uuid, | ||
219 | - SUBSTRING(entity_id, 4, 4) AS second_part_uuid, | ||
220 | - SUBSTRING(entity_id, 1, 3) AS third_part_uuid, | ||
221 | - SUBSTRING(entity_id, 16, 4) AS fourth_part_uuid, | ||
222 | - SUBSTRING(entity_id, 20) AS fifth_part_uuid, | 210 | + FROM (SELECT SUBSTRING(entity_id, 8, 8) AS entity_id_uuid_first_part, |
211 | + SUBSTRING(entity_id, 4, 4) AS entity_id_uuid_second_part, | ||
212 | + SUBSTRING(entity_id, 1, 3) AS entity_id_uuid_third_part, | ||
213 | + SUBSTRING(entity_id, 16, 4) AS entity_id_uuid_fourth_part, | ||
214 | + SUBSTRING(entity_id, 20) AS entity_id_uuid_fifth_part, | ||
223 | key_id AS key, | 215 | key_id AS key, |
224 | ts, | 216 | ts, |
225 | bool_v, | 217 | bool_v, |
@@ -246,6 +238,6 @@ BEGIN | @@ -246,6 +238,6 @@ BEGIN | ||
246 | END LOOP; | 238 | END LOOP; |
247 | CLOSE insert_cursor; | 239 | CLOSE insert_cursor; |
248 | END; | 240 | END; |
249 | -$$ LANGUAGE 'plpgsql'; | 241 | +$$; |
250 | 242 | ||
251 | 243 |
@@ -14,60 +14,51 @@ | @@ -14,60 +14,51 @@ | ||
14 | -- limitations under the License. | 14 | -- limitations under the License. |
15 | -- | 15 | -- |
16 | 16 | ||
17 | --- select check_version(); | 17 | +-- call check_version(); |
18 | + | ||
19 | +CREATE OR REPLACE PROCEDURE check_version(INOUT valid_version boolean) LANGUAGE plpgsql AS $BODY$ | ||
18 | 20 | ||
19 | -CREATE OR REPLACE FUNCTION check_version() RETURNS boolean AS $$ | ||
20 | DECLARE | 21 | DECLARE |
21 | current_version integer; | 22 | current_version integer; |
22 | - valid_version boolean; | ||
23 | BEGIN | 23 | BEGIN |
24 | RAISE NOTICE 'Check the current installed PostgreSQL version...'; | 24 | RAISE NOTICE 'Check the current installed PostgreSQL version...'; |
25 | SELECT current_setting('server_version_num') INTO current_version; | 25 | SELECT current_setting('server_version_num') INTO current_version; |
26 | - IF current_version < 90600 THEN | ||
27 | - valid_version := FALSE; | ||
28 | - ELSE | ||
29 | - valid_version := TRUE; | ||
30 | - END IF; | ||
31 | - IF valid_version = FALSE THEN | ||
32 | - RAISE NOTICE 'Postgres version should be at least more than 9.6!'; | ||
33 | - ELSE | 26 | + IF current_version > 110000 THEN |
34 | RAISE NOTICE 'PostgreSQL version is valid!'; | 27 | RAISE NOTICE 'PostgreSQL version is valid!'; |
35 | RAISE NOTICE 'Schema update started...'; | 28 | RAISE NOTICE 'Schema update started...'; |
29 | + SELECT true INTO valid_version; | ||
30 | + ELSE | ||
31 | + RAISE NOTICE 'Postgres version should be at least more than 10!'; | ||
36 | END IF; | 32 | END IF; |
37 | - RETURN valid_version; | ||
38 | END; | 33 | END; |
39 | -$$ LANGUAGE 'plpgsql'; | 34 | +$BODY$; |
40 | 35 | ||
41 | --- select create_new_tenant_ts_kv_table(); | 36 | +-- call create_new_ts_kv_table(); |
42 | 37 | ||
43 | -CREATE OR REPLACE FUNCTION create_new_tenant_ts_kv_table() RETURNS VOID AS $$ | 38 | +CREATE OR REPLACE PROCEDURE create_new_ts_kv_table() LANGUAGE plpgsql AS $$ |
44 | 39 | ||
45 | BEGIN | 40 | BEGIN |
46 | ALTER TABLE tenant_ts_kv | 41 | ALTER TABLE tenant_ts_kv |
47 | RENAME TO tenant_ts_kv_old; | 42 | RENAME TO tenant_ts_kv_old; |
48 | - CREATE TABLE IF NOT EXISTS tenant_ts_kv | 43 | + CREATE TABLE IF NOT EXISTS ts_kv |
49 | ( | 44 | ( |
50 | LIKE tenant_ts_kv_old | 45 | LIKE tenant_ts_kv_old |
51 | ); | 46 | ); |
52 | - ALTER TABLE tenant_ts_kv | ||
53 | - ALTER COLUMN tenant_id TYPE uuid USING tenant_id::uuid; | ||
54 | - ALTER TABLE tenant_ts_kv | ||
55 | - ALTER COLUMN entity_id TYPE uuid USING entity_id::uuid; | ||
56 | - ALTER TABLE tenant_ts_kv | ||
57 | - ALTER COLUMN key TYPE integer USING key::integer; | ||
58 | - ALTER TABLE tenant_ts_kv | ||
59 | - ADD CONSTRAINT tenant_ts_kv_pkey PRIMARY KEY(tenant_id, entity_id, key, ts); | 47 | + ALTER TABLE ts_kv ALTER COLUMN entity_id TYPE uuid USING entity_id::uuid; |
48 | + ALTER TABLE ts_kv ALTER COLUMN key TYPE integer USING key::integer; | ||
49 | + ALTER INDEX ts_kv_pkey RENAME TO tenant_ts_kv_pkey_old; | ||
60 | ALTER INDEX idx_tenant_ts_kv RENAME TO idx_tenant_ts_kv_old; | 50 | ALTER INDEX idx_tenant_ts_kv RENAME TO idx_tenant_ts_kv_old; |
61 | ALTER INDEX tenant_ts_kv_ts_idx RENAME TO tenant_ts_kv_ts_idx_old; | 51 | ALTER INDEX tenant_ts_kv_ts_idx RENAME TO tenant_ts_kv_ts_idx_old; |
62 | --- PERFORM create_hypertable('tenant_ts_kv', 'ts', chunk_time_interval => 86400000, if_not_exists => true); | ||
63 | - CREATE INDEX IF NOT EXISTS idx_tenant_ts_kv ON tenant_ts_kv(tenant_id, entity_id, key, ts); | 52 | + ALTER TABLE ts_kv ADD CONSTRAINT ts_kv_pkey PRIMARY KEY(entity_id, key, ts); |
53 | +-- CREATE INDEX IF NOT EXISTS ts_kv_ts_idx ON ts_kv(ts DESC); | ||
54 | + ALTER TABLE ts_kv DROP COLUMN IF EXISTS tenant_id; | ||
64 | END; | 55 | END; |
65 | -$$ LANGUAGE 'plpgsql'; | 56 | +$$; |
66 | 57 | ||
67 | 58 | ||
68 | --- select create_ts_kv_latest_table(); | 59 | +-- call create_ts_kv_latest_table(); |
69 | 60 | ||
70 | -CREATE OR REPLACE FUNCTION create_ts_kv_latest_table() RETURNS VOID AS $$ | 61 | +CREATE OR REPLACE PROCEDURE create_ts_kv_latest_table() LANGUAGE plpgsql AS $$ |
71 | 62 | ||
72 | BEGIN | 63 | BEGIN |
73 | CREATE TABLE IF NOT EXISTS ts_kv_latest | 64 | CREATE TABLE IF NOT EXISTS ts_kv_latest |
@@ -82,12 +73,12 @@ BEGIN | @@ -82,12 +73,12 @@ BEGIN | ||
82 | CONSTRAINT ts_kv_latest_pkey PRIMARY KEY (entity_id, key) | 73 | CONSTRAINT ts_kv_latest_pkey PRIMARY KEY (entity_id, key) |
83 | ); | 74 | ); |
84 | END; | 75 | END; |
85 | -$$ LANGUAGE 'plpgsql'; | 76 | +$$; |
86 | 77 | ||
87 | 78 | ||
88 | --- select create_ts_kv_dictionary_table(); | 79 | +-- call create_ts_kv_dictionary_table(); |
89 | 80 | ||
90 | -CREATE OR REPLACE FUNCTION create_ts_kv_dictionary_table() RETURNS VOID AS $$ | 81 | +CREATE OR REPLACE PROCEDURE create_ts_kv_dictionary_table() LANGUAGE plpgsql AS $$ |
91 | 82 | ||
92 | BEGIN | 83 | BEGIN |
93 | CREATE TABLE IF NOT EXISTS ts_kv_dictionary | 84 | CREATE TABLE IF NOT EXISTS ts_kv_dictionary |
@@ -97,12 +88,12 @@ BEGIN | @@ -97,12 +88,12 @@ BEGIN | ||
97 | CONSTRAINT ts_key_id_pkey PRIMARY KEY (key) | 88 | CONSTRAINT ts_key_id_pkey PRIMARY KEY (key) |
98 | ); | 89 | ); |
99 | END; | 90 | END; |
100 | -$$ LANGUAGE 'plpgsql'; | 91 | +$$; |
101 | 92 | ||
102 | --- select insert_into_dictionary(); | 93 | +-- call insert_into_dictionary(); |
94 | + | ||
95 | +CREATE OR REPLACE PROCEDURE insert_into_dictionary() LANGUAGE plpgsql AS $$ | ||
103 | 96 | ||
104 | -CREATE OR REPLACE FUNCTION insert_into_dictionary() RETURNS VOID AS | ||
105 | -$$ | ||
106 | DECLARE | 97 | DECLARE |
107 | insert_record RECORD; | 98 | insert_record RECORD; |
108 | key_cursor CURSOR FOR SELECT DISTINCT key | 99 | key_cursor CURSOR FOR SELECT DISTINCT key |
@@ -122,34 +113,28 @@ BEGIN | @@ -122,34 +113,28 @@ BEGIN | ||
122 | END LOOP; | 113 | END LOOP; |
123 | CLOSE key_cursor; | 114 | CLOSE key_cursor; |
124 | END; | 115 | END; |
125 | -$$ language 'plpgsql'; | 116 | +$$; |
117 | + | ||
118 | +-- call insert_into_ts_kv(); | ||
126 | 119 | ||
127 | --- select insert_into_tenant_ts_kv(); | 120 | +CREATE OR REPLACE PROCEDURE insert_into_ts_kv() LANGUAGE plpgsql AS $$ |
128 | 121 | ||
129 | -CREATE OR REPLACE FUNCTION insert_into_tenant_ts_kv() RETURNS void AS | ||
130 | -$$ | ||
131 | DECLARE | 122 | DECLARE |
132 | insert_size CONSTANT integer := 10000; | 123 | insert_size CONSTANT integer := 10000; |
133 | insert_counter integer DEFAULT 0; | 124 | insert_counter integer DEFAULT 0; |
134 | insert_record RECORD; | 125 | insert_record RECORD; |
135 | - insert_cursor CURSOR FOR SELECT CONCAT(tenant_id_first_part_uuid, '-', tenant_id_second_part_uuid, '-1', tenant_id_third_part_uuid, '-', tenant_id_fourth_part_uuid, '-', tenant_id_fifth_part_uuid)::uuid AS tenant_id, | ||
136 | - CONCAT(entity_id_first_part_uuid, '-', entity_id_second_part_uuid, '-1', entity_id_third_part_uuid, '-', entity_id_fourth_part_uuid, '-', entity_id_fifth_part_uuid)::uuid AS entity_id, | ||
137 | - tenant_ts_kv_records.key AS key, | ||
138 | - tenant_ts_kv_records.ts AS ts, | ||
139 | - tenant_ts_kv_records.bool_v AS bool_v, | ||
140 | - tenant_ts_kv_records.str_v AS str_v, | ||
141 | - tenant_ts_kv_records.long_v AS long_v, | ||
142 | - tenant_ts_kv_records.dbl_v AS dbl_v | ||
143 | - FROM (SELECT SUBSTRING(tenant_id, 8, 8) AS tenant_id_first_part_uuid, | ||
144 | - SUBSTRING(tenant_id, 4, 4) AS tenant_id_second_part_uuid, | ||
145 | - SUBSTRING(tenant_id, 1, 3) AS tenant_id_third_part_uuid, | ||
146 | - SUBSTRING(tenant_id, 16, 4) AS tenant_id_fourth_part_uuid, | ||
147 | - SUBSTRING(tenant_id, 20) AS tenant_id_fifth_part_uuid, | ||
148 | - SUBSTRING(entity_id, 8, 8) AS entity_id_first_part_uuid, | ||
149 | - SUBSTRING(entity_id, 4, 4) AS entity_id_second_part_uuid, | ||
150 | - SUBSTRING(entity_id, 1, 3) AS entity_id_third_part_uuid, | ||
151 | - SUBSTRING(entity_id, 16, 4) AS entity_id_fourth_part_uuid, | ||
152 | - SUBSTRING(entity_id, 20) AS entity_id_fifth_part_uuid, | 126 | + 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, |
127 | + new_ts_kv_records.key AS key, | ||
128 | + new_ts_kv_records.ts AS ts, | ||
129 | + new_ts_kv_records.bool_v AS bool_v, | ||
130 | + new_ts_kv_records.str_v AS str_v, | ||
131 | + new_ts_kv_records.long_v AS long_v, | ||
132 | + new_ts_kv_records.dbl_v AS dbl_v | ||
133 | + FROM (SELECT SUBSTRING(entity_id, 8, 8) AS entity_id_uuid_first_part, | ||
134 | + SUBSTRING(entity_id, 4, 4) AS entity_id_uuid_second_part, | ||
135 | + SUBSTRING(entity_id, 1, 3) AS entity_id_uuid_third_part, | ||
136 | + SUBSTRING(entity_id, 16, 4) AS entity_id_uuid_fourth_part, | ||
137 | + SUBSTRING(entity_id, 20) AS entity_id_uuid_fifth_part, | ||
153 | key_id AS key, | 138 | key_id AS key, |
154 | ts, | 139 | ts, |
155 | bool_v, | 140 | bool_v, |
@@ -157,31 +142,31 @@ DECLARE | @@ -157,31 +142,31 @@ DECLARE | ||
157 | long_v, | 142 | long_v, |
158 | dbl_v | 143 | dbl_v |
159 | FROM tenant_ts_kv_old | 144 | FROM tenant_ts_kv_old |
160 | - INNER JOIN ts_kv_dictionary ON (tenant_ts_kv_old.key = ts_kv_dictionary.key)) AS tenant_ts_kv_records; | 145 | + INNER JOIN ts_kv_dictionary ON (tenant_ts_kv_old.key = ts_kv_dictionary.key)) AS new_ts_kv_records; |
161 | BEGIN | 146 | BEGIN |
162 | OPEN insert_cursor; | 147 | OPEN insert_cursor; |
163 | LOOP | 148 | LOOP |
164 | insert_counter := insert_counter + 1; | 149 | insert_counter := insert_counter + 1; |
165 | FETCH insert_cursor INTO insert_record; | 150 | FETCH insert_cursor INTO insert_record; |
166 | IF NOT FOUND THEN | 151 | IF NOT FOUND THEN |
167 | - RAISE NOTICE '% records have been inserted into the new tenant_ts_kv table!',insert_counter - 1; | 152 | + RAISE NOTICE '% records have been inserted into the new ts_kv table!',insert_counter - 1; |
168 | EXIT; | 153 | EXIT; |
169 | END IF; | 154 | END IF; |
170 | - INSERT INTO tenant_ts_kv(tenant_id, entity_id, key, ts, bool_v, str_v, long_v, dbl_v) | ||
171 | - VALUES (insert_record.tenant_id, insert_record.entity_id, insert_record.key, insert_record.ts, insert_record.bool_v, insert_record.str_v, | 155 | + INSERT INTO ts_kv(entity_id, key, ts, bool_v, str_v, long_v, dbl_v) |
156 | + VALUES (insert_record.entity_id, insert_record.key, insert_record.ts, insert_record.bool_v, insert_record.str_v, | ||
172 | insert_record.long_v, insert_record.dbl_v); | 157 | insert_record.long_v, insert_record.dbl_v); |
173 | IF MOD(insert_counter, insert_size) = 0 THEN | 158 | IF MOD(insert_counter, insert_size) = 0 THEN |
174 | - RAISE NOTICE '% records have been inserted into the new tenant_ts_kv table!',insert_counter; | 159 | + RAISE NOTICE '% records have been inserted into the new ts_kv table!',insert_counter; |
175 | END IF; | 160 | END IF; |
176 | END LOOP; | 161 | END LOOP; |
177 | CLOSE insert_cursor; | 162 | CLOSE insert_cursor; |
178 | END; | 163 | END; |
179 | -$$ LANGUAGE 'plpgsql'; | 164 | +$$; |
165 | + | ||
166 | +-- call insert_into_ts_kv_latest(); | ||
180 | 167 | ||
181 | --- select insert_into_ts_kv_latest(); | 168 | +CREATE OR REPLACE PROCEDURE insert_into_ts_kv_latest() LANGUAGE plpgsql AS $$ |
182 | 169 | ||
183 | -CREATE OR REPLACE FUNCTION insert_into_ts_kv_latest() RETURNS void AS | ||
184 | -$$ | ||
185 | DECLARE | 170 | DECLARE |
186 | insert_size CONSTANT integer := 10000; | 171 | insert_size CONSTANT integer := 10000; |
187 | insert_counter integer DEFAULT 0; | 172 | insert_counter integer DEFAULT 0; |
@@ -191,7 +176,7 @@ DECLARE | @@ -191,7 +176,7 @@ DECLARE | ||
191 | latest_records.key AS key, | 176 | latest_records.key AS key, |
192 | latest_records.entity_id AS entity_id, | 177 | latest_records.entity_id AS entity_id, |
193 | latest_records.ts AS ts | 178 | latest_records.ts AS ts |
194 | - FROM (SELECT DISTINCT key AS key, entity_id AS entity_id, MAX(ts) AS ts FROM tenant_ts_kv GROUP BY key, entity_id) AS latest_records; | 179 | + FROM (SELECT DISTINCT key AS key, entity_id AS entity_id, MAX(ts) AS ts FROM ts_kv GROUP BY key, entity_id) AS latest_records; |
195 | BEGIN | 180 | BEGIN |
196 | OPEN insert_cursor; | 181 | OPEN insert_cursor; |
197 | LOOP | 182 | LOOP |
@@ -201,7 +186,7 @@ BEGIN | @@ -201,7 +186,7 @@ BEGIN | ||
201 | RAISE NOTICE '% records have been inserted into the ts_kv_latest table!',insert_counter - 1; | 186 | RAISE NOTICE '% records have been inserted into the ts_kv_latest table!',insert_counter - 1; |
202 | EXIT; | 187 | EXIT; |
203 | END IF; | 188 | END IF; |
204 | - SELECT entity_id AS entity_id, key AS key, ts AS ts, bool_v AS bool_v, str_v AS str_v, long_v AS long_v, dbl_v AS dbl_v INTO insert_record FROM tenant_ts_kv WHERE entity_id = latest_record.entity_id AND key = latest_record.key AND ts = latest_record.ts; | 189 | + SELECT entity_id AS entity_id, key AS key, ts AS ts, bool_v AS bool_v, str_v AS str_v, long_v AS long_v, dbl_v AS dbl_v INTO insert_record FROM ts_kv WHERE entity_id = latest_record.entity_id AND key = latest_record.key AND ts = latest_record.ts; |
205 | INSERT INTO ts_kv_latest(entity_id, key, ts, bool_v, str_v, long_v, dbl_v) | 190 | INSERT INTO ts_kv_latest(entity_id, key, ts, bool_v, str_v, long_v, dbl_v) |
206 | VALUES (insert_record.entity_id, insert_record.key, insert_record.ts, insert_record.bool_v, insert_record.str_v, insert_record.long_v, insert_record.dbl_v); | 191 | VALUES (insert_record.entity_id, insert_record.key, insert_record.ts, insert_record.bool_v, insert_record.str_v, insert_record.long_v, insert_record.dbl_v); |
207 | IF MOD(insert_counter, insert_size) = 0 THEN | 192 | IF MOD(insert_counter, insert_size) = 0 THEN |
@@ -210,4 +195,4 @@ BEGIN | @@ -210,4 +195,4 @@ BEGIN | ||
210 | END LOOP; | 195 | END LOOP; |
211 | CLOSE insert_cursor; | 196 | CLOSE insert_cursor; |
212 | END; | 197 | END; |
213 | -$$ LANGUAGE 'plpgsql'; | 198 | +$$; |
@@ -22,38 +22,21 @@ import org.springframework.beans.factory.annotation.Value; | @@ -22,38 +22,21 @@ import org.springframework.beans.factory.annotation.Value; | ||
22 | import java.nio.charset.StandardCharsets; | 22 | import java.nio.charset.StandardCharsets; |
23 | import java.nio.file.Files; | 23 | import java.nio.file.Files; |
24 | import java.nio.file.Path; | 24 | import java.nio.file.Path; |
25 | -import java.sql.CallableStatement; | ||
26 | import java.sql.Connection; | 25 | import java.sql.Connection; |
26 | +import java.sql.ResultSet; | ||
27 | import java.sql.SQLException; | 27 | import java.sql.SQLException; |
28 | import java.sql.SQLWarning; | 28 | import java.sql.SQLWarning; |
29 | -import java.sql.Types; | 29 | +import java.sql.Statement; |
30 | 30 | ||
31 | @Slf4j | 31 | @Slf4j |
32 | public abstract class AbstractSqlTsDatabaseUpgradeService { | 32 | public abstract class AbstractSqlTsDatabaseUpgradeService { |
33 | 33 | ||
34 | protected static final String CALL_REGEX = "call "; | 34 | protected static final String CALL_REGEX = "call "; |
35 | - protected static final String CHECK_VERSION = "check_version()"; | 35 | + protected static final String CHECK_VERSION = "check_version(false)"; |
36 | + protected static final String CHECK_VERSION_TO_DELETE = "check_version(INOUT valid_version boolean)"; | ||
36 | protected static final String DROP_TABLE = "DROP TABLE "; | 37 | protected static final String DROP_TABLE = "DROP TABLE "; |
37 | - protected static final String DROP_FUNCTION_IF_EXISTS = "DROP FUNCTION IF EXISTS "; | ||
38 | - | ||
39 | - private static final String CALL_CHECK_VERSION = CALL_REGEX + CHECK_VERSION; | ||
40 | - | ||
41 | - | ||
42 | - private static final String FUNCTION = "function: {}"; | ||
43 | - private static final String DROP_STATEMENT = "drop statement: {}"; | ||
44 | - private static final String QUERY = "query: {}"; | ||
45 | - private static final String SUCCESSFULLY_EXECUTED = "Successfully executed "; | ||
46 | - private static final String FAILED_TO_EXECUTE = "Failed to execute "; | ||
47 | - private static final String FAILED_DUE_TO = " due to: {}"; | ||
48 | - | ||
49 | - protected static final String SUCCESSFULLY_EXECUTED_FUNCTION = SUCCESSFULLY_EXECUTED + FUNCTION; | ||
50 | - protected static final String FAILED_TO_EXECUTE_FUNCTION_DUE_TO = FAILED_TO_EXECUTE + FUNCTION + FAILED_DUE_TO; | ||
51 | - | ||
52 | - protected static final String SUCCESSFULLY_EXECUTED_DROP_STATEMENT = SUCCESSFULLY_EXECUTED + DROP_STATEMENT; | ||
53 | - protected static final String FAILED_TO_EXECUTE_DROP_STATEMENT = FAILED_TO_EXECUTE + DROP_STATEMENT + FAILED_DUE_TO; | ||
54 | - | ||
55 | - protected static final String SUCCESSFULLY_EXECUTED_QUERY = SUCCESSFULLY_EXECUTED + QUERY; | ||
56 | - protected static final String FAILED_TO_EXECUTE_QUERY = FAILED_TO_EXECUTE + QUERY + FAILED_DUE_TO; | 38 | + protected static final String DROP_PROCEDURE_IF_EXISTS = "DROP PROCEDURE IF EXISTS "; |
39 | + protected static final String DROP_PROCEDURE_CHECK_VERSION = DROP_PROCEDURE_IF_EXISTS + CHECK_VERSION_TO_DELETE; | ||
57 | 40 | ||
58 | @Value("${spring.datasource.url}") | 41 | @Value("${spring.datasource.url}") |
59 | protected String dbUrl; | 42 | protected String dbUrl; |
@@ -78,23 +61,22 @@ public abstract class AbstractSqlTsDatabaseUpgradeService { | @@ -78,23 +61,22 @@ public abstract class AbstractSqlTsDatabaseUpgradeService { | ||
78 | log.info("Check the current PostgreSQL version..."); | 61 | log.info("Check the current PostgreSQL version..."); |
79 | boolean versionValid = false; | 62 | boolean versionValid = false; |
80 | try { | 63 | try { |
81 | - CallableStatement callableStatement = conn.prepareCall("{? = " + CALL_CHECK_VERSION + " }"); | ||
82 | - callableStatement.registerOutParameter(1, Types.BOOLEAN); | ||
83 | - callableStatement.execute(); | ||
84 | - versionValid = callableStatement.getBoolean(1); | ||
85 | - callableStatement.close(); | 64 | + Statement statement = conn.createStatement(); |
65 | + ResultSet resultSet = statement.executeQuery(CALL_REGEX + CHECK_VERSION); | ||
66 | + resultSet.next(); | ||
67 | + versionValid = resultSet.getBoolean(1); | ||
68 | + statement.close(); | ||
86 | } catch (Exception e) { | 69 | } catch (Exception e) { |
87 | log.info("Failed to check current PostgreSQL version due to: {}", e.getMessage()); | 70 | log.info("Failed to check current PostgreSQL version due to: {}", e.getMessage()); |
88 | } | 71 | } |
89 | return versionValid; | 72 | return versionValid; |
90 | } | 73 | } |
91 | 74 | ||
92 | - protected void executeFunction(Connection conn, String query) { | ||
93 | - log.info("{} ... ", query); | 75 | + protected void executeQuery(Connection conn, String query) { |
94 | try { | 76 | try { |
95 | - CallableStatement callableStatement = conn.prepareCall("{" + query + "}"); | ||
96 | - callableStatement.execute(); | ||
97 | - SQLWarning warnings = callableStatement.getWarnings(); | 77 | + Statement statement = conn.createStatement(); |
78 | + statement.execute(query); //NOSONAR, ignoring because method used to execute thingsboard database upgrade script | ||
79 | + SQLWarning warnings = statement.getWarnings(); | ||
98 | if (warnings != null) { | 80 | if (warnings != null) { |
99 | log.info("{}", warnings.getMessage()); | 81 | log.info("{}", warnings.getMessage()); |
100 | SQLWarning nextWarning = warnings.getNextWarning(); | 82 | SQLWarning nextWarning = warnings.getNextWarning(); |
@@ -103,31 +85,10 @@ public abstract class AbstractSqlTsDatabaseUpgradeService { | @@ -103,31 +85,10 @@ public abstract class AbstractSqlTsDatabaseUpgradeService { | ||
103 | nextWarning = nextWarning.getNextWarning(); | 85 | nextWarning = nextWarning.getNextWarning(); |
104 | } | 86 | } |
105 | } | 87 | } |
106 | - callableStatement.close(); | ||
107 | - log.info(SUCCESSFULLY_EXECUTED_FUNCTION, query.replace(CALL_REGEX, "")); | ||
108 | - Thread.sleep(2000); | ||
109 | - } catch (Exception e) { | ||
110 | - log.info(FAILED_TO_EXECUTE_FUNCTION_DUE_TO, query, e.getMessage()); | ||
111 | - } | ||
112 | - } | ||
113 | - | ||
114 | - protected void executeDropStatement(Connection conn, String query) { | ||
115 | - try { | ||
116 | - conn.createStatement().execute(query); //NOSONAR, ignoring because method used to execute thingsboard database upgrade script | ||
117 | - log.info(SUCCESSFULLY_EXECUTED_DROP_STATEMENT, query); | ||
118 | - Thread.sleep(5000); | ||
119 | - } catch (InterruptedException | SQLException e) { | ||
120 | - log.info(FAILED_TO_EXECUTE_DROP_STATEMENT, query, e.getMessage()); | ||
121 | - } | ||
122 | - } | ||
123 | - | ||
124 | - protected void executeQuery(Connection conn, String query) { | ||
125 | - try { | ||
126 | - conn.createStatement().execute(query); //NOSONAR, ignoring because method used to execute thingsboard database upgrade script | ||
127 | - log.info(SUCCESSFULLY_EXECUTED_QUERY, query); | ||
128 | Thread.sleep(5000); | 88 | Thread.sleep(5000); |
89 | + log.info("Successfully executed query: {}", query); | ||
129 | } catch (InterruptedException | SQLException e) { | 90 | } catch (InterruptedException | SQLException e) { |
130 | - log.info(FAILED_TO_EXECUTE_QUERY, query, e.getMessage()); | 91 | + log.info("Failed to execute query: {} due to: {}", query, e.getMessage()); |
131 | } | 92 | } |
132 | } | 93 | } |
133 | 94 |
@@ -57,14 +57,13 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe | @@ -57,14 +57,13 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe | ||
57 | private static final String DROP_TABLE_TS_KV_OLD = DROP_TABLE + TS_KV_OLD; | 57 | private static final String DROP_TABLE_TS_KV_OLD = DROP_TABLE + TS_KV_OLD; |
58 | private static final String DROP_TABLE_TS_KV_LATEST_OLD = DROP_TABLE + TS_KV_LATEST_OLD; | 58 | private static final String DROP_TABLE_TS_KV_LATEST_OLD = DROP_TABLE + TS_KV_LATEST_OLD; |
59 | 59 | ||
60 | - private static final String DROP_FUNCTION_CHECK_VERSION = DROP_FUNCTION_IF_EXISTS + CHECK_VERSION; | ||
61 | - private static final String DROP_FUNCTION_CREATE_PARTITION_TS_KV_TABLE = DROP_FUNCTION_IF_EXISTS + CREATE_PARTITION_TS_KV_TABLE; | ||
62 | - private static final String DROP_FUNCTION_CREATE_NEW_TS_KV_LATEST_TABLE = DROP_FUNCTION_IF_EXISTS + CREATE_NEW_TS_KV_LATEST_TABLE; | ||
63 | - private static final String DROP_FUNCTION_CREATE_PARTITIONS = DROP_FUNCTION_IF_EXISTS + CREATE_PARTITIONS; | ||
64 | - private static final String DROP_FUNCTION_CREATE_TS_KV_DICTIONARY_TABLE = DROP_FUNCTION_IF_EXISTS + CREATE_TS_KV_DICTIONARY_TABLE; | ||
65 | - private static final String DROP_FUNCTION_INSERT_INTO_DICTIONARY = DROP_FUNCTION_IF_EXISTS + INSERT_INTO_DICTIONARY; | ||
66 | - private static final String DROP_FUNCTION_INSERT_INTO_TS_KV = DROP_FUNCTION_IF_EXISTS + INSERT_INTO_TS_KV; | ||
67 | - private static final String DROP_FUNCTION_INSERT_INTO_TS_KV_LATEST = DROP_FUNCTION_IF_EXISTS + INSERT_INTO_TS_KV_LATEST; | 60 | + private static final String DROP_PROCEDURE_CREATE_PARTITION_TS_KV_TABLE = DROP_PROCEDURE_IF_EXISTS + CREATE_PARTITION_TS_KV_TABLE; |
61 | + private static final String DROP_PROCEDURE_CREATE_NEW_TS_KV_LATEST_TABLE = DROP_PROCEDURE_IF_EXISTS + CREATE_NEW_TS_KV_LATEST_TABLE; | ||
62 | + private static final String DROP_PROCEDURE_CREATE_PARTITIONS = DROP_PROCEDURE_IF_EXISTS + CREATE_PARTITIONS; | ||
63 | + private static final String DROP_PROCEDURE_CREATE_TS_KV_DICTIONARY_TABLE = DROP_PROCEDURE_IF_EXISTS + CREATE_TS_KV_DICTIONARY_TABLE; | ||
64 | + private static final String DROP_PROCEDURE_INSERT_INTO_DICTIONARY = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_DICTIONARY; | ||
65 | + private static final String DROP_PROCEDURE_INSERT_INTO_TS_KV = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_TS_KV; | ||
66 | + private static final String DROP_PROCEDURE_INSERT_INTO_TS_KV_LATEST = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_TS_KV_LATEST; | ||
68 | 67 | ||
69 | @Override | 68 | @Override |
70 | public void upgradeDatabase(String fromVersion) throws Exception { | 69 | public void upgradeDatabase(String fromVersion) throws Exception { |
@@ -76,30 +75,30 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe | @@ -76,30 +75,30 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe | ||
76 | loadSql(conn); | 75 | loadSql(conn); |
77 | boolean versionValid = checkVersion(conn); | 76 | boolean versionValid = checkVersion(conn); |
78 | if (!versionValid) { | 77 | if (!versionValid) { |
79 | - log.info("PostgreSQL version should be at least more than 10!"); | 78 | + log.info("PostgreSQL version should be at least more than 11!"); |
80 | log.info("Please upgrade your PostgreSQL and restart the script!"); | 79 | log.info("Please upgrade your PostgreSQL and restart the script!"); |
81 | } else { | 80 | } else { |
82 | log.info("PostgreSQL version is valid!"); | 81 | log.info("PostgreSQL version is valid!"); |
83 | log.info("Updating schema ..."); | 82 | log.info("Updating schema ..."); |
84 | - executeFunction(conn, CALL_CREATE_PARTITION_TS_KV_TABLE); | ||
85 | - executeFunction(conn, CALL_CREATE_PARTITIONS); | ||
86 | - executeFunction(conn, CALL_CREATE_TS_KV_DICTIONARY_TABLE); | ||
87 | - executeFunction(conn, CALL_INSERT_INTO_DICTIONARY); | ||
88 | - executeFunction(conn, CALL_INSERT_INTO_TS_KV); | ||
89 | - executeFunction(conn, CALL_CREATE_NEW_TS_KV_LATEST_TABLE); | ||
90 | - executeFunction(conn, CALL_INSERT_INTO_TS_KV_LATEST); | 83 | + executeQuery(conn, CALL_CREATE_PARTITION_TS_KV_TABLE); |
84 | + executeQuery(conn, CALL_CREATE_PARTITIONS); | ||
85 | + executeQuery(conn, CALL_CREATE_TS_KV_DICTIONARY_TABLE); | ||
86 | + executeQuery(conn, CALL_INSERT_INTO_DICTIONARY); | ||
87 | + executeQuery(conn, CALL_INSERT_INTO_TS_KV); | ||
88 | + executeQuery(conn, CALL_CREATE_NEW_TS_KV_LATEST_TABLE); | ||
89 | + executeQuery(conn, CALL_INSERT_INTO_TS_KV_LATEST); | ||
91 | 90 | ||
92 | - executeDropStatement(conn, DROP_TABLE_TS_KV_OLD); | ||
93 | - executeDropStatement(conn, DROP_TABLE_TS_KV_LATEST_OLD); | 91 | + executeQuery(conn, DROP_TABLE_TS_KV_OLD); |
92 | + executeQuery(conn, DROP_TABLE_TS_KV_LATEST_OLD); | ||
94 | 93 | ||
95 | - executeDropStatement(conn, DROP_FUNCTION_CHECK_VERSION); | ||
96 | - executeDropStatement(conn, DROP_FUNCTION_CREATE_PARTITION_TS_KV_TABLE); | ||
97 | - executeDropStatement(conn, DROP_FUNCTION_CREATE_PARTITIONS); | ||
98 | - executeDropStatement(conn, DROP_FUNCTION_CREATE_TS_KV_DICTIONARY_TABLE); | ||
99 | - executeDropStatement(conn, DROP_FUNCTION_INSERT_INTO_DICTIONARY); | ||
100 | - executeDropStatement(conn, DROP_FUNCTION_INSERT_INTO_TS_KV); | ||
101 | - executeDropStatement(conn, DROP_FUNCTION_CREATE_NEW_TS_KV_LATEST_TABLE); | ||
102 | - executeDropStatement(conn, DROP_FUNCTION_INSERT_INTO_TS_KV_LATEST); | 94 | + executeQuery(conn, DROP_PROCEDURE_CHECK_VERSION); |
95 | + executeQuery(conn, DROP_PROCEDURE_CREATE_PARTITION_TS_KV_TABLE); | ||
96 | + executeQuery(conn, DROP_PROCEDURE_CREATE_PARTITIONS); | ||
97 | + executeQuery(conn, DROP_PROCEDURE_CREATE_TS_KV_DICTIONARY_TABLE); | ||
98 | + executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_DICTIONARY); | ||
99 | + executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_TS_KV); | ||
100 | + executeQuery(conn, DROP_PROCEDURE_CREATE_NEW_TS_KV_LATEST_TABLE); | ||
101 | + executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_TS_KV_LATEST); | ||
103 | 102 | ||
104 | executeQuery(conn, "ALTER TABLE ts_kv ADD COLUMN json_v json;"); | 103 | executeQuery(conn, "ALTER TABLE ts_kv ADD COLUMN json_v json;"); |
105 | executeQuery(conn, "ALTER TABLE ts_kv_latest ADD COLUMN json_v json;"); | 104 | executeQuery(conn, "ALTER TABLE ts_kv_latest ADD COLUMN json_v json;"); |
@@ -45,13 +45,13 @@ public class TimescaleTsDatabaseSchemaService extends SqlAbstractDatabaseSchemaS | @@ -45,13 +45,13 @@ public class TimescaleTsDatabaseSchemaService extends SqlAbstractDatabaseSchemaS | ||
45 | private long chunkTimeInterval; | 45 | private long chunkTimeInterval; |
46 | 46 | ||
47 | public TimescaleTsDatabaseSchemaService() { | 47 | public TimescaleTsDatabaseSchemaService() { |
48 | - super("schema-timescale.sql", "schema-timescale-idx.sql"); | 48 | + super("schema-timescale.sql", null); |
49 | } | 49 | } |
50 | 50 | ||
51 | @Override | 51 | @Override |
52 | public void createDatabaseSchema() throws Exception { | 52 | public void createDatabaseSchema() throws Exception { |
53 | super.createDatabaseSchema(); | 53 | super.createDatabaseSchema(); |
54 | - executeQuery("SELECT create_hypertable('tenant_ts_kv', 'ts', chunk_time_interval => " + chunkTimeInterval + ", if_not_exists => true);"); | 54 | + executeQuery("SELECT create_hypertable('ts_kv', 'ts', chunk_time_interval => " + chunkTimeInterval + ", if_not_exists => true);"); |
55 | } | 55 | } |
56 | 56 | ||
57 | private void executeQuery(String query) { | 57 | private void executeQuery(String query) { |
@@ -43,27 +43,27 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr | @@ -43,27 +43,27 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr | ||
43 | private static final String TENANT_TS_KV_OLD_TABLE = "tenant_ts_kv_old;"; | 43 | private static final String TENANT_TS_KV_OLD_TABLE = "tenant_ts_kv_old;"; |
44 | 44 | ||
45 | private static final String CREATE_TS_KV_LATEST_TABLE = "create_ts_kv_latest_table()"; | 45 | private static final String CREATE_TS_KV_LATEST_TABLE = "create_ts_kv_latest_table()"; |
46 | - private static final String CREATE_NEW_TENANT_TS_KV_TABLE = "create_new_tenant_ts_kv_table()"; | 46 | + private static final String CREATE_NEW_TS_KV_TABLE = "create_new_ts_kv_table()"; |
47 | private static final String CREATE_TS_KV_DICTIONARY_TABLE = "create_ts_kv_dictionary_table()"; | 47 | private static final String CREATE_TS_KV_DICTIONARY_TABLE = "create_ts_kv_dictionary_table()"; |
48 | private static final String INSERT_INTO_DICTIONARY = "insert_into_dictionary()"; | 48 | private static final String INSERT_INTO_DICTIONARY = "insert_into_dictionary()"; |
49 | - private static final String INSERT_INTO_TENANT_TS_KV = "insert_into_tenant_ts_kv()"; | 49 | + private static final String INSERT_INTO_TS_KV = "insert_into_ts_kv()"; |
50 | private static final String INSERT_INTO_TS_KV_LATEST = "insert_into_ts_kv_latest()"; | 50 | private static final String INSERT_INTO_TS_KV_LATEST = "insert_into_ts_kv_latest()"; |
51 | 51 | ||
52 | private static final String CALL_CREATE_TS_KV_LATEST_TABLE = CALL_REGEX + CREATE_TS_KV_LATEST_TABLE; | 52 | private static final String CALL_CREATE_TS_KV_LATEST_TABLE = CALL_REGEX + CREATE_TS_KV_LATEST_TABLE; |
53 | - private static final String CALL_CREATE_NEW_TENANT_TS_KV_TABLE = CALL_REGEX + CREATE_NEW_TENANT_TS_KV_TABLE; | 53 | + private static final String CALL_CREATE_NEW_TENANT_TS_KV_TABLE = CALL_REGEX + CREATE_NEW_TS_KV_TABLE; |
54 | private static final String CALL_CREATE_TS_KV_DICTIONARY_TABLE = CALL_REGEX + CREATE_TS_KV_DICTIONARY_TABLE; | 54 | private static final String CALL_CREATE_TS_KV_DICTIONARY_TABLE = CALL_REGEX + CREATE_TS_KV_DICTIONARY_TABLE; |
55 | private static final String CALL_INSERT_INTO_DICTIONARY = CALL_REGEX + INSERT_INTO_DICTIONARY; | 55 | private static final String CALL_INSERT_INTO_DICTIONARY = CALL_REGEX + INSERT_INTO_DICTIONARY; |
56 | - private static final String CALL_INSERT_INTO_TS_KV = CALL_REGEX + INSERT_INTO_TENANT_TS_KV; | 56 | + private static final String CALL_INSERT_INTO_TS_KV = CALL_REGEX + INSERT_INTO_TS_KV; |
57 | private static final String CALL_INSERT_INTO_TS_KV_LATEST = CALL_REGEX + INSERT_INTO_TS_KV_LATEST; | 57 | private static final String CALL_INSERT_INTO_TS_KV_LATEST = CALL_REGEX + INSERT_INTO_TS_KV_LATEST; |
58 | 58 | ||
59 | private static final String DROP_OLD_TENANT_TS_KV_TABLE = DROP_TABLE + TENANT_TS_KV_OLD_TABLE; | 59 | private static final String DROP_OLD_TENANT_TS_KV_TABLE = DROP_TABLE + TENANT_TS_KV_OLD_TABLE; |
60 | 60 | ||
61 | - private static final String DROP_FUNCTION_CREATE_TS_KV_LATEST_TABLE = DROP_FUNCTION_IF_EXISTS + CREATE_TS_KV_LATEST_TABLE; | ||
62 | - private static final String DROP_FUNCTION_CREATE_TENANT_TS_KV_TABLE_COPY = DROP_FUNCTION_IF_EXISTS + CREATE_NEW_TENANT_TS_KV_TABLE; | ||
63 | - private static final String DROP_FUNCTION_CREATE_TS_KV_DICTIONARY_TABLE = DROP_FUNCTION_IF_EXISTS + CREATE_TS_KV_DICTIONARY_TABLE; | ||
64 | - private static final String DROP_FUNCTION_INSERT_INTO_DICTIONARY = DROP_FUNCTION_IF_EXISTS + INSERT_INTO_DICTIONARY; | ||
65 | - private static final String DROP_FUNCTION_INSERT_INTO_TENANT_TS_KV = DROP_FUNCTION_IF_EXISTS + INSERT_INTO_TENANT_TS_KV; | ||
66 | - private static final String DROP_FUNCTION_INSERT_INTO_TS_KV_LATEST = DROP_FUNCTION_IF_EXISTS + INSERT_INTO_TS_KV_LATEST; | 61 | + private static final String DROP_PROCEDURE_CREATE_TS_KV_LATEST_TABLE = DROP_PROCEDURE_IF_EXISTS + CREATE_TS_KV_LATEST_TABLE; |
62 | + private static final String DROP_PROCEDURE_CREATE_TENANT_TS_KV_TABLE_COPY = DROP_PROCEDURE_IF_EXISTS + CREATE_NEW_TS_KV_TABLE; | ||
63 | + private static final String DROP_PROCEDURE_CREATE_TS_KV_DICTIONARY_TABLE = DROP_PROCEDURE_IF_EXISTS + CREATE_TS_KV_DICTIONARY_TABLE; | ||
64 | + private static final String DROP_PROCEDURE_INSERT_INTO_DICTIONARY = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_DICTIONARY; | ||
65 | + private static final String DROP_PROCEDURE_INSERT_INTO_TENANT_TS_KV = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_TS_KV; | ||
66 | + private static final String DROP_PROCEDURE_INSERT_INTO_TS_KV_LATEST = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_TS_KV_LATEST; | ||
67 | 67 | ||
68 | @Autowired | 68 | @Autowired |
69 | private InstallScripts installScripts; | 69 | private InstallScripts installScripts; |
@@ -78,33 +78,31 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr | @@ -78,33 +78,31 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr | ||
78 | loadSql(conn); | 78 | loadSql(conn); |
79 | boolean versionValid = checkVersion(conn); | 79 | boolean versionValid = checkVersion(conn); |
80 | if (!versionValid) { | 80 | if (!versionValid) { |
81 | - log.info("PostgreSQL version should be at least more than 9.6!"); | 81 | + log.info("PostgreSQL version should be at least more than 11!"); |
82 | log.info("Please upgrade your PostgreSQL and restart the script!"); | 82 | log.info("Please upgrade your PostgreSQL and restart the script!"); |
83 | } else { | 83 | } else { |
84 | log.info("PostgreSQL version is valid!"); | 84 | log.info("PostgreSQL version is valid!"); |
85 | log.info("Updating schema ..."); | 85 | log.info("Updating schema ..."); |
86 | - executeFunction(conn, CALL_CREATE_TS_KV_LATEST_TABLE); | ||
87 | - executeFunction(conn, CALL_CREATE_NEW_TENANT_TS_KV_TABLE); | 86 | + executeQuery(conn, CALL_CREATE_TS_KV_LATEST_TABLE); |
87 | + executeQuery(conn, CALL_CREATE_NEW_TENANT_TS_KV_TABLE); | ||
88 | 88 | ||
89 | - executeQuery(conn, "SELECT create_hypertable('tenant_ts_kv', 'ts', chunk_time_interval => " + chunkTimeInterval + ", if_not_exists => true);"); | 89 | + executeQuery(conn, "SELECT create_hypertable('ts_kv', 'ts', chunk_time_interval => " + chunkTimeInterval + ", if_not_exists => true);"); |
90 | 90 | ||
91 | - executeFunction(conn, CALL_CREATE_TS_KV_DICTIONARY_TABLE); | ||
92 | - executeFunction(conn, CALL_INSERT_INTO_DICTIONARY); | ||
93 | - executeFunction(conn, CALL_INSERT_INTO_TS_KV); | ||
94 | - executeFunction(conn, CALL_INSERT_INTO_TS_KV_LATEST); | 91 | + executeQuery(conn, CALL_CREATE_TS_KV_DICTIONARY_TABLE); |
92 | + executeQuery(conn, CALL_INSERT_INTO_DICTIONARY); | ||
93 | + executeQuery(conn, CALL_INSERT_INTO_TS_KV); | ||
94 | + executeQuery(conn, CALL_INSERT_INTO_TS_KV_LATEST); | ||
95 | 95 | ||
96 | - //executeQuery(conn, "SELECT set_chunk_time_interval('tenant_ts_kv', " + chunkTimeInterval +");"); | 96 | + executeQuery(conn, DROP_OLD_TENANT_TS_KV_TABLE); |
97 | 97 | ||
98 | - executeDropStatement(conn, DROP_OLD_TENANT_TS_KV_TABLE); | 98 | + executeQuery(conn, DROP_PROCEDURE_CREATE_TS_KV_LATEST_TABLE); |
99 | + executeQuery(conn, DROP_PROCEDURE_CREATE_TENANT_TS_KV_TABLE_COPY); | ||
100 | + executeQuery(conn, DROP_PROCEDURE_CREATE_TS_KV_DICTIONARY_TABLE); | ||
101 | + executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_DICTIONARY); | ||
102 | + executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_TENANT_TS_KV); | ||
103 | + executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_TS_KV_LATEST); | ||
99 | 104 | ||
100 | - executeDropStatement(conn, DROP_FUNCTION_CREATE_TS_KV_LATEST_TABLE); | ||
101 | - executeDropStatement(conn, DROP_FUNCTION_CREATE_TENANT_TS_KV_TABLE_COPY); | ||
102 | - executeDropStatement(conn, DROP_FUNCTION_CREATE_TS_KV_DICTIONARY_TABLE); | ||
103 | - executeDropStatement(conn, DROP_FUNCTION_INSERT_INTO_DICTIONARY); | ||
104 | - executeDropStatement(conn, DROP_FUNCTION_INSERT_INTO_TENANT_TS_KV); | ||
105 | - executeDropStatement(conn, DROP_FUNCTION_INSERT_INTO_TS_KV_LATEST); | ||
106 | - | ||
107 | - executeQuery(conn, "ALTER TABLE tenant_ts_kv ADD COLUMN json_v json;"); | 105 | + executeQuery(conn, "ALTER TABLE ts_kv ADD COLUMN json_v json;"); |
108 | executeQuery(conn, "ALTER TABLE ts_kv_latest ADD COLUMN json_v json;"); | 106 | executeQuery(conn, "ALTER TABLE ts_kv_latest ADD COLUMN json_v json;"); |
109 | 107 | ||
110 | log.info("schema timeseries updated!"); | 108 | log.info("schema timeseries updated!"); |
@@ -36,6 +36,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.BOOLEAN_VALUE_COLU | @@ -36,6 +36,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.BOOLEAN_VALUE_COLU | ||
36 | import static org.thingsboard.server.dao.model.ModelConstants.DOUBLE_VALUE_COLUMN; | 36 | import static org.thingsboard.server.dao.model.ModelConstants.DOUBLE_VALUE_COLUMN; |
37 | import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_ID_COLUMN; | 37 | import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_ID_COLUMN; |
38 | import static org.thingsboard.server.dao.model.ModelConstants.JSON_VALUE_COLUMN; | 38 | import static org.thingsboard.server.dao.model.ModelConstants.JSON_VALUE_COLUMN; |
39 | +import static org.thingsboard.server.dao.model.ModelConstants.KEY_COLUMN; | ||
39 | import static org.thingsboard.server.dao.model.ModelConstants.LONG_VALUE_COLUMN; | 40 | import static org.thingsboard.server.dao.model.ModelConstants.LONG_VALUE_COLUMN; |
40 | import static org.thingsboard.server.dao.model.ModelConstants.STRING_VALUE_COLUMN; | 41 | import static org.thingsboard.server.dao.model.ModelConstants.STRING_VALUE_COLUMN; |
41 | import static org.thingsboard.server.dao.model.ModelConstants.TS_COLUMN; | 42 | import static org.thingsboard.server.dao.model.ModelConstants.TS_COLUMN; |
@@ -54,6 +55,10 @@ public abstract class AbstractTsKvEntity implements ToData<TsKvEntry> { | @@ -54,6 +55,10 @@ public abstract class AbstractTsKvEntity implements ToData<TsKvEntry> { | ||
54 | protected UUID entityId; | 55 | protected UUID entityId; |
55 | 56 | ||
56 | @Id | 57 | @Id |
58 | + @Column(name = KEY_COLUMN) | ||
59 | + protected int key; | ||
60 | + | ||
61 | + @Id | ||
57 | @Column(name = TS_COLUMN) | 62 | @Column(name = TS_COLUMN) |
58 | protected Long ts; | 63 | protected Long ts; |
59 | 64 |
@@ -69,10 +69,6 @@ import static org.thingsboard.server.dao.model.ModelConstants.KEY_COLUMN; | @@ -69,10 +69,6 @@ import static org.thingsboard.server.dao.model.ModelConstants.KEY_COLUMN; | ||
69 | }) | 69 | }) |
70 | public final class TsKvLatestEntity extends AbstractTsKvEntity { | 70 | public final class TsKvLatestEntity extends AbstractTsKvEntity { |
71 | 71 | ||
72 | - @Id | ||
73 | - @Column(name = KEY_COLUMN) | ||
74 | - private int key; | ||
75 | - | ||
76 | @Override | 72 | @Override |
77 | public boolean isNotEmpty() { | 73 | public boolean isNotEmpty() { |
78 | return strValue != null || longValue != null || doubleValue != null || booleanValue != null || jsonValue != null; | 74 | return strValue != null || longValue != null || doubleValue != null || booleanValue != null || jsonValue != null; |
dao/src/main/java/org/thingsboard/server/dao/model/sqlts/timescale/ts/TimescaleTsKvCompositeKey.java
@@ -31,7 +31,6 @@ public class TimescaleTsKvCompositeKey implements Serializable { | @@ -31,7 +31,6 @@ public class TimescaleTsKvCompositeKey implements Serializable { | ||
31 | @Transient | 31 | @Transient |
32 | private static final long serialVersionUID = -4089175869616037523L; | 32 | private static final long serialVersionUID = -4089175869616037523L; |
33 | 33 | ||
34 | - private UUID tenantId; | ||
35 | private UUID entityId; | 34 | private UUID entityId; |
36 | private int key; | 35 | private int key; |
37 | private long ts; | 36 | private long ts; |
@@ -18,25 +18,18 @@ package org.thingsboard.server.dao.model.sqlts.timescale.ts; | @@ -18,25 +18,18 @@ package org.thingsboard.server.dao.model.sqlts.timescale.ts; | ||
18 | import lombok.Data; | 18 | import lombok.Data; |
19 | import lombok.EqualsAndHashCode; | 19 | import lombok.EqualsAndHashCode; |
20 | import org.springframework.util.StringUtils; | 20 | import org.springframework.util.StringUtils; |
21 | -import org.thingsboard.server.common.data.kv.TsKvEntry; | ||
22 | -import org.thingsboard.server.dao.model.ToData; | ||
23 | import org.thingsboard.server.dao.model.sql.AbstractTsKvEntity; | 21 | import org.thingsboard.server.dao.model.sql.AbstractTsKvEntity; |
24 | 22 | ||
25 | -import javax.persistence.Column; | ||
26 | import javax.persistence.ColumnResult; | 23 | import javax.persistence.ColumnResult; |
27 | import javax.persistence.ConstructorResult; | 24 | import javax.persistence.ConstructorResult; |
28 | import javax.persistence.Entity; | 25 | import javax.persistence.Entity; |
29 | -import javax.persistence.Id; | ||
30 | import javax.persistence.IdClass; | 26 | import javax.persistence.IdClass; |
31 | import javax.persistence.NamedNativeQueries; | 27 | import javax.persistence.NamedNativeQueries; |
32 | import javax.persistence.NamedNativeQuery; | 28 | import javax.persistence.NamedNativeQuery; |
33 | import javax.persistence.SqlResultSetMapping; | 29 | import javax.persistence.SqlResultSetMapping; |
34 | import javax.persistence.SqlResultSetMappings; | 30 | import javax.persistence.SqlResultSetMappings; |
35 | import javax.persistence.Table; | 31 | import javax.persistence.Table; |
36 | -import java.util.UUID; | ||
37 | 32 | ||
38 | -import static org.thingsboard.server.dao.model.ModelConstants.KEY_COLUMN; | ||
39 | -import static org.thingsboard.server.dao.model.ModelConstants.TENANT_ID_COLUMN; | ||
40 | import static org.thingsboard.server.dao.sqlts.timescale.AggregationRepository.FIND_AVG; | 33 | import static org.thingsboard.server.dao.sqlts.timescale.AggregationRepository.FIND_AVG; |
41 | import static org.thingsboard.server.dao.sqlts.timescale.AggregationRepository.FIND_AVG_QUERY; | 34 | import static org.thingsboard.server.dao.sqlts.timescale.AggregationRepository.FIND_AVG_QUERY; |
42 | import static org.thingsboard.server.dao.sqlts.timescale.AggregationRepository.FIND_COUNT; | 35 | import static org.thingsboard.server.dao.sqlts.timescale.AggregationRepository.FIND_COUNT; |
@@ -52,7 +45,7 @@ import static org.thingsboard.server.dao.sqlts.timescale.AggregationRepository.F | @@ -52,7 +45,7 @@ import static org.thingsboard.server.dao.sqlts.timescale.AggregationRepository.F | ||
52 | @Data | 45 | @Data |
53 | @EqualsAndHashCode(callSuper = true) | 46 | @EqualsAndHashCode(callSuper = true) |
54 | @Entity | 47 | @Entity |
55 | -@Table(name = "tenant_ts_kv") | 48 | +@Table(name = "ts_kv") |
56 | @IdClass(TimescaleTsKvCompositeKey.class) | 49 | @IdClass(TimescaleTsKvCompositeKey.class) |
57 | @SqlResultSetMappings({ | 50 | @SqlResultSetMappings({ |
58 | @SqlResultSetMapping( | 51 | @SqlResultSetMapping( |
@@ -116,15 +109,7 @@ import static org.thingsboard.server.dao.sqlts.timescale.AggregationRepository.F | @@ -116,15 +109,7 @@ import static org.thingsboard.server.dao.sqlts.timescale.AggregationRepository.F | ||
116 | resultSetMapping = "timescaleCountMapping" | 109 | resultSetMapping = "timescaleCountMapping" |
117 | ) | 110 | ) |
118 | }) | 111 | }) |
119 | -public final class TimescaleTsKvEntity extends AbstractTsKvEntity implements ToData<TsKvEntry> { | ||
120 | - | ||
121 | - @Id | ||
122 | - @Column(name = TENANT_ID_COLUMN, columnDefinition = "uuid") | ||
123 | - private UUID tenantId; | ||
124 | - | ||
125 | - @Id | ||
126 | - @Column(name = KEY_COLUMN) | ||
127 | - private int key; | 112 | +public final class TimescaleTsKvEntity extends AbstractTsKvEntity { |
128 | 113 | ||
129 | public TimescaleTsKvEntity() { | 114 | public TimescaleTsKvEntity() { |
130 | } | 115 | } |
@@ -32,10 +32,6 @@ import static org.thingsboard.server.dao.model.ModelConstants.KEY_COLUMN; | @@ -32,10 +32,6 @@ import static org.thingsboard.server.dao.model.ModelConstants.KEY_COLUMN; | ||
32 | @IdClass(TsKvCompositeKey.class) | 32 | @IdClass(TsKvCompositeKey.class) |
33 | public final class TsKvEntity extends AbstractTsKvEntity { | 33 | public final class TsKvEntity extends AbstractTsKvEntity { |
34 | 34 | ||
35 | - @Id | ||
36 | - @Column(name = KEY_COLUMN) | ||
37 | - private int key; | ||
38 | - | ||
39 | public TsKvEntity() { | 35 | public TsKvEntity() { |
40 | } | 36 | } |
41 | 37 |
@@ -96,7 +96,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | @@ -96,7 +96,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | ||
96 | 96 | ||
97 | @Override | 97 | @Override |
98 | public ListenableFuture<Void> removeLatest(TenantId tenantId, EntityId entityId, DeleteTsKvQuery query) { | 98 | public ListenableFuture<Void> removeLatest(TenantId tenantId, EntityId entityId, DeleteTsKvQuery query) { |
99 | - return getRemoveLatestFuture(tenantId, entityId, query); | 99 | + return getRemoveLatestFuture(entityId, query); |
100 | } | 100 | } |
101 | 101 | ||
102 | @Override | 102 | @Override |
@@ -125,9 +125,9 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | @@ -125,9 +125,9 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | ||
125 | } | 125 | } |
126 | 126 | ||
127 | @Override | 127 | @Override |
128 | - protected ListenableFuture<List<TsKvEntry>> findAllAsync(TenantId tenantId, EntityId entityId, ReadTsKvQuery query) { | 128 | + protected ListenableFuture<List<TsKvEntry>> findAllAsync(EntityId entityId, ReadTsKvQuery query) { |
129 | if (query.getAggregation() == Aggregation.NONE) { | 129 | if (query.getAggregation() == Aggregation.NONE) { |
130 | - return findAllAsyncWithLimit(tenantId, entityId, query); | 130 | + return findAllAsyncWithLimit(entityId, query); |
131 | } else { | 131 | } else { |
132 | long stepTs = query.getStartTs(); | 132 | long stepTs = query.getStartTs(); |
133 | List<ListenableFuture<Optional<TsKvEntry>>> futures = new ArrayList<>(); | 133 | List<ListenableFuture<Optional<TsKvEntry>>> futures = new ArrayList<>(); |
@@ -135,7 +135,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | @@ -135,7 +135,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | ||
135 | long startTs = stepTs; | 135 | long startTs = stepTs; |
136 | long endTs = stepTs + query.getInterval(); | 136 | long endTs = stepTs + query.getInterval(); |
137 | long ts = startTs + (endTs - startTs) / 2; | 137 | long ts = startTs + (endTs - startTs) / 2; |
138 | - futures.add(findAndAggregateAsync(tenantId, entityId, query.getKey(), startTs, endTs, ts, query.getAggregation())); | 138 | + futures.add(findAndAggregateAsync(entityId, query.getKey(), startTs, endTs, ts, query.getAggregation())); |
139 | stepTs = endTs; | 139 | stepTs = endTs; |
140 | } | 140 | } |
141 | return getTskvEntriesFuture(Futures.allAsList(futures)); | 141 | return getTskvEntriesFuture(Futures.allAsList(futures)); |
@@ -143,7 +143,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | @@ -143,7 +143,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | ||
143 | } | 143 | } |
144 | 144 | ||
145 | @Override | 145 | @Override |
146 | - protected ListenableFuture<List<TsKvEntry>> findAllAsyncWithLimit(TenantId tenantId, EntityId entityId, ReadTsKvQuery query) { | 146 | + protected ListenableFuture<List<TsKvEntry>> findAllAsyncWithLimit(EntityId entityId, ReadTsKvQuery query) { |
147 | Integer keyId = getOrSaveKeyId(query.getKey()); | 147 | Integer keyId = getOrSaveKeyId(query.getKey()); |
148 | List<TsKvEntity> tsKvEntities = tsKvRepository.findAllWithLimit( | 148 | List<TsKvEntity> tsKvEntities = tsKvRepository.findAllWithLimit( |
149 | entityId.getId(), | 149 | entityId.getId(), |
@@ -157,9 +157,9 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | @@ -157,9 +157,9 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | ||
157 | return Futures.immediateFuture(DaoUtil.convertDataList(tsKvEntities)); | 157 | return Futures.immediateFuture(DaoUtil.convertDataList(tsKvEntities)); |
158 | } | 158 | } |
159 | 159 | ||
160 | - protected ListenableFuture<Optional<TsKvEntry>> findAndAggregateAsync(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, long ts, Aggregation aggregation) { | 160 | + private ListenableFuture<Optional<TsKvEntry>> findAndAggregateAsync(EntityId entityId, String key, long startTs, long endTs, long ts, Aggregation aggregation) { |
161 | List<CompletableFuture<TsKvEntity>> entitiesFutures = new ArrayList<>(); | 161 | List<CompletableFuture<TsKvEntity>> entitiesFutures = new ArrayList<>(); |
162 | - switchAggregation(tenantId, entityId, key, startTs, endTs, aggregation, entitiesFutures); | 162 | + switchAggregation(entityId, key, startTs, endTs, aggregation, entitiesFutures); |
163 | return Futures.transform(setFutures(entitiesFutures), entity -> { | 163 | return Futures.transform(setFutures(entitiesFutures), entity -> { |
164 | if (entity != null && entity.isNotEmpty()) { | 164 | if (entity != null && entity.isNotEmpty()) { |
165 | entity.setEntityId(entityId.getId()); | 165 | entity.setEntityId(entityId.getId()); |
@@ -172,29 +172,29 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | @@ -172,29 +172,29 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | ||
172 | }, MoreExecutors.directExecutor()); | 172 | }, MoreExecutors.directExecutor()); |
173 | } | 173 | } |
174 | 174 | ||
175 | - protected void switchAggregation(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, Aggregation aggregation, List<CompletableFuture<TsKvEntity>> entitiesFutures) { | 175 | + protected void switchAggregation(EntityId entityId, String key, long startTs, long endTs, Aggregation aggregation, List<CompletableFuture<TsKvEntity>> entitiesFutures) { |
176 | switch (aggregation) { | 176 | switch (aggregation) { |
177 | case AVG: | 177 | case AVG: |
178 | - findAvg(tenantId, entityId, key, startTs, endTs, entitiesFutures); | 178 | + findAvg(entityId, key, startTs, endTs, entitiesFutures); |
179 | break; | 179 | break; |
180 | case MAX: | 180 | case MAX: |
181 | - findMax(tenantId, entityId, key, startTs, endTs, entitiesFutures); | 181 | + findMax(entityId, key, startTs, endTs, entitiesFutures); |
182 | break; | 182 | break; |
183 | case MIN: | 183 | case MIN: |
184 | - findMin(tenantId, entityId, key, startTs, endTs, entitiesFutures); | 184 | + findMin(entityId, key, startTs, endTs, entitiesFutures); |
185 | break; | 185 | break; |
186 | case SUM: | 186 | case SUM: |
187 | - findSum(tenantId, entityId, key, startTs, endTs, entitiesFutures); | 187 | + findSum(entityId, key, startTs, endTs, entitiesFutures); |
188 | break; | 188 | break; |
189 | case COUNT: | 189 | case COUNT: |
190 | - findCount(tenantId, entityId, key, startTs, endTs, entitiesFutures); | 190 | + findCount(entityId, key, startTs, endTs, entitiesFutures); |
191 | break; | 191 | break; |
192 | default: | 192 | default: |
193 | throw new IllegalArgumentException("Not supported aggregation type: " + aggregation); | 193 | throw new IllegalArgumentException("Not supported aggregation type: " + aggregation); |
194 | } | 194 | } |
195 | } | 195 | } |
196 | 196 | ||
197 | - protected void findCount(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, List<CompletableFuture<TsKvEntity>> entitiesFutures) { | 197 | + protected void findCount(EntityId entityId, String key, long startTs, long endTs, List<CompletableFuture<TsKvEntity>> entitiesFutures) { |
198 | Integer keyId = getOrSaveKeyId(key); | 198 | Integer keyId = getOrSaveKeyId(key); |
199 | entitiesFutures.add(tsKvRepository.findCount( | 199 | entitiesFutures.add(tsKvRepository.findCount( |
200 | entityId.getId(), | 200 | entityId.getId(), |
@@ -203,7 +203,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | @@ -203,7 +203,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | ||
203 | endTs)); | 203 | endTs)); |
204 | } | 204 | } |
205 | 205 | ||
206 | - protected void findSum(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, List<CompletableFuture<TsKvEntity>> entitiesFutures) { | 206 | + protected void findSum(EntityId entityId, String key, long startTs, long endTs, List<CompletableFuture<TsKvEntity>> entitiesFutures) { |
207 | Integer keyId = getOrSaveKeyId(key); | 207 | Integer keyId = getOrSaveKeyId(key); |
208 | entitiesFutures.add(tsKvRepository.findSum( | 208 | entitiesFutures.add(tsKvRepository.findSum( |
209 | entityId.getId(), | 209 | entityId.getId(), |
@@ -212,7 +212,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | @@ -212,7 +212,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | ||
212 | endTs)); | 212 | endTs)); |
213 | } | 213 | } |
214 | 214 | ||
215 | - protected void findMin(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, List<CompletableFuture<TsKvEntity>> entitiesFutures) { | 215 | + protected void findMin(EntityId entityId, String key, long startTs, long endTs, List<CompletableFuture<TsKvEntity>> entitiesFutures) { |
216 | Integer keyId = getOrSaveKeyId(key); | 216 | Integer keyId = getOrSaveKeyId(key); |
217 | entitiesFutures.add(tsKvRepository.findStringMin( | 217 | entitiesFutures.add(tsKvRepository.findStringMin( |
218 | entityId.getId(), | 218 | entityId.getId(), |
@@ -226,7 +226,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | @@ -226,7 +226,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | ||
226 | endTs)); | 226 | endTs)); |
227 | } | 227 | } |
228 | 228 | ||
229 | - protected void findMax(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, List<CompletableFuture<TsKvEntity>> entitiesFutures) { | 229 | + protected void findMax(EntityId entityId, String key, long startTs, long endTs, List<CompletableFuture<TsKvEntity>> entitiesFutures) { |
230 | Integer keyId = getOrSaveKeyId(key); | 230 | Integer keyId = getOrSaveKeyId(key); |
231 | entitiesFutures.add(tsKvRepository.findStringMax( | 231 | entitiesFutures.add(tsKvRepository.findStringMax( |
232 | entityId.getId(), | 232 | entityId.getId(), |
@@ -240,7 +240,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | @@ -240,7 +240,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq | ||
240 | endTs)); | 240 | endTs)); |
241 | } | 241 | } |
242 | 242 | ||
243 | - protected void findAvg(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, List<CompletableFuture<TsKvEntity>> entitiesFutures) { | 243 | + protected void findAvg(EntityId entityId, String key, long startTs, long endTs, List<CompletableFuture<TsKvEntity>> entitiesFutures) { |
244 | Integer keyId = getOrSaveKeyId(key); | 244 | Integer keyId = getOrSaveKeyId(key); |
245 | entitiesFutures.add(tsKvRepository.findAvg( | 245 | entitiesFutures.add(tsKvRepository.findAvg( |
246 | entityId.getId(), | 246 | entityId.getId(), |
@@ -127,7 +127,7 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx | @@ -127,7 +127,7 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx | ||
127 | protected ListenableFuture<List<TsKvEntry>> processFindAllAsync(TenantId tenantId, EntityId entityId, List<ReadTsKvQuery> queries) { | 127 | protected ListenableFuture<List<TsKvEntry>> processFindAllAsync(TenantId tenantId, EntityId entityId, List<ReadTsKvQuery> queries) { |
128 | List<ListenableFuture<List<TsKvEntry>>> futures = queries | 128 | List<ListenableFuture<List<TsKvEntry>>> futures = queries |
129 | .stream() | 129 | .stream() |
130 | - .map(query -> findAllAsync(tenantId, entityId, query)) | 130 | + .map(query -> findAllAsync(entityId, query)) |
131 | .collect(Collectors.toList()); | 131 | .collect(Collectors.toList()); |
132 | return Futures.transform(Futures.allAsList(futures), new Function<List<List<TsKvEntry>>, List<TsKvEntry>>() { | 132 | return Futures.transform(Futures.allAsList(futures), new Function<List<List<TsKvEntry>>, List<TsKvEntry>>() { |
133 | @Nullable | 133 | @Nullable |
@@ -144,9 +144,9 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx | @@ -144,9 +144,9 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx | ||
144 | }, service); | 144 | }, service); |
145 | } | 145 | } |
146 | 146 | ||
147 | - protected abstract ListenableFuture<List<TsKvEntry>> findAllAsync(TenantId tenantId, EntityId entityId, ReadTsKvQuery query); | 147 | + protected abstract ListenableFuture<List<TsKvEntry>> findAllAsync(EntityId entityId, ReadTsKvQuery query); |
148 | 148 | ||
149 | - protected abstract ListenableFuture<List<TsKvEntry>> findAllAsyncWithLimit(TenantId tenantId, EntityId entityId, ReadTsKvQuery query); | 149 | + protected abstract ListenableFuture<List<TsKvEntry>> findAllAsyncWithLimit(EntityId entityId, ReadTsKvQuery query); |
150 | 150 | ||
151 | protected ListenableFuture<List<TsKvEntry>> getTskvEntriesFuture(ListenableFuture<List<Optional<TsKvEntry>>> future) { | 151 | protected ListenableFuture<List<TsKvEntry>> getTskvEntriesFuture(ListenableFuture<List<Optional<TsKvEntry>>> future) { |
152 | return Futures.transform(future, new Function<List<Optional<TsKvEntry>>, List<TsKvEntry>>() { | 152 | return Futures.transform(future, new Function<List<Optional<TsKvEntry>>, List<TsKvEntry>>() { |
@@ -164,12 +164,12 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx | @@ -164,12 +164,12 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx | ||
164 | }, service); | 164 | }, service); |
165 | } | 165 | } |
166 | 166 | ||
167 | - protected ListenableFuture<List<TsKvEntry>> findNewLatestEntryFuture(TenantId tenantId, EntityId entityId, DeleteTsKvQuery query) { | 167 | + protected ListenableFuture<List<TsKvEntry>> findNewLatestEntryFuture(EntityId entityId, DeleteTsKvQuery query) { |
168 | long startTs = 0; | 168 | long startTs = 0; |
169 | long endTs = query.getStartTs() - 1; | 169 | long endTs = query.getStartTs() - 1; |
170 | ReadTsKvQuery findNewLatestQuery = new BaseReadTsKvQuery(query.getKey(), startTs, endTs, endTs - startTs, 1, | 170 | ReadTsKvQuery findNewLatestQuery = new BaseReadTsKvQuery(query.getKey(), startTs, endTs, endTs - startTs, 1, |
171 | Aggregation.NONE, DESC_ORDER); | 171 | Aggregation.NONE, DESC_ORDER); |
172 | - return findAllAsync(tenantId, entityId, findNewLatestQuery); | 172 | + return findAllAsync(entityId, findNewLatestQuery); |
173 | } | 173 | } |
174 | 174 | ||
175 | protected ListenableFuture<TsKvEntry> getFindLatestFuture(EntityId entityId, String key) { | 175 | protected ListenableFuture<TsKvEntry> getFindLatestFuture(EntityId entityId, String key) { |
@@ -189,7 +189,7 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx | @@ -189,7 +189,7 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx | ||
189 | return Futures.immediateFuture(result); | 189 | return Futures.immediateFuture(result); |
190 | } | 190 | } |
191 | 191 | ||
192 | - protected ListenableFuture<Void> getRemoveLatestFuture(TenantId tenantId, EntityId entityId, DeleteTsKvQuery query) { | 192 | + protected ListenableFuture<Void> getRemoveLatestFuture(EntityId entityId, DeleteTsKvQuery query) { |
193 | ListenableFuture<TsKvEntry> latestFuture = getFindLatestFuture(entityId, query.getKey()); | 193 | ListenableFuture<TsKvEntry> latestFuture = getFindLatestFuture(entityId, query.getKey()); |
194 | 194 | ||
195 | ListenableFuture<Boolean> booleanFuture = Futures.transform(latestFuture, tsKvEntry -> { | 195 | ListenableFuture<Boolean> booleanFuture = Futures.transform(latestFuture, tsKvEntry -> { |
@@ -217,7 +217,7 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx | @@ -217,7 +217,7 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx | ||
217 | if (query.getRewriteLatestIfDeleted()) { | 217 | if (query.getRewriteLatestIfDeleted()) { |
218 | ListenableFuture<Void> savedLatestFuture = Futures.transformAsync(booleanFuture, isRemove -> { | 218 | ListenableFuture<Void> savedLatestFuture = Futures.transformAsync(booleanFuture, isRemove -> { |
219 | if (isRemove) { | 219 | if (isRemove) { |
220 | - return getNewLatestEntryFuture(tenantId, entityId, query); | 220 | + return getNewLatestEntryFuture(entityId, query); |
221 | } | 221 | } |
222 | return Futures.immediateFuture(null); | 222 | return Futures.immediateFuture(null); |
223 | }, service); | 223 | }, service); |
@@ -296,8 +296,8 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx | @@ -296,8 +296,8 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx | ||
296 | return keyId; | 296 | return keyId; |
297 | } | 297 | } |
298 | 298 | ||
299 | - private ListenableFuture<Void> getNewLatestEntryFuture(TenantId tenantId, EntityId entityId, DeleteTsKvQuery query) { | ||
300 | - ListenableFuture<List<TsKvEntry>> future = findNewLatestEntryFuture(tenantId, entityId, query); | 299 | + private ListenableFuture<Void> getNewLatestEntryFuture(EntityId entityId, DeleteTsKvQuery query) { |
300 | + ListenableFuture<List<TsKvEntry>> future = findNewLatestEntryFuture(entityId, query); | ||
301 | return Futures.transformAsync(future, entryList -> { | 301 | return Futures.transformAsync(future, entryList -> { |
302 | if (entryList.size() == 1) { | 302 | if (entryList.size() == 1) { |
303 | return getSaveLatestFuture(entityId, entryList.get(0)); | 303 | return getSaveLatestFuture(entityId, entryList.get(0)); |
dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/timescale/TimescaleInsertTsRepository.java
@@ -37,8 +37,8 @@ import java.util.List; | @@ -37,8 +37,8 @@ import java.util.List; | ||
37 | public class TimescaleInsertTsRepository extends AbstractInsertRepository implements InsertTsRepository<TimescaleTsKvEntity> { | 37 | public class TimescaleInsertTsRepository extends AbstractInsertRepository implements InsertTsRepository<TimescaleTsKvEntity> { |
38 | 38 | ||
39 | private static final String INSERT_OR_UPDATE = | 39 | private static final String INSERT_OR_UPDATE = |
40 | - "INSERT INTO tenant_ts_kv (tenant_id, entity_id, key, ts, bool_v, str_v, long_v, dbl_v, json_v) VALUES(?, ?, ?, ?, ?, ?, ?, ?, cast(? AS json)) " + | ||
41 | - "ON CONFLICT (tenant_id, entity_id, key, ts) DO UPDATE SET bool_v = ?, str_v = ?, long_v = ?, dbl_v = ?, json_v = cast(? AS json);"; | 40 | + "INSERT INTO ts_kv (entity_id, key, ts, bool_v, str_v, long_v, dbl_v, json_v) VALUES(?, ?, ?, ?, ?, ?, ?, cast(? AS json)) " + |
41 | + "ON CONFLICT (entity_id, key, ts) DO UPDATE SET bool_v = ?, str_v = ?, long_v = ?, dbl_v = ?, json_v = cast(? AS json);"; | ||
42 | 42 | ||
43 | @Override | 43 | @Override |
44 | public void saveOrUpdate(List<EntityContainer<TimescaleTsKvEntity>> entities) { | 44 | public void saveOrUpdate(List<EntityContainer<TimescaleTsKvEntity>> entities) { |
@@ -46,41 +46,40 @@ public class TimescaleInsertTsRepository extends AbstractInsertRepository implem | @@ -46,41 +46,40 @@ public class TimescaleInsertTsRepository extends AbstractInsertRepository implem | ||
46 | @Override | 46 | @Override |
47 | public void setValues(PreparedStatement ps, int i) throws SQLException { | 47 | public void setValues(PreparedStatement ps, int i) throws SQLException { |
48 | TimescaleTsKvEntity tsKvEntity = entities.get(i).getEntity(); | 48 | TimescaleTsKvEntity tsKvEntity = entities.get(i).getEntity(); |
49 | - ps.setObject(1, tsKvEntity.getTenantId()); | ||
50 | - ps.setObject(2, tsKvEntity.getEntityId()); | ||
51 | - ps.setInt(3, tsKvEntity.getKey()); | ||
52 | - ps.setLong(4, tsKvEntity.getTs()); | 49 | + ps.setObject(1, tsKvEntity.getEntityId()); |
50 | + ps.setInt(2, tsKvEntity.getKey()); | ||
51 | + ps.setLong(3, tsKvEntity.getTs()); | ||
53 | 52 | ||
54 | if (tsKvEntity.getBooleanValue() != null) { | 53 | if (tsKvEntity.getBooleanValue() != null) { |
55 | - ps.setBoolean(5, tsKvEntity.getBooleanValue()); | ||
56 | - ps.setBoolean(10, tsKvEntity.getBooleanValue()); | 54 | + ps.setBoolean(4, tsKvEntity.getBooleanValue()); |
55 | + ps.setBoolean(9, tsKvEntity.getBooleanValue()); | ||
57 | } else { | 56 | } else { |
58 | - ps.setNull(5, Types.BOOLEAN); | ||
59 | - ps.setNull(10, Types.BOOLEAN); | 57 | + ps.setNull(4, Types.BOOLEAN); |
58 | + ps.setNull(9, Types.BOOLEAN); | ||
60 | } | 59 | } |
61 | 60 | ||
62 | - ps.setString(6, replaceNullChars(tsKvEntity.getStrValue())); | ||
63 | - ps.setString(11, replaceNullChars(tsKvEntity.getStrValue())); | 61 | + ps.setString(5, replaceNullChars(tsKvEntity.getStrValue())); |
62 | + ps.setString(10, replaceNullChars(tsKvEntity.getStrValue())); | ||
64 | 63 | ||
65 | 64 | ||
66 | if (tsKvEntity.getLongValue() != null) { | 65 | if (tsKvEntity.getLongValue() != null) { |
67 | - ps.setLong(7, tsKvEntity.getLongValue()); | ||
68 | - ps.setLong(12, tsKvEntity.getLongValue()); | 66 | + ps.setLong(6, tsKvEntity.getLongValue()); |
67 | + ps.setLong(11, tsKvEntity.getLongValue()); | ||
69 | } else { | 68 | } else { |
70 | - ps.setNull(7, Types.BIGINT); | ||
71 | - ps.setNull(12, Types.BIGINT); | 69 | + ps.setNull(6, Types.BIGINT); |
70 | + ps.setNull(11, Types.BIGINT); | ||
72 | } | 71 | } |
73 | 72 | ||
74 | if (tsKvEntity.getDoubleValue() != null) { | 73 | if (tsKvEntity.getDoubleValue() != null) { |
75 | - ps.setDouble(8, tsKvEntity.getDoubleValue()); | ||
76 | - ps.setDouble(13, tsKvEntity.getDoubleValue()); | 74 | + ps.setDouble(7, tsKvEntity.getDoubleValue()); |
75 | + ps.setDouble(12, tsKvEntity.getDoubleValue()); | ||
77 | } else { | 76 | } else { |
78 | - ps.setNull(8, Types.DOUBLE); | ||
79 | - ps.setNull(13, Types.DOUBLE); | 77 | + ps.setNull(7, Types.DOUBLE); |
78 | + ps.setNull(12, Types.DOUBLE); | ||
80 | } | 79 | } |
81 | 80 | ||
82 | - ps.setString(9, replaceNullChars(tsKvEntity.getJsonValue())); | ||
83 | - ps.setString(14, replaceNullChars(tsKvEntity.getJsonValue())); | 81 | + ps.setString(8, replaceNullChars(tsKvEntity.getJsonValue())); |
82 | + ps.setString(13, replaceNullChars(tsKvEntity.getJsonValue())); | ||
84 | } | 83 | } |
85 | 84 | ||
86 | @Override | 85 | @Override |
@@ -36,7 +36,7 @@ public class AggregationRepository { | @@ -36,7 +36,7 @@ public class AggregationRepository { | ||
36 | public static final String FIND_SUM = "findSum"; | 36 | public static final String FIND_SUM = "findSum"; |
37 | public static final String FIND_COUNT = "findCount"; | 37 | public static final String FIND_COUNT = "findCount"; |
38 | 38 | ||
39 | - public static final String FROM_WHERE_CLAUSE = "FROM tenant_ts_kv tskv WHERE tskv.tenant_id = cast(:tenantId AS uuid) AND tskv.entity_id = cast(:entityId AS uuid) AND tskv.key= cast(:entityKey AS int) AND tskv.ts > :startTs AND tskv.ts <= :endTs GROUP BY tskv.tenant_id, tskv.entity_id, tskv.key, tsBucket ORDER BY tskv.tenant_id, tskv.entity_id, tskv.key, tsBucket"; | 39 | + public static final String FROM_WHERE_CLAUSE = "FROM ts_kv tskv WHERE tskv.entity_id = cast(:entityId AS uuid) AND tskv.key= cast(:entityKey AS int) AND tskv.ts > :startTs AND tskv.ts <= :endTs GROUP BY tskv.entity_id, tskv.key, tsBucket ORDER BY tskv.entity_id, tskv.key, tsBucket"; |
40 | 40 | ||
41 | public static final String FIND_AVG_QUERY = "SELECT time_bucket(:timeBucket, tskv.ts) AS tsBucket, :timeBucket AS interval, SUM(COALESCE(tskv.long_v, 0)) AS longValue, SUM(COALESCE(tskv.dbl_v, 0.0)) AS doubleValue, SUM(CASE WHEN tskv.long_v IS NULL THEN 0 ELSE 1 END) AS longCountValue, SUM(CASE WHEN tskv.dbl_v IS NULL THEN 0 ELSE 1 END) AS doubleCountValue, null AS strValue, 'AVG' AS aggType "; | 41 | public static final String FIND_AVG_QUERY = "SELECT time_bucket(:timeBucket, tskv.ts) AS tsBucket, :timeBucket AS interval, SUM(COALESCE(tskv.long_v, 0)) AS longValue, SUM(COALESCE(tskv.dbl_v, 0.0)) AS doubleValue, SUM(CASE WHEN tskv.long_v IS NULL THEN 0 ELSE 1 END) AS longCountValue, SUM(CASE WHEN tskv.dbl_v IS NULL THEN 0 ELSE 1 END) AS doubleCountValue, null AS strValue, 'AVG' AS aggType "; |
42 | 42 | ||
@@ -52,43 +52,42 @@ public class AggregationRepository { | @@ -52,43 +52,42 @@ public class AggregationRepository { | ||
52 | private EntityManager entityManager; | 52 | private EntityManager entityManager; |
53 | 53 | ||
54 | @Async | 54 | @Async |
55 | - public CompletableFuture<List<TimescaleTsKvEntity>> findAvg(UUID tenantId, UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { | 55 | + public CompletableFuture<List<TimescaleTsKvEntity>> findAvg(UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { |
56 | @SuppressWarnings("unchecked") | 56 | @SuppressWarnings("unchecked") |
57 | - List<TimescaleTsKvEntity> resultList = getResultList(tenantId, entityId, entityKey, timeBucket, startTs, endTs, FIND_AVG); | 57 | + List<TimescaleTsKvEntity> resultList = getResultList(entityId, entityKey, timeBucket, startTs, endTs, FIND_AVG); |
58 | return CompletableFuture.supplyAsync(() -> resultList); | 58 | return CompletableFuture.supplyAsync(() -> resultList); |
59 | } | 59 | } |
60 | 60 | ||
61 | @Async | 61 | @Async |
62 | - public CompletableFuture<List<TimescaleTsKvEntity>> findMax(UUID tenantId, UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { | 62 | + public CompletableFuture<List<TimescaleTsKvEntity>> findMax(UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { |
63 | @SuppressWarnings("unchecked") | 63 | @SuppressWarnings("unchecked") |
64 | - List<TimescaleTsKvEntity> resultList = getResultList(tenantId, entityId, entityKey, timeBucket, startTs, endTs, FIND_MAX); | 64 | + List<TimescaleTsKvEntity> resultList = getResultList(entityId, entityKey, timeBucket, startTs, endTs, FIND_MAX); |
65 | return CompletableFuture.supplyAsync(() -> resultList); | 65 | return CompletableFuture.supplyAsync(() -> resultList); |
66 | } | 66 | } |
67 | 67 | ||
68 | @Async | 68 | @Async |
69 | - public CompletableFuture<List<TimescaleTsKvEntity>> findMin(UUID tenantId, UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { | 69 | + public CompletableFuture<List<TimescaleTsKvEntity>> findMin(UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { |
70 | @SuppressWarnings("unchecked") | 70 | @SuppressWarnings("unchecked") |
71 | - List<TimescaleTsKvEntity> resultList = getResultList(tenantId, entityId, entityKey, timeBucket, startTs, endTs, FIND_MIN); | 71 | + List<TimescaleTsKvEntity> resultList = getResultList(entityId, entityKey, timeBucket, startTs, endTs, FIND_MIN); |
72 | return CompletableFuture.supplyAsync(() -> resultList); | 72 | return CompletableFuture.supplyAsync(() -> resultList); |
73 | } | 73 | } |
74 | 74 | ||
75 | @Async | 75 | @Async |
76 | - public CompletableFuture<List<TimescaleTsKvEntity>> findSum(UUID tenantId, UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { | 76 | + public CompletableFuture<List<TimescaleTsKvEntity>> findSum(UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { |
77 | @SuppressWarnings("unchecked") | 77 | @SuppressWarnings("unchecked") |
78 | - List<TimescaleTsKvEntity> resultList = getResultList(tenantId, entityId, entityKey, timeBucket, startTs, endTs, FIND_SUM); | 78 | + List<TimescaleTsKvEntity> resultList = getResultList(entityId, entityKey, timeBucket, startTs, endTs, FIND_SUM); |
79 | return CompletableFuture.supplyAsync(() -> resultList); | 79 | return CompletableFuture.supplyAsync(() -> resultList); |
80 | } | 80 | } |
81 | 81 | ||
82 | @Async | 82 | @Async |
83 | - public CompletableFuture<List<TimescaleTsKvEntity>> findCount(UUID tenantId, UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { | 83 | + public CompletableFuture<List<TimescaleTsKvEntity>> findCount(UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { |
84 | @SuppressWarnings("unchecked") | 84 | @SuppressWarnings("unchecked") |
85 | - List<TimescaleTsKvEntity> resultList = getResultList(tenantId, entityId, entityKey, timeBucket, startTs, endTs, FIND_COUNT); | 85 | + List<TimescaleTsKvEntity> resultList = getResultList(entityId, entityKey, timeBucket, startTs, endTs, FIND_COUNT); |
86 | return CompletableFuture.supplyAsync(() -> resultList); | 86 | return CompletableFuture.supplyAsync(() -> resultList); |
87 | } | 87 | } |
88 | 88 | ||
89 | - private List getResultList(UUID tenantId, UUID entityId, int entityKey, long timeBucket, long startTs, long endTs, String query) { | 89 | + private List getResultList(UUID entityId, int entityKey, long timeBucket, long startTs, long endTs, String query) { |
90 | return entityManager.createNamedQuery(query) | 90 | return entityManager.createNamedQuery(query) |
91 | - .setParameter("tenantId", tenantId) | ||
92 | .setParameter("entityId", entityId) | 91 | .setParameter("entityId", entityId) |
93 | .setParameter("entityKey", entityKey) | 92 | .setParameter("entityKey", entityKey) |
94 | .setParameter("timeBucket", timeBucket) | 93 | .setParameter("timeBucket", timeBucket) |
@@ -88,24 +88,23 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | @@ -88,24 +88,23 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | ||
88 | } | 88 | } |
89 | 89 | ||
90 | @Override | 90 | @Override |
91 | - protected ListenableFuture<List<TsKvEntry>> findAllAsync(TenantId tenantId, EntityId entityId, ReadTsKvQuery query) { | 91 | + protected ListenableFuture<List<TsKvEntry>> findAllAsync(EntityId entityId, ReadTsKvQuery query) { |
92 | if (query.getAggregation() == Aggregation.NONE) { | 92 | if (query.getAggregation() == Aggregation.NONE) { |
93 | - return findAllAsyncWithLimit(tenantId, entityId, query); | 93 | + return findAllAsyncWithLimit(entityId, query); |
94 | } else { | 94 | } else { |
95 | long startTs = query.getStartTs(); | 95 | long startTs = query.getStartTs(); |
96 | long endTs = query.getEndTs(); | 96 | long endTs = query.getEndTs(); |
97 | long timeBucket = query.getInterval(); | 97 | long timeBucket = query.getInterval(); |
98 | - ListenableFuture<List<Optional<TsKvEntry>>> future = findAllAndAggregateAsync(tenantId, entityId, query.getKey(), startTs, endTs, timeBucket, query.getAggregation()); | 98 | + ListenableFuture<List<Optional<TsKvEntry>>> future = findAllAndAggregateAsync(entityId, query.getKey(), startTs, endTs, timeBucket, query.getAggregation()); |
99 | return getTskvEntriesFuture(future); | 99 | return getTskvEntriesFuture(future); |
100 | } | 100 | } |
101 | } | 101 | } |
102 | 102 | ||
103 | @Override | 103 | @Override |
104 | - protected ListenableFuture<List<TsKvEntry>> findAllAsyncWithLimit(TenantId tenantId, EntityId entityId, ReadTsKvQuery query) { | 104 | + protected ListenableFuture<List<TsKvEntry>> findAllAsyncWithLimit(EntityId entityId, ReadTsKvQuery query) { |
105 | String strKey = query.getKey(); | 105 | String strKey = query.getKey(); |
106 | Integer keyId = getOrSaveKeyId(strKey); | 106 | Integer keyId = getOrSaveKeyId(strKey); |
107 | List<TimescaleTsKvEntity> timescaleTsKvEntities = tsKvRepository.findAllWithLimit( | 107 | List<TimescaleTsKvEntity> timescaleTsKvEntities = tsKvRepository.findAllWithLimit( |
108 | - tenantId.getId(), | ||
109 | entityId.getId(), | 108 | entityId.getId(), |
110 | keyId, | 109 | keyId, |
111 | query.getStartTs(), | 110 | query.getStartTs(), |
@@ -117,8 +116,8 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | @@ -117,8 +116,8 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | ||
117 | return Futures.immediateFuture(DaoUtil.convertDataList(timescaleTsKvEntities)); | 116 | return Futures.immediateFuture(DaoUtil.convertDataList(timescaleTsKvEntities)); |
118 | } | 117 | } |
119 | 118 | ||
120 | - private ListenableFuture<List<Optional<TsKvEntry>>> findAllAndAggregateAsync(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, long timeBucket, Aggregation aggregation) { | ||
121 | - CompletableFuture<List<TimescaleTsKvEntity>> listCompletableFuture = switchAggregation(key, startTs, endTs, timeBucket, aggregation, entityId.getId(), tenantId.getId()); | 119 | + private ListenableFuture<List<Optional<TsKvEntry>>> findAllAndAggregateAsync(EntityId entityId, String key, long startTs, long endTs, long timeBucket, Aggregation aggregation) { |
120 | + CompletableFuture<List<TimescaleTsKvEntity>> listCompletableFuture = switchAggregation(key, startTs, endTs, timeBucket, aggregation, entityId.getId()); | ||
122 | SettableFuture<List<TimescaleTsKvEntity>> listenableFuture = SettableFuture.create(); | 121 | SettableFuture<List<TimescaleTsKvEntity>> listenableFuture = SettableFuture.create(); |
123 | listCompletableFuture.whenComplete((timescaleTsKvEntities, throwable) -> { | 122 | listCompletableFuture.whenComplete((timescaleTsKvEntities, throwable) -> { |
124 | if (throwable != null) { | 123 | if (throwable != null) { |
@@ -133,7 +132,6 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | @@ -133,7 +132,6 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | ||
133 | timescaleTsKvEntities.forEach(entity -> { | 132 | timescaleTsKvEntities.forEach(entity -> { |
134 | if (entity != null && entity.isNotEmpty()) { | 133 | if (entity != null && entity.isNotEmpty()) { |
135 | entity.setEntityId(entityId.getId()); | 134 | entity.setEntityId(entityId.getId()); |
136 | - entity.setTenantId(tenantId.getId()); | ||
137 | entity.setStrKey(key); | 135 | entity.setStrKey(key); |
138 | result.add(Optional.of(DaoUtil.getData(entity))); | 136 | result.add(Optional.of(DaoUtil.getData(entity))); |
139 | } else { | 137 | } else { |
@@ -167,7 +165,6 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | @@ -167,7 +165,6 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | ||
167 | String strKey = tsKvEntry.getKey(); | 165 | String strKey = tsKvEntry.getKey(); |
168 | Integer keyId = getOrSaveKeyId(strKey); | 166 | Integer keyId = getOrSaveKeyId(strKey); |
169 | TimescaleTsKvEntity entity = new TimescaleTsKvEntity(); | 167 | TimescaleTsKvEntity entity = new TimescaleTsKvEntity(); |
170 | - entity.setTenantId(tenantId.getId()); | ||
171 | entity.setEntityId(entityId.getId()); | 168 | entity.setEntityId(entityId.getId()); |
172 | entity.setTs(tsKvEntry.getTs()); | 169 | entity.setTs(tsKvEntry.getTs()); |
173 | entity.setKey(keyId); | 170 | entity.setKey(keyId); |
@@ -197,7 +194,6 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | @@ -197,7 +194,6 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | ||
197 | Integer keyId = getOrSaveKeyId(strKey); | 194 | Integer keyId = getOrSaveKeyId(strKey); |
198 | return service.submit(() -> { | 195 | return service.submit(() -> { |
199 | tsKvRepository.delete( | 196 | tsKvRepository.delete( |
200 | - tenantId.getId(), | ||
201 | entityId.getId(), | 197 | entityId.getId(), |
202 | keyId, | 198 | keyId, |
203 | query.getStartTs(), | 199 | query.getStartTs(), |
@@ -208,7 +204,7 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | @@ -208,7 +204,7 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | ||
208 | 204 | ||
209 | @Override | 205 | @Override |
210 | public ListenableFuture<Void> removeLatest(TenantId tenantId, EntityId entityId, DeleteTsKvQuery query) { | 206 | public ListenableFuture<Void> removeLatest(TenantId tenantId, EntityId entityId, DeleteTsKvQuery query) { |
211 | - return getRemoveLatestFuture(tenantId, entityId, query); | 207 | + return getRemoveLatestFuture(entityId, query); |
212 | } | 208 | } |
213 | 209 | ||
214 | @Override | 210 | @Override |
@@ -216,27 +212,26 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | @@ -216,27 +212,26 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | ||
216 | return service.submit(() -> null); | 212 | return service.submit(() -> null); |
217 | } | 213 | } |
218 | 214 | ||
219 | - private CompletableFuture<List<TimescaleTsKvEntity>> switchAggregation(String key, long startTs, long endTs, long timeBucket, Aggregation aggregation, UUID entityId, UUID tenantId) { | 215 | + private CompletableFuture<List<TimescaleTsKvEntity>> switchAggregation(String key, long startTs, long endTs, long timeBucket, Aggregation aggregation, UUID entityId) { |
220 | switch (aggregation) { | 216 | switch (aggregation) { |
221 | case AVG: | 217 | case AVG: |
222 | - return findAvg(key, startTs, endTs, timeBucket, entityId, tenantId); | 218 | + return findAvg(key, startTs, endTs, timeBucket, entityId); |
223 | case MAX: | 219 | case MAX: |
224 | - return findMax(key, startTs, endTs, timeBucket, entityId, tenantId); | 220 | + return findMax(key, startTs, endTs, timeBucket, entityId); |
225 | case MIN: | 221 | case MIN: |
226 | - return findMin(key, startTs, endTs, timeBucket, entityId, tenantId); | 222 | + return findMin(key, startTs, endTs, timeBucket, entityId); |
227 | case SUM: | 223 | case SUM: |
228 | - return findSum(key, startTs, endTs, timeBucket, entityId, tenantId); | 224 | + return findSum(key, startTs, endTs, timeBucket, entityId); |
229 | case COUNT: | 225 | case COUNT: |
230 | - return findCount(key, startTs, endTs, timeBucket, entityId, tenantId); | 226 | + return findCount(key, startTs, endTs, timeBucket, entityId); |
231 | default: | 227 | default: |
232 | throw new IllegalArgumentException("Not supported aggregation type: " + aggregation); | 228 | throw new IllegalArgumentException("Not supported aggregation type: " + aggregation); |
233 | } | 229 | } |
234 | } | 230 | } |
235 | 231 | ||
236 | - private CompletableFuture<List<TimescaleTsKvEntity>> findCount(String key, long startTs, long endTs, long timeBucket, UUID entityId, UUID tenantId) { | 232 | + private CompletableFuture<List<TimescaleTsKvEntity>> findCount(String key, long startTs, long endTs, long timeBucket, UUID entityId) { |
237 | Integer keyId = getOrSaveKeyId(key); | 233 | Integer keyId = getOrSaveKeyId(key); |
238 | return aggregationRepository.findCount( | 234 | return aggregationRepository.findCount( |
239 | - tenantId, | ||
240 | entityId, | 235 | entityId, |
241 | keyId, | 236 | keyId, |
242 | timeBucket, | 237 | timeBucket, |
@@ -244,10 +239,9 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | @@ -244,10 +239,9 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | ||
244 | endTs); | 239 | endTs); |
245 | } | 240 | } |
246 | 241 | ||
247 | - private CompletableFuture<List<TimescaleTsKvEntity>> findSum(String key, long startTs, long endTs, long timeBucket, UUID entityId, UUID tenantId) { | 242 | + private CompletableFuture<List<TimescaleTsKvEntity>> findSum(String key, long startTs, long endTs, long timeBucket, UUID entityId) { |
248 | Integer keyId = getOrSaveKeyId(key); | 243 | Integer keyId = getOrSaveKeyId(key); |
249 | return aggregationRepository.findSum( | 244 | return aggregationRepository.findSum( |
250 | - tenantId, | ||
251 | entityId, | 245 | entityId, |
252 | keyId, | 246 | keyId, |
253 | timeBucket, | 247 | timeBucket, |
@@ -255,10 +249,9 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | @@ -255,10 +249,9 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | ||
255 | endTs); | 249 | endTs); |
256 | } | 250 | } |
257 | 251 | ||
258 | - private CompletableFuture<List<TimescaleTsKvEntity>> findMin(String key, long startTs, long endTs, long timeBucket, UUID entityId, UUID tenantId) { | 252 | + private CompletableFuture<List<TimescaleTsKvEntity>> findMin(String key, long startTs, long endTs, long timeBucket, UUID entityId) { |
259 | Integer keyId = getOrSaveKeyId(key); | 253 | Integer keyId = getOrSaveKeyId(key); |
260 | return aggregationRepository.findMin( | 254 | return aggregationRepository.findMin( |
261 | - tenantId, | ||
262 | entityId, | 255 | entityId, |
263 | keyId, | 256 | keyId, |
264 | timeBucket, | 257 | timeBucket, |
@@ -266,10 +259,9 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | @@ -266,10 +259,9 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | ||
266 | endTs); | 259 | endTs); |
267 | } | 260 | } |
268 | 261 | ||
269 | - private CompletableFuture<List<TimescaleTsKvEntity>> findMax(String key, long startTs, long endTs, long timeBucket, UUID entityId, UUID tenantId) { | 262 | + private CompletableFuture<List<TimescaleTsKvEntity>> findMax(String key, long startTs, long endTs, long timeBucket, UUID entityId) { |
270 | Integer keyId = getOrSaveKeyId(key); | 263 | Integer keyId = getOrSaveKeyId(key); |
271 | return aggregationRepository.findMax( | 264 | return aggregationRepository.findMax( |
272 | - tenantId, | ||
273 | entityId, | 265 | entityId, |
274 | keyId, | 266 | keyId, |
275 | timeBucket, | 267 | timeBucket, |
@@ -277,10 +269,9 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | @@ -277,10 +269,9 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements | ||
277 | endTs); | 269 | endTs); |
278 | } | 270 | } |
279 | 271 | ||
280 | - private CompletableFuture<List<TimescaleTsKvEntity>> findAvg(String key, long startTs, long endTs, long timeBucket, UUID entityId, UUID tenantId) { | 272 | + private CompletableFuture<List<TimescaleTsKvEntity>> findAvg(String key, long startTs, long endTs, long timeBucket, UUID entityId) { |
281 | Integer keyId = getOrSaveKeyId(key); | 273 | Integer keyId = getOrSaveKeyId(key); |
282 | return aggregationRepository.findAvg( | 274 | return aggregationRepository.findAvg( |
283 | - tenantId, | ||
284 | entityId, | 275 | entityId, |
285 | keyId, | 276 | keyId, |
286 | timeBucket, | 277 | timeBucket, |
@@ -31,12 +31,10 @@ import java.util.UUID; | @@ -31,12 +31,10 @@ import java.util.UUID; | ||
31 | @TimescaleDBTsDao | 31 | @TimescaleDBTsDao |
32 | public interface TsKvTimescaleRepository extends CrudRepository<TimescaleTsKvEntity, TimescaleTsKvCompositeKey> { | 32 | public interface TsKvTimescaleRepository extends CrudRepository<TimescaleTsKvEntity, TimescaleTsKvCompositeKey> { |
33 | 33 | ||
34 | - @Query("SELECT tskv FROM TimescaleTsKvEntity tskv WHERE tskv.tenantId = :tenantId " + | ||
35 | - "AND tskv.entityId = :entityId " + | 34 | + @Query("SELECT tskv FROM TimescaleTsKvEntity tskv WHERE tskv.entityId = :entityId " + |
36 | "AND tskv.key = :entityKey " + | 35 | "AND tskv.key = :entityKey " + |
37 | "AND tskv.ts > :startTs AND tskv.ts <= :endTs") | 36 | "AND tskv.ts > :startTs AND tskv.ts <= :endTs") |
38 | List<TimescaleTsKvEntity> findAllWithLimit( | 37 | List<TimescaleTsKvEntity> findAllWithLimit( |
39 | - @Param("tenantId") UUID tenantId, | ||
40 | @Param("entityId") UUID entityId, | 38 | @Param("entityId") UUID entityId, |
41 | @Param("entityKey") int key, | 39 | @Param("entityKey") int key, |
42 | @Param("startTs") long startTs, | 40 | @Param("startTs") long startTs, |
@@ -44,12 +42,10 @@ public interface TsKvTimescaleRepository extends CrudRepository<TimescaleTsKvEnt | @@ -44,12 +42,10 @@ public interface TsKvTimescaleRepository extends CrudRepository<TimescaleTsKvEnt | ||
44 | 42 | ||
45 | @Transactional | 43 | @Transactional |
46 | @Modifying | 44 | @Modifying |
47 | - @Query("DELETE FROM TimescaleTsKvEntity tskv WHERE tskv.tenantId = :tenantId " + | ||
48 | - "AND tskv.entityId = :entityId " + | 45 | + @Query("DELETE FROM TimescaleTsKvEntity tskv WHERE tskv.entityId = :entityId " + |
49 | "AND tskv.key = :entityKey " + | 46 | "AND tskv.key = :entityKey " + |
50 | "AND tskv.ts > :startTs AND tskv.ts <= :endTs") | 47 | "AND tskv.ts > :startTs AND tskv.ts <= :endTs") |
51 | - void delete(@Param("tenantId") UUID tenantId, | ||
52 | - @Param("entityId") UUID entityId, | 48 | + void delete(@Param("entityId") UUID entityId, |
53 | @Param("entityKey") int key, | 49 | @Param("entityKey") int key, |
54 | @Param("startTs") long startTs, | 50 | @Param("startTs") long startTs, |
55 | @Param("endTs") long endTs); | 51 | @Param("endTs") long endTs); |
dao/src/main/resources/sql/schema-timescale-idx.sql
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 | - | ||
17 | -CREATE INDEX IF NOT EXISTS idx_tenant_ts_kv ON tenant_ts_kv(tenant_id, entity_id, key, ts); |
@@ -16,8 +16,7 @@ | @@ -16,8 +16,7 @@ | ||
16 | 16 | ||
17 | CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE; | 17 | CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE; |
18 | 18 | ||
19 | -CREATE TABLE IF NOT EXISTS tenant_ts_kv ( | ||
20 | - tenant_id uuid NOT NULL, | 19 | +CREATE TABLE IF NOT EXISTS ts_kv ( |
21 | entity_id uuid NOT NULL, | 20 | entity_id uuid NOT NULL, |
22 | key int NOT NULL, | 21 | key int NOT NULL, |
23 | ts bigint NOT NULL, | 22 | ts bigint NOT NULL, |
@@ -26,7 +25,7 @@ CREATE TABLE IF NOT EXISTS tenant_ts_kv ( | @@ -26,7 +25,7 @@ CREATE TABLE IF NOT EXISTS tenant_ts_kv ( | ||
26 | long_v bigint, | 25 | long_v bigint, |
27 | dbl_v double precision, | 26 | dbl_v double precision, |
28 | json_v json, | 27 | json_v json, |
29 | - CONSTRAINT tenant_ts_kv_pkey PRIMARY KEY (tenant_id, entity_id, key, ts) | 28 | + CONSTRAINT ts_kv_pkey PRIMARY KEY (entity_id, key, ts) |
30 | ); | 29 | ); |
31 | 30 | ||
32 | CREATE TABLE IF NOT EXISTS ts_kv_dictionary ( | 31 | CREATE TABLE IF NOT EXISTS ts_kv_dictionary ( |
@@ -44,7 +44,7 @@ public class SqlDaoServiceTestSuite { | @@ -44,7 +44,7 @@ public class SqlDaoServiceTestSuite { | ||
44 | 44 | ||
45 | // @ClassRule | 45 | // @ClassRule |
46 | // public static CustomSqlUnit sqlUnit = new CustomSqlUnit( | 46 | // public static CustomSqlUnit sqlUnit = new CustomSqlUnit( |
47 | -// Arrays.asList("sql/schema-timescale.sql", "sql/schema-timescale-idx.sql", "sql/schema-entities.sql", "sql/schema-entities-idx.sql", "sql/system-data.sql", "sql/system-test.sql"), | 47 | +// Arrays.asList("sql/schema-timescale.sql", "sql/schema-entities.sql", "sql/schema-entities-idx.sql", "sql/system-data.sql", "sql/system-test.sql"), |
48 | // "sql/timescale/drop-all-tables.sql", | 48 | // "sql/timescale/drop-all-tables.sql", |
49 | // "sql-test.properties" | 49 | // "sql-test.properties" |
50 | // ); | 50 | // ); |
@@ -12,7 +12,7 @@ DROP TABLE IF EXISTS event; | @@ -12,7 +12,7 @@ DROP TABLE IF EXISTS event; | ||
12 | DROP TABLE IF EXISTS relation; | 12 | DROP TABLE IF EXISTS relation; |
13 | DROP TABLE IF EXISTS tb_user; | 13 | DROP TABLE IF EXISTS tb_user; |
14 | DROP TABLE IF EXISTS tenant; | 14 | DROP TABLE IF EXISTS tenant; |
15 | -DROP TABLE IF EXISTS tenant_ts_kv; | 15 | +DROP TABLE IF EXISTS ts_kv; |
16 | DROP TABLE IF EXISTS ts_kv_latest; | 16 | DROP TABLE IF EXISTS ts_kv_latest; |
17 | DROP TABLE IF EXISTS user_credentials; | 17 | DROP TABLE IF EXISTS user_credentials; |
18 | DROP TABLE IF EXISTS widget_type; | 18 | DROP TABLE IF EXISTS widget_type; |