Commit 188c3e5b636e981cc3534c74bd27fdaaf6173fcd

Authored by ShvaykaD
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;
@@ -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));
@@ -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);
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;