Showing
98 changed files
with
1060 additions
and
660 deletions
Too many changes to show.
To preserve performance only 98 of 130 files are displayed.
... | ... | @@ -22,37 +22,37 @@ BEGIN |
22 | 22 | END; |
23 | 23 | $$ LANGUAGE plpgsql; |
24 | 24 | |
25 | -CREATE OR REPLACE FUNCTION delete_device_records_from_ts_kv(tenant_id varchar, customer_id varchar, ttl bigint, | |
25 | +CREATE OR REPLACE FUNCTION delete_device_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint, | |
26 | 26 | OUT deleted bigint) AS |
27 | 27 | $$ |
28 | 28 | BEGIN |
29 | 29 | EXECUTE format( |
30 | - 'WITH deleted AS (DELETE FROM ts_kv WHERE entity_id IN (SELECT to_uuid(device.id) as entity_id FROM device WHERE tenant_id = %L and customer_id = %L) AND ts < %L::bigint RETURNING *) SELECT count(*) FROM deleted', | |
30 | + 'WITH deleted AS (DELETE FROM ts_kv WHERE entity_id IN (SELECT device.id as entity_id FROM device WHERE tenant_id = %L and customer_id = %L) AND ts < %L::bigint RETURNING *) SELECT count(*) FROM deleted', | |
31 | 31 | tenant_id, customer_id, ttl) into deleted; |
32 | 32 | END; |
33 | 33 | $$ LANGUAGE plpgsql; |
34 | 34 | |
35 | -CREATE OR REPLACE FUNCTION delete_asset_records_from_ts_kv(tenant_id varchar, customer_id varchar, ttl bigint, | |
35 | +CREATE OR REPLACE FUNCTION delete_asset_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint, | |
36 | 36 | OUT deleted bigint) AS |
37 | 37 | $$ |
38 | 38 | BEGIN |
39 | 39 | EXECUTE format( |
40 | - 'WITH deleted AS (DELETE FROM ts_kv WHERE entity_id IN (SELECT to_uuid(asset.id) as entity_id FROM asset WHERE tenant_id = %L and customer_id = %L) AND ts < %L::bigint RETURNING *) SELECT count(*) FROM deleted', | |
40 | + 'WITH deleted AS (DELETE FROM ts_kv WHERE entity_id IN (SELECT asset.id as entity_id FROM asset WHERE tenant_id = %L and customer_id = %L) AND ts < %L::bigint RETURNING *) SELECT count(*) FROM deleted', | |
41 | 41 | tenant_id, customer_id, ttl) into deleted; |
42 | 42 | END; |
43 | 43 | $$ LANGUAGE plpgsql; |
44 | 44 | |
45 | -CREATE OR REPLACE FUNCTION delete_customer_records_from_ts_kv(tenant_id varchar, customer_id varchar, ttl bigint, | |
45 | +CREATE OR REPLACE FUNCTION delete_customer_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint, | |
46 | 46 | OUT deleted bigint) AS |
47 | 47 | $$ |
48 | 48 | BEGIN |
49 | 49 | EXECUTE format( |
50 | - 'WITH deleted AS (DELETE FROM ts_kv WHERE entity_id IN (SELECT to_uuid(customer.id) as entity_id FROM customer WHERE tenant_id = %L and id = %L) AND ts < %L::bigint RETURNING *) SELECT count(*) FROM deleted', | |
50 | + 'WITH deleted AS (DELETE FROM ts_kv WHERE entity_id IN (SELECT customer.id as entity_id FROM customer WHERE tenant_id = %L and id = %L) AND ts < %L::bigint RETURNING *) SELECT count(*) FROM deleted', | |
51 | 51 | tenant_id, customer_id, ttl) into deleted; |
52 | 52 | END; |
53 | 53 | $$ LANGUAGE plpgsql; |
54 | 54 | |
55 | -CREATE OR REPLACE PROCEDURE cleanup_timeseries_by_ttl(IN null_uuid varchar(31), | |
55 | +CREATE OR REPLACE PROCEDURE cleanup_timeseries_by_ttl(IN null_uuid uuid, | |
56 | 56 | IN system_ttl bigint, INOUT deleted bigint) |
57 | 57 | LANGUAGE plpgsql AS |
58 | 58 | $$ | ... | ... |
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 OR REPLACE FUNCTION extract_ts(uuid UUID) RETURNS BIGINT AS | |
18 | +$$ | |
19 | +DECLARE | |
20 | + bytes bytea; | |
21 | +BEGIN | |
22 | + bytes := uuid_send(uuid); | |
23 | + RETURN | |
24 | + ( | |
25 | + ( | |
26 | + (get_byte(bytes, 0)::bigint << 24) | | |
27 | + (get_byte(bytes, 1)::bigint << 16) | | |
28 | + (get_byte(bytes, 2)::bigint << 8) | | |
29 | + (get_byte(bytes, 3)::bigint << 0) | |
30 | + ) + ( | |
31 | + ((get_byte(bytes, 4)::bigint << 8 | | |
32 | + get_byte(bytes, 5)::bigint)) << 32 | |
33 | + ) + ( | |
34 | + (((get_byte(bytes, 6)::bigint & 15) << 8 | get_byte(bytes, 7)::bigint) & 4095) << 48 | |
35 | + ) - 122192928000000000 | |
36 | + ) / 10000::double precision | |
37 | + ; | |
38 | +END | |
39 | +$$ LANGUAGE plpgsql | |
40 | + IMMUTABLE PARALLEL SAFE | |
41 | + RETURNS NULL ON NULL INPUT; | ... | ... |
... | ... | @@ -15,10 +15,14 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.service.subscription; |
17 | 17 | |
18 | +import com.google.common.util.concurrent.FutureCallback; | |
18 | 19 | import com.google.common.util.concurrent.Futures; |
19 | 20 | import com.google.common.util.concurrent.ListenableFuture; |
21 | +import com.google.common.util.concurrent.MoreExecutors; | |
20 | 22 | import lombok.extern.slf4j.Slf4j; |
23 | +import org.checkerframework.checker.nullness.qual.Nullable; | |
21 | 24 | import org.springframework.beans.factory.annotation.Autowired; |
25 | +import org.springframework.beans.factory.annotation.Value; | |
22 | 26 | import org.springframework.context.annotation.Lazy; |
23 | 27 | import org.springframework.context.event.EventListener; |
24 | 28 | import org.springframework.stereotype.Service; |
... | ... | @@ -33,6 +37,8 @@ import org.thingsboard.server.common.data.kv.TsKvEntry; |
33 | 37 | import org.thingsboard.server.common.data.page.PageData; |
34 | 38 | import org.thingsboard.server.common.data.query.EntityData; |
35 | 39 | import org.thingsboard.server.common.data.query.EntityDataQuery; |
40 | +import org.thingsboard.server.common.data.query.EntityKey; | |
41 | +import org.thingsboard.server.common.data.query.EntityKeyType; | |
36 | 42 | import org.thingsboard.server.common.data.query.TsValue; |
37 | 43 | import org.thingsboard.server.common.msg.queue.ServiceType; |
38 | 44 | import org.thingsboard.server.common.msg.queue.TbCallback; |
... | ... | @@ -53,6 +59,7 @@ import org.thingsboard.server.service.telemetry.cmd.v2.EntityDataUpdate; |
53 | 59 | import org.thingsboard.server.service.telemetry.cmd.v2.EntityHistoryCmd; |
54 | 60 | import org.thingsboard.server.service.telemetry.cmd.v2.LatestValueCmd; |
55 | 61 | import org.thingsboard.server.service.telemetry.cmd.v2.TimeSeriesCmd; |
62 | +import org.thingsboard.server.service.telemetry.sub.SubscriptionErrorCode; | |
56 | 63 | import org.thingsboard.server.service.telemetry.sub.SubscriptionUpdate; |
57 | 64 | |
58 | 65 | import javax.annotation.PostConstruct; |
... | ... | @@ -60,6 +67,7 @@ import javax.annotation.PreDestroy; |
60 | 67 | import java.util.ArrayList; |
61 | 68 | import java.util.HashMap; |
62 | 69 | import java.util.LinkedHashMap; |
70 | +import java.util.LinkedHashSet; | |
63 | 71 | import java.util.List; |
64 | 72 | import java.util.Map; |
65 | 73 | import java.util.Set; |
... | ... | @@ -67,7 +75,6 @@ import java.util.concurrent.ConcurrentHashMap; |
67 | 75 | import java.util.concurrent.ExecutionException; |
68 | 76 | import java.util.concurrent.ExecutorService; |
69 | 77 | import java.util.concurrent.Executors; |
70 | -import java.util.function.Function; | |
71 | 78 | import java.util.stream.Collectors; |
72 | 79 | |
73 | 80 | @Slf4j |
... | ... | @@ -101,11 +108,16 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc |
101 | 108 | @Autowired |
102 | 109 | private TimeseriesService tsService; |
103 | 110 | |
111 | + @Value("${database.ts.type}") | |
112 | + private String databaseTsType; | |
113 | + | |
104 | 114 | private ExecutorService wsCallBackExecutor; |
115 | + private boolean tsInSqlDB; | |
105 | 116 | |
106 | 117 | @PostConstruct |
107 | 118 | public void initExecutor() { |
108 | 119 | wsCallBackExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("ws-entity-sub-callback")); |
120 | + tsInSqlDB = databaseTsType.equalsIgnoreCase("sql") || databaseTsType.equalsIgnoreCase("timescale"); | |
109 | 121 | } |
110 | 122 | |
111 | 123 | @PreDestroy |
... | ... | @@ -156,7 +168,70 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc |
156 | 168 | } |
157 | 169 | |
158 | 170 | private void handleLatestCmd(TelemetryWebSocketSessionRef session, int cmdId, EntityDataQuery query, LatestValueCmd latestCmd) { |
171 | + TenantId tenantId = session.getSecurityCtx().getTenantId(); | |
172 | + CustomerId customerId = session.getSecurityCtx().getCustomerId(); | |
173 | + //Step 1. Update existing query with the contents of LatestValueCmd | |
174 | + latestCmd.getKeys().forEach(key -> { | |
175 | + if (!query.getLatestValues().contains(key)) { | |
176 | + query.getLatestValues().add(key); | |
177 | + } | |
178 | + }); | |
179 | + | |
180 | + //Step 2. Fetch the initial data | |
181 | + PageData<EntityData> data = entityService.findEntityDataByQuery(tenantId, customerId, query); | |
182 | + | |
183 | + //Step 3. Fetch the latest values for telemetry keys (in case they are not copied from NoSQL to SQL DB in hybrid mode. | |
184 | + if (!tsInSqlDB) { | |
185 | + List<String> allTsKeys = latestCmd.getKeys().stream() | |
186 | + .filter(key -> key.getType().equals(EntityKeyType.TIME_SERIES)) | |
187 | + .map(EntityKey::getKey).collect(Collectors.toList()); | |
188 | + | |
189 | + Map<EntityData, ListenableFuture<Map<String, TsValue>>> missingTelemetryFurutes = new HashMap<>(); | |
190 | + for (EntityData entityData : data.getData()) { | |
191 | + Map<EntityKeyType, Map<String, TsValue>> latestEntityData = entityData.getLatest(); | |
192 | + Map<String, TsValue> tsEntityData = latestEntityData.get(EntityKeyType.TIME_SERIES); | |
193 | + Set<String> missingTsKeys = new LinkedHashSet<>(allTsKeys); | |
194 | + if (tsEntityData != null) { | |
195 | + missingTsKeys.removeAll(tsEntityData.keySet()); | |
196 | + } else { | |
197 | + tsEntityData = new HashMap<>(); | |
198 | + latestEntityData.put(EntityKeyType.TIME_SERIES, tsEntityData); | |
199 | + } | |
200 | + | |
201 | + ListenableFuture<List<TsKvEntry>> missingTsData = tsService.findLatest(tenantId, entityData.getEntityId(), missingTsKeys); | |
202 | + missingTelemetryFurutes.put(entityData, Futures.transform(missingTsData, this::toTsValue, MoreExecutors.directExecutor())); | |
203 | + } | |
204 | + Futures.addCallback(Futures.allAsList(missingTelemetryFurutes.values()), new FutureCallback<List<Map<String, TsValue>>>() { | |
205 | + @Override | |
206 | + public void onSuccess(@Nullable List<Map<String, TsValue>> result) { | |
207 | + missingTelemetryFurutes.forEach((key, value) -> { | |
208 | + try { | |
209 | + key.getLatest().get(EntityKeyType.TIME_SERIES).putAll(value.get()); | |
210 | + } catch (InterruptedException | ExecutionException e) { | |
211 | + log.warn("[{}][{}] Failed to lookup latest telemetry: {}:{}", session.getSessionId(), cmdId, key.getEntityId(), allTsKeys, e); | |
212 | + } | |
213 | + }); | |
214 | + EntityDataUpdate update = new EntityDataUpdate(cmdId, data, null); | |
215 | + wsService.sendWsMsg(session.getSessionId(), update); | |
216 | + //TODO: create context for this (session, cmdId) that contains query, latestCmd and update. Subscribe + periodic updates. | |
217 | + } | |
218 | + | |
219 | + @Override | |
220 | + public void onFailure(Throwable t) { | |
221 | + log.warn("[{}][{}] Failed to process websocket command: {}:{}", session.getSessionId(), cmdId, query, latestCmd, t); | |
222 | + wsService.sendWsMsg(session.getSessionId(), | |
223 | + new EntityDataUpdate(cmdId, SubscriptionErrorCode.INTERNAL_ERROR.getCode(), "Failed to process websocket command!")); | |
224 | + } | |
225 | + }, wsCallBackExecutor); | |
226 | + } else { | |
227 | + EntityDataUpdate update = new EntityDataUpdate(cmdId, data, null); | |
228 | + wsService.sendWsMsg(session.getSessionId(), update); | |
229 | + //TODO: create context for this (session, cmdId) that contains query, latestCmd and update. Subscribe + periodic updates. | |
230 | + } | |
231 | + } | |
159 | 232 | |
233 | + private Map<String, TsValue> toTsValue(List<TsKvEntry> data) { | |
234 | + return data.stream().collect(Collectors.toMap(TsKvEntry::getKey, value -> new TsValue(value.getTs(), value.getValueAsString()))); | |
160 | 235 | } |
161 | 236 | |
162 | 237 | private void handleHistoryCmd(TelemetryWebSocketSessionRef session, int cmdId, EntityDataQuery query, EntityHistoryCmd historyCmd) { |
... | ... | @@ -181,6 +256,8 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc |
181 | 256 | keyData.forEach((k, v) -> entityData.getTimeseries().put(k, v.toArray(new TsValue[v.size()]))); |
182 | 257 | } catch (InterruptedException | ExecutionException e) { |
183 | 258 | log.warn("[{}][{}][{}] Failed to fetch historical data", session.getSessionId(), cmdId, entityData.getEntityId(), e); |
259 | + wsService.sendWsMsg(session.getSessionId(), | |
260 | + new EntityDataUpdate(cmdId, SubscriptionErrorCode.INTERNAL_ERROR.getCode(), "Failed to fetch historical data!")); | |
184 | 261 | } |
185 | 262 | }); |
186 | 263 | EntityDataUpdate update = new EntityDataUpdate(cmdId, data, null); | ... | ... |
... | ... | @@ -15,18 +15,30 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.service.telemetry.cmd.v2; |
17 | 17 | |
18 | +import lombok.AllArgsConstructor; | |
18 | 19 | import lombok.Data; |
19 | 20 | import org.thingsboard.server.common.data.page.PageData; |
20 | 21 | import org.thingsboard.server.common.data.query.EntityData; |
22 | +import org.thingsboard.server.service.telemetry.sub.SubscriptionErrorCode; | |
21 | 23 | |
22 | 24 | import java.util.List; |
23 | 25 | |
24 | 26 | @Data |
27 | +@AllArgsConstructor | |
25 | 28 | public class EntityDataUpdate { |
26 | 29 | |
27 | 30 | private final int cmdId; |
28 | 31 | private final PageData<EntityData> data; |
29 | 32 | private final List<EntityData> update; |
30 | - private int errorCode; | |
31 | - private String errorMsg; | |
33 | + private final int errorCode; | |
34 | + private final String errorMsg; | |
35 | + | |
36 | + public EntityDataUpdate(int cmdId, PageData<EntityData> data, List<EntityData> update) { | |
37 | + this(cmdId, data, update, SubscriptionErrorCode.NO_ERROR.getCode(), null); | |
38 | + } | |
39 | + | |
40 | + public EntityDataUpdate(int cmdId, int errorCode, String errorMsg) { | |
41 | + this(cmdId, null, null, errorCode, errorMsg); | |
42 | + } | |
43 | + | |
32 | 44 | } | ... | ... |
... | ... | @@ -35,7 +35,7 @@ public class PsqlTimeseriesCleanUpService extends AbstractTimeseriesCleanUpServi |
35 | 35 | protected void doCleanUp(Connection connection) { |
36 | 36 | long totalPartitionsRemoved = executeQuery(connection, "call drop_partitions_by_max_ttl('" + partitionType + "'," + systemTtl + ", 0);"); |
37 | 37 | log.info("Total partitions removed by TTL: [{}]", totalPartitionsRemoved); |
38 | - long totalEntitiesTelemetryRemoved = executeQuery(connection, "call cleanup_timeseries_by_ttl('" + ModelConstants.NULL_UUID_STR + "'," + systemTtl + ", 0);"); | |
38 | + long totalEntitiesTelemetryRemoved = executeQuery(connection, "call cleanup_timeseries_by_ttl('" + ModelConstants.NULL_UUID + "'," + systemTtl + ", 0);"); | |
39 | 39 | log.info("Total telemetry removed stats by TTL for entities: [{}]", totalEntitiesTelemetryRemoved); |
40 | 40 | } |
41 | 41 | } |
\ No newline at end of file | ... | ... |
... | ... | @@ -29,7 +29,7 @@ public class TimescaleTimeseriesCleanUpService extends AbstractTimeseriesCleanUp |
29 | 29 | |
30 | 30 | @Override |
31 | 31 | protected void doCleanUp(Connection connection) { |
32 | - long totalEntitiesTelemetryRemoved = executeQuery(connection, "call cleanup_timeseries_by_ttl('" + ModelConstants.NULL_UUID_STR + "'," + systemTtl + ", 0);"); | |
32 | + long totalEntitiesTelemetryRemoved = executeQuery(connection, "call cleanup_timeseries_by_ttl('" + ModelConstants.NULL_UUID + "'," + systemTtl + ", 0);"); | |
33 | 33 | log.info("Total telemetry removed stats by TTL for entities: [{}]", totalEntitiesTelemetryRemoved); |
34 | 34 | } |
35 | 35 | } |
\ No newline at end of file | ... | ... |
... | ... | @@ -18,6 +18,7 @@ package org.thingsboard.server.controller; |
18 | 18 | import org.junit.After; |
19 | 19 | import org.junit.Assert; |
20 | 20 | import org.junit.Before; |
21 | +import org.junit.Ignore; | |
21 | 22 | import org.junit.Test; |
22 | 23 | import org.springframework.beans.factory.annotation.Autowired; |
23 | 24 | import org.thingsboard.server.common.data.Device; |
... | ... | @@ -32,6 +33,8 @@ import org.thingsboard.server.common.data.query.DeviceTypeFilter; |
32 | 33 | import org.thingsboard.server.common.data.query.EntityData; |
33 | 34 | import org.thingsboard.server.common.data.query.EntityDataPageLink; |
34 | 35 | import org.thingsboard.server.common.data.query.EntityDataQuery; |
36 | +import org.thingsboard.server.common.data.query.EntityKey; | |
37 | +import org.thingsboard.server.common.data.query.EntityKeyType; | |
35 | 38 | import org.thingsboard.server.common.data.query.TsValue; |
36 | 39 | import org.thingsboard.server.common.data.security.Authority; |
37 | 40 | import org.thingsboard.server.dao.timeseries.TimeseriesService; |
... | ... | @@ -39,6 +42,7 @@ import org.thingsboard.server.service.telemetry.cmd.TelemetryPluginCmdsWrapper; |
39 | 42 | import org.thingsboard.server.service.telemetry.cmd.v2.EntityDataCmd; |
40 | 43 | import org.thingsboard.server.service.telemetry.cmd.v2.EntityDataUpdate; |
41 | 44 | import org.thingsboard.server.service.telemetry.cmd.v2.EntityHistoryCmd; |
45 | +import org.thingsboard.server.service.telemetry.cmd.v2.LatestValueCmd; | |
42 | 46 | |
43 | 47 | import java.util.Arrays; |
44 | 48 | import java.util.Collections; |
... | ... | @@ -142,4 +146,58 @@ public class BaseWebsocketApiTest extends AbstractWebsocketTest { |
142 | 146 | Assert.assertEquals(new TsValue(dataPoint3.getTs(), dataPoint3.getValueAsString()), tsArray[2]); |
143 | 147 | } |
144 | 148 | |
149 | + @Test | |
150 | + @Ignore | |
151 | + public void testEntityDataLatestWsCmd() throws Exception { | |
152 | + Device device = new Device(); | |
153 | + device.setName("Device"); | |
154 | + device.setType("default"); | |
155 | + device.setLabel("testLabel" + (int) (Math.random() * 1000)); | |
156 | + device = doPost("/api/device", device, Device.class); | |
157 | + | |
158 | + long now = System.currentTimeMillis(); | |
159 | + | |
160 | + DeviceTypeFilter dtf = new DeviceTypeFilter(); | |
161 | + dtf.setDeviceNameFilter("D"); | |
162 | + dtf.setDeviceType("default"); | |
163 | + EntityDataQuery edq = new EntityDataQuery(dtf, new EntityDataPageLink(1, 0, null, null), Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); | |
164 | + | |
165 | + LatestValueCmd latestCmd = new LatestValueCmd(); | |
166 | + latestCmd.setKeys(Collections.singletonList(new EntityKey(EntityKeyType.TIME_SERIES, "temperature"))); | |
167 | + EntityDataCmd cmd = new EntityDataCmd(1, edq, null, latestCmd, null); | |
168 | + | |
169 | + TelemetryPluginCmdsWrapper wrapper = new TelemetryPluginCmdsWrapper(); | |
170 | + wrapper.setEntityDataCmds(Collections.singletonList(cmd)); | |
171 | + | |
172 | + wsClient.send(mapper.writeValueAsString(wrapper)); | |
173 | + String msg = wsClient.waitForReply(); | |
174 | + EntityDataUpdate update = mapper.readValue(msg, EntityDataUpdate.class); | |
175 | + Assert.assertEquals(1, update.getCmdId()); | |
176 | + PageData<EntityData> pageData = update.getData(); | |
177 | + Assert.assertNotNull(pageData); | |
178 | + Assert.assertEquals(1, pageData.getData().size()); | |
179 | + Assert.assertEquals(device.getId(), pageData.getData().get(0).getEntityId()); | |
180 | + Assert.assertNull(pageData.getData().get(0).getLatest().get(EntityKeyType.TIME_SERIES).get("temperature")); | |
181 | + | |
182 | + TsKvEntry dataPoint1 = new BasicTsKvEntry(now - TimeUnit.MINUTES.toMillis(1), new LongDataEntry("temperature", 42L)); | |
183 | + tsService.save(device.getTenantId(), device.getId(), Arrays.asList(dataPoint1), 0).get(); | |
184 | + | |
185 | + cmd = new EntityDataCmd(2, edq, null, latestCmd, null); | |
186 | + | |
187 | + wrapper = new TelemetryPluginCmdsWrapper(); | |
188 | + wrapper.setEntityDataCmds(Collections.singletonList(cmd)); | |
189 | + | |
190 | + wsClient.send(mapper.writeValueAsString(wrapper)); | |
191 | + msg = wsClient.waitForReply(); | |
192 | + update = mapper.readValue(msg, EntityDataUpdate.class); | |
193 | + Assert.assertEquals(2, update.getCmdId()); | |
194 | + pageData = update.getData(); | |
195 | + Assert.assertNotNull(pageData); | |
196 | + Assert.assertEquals(1, pageData.getData().size()); | |
197 | + Assert.assertEquals(device.getId(), pageData.getData().get(0).getEntityId()); | |
198 | + Assert.assertNotNull(pageData.getData().get(0).getLatest().get(EntityKeyType.TIME_SERIES)); | |
199 | + TsValue tsValue = pageData.getData().get(0).getLatest().get(EntityKeyType.TIME_SERIES).get("temperature"); | |
200 | + Assert.assertEquals(new TsValue(dataPoint1.getTs(), dataPoint1.getValueAsString()), tsValue); | |
201 | + } | |
202 | + | |
145 | 203 | } | ... | ... |
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.controller.sql; |
17 | 17 | |
18 | -import org.thingsboard.server.controller.BaseEntityQueryControllerTest; | |
19 | 18 | import org.thingsboard.server.controller.BaseWebsocketApiTest; |
20 | 19 | import org.thingsboard.server.dao.service.DaoSqlTest; |
21 | 20 | ... | ... |
... | ... | @@ -15,16 +15,8 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.common.data.page; |
17 | 17 | |
18 | -import com.fasterxml.jackson.annotation.JsonCreator; | |
19 | 18 | import com.fasterxml.jackson.annotation.JsonIgnore; |
20 | -import com.fasterxml.jackson.annotation.JsonProperty; | |
21 | 19 | import lombok.Data; |
22 | -import lombok.Getter; | |
23 | -import lombok.ToString; | |
24 | - | |
25 | -import java.io.Serializable; | |
26 | -import java.util.Arrays; | |
27 | -import java.util.UUID; | |
28 | 20 | |
29 | 21 | @Data |
30 | 22 | public class TimePageLink extends PageLink { | ... | ... |
... | ... | @@ -21,8 +21,11 @@ import org.junit.Test; |
21 | 21 | import org.junit.runner.RunWith; |
22 | 22 | import org.mockito.runners.MockitoJUnitRunner; |
23 | 23 | |
24 | +import java.util.ArrayList; | |
25 | +import java.util.Arrays; | |
24 | 26 | import java.util.Random; |
25 | 27 | import java.util.UUID; |
28 | +import java.util.stream.Collectors; | |
26 | 29 | |
27 | 30 | /** |
28 | 31 | * Created by ashvayka on 14.07.17. |
... | ... | @@ -37,6 +40,18 @@ public class UUIDConverterTest { |
37 | 40 | Assert.assertEquals("1d8eebc58e0a7d796690800200c9a66", result); |
38 | 41 | } |
39 | 42 | |
43 | + | |
44 | + @Test | |
45 | + public void basicUuid() { | |
46 | + System.out.println(UUIDConverter.fromString("1e746126eaaefa6a91992ebcb67fe33")); | |
47 | + } | |
48 | + | |
49 | + @Test | |
50 | + public void basicUuidConversion() { | |
51 | + UUID original = UUID.fromString("3dd11790-abf2-11ea-b151-83a091b9d4cc"); | |
52 | + Assert.assertEquals(Uuids.unixTimestamp(original), 1591886749577L); | |
53 | + } | |
54 | + | |
40 | 55 | @Test |
41 | 56 | public void basicStringToUUIDTest() { |
42 | 57 | UUID result = UUIDConverter.fromString("1d8eebc58e0a7d796690800200c9a66"); | ... | ... |
... | ... | @@ -27,7 +27,13 @@ import org.thingsboard.server.common.data.page.PageLink; |
27 | 27 | import org.thingsboard.server.common.data.page.SortOrder; |
28 | 28 | import org.thingsboard.server.dao.model.ToData; |
29 | 29 | |
30 | -import java.util.*; | |
30 | +import java.util.ArrayList; | |
31 | +import java.util.Collection; | |
32 | +import java.util.Collections; | |
33 | +import java.util.List; | |
34 | +import java.util.Map; | |
35 | +import java.util.Optional; | |
36 | +import java.util.UUID; | |
31 | 37 | |
32 | 38 | public abstract class DaoUtil { |
33 | 39 | |
... | ... | @@ -77,9 +83,6 @@ public abstract class DaoUtil { |
77 | 83 | if (columnMap.containsKey(property)) { |
78 | 84 | property = columnMap.get(property); |
79 | 85 | } |
80 | - if (property.equals("createdTime")) { | |
81 | - property = "id"; | |
82 | - } | |
83 | 86 | return Sort.by(Sort.Direction.fromString(sortOrder.getDirection().name()), property); |
84 | 87 | } |
85 | 88 | } | ... | ... |
... | ... | @@ -29,12 +29,12 @@ import org.springframework.util.StringUtils; |
29 | 29 | import org.thingsboard.common.util.ThingsBoardThreadFactory; |
30 | 30 | import org.thingsboard.server.common.data.Tenant; |
31 | 31 | import org.thingsboard.server.common.data.alarm.Alarm; |
32 | -import org.thingsboard.server.common.data.id.AlarmId; | |
33 | 32 | import org.thingsboard.server.common.data.alarm.AlarmInfo; |
34 | 33 | import org.thingsboard.server.common.data.alarm.AlarmQuery; |
35 | 34 | import org.thingsboard.server.common.data.alarm.AlarmSearchStatus; |
36 | 35 | import org.thingsboard.server.common.data.alarm.AlarmSeverity; |
37 | 36 | import org.thingsboard.server.common.data.alarm.AlarmStatus; |
37 | +import org.thingsboard.server.common.data.id.AlarmId; | |
38 | 38 | import org.thingsboard.server.common.data.id.EntityId; |
39 | 39 | import org.thingsboard.server.common.data.id.TenantId; |
40 | 40 | import org.thingsboard.server.common.data.page.PageData; | ... | ... |
... | ... | @@ -28,7 +28,6 @@ import org.springframework.beans.factory.annotation.Autowired; |
28 | 28 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
29 | 29 | import org.springframework.stereotype.Service; |
30 | 30 | import org.springframework.util.StringUtils; |
31 | -import org.thingsboard.server.common.data.BaseData; | |
32 | 31 | import org.thingsboard.server.common.data.EntityType; |
33 | 32 | import org.thingsboard.server.common.data.HasName; |
34 | 33 | import org.thingsboard.server.common.data.audit.ActionStatus; |
... | ... | @@ -38,7 +37,6 @@ import org.thingsboard.server.common.data.id.AuditLogId; |
38 | 37 | import org.thingsboard.server.common.data.id.CustomerId; |
39 | 38 | import org.thingsboard.server.common.data.id.EntityId; |
40 | 39 | import org.thingsboard.server.common.data.id.TenantId; |
41 | -import org.thingsboard.server.common.data.id.UUIDBased; | |
42 | 40 | import org.thingsboard.server.common.data.id.UserId; |
43 | 41 | import org.thingsboard.server.common.data.kv.AttributeKvEntry; |
44 | 42 | import org.thingsboard.server.common.data.page.PageData; | ... | ... |
... | ... | @@ -18,14 +18,12 @@ package org.thingsboard.server.dao.audit; |
18 | 18 | import com.google.common.util.concurrent.ListenableFuture; |
19 | 19 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
20 | 20 | import org.springframework.stereotype.Service; |
21 | -import org.thingsboard.server.common.data.BaseData; | |
22 | 21 | import org.thingsboard.server.common.data.HasName; |
23 | 22 | import org.thingsboard.server.common.data.audit.ActionType; |
24 | 23 | import org.thingsboard.server.common.data.audit.AuditLog; |
25 | 24 | import org.thingsboard.server.common.data.id.CustomerId; |
26 | 25 | import org.thingsboard.server.common.data.id.EntityId; |
27 | 26 | import org.thingsboard.server.common.data.id.TenantId; |
28 | -import org.thingsboard.server.common.data.id.UUIDBased; | |
29 | 27 | import org.thingsboard.server.common.data.id.UserId; |
30 | 28 | import org.thingsboard.server.common.data.page.PageData; |
31 | 29 | import org.thingsboard.server.common.data.page.TimePageLink; | ... | ... |
... | ... | @@ -37,7 +37,6 @@ import org.thingsboard.server.dao.exception.IncorrectParameterException; |
37 | 37 | import org.thingsboard.server.dao.service.DataValidator; |
38 | 38 | import org.thingsboard.server.dao.service.Validator; |
39 | 39 | |
40 | -import java.util.List; | |
41 | 40 | import java.util.Optional; |
42 | 41 | |
43 | 42 | /** | ... | ... |
... | ... | @@ -42,7 +42,6 @@ import org.thingsboard.server.dao.tenant.TenantDao; |
42 | 42 | import org.thingsboard.server.dao.user.UserService; |
43 | 43 | |
44 | 44 | import java.io.IOException; |
45 | -import java.util.List; | |
46 | 45 | import java.util.Optional; |
47 | 46 | |
48 | 47 | import static org.thingsboard.server.dao.service.Validator.validateId; | ... | ... |
... | ... | @@ -15,14 +15,11 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.dashboard; |
17 | 17 | |
18 | -import com.google.common.util.concurrent.ListenableFuture; | |
19 | 18 | import org.thingsboard.server.common.data.DashboardInfo; |
20 | 19 | import org.thingsboard.server.common.data.page.PageData; |
21 | 20 | import org.thingsboard.server.common.data.page.PageLink; |
22 | -import org.thingsboard.server.common.data.page.TimePageLink; | |
23 | 21 | import org.thingsboard.server.dao.Dao; |
24 | 22 | |
25 | -import java.util.List; | |
26 | 23 | import java.util.UUID; |
27 | 24 | |
28 | 25 | /** | ... | ... |
... | ... | @@ -29,7 +29,12 @@ import org.springframework.cache.annotation.CacheEvict; |
29 | 29 | import org.springframework.cache.annotation.Cacheable; |
30 | 30 | import org.springframework.cache.annotation.Caching; |
31 | 31 | import org.springframework.stereotype.Service; |
32 | -import org.thingsboard.server.common.data.*; | |
32 | +import org.thingsboard.server.common.data.Customer; | |
33 | +import org.thingsboard.server.common.data.EntitySubtype; | |
34 | +import org.thingsboard.server.common.data.EntityType; | |
35 | +import org.thingsboard.server.common.data.EntityView; | |
36 | +import org.thingsboard.server.common.data.EntityViewInfo; | |
37 | +import org.thingsboard.server.common.data.Tenant; | |
33 | 38 | import org.thingsboard.server.common.data.entityview.EntityViewSearchQuery; |
34 | 39 | import org.thingsboard.server.common.data.id.CustomerId; |
35 | 40 | import org.thingsboard.server.common.data.id.EntityId; | ... | ... |
... | ... | @@ -16,7 +16,6 @@ |
16 | 16 | package org.thingsboard.server.dao.model; |
17 | 17 | |
18 | 18 | import lombok.Data; |
19 | -import org.thingsboard.server.common.data.UUIDConverter; | |
20 | 19 | |
21 | 20 | import javax.persistence.Column; |
22 | 21 | import javax.persistence.Id; |
... | ... | @@ -31,28 +30,30 @@ import java.util.UUID; |
31 | 30 | public abstract class BaseSqlEntity<D> implements BaseEntity<D> { |
32 | 31 | |
33 | 32 | @Id |
34 | - @Column(name = ModelConstants.ID_PROPERTY) | |
35 | - protected String id; | |
33 | + @Column(name = ModelConstants.ID_PROPERTY, columnDefinition = "uuid") | |
34 | + protected UUID id; | |
35 | + | |
36 | + @Column(name = ModelConstants.CREATED_TIME_PROPERTY) | |
37 | + protected long createdTime; | |
36 | 38 | |
37 | 39 | @Override |
38 | 40 | public UUID getUuid() { |
39 | - if (id == null) { | |
40 | - return null; | |
41 | - } | |
42 | - return UUIDConverter.fromString(id); | |
41 | + return id; | |
43 | 42 | } |
44 | 43 | |
45 | 44 | @Override |
46 | 45 | public void setUuid(UUID id) { |
47 | - this.id = UUIDConverter.fromTimeUUID(id); | |
46 | + this.id = id; | |
48 | 47 | } |
49 | 48 | |
50 | - protected UUID toUUID(String src){ | |
51 | - return UUIDConverter.fromString(src); | |
49 | + @Override | |
50 | + public long getCreatedTime() { | |
51 | + return createdTime; | |
52 | 52 | } |
53 | 53 | |
54 | - protected String toString(UUID timeUUID){ | |
55 | - return UUIDConverter.fromTimeUUID(timeUUID); | |
54 | + public void setCreatedTime(long createdTime) { | |
55 | + if (createdTime > 0) { | |
56 | + this.createdTime = createdTime; | |
57 | + } | |
56 | 58 | } |
57 | - | |
58 | 59 | } | ... | ... |
... | ... | @@ -17,7 +17,6 @@ package org.thingsboard.server.dao.model; |
17 | 17 | |
18 | 18 | import com.datastax.oss.driver.api.core.uuid.Uuids; |
19 | 19 | import org.apache.commons.lang3.ArrayUtils; |
20 | -import org.thingsboard.server.common.data.UUIDConverter; | |
21 | 20 | import org.thingsboard.server.common.data.id.TenantId; |
22 | 21 | import org.thingsboard.server.common.data.kv.Aggregation; |
23 | 22 | |
... | ... | @@ -29,7 +28,6 @@ public class ModelConstants { |
29 | 28 | } |
30 | 29 | |
31 | 30 | public static final UUID NULL_UUID = Uuids.startOf(0); |
32 | - public static final String NULL_UUID_STR = UUIDConverter.fromTimeUUID(NULL_UUID); | |
33 | 31 | public static final TenantId SYSTEM_TENANT = new TenantId(ModelConstants.NULL_UUID); |
34 | 32 | |
35 | 33 | // this is the difference between midnight October 15, 1582 UTC and midnight January 1, 1970 UTC as 100 nanosecond units |
... | ... | @@ -39,6 +37,7 @@ public class ModelConstants { |
39 | 37 | * Generic constants. |
40 | 38 | */ |
41 | 39 | public static final String ID_PROPERTY = "id"; |
40 | + public static final String CREATED_TIME_PROPERTY = "created_time"; | |
42 | 41 | public static final String USER_ID_PROPERTY = "user_id"; |
43 | 42 | public static final String TENANT_ID_PROPERTY = "tenant_id"; |
44 | 43 | public static final String CUSTOMER_ID_PROPERTY = "customer_id"; | ... | ... |
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
20 | 19 | import lombok.Data; |
21 | 20 | import lombok.EqualsAndHashCode; |
... | ... | @@ -24,11 +23,10 @@ import org.hibernate.annotations.TypeDef; |
24 | 23 | import org.springframework.util.CollectionUtils; |
25 | 24 | import org.springframework.util.StringUtils; |
26 | 25 | import org.thingsboard.server.common.data.EntityType; |
27 | -import org.thingsboard.server.common.data.UUIDConverter; | |
28 | 26 | import org.thingsboard.server.common.data.alarm.Alarm; |
29 | -import org.thingsboard.server.common.data.id.AlarmId; | |
30 | 27 | import org.thingsboard.server.common.data.alarm.AlarmSeverity; |
31 | 28 | import org.thingsboard.server.common.data.alarm.AlarmStatus; |
29 | +import org.thingsboard.server.common.data.id.AlarmId; | |
32 | 30 | import org.thingsboard.server.common.data.id.EntityIdFactory; |
33 | 31 | import org.thingsboard.server.common.data.id.TenantId; |
34 | 32 | import org.thingsboard.server.dao.model.BaseEntity; |
... | ... | @@ -42,6 +40,7 @@ import javax.persistence.Enumerated; |
42 | 40 | import javax.persistence.MappedSuperclass; |
43 | 41 | import java.util.Arrays; |
44 | 42 | import java.util.Collections; |
43 | +import java.util.UUID; | |
45 | 44 | |
46 | 45 | import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ACK_TS_PROPERTY; |
47 | 46 | import static org.thingsboard.server.dao.model.ModelConstants.ALARM_CLEAR_TS_PROPERTY; |
... | ... | @@ -63,10 +62,10 @@ import static org.thingsboard.server.dao.model.ModelConstants.ALARM_TYPE_PROPERT |
63 | 62 | public abstract class AbstractAlarmEntity<T extends Alarm> extends BaseSqlEntity<T> implements BaseEntity<T> { |
64 | 63 | |
65 | 64 | @Column(name = ALARM_TENANT_ID_PROPERTY) |
66 | - private String tenantId; | |
65 | + private UUID tenantId; | |
67 | 66 | |
68 | 67 | @Column(name = ALARM_ORIGINATOR_ID_PROPERTY) |
69 | - private String originatorId; | |
68 | + private UUID originatorId; | |
70 | 69 | |
71 | 70 | @Column(name = ALARM_ORIGINATOR_TYPE_PROPERTY) |
72 | 71 | private EntityType originatorType; |
... | ... | @@ -110,13 +109,14 @@ public abstract class AbstractAlarmEntity<T extends Alarm> extends BaseSqlEntity |
110 | 109 | |
111 | 110 | public AbstractAlarmEntity(Alarm alarm) { |
112 | 111 | if (alarm.getId() != null) { |
113 | - this.setUuid(alarm.getId().getId()); | |
112 | + this.setUuid(alarm.getUuidId()); | |
114 | 113 | } |
114 | + this.setCreatedTime(alarm.getCreatedTime()); | |
115 | 115 | if (alarm.getTenantId() != null) { |
116 | - this.tenantId = UUIDConverter.fromTimeUUID(alarm.getTenantId().getId()); | |
116 | + this.tenantId = alarm.getTenantId().getId(); | |
117 | 117 | } |
118 | 118 | this.type = alarm.getType(); |
119 | - this.originatorId = UUIDConverter.fromTimeUUID(alarm.getOriginator().getId()); | |
119 | + this.originatorId = alarm.getOriginator().getId(); | |
120 | 120 | this.originatorType = alarm.getOriginator().getEntityType(); |
121 | 121 | this.type = alarm.getType(); |
122 | 122 | this.severity = alarm.getSeverity(); |
... | ... | @@ -153,12 +153,12 @@ public abstract class AbstractAlarmEntity<T extends Alarm> extends BaseSqlEntity |
153 | 153 | } |
154 | 154 | |
155 | 155 | protected Alarm toAlarm() { |
156 | - Alarm alarm = new Alarm(new AlarmId(UUIDConverter.fromString(id))); | |
157 | - alarm.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id))); | |
156 | + Alarm alarm = new Alarm(new AlarmId(id)); | |
157 | + alarm.setCreatedTime(createdTime); | |
158 | 158 | if (tenantId != null) { |
159 | - alarm.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); | |
159 | + alarm.setTenantId(new TenantId(tenantId)); | |
160 | 160 | } |
161 | - alarm.setOriginator(EntityIdFactory.getByTypeAndUuid(originatorType, UUIDConverter.fromString(originatorId))); | |
161 | + alarm.setOriginator(EntityIdFactory.getByTypeAndUuid(originatorType, originatorId)); | |
162 | 162 | alarm.setType(type); |
163 | 163 | alarm.setSeverity(severity); |
164 | 164 | alarm.setStatus(status); | ... | ... |
... | ... | @@ -15,13 +15,11 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
20 | 19 | import lombok.Data; |
21 | 20 | import lombok.EqualsAndHashCode; |
22 | 21 | import org.hibernate.annotations.Type; |
23 | 22 | import org.hibernate.annotations.TypeDef; |
24 | -import org.thingsboard.server.common.data.UUIDConverter; | |
25 | 23 | import org.thingsboard.server.common.data.asset.Asset; |
26 | 24 | import org.thingsboard.server.common.data.id.AssetId; |
27 | 25 | import org.thingsboard.server.common.data.id.CustomerId; |
... | ... | @@ -33,6 +31,7 @@ import org.thingsboard.server.dao.util.mapping.JsonStringType; |
33 | 31 | |
34 | 32 | import javax.persistence.Column; |
35 | 33 | import javax.persistence.MappedSuperclass; |
34 | +import java.util.UUID; | |
36 | 35 | |
37 | 36 | import static org.thingsboard.server.dao.model.ModelConstants.ASSET_CUSTOMER_ID_PROPERTY; |
38 | 37 | import static org.thingsboard.server.dao.model.ModelConstants.ASSET_LABEL_PROPERTY; |
... | ... | @@ -48,10 +47,10 @@ import static org.thingsboard.server.dao.model.ModelConstants.SEARCH_TEXT_PROPER |
48 | 47 | public abstract class AbstractAssetEntity<T extends Asset> extends BaseSqlEntity<T> implements SearchTextEntity<T> { |
49 | 48 | |
50 | 49 | @Column(name = ASSET_TENANT_ID_PROPERTY) |
51 | - private String tenantId; | |
50 | + private UUID tenantId; | |
52 | 51 | |
53 | 52 | @Column(name = ASSET_CUSTOMER_ID_PROPERTY) |
54 | - private String customerId; | |
53 | + private UUID customerId; | |
55 | 54 | |
56 | 55 | @Column(name = ASSET_NAME_PROPERTY) |
57 | 56 | private String name; |
... | ... | @@ -77,11 +76,12 @@ public abstract class AbstractAssetEntity<T extends Asset> extends BaseSqlEntity |
77 | 76 | if (asset.getId() != null) { |
78 | 77 | this.setUuid(asset.getId().getId()); |
79 | 78 | } |
79 | + this.setCreatedTime(asset.getCreatedTime()); | |
80 | 80 | if (asset.getTenantId() != null) { |
81 | - this.tenantId = UUIDConverter.fromTimeUUID(asset.getTenantId().getId()); | |
81 | + this.tenantId = asset.getTenantId().getId(); | |
82 | 82 | } |
83 | 83 | if (asset.getCustomerId() != null) { |
84 | - this.customerId = UUIDConverter.fromTimeUUID(asset.getCustomerId().getId()); | |
84 | + this.customerId = asset.getCustomerId().getId(); | |
85 | 85 | } |
86 | 86 | this.name = asset.getName(); |
87 | 87 | this.type = asset.getType(); |
... | ... | @@ -91,6 +91,7 @@ public abstract class AbstractAssetEntity<T extends Asset> extends BaseSqlEntity |
91 | 91 | |
92 | 92 | public AbstractAssetEntity(AssetEntity assetEntity) { |
93 | 93 | this.setId(assetEntity.getId()); |
94 | + this.setCreatedTime(assetEntity.getCreatedTime()); | |
94 | 95 | this.tenantId = assetEntity.getTenantId(); |
95 | 96 | this.customerId = assetEntity.getCustomerId(); |
96 | 97 | this.type = assetEntity.getType(); |
... | ... | @@ -115,13 +116,13 @@ public abstract class AbstractAssetEntity<T extends Asset> extends BaseSqlEntity |
115 | 116 | } |
116 | 117 | |
117 | 118 | protected Asset toAsset() { |
118 | - Asset asset = new Asset(new AssetId(UUIDConverter.fromString(id))); | |
119 | - asset.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id))); | |
119 | + Asset asset = new Asset(new AssetId(id)); | |
120 | + asset.setCreatedTime(createdTime); | |
120 | 121 | if (tenantId != null) { |
121 | - asset.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); | |
122 | + asset.setTenantId(new TenantId(tenantId)); | |
122 | 123 | } |
123 | 124 | if (customerId != null) { |
124 | - asset.setCustomerId(new CustomerId(UUIDConverter.fromString(customerId))); | |
125 | + asset.setCustomerId(new CustomerId(customerId)); | |
125 | 126 | } |
126 | 127 | asset.setName(name); |
127 | 128 | asset.setType(type); | ... | ... |
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
20 | 19 | import lombok.Data; |
21 | 20 | import lombok.EqualsAndHashCode; |
... | ... | @@ -32,6 +31,7 @@ import org.thingsboard.server.dao.util.mapping.JsonStringType; |
32 | 31 | |
33 | 32 | import javax.persistence.Column; |
34 | 33 | import javax.persistence.MappedSuperclass; |
34 | +import java.util.UUID; | |
35 | 35 | |
36 | 36 | @Data |
37 | 37 | @EqualsAndHashCode(callSuper = true) |
... | ... | @@ -39,11 +39,11 @@ import javax.persistence.MappedSuperclass; |
39 | 39 | @MappedSuperclass |
40 | 40 | public abstract class AbstractDeviceEntity<T extends Device> extends BaseSqlEntity<T> implements SearchTextEntity<T> { |
41 | 41 | |
42 | - @Column(name = ModelConstants.DEVICE_TENANT_ID_PROPERTY) | |
43 | - private String tenantId; | |
42 | + @Column(name = ModelConstants.DEVICE_TENANT_ID_PROPERTY, columnDefinition = "uuid") | |
43 | + private UUID tenantId; | |
44 | 44 | |
45 | - @Column(name = ModelConstants.DEVICE_CUSTOMER_ID_PROPERTY) | |
46 | - private String customerId; | |
45 | + @Column(name = ModelConstants.DEVICE_CUSTOMER_ID_PROPERTY, columnDefinition = "uuid") | |
46 | + private UUID customerId; | |
47 | 47 | |
48 | 48 | @Column(name = ModelConstants.DEVICE_TYPE_PROPERTY) |
49 | 49 | private String type; |
... | ... | @@ -67,13 +67,14 @@ public abstract class AbstractDeviceEntity<T extends Device> extends BaseSqlEnti |
67 | 67 | |
68 | 68 | public AbstractDeviceEntity(Device device) { |
69 | 69 | if (device.getId() != null) { |
70 | - this.setUuid(device.getId().getId()); | |
70 | + this.setUuid(device.getUuidId()); | |
71 | 71 | } |
72 | + this.setCreatedTime(device.getCreatedTime()); | |
72 | 73 | if (device.getTenantId() != null) { |
73 | - this.tenantId = toString(device.getTenantId().getId()); | |
74 | + this.tenantId = device.getTenantId().getId(); | |
74 | 75 | } |
75 | 76 | if (device.getCustomerId() != null) { |
76 | - this.customerId = toString(device.getCustomerId().getId()); | |
77 | + this.customerId = device.getCustomerId().getId(); | |
77 | 78 | } |
78 | 79 | this.name = device.getName(); |
79 | 80 | this.type = device.getType(); |
... | ... | @@ -83,6 +84,7 @@ public abstract class AbstractDeviceEntity<T extends Device> extends BaseSqlEnti |
83 | 84 | |
84 | 85 | public AbstractDeviceEntity(DeviceEntity deviceEntity) { |
85 | 86 | this.setId(deviceEntity.getId()); |
87 | + this.setCreatedTime(deviceEntity.getCreatedTime()); | |
86 | 88 | this.tenantId = deviceEntity.getTenantId(); |
87 | 89 | this.customerId = deviceEntity.getCustomerId(); |
88 | 90 | this.type = deviceEntity.getType(); |
... | ... | @@ -104,12 +106,12 @@ public abstract class AbstractDeviceEntity<T extends Device> extends BaseSqlEnti |
104 | 106 | |
105 | 107 | protected Device toDevice() { |
106 | 108 | Device device = new Device(new DeviceId(getUuid())); |
107 | - device.setCreatedTime(Uuids.unixTimestamp(getUuid())); | |
109 | + device.setCreatedTime(createdTime); | |
108 | 110 | if (tenantId != null) { |
109 | - device.setTenantId(new TenantId(toUUID(tenantId))); | |
111 | + device.setTenantId(new TenantId(tenantId)); | |
110 | 112 | } |
111 | 113 | if (customerId != null) { |
112 | - device.setCustomerId(new CustomerId(toUUID(customerId))); | |
114 | + device.setCustomerId(new CustomerId(customerId)); | |
113 | 115 | } |
114 | 116 | device.setName(name); |
115 | 117 | device.setType(type); | ... | ... |
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
20 | 19 | import com.fasterxml.jackson.databind.ObjectMapper; |
21 | 20 | import lombok.Data; |
... | ... | @@ -35,7 +34,10 @@ import org.thingsboard.server.dao.model.ModelConstants; |
35 | 34 | import org.thingsboard.server.dao.model.SearchTextEntity; |
36 | 35 | import org.thingsboard.server.dao.util.mapping.JsonStringType; |
37 | 36 | |
38 | -import javax.persistence.*; | |
37 | +import javax.persistence.Column; | |
38 | +import javax.persistence.EnumType; | |
39 | +import javax.persistence.Enumerated; | |
40 | +import javax.persistence.MappedSuperclass; | |
39 | 41 | import java.io.IOException; |
40 | 42 | import java.util.UUID; |
41 | 43 | |
... | ... | @@ -53,17 +55,17 @@ import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_TYPE_PROPER |
53 | 55 | public abstract class AbstractEntityViewEntity<T extends EntityView> extends BaseSqlEntity<T> implements SearchTextEntity<T> { |
54 | 56 | |
55 | 57 | @Column(name = ModelConstants.ENTITY_VIEW_ENTITY_ID_PROPERTY) |
56 | - private String entityId; | |
58 | + private UUID entityId; | |
57 | 59 | |
58 | 60 | @Enumerated(EnumType.STRING) |
59 | 61 | @Column(name = ENTITY_TYPE_PROPERTY) |
60 | 62 | private EntityType entityType; |
61 | 63 | |
62 | 64 | @Column(name = ModelConstants.ENTITY_VIEW_TENANT_ID_PROPERTY) |
63 | - private String tenantId; | |
65 | + private UUID tenantId; | |
64 | 66 | |
65 | 67 | @Column(name = ModelConstants.ENTITY_VIEW_CUSTOMER_ID_PROPERTY) |
66 | - private String customerId; | |
68 | + private UUID customerId; | |
67 | 69 | |
68 | 70 | @Column(name = ModelConstants.DEVICE_TYPE_PROPERTY) |
69 | 71 | private String type; |
... | ... | @@ -97,15 +99,16 @@ public abstract class AbstractEntityViewEntity<T extends EntityView> extends Bas |
97 | 99 | if (entityView.getId() != null) { |
98 | 100 | this.setUuid(entityView.getId().getId()); |
99 | 101 | } |
102 | + this.setCreatedTime(entityView.getCreatedTime()); | |
100 | 103 | if (entityView.getEntityId() != null) { |
101 | - this.entityId = toString(entityView.getEntityId().getId()); | |
104 | + this.entityId = entityView.getEntityId().getId(); | |
102 | 105 | this.entityType = entityView.getEntityId().getEntityType(); |
103 | 106 | } |
104 | 107 | if (entityView.getTenantId() != null) { |
105 | - this.tenantId = toString(entityView.getTenantId().getId()); | |
108 | + this.tenantId = entityView.getTenantId().getId(); | |
106 | 109 | } |
107 | 110 | if (entityView.getCustomerId() != null) { |
108 | - this.customerId = toString(entityView.getCustomerId().getId()); | |
111 | + this.customerId = entityView.getCustomerId().getId(); | |
109 | 112 | } |
110 | 113 | this.type = entityView.getType(); |
111 | 114 | this.name = entityView.getName(); |
... | ... | @@ -122,6 +125,7 @@ public abstract class AbstractEntityViewEntity<T extends EntityView> extends Bas |
122 | 125 | |
123 | 126 | public AbstractEntityViewEntity(EntityViewEntity entityViewEntity) { |
124 | 127 | this.setId(entityViewEntity.getId()); |
128 | + this.setCreatedTime(entityViewEntity.getCreatedTime()); | |
125 | 129 | this.entityId = entityViewEntity.getEntityId(); |
126 | 130 | this.entityType = entityViewEntity.getEntityType(); |
127 | 131 | this.tenantId = entityViewEntity.getTenantId(); |
... | ... | @@ -147,16 +151,16 @@ public abstract class AbstractEntityViewEntity<T extends EntityView> extends Bas |
147 | 151 | |
148 | 152 | protected EntityView toEntityView() { |
149 | 153 | EntityView entityView = new EntityView(new EntityViewId(getUuid())); |
150 | - entityView.setCreatedTime(Uuids.unixTimestamp(getUuid())); | |
154 | + entityView.setCreatedTime(createdTime); | |
151 | 155 | |
152 | 156 | if (entityId != null) { |
153 | - entityView.setEntityId(EntityIdFactory.getByTypeAndId(entityType.name(), toUUID(entityId).toString())); | |
157 | + entityView.setEntityId(EntityIdFactory.getByTypeAndUuid(entityType.name(), entityId)); | |
154 | 158 | } |
155 | 159 | if (tenantId != null) { |
156 | - entityView.setTenantId(new TenantId(toUUID(tenantId))); | |
160 | + entityView.setTenantId(new TenantId(tenantId)); | |
157 | 161 | } |
158 | 162 | if (customerId != null) { |
159 | - entityView.setCustomerId(new CustomerId(toUUID(customerId))); | |
163 | + entityView.setCustomerId(new CustomerId(customerId)); | |
160 | 164 | } |
161 | 165 | entityView.setType(type); |
162 | 166 | entityView.setName(name); | ... | ... |
... | ... | @@ -15,14 +15,12 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
20 | 19 | import lombok.Data; |
21 | 20 | import lombok.EqualsAndHashCode; |
22 | 21 | import org.hibernate.annotations.Type; |
23 | 22 | import org.hibernate.annotations.TypeDef; |
24 | 23 | import org.thingsboard.server.common.data.AdminSettings; |
25 | -import org.thingsboard.server.common.data.UUIDConverter; | |
26 | 24 | import org.thingsboard.server.common.data.id.AdminSettingsId; |
27 | 25 | import org.thingsboard.server.dao.model.BaseEntity; |
28 | 26 | import org.thingsboard.server.dao.model.BaseSqlEntity; |
... | ... | @@ -58,14 +56,15 @@ public final class AdminSettingsEntity extends BaseSqlEntity<AdminSettings> impl |
58 | 56 | if (adminSettings.getId() != null) { |
59 | 57 | this.setUuid(adminSettings.getId().getId()); |
60 | 58 | } |
59 | + this.setCreatedTime(adminSettings.getCreatedTime()); | |
61 | 60 | this.key = adminSettings.getKey(); |
62 | 61 | this.jsonValue = adminSettings.getJsonValue(); |
63 | 62 | } |
64 | 63 | |
65 | 64 | @Override |
66 | 65 | public AdminSettings toData() { |
67 | - AdminSettings adminSettings = new AdminSettings(new AdminSettingsId(UUIDConverter.fromString(id))); | |
68 | - adminSettings.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id))); | |
66 | + AdminSettings adminSettings = new AdminSettings(new AdminSettingsId(id)); | |
67 | + adminSettings.setCreatedTime(createdTime); | |
69 | 68 | adminSettings.setKey(key); |
70 | 69 | adminSettings.setJsonValue(jsonValue); |
71 | 70 | return adminSettings; | ... | ... |
... | ... | @@ -25,6 +25,7 @@ import javax.persistence.Embeddable; |
25 | 25 | import javax.persistence.EnumType; |
26 | 26 | import javax.persistence.Enumerated; |
27 | 27 | import java.io.Serializable; |
28 | +import java.util.UUID; | |
28 | 29 | |
29 | 30 | import static org.thingsboard.server.dao.model.ModelConstants.ATTRIBUTE_KEY_COLUMN; |
30 | 31 | import static org.thingsboard.server.dao.model.ModelConstants.ATTRIBUTE_TYPE_COLUMN; |
... | ... | @@ -39,8 +40,8 @@ public class AttributeKvCompositeKey implements Serializable { |
39 | 40 | @Enumerated(EnumType.STRING) |
40 | 41 | @Column(name = ENTITY_TYPE_COLUMN) |
41 | 42 | private EntityType entityType; |
42 | - @Column(name = ENTITY_ID_COLUMN) | |
43 | - private String entityId; | |
43 | + @Column(name = ENTITY_ID_COLUMN, columnDefinition = "uuid") | |
44 | + private UUID entityId; | |
44 | 45 | @Column(name = ATTRIBUTE_TYPE_COLUMN) |
45 | 46 | private String attributeType; |
46 | 47 | @Column(name = ATTRIBUTE_KEY_COLUMN) | ... | ... |
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
20 | 19 | import lombok.Data; |
21 | 20 | import lombok.EqualsAndHashCode; |
... | ... | @@ -40,6 +39,7 @@ import javax.persistence.Entity; |
40 | 39 | import javax.persistence.EnumType; |
41 | 40 | import javax.persistence.Enumerated; |
42 | 41 | import javax.persistence.Table; |
42 | +import java.util.UUID; | |
43 | 43 | |
44 | 44 | import static org.thingsboard.server.dao.model.ModelConstants.AUDIT_LOG_ACTION_DATA_PROPERTY; |
45 | 45 | import static org.thingsboard.server.dao.model.ModelConstants.AUDIT_LOG_ACTION_FAILURE_DETAILS_PROPERTY; |
... | ... | @@ -61,23 +61,23 @@ import static org.thingsboard.server.dao.model.ModelConstants.AUDIT_LOG_USER_NAM |
61 | 61 | public class AuditLogEntity extends BaseSqlEntity<AuditLog> implements BaseEntity<AuditLog> { |
62 | 62 | |
63 | 63 | @Column(name = AUDIT_LOG_TENANT_ID_PROPERTY) |
64 | - private String tenantId; | |
64 | + private UUID tenantId; | |
65 | 65 | |
66 | 66 | @Column(name = AUDIT_LOG_CUSTOMER_ID_PROPERTY) |
67 | - private String customerId; | |
67 | + private UUID customerId; | |
68 | 68 | |
69 | 69 | @Enumerated(EnumType.STRING) |
70 | 70 | @Column(name = AUDIT_LOG_ENTITY_TYPE_PROPERTY) |
71 | 71 | private EntityType entityType; |
72 | 72 | |
73 | 73 | @Column(name = AUDIT_LOG_ENTITY_ID_PROPERTY) |
74 | - private String entityId; | |
74 | + private UUID entityId; | |
75 | 75 | |
76 | 76 | @Column(name = AUDIT_LOG_ENTITY_NAME_PROPERTY) |
77 | 77 | private String entityName; |
78 | 78 | |
79 | 79 | @Column(name = AUDIT_LOG_USER_ID_PROPERTY) |
80 | - private String userId; | |
80 | + private UUID userId; | |
81 | 81 | |
82 | 82 | @Column(name = AUDIT_LOG_USER_NAME_PROPERTY) |
83 | 83 | private String userName; |
... | ... | @@ -105,18 +105,19 @@ public class AuditLogEntity extends BaseSqlEntity<AuditLog> implements BaseEntit |
105 | 105 | if (auditLog.getId() != null) { |
106 | 106 | this.setUuid(auditLog.getId().getId()); |
107 | 107 | } |
108 | + this.setCreatedTime(auditLog.getCreatedTime()); | |
108 | 109 | if (auditLog.getTenantId() != null) { |
109 | - this.tenantId = toString(auditLog.getTenantId().getId()); | |
110 | + this.tenantId = auditLog.getTenantId().getId(); | |
110 | 111 | } |
111 | 112 | if (auditLog.getCustomerId() != null) { |
112 | - this.customerId = toString(auditLog.getCustomerId().getId()); | |
113 | + this.customerId = auditLog.getCustomerId().getId(); | |
113 | 114 | } |
114 | 115 | if (auditLog.getEntityId() != null) { |
115 | - this.entityId = toString(auditLog.getEntityId().getId()); | |
116 | + this.entityId = auditLog.getEntityId().getId(); | |
116 | 117 | this.entityType = auditLog.getEntityId().getEntityType(); |
117 | 118 | } |
118 | 119 | if (auditLog.getUserId() != null) { |
119 | - this.userId = toString(auditLog.getUserId().getId()); | |
120 | + this.userId = auditLog.getUserId().getId(); | |
120 | 121 | } |
121 | 122 | this.entityName = auditLog.getEntityName(); |
122 | 123 | this.userName = auditLog.getUserName(); |
... | ... | @@ -129,18 +130,18 @@ public class AuditLogEntity extends BaseSqlEntity<AuditLog> implements BaseEntit |
129 | 130 | @Override |
130 | 131 | public AuditLog toData() { |
131 | 132 | AuditLog auditLog = new AuditLog(new AuditLogId(this.getUuid())); |
132 | - auditLog.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); | |
133 | + auditLog.setCreatedTime(createdTime); | |
133 | 134 | if (tenantId != null) { |
134 | - auditLog.setTenantId(new TenantId(toUUID(tenantId))); | |
135 | + auditLog.setTenantId(new TenantId(tenantId)); | |
135 | 136 | } |
136 | 137 | if (customerId != null) { |
137 | - auditLog.setCustomerId(new CustomerId(toUUID(customerId))); | |
138 | + auditLog.setCustomerId(new CustomerId(customerId)); | |
138 | 139 | } |
139 | 140 | if (entityId != null) { |
140 | - auditLog.setEntityId(EntityIdFactory.getByTypeAndId(entityType.name(), toUUID(entityId).toString())); | |
141 | + auditLog.setEntityId(EntityIdFactory.getByTypeAndUuid(entityType.name(), entityId)); | |
141 | 142 | } |
142 | 143 | if (userId != null) { |
143 | - auditLog.setUserId(new UserId(toUUID(userId))); | |
144 | + auditLog.setUserId(new UserId(userId)); | |
144 | 145 | } |
145 | 146 | auditLog.setEntityName(this.entityName); |
146 | 147 | auditLog.setUserName(this.userName); | ... | ... |
... | ... | @@ -73,6 +73,7 @@ public class ComponentDescriptorEntity extends BaseSqlEntity<ComponentDescriptor |
73 | 73 | if (component.getId() != null) { |
74 | 74 | this.setUuid(component.getId().getId()); |
75 | 75 | } |
76 | + this.setCreatedTime(component.getCreatedTime()); | |
76 | 77 | this.actions = component.getActions(); |
77 | 78 | this.type = component.getType(); |
78 | 79 | this.scope = component.getScope(); |
... | ... | @@ -85,6 +86,7 @@ public class ComponentDescriptorEntity extends BaseSqlEntity<ComponentDescriptor |
85 | 86 | @Override |
86 | 87 | public ComponentDescriptor toData() { |
87 | 88 | ComponentDescriptor data = new ComponentDescriptor(new ComponentDescriptorId(this.getUuid())); |
89 | + data.setCreatedTime(createdTime); | |
88 | 90 | data.setType(type); |
89 | 91 | data.setScope(scope); |
90 | 92 | data.setName(this.getName()); | ... | ... |
... | ... | @@ -15,14 +15,12 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
20 | 19 | import lombok.Data; |
21 | 20 | import lombok.EqualsAndHashCode; |
22 | 21 | import org.hibernate.annotations.Type; |
23 | 22 | import org.hibernate.annotations.TypeDef; |
24 | 23 | import org.thingsboard.server.common.data.Customer; |
25 | -import org.thingsboard.server.common.data.UUIDConverter; | |
26 | 24 | import org.thingsboard.server.common.data.id.CustomerId; |
27 | 25 | import org.thingsboard.server.common.data.id.TenantId; |
28 | 26 | import org.thingsboard.server.dao.model.BaseSqlEntity; |
... | ... | @@ -33,6 +31,7 @@ import org.thingsboard.server.dao.util.mapping.JsonStringType; |
33 | 31 | import javax.persistence.Column; |
34 | 32 | import javax.persistence.Entity; |
35 | 33 | import javax.persistence.Table; |
34 | +import java.util.UUID; | |
36 | 35 | |
37 | 36 | @Data |
38 | 37 | @EqualsAndHashCode(callSuper = true) |
... | ... | @@ -42,7 +41,7 @@ import javax.persistence.Table; |
42 | 41 | public final class CustomerEntity extends BaseSqlEntity<Customer> implements SearchTextEntity<Customer> { |
43 | 42 | |
44 | 43 | @Column(name = ModelConstants.CUSTOMER_TENANT_ID_PROPERTY) |
45 | - private String tenantId; | |
44 | + private UUID tenantId; | |
46 | 45 | |
47 | 46 | @Column(name = ModelConstants.CUSTOMER_TITLE_PROPERTY) |
48 | 47 | private String title; |
... | ... | @@ -86,7 +85,8 @@ public final class CustomerEntity extends BaseSqlEntity<Customer> implements Sea |
86 | 85 | if (customer.getId() != null) { |
87 | 86 | this.setUuid(customer.getId().getId()); |
88 | 87 | } |
89 | - this.tenantId = UUIDConverter.fromTimeUUID(customer.getTenantId().getId()); | |
88 | + this.setCreatedTime(customer.getCreatedTime()); | |
89 | + this.tenantId = customer.getTenantId().getId(); | |
90 | 90 | this.title = customer.getTitle(); |
91 | 91 | this.country = customer.getCountry(); |
92 | 92 | this.state = customer.getState(); |
... | ... | @@ -112,8 +112,8 @@ public final class CustomerEntity extends BaseSqlEntity<Customer> implements Sea |
112 | 112 | @Override |
113 | 113 | public Customer toData() { |
114 | 114 | Customer customer = new Customer(new CustomerId(this.getUuid())); |
115 | - customer.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); | |
116 | - customer.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); | |
115 | + customer.setCreatedTime(createdTime); | |
116 | + customer.setTenantId(new TenantId(tenantId)); | |
117 | 117 | customer.setTitle(title); |
118 | 118 | customer.setCountry(country); |
119 | 119 | customer.setState(state); |
... | ... | @@ -126,4 +126,5 @@ public final class CustomerEntity extends BaseSqlEntity<Customer> implements Sea |
126 | 126 | customer.setAdditionalInfo(additionalInfo); |
127 | 127 | return customer; |
128 | 128 | } |
129 | + | |
129 | 130 | } | ... | ... |
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import com.fasterxml.jackson.core.JsonProcessingException; |
20 | 19 | import com.fasterxml.jackson.databind.JavaType; |
21 | 20 | import com.fasterxml.jackson.databind.JsonNode; |
... | ... | @@ -40,6 +39,7 @@ import javax.persistence.Entity; |
40 | 39 | import javax.persistence.Table; |
41 | 40 | import java.io.IOException; |
42 | 41 | import java.util.HashSet; |
42 | +import java.util.UUID; | |
43 | 43 | |
44 | 44 | @Data |
45 | 45 | @Slf4j |
... | ... | @@ -54,7 +54,7 @@ public final class DashboardEntity extends BaseSqlEntity<Dashboard> implements S |
54 | 54 | objectMapper.getTypeFactory().constructCollectionType(HashSet.class, ShortCustomerInfo.class); |
55 | 55 | |
56 | 56 | @Column(name = ModelConstants.DASHBOARD_TENANT_ID_PROPERTY) |
57 | - private String tenantId; | |
57 | + private UUID tenantId; | |
58 | 58 | |
59 | 59 | @Column(name = ModelConstants.DASHBOARD_TITLE_PROPERTY) |
60 | 60 | private String title; |
... | ... | @@ -77,8 +77,9 @@ public final class DashboardEntity extends BaseSqlEntity<Dashboard> implements S |
77 | 77 | if (dashboard.getId() != null) { |
78 | 78 | this.setUuid(dashboard.getId().getId()); |
79 | 79 | } |
80 | + this.setCreatedTime(dashboard.getCreatedTime()); | |
80 | 81 | if (dashboard.getTenantId() != null) { |
81 | - this.tenantId = toString(dashboard.getTenantId().getId()); | |
82 | + this.tenantId = dashboard.getTenantId().getId(); | |
82 | 83 | } |
83 | 84 | this.title = dashboard.getTitle(); |
84 | 85 | if (dashboard.getAssignedCustomers() != null) { |
... | ... | @@ -104,9 +105,9 @@ public final class DashboardEntity extends BaseSqlEntity<Dashboard> implements S |
104 | 105 | @Override |
105 | 106 | public Dashboard toData() { |
106 | 107 | Dashboard dashboard = new Dashboard(new DashboardId(this.getUuid())); |
107 | - dashboard.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); | |
108 | + dashboard.setCreatedTime(this.getCreatedTime()); | |
108 | 109 | if (tenantId != null) { |
109 | - dashboard.setTenantId(new TenantId(toUUID(tenantId))); | |
110 | + dashboard.setTenantId(new TenantId(tenantId)); | |
110 | 111 | } |
111 | 112 | dashboard.setTitle(title); |
112 | 113 | if (!StringUtils.isEmpty(assignedCustomers)) { | ... | ... |
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import com.fasterxml.jackson.core.JsonProcessingException; |
20 | 19 | import com.fasterxml.jackson.databind.JavaType; |
21 | 20 | import com.fasterxml.jackson.databind.ObjectMapper; |
... | ... | @@ -36,6 +35,7 @@ import javax.persistence.Entity; |
36 | 35 | import javax.persistence.Table; |
37 | 36 | import java.io.IOException; |
38 | 37 | import java.util.HashSet; |
38 | +import java.util.UUID; | |
39 | 39 | |
40 | 40 | @Data |
41 | 41 | @Slf4j |
... | ... | @@ -49,7 +49,7 @@ public class DashboardInfoEntity extends BaseSqlEntity<DashboardInfo> implements |
49 | 49 | objectMapper.getTypeFactory().constructCollectionType(HashSet.class, ShortCustomerInfo.class); |
50 | 50 | |
51 | 51 | @Column(name = ModelConstants.DASHBOARD_TENANT_ID_PROPERTY) |
52 | - private String tenantId; | |
52 | + private UUID tenantId; | |
53 | 53 | |
54 | 54 | @Column(name = ModelConstants.DASHBOARD_TITLE_PROPERTY) |
55 | 55 | private String title; |
... | ... | @@ -68,8 +68,9 @@ public class DashboardInfoEntity extends BaseSqlEntity<DashboardInfo> implements |
68 | 68 | if (dashboardInfo.getId() != null) { |
69 | 69 | this.setUuid(dashboardInfo.getId().getId()); |
70 | 70 | } |
71 | + this.setCreatedTime(dashboardInfo.getCreatedTime()); | |
71 | 72 | if (dashboardInfo.getTenantId() != null) { |
72 | - this.tenantId = toString(dashboardInfo.getTenantId().getId()); | |
73 | + this.tenantId = dashboardInfo.getTenantId().getId(); | |
73 | 74 | } |
74 | 75 | this.title = dashboardInfo.getTitle(); |
75 | 76 | if (dashboardInfo.getAssignedCustomers() != null) { |
... | ... | @@ -98,9 +99,9 @@ public class DashboardInfoEntity extends BaseSqlEntity<DashboardInfo> implements |
98 | 99 | @Override |
99 | 100 | public DashboardInfo toData() { |
100 | 101 | DashboardInfo dashboardInfo = new DashboardInfo(new DashboardId(this.getUuid())); |
101 | - dashboardInfo.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); | |
102 | + dashboardInfo.setCreatedTime(createdTime); | |
102 | 103 | if (tenantId != null) { |
103 | - dashboardInfo.setTenantId(new TenantId(toUUID(tenantId))); | |
104 | + dashboardInfo.setTenantId(new TenantId(tenantId)); | |
104 | 105 | } |
105 | 106 | dashboardInfo.setTitle(title); |
106 | 107 | if (!StringUtils.isEmpty(assignedCustomers)) { | ... | ... |
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import lombok.Data; |
20 | 19 | import lombok.EqualsAndHashCode; |
21 | 20 | import org.thingsboard.server.common.data.id.DeviceCredentialsId; |
... | ... | @@ -31,6 +30,7 @@ import javax.persistence.Entity; |
31 | 30 | import javax.persistence.EnumType; |
32 | 31 | import javax.persistence.Enumerated; |
33 | 32 | import javax.persistence.Table; |
33 | +import java.util.UUID; | |
34 | 34 | |
35 | 35 | @Data |
36 | 36 | @EqualsAndHashCode(callSuper = true) |
... | ... | @@ -39,7 +39,7 @@ import javax.persistence.Table; |
39 | 39 | public final class DeviceCredentialsEntity extends BaseSqlEntity<DeviceCredentials> implements BaseEntity<DeviceCredentials> { |
40 | 40 | |
41 | 41 | @Column(name = ModelConstants.DEVICE_CREDENTIALS_DEVICE_ID_PROPERTY) |
42 | - private String deviceId; | |
42 | + private UUID deviceId; | |
43 | 43 | |
44 | 44 | @Enumerated(EnumType.STRING) |
45 | 45 | @Column(name = ModelConstants.DEVICE_CREDENTIALS_CREDENTIALS_TYPE_PROPERTY) |
... | ... | @@ -59,8 +59,9 @@ public final class DeviceCredentialsEntity extends BaseSqlEntity<DeviceCredentia |
59 | 59 | if (deviceCredentials.getId() != null) { |
60 | 60 | this.setUuid(deviceCredentials.getId().getId()); |
61 | 61 | } |
62 | + this.setCreatedTime(deviceCredentials.getCreatedTime()); | |
62 | 63 | if (deviceCredentials.getDeviceId() != null) { |
63 | - this.deviceId = toString(deviceCredentials.getDeviceId().getId()); | |
64 | + this.deviceId = deviceCredentials.getDeviceId().getId(); | |
64 | 65 | } |
65 | 66 | this.credentialsType = deviceCredentials.getCredentialsType(); |
66 | 67 | this.credentialsId = deviceCredentials.getCredentialsId(); |
... | ... | @@ -70,9 +71,9 @@ public final class DeviceCredentialsEntity extends BaseSqlEntity<DeviceCredentia |
70 | 71 | @Override |
71 | 72 | public DeviceCredentials toData() { |
72 | 73 | DeviceCredentials deviceCredentials = new DeviceCredentials(new DeviceCredentialsId(this.getUuid())); |
73 | - deviceCredentials.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); | |
74 | + deviceCredentials.setCreatedTime(createdTime); | |
74 | 75 | if (deviceId != null) { |
75 | - deviceCredentials.setDeviceId(new DeviceId(toUUID(deviceId))); | |
76 | + deviceCredentials.setDeviceId(new DeviceId(deviceId)); | |
76 | 77 | } |
77 | 78 | deviceCredentials.setCredentialsType(credentialsType); |
78 | 79 | deviceCredentials.setCredentialsId(credentialsId); | ... | ... |
... | ... | @@ -15,9 +15,9 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | +import com.fasterxml.jackson.databind.JsonNode; | |
18 | 19 | import lombok.Data; |
19 | 20 | import lombok.EqualsAndHashCode; |
20 | -import com.fasterxml.jackson.databind.JsonNode; | |
21 | 21 | import org.thingsboard.server.common.data.DeviceInfo; |
22 | 22 | |
23 | 23 | import java.util.HashMap; | ... | ... |
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
20 | 19 | import lombok.Data; |
21 | 20 | import lombok.EqualsAndHashCode; |
... | ... | @@ -36,7 +35,6 @@ import javax.persistence.Entity; |
36 | 35 | import javax.persistence.EnumType; |
37 | 36 | import javax.persistence.Enumerated; |
38 | 37 | import javax.persistence.Table; |
39 | - | |
40 | 38 | import java.util.UUID; |
41 | 39 | |
42 | 40 | import static org.thingsboard.server.dao.model.ModelConstants.EPOCH_DIFF; |
... | ... | @@ -55,17 +53,17 @@ import static org.thingsboard.server.dao.model.ModelConstants.TS_COLUMN; |
55 | 53 | @TypeDef(name = "json", typeClass = JsonStringType.class) |
56 | 54 | @Table(name = EVENT_COLUMN_FAMILY_NAME) |
57 | 55 | @NoArgsConstructor |
58 | -public class EventEntity extends BaseSqlEntity<Event> implements BaseEntity<Event> { | |
56 | +public class EventEntity extends BaseSqlEntity<Event> implements BaseEntity<Event> { | |
59 | 57 | |
60 | 58 | @Column(name = EVENT_TENANT_ID_PROPERTY) |
61 | - private String tenantId; | |
59 | + private UUID tenantId; | |
62 | 60 | |
63 | 61 | @Enumerated(EnumType.STRING) |
64 | 62 | @Column(name = EVENT_ENTITY_TYPE_PROPERTY) |
65 | 63 | private EntityType entityType; |
66 | 64 | |
67 | 65 | @Column(name = EVENT_ENTITY_ID_PROPERTY) |
68 | - private String entityId; | |
66 | + private UUID entityId; | |
69 | 67 | |
70 | 68 | @Column(name = EVENT_TYPE_PROPERTY) |
71 | 69 | private String eventType; |
... | ... | @@ -87,12 +85,13 @@ public class EventEntity extends BaseSqlEntity<Event> implements BaseEntity<Eve |
87 | 85 | } else { |
88 | 86 | this.ts = System.currentTimeMillis(); |
89 | 87 | } |
88 | + this.setCreatedTime(event.getCreatedTime()); | |
90 | 89 | if (event.getTenantId() != null) { |
91 | - this.tenantId = toString(event.getTenantId().getId()); | |
90 | + this.tenantId = event.getTenantId().getId(); | |
92 | 91 | } |
93 | 92 | if (event.getEntityId() != null) { |
94 | 93 | this.entityType = event.getEntityId().getEntityType(); |
95 | - this.entityId = toString(event.getEntityId().getId()); | |
94 | + this.entityId = event.getEntityId().getId(); | |
96 | 95 | } |
97 | 96 | this.eventType = event.getType(); |
98 | 97 | this.eventUid = event.getUid(); |
... | ... | @@ -103,9 +102,9 @@ public class EventEntity extends BaseSqlEntity<Event> implements BaseEntity<Eve |
103 | 102 | @Override |
104 | 103 | public Event toData() { |
105 | 104 | Event event = new Event(new EventId(this.getUuid())); |
106 | - event.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); | |
107 | - event.setTenantId(new TenantId(toUUID(tenantId))); | |
108 | - event.setEntityId(EntityIdFactory.getByTypeAndUuid(entityType, toUUID(entityId))); | |
105 | + event.setCreatedTime(createdTime); | |
106 | + event.setTenantId(new TenantId(tenantId)); | |
107 | + event.setEntityId(EntityIdFactory.getByTypeAndUuid(entityType, entityId)); | |
109 | 108 | event.setBody(body); |
110 | 109 | event.setType(eventType); |
111 | 110 | event.setUid(eventUid); | ... | ... |
... | ... | @@ -18,11 +18,11 @@ package org.thingsboard.server.dao.model.sql; |
18 | 18 | import lombok.AllArgsConstructor; |
19 | 19 | import lombok.Data; |
20 | 20 | import lombok.NoArgsConstructor; |
21 | -import org.thingsboard.server.common.data.UUIDConverter; | |
22 | 21 | import org.thingsboard.server.common.data.relation.EntityRelation; |
23 | 22 | |
24 | 23 | import javax.persistence.Transient; |
25 | 24 | import java.io.Serializable; |
25 | +import java.util.UUID; | |
26 | 26 | |
27 | 27 | @NoArgsConstructor |
28 | 28 | @AllArgsConstructor |
... | ... | @@ -32,17 +32,17 @@ public class RelationCompositeKey implements Serializable { |
32 | 32 | @Transient |
33 | 33 | private static final long serialVersionUID = -4089175869616037592L; |
34 | 34 | |
35 | - private String fromId; | |
35 | + private UUID fromId; | |
36 | 36 | private String fromType; |
37 | - private String toId; | |
37 | + private UUID toId; | |
38 | 38 | private String toType; |
39 | 39 | private String relationType; |
40 | 40 | private String relationTypeGroup; |
41 | 41 | |
42 | 42 | public RelationCompositeKey(EntityRelation relation) { |
43 | - this.fromId = UUIDConverter.fromTimeUUID(relation.getFrom().getId()); | |
43 | + this.fromId = relation.getFrom().getId(); | |
44 | 44 | this.fromType = relation.getFrom().getEntityType().name(); |
45 | - this.toId = UUIDConverter.fromTimeUUID(relation.getTo().getId()); | |
45 | + this.toId = relation.getTo().getId(); | |
46 | 46 | this.toType = relation.getTo().getEntityType().name(); |
47 | 47 | this.relationType = relation.getType(); |
48 | 48 | this.relationTypeGroup = relation.getTypeGroup().name(); | ... | ... |
... | ... | @@ -19,7 +19,6 @@ import com.fasterxml.jackson.databind.JsonNode; |
19 | 19 | import lombok.Data; |
20 | 20 | import org.hibernate.annotations.Type; |
21 | 21 | import org.hibernate.annotations.TypeDef; |
22 | -import org.thingsboard.server.common.data.UUIDConverter; | |
23 | 22 | import org.thingsboard.server.common.data.id.EntityIdFactory; |
24 | 23 | import org.thingsboard.server.common.data.relation.EntityRelation; |
25 | 24 | import org.thingsboard.server.common.data.relation.RelationTypeGroup; |
... | ... | @@ -31,6 +30,7 @@ import javax.persistence.Entity; |
31 | 30 | import javax.persistence.Id; |
32 | 31 | import javax.persistence.IdClass; |
33 | 32 | import javax.persistence.Table; |
33 | +import java.util.UUID; | |
34 | 34 | |
35 | 35 | import static org.thingsboard.server.dao.model.ModelConstants.ADDITIONAL_INFO_PROPERTY; |
36 | 36 | import static org.thingsboard.server.dao.model.ModelConstants.RELATION_COLUMN_FAMILY_NAME; |
... | ... | @@ -49,16 +49,16 @@ import static org.thingsboard.server.dao.model.ModelConstants.RELATION_TYPE_PROP |
49 | 49 | public final class RelationEntity implements ToData<EntityRelation> { |
50 | 50 | |
51 | 51 | @Id |
52 | - @Column(name = RELATION_FROM_ID_PROPERTY) | |
53 | - private String fromId; | |
52 | + @Column(name = RELATION_FROM_ID_PROPERTY, columnDefinition = "uuid") | |
53 | + private UUID fromId; | |
54 | 54 | |
55 | 55 | @Id |
56 | 56 | @Column(name = RELATION_FROM_TYPE_PROPERTY) |
57 | 57 | private String fromType; |
58 | 58 | |
59 | 59 | @Id |
60 | - @Column(name = RELATION_TO_ID_PROPERTY) | |
61 | - private String toId; | |
60 | + @Column(name = RELATION_TO_ID_PROPERTY, columnDefinition = "uuid") | |
61 | + private UUID toId; | |
62 | 62 | |
63 | 63 | @Id |
64 | 64 | @Column(name = RELATION_TO_TYPE_PROPERTY) |
... | ... | @@ -82,11 +82,11 @@ public final class RelationEntity implements ToData<EntityRelation> { |
82 | 82 | |
83 | 83 | public RelationEntity(EntityRelation relation) { |
84 | 84 | if (relation.getTo() != null) { |
85 | - this.toId = UUIDConverter.fromTimeUUID(relation.getTo().getId()); | |
85 | + this.toId = relation.getTo().getId(); | |
86 | 86 | this.toType = relation.getTo().getEntityType().name(); |
87 | 87 | } |
88 | 88 | if (relation.getFrom() != null) { |
89 | - this.fromId = UUIDConverter.fromTimeUUID(relation.getFrom().getId()); | |
89 | + this.fromId = relation.getFrom().getId(); | |
90 | 90 | this.fromType = relation.getFrom().getEntityType().name(); |
91 | 91 | } |
92 | 92 | this.relationType = relation.getType(); |
... | ... | @@ -98,10 +98,10 @@ public final class RelationEntity implements ToData<EntityRelation> { |
98 | 98 | public EntityRelation toData() { |
99 | 99 | EntityRelation relation = new EntityRelation(); |
100 | 100 | if (toId != null && toType != null) { |
101 | - relation.setTo(EntityIdFactory.getByTypeAndUuid(toType, UUIDConverter.fromString(toId))); | |
101 | + relation.setTo(EntityIdFactory.getByTypeAndUuid(toType, toId)); | |
102 | 102 | } |
103 | 103 | if (fromId != null && fromType != null) { |
104 | - relation.setFrom(EntityIdFactory.getByTypeAndUuid(fromType, UUIDConverter.fromString(fromId))); | |
104 | + relation.setFrom(EntityIdFactory.getByTypeAndUuid(fromType, fromId)); | |
105 | 105 | } |
106 | 106 | relation.setType(relationType); |
107 | 107 | relation.setTypeGroup(RelationTypeGroup.valueOf(relationTypeGroup)); | ... | ... |
... | ... | @@ -15,13 +15,11 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
20 | 19 | import lombok.Data; |
21 | 20 | import lombok.EqualsAndHashCode; |
22 | 21 | import org.hibernate.annotations.Type; |
23 | 22 | import org.hibernate.annotations.TypeDef; |
24 | -import org.thingsboard.server.common.data.UUIDConverter; | |
25 | 23 | import org.thingsboard.server.common.data.id.RuleChainId; |
26 | 24 | import org.thingsboard.server.common.data.id.RuleNodeId; |
27 | 25 | import org.thingsboard.server.common.data.id.TenantId; |
... | ... | @@ -35,6 +33,7 @@ import org.thingsboard.server.dao.util.mapping.JsonStringType; |
35 | 33 | import javax.persistence.Column; |
36 | 34 | import javax.persistence.Entity; |
37 | 35 | import javax.persistence.Table; |
36 | +import java.util.UUID; | |
38 | 37 | |
39 | 38 | @Data |
40 | 39 | @EqualsAndHashCode(callSuper = true) |
... | ... | @@ -44,7 +43,7 @@ import javax.persistence.Table; |
44 | 43 | public class RuleChainEntity extends BaseSqlEntity<RuleChain> implements SearchTextEntity<RuleChain> { |
45 | 44 | |
46 | 45 | @Column(name = ModelConstants.RULE_CHAIN_TENANT_ID_PROPERTY) |
47 | - private String tenantId; | |
46 | + private UUID tenantId; | |
48 | 47 | |
49 | 48 | @Column(name = ModelConstants.RULE_CHAIN_NAME_PROPERTY) |
50 | 49 | private String name; |
... | ... | @@ -53,7 +52,7 @@ public class RuleChainEntity extends BaseSqlEntity<RuleChain> implements SearchT |
53 | 52 | private String searchText; |
54 | 53 | |
55 | 54 | @Column(name = ModelConstants.RULE_CHAIN_FIRST_RULE_NODE_ID_PROPERTY) |
56 | - private String firstRuleNodeId; | |
55 | + private UUID firstRuleNodeId; | |
57 | 56 | |
58 | 57 | @Column(name = ModelConstants.RULE_CHAIN_ROOT_PROPERTY) |
59 | 58 | private boolean root; |
... | ... | @@ -76,11 +75,12 @@ public class RuleChainEntity extends BaseSqlEntity<RuleChain> implements SearchT |
76 | 75 | if (ruleChain.getId() != null) { |
77 | 76 | this.setUuid(ruleChain.getUuidId()); |
78 | 77 | } |
79 | - this.tenantId = toString(DaoUtil.getId(ruleChain.getTenantId())); | |
78 | + this.setCreatedTime(ruleChain.getCreatedTime()); | |
79 | + this.tenantId = DaoUtil.getId(ruleChain.getTenantId()); | |
80 | 80 | this.name = ruleChain.getName(); |
81 | 81 | this.searchText = ruleChain.getName(); |
82 | 82 | if (ruleChain.getFirstRuleNodeId() != null) { |
83 | - this.firstRuleNodeId = UUIDConverter.fromTimeUUID(ruleChain.getFirstRuleNodeId().getId()); | |
83 | + this.firstRuleNodeId = ruleChain.getFirstRuleNodeId().getId(); | |
84 | 84 | } |
85 | 85 | this.root = ruleChain.isRoot(); |
86 | 86 | this.debugMode = ruleChain.isDebugMode(); |
... | ... | @@ -101,11 +101,11 @@ public class RuleChainEntity extends BaseSqlEntity<RuleChain> implements SearchT |
101 | 101 | @Override |
102 | 102 | public RuleChain toData() { |
103 | 103 | RuleChain ruleChain = new RuleChain(new RuleChainId(this.getUuid())); |
104 | - ruleChain.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); | |
105 | - ruleChain.setTenantId(new TenantId(toUUID(tenantId))); | |
104 | + ruleChain.setCreatedTime(createdTime); | |
105 | + ruleChain.setTenantId(new TenantId(tenantId)); | |
106 | 106 | ruleChain.setName(name); |
107 | 107 | if (firstRuleNodeId != null) { |
108 | - ruleChain.setFirstRuleNodeId(new RuleNodeId(UUIDConverter.fromString(firstRuleNodeId))); | |
108 | + ruleChain.setFirstRuleNodeId(new RuleNodeId(firstRuleNodeId)); | |
109 | 109 | } |
110 | 110 | ruleChain.setRoot(root); |
111 | 111 | ruleChain.setDebugMode(debugMode); | ... | ... |
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
20 | 19 | import lombok.Data; |
21 | 20 | import lombok.EqualsAndHashCode; |
... | ... | @@ -33,6 +32,7 @@ import org.thingsboard.server.dao.util.mapping.JsonStringType; |
33 | 32 | import javax.persistence.Column; |
34 | 33 | import javax.persistence.Entity; |
35 | 34 | import javax.persistence.Table; |
35 | +import java.util.UUID; | |
36 | 36 | |
37 | 37 | @Data |
38 | 38 | @EqualsAndHashCode(callSuper = true) |
... | ... | @@ -42,7 +42,7 @@ import javax.persistence.Table; |
42 | 42 | public class RuleNodeEntity extends BaseSqlEntity<RuleNode> implements SearchTextEntity<RuleNode> { |
43 | 43 | |
44 | 44 | @Column(name = ModelConstants.RULE_NODE_CHAIN_ID_PROPERTY) |
45 | - private String ruleChainId; | |
45 | + private UUID ruleChainId; | |
46 | 46 | |
47 | 47 | @Column(name = ModelConstants.RULE_NODE_TYPE_PROPERTY) |
48 | 48 | private String type; |
... | ... | @@ -71,8 +71,9 @@ public class RuleNodeEntity extends BaseSqlEntity<RuleNode> implements SearchTex |
71 | 71 | if (ruleNode.getId() != null) { |
72 | 72 | this.setUuid(ruleNode.getUuidId()); |
73 | 73 | } |
74 | + this.setCreatedTime(ruleNode.getCreatedTime()); | |
74 | 75 | if (ruleNode.getRuleChainId() != null) { |
75 | - this.ruleChainId = toString(DaoUtil.getId(ruleNode.getRuleChainId())); | |
76 | + this.ruleChainId = DaoUtil.getId(ruleNode.getRuleChainId()); | |
76 | 77 | } |
77 | 78 | this.type = ruleNode.getType(); |
78 | 79 | this.name = ruleNode.getName(); |
... | ... | @@ -95,9 +96,9 @@ public class RuleNodeEntity extends BaseSqlEntity<RuleNode> implements SearchTex |
95 | 96 | @Override |
96 | 97 | public RuleNode toData() { |
97 | 98 | RuleNode ruleNode = new RuleNode(new RuleNodeId(this.getUuid())); |
98 | - ruleNode.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); | |
99 | + ruleNode.setCreatedTime(createdTime); | |
99 | 100 | if (ruleChainId != null) { |
100 | - ruleNode.setRuleChainId(new RuleChainId(toUUID(ruleChainId))); | |
101 | + ruleNode.setRuleChainId(new RuleChainId(ruleChainId)); | |
101 | 102 | } |
102 | 103 | ruleNode.setType(type); |
103 | 104 | ruleNode.setName(name); | ... | ... |
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
20 | 19 | import lombok.Data; |
21 | 20 | import lombok.EqualsAndHashCode; |
... | ... | @@ -90,6 +89,7 @@ public final class TenantEntity extends BaseSqlEntity<Tenant> implements SearchT |
90 | 89 | if (tenant.getId() != null) { |
91 | 90 | this.setUuid(tenant.getId().getId()); |
92 | 91 | } |
92 | + this.setCreatedTime(tenant.getCreatedTime()); | |
93 | 93 | this.title = tenant.getTitle(); |
94 | 94 | this.region = tenant.getRegion(); |
95 | 95 | this.country = tenant.getCountry(); |
... | ... | @@ -122,7 +122,7 @@ public final class TenantEntity extends BaseSqlEntity<Tenant> implements SearchT |
122 | 122 | @Override |
123 | 123 | public Tenant toData() { |
124 | 124 | Tenant tenant = new Tenant(new TenantId(this.getUuid())); |
125 | - tenant.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); | |
125 | + tenant.setCreatedTime(createdTime); | |
126 | 126 | tenant.setTitle(title); |
127 | 127 | tenant.setRegion(region); |
128 | 128 | tenant.setCountry(country); | ... | ... |
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import lombok.Data; |
20 | 19 | import lombok.EqualsAndHashCode; |
21 | 20 | import org.thingsboard.server.common.data.id.UserCredentialsId; |
... | ... | @@ -28,6 +27,7 @@ import org.thingsboard.server.dao.model.ModelConstants; |
28 | 27 | import javax.persistence.Column; |
29 | 28 | import javax.persistence.Entity; |
30 | 29 | import javax.persistence.Table; |
30 | +import java.util.UUID; | |
31 | 31 | |
32 | 32 | @Data |
33 | 33 | @EqualsAndHashCode(callSuper = true) |
... | ... | @@ -36,7 +36,7 @@ import javax.persistence.Table; |
36 | 36 | public final class UserCredentialsEntity extends BaseSqlEntity<UserCredentials> implements BaseEntity<UserCredentials> { |
37 | 37 | |
38 | 38 | @Column(name = ModelConstants.USER_CREDENTIALS_USER_ID_PROPERTY, unique = true) |
39 | - private String userId; | |
39 | + private UUID userId; | |
40 | 40 | |
41 | 41 | @Column(name = ModelConstants.USER_CREDENTIALS_ENABLED_PROPERTY) |
42 | 42 | private boolean enabled; |
... | ... | @@ -58,8 +58,9 @@ public final class UserCredentialsEntity extends BaseSqlEntity<UserCredentials> |
58 | 58 | if (userCredentials.getId() != null) { |
59 | 59 | this.setUuid(userCredentials.getId().getId()); |
60 | 60 | } |
61 | + this.setCreatedTime(userCredentials.getCreatedTime()); | |
61 | 62 | if (userCredentials.getUserId() != null) { |
62 | - this.userId = toString(userCredentials.getUserId().getId()); | |
63 | + this.userId = userCredentials.getUserId().getId(); | |
63 | 64 | } |
64 | 65 | this.enabled = userCredentials.isEnabled(); |
65 | 66 | this.password = userCredentials.getPassword(); |
... | ... | @@ -70,9 +71,9 @@ public final class UserCredentialsEntity extends BaseSqlEntity<UserCredentials> |
70 | 71 | @Override |
71 | 72 | public UserCredentials toData() { |
72 | 73 | UserCredentials userCredentials = new UserCredentials(new UserCredentialsId(this.getUuid())); |
73 | - userCredentials.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); | |
74 | + userCredentials.setCreatedTime(createdTime); | |
74 | 75 | if (userId != null) { |
75 | - userCredentials.setUserId(new UserId(toUUID(userId))); | |
76 | + userCredentials.setUserId(new UserId(userId)); | |
76 | 77 | } |
77 | 78 | userCredentials.setEnabled(enabled); |
78 | 79 | userCredentials.setPassword(password); | ... | ... |
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
20 | 19 | import lombok.Data; |
21 | 20 | import lombok.EqualsAndHashCode; |
... | ... | @@ -36,9 +35,7 @@ import javax.persistence.Entity; |
36 | 35 | import javax.persistence.EnumType; |
37 | 36 | import javax.persistence.Enumerated; |
38 | 37 | import javax.persistence.Table; |
39 | - | |
40 | -import static org.thingsboard.server.common.data.UUIDConverter.fromString; | |
41 | -import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID; | |
38 | +import java.util.UUID; | |
42 | 39 | |
43 | 40 | /** |
44 | 41 | * Created by Valerii Sosliuk on 4/21/2017. |
... | ... | @@ -51,10 +48,10 @@ import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID; |
51 | 48 | public class UserEntity extends BaseSqlEntity<User> implements SearchTextEntity<User> { |
52 | 49 | |
53 | 50 | @Column(name = ModelConstants.USER_TENANT_ID_PROPERTY) |
54 | - private String tenantId; | |
51 | + private UUID tenantId; | |
55 | 52 | |
56 | 53 | @Column(name = ModelConstants.USER_CUSTOMER_ID_PROPERTY) |
57 | - private String customerId; | |
54 | + private UUID customerId; | |
58 | 55 | |
59 | 56 | @Enumerated(EnumType.STRING) |
60 | 57 | @Column(name = ModelConstants.USER_AUTHORITY_PROPERTY) |
... | ... | @@ -83,12 +80,13 @@ public class UserEntity extends BaseSqlEntity<User> implements SearchTextEntity< |
83 | 80 | if (user.getId() != null) { |
84 | 81 | this.setUuid(user.getId().getId()); |
85 | 82 | } |
83 | + this.setCreatedTime(user.getCreatedTime()); | |
86 | 84 | this.authority = user.getAuthority(); |
87 | 85 | if (user.getTenantId() != null) { |
88 | - this.tenantId = fromTimeUUID(user.getTenantId().getId()); | |
86 | + this.tenantId = user.getTenantId().getId(); | |
89 | 87 | } |
90 | 88 | if (user.getCustomerId() != null) { |
91 | - this.customerId = fromTimeUUID(user.getCustomerId().getId()); | |
89 | + this.customerId = user.getCustomerId().getId(); | |
92 | 90 | } |
93 | 91 | this.email = user.getEmail(); |
94 | 92 | this.firstName = user.getFirstName(); |
... | ... | @@ -109,13 +107,13 @@ public class UserEntity extends BaseSqlEntity<User> implements SearchTextEntity< |
109 | 107 | @Override |
110 | 108 | public User toData() { |
111 | 109 | User user = new User(new UserId(this.getUuid())); |
112 | - user.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); | |
110 | + user.setCreatedTime(createdTime); | |
113 | 111 | user.setAuthority(authority); |
114 | 112 | if (tenantId != null) { |
115 | - user.setTenantId(new TenantId(fromString(tenantId))); | |
113 | + user.setTenantId(new TenantId(tenantId)); | |
116 | 114 | } |
117 | 115 | if (customerId != null) { |
118 | - user.setCustomerId(new CustomerId(fromString(customerId))); | |
116 | + user.setCustomerId(new CustomerId(customerId)); | |
119 | 117 | } |
120 | 118 | user.setEmail(email); |
121 | 119 | user.setFirstName(firstName); | ... | ... |
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
19 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
20 | 19 | import lombok.Data; |
21 | 20 | import lombok.EqualsAndHashCode; |
... | ... | @@ -32,6 +31,7 @@ import org.thingsboard.server.dao.util.mapping.JsonStringType; |
32 | 31 | import javax.persistence.Column; |
33 | 32 | import javax.persistence.Entity; |
34 | 33 | import javax.persistence.Table; |
34 | +import java.util.UUID; | |
35 | 35 | |
36 | 36 | @Data |
37 | 37 | @EqualsAndHashCode(callSuper = true) |
... | ... | @@ -41,7 +41,7 @@ import javax.persistence.Table; |
41 | 41 | public final class WidgetTypeEntity extends BaseSqlEntity<WidgetType> implements BaseEntity<WidgetType> { |
42 | 42 | |
43 | 43 | @Column(name = ModelConstants.WIDGET_TYPE_TENANT_ID_PROPERTY) |
44 | - private String tenantId; | |
44 | + private UUID tenantId; | |
45 | 45 | |
46 | 46 | @Column(name = ModelConstants.WIDGET_TYPE_BUNDLE_ALIAS_PROPERTY) |
47 | 47 | private String bundleAlias; |
... | ... | @@ -64,8 +64,9 @@ public final class WidgetTypeEntity extends BaseSqlEntity<WidgetType> implement |
64 | 64 | if (widgetType.getId() != null) { |
65 | 65 | this.setUuid(widgetType.getId().getId()); |
66 | 66 | } |
67 | + this.setCreatedTime(widgetType.getCreatedTime()); | |
67 | 68 | if (widgetType.getTenantId() != null) { |
68 | - this.tenantId = toString(widgetType.getTenantId().getId()); | |
69 | + this.tenantId = widgetType.getTenantId().getId(); | |
69 | 70 | } |
70 | 71 | this.bundleAlias = widgetType.getBundleAlias(); |
71 | 72 | this.alias = widgetType.getAlias(); |
... | ... | @@ -76,9 +77,9 @@ public final class WidgetTypeEntity extends BaseSqlEntity<WidgetType> implement |
76 | 77 | @Override |
77 | 78 | public WidgetType toData() { |
78 | 79 | WidgetType widgetType = new WidgetType(new WidgetTypeId(this.getUuid())); |
79 | - widgetType.setCreatedTime(Uuids.unixTimestamp(this.getUuid())); | |
80 | + widgetType.setCreatedTime(createdTime); | |
80 | 81 | if (tenantId != null) { |
81 | - widgetType.setTenantId(new TenantId(toUUID(tenantId))); | |
82 | + widgetType.setTenantId(new TenantId(tenantId)); | |
82 | 83 | } |
83 | 84 | widgetType.setBundleAlias(bundleAlias); |
84 | 85 | widgetType.setAlias(alias); | ... | ... |
... | ... | @@ -16,10 +16,8 @@ |
16 | 16 | package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | 18 | |
19 | -import com.datastax.oss.driver.api.core.uuid.Uuids; | |
20 | 19 | import lombok.Data; |
21 | 20 | import lombok.EqualsAndHashCode; |
22 | -import org.thingsboard.server.common.data.UUIDConverter; | |
23 | 21 | import org.thingsboard.server.common.data.id.TenantId; |
24 | 22 | import org.thingsboard.server.common.data.id.WidgetsBundleId; |
25 | 23 | import org.thingsboard.server.common.data.widget.WidgetsBundle; |
... | ... | @@ -30,6 +28,7 @@ import org.thingsboard.server.dao.model.SearchTextEntity; |
30 | 28 | import javax.persistence.Column; |
31 | 29 | import javax.persistence.Entity; |
32 | 30 | import javax.persistence.Table; |
31 | +import java.util.UUID; | |
33 | 32 | |
34 | 33 | @Data |
35 | 34 | @EqualsAndHashCode(callSuper = true) |
... | ... | @@ -38,7 +37,7 @@ import javax.persistence.Table; |
38 | 37 | public final class WidgetsBundleEntity extends BaseSqlEntity<WidgetsBundle> implements SearchTextEntity<WidgetsBundle> { |
39 | 38 | |
40 | 39 | @Column(name = ModelConstants.WIDGETS_BUNDLE_TENANT_ID_PROPERTY) |
41 | - private String tenantId; | |
40 | + private UUID tenantId; | |
42 | 41 | |
43 | 42 | @Column(name = ModelConstants.WIDGETS_BUNDLE_ALIAS_PROPERTY) |
44 | 43 | private String alias; |
... | ... | @@ -57,8 +56,9 @@ public final class WidgetsBundleEntity extends BaseSqlEntity<WidgetsBundle> impl |
57 | 56 | if (widgetsBundle.getId() != null) { |
58 | 57 | this.setUuid(widgetsBundle.getId().getId()); |
59 | 58 | } |
59 | + this.setCreatedTime(widgetsBundle.getCreatedTime()); | |
60 | 60 | if (widgetsBundle.getTenantId() != null) { |
61 | - this.tenantId = UUIDConverter.fromTimeUUID(widgetsBundle.getTenantId().getId()); | |
61 | + this.tenantId = widgetsBundle.getTenantId().getId(); | |
62 | 62 | } |
63 | 63 | this.alias = widgetsBundle.getAlias(); |
64 | 64 | this.title = widgetsBundle.getTitle(); |
... | ... | @@ -76,10 +76,10 @@ public final class WidgetsBundleEntity extends BaseSqlEntity<WidgetsBundle> impl |
76 | 76 | |
77 | 77 | @Override |
78 | 78 | public WidgetsBundle toData() { |
79 | - WidgetsBundle widgetsBundle = new WidgetsBundle(new WidgetsBundleId(UUIDConverter.fromString(id))); | |
80 | - widgetsBundle.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id))); | |
79 | + WidgetsBundle widgetsBundle = new WidgetsBundle(new WidgetsBundleId(id)); | |
80 | + widgetsBundle.setCreatedTime(createdTime); | |
81 | 81 | if (tenantId != null) { |
82 | - widgetsBundle.setTenantId(new TenantId(UUIDConverter.fromString(tenantId))); | |
82 | + widgetsBundle.setTenantId(new TenantId(tenantId)); | |
83 | 83 | } |
84 | 84 | widgetsBundle.setAlias(alias); |
85 | 85 | widgetsBundle.setTitle(title); | ... | ... |
... | ... | @@ -18,7 +18,6 @@ package org.thingsboard.server.dao.model.sqlts.latest; |
18 | 18 | import lombok.AllArgsConstructor; |
19 | 19 | import lombok.Data; |
20 | 20 | import lombok.NoArgsConstructor; |
21 | -import org.thingsboard.server.common.data.EntityType; | |
22 | 21 | |
23 | 22 | import javax.persistence.Transient; |
24 | 23 | import java.io.Serializable; | ... | ... |
... | ... | @@ -19,11 +19,9 @@ import lombok.Data; |
19 | 19 | import org.thingsboard.server.dao.model.sql.AbstractTsKvEntity; |
20 | 20 | import org.thingsboard.server.dao.sqlts.latest.SearchTsKvLatestRepository; |
21 | 21 | |
22 | -import javax.persistence.Column; | |
23 | 22 | import javax.persistence.ColumnResult; |
24 | 23 | import javax.persistence.ConstructorResult; |
25 | 24 | import javax.persistence.Entity; |
26 | -import javax.persistence.Id; | |
27 | 25 | import javax.persistence.IdClass; |
28 | 26 | import javax.persistence.NamedNativeQueries; |
29 | 27 | import javax.persistence.NamedNativeQuery; |
... | ... | @@ -32,8 +30,6 @@ import javax.persistence.SqlResultSetMappings; |
32 | 30 | import javax.persistence.Table; |
33 | 31 | import java.util.UUID; |
34 | 32 | |
35 | -import static org.thingsboard.server.dao.model.ModelConstants.KEY_COLUMN; | |
36 | - | |
37 | 33 | @Data |
38 | 34 | @Entity |
39 | 35 | @Table(name = "ts_kv_latest") | ... | ... |
... | ... | @@ -18,14 +18,10 @@ package org.thingsboard.server.dao.model.sqlts.ts; |
18 | 18 | import lombok.Data; |
19 | 19 | import org.thingsboard.server.dao.model.sql.AbstractTsKvEntity; |
20 | 20 | |
21 | -import javax.persistence.Column; | |
22 | 21 | import javax.persistence.Entity; |
23 | -import javax.persistence.Id; | |
24 | 22 | import javax.persistence.IdClass; |
25 | 23 | import javax.persistence.Table; |
26 | 24 | |
27 | -import static org.thingsboard.server.dao.model.ModelConstants.KEY_COLUMN; | |
28 | - | |
29 | 25 | @Data |
30 | 26 | @Entity |
31 | 27 | @Table(name = "ts_kv") | ... | ... |
... | ... | @@ -15,10 +15,7 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.nosql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.cql.AsyncResultSet; | |
19 | -import com.datastax.oss.driver.api.core.cql.Row; | |
20 | 18 | import com.google.common.base.Function; |
21 | -import com.google.common.collect.Lists; | |
22 | 19 | import com.google.common.util.concurrent.AsyncFunction; |
23 | 20 | import com.google.common.util.concurrent.Futures; |
24 | 21 | import com.google.common.util.concurrent.ListenableFuture; |
... | ... | @@ -27,11 +24,8 @@ import org.thingsboard.common.util.ThingsBoardThreadFactory; |
27 | 24 | import javax.annotation.Nullable; |
28 | 25 | import javax.annotation.PostConstruct; |
29 | 26 | import javax.annotation.PreDestroy; |
30 | -import java.util.ArrayList; | |
31 | -import java.util.List; | |
32 | 27 | import java.util.concurrent.ExecutorService; |
33 | 28 | import java.util.concurrent.Executors; |
34 | -import java.util.stream.Collectors; | |
35 | 29 | |
36 | 30 | /** |
37 | 31 | * Created by ashvayka on 21.02.17. | ... | ... |
... | ... | @@ -15,7 +15,6 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.nosql; |
17 | 17 | |
18 | -import com.datastax.oss.driver.api.core.cql.AsyncResultSet; | |
19 | 18 | import com.google.common.util.concurrent.ListenableFuture; |
20 | 19 | import com.google.common.util.concurrent.SettableFuture; |
21 | 20 | import lombok.extern.slf4j.Slf4j; | ... | ... |
... | ... | @@ -59,6 +59,4 @@ public interface RelationDao { |
59 | 59 | |
60 | 60 | ListenableFuture<Boolean> deleteOutboundRelationsAsync(TenantId tenantId, EntityId entity); |
61 | 61 | |
62 | - ListenableFuture<PageData<EntityRelation>> findRelations(TenantId tenantId, EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType toType, TimePageLink pageLink); | |
63 | - | |
64 | 62 | } | ... | ... |
... | ... | @@ -20,9 +20,6 @@ import org.thingsboard.server.common.data.id.TenantId; |
20 | 20 | import org.thingsboard.server.common.data.page.PageData; |
21 | 21 | import org.thingsboard.server.common.data.page.PageLink; |
22 | 22 | |
23 | -import java.util.List; | |
24 | -import java.util.UUID; | |
25 | - | |
26 | 23 | public abstract class PaginatedRemover<I, D extends IdBased<?>> { |
27 | 24 | |
28 | 25 | private static final int DEFAULT_LIMIT = 100; | ... | ... |
... | ... | @@ -20,9 +20,6 @@ import org.thingsboard.server.common.data.id.TenantId; |
20 | 20 | import org.thingsboard.server.common.data.page.PageData; |
21 | 21 | import org.thingsboard.server.common.data.page.TimePageLink; |
22 | 22 | |
23 | -import java.util.List; | |
24 | -import java.util.UUID; | |
25 | - | |
26 | 23 | public abstract class TimePaginatedRemover<I, D extends IdBased<?>> { |
27 | 24 | |
28 | 25 | private static final int DEFAULT_LIMIT = 100; | ... | ... |
... | ... | @@ -20,7 +20,6 @@ import org.apache.commons.lang3.StringUtils; |
20 | 20 | import org.springframework.beans.factory.annotation.Autowired; |
21 | 21 | import org.springframework.stereotype.Service; |
22 | 22 | import org.thingsboard.server.common.data.AdminSettings; |
23 | -import org.thingsboard.server.common.data.Tenant; | |
24 | 23 | import org.thingsboard.server.common.data.id.AdminSettingsId; |
25 | 24 | import org.thingsboard.server.common.data.id.TenantId; |
26 | 25 | import org.thingsboard.server.dao.exception.DataValidationException; | ... | ... |
... | ... | @@ -30,8 +30,6 @@ import java.util.List; |
30 | 30 | import java.util.Optional; |
31 | 31 | import java.util.UUID; |
32 | 32 | |
33 | -import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID; | |
34 | - | |
35 | 33 | /** |
36 | 34 | * @author Valerii Sosliuk |
37 | 35 | */ |
... | ... | @@ -42,9 +40,10 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D> |
42 | 40 | |
43 | 41 | protected abstract Class<E> getEntityClass(); |
44 | 42 | |
45 | - protected abstract CrudRepository<E, String> getCrudRepository(); | |
43 | + protected abstract CrudRepository<E, UUID> getCrudRepository(); | |
46 | 44 | |
47 | - protected void setSearchText(E entity) {} | |
45 | + protected void setSearchText(E entity) { | |
46 | + } | |
48 | 47 | |
49 | 48 | @Override |
50 | 49 | @Transactional |
... | ... | @@ -59,7 +58,9 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D> |
59 | 58 | setSearchText(entity); |
60 | 59 | log.debug("Saving entity {}", entity); |
61 | 60 | if (entity.getUuid() == null) { |
62 | - entity.setUuid(Uuids.timeBased()); | |
61 | + UUID uuid = Uuids.timeBased(); | |
62 | + entity.setUuid(uuid); | |
63 | + entity.setCreatedTime(Uuids.unixTimestamp(uuid)); | |
63 | 64 | } |
64 | 65 | entity = getCrudRepository().save(entity); |
65 | 66 | return DaoUtil.getData(entity); |
... | ... | @@ -68,23 +69,22 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D> |
68 | 69 | @Override |
69 | 70 | public D findById(TenantId tenantId, UUID key) { |
70 | 71 | log.debug("Get entity by key {}", key); |
71 | - Optional<E> entity = getCrudRepository().findById(fromTimeUUID(key)); | |
72 | + Optional<E> entity = getCrudRepository().findById(key); | |
72 | 73 | return DaoUtil.getData(entity); |
73 | 74 | } |
74 | 75 | |
75 | 76 | @Override |
76 | 77 | public ListenableFuture<D> findByIdAsync(TenantId tenantId, UUID key) { |
77 | 78 | log.debug("Get entity by key async {}", key); |
78 | - return service.submit(() -> DaoUtil.getData(getCrudRepository().findById(fromTimeUUID(key)))); | |
79 | + return service.submit(() -> DaoUtil.getData(getCrudRepository().findById(key))); | |
79 | 80 | } |
80 | 81 | |
81 | 82 | @Override |
82 | 83 | @Transactional |
83 | 84 | public boolean removeById(TenantId tenantId, UUID id) { |
84 | - String key = fromTimeUUID(id); | |
85 | - getCrudRepository().deleteById(key); | |
86 | - log.debug("Remove request: {}", key); | |
87 | - return !getCrudRepository().existsById(key); | |
85 | + getCrudRepository().deleteById(id); | |
86 | + log.debug("Remove request: {}", id); | |
87 | + return !getCrudRepository().existsById(id); | |
88 | 88 | } |
89 | 89 | |
90 | 90 | @Override | ... | ... |
... | ... | @@ -34,6 +34,7 @@ import java.util.UUID; |
34 | 34 | */ |
35 | 35 | public abstract class JpaAbstractSearchTimeDao<E extends BaseEntity<D>, D> extends JpaAbstractDao<E, D> { |
36 | 36 | |
37 | + //TODO 3.1: refactoring to createdTime column | |
37 | 38 | public static <T> Specification<T> getTimeSearchPageSpec(TimePageLink pageLink, String idColumn) { |
38 | 39 | return new Specification<T>() { |
39 | 40 | @Override | ... | ... |
... | ... | @@ -20,21 +20,21 @@ import org.springframework.data.domain.Pageable; |
20 | 20 | import org.springframework.data.jpa.repository.Query; |
21 | 21 | import org.springframework.data.repository.CrudRepository; |
22 | 22 | import org.springframework.data.repository.query.Param; |
23 | -import org.thingsboard.server.common.data.EntityType; | |
24 | 23 | import org.thingsboard.server.dao.model.sql.AlarmEntity; |
25 | 24 | import org.thingsboard.server.dao.model.sql.AlarmInfoEntity; |
26 | 25 | import org.thingsboard.server.dao.util.SqlDao; |
27 | 26 | |
28 | 27 | import java.util.List; |
28 | +import java.util.UUID; | |
29 | 29 | |
30 | 30 | /** |
31 | 31 | * Created by Valerii Sosliuk on 5/21/2017. |
32 | 32 | */ |
33 | 33 | @SqlDao |
34 | -public interface AlarmRepository extends CrudRepository<AlarmEntity, String> { | |
34 | +public interface AlarmRepository extends CrudRepository<AlarmEntity, UUID> { | |
35 | 35 | |
36 | 36 | @Query("SELECT a FROM AlarmEntity a WHERE a.originatorId = :originatorId AND a.type = :alarmType ORDER BY a.startTs DESC") |
37 | - List<AlarmEntity> findLatestByOriginatorAndType(@Param("originatorId") String originatorId, | |
37 | + List<AlarmEntity> findLatestByOriginatorAndType(@Param("originatorId") UUID originatorId, | |
38 | 38 | @Param("alarmType") String alarmType, |
39 | 39 | Pageable pageable); |
40 | 40 | |
... | ... | @@ -46,9 +46,8 @@ public interface AlarmRepository extends CrudRepository<AlarmEntity, String> { |
46 | 46 | "AND re.relationType = :relationType " + |
47 | 47 | "AND re.fromId = :affectedEntityId " + |
48 | 48 | "AND re.fromType = :affectedEntityType " + |
49 | - "AND (:startId IS NULL OR a.id >= :startId) " + | |
50 | - "AND (:endId IS NULL OR a.id <= :endId) " + | |
51 | - "AND (:idOffset IS NULL OR a.id < :idOffset) " + | |
49 | + "AND (:startTime IS NULL OR a.createdTime >= :startTime) " + | |
50 | + "AND (:endTime IS NULL OR a.createdTime <= :endTime) " + | |
52 | 51 | "AND (LOWER(a.type) LIKE LOWER(CONCAT(:searchText, '%'))" + |
53 | 52 | "OR LOWER(a.severity) LIKE LOWER(CONCAT(:searchText, '%'))" + |
54 | 53 | "OR LOWER(a.status) LIKE LOWER(CONCAT(:searchText, '%')))", |
... | ... | @@ -60,19 +59,17 @@ public interface AlarmRepository extends CrudRepository<AlarmEntity, String> { |
60 | 59 | "AND re.relationType = :relationType " + |
61 | 60 | "AND re.fromId = :affectedEntityId " + |
62 | 61 | "AND re.fromType = :affectedEntityType " + |
63 | - "AND (:startId IS NULL OR a.id >= :startId) " + | |
64 | - "AND (:endId IS NULL OR a.id <= :endId) " + | |
65 | - "AND (:idOffset IS NULL OR a.id < :idOffset) " + | |
62 | + "AND (:startTime IS NULL OR a.createdTime >= :startTime) " + | |
63 | + "AND (:endTime IS NULL OR a.createdTime <= :endTime) " + | |
66 | 64 | "AND (LOWER(a.type) LIKE LOWER(CONCAT(:searchText, '%'))" + |
67 | 65 | "OR LOWER(a.severity) LIKE LOWER(CONCAT(:searchText, '%'))" + |
68 | 66 | "OR LOWER(a.status) LIKE LOWER(CONCAT(:searchText, '%')))") |
69 | - Page<AlarmInfoEntity> findAlarms(@Param("tenantId") String tenantId, | |
70 | - @Param("affectedEntityId") String affectedEntityId, | |
67 | + Page<AlarmInfoEntity> findAlarms(@Param("tenantId") UUID tenantId, | |
68 | + @Param("affectedEntityId") UUID affectedEntityId, | |
71 | 69 | @Param("affectedEntityType") String affectedEntityType, |
72 | 70 | @Param("relationType") String relationType, |
73 | - @Param("startId") String startId, | |
74 | - @Param("endId") String endId, | |
75 | - @Param("idOffset") String idOffset, | |
71 | + @Param("startTime") Long startTime, | |
72 | + @Param("endTime") Long endTime, | |
76 | 73 | @Param("searchText") String searchText, |
77 | 74 | Pageable pageable); |
78 | 75 | } | ... | ... |
... | ... | @@ -41,7 +41,6 @@ import java.util.List; |
41 | 41 | import java.util.Objects; |
42 | 42 | import java.util.UUID; |
43 | 43 | |
44 | -import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID; | |
45 | 44 | import static org.thingsboard.server.dao.DaoUtil.endTimeToId; |
46 | 45 | import static org.thingsboard.server.dao.DaoUtil.startTimeToId; |
47 | 46 | |
... | ... | @@ -65,7 +64,7 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A |
65 | 64 | } |
66 | 65 | |
67 | 66 | @Override |
68 | - protected CrudRepository<AlarmEntity, String> getCrudRepository() { | |
67 | + protected CrudRepository<AlarmEntity, UUID> getCrudRepository() { | |
69 | 68 | return alarmRepository; |
70 | 69 | } |
71 | 70 | |
... | ... | @@ -78,7 +77,7 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A |
78 | 77 | public ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) { |
79 | 78 | return service.submit(() -> { |
80 | 79 | List<AlarmEntity> latest = alarmRepository.findLatestByOriginatorAndType( |
81 | - UUIDConverter.fromTimeUUID(originator.getId()), | |
80 | + originator.getId(), | |
82 | 81 | type, |
83 | 82 | PageRequest.of(0, 1)); |
84 | 83 | return latest.isEmpty() ? null : DaoUtil.getData(latest.get(0)); |
... | ... | @@ -106,13 +105,12 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A |
106 | 105 | |
107 | 106 | return DaoUtil.toPageData( |
108 | 107 | alarmRepository.findAlarms( |
109 | - fromTimeUUID(tenantId.getId()), | |
110 | - fromTimeUUID(affectedEntity.getId()), | |
108 | + tenantId.getId(), | |
109 | + affectedEntity.getId(), | |
111 | 110 | affectedEntity.getEntityType().name(), |
112 | 111 | relationType, |
113 | - startTimeToId(query.getPageLink().getStartTime()), | |
114 | - endTimeToId(query.getPageLink().getEndTime()), | |
115 | - query.getIdOffset() != null ? UUIDConverter.fromTimeUUID(query.getIdOffset()) : null, | |
112 | + query.getPageLink().getStartTime(), | |
113 | + query.getPageLink().getEndTime(), | |
116 | 114 | Objects.toString(query.getPageLink().getTextSearch(), ""), |
117 | 115 | DaoUtil.toPageable(query.getPageLink()) |
118 | 116 | ) | ... | ... |
... | ... | @@ -18,7 +18,6 @@ package org.thingsboard.server.dao.sql.asset; |
18 | 18 | import org.springframework.data.domain.Page; |
19 | 19 | import org.springframework.data.domain.Pageable; |
20 | 20 | import org.springframework.data.jpa.repository.Query; |
21 | -import org.springframework.data.repository.CrudRepository; | |
22 | 21 | import org.springframework.data.repository.PagingAndSortingRepository; |
23 | 22 | import org.springframework.data.repository.query.Param; |
24 | 23 | import org.thingsboard.server.dao.model.sql.AssetEntity; |
... | ... | @@ -26,22 +25,23 @@ import org.thingsboard.server.dao.model.sql.AssetInfoEntity; |
26 | 25 | import org.thingsboard.server.dao.util.SqlDao; |
27 | 26 | |
28 | 27 | import java.util.List; |
28 | +import java.util.UUID; | |
29 | 29 | |
30 | 30 | /** |
31 | 31 | * Created by Valerii Sosliuk on 5/21/2017. |
32 | 32 | */ |
33 | 33 | @SqlDao |
34 | -public interface AssetRepository extends PagingAndSortingRepository<AssetEntity, String> { | |
34 | +public interface AssetRepository extends PagingAndSortingRepository<AssetEntity, UUID> { | |
35 | 35 | |
36 | 36 | @Query("SELECT new org.thingsboard.server.dao.model.sql.AssetInfoEntity(a, c.title, c.additionalInfo) " + |
37 | 37 | "FROM AssetEntity a " + |
38 | 38 | "LEFT JOIN CustomerEntity c on c.id = a.customerId " + |
39 | 39 | "WHERE a.id = :assetId") |
40 | - AssetInfoEntity findAssetInfoById(@Param("assetId") String assetId); | |
40 | + AssetInfoEntity findAssetInfoById(@Param("assetId") UUID assetId); | |
41 | 41 | |
42 | 42 | @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " + |
43 | 43 | "AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
44 | - Page<AssetEntity> findByTenantId(@Param("tenantId") String tenantId, | |
44 | + Page<AssetEntity> findByTenantId(@Param("tenantId") UUID tenantId, | |
45 | 45 | @Param("textSearch") String textSearch, |
46 | 46 | Pageable pageable); |
47 | 47 | |
... | ... | @@ -50,15 +50,15 @@ public interface AssetRepository extends PagingAndSortingRepository<AssetEntity, |
50 | 50 | "LEFT JOIN CustomerEntity c on c.id = a.customerId " + |
51 | 51 | "WHERE a.tenantId = :tenantId " + |
52 | 52 | "AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
53 | - Page<AssetInfoEntity> findAssetInfosByTenantId(@Param("tenantId") String tenantId, | |
53 | + Page<AssetInfoEntity> findAssetInfosByTenantId(@Param("tenantId") UUID tenantId, | |
54 | 54 | @Param("textSearch") String textSearch, |
55 | 55 | Pageable pageable); |
56 | 56 | |
57 | 57 | @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " + |
58 | 58 | "AND a.customerId = :customerId " + |
59 | 59 | "AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
60 | - Page<AssetEntity> findByTenantIdAndCustomerId(@Param("tenantId") String tenantId, | |
61 | - @Param("customerId") String customerId, | |
60 | + Page<AssetEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, | |
61 | + @Param("customerId") UUID customerId, | |
62 | 62 | @Param("textSearch") String textSearch, |
63 | 63 | Pageable pageable); |
64 | 64 | |
... | ... | @@ -68,21 +68,21 @@ public interface AssetRepository extends PagingAndSortingRepository<AssetEntity, |
68 | 68 | "WHERE a.tenantId = :tenantId " + |
69 | 69 | "AND a.customerId = :customerId " + |
70 | 70 | "AND LOWER(a.searchText) LIKE LOWER(CONCAT(:searchText, '%'))") |
71 | - Page<AssetInfoEntity> findAssetInfosByTenantIdAndCustomerId(@Param("tenantId") String tenantId, | |
72 | - @Param("customerId") String customerId, | |
71 | + Page<AssetInfoEntity> findAssetInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, | |
72 | + @Param("customerId") UUID customerId, | |
73 | 73 | @Param("searchText") String searchText, |
74 | 74 | Pageable pageable); |
75 | 75 | |
76 | - List<AssetEntity> findByTenantIdAndIdIn(String tenantId, List<String> assetIds); | |
76 | + List<AssetEntity> findByTenantIdAndIdIn(UUID tenantId, List<UUID> assetIds); | |
77 | 77 | |
78 | - List<AssetEntity> findByTenantIdAndCustomerIdAndIdIn(String tenantId, String customerId, List<String> assetIds); | |
78 | + List<AssetEntity> findByTenantIdAndCustomerIdAndIdIn(UUID tenantId, UUID customerId, List<UUID> assetIds); | |
79 | 79 | |
80 | - AssetEntity findByTenantIdAndName(String tenantId, String name); | |
80 | + AssetEntity findByTenantIdAndName(UUID tenantId, String name); | |
81 | 81 | |
82 | 82 | @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " + |
83 | 83 | "AND a.type = :type " + |
84 | 84 | "AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
85 | - Page<AssetEntity> findByTenantIdAndType(@Param("tenantId") String tenantId, | |
85 | + Page<AssetEntity> findByTenantIdAndType(@Param("tenantId") UUID tenantId, | |
86 | 86 | @Param("type") String type, |
87 | 87 | @Param("textSearch") String textSearch, |
88 | 88 | Pageable pageable); |
... | ... | @@ -93,7 +93,7 @@ public interface AssetRepository extends PagingAndSortingRepository<AssetEntity, |
93 | 93 | "WHERE a.tenantId = :tenantId " + |
94 | 94 | "AND a.type = :type " + |
95 | 95 | "AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
96 | - Page<AssetInfoEntity> findAssetInfosByTenantIdAndType(@Param("tenantId") String tenantId, | |
96 | + Page<AssetInfoEntity> findAssetInfosByTenantIdAndType(@Param("tenantId") UUID tenantId, | |
97 | 97 | @Param("type") String type, |
98 | 98 | @Param("textSearch") String textSearch, |
99 | 99 | Pageable pageable); |
... | ... | @@ -102,8 +102,8 @@ public interface AssetRepository extends PagingAndSortingRepository<AssetEntity, |
102 | 102 | @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " + |
103 | 103 | "AND a.customerId = :customerId AND a.type = :type " + |
104 | 104 | "AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
105 | - Page<AssetEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") String tenantId, | |
106 | - @Param("customerId") String customerId, | |
105 | + Page<AssetEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, | |
106 | + @Param("customerId") UUID customerId, | |
107 | 107 | @Param("type") String type, |
108 | 108 | @Param("textSearch") String textSearch, |
109 | 109 | Pageable pageable); |
... | ... | @@ -115,13 +115,13 @@ public interface AssetRepository extends PagingAndSortingRepository<AssetEntity, |
115 | 115 | "AND a.customerId = :customerId " + |
116 | 116 | "AND a.type = :type " + |
117 | 117 | "AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
118 | - Page<AssetInfoEntity> findAssetInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") String tenantId, | |
119 | - @Param("customerId") String customerId, | |
118 | + Page<AssetInfoEntity> findAssetInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, | |
119 | + @Param("customerId") UUID customerId, | |
120 | 120 | @Param("type") String type, |
121 | 121 | @Param("textSearch") String textSearch, |
122 | 122 | Pageable pageable); |
123 | 123 | |
124 | 124 | @Query("SELECT DISTINCT a.type FROM AssetEntity a WHERE a.tenantId = :tenantId") |
125 | - List<String> findTenantAssetTypes(@Param("tenantId") String tenantId); | |
125 | + List<String> findTenantAssetTypes(@Param("tenantId") UUID tenantId); | |
126 | 126 | |
127 | 127 | } | ... | ... |
... | ... | @@ -17,7 +17,6 @@ package org.thingsboard.server.dao.sql.asset; |
17 | 17 | |
18 | 18 | import com.google.common.util.concurrent.ListenableFuture; |
19 | 19 | import org.springframework.beans.factory.annotation.Autowired; |
20 | -import org.springframework.data.domain.PageRequest; | |
21 | 20 | import org.springframework.data.repository.CrudRepository; |
22 | 21 | import org.springframework.stereotype.Component; |
23 | 22 | import org.thingsboard.server.common.data.EntitySubtype; |
... | ... | @@ -41,9 +40,6 @@ import java.util.Objects; |
41 | 40 | import java.util.Optional; |
42 | 41 | import java.util.UUID; |
43 | 42 | |
44 | -import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID; | |
45 | -import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUIDs; | |
46 | - | |
47 | 43 | /** |
48 | 44 | * Created by Valerii Sosliuk on 5/19/2017. |
49 | 45 | */ |
... | ... | @@ -60,20 +56,20 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im |
60 | 56 | } |
61 | 57 | |
62 | 58 | @Override |
63 | - protected CrudRepository<AssetEntity, String> getCrudRepository() { | |
59 | + protected CrudRepository<AssetEntity, UUID> getCrudRepository() { | |
64 | 60 | return assetRepository; |
65 | 61 | } |
66 | 62 | |
67 | 63 | @Override |
68 | 64 | public AssetInfo findAssetInfoById(TenantId tenantId, UUID assetId) { |
69 | - return DaoUtil.getData(assetRepository.findAssetInfoById(fromTimeUUID(assetId))); | |
65 | + return DaoUtil.getData(assetRepository.findAssetInfoById(assetId)); | |
70 | 66 | } |
71 | 67 | |
72 | 68 | @Override |
73 | 69 | public PageData<Asset> findAssetsByTenantId(UUID tenantId, PageLink pageLink) { |
74 | 70 | return DaoUtil.toPageData(assetRepository |
75 | 71 | .findByTenantId( |
76 | - fromTimeUUID(tenantId), | |
72 | + tenantId, | |
77 | 73 | Objects.toString(pageLink.getTextSearch(), ""), |
78 | 74 | DaoUtil.toPageable(pageLink))); |
79 | 75 | } |
... | ... | @@ -82,7 +78,7 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im |
82 | 78 | public PageData<AssetInfo> findAssetInfosByTenantId(UUID tenantId, PageLink pageLink) { |
83 | 79 | return DaoUtil.toPageData( |
84 | 80 | assetRepository.findAssetInfosByTenantId( |
85 | - fromTimeUUID(tenantId), | |
81 | + tenantId, | |
86 | 82 | Objects.toString(pageLink.getTextSearch(), ""), |
87 | 83 | DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); |
88 | 84 | } |
... | ... | @@ -90,15 +86,15 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im |
90 | 86 | @Override |
91 | 87 | public ListenableFuture<List<Asset>> findAssetsByTenantIdAndIdsAsync(UUID tenantId, List<UUID> assetIds) { |
92 | 88 | return service.submit(() -> |
93 | - DaoUtil.convertDataList(assetRepository.findByTenantIdAndIdIn(fromTimeUUID(tenantId), fromTimeUUIDs(assetIds)))); | |
89 | + DaoUtil.convertDataList(assetRepository.findByTenantIdAndIdIn(tenantId, assetIds))); | |
94 | 90 | } |
95 | 91 | |
96 | 92 | @Override |
97 | 93 | public PageData<Asset> findAssetsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, PageLink pageLink) { |
98 | 94 | return DaoUtil.toPageData(assetRepository |
99 | 95 | .findByTenantIdAndCustomerId( |
100 | - fromTimeUUID(tenantId), | |
101 | - fromTimeUUID(customerId), | |
96 | + tenantId, | |
97 | + customerId, | |
102 | 98 | Objects.toString(pageLink.getTextSearch(), ""), |
103 | 99 | DaoUtil.toPageable(pageLink))); |
104 | 100 | } |
... | ... | @@ -107,8 +103,8 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im |
107 | 103 | public PageData<AssetInfo> findAssetInfosByTenantIdAndCustomerId(UUID tenantId, UUID customerId, PageLink pageLink) { |
108 | 104 | return DaoUtil.toPageData( |
109 | 105 | assetRepository.findAssetInfosByTenantIdAndCustomerId( |
110 | - fromTimeUUID(tenantId), | |
111 | - fromTimeUUID(customerId), | |
106 | + tenantId, | |
107 | + customerId, | |
112 | 108 | Objects.toString(pageLink.getTextSearch(), ""), |
113 | 109 | DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); |
114 | 110 | } |
... | ... | @@ -116,12 +112,12 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im |
116 | 112 | @Override |
117 | 113 | public ListenableFuture<List<Asset>> findAssetsByTenantIdAndCustomerIdAndIdsAsync(UUID tenantId, UUID customerId, List<UUID> assetIds) { |
118 | 114 | return service.submit(() -> |
119 | - DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdAndIdIn(fromTimeUUID(tenantId), fromTimeUUID(customerId), fromTimeUUIDs(assetIds)))); | |
115 | + DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdAndIdIn(tenantId, customerId, assetIds))); | |
120 | 116 | } |
121 | 117 | |
122 | 118 | @Override |
123 | 119 | public Optional<Asset> findAssetsByTenantIdAndName(UUID tenantId, String name) { |
124 | - Asset asset = DaoUtil.getData(assetRepository.findByTenantIdAndName(fromTimeUUID(tenantId), name)); | |
120 | + Asset asset = DaoUtil.getData(assetRepository.findByTenantIdAndName(tenantId, name)); | |
125 | 121 | return Optional.ofNullable(asset); |
126 | 122 | } |
127 | 123 | |
... | ... | @@ -129,7 +125,7 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im |
129 | 125 | public PageData<Asset> findAssetsByTenantIdAndType(UUID tenantId, String type, PageLink pageLink) { |
130 | 126 | return DaoUtil.toPageData(assetRepository |
131 | 127 | .findByTenantIdAndType( |
132 | - fromTimeUUID(tenantId), | |
128 | + tenantId, | |
133 | 129 | type, |
134 | 130 | Objects.toString(pageLink.getTextSearch(), ""), |
135 | 131 | DaoUtil.toPageable(pageLink))); |
... | ... | @@ -139,7 +135,7 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im |
139 | 135 | public PageData<AssetInfo> findAssetInfosByTenantIdAndType(UUID tenantId, String type, PageLink pageLink) { |
140 | 136 | return DaoUtil.toPageData( |
141 | 137 | assetRepository.findAssetInfosByTenantIdAndType( |
142 | - fromTimeUUID(tenantId), | |
138 | + tenantId, | |
143 | 139 | type, |
144 | 140 | Objects.toString(pageLink.getTextSearch(), ""), |
145 | 141 | DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); |
... | ... | @@ -149,8 +145,8 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im |
149 | 145 | public PageData<Asset> findAssetsByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, PageLink pageLink) { |
150 | 146 | return DaoUtil.toPageData(assetRepository |
151 | 147 | .findByTenantIdAndCustomerIdAndType( |
152 | - fromTimeUUID(tenantId), | |
153 | - fromTimeUUID(customerId), | |
148 | + tenantId, | |
149 | + customerId, | |
154 | 150 | type, |
155 | 151 | Objects.toString(pageLink.getTextSearch(), ""), |
156 | 152 | DaoUtil.toPageable(pageLink))); |
... | ... | @@ -160,8 +156,8 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im |
160 | 156 | public PageData<AssetInfo> findAssetInfosByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, PageLink pageLink) { |
161 | 157 | return DaoUtil.toPageData( |
162 | 158 | assetRepository.findAssetInfosByTenantIdAndCustomerIdAndType( |
163 | - fromTimeUUID(tenantId), | |
164 | - fromTimeUUID(customerId), | |
159 | + tenantId, | |
160 | + customerId, | |
165 | 161 | type, |
166 | 162 | Objects.toString(pageLink.getTextSearch(), ""), |
167 | 163 | DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); |
... | ... | @@ -169,7 +165,7 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im |
169 | 165 | |
170 | 166 | @Override |
171 | 167 | public ListenableFuture<List<EntitySubtype>> findTenantAssetTypesAsync(UUID tenantId) { |
172 | - return service.submit(() -> convertTenantAssetTypesToDto(tenantId, assetRepository.findTenantAssetTypes(fromTimeUUID(tenantId)))); | |
168 | + return service.submit(() -> convertTenantAssetTypesToDto(tenantId, assetRepository.findTenantAssetTypes(tenantId))); | |
173 | 169 | } |
174 | 170 | |
175 | 171 | private List<EntitySubtype> convertTenantAssetTypesToDto(UUID tenantId, List<String> types) { | ... | ... |
... | ... | @@ -29,6 +29,7 @@ import org.thingsboard.server.dao.util.SqlDao; |
29 | 29 | |
30 | 30 | import java.sql.PreparedStatement; |
31 | 31 | import java.sql.SQLException; |
32 | +import java.sql.SQLType; | |
32 | 33 | import java.sql.Types; |
33 | 34 | import java.util.ArrayList; |
34 | 35 | import java.util.List; |
... | ... | @@ -92,7 +93,7 @@ public abstract class AttributeKvInsertRepository { |
92 | 93 | |
93 | 94 | ps.setLong(6, kvEntity.getLastUpdateTs()); |
94 | 95 | ps.setString(7, kvEntity.getId().getEntityType().name()); |
95 | - ps.setString(8, kvEntity.getId().getEntityId()); | |
96 | + ps.setObject(8, kvEntity.getId().getEntityId()); | |
96 | 97 | ps.setString(9, kvEntity.getId().getAttributeType()); |
97 | 98 | ps.setString(10, kvEntity.getId().getAttributeKey()); |
98 | 99 | } |
... | ... | @@ -122,7 +123,7 @@ public abstract class AttributeKvInsertRepository { |
122 | 123 | public void setValues(PreparedStatement ps, int i) throws SQLException { |
123 | 124 | AttributeKvEntity kvEntity = insertEntities.get(i); |
124 | 125 | ps.setString(1, kvEntity.getId().getEntityType().name()); |
125 | - ps.setString(2, kvEntity.getId().getEntityId()); | |
126 | + ps.setObject(2, kvEntity.getId().getEntityId()); | |
126 | 127 | ps.setString(3, kvEntity.getId().getAttributeType()); |
127 | 128 | ps.setString(4, kvEntity.getId().getAttributeKey()); |
128 | 129 | ... | ... |
... | ... | @@ -26,6 +26,7 @@ import org.thingsboard.server.dao.model.sql.AttributeKvEntity; |
26 | 26 | import org.thingsboard.server.dao.util.SqlDao; |
27 | 27 | |
28 | 28 | import java.util.List; |
29 | +import java.util.UUID; | |
29 | 30 | |
30 | 31 | @SqlDao |
31 | 32 | public interface AttributeKvRepository extends CrudRepository<AttributeKvEntity, AttributeKvCompositeKey> { |
... | ... | @@ -34,7 +35,7 @@ public interface AttributeKvRepository extends CrudRepository<AttributeKvEntity, |
34 | 35 | "AND a.id.entityId = :entityId " + |
35 | 36 | "AND a.id.attributeType = :attributeType") |
36 | 37 | List<AttributeKvEntity> findAllByEntityTypeAndEntityIdAndAttributeType(@Param("entityType") EntityType entityType, |
37 | - @Param("entityId") String entityId, | |
38 | + @Param("entityId") UUID entityId, | |
38 | 39 | @Param("attributeType") String attributeType); |
39 | 40 | |
40 | 41 | @Transactional |
... | ... | @@ -44,7 +45,7 @@ public interface AttributeKvRepository extends CrudRepository<AttributeKvEntity, |
44 | 45 | "AND a.id.attributeType = :attributeType " + |
45 | 46 | "AND a.id.attributeKey = :attributeKey") |
46 | 47 | void delete(@Param("entityType") EntityType entityType, |
47 | - @Param("entityId") String entityId, | |
48 | + @Param("entityId") UUID entityId, | |
48 | 49 | @Param("attributeType") String attributeType, |
49 | 50 | @Param("attributeKey") String attributeKey); |
50 | 51 | } | ... | ... |
... | ... | @@ -46,7 +46,7 @@ public class HsqlAttributesInsertRepository extends AttributeKvInsertRepository |
46 | 46 | entities.forEach(entity -> { |
47 | 47 | jdbcTemplate.update(INSERT_OR_UPDATE, ps -> { |
48 | 48 | ps.setString(1, entity.getId().getEntityType().name()); |
49 | - ps.setString(2, entity.getId().getEntityId()); | |
49 | + ps.setObject(2, entity.getId().getEntityId()); | |
50 | 50 | ps.setString(3, entity.getId().getAttributeType()); |
51 | 51 | ps.setString(4, entity.getId().getAttributeKey()); |
52 | 52 | ps.setString(5, entity.getStrValue()); | ... | ... |
... | ... | @@ -22,7 +22,6 @@ import lombok.extern.slf4j.Slf4j; |
22 | 22 | import org.springframework.beans.factory.annotation.Autowired; |
23 | 23 | import org.springframework.beans.factory.annotation.Value; |
24 | 24 | import org.springframework.stereotype.Component; |
25 | -import org.thingsboard.server.common.data.UUIDConverter; | |
26 | 25 | import org.thingsboard.server.common.data.id.EntityId; |
27 | 26 | import org.thingsboard.server.common.data.id.TenantId; |
28 | 27 | import org.thingsboard.server.common.data.kv.AttributeKvEntry; |
... | ... | @@ -43,8 +42,6 @@ import java.util.List; |
43 | 42 | import java.util.Optional; |
44 | 43 | import java.util.stream.Collectors; |
45 | 44 | |
46 | -import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID; | |
47 | - | |
48 | 45 | @Component |
49 | 46 | @Slf4j |
50 | 47 | @SqlDao |
... | ... | @@ -115,14 +112,14 @@ public class JpaAttributeDao extends JpaAbstractDaoListeningExecutorService impl |
115 | 112 | DaoUtil.convertDataList(Lists.newArrayList( |
116 | 113 | attributeKvRepository.findAllByEntityTypeAndEntityIdAndAttributeType( |
117 | 114 | entityId.getEntityType(), |
118 | - UUIDConverter.fromTimeUUID(entityId.getId()), | |
115 | + entityId.getId(), | |
119 | 116 | attributeType)))); |
120 | 117 | } |
121 | 118 | |
122 | 119 | @Override |
123 | 120 | public ListenableFuture<Void> save(TenantId tenantId, EntityId entityId, String attributeType, AttributeKvEntry attribute) { |
124 | 121 | AttributeKvEntity entity = new AttributeKvEntity(); |
125 | - entity.setId(new AttributeKvCompositeKey(entityId.getEntityType(), fromTimeUUID(entityId.getId()), attributeType, attribute.getKey())); | |
122 | + entity.setId(new AttributeKvCompositeKey(entityId.getEntityType(), entityId.getId(), attributeType, attribute.getKey())); | |
126 | 123 | entity.setLastUpdateTs(attribute.getLastUpdateTs()); |
127 | 124 | entity.setStrValue(attribute.getStrValue().orElse(null)); |
128 | 125 | entity.setDoubleValue(attribute.getDoubleValue().orElse(null)); |
... | ... | @@ -140,7 +137,7 @@ public class JpaAttributeDao extends JpaAbstractDaoListeningExecutorService impl |
140 | 137 | public ListenableFuture<List<Void>> removeAll(TenantId tenantId, EntityId entityId, String attributeType, List<String> keys) { |
141 | 138 | return service.submit(() -> { |
142 | 139 | keys.forEach(key -> |
143 | - attributeKvRepository.delete(entityId.getEntityType(), UUIDConverter.fromTimeUUID(entityId.getId()), attributeType, key) | |
140 | + attributeKvRepository.delete(entityId.getEntityType(), entityId.getId(), attributeType, key) | |
144 | 141 | ); |
145 | 142 | return null; |
146 | 143 | }); |
... | ... | @@ -149,7 +146,7 @@ public class JpaAttributeDao extends JpaAbstractDaoListeningExecutorService impl |
149 | 146 | private AttributeKvCompositeKey getAttributeKvCompositeKey(EntityId entityId, String attributeType, String attributeKey) { |
150 | 147 | return new AttributeKvCompositeKey( |
151 | 148 | entityId.getEntityType(), |
152 | - fromTimeUUID(entityId.getId()), | |
149 | + entityId.getId(), | |
153 | 150 | attributeType, |
154 | 151 | attributeKey); |
155 | 152 | } | ... | ... |
... | ... | @@ -25,8 +25,9 @@ import org.thingsboard.server.common.data.audit.ActionType; |
25 | 25 | import org.thingsboard.server.dao.model.sql.AuditLogEntity; |
26 | 26 | |
27 | 27 | import java.util.List; |
28 | +import java.util.UUID; | |
28 | 29 | |
29 | -public interface AuditLogRepository extends PagingAndSortingRepository<AuditLogEntity, String> { | |
30 | +public interface AuditLogRepository extends PagingAndSortingRepository<AuditLogEntity, UUID> { | |
30 | 31 | |
31 | 32 | @Query("SELECT a FROM AuditLogEntity a WHERE " + |
32 | 33 | "a.tenantId = :tenantId " + |
... | ... | @@ -40,7 +41,7 @@ public interface AuditLogRepository extends PagingAndSortingRepository<AuditLogE |
40 | 41 | "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))" |
41 | 42 | ) |
42 | 43 | Page<AuditLogEntity> findByTenantId( |
43 | - @Param("tenantId") String tenantId, | |
44 | + @Param("tenantId") UUID tenantId, | |
44 | 45 | @Param("textSearch") String textSearch, |
45 | 46 | @Param("startId") String startId, |
46 | 47 | @Param("endId") String endId, |
... | ... | @@ -58,9 +59,9 @@ public interface AuditLogRepository extends PagingAndSortingRepository<AuditLogE |
58 | 59 | "OR LOWER(a.actionType) LIKE LOWER(CONCAT(:textSearch, '%'))" + |
59 | 60 | "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))" |
60 | 61 | ) |
61 | - Page<AuditLogEntity> findAuditLogsByTenantIdAndEntityId(@Param("tenantId") String tenantId, | |
62 | + Page<AuditLogEntity> findAuditLogsByTenantIdAndEntityId(@Param("tenantId") UUID tenantId, | |
62 | 63 | @Param("entityType") EntityType entityType, |
63 | - @Param("entityId") String entityId, | |
64 | + @Param("entityId") UUID entityId, | |
64 | 65 | @Param("textSearch") String textSearch, |
65 | 66 | @Param("startId") String startId, |
66 | 67 | @Param("endId") String endId, |
... | ... | @@ -79,8 +80,8 @@ public interface AuditLogRepository extends PagingAndSortingRepository<AuditLogE |
79 | 80 | "OR LOWER(a.actionType) LIKE LOWER(CONCAT(:textSearch, '%'))" + |
80 | 81 | "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))" |
81 | 82 | ) |
82 | - Page<AuditLogEntity> findAuditLogsByTenantIdAndCustomerId(@Param("tenantId") String tenantId, | |
83 | - @Param("customerId") String customerId, | |
83 | + Page<AuditLogEntity> findAuditLogsByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, | |
84 | + @Param("customerId") UUID customerId, | |
84 | 85 | @Param("textSearch") String textSearch, |
85 | 86 | @Param("startId") String startId, |
86 | 87 | @Param("endId") String endId, |
... | ... | @@ -98,8 +99,8 @@ public interface AuditLogRepository extends PagingAndSortingRepository<AuditLogE |
98 | 99 | "OR LOWER(a.actionType) LIKE LOWER(CONCAT(:textSearch, '%'))" + |
99 | 100 | "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))" |
100 | 101 | ) |
101 | - Page<AuditLogEntity> findAuditLogsByTenantIdAndUserId(@Param("tenantId") String tenantId, | |
102 | - @Param("userId") String userId, | |
102 | + Page<AuditLogEntity> findAuditLogsByTenantIdAndUserId(@Param("tenantId") UUID tenantId, | |
103 | + @Param("userId") UUID userId, | |
103 | 104 | @Param("textSearch") String textSearch, |
104 | 105 | @Param("startId") String startId, |
105 | 106 | @Param("endId") String endId, | ... | ... |
... | ... | @@ -36,7 +36,6 @@ import java.util.List; |
36 | 36 | import java.util.Objects; |
37 | 37 | import java.util.UUID; |
38 | 38 | |
39 | -import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID; | |
40 | 39 | import static org.thingsboard.server.dao.DaoUtil.endTimeToId; |
41 | 40 | import static org.thingsboard.server.dao.DaoUtil.startTimeToId; |
42 | 41 | |
... | ... | @@ -53,7 +52,7 @@ public class JpaAuditLogDao extends JpaAbstractDao<AuditLogEntity, AuditLog> imp |
53 | 52 | } |
54 | 53 | |
55 | 54 | @Override |
56 | - protected CrudRepository<AuditLogEntity, String> getCrudRepository() { | |
55 | + protected CrudRepository<AuditLogEntity, UUID> getCrudRepository() { | |
57 | 56 | return auditLogRepository; |
58 | 57 | } |
59 | 58 | |
... | ... | @@ -70,9 +69,9 @@ public class JpaAuditLogDao extends JpaAbstractDao<AuditLogEntity, AuditLog> imp |
70 | 69 | return DaoUtil.toPageData( |
71 | 70 | auditLogRepository |
72 | 71 | .findAuditLogsByTenantIdAndEntityId( |
73 | - fromTimeUUID(tenantId), | |
72 | + tenantId, | |
74 | 73 | entityId.getEntityType(), |
75 | - fromTimeUUID(entityId.getId()), | |
74 | + entityId.getId(), | |
76 | 75 | Objects.toString(pageLink.getTextSearch(), ""), |
77 | 76 | startTimeToId(pageLink.getStartTime()), |
78 | 77 | endTimeToId(pageLink.getEndTime()), |
... | ... | @@ -85,8 +84,8 @@ public class JpaAuditLogDao extends JpaAbstractDao<AuditLogEntity, AuditLog> imp |
85 | 84 | return DaoUtil.toPageData( |
86 | 85 | auditLogRepository |
87 | 86 | .findAuditLogsByTenantIdAndCustomerId( |
88 | - fromTimeUUID(tenantId), | |
89 | - fromTimeUUID(customerId.getId()), | |
87 | + tenantId, | |
88 | + customerId.getId(), | |
90 | 89 | Objects.toString(pageLink.getTextSearch(), ""), |
91 | 90 | startTimeToId(pageLink.getStartTime()), |
92 | 91 | endTimeToId(pageLink.getEndTime()), |
... | ... | @@ -99,8 +98,8 @@ public class JpaAuditLogDao extends JpaAbstractDao<AuditLogEntity, AuditLog> imp |
99 | 98 | return DaoUtil.toPageData( |
100 | 99 | auditLogRepository |
101 | 100 | .findAuditLogsByTenantIdAndUserId( |
102 | - fromTimeUUID(tenantId), | |
103 | - fromTimeUUID(userId.getId()), | |
101 | + tenantId, | |
102 | + userId.getId(), | |
104 | 103 | Objects.toString(pageLink.getTextSearch(), ""), |
105 | 104 | startTimeToId(pageLink.getStartTime()), |
106 | 105 | endTimeToId(pageLink.getEndTime()), |
... | ... | @@ -112,7 +111,7 @@ public class JpaAuditLogDao extends JpaAbstractDao<AuditLogEntity, AuditLog> imp |
112 | 111 | public PageData<AuditLog> findAuditLogsByTenantId(UUID tenantId, List<ActionType> actionTypes, TimePageLink pageLink) { |
113 | 112 | return DaoUtil.toPageData( |
114 | 113 | auditLogRepository.findByTenantId( |
115 | - fromTimeUUID(tenantId), | |
114 | + tenantId, | |
116 | 115 | Objects.toString(pageLink.getTextSearch(), ""), |
117 | 116 | startTimeToId(pageLink.getStartTime()), |
118 | 117 | endTimeToId(pageLink.getEndTime()), | ... | ... |
... | ... | @@ -23,7 +23,6 @@ import org.springframework.transaction.PlatformTransactionManager; |
23 | 23 | import org.springframework.transaction.TransactionDefinition; |
24 | 24 | import org.springframework.transaction.TransactionStatus; |
25 | 25 | import org.springframework.transaction.support.DefaultTransactionDefinition; |
26 | -import org.thingsboard.server.common.data.UUIDConverter; | |
27 | 26 | import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity; |
28 | 27 | |
29 | 28 | import javax.persistence.EntityManager; |
... | ... | @@ -69,7 +68,8 @@ public abstract class AbstractComponentDescriptorInsertRepository implements Com |
69 | 68 | |
70 | 69 | protected Query getQuery(ComponentDescriptorEntity entity, String query) { |
71 | 70 | return entityManager.createNativeQuery(query, ComponentDescriptorEntity.class) |
72 | - .setParameter("id", UUIDConverter.fromTimeUUID(entity.getUuid())) | |
71 | + .setParameter("id", entity.getUuid()) | |
72 | + .setParameter("created_time", entity.getCreatedTime()) | |
73 | 73 | .setParameter("actions", entity.getActions()) |
74 | 74 | .setParameter("clazz", entity.getClazz()) |
75 | 75 | .setParameter("configuration_descriptor", entity.getConfigurationDescriptor().toString()) | ... | ... |
... | ... | @@ -18,7 +18,6 @@ package org.thingsboard.server.dao.sql.component; |
18 | 18 | import org.springframework.data.domain.Page; |
19 | 19 | import org.springframework.data.domain.Pageable; |
20 | 20 | import org.springframework.data.jpa.repository.Query; |
21 | -import org.springframework.data.repository.CrudRepository; | |
22 | 21 | import org.springframework.data.repository.PagingAndSortingRepository; |
23 | 22 | import org.springframework.data.repository.query.Param; |
24 | 23 | import org.thingsboard.server.common.data.plugin.ComponentScope; |
... | ... | @@ -26,13 +25,13 @@ import org.thingsboard.server.common.data.plugin.ComponentType; |
26 | 25 | import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity; |
27 | 26 | import org.thingsboard.server.dao.util.SqlDao; |
28 | 27 | |
29 | -import java.util.List; | |
28 | +import java.util.UUID; | |
30 | 29 | |
31 | 30 | /** |
32 | 31 | * Created by Valerii Sosliuk on 5/6/2017. |
33 | 32 | */ |
34 | 33 | @SqlDao |
35 | -public interface ComponentDescriptorRepository extends PagingAndSortingRepository<ComponentDescriptorEntity, String> { | |
34 | +public interface ComponentDescriptorRepository extends PagingAndSortingRepository<ComponentDescriptorEntity, UUID> { | |
36 | 35 | |
37 | 36 | ComponentDescriptorEntity findByClazz(String clazz); |
38 | 37 | ... | ... |
... | ... | @@ -16,17 +16,18 @@ |
16 | 16 | package org.thingsboard.server.dao.sql.component; |
17 | 17 | |
18 | 18 | import org.springframework.stereotype.Repository; |
19 | -import org.thingsboard.server.common.data.UUIDConverter; | |
20 | 19 | import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity; |
21 | 20 | import org.thingsboard.server.dao.util.HsqlDao; |
22 | 21 | import org.thingsboard.server.dao.util.SqlDao; |
23 | 22 | |
23 | +import javax.persistence.Query; | |
24 | + | |
24 | 25 | @SqlDao |
25 | 26 | @HsqlDao |
26 | 27 | @Repository |
27 | 28 | public class HsqlComponentDescriptorInsertRepository extends AbstractComponentDescriptorInsertRepository { |
28 | 29 | |
29 | - private static final String P_KEY_CONFLICT_STATEMENT = "(component_descriptor.id=I.id)"; | |
30 | + private static final String P_KEY_CONFLICT_STATEMENT = "(component_descriptor.id=UUID(I.id))"; | |
30 | 31 | private static final String UNQ_KEY_CONFLICT_STATEMENT = "(component_descriptor.clazz=I.clazz)"; |
31 | 32 | |
32 | 33 | private static final String INSERT_OR_UPDATE_ON_P_KEY_CONFLICT = getInsertString(P_KEY_CONFLICT_STATEMENT); |
... | ... | @@ -38,13 +39,29 @@ public class HsqlComponentDescriptorInsertRepository extends AbstractComponentDe |
38 | 39 | } |
39 | 40 | |
40 | 41 | @Override |
42 | + protected Query getQuery(ComponentDescriptorEntity entity, String query) { | |
43 | + return entityManager.createNativeQuery(query, ComponentDescriptorEntity.class) | |
44 | + .setParameter("id", entity.getUuid().toString()) | |
45 | + .setParameter("created_time", entity.getCreatedTime()) | |
46 | + .setParameter("actions", entity.getActions()) | |
47 | + .setParameter("clazz", entity.getClazz()) | |
48 | + .setParameter("configuration_descriptor", entity.getConfigurationDescriptor().toString()) | |
49 | + .setParameter("name", entity.getName()) | |
50 | + .setParameter("scope", entity.getScope().name()) | |
51 | + .setParameter("search_text", entity.getSearchText()) | |
52 | + .setParameter("type", entity.getType().name()); | |
53 | + } | |
54 | + | |
55 | + @Override | |
41 | 56 | protected ComponentDescriptorEntity doProcessSaveOrUpdate(ComponentDescriptorEntity entity, String query) { |
42 | 57 | getQuery(entity, query).executeUpdate(); |
43 | - return entityManager.find(ComponentDescriptorEntity.class, UUIDConverter.fromTimeUUID(entity.getUuid())); | |
58 | + return entityManager.find(ComponentDescriptorEntity.class, entity.getUuid()); | |
44 | 59 | } |
45 | 60 | |
46 | 61 | private static String getInsertString(String conflictStatement) { |
47 | - return "MERGE INTO component_descriptor USING (VALUES :id, :actions, :clazz, :configuration_descriptor, :name, :scope, :search_text, :type) I (id, actions, clazz, configuration_descriptor, name, scope, search_text, type) ON " + conflictStatement + " WHEN MATCHED THEN UPDATE SET component_descriptor.id = I.id, component_descriptor.actions = I.actions, component_descriptor.clazz = I.clazz, component_descriptor.configuration_descriptor = I.configuration_descriptor, component_descriptor.name = I.name, component_descriptor.scope = I.scope, component_descriptor.search_text = I.search_text, component_descriptor.type = I.type" + | |
48 | - " WHEN NOT MATCHED THEN INSERT (id, actions, clazz, configuration_descriptor, name, scope, search_text, type) VALUES (I.id, I.actions, I.clazz, I.configuration_descriptor, I.name, I.scope, I.search_text, I.type)"; | |
62 | + return "MERGE INTO component_descriptor USING (VALUES :id, :created_time, :actions, :clazz, :configuration_descriptor, :name, :scope, :search_text, :type) I (id, created_time, actions, clazz, configuration_descriptor, name, scope, search_text, type) ON " | |
63 | + + conflictStatement | |
64 | + + " WHEN MATCHED THEN UPDATE SET component_descriptor.id = UUID(I.id), component_descriptor.actions = I.actions, component_descriptor.clazz = I.clazz, component_descriptor.configuration_descriptor = I.configuration_descriptor, component_descriptor.name = I.name, component_descriptor.scope = I.scope, component_descriptor.search_text = I.search_text, component_descriptor.type = I.type" + | |
65 | + " WHEN NOT MATCHED THEN INSERT (id, created_time, actions, clazz, configuration_descriptor, name, scope, search_text, type) VALUES (UUID(I.id), I.created_time, I.actions, I.clazz, I.configuration_descriptor, I.name, I.scope, I.search_text, I.type)"; | |
49 | 66 | } |
50 | 67 | } | ... | ... |
... | ... | @@ -20,7 +20,6 @@ import org.springframework.beans.factory.annotation.Autowired; |
20 | 20 | import org.springframework.data.repository.CrudRepository; |
21 | 21 | import org.springframework.stereotype.Component; |
22 | 22 | import org.springframework.transaction.annotation.Transactional; |
23 | -import org.thingsboard.server.common.data.UUIDConverter; | |
24 | 23 | import org.thingsboard.server.common.data.id.ComponentDescriptorId; |
25 | 24 | import org.thingsboard.server.common.data.id.TenantId; |
26 | 25 | import org.thingsboard.server.common.data.page.PageData; |
... | ... | @@ -36,6 +35,7 @@ import org.thingsboard.server.dao.util.SqlDao; |
36 | 35 | |
37 | 36 | import java.util.Objects; |
38 | 37 | import java.util.Optional; |
38 | +import java.util.UUID; | |
39 | 39 | |
40 | 40 | /** |
41 | 41 | * Created by Valerii Sosliuk on 5/6/2017. |
... | ... | @@ -57,16 +57,18 @@ public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao<Comp |
57 | 57 | } |
58 | 58 | |
59 | 59 | @Override |
60 | - protected CrudRepository<ComponentDescriptorEntity, String> getCrudRepository() { | |
60 | + protected CrudRepository<ComponentDescriptorEntity, UUID> getCrudRepository() { | |
61 | 61 | return componentDescriptorRepository; |
62 | 62 | } |
63 | 63 | |
64 | 64 | @Override |
65 | 65 | public Optional<ComponentDescriptor> saveIfNotExist(TenantId tenantId, ComponentDescriptor component) { |
66 | 66 | if (component.getId() == null) { |
67 | - component.setId(new ComponentDescriptorId(Uuids.timeBased())); | |
67 | + UUID uuid = Uuids.timeBased(); | |
68 | + component.setId(new ComponentDescriptorId(uuid)); | |
69 | + component.setCreatedTime(Uuids.unixTimestamp(uuid)); | |
68 | 70 | } |
69 | - if (!componentDescriptorRepository.existsById(UUIDConverter.fromTimeUUID(component.getId().getId()))) { | |
71 | + if (!componentDescriptorRepository.existsById(component.getId().getId())) { | |
70 | 72 | ComponentDescriptorEntity componentDescriptorEntity = new ComponentDescriptorEntity(component); |
71 | 73 | ComponentDescriptorEntity savedEntity = componentDescriptorInsertRepository.saveOrUpdate(componentDescriptorEntity); |
72 | 74 | return Optional.of(savedEntity.toData()); | ... | ... |
... | ... | @@ -19,7 +19,6 @@ import org.springframework.stereotype.Repository; |
19 | 19 | import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity; |
20 | 20 | import org.thingsboard.server.dao.util.PsqlDao; |
21 | 21 | import org.thingsboard.server.dao.util.SqlDao; |
22 | -import org.thingsboard.server.dao.util.SqlTsDao; | |
23 | 22 | |
24 | 23 | @SqlDao |
25 | 24 | @PsqlDao |
... | ... | @@ -49,10 +48,10 @@ public class PsqlComponentDescriptorInsertRepository extends AbstractComponentDe |
49 | 48 | } |
50 | 49 | |
51 | 50 | private static String getInsertOrUpdateStatement(String conflictKeyStatement, String updateKeyStatement) { |
52 | - return "INSERT INTO component_descriptor (id, actions, clazz, configuration_descriptor, name, scope, search_text, type) VALUES (:id, :actions, :clazz, :configuration_descriptor, :name, :scope, :search_text, :type) ON CONFLICT " + conflictKeyStatement + " DO UPDATE SET " + updateKeyStatement + " returning *"; | |
51 | + return "INSERT INTO component_descriptor (id, created_time, actions, clazz, configuration_descriptor, name, scope, search_text, type) VALUES (:id, :created_time, :actions, :clazz, :configuration_descriptor, :name, :scope, :search_text, :type) ON CONFLICT " + conflictKeyStatement + " DO UPDATE SET " + updateKeyStatement + " returning *"; | |
53 | 52 | } |
54 | 53 | |
55 | 54 | private static String getUpdateStatement(String id) { |
56 | - return "actions = :actions, " + id + ", configuration_descriptor = :configuration_descriptor, name = :name, scope = :scope, search_text = :search_text, type = :type"; | |
55 | + return "actions = :actions, " + id + ",created_time = :created_time, configuration_descriptor = :configuration_descriptor, name = :name, scope = :scope, search_text = :search_text, type = :type"; | |
57 | 56 | } |
58 | 57 | } | ... | ... |
... | ... | @@ -18,26 +18,25 @@ package org.thingsboard.server.dao.sql.customer; |
18 | 18 | import org.springframework.data.domain.Page; |
19 | 19 | import org.springframework.data.domain.Pageable; |
20 | 20 | import org.springframework.data.jpa.repository.Query; |
21 | -import org.springframework.data.repository.CrudRepository; | |
22 | 21 | import org.springframework.data.repository.PagingAndSortingRepository; |
23 | 22 | import org.springframework.data.repository.query.Param; |
24 | 23 | import org.thingsboard.server.dao.model.sql.CustomerEntity; |
25 | 24 | import org.thingsboard.server.dao.util.SqlDao; |
26 | 25 | |
27 | -import java.util.List; | |
26 | +import java.util.UUID; | |
28 | 27 | |
29 | 28 | /** |
30 | 29 | * Created by Valerii Sosliuk on 5/6/2017. |
31 | 30 | */ |
32 | 31 | @SqlDao |
33 | -public interface CustomerRepository extends PagingAndSortingRepository<CustomerEntity, String> { | |
32 | +public interface CustomerRepository extends PagingAndSortingRepository<CustomerEntity, UUID> { | |
34 | 33 | |
35 | 34 | @Query("SELECT c FROM CustomerEntity c WHERE c.tenantId = :tenantId " + |
36 | 35 | "AND LOWER(c.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
37 | - Page<CustomerEntity> findByTenantId(@Param("tenantId") String tenantId, | |
36 | + Page<CustomerEntity> findByTenantId(@Param("tenantId") UUID tenantId, | |
38 | 37 | @Param("textSearch") String textSearch, |
39 | 38 | Pageable pageable); |
40 | 39 | |
41 | - CustomerEntity findByTenantIdAndTitle(String tenantId, String title); | |
40 | + CustomerEntity findByTenantIdAndTitle(UUID tenantId, String title); | |
42 | 41 | |
43 | 42 | } | ... | ... |
... | ... | @@ -19,7 +19,6 @@ import org.springframework.beans.factory.annotation.Autowired; |
19 | 19 | import org.springframework.data.repository.CrudRepository; |
20 | 20 | import org.springframework.stereotype.Component; |
21 | 21 | import org.thingsboard.server.common.data.Customer; |
22 | -import org.thingsboard.server.common.data.UUIDConverter; | |
23 | 22 | import org.thingsboard.server.common.data.page.PageData; |
24 | 23 | import org.thingsboard.server.common.data.page.PageLink; |
25 | 24 | import org.thingsboard.server.dao.DaoUtil; |
... | ... | @@ -48,21 +47,21 @@ public class JpaCustomerDao extends JpaAbstractSearchTextDao<CustomerEntity, Cus |
48 | 47 | } |
49 | 48 | |
50 | 49 | @Override |
51 | - protected CrudRepository<CustomerEntity, String> getCrudRepository() { | |
50 | + protected CrudRepository<CustomerEntity, UUID> getCrudRepository() { | |
52 | 51 | return customerRepository; |
53 | 52 | } |
54 | 53 | |
55 | 54 | @Override |
56 | 55 | public PageData<Customer> findCustomersByTenantId(UUID tenantId, PageLink pageLink) { |
57 | 56 | return DaoUtil.toPageData(customerRepository.findByTenantId( |
58 | - UUIDConverter.fromTimeUUID(tenantId), | |
57 | + tenantId, | |
59 | 58 | Objects.toString(pageLink.getTextSearch(), ""), |
60 | 59 | DaoUtil.toPageable(pageLink))); |
61 | 60 | } |
62 | 61 | |
63 | 62 | @Override |
64 | 63 | public Optional<Customer> findCustomersByTenantIdAndTitle(UUID tenantId, String title) { |
65 | - Customer customer = DaoUtil.getData(customerRepository.findByTenantIdAndTitle(UUIDConverter.fromTimeUUID(tenantId), title)); | |
64 | + Customer customer = DaoUtil.getData(customerRepository.findByTenantIdAndTitle(tenantId, title)); | |
66 | 65 | return Optional.ofNullable(customer); |
67 | 66 | } |
68 | 67 | } | ... | ... |
... | ... | @@ -18,23 +18,22 @@ package org.thingsboard.server.dao.sql.dashboard; |
18 | 18 | import org.springframework.data.domain.Page; |
19 | 19 | import org.springframework.data.domain.Pageable; |
20 | 20 | import org.springframework.data.jpa.repository.Query; |
21 | -import org.springframework.data.repository.CrudRepository; | |
22 | 21 | import org.springframework.data.repository.PagingAndSortingRepository; |
23 | 22 | import org.springframework.data.repository.query.Param; |
24 | 23 | import org.thingsboard.server.dao.model.sql.DashboardInfoEntity; |
25 | 24 | import org.thingsboard.server.dao.util.SqlDao; |
26 | 25 | |
27 | -import java.util.List; | |
26 | +import java.util.UUID; | |
28 | 27 | |
29 | 28 | /** |
30 | 29 | * Created by Valerii Sosliuk on 5/6/2017. |
31 | 30 | */ |
32 | 31 | @SqlDao |
33 | -public interface DashboardInfoRepository extends PagingAndSortingRepository<DashboardInfoEntity, String> { | |
32 | +public interface DashboardInfoRepository extends PagingAndSortingRepository<DashboardInfoEntity, UUID> { | |
34 | 33 | |
35 | 34 | @Query("SELECT di FROM DashboardInfoEntity di WHERE di.tenantId = :tenantId " + |
36 | 35 | "AND LOWER(di.searchText) LIKE LOWER(CONCAT(:searchText, '%'))") |
37 | - Page<DashboardInfoEntity> findByTenantId(@Param("tenantId") String tenantId, | |
36 | + Page<DashboardInfoEntity> findByTenantId(@Param("tenantId") UUID tenantId, | |
38 | 37 | @Param("searchText") String searchText, |
39 | 38 | Pageable pageable); |
40 | 39 | |
... | ... | @@ -42,8 +41,8 @@ public interface DashboardInfoRepository extends PagingAndSortingRepository<Dash |
42 | 41 | "AND di.id = re.toId AND re.toType = 'DASHBOARD' AND re.relationTypeGroup = 'DASHBOARD' " + |
43 | 42 | "AND re.relationType = 'Contains' AND re.fromId = :customerId AND re.fromType = 'CUSTOMER' " + |
44 | 43 | "AND LOWER(di.searchText) LIKE LOWER(CONCAT(:searchText, '%'))") |
45 | - Page<DashboardInfoEntity> findByTenantIdAndCustomerId(@Param("tenantId") String tenantId, | |
46 | - @Param("customerId") String customerId, | |
44 | + Page<DashboardInfoEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, | |
45 | + @Param("customerId") UUID customerId, | |
47 | 46 | @Param("searchText") String searchText, |
48 | 47 | Pageable pageable); |
49 | 48 | ... | ... |
... | ... | @@ -19,9 +19,11 @@ import org.springframework.data.repository.CrudRepository; |
19 | 19 | import org.thingsboard.server.dao.model.sql.DashboardEntity; |
20 | 20 | import org.thingsboard.server.dao.util.SqlDao; |
21 | 21 | |
22 | +import java.util.UUID; | |
23 | + | |
22 | 24 | /** |
23 | 25 | * Created by Valerii Sosliuk on 5/6/2017. |
24 | 26 | */ |
25 | 27 | @SqlDao |
26 | -public interface DashboardRepository extends CrudRepository<DashboardEntity, String> { | |
28 | +public interface DashboardRepository extends CrudRepository<DashboardEntity, UUID> { | |
27 | 29 | } | ... | ... |
... | ... | @@ -24,6 +24,8 @@ import org.thingsboard.server.dao.model.sql.DashboardEntity; |
24 | 24 | import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; |
25 | 25 | import org.thingsboard.server.dao.util.SqlDao; |
26 | 26 | |
27 | +import java.util.UUID; | |
28 | + | |
27 | 29 | /** |
28 | 30 | * Created by Valerii Sosliuk on 5/6/2017. |
29 | 31 | */ |
... | ... | @@ -40,7 +42,7 @@ public class JpaDashboardDao extends JpaAbstractSearchTextDao<DashboardEntity, D |
40 | 42 | } |
41 | 43 | |
42 | 44 | @Override |
43 | - protected CrudRepository<DashboardEntity, String> getCrudRepository() { | |
45 | + protected CrudRepository<DashboardEntity, UUID> getCrudRepository() { | |
44 | 46 | return dashboardRepository; |
45 | 47 | } |
46 | 48 | } | ... | ... |
... | ... | @@ -20,7 +20,6 @@ import org.springframework.beans.factory.annotation.Autowired; |
20 | 20 | import org.springframework.data.repository.CrudRepository; |
21 | 21 | import org.springframework.stereotype.Component; |
22 | 22 | import org.thingsboard.server.common.data.DashboardInfo; |
23 | -import org.thingsboard.server.common.data.UUIDConverter; | |
24 | 23 | import org.thingsboard.server.common.data.page.PageData; |
25 | 24 | import org.thingsboard.server.common.data.page.PageLink; |
26 | 25 | import org.thingsboard.server.dao.DaoUtil; |
... | ... | @@ -61,7 +60,7 @@ public class JpaDashboardInfoDao extends JpaAbstractSearchTextDao<DashboardInfoE |
61 | 60 | public PageData<DashboardInfo> findDashboardsByTenantId(UUID tenantId, PageLink pageLink) { |
62 | 61 | return DaoUtil.toPageData(dashboardInfoRepository |
63 | 62 | .findByTenantId( |
64 | - UUIDConverter.fromTimeUUID(tenantId), | |
63 | + tenantId, | |
65 | 64 | Objects.toString(pageLink.getTextSearch(), ""), |
66 | 65 | DaoUtil.toPageable(pageLink))); |
67 | 66 | } |
... | ... | @@ -70,8 +69,8 @@ public class JpaDashboardInfoDao extends JpaAbstractSearchTextDao<DashboardInfoE |
70 | 69 | public PageData<DashboardInfo> findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, PageLink pageLink) { |
71 | 70 | return DaoUtil.toPageData(dashboardInfoRepository |
72 | 71 | .findByTenantIdAndCustomerId( |
73 | - UUIDConverter.fromTimeUUID(tenantId), | |
74 | - UUIDConverter.fromTimeUUID(customerId), | |
72 | + tenantId, | |
73 | + customerId, | |
75 | 74 | Objects.toString(pageLink.getTextSearch(), ""), |
76 | 75 | DaoUtil.toPageable(pageLink))); |
77 | 76 | } | ... | ... |
... | ... | @@ -19,13 +19,15 @@ import org.springframework.data.repository.CrudRepository; |
19 | 19 | import org.thingsboard.server.dao.model.sql.DeviceCredentialsEntity; |
20 | 20 | import org.thingsboard.server.dao.util.SqlDao; |
21 | 21 | |
22 | +import java.util.UUID; | |
23 | + | |
22 | 24 | /** |
23 | 25 | * Created by Valerii Sosliuk on 5/6/2017. |
24 | 26 | */ |
25 | 27 | @SqlDao |
26 | -public interface DeviceCredentialsRepository extends CrudRepository<DeviceCredentialsEntity, String> { | |
28 | +public interface DeviceCredentialsRepository extends CrudRepository<DeviceCredentialsEntity, UUID> { | |
27 | 29 | |
28 | - DeviceCredentialsEntity findByDeviceId(String deviceId); | |
30 | + DeviceCredentialsEntity findByDeviceId(UUID deviceId); | |
29 | 31 | |
30 | 32 | DeviceCredentialsEntity findByCredentialsId(String credentialsId); |
31 | 33 | } | ... | ... |
... | ... | @@ -25,24 +25,25 @@ import org.thingsboard.server.dao.model.sql.DeviceInfoEntity; |
25 | 25 | import org.thingsboard.server.dao.util.SqlDao; |
26 | 26 | |
27 | 27 | import java.util.List; |
28 | +import java.util.UUID; | |
28 | 29 | |
29 | 30 | /** |
30 | 31 | * Created by Valerii Sosliuk on 5/6/2017. |
31 | 32 | */ |
32 | 33 | @SqlDao |
33 | -public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntity, String> { | |
34 | +public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntity, UUID> { | |
34 | 35 | |
35 | 36 | @Query("SELECT new org.thingsboard.server.dao.model.sql.DeviceInfoEntity(d, c.title, c.additionalInfo) " + |
36 | 37 | "FROM DeviceEntity d " + |
37 | 38 | "LEFT JOIN CustomerEntity c on c.id = d.customerId " + |
38 | 39 | "WHERE d.id = :deviceId") |
39 | - DeviceInfoEntity findDeviceInfoById(@Param("deviceId") String deviceId); | |
40 | + DeviceInfoEntity findDeviceInfoById(@Param("deviceId") UUID deviceId); | |
40 | 41 | |
41 | 42 | @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + |
42 | 43 | "AND d.customerId = :customerId " + |
43 | 44 | "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:searchText, '%'))") |
44 | - Page<DeviceEntity> findByTenantIdAndCustomerId(@Param("tenantId") String tenantId, | |
45 | - @Param("customerId") String customerId, | |
45 | + Page<DeviceEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, | |
46 | + @Param("customerId") UUID customerId, | |
46 | 47 | @Param("searchText") String searchText, |
47 | 48 | Pageable pageable); |
48 | 49 | |
... | ... | @@ -52,18 +53,18 @@ public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntit |
52 | 53 | "WHERE d.tenantId = :tenantId " + |
53 | 54 | "AND d.customerId = :customerId " + |
54 | 55 | "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:searchText, '%'))") |
55 | - Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndCustomerId(@Param("tenantId") String tenantId, | |
56 | - @Param("customerId") String customerId, | |
56 | + Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, | |
57 | + @Param("customerId") UUID customerId, | |
57 | 58 | @Param("searchText") String searchText, |
58 | 59 | Pageable pageable); |
59 | 60 | |
60 | 61 | @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId") |
61 | - Page<DeviceEntity> findByTenantId(@Param("tenantId") String tenantId, | |
62 | + Page<DeviceEntity> findByTenantId(@Param("tenantId") UUID tenantId, | |
62 | 63 | Pageable pageable); |
63 | 64 | |
64 | 65 | @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + |
65 | 66 | "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
66 | - Page<DeviceEntity> findByTenantId(@Param("tenantId") String tenantId, | |
67 | + Page<DeviceEntity> findByTenantId(@Param("tenantId") UUID tenantId, | |
67 | 68 | @Param("textSearch") String textSearch, |
68 | 69 | Pageable pageable); |
69 | 70 | |
... | ... | @@ -72,14 +73,14 @@ public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntit |
72 | 73 | "LEFT JOIN CustomerEntity c on c.id = d.customerId " + |
73 | 74 | "WHERE d.tenantId = :tenantId " + |
74 | 75 | "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
75 | - Page<DeviceInfoEntity> findDeviceInfosByTenantId(@Param("tenantId") String tenantId, | |
76 | + Page<DeviceInfoEntity> findDeviceInfosByTenantId(@Param("tenantId") UUID tenantId, | |
76 | 77 | @Param("textSearch") String textSearch, |
77 | 78 | Pageable pageable); |
78 | 79 | |
79 | 80 | @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + |
80 | 81 | "AND d.type = :type " + |
81 | 82 | "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
82 | - Page<DeviceEntity> findByTenantIdAndType(@Param("tenantId") String tenantId, | |
83 | + Page<DeviceEntity> findByTenantIdAndType(@Param("tenantId") UUID tenantId, | |
83 | 84 | @Param("type") String type, |
84 | 85 | @Param("textSearch") String textSearch, |
85 | 86 | Pageable pageable); |
... | ... | @@ -90,7 +91,7 @@ public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntit |
90 | 91 | "WHERE d.tenantId = :tenantId " + |
91 | 92 | "AND d.type = :type " + |
92 | 93 | "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
93 | - Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndType(@Param("tenantId") String tenantId, | |
94 | + Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndType(@Param("tenantId") UUID tenantId, | |
94 | 95 | @Param("type") String type, |
95 | 96 | @Param("textSearch") String textSearch, |
96 | 97 | Pageable pageable); |
... | ... | @@ -99,8 +100,8 @@ public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntit |
99 | 100 | "AND d.customerId = :customerId " + |
100 | 101 | "AND d.type = :type " + |
101 | 102 | "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
102 | - Page<DeviceEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") String tenantId, | |
103 | - @Param("customerId") String customerId, | |
103 | + Page<DeviceEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, | |
104 | + @Param("customerId") UUID customerId, | |
104 | 105 | @Param("type") String type, |
105 | 106 | @Param("textSearch") String textSearch, |
106 | 107 | Pageable pageable); |
... | ... | @@ -112,18 +113,18 @@ public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntit |
112 | 113 | "AND d.customerId = :customerId " + |
113 | 114 | "AND d.type = :type " + |
114 | 115 | "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
115 | - Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") String tenantId, | |
116 | - @Param("customerId") String customerId, | |
116 | + Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, | |
117 | + @Param("customerId") UUID customerId, | |
117 | 118 | @Param("type") String type, |
118 | 119 | @Param("textSearch") String textSearch, |
119 | 120 | Pageable pageable); |
120 | 121 | |
121 | 122 | @Query("SELECT DISTINCT d.type FROM DeviceEntity d WHERE d.tenantId = :tenantId") |
122 | - List<String> findTenantDeviceTypes(@Param("tenantId") String tenantId); | |
123 | + List<String> findTenantDeviceTypes(@Param("tenantId") UUID tenantId); | |
123 | 124 | |
124 | - DeviceEntity findByTenantIdAndName(String tenantId, String name); | |
125 | + DeviceEntity findByTenantIdAndName(UUID tenantId, String name); | |
125 | 126 | |
126 | - List<DeviceEntity> findDevicesByTenantIdAndCustomerIdAndIdIn(String tenantId, String customerId, List<String> deviceIds); | |
127 | + List<DeviceEntity> findDevicesByTenantIdAndCustomerIdAndIdIn(UUID tenantId, UUID customerId, List<UUID> deviceIds); | |
127 | 128 | |
128 | - List<DeviceEntity> findDevicesByTenantIdAndIdIn(String tenantId, List<String> deviceIds); | |
129 | + List<DeviceEntity> findDevicesByTenantIdAndIdIn(UUID tenantId, List<UUID> deviceIds); | |
129 | 130 | } | ... | ... |
... | ... | @@ -18,7 +18,6 @@ package org.thingsboard.server.dao.sql.device; |
18 | 18 | import org.springframework.beans.factory.annotation.Autowired; |
19 | 19 | import org.springframework.data.repository.CrudRepository; |
20 | 20 | import org.springframework.stereotype.Component; |
21 | -import org.thingsboard.server.common.data.UUIDConverter; | |
22 | 21 | import org.thingsboard.server.common.data.id.TenantId; |
23 | 22 | import org.thingsboard.server.common.data.security.DeviceCredentials; |
24 | 23 | import org.thingsboard.server.dao.DaoUtil; |
... | ... | @@ -45,13 +44,13 @@ public class JpaDeviceCredentialsDao extends JpaAbstractDao<DeviceCredentialsEnt |
45 | 44 | } |
46 | 45 | |
47 | 46 | @Override |
48 | - protected CrudRepository<DeviceCredentialsEntity, String> getCrudRepository() { | |
47 | + protected CrudRepository<DeviceCredentialsEntity, UUID> getCrudRepository() { | |
49 | 48 | return deviceCredentialsRepository; |
50 | 49 | } |
51 | 50 | |
52 | 51 | @Override |
53 | 52 | public DeviceCredentials findByDeviceId(TenantId tenantId, UUID deviceId) { |
54 | - return DaoUtil.getData(deviceCredentialsRepository.findByDeviceId(UUIDConverter.fromTimeUUID(deviceId))); | |
53 | + return DaoUtil.getData(deviceCredentialsRepository.findByDeviceId(deviceId)); | |
55 | 54 | } |
56 | 55 | |
57 | 56 | @Override | ... | ... |
... | ... | @@ -24,7 +24,6 @@ import org.thingsboard.server.common.data.Device; |
24 | 24 | import org.thingsboard.server.common.data.DeviceInfo; |
25 | 25 | import org.thingsboard.server.common.data.EntitySubtype; |
26 | 26 | import org.thingsboard.server.common.data.EntityType; |
27 | -import org.thingsboard.server.common.data.UUIDConverter; | |
28 | 27 | import org.thingsboard.server.common.data.id.TenantId; |
29 | 28 | import org.thingsboard.server.common.data.page.PageData; |
30 | 29 | import org.thingsboard.server.common.data.page.PageLink; |
... | ... | @@ -42,9 +41,6 @@ import java.util.Objects; |
42 | 41 | import java.util.Optional; |
43 | 42 | import java.util.UUID; |
44 | 43 | |
45 | -import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID; | |
46 | -import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUIDs; | |
47 | - | |
48 | 44 | /** |
49 | 45 | * Created by Valerii Sosliuk on 5/6/2017. |
50 | 46 | */ |
... | ... | @@ -61,13 +57,13 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device> |
61 | 57 | } |
62 | 58 | |
63 | 59 | @Override |
64 | - protected CrudRepository<DeviceEntity, String> getCrudRepository() { | |
60 | + protected CrudRepository<DeviceEntity, UUID> getCrudRepository() { | |
65 | 61 | return deviceRepository; |
66 | 62 | } |
67 | 63 | |
68 | 64 | @Override |
69 | 65 | public DeviceInfo findDeviceInfoById(TenantId tenantId, UUID deviceId) { |
70 | - return DaoUtil.getData(deviceRepository.findDeviceInfoById(fromTimeUUID(deviceId))); | |
66 | + return DaoUtil.getData(deviceRepository.findDeviceInfoById(deviceId)); | |
71 | 67 | } |
72 | 68 | |
73 | 69 | @Override |
... | ... | @@ -75,12 +71,12 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device> |
75 | 71 | if (StringUtils.isEmpty(pageLink.getTextSearch())) { |
76 | 72 | return DaoUtil.toPageData( |
77 | 73 | deviceRepository.findByTenantId( |
78 | - fromTimeUUID(tenantId), | |
74 | + tenantId, | |
79 | 75 | DaoUtil.toPageable(pageLink))); |
80 | 76 | } else { |
81 | 77 | return DaoUtil.toPageData( |
82 | 78 | deviceRepository.findByTenantId( |
83 | - fromTimeUUID(tenantId), | |
79 | + tenantId, | |
84 | 80 | Objects.toString(pageLink.getTextSearch(), ""), |
85 | 81 | DaoUtil.toPageable(pageLink))); |
86 | 82 | } |
... | ... | @@ -90,22 +86,22 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device> |
90 | 86 | public PageData<DeviceInfo> findDeviceInfosByTenantId(UUID tenantId, PageLink pageLink) { |
91 | 87 | return DaoUtil.toPageData( |
92 | 88 | deviceRepository.findDeviceInfosByTenantId( |
93 | - fromTimeUUID(tenantId), | |
89 | + tenantId, | |
94 | 90 | Objects.toString(pageLink.getTextSearch(), ""), |
95 | 91 | DaoUtil.toPageable(pageLink, DeviceInfoEntity.deviceInfoColumnMap))); |
96 | 92 | } |
97 | 93 | |
98 | 94 | @Override |
99 | 95 | public ListenableFuture<List<Device>> findDevicesByTenantIdAndIdsAsync(UUID tenantId, List<UUID> deviceIds) { |
100 | - return service.submit(() -> DaoUtil.convertDataList(deviceRepository.findDevicesByTenantIdAndIdIn(UUIDConverter.fromTimeUUID(tenantId), fromTimeUUIDs(deviceIds)))); | |
96 | + return service.submit(() -> DaoUtil.convertDataList(deviceRepository.findDevicesByTenantIdAndIdIn(tenantId, deviceIds))); | |
101 | 97 | } |
102 | 98 | |
103 | 99 | @Override |
104 | 100 | public PageData<Device> findDevicesByTenantIdAndCustomerId(UUID tenantId, UUID customerId, PageLink pageLink) { |
105 | 101 | return DaoUtil.toPageData( |
106 | 102 | deviceRepository.findByTenantIdAndCustomerId( |
107 | - fromTimeUUID(tenantId), | |
108 | - fromTimeUUID(customerId), | |
103 | + tenantId, | |
104 | + customerId, | |
109 | 105 | Objects.toString(pageLink.getTextSearch(), ""), |
110 | 106 | DaoUtil.toPageable(pageLink))); |
111 | 107 | } |
... | ... | @@ -114,8 +110,8 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device> |
114 | 110 | public PageData<DeviceInfo> findDeviceInfosByTenantIdAndCustomerId(UUID tenantId, UUID customerId, PageLink pageLink) { |
115 | 111 | return DaoUtil.toPageData( |
116 | 112 | deviceRepository.findDeviceInfosByTenantIdAndCustomerId( |
117 | - fromTimeUUID(tenantId), | |
118 | - fromTimeUUID(customerId), | |
113 | + tenantId, | |
114 | + customerId, | |
119 | 115 | Objects.toString(pageLink.getTextSearch(), ""), |
120 | 116 | DaoUtil.toPageable(pageLink, DeviceInfoEntity.deviceInfoColumnMap))); |
121 | 117 | } |
... | ... | @@ -123,12 +119,12 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device> |
123 | 119 | @Override |
124 | 120 | public ListenableFuture<List<Device>> findDevicesByTenantIdCustomerIdAndIdsAsync(UUID tenantId, UUID customerId, List<UUID> deviceIds) { |
125 | 121 | return service.submit(() -> DaoUtil.convertDataList( |
126 | - deviceRepository.findDevicesByTenantIdAndCustomerIdAndIdIn(fromTimeUUID(tenantId), fromTimeUUID(customerId), fromTimeUUIDs(deviceIds)))); | |
122 | + deviceRepository.findDevicesByTenantIdAndCustomerIdAndIdIn(tenantId, customerId, deviceIds))); | |
127 | 123 | } |
128 | 124 | |
129 | 125 | @Override |
130 | 126 | public Optional<Device> findDeviceByTenantIdAndName(UUID tenantId, String name) { |
131 | - Device device = DaoUtil.getData(deviceRepository.findByTenantIdAndName(fromTimeUUID(tenantId), name)); | |
127 | + Device device = DaoUtil.getData(deviceRepository.findByTenantIdAndName(tenantId, name)); | |
132 | 128 | return Optional.ofNullable(device); |
133 | 129 | } |
134 | 130 | |
... | ... | @@ -136,7 +132,7 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device> |
136 | 132 | public PageData<Device> findDevicesByTenantIdAndType(UUID tenantId, String type, PageLink pageLink) { |
137 | 133 | return DaoUtil.toPageData( |
138 | 134 | deviceRepository.findByTenantIdAndType( |
139 | - fromTimeUUID(tenantId), | |
135 | + tenantId, | |
140 | 136 | type, |
141 | 137 | Objects.toString(pageLink.getTextSearch(), ""), |
142 | 138 | DaoUtil.toPageable(pageLink))); |
... | ... | @@ -146,7 +142,7 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device> |
146 | 142 | public PageData<DeviceInfo> findDeviceInfosByTenantIdAndType(UUID tenantId, String type, PageLink pageLink) { |
147 | 143 | return DaoUtil.toPageData( |
148 | 144 | deviceRepository.findDeviceInfosByTenantIdAndType( |
149 | - fromTimeUUID(tenantId), | |
145 | + tenantId, | |
150 | 146 | type, |
151 | 147 | Objects.toString(pageLink.getTextSearch(), ""), |
152 | 148 | DaoUtil.toPageable(pageLink, DeviceInfoEntity.deviceInfoColumnMap))); |
... | ... | @@ -156,8 +152,8 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device> |
156 | 152 | public PageData<Device> findDevicesByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, PageLink pageLink) { |
157 | 153 | return DaoUtil.toPageData( |
158 | 154 | deviceRepository.findByTenantIdAndCustomerIdAndType( |
159 | - fromTimeUUID(tenantId), | |
160 | - fromTimeUUID(customerId), | |
155 | + tenantId, | |
156 | + customerId, | |
161 | 157 | type, |
162 | 158 | Objects.toString(pageLink.getTextSearch(), ""), |
163 | 159 | DaoUtil.toPageable(pageLink))); |
... | ... | @@ -167,8 +163,8 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device> |
167 | 163 | public PageData<DeviceInfo> findDeviceInfosByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, PageLink pageLink) { |
168 | 164 | return DaoUtil.toPageData( |
169 | 165 | deviceRepository.findDeviceInfosByTenantIdAndCustomerIdAndType( |
170 | - fromTimeUUID(tenantId), | |
171 | - fromTimeUUID(customerId), | |
166 | + tenantId, | |
167 | + customerId, | |
172 | 168 | type, |
173 | 169 | Objects.toString(pageLink.getTextSearch(), ""), |
174 | 170 | DaoUtil.toPageable(pageLink, DeviceInfoEntity.deviceInfoColumnMap))); |
... | ... | @@ -176,7 +172,7 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device> |
176 | 172 | |
177 | 173 | @Override |
178 | 174 | public ListenableFuture<List<EntitySubtype>> findTenantDeviceTypesAsync(UUID tenantId) { |
179 | - return service.submit(() -> convertTenantDeviceTypesToDto(tenantId, deviceRepository.findTenantDeviceTypes(fromTimeUUID(tenantId)))); | |
175 | + return service.submit(() -> convertTenantDeviceTypesToDto(tenantId, deviceRepository.findTenantDeviceTypes(tenantId))); | |
180 | 176 | } |
181 | 177 | |
182 | 178 | private List<EntitySubtype> convertTenantDeviceTypesToDto(UUID tenantId, List<String> types) { | ... | ... |
... | ... | @@ -18,7 +18,6 @@ package org.thingsboard.server.dao.sql.entityview; |
18 | 18 | import org.springframework.data.domain.Page; |
19 | 19 | import org.springframework.data.domain.Pageable; |
20 | 20 | import org.springframework.data.jpa.repository.Query; |
21 | -import org.springframework.data.repository.CrudRepository; | |
22 | 21 | import org.springframework.data.repository.PagingAndSortingRepository; |
23 | 22 | import org.springframework.data.repository.query.Param; |
24 | 23 | import org.thingsboard.server.dao.model.sql.EntityViewEntity; |
... | ... | @@ -26,22 +25,23 @@ import org.thingsboard.server.dao.model.sql.EntityViewInfoEntity; |
26 | 25 | import org.thingsboard.server.dao.util.SqlDao; |
27 | 26 | |
28 | 27 | import java.util.List; |
28 | +import java.util.UUID; | |
29 | 29 | |
30 | 30 | /** |
31 | 31 | * Created by Victor Basanets on 8/31/2017. |
32 | 32 | */ |
33 | 33 | @SqlDao |
34 | -public interface EntityViewRepository extends PagingAndSortingRepository<EntityViewEntity, String> { | |
34 | +public interface EntityViewRepository extends PagingAndSortingRepository<EntityViewEntity, UUID> { | |
35 | 35 | |
36 | 36 | @Query("SELECT new org.thingsboard.server.dao.model.sql.EntityViewInfoEntity(e, c.title, c.additionalInfo) " + |
37 | 37 | "FROM EntityViewEntity e " + |
38 | 38 | "LEFT JOIN CustomerEntity c on c.id = e.customerId " + |
39 | 39 | "WHERE e.id = :entityViewId") |
40 | - EntityViewInfoEntity findEntityViewInfoById(@Param("entityViewId") String entityViewId); | |
40 | + EntityViewInfoEntity findEntityViewInfoById(@Param("entityViewId") UUID entityViewId); | |
41 | 41 | |
42 | 42 | @Query("SELECT e FROM EntityViewEntity e WHERE e.tenantId = :tenantId " + |
43 | 43 | "AND LOWER(e.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
44 | - Page<EntityViewEntity> findByTenantId(@Param("tenantId") String tenantId, | |
44 | + Page<EntityViewEntity> findByTenantId(@Param("tenantId") UUID tenantId, | |
45 | 45 | @Param("textSearch") String textSearch, |
46 | 46 | Pageable pageable); |
47 | 47 | |
... | ... | @@ -50,14 +50,14 @@ public interface EntityViewRepository extends PagingAndSortingRepository<EntityV |
50 | 50 | "LEFT JOIN CustomerEntity c on c.id = e.customerId " + |
51 | 51 | "WHERE e.tenantId = :tenantId " + |
52 | 52 | "AND LOWER(e.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
53 | - Page<EntityViewInfoEntity> findEntityViewInfosByTenantId(@Param("tenantId") String tenantId, | |
53 | + Page<EntityViewInfoEntity> findEntityViewInfosByTenantId(@Param("tenantId") UUID tenantId, | |
54 | 54 | @Param("textSearch") String textSearch, |
55 | 55 | Pageable pageable); |
56 | 56 | |
57 | 57 | @Query("SELECT e FROM EntityViewEntity e WHERE e.tenantId = :tenantId " + |
58 | 58 | "AND e.type = :type " + |
59 | 59 | "AND LOWER(e.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
60 | - Page<EntityViewEntity> findByTenantIdAndType(@Param("tenantId") String tenantId, | |
60 | + Page<EntityViewEntity> findByTenantIdAndType(@Param("tenantId") UUID tenantId, | |
61 | 61 | @Param("type") String type, |
62 | 62 | @Param("textSearch") String textSearch, |
63 | 63 | Pageable pageable); |
... | ... | @@ -68,7 +68,7 @@ public interface EntityViewRepository extends PagingAndSortingRepository<EntityV |
68 | 68 | "WHERE e.tenantId = :tenantId " + |
69 | 69 | "AND e.type = :type " + |
70 | 70 | "AND LOWER(e.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
71 | - Page<EntityViewInfoEntity> findEntityViewInfosByTenantIdAndType(@Param("tenantId") String tenantId, | |
71 | + Page<EntityViewInfoEntity> findEntityViewInfosByTenantIdAndType(@Param("tenantId") UUID tenantId, | |
72 | 72 | @Param("type") String type, |
73 | 73 | @Param("textSearch") String textSearch, |
74 | 74 | Pageable pageable); |
... | ... | @@ -76,8 +76,8 @@ public interface EntityViewRepository extends PagingAndSortingRepository<EntityV |
76 | 76 | @Query("SELECT e FROM EntityViewEntity e WHERE e.tenantId = :tenantId " + |
77 | 77 | "AND e.customerId = :customerId " + |
78 | 78 | "AND LOWER(e.searchText) LIKE LOWER(CONCAT(:searchText, '%'))") |
79 | - Page<EntityViewEntity> findByTenantIdAndCustomerId(@Param("tenantId") String tenantId, | |
80 | - @Param("customerId") String customerId, | |
79 | + Page<EntityViewEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, | |
80 | + @Param("customerId") UUID customerId, | |
81 | 81 | @Param("searchText") String searchText, |
82 | 82 | Pageable pageable); |
83 | 83 | |
... | ... | @@ -87,8 +87,8 @@ public interface EntityViewRepository extends PagingAndSortingRepository<EntityV |
87 | 87 | "WHERE e.tenantId = :tenantId " + |
88 | 88 | "AND e.customerId = :customerId " + |
89 | 89 | "AND LOWER(e.searchText) LIKE LOWER(CONCAT(:searchText, '%'))") |
90 | - Page<EntityViewInfoEntity> findEntityViewInfosByTenantIdAndCustomerId(@Param("tenantId") String tenantId, | |
91 | - @Param("customerId") String customerId, | |
90 | + Page<EntityViewInfoEntity> findEntityViewInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, | |
91 | + @Param("customerId") UUID customerId, | |
92 | 92 | @Param("searchText") String searchText, |
93 | 93 | Pageable pageable); |
94 | 94 | |
... | ... | @@ -96,8 +96,8 @@ public interface EntityViewRepository extends PagingAndSortingRepository<EntityV |
96 | 96 | "AND e.customerId = :customerId " + |
97 | 97 | "AND e.type = :type " + |
98 | 98 | "AND LOWER(e.searchText) LIKE LOWER(CONCAT(:searchText, '%'))") |
99 | - Page<EntityViewEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") String tenantId, | |
100 | - @Param("customerId") String customerId, | |
99 | + Page<EntityViewEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, | |
100 | + @Param("customerId") UUID customerId, | |
101 | 101 | @Param("type") String type, |
102 | 102 | @Param("searchText") String searchText, |
103 | 103 | Pageable pageable); |
... | ... | @@ -109,16 +109,16 @@ public interface EntityViewRepository extends PagingAndSortingRepository<EntityV |
109 | 109 | "AND e.customerId = :customerId " + |
110 | 110 | "AND e.type = :type " + |
111 | 111 | "AND LOWER(e.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
112 | - Page<EntityViewInfoEntity> findEntityViewInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") String tenantId, | |
113 | - @Param("customerId") String customerId, | |
112 | + Page<EntityViewInfoEntity> findEntityViewInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, | |
113 | + @Param("customerId") UUID customerId, | |
114 | 114 | @Param("type") String type, |
115 | 115 | @Param("textSearch") String textSearch, |
116 | 116 | Pageable pageable); |
117 | 117 | |
118 | - EntityViewEntity findByTenantIdAndName(String tenantId, String name); | |
118 | + EntityViewEntity findByTenantIdAndName(UUID tenantId, String name); | |
119 | 119 | |
120 | - List<EntityViewEntity> findAllByTenantIdAndEntityId(String tenantId, String entityId); | |
120 | + List<EntityViewEntity> findAllByTenantIdAndEntityId(UUID tenantId, UUID entityId); | |
121 | 121 | |
122 | 122 | @Query("SELECT DISTINCT ev.type FROM EntityViewEntity ev WHERE ev.tenantId = :tenantId") |
123 | - List<String> findTenantEntityViewTypes(@Param("tenantId") String tenantId); | |
123 | + List<String> findTenantEntityViewTypes(@Param("tenantId") UUID tenantId); | |
124 | 124 | } | ... | ... |
... | ... | @@ -19,7 +19,10 @@ import com.google.common.util.concurrent.ListenableFuture; |
19 | 19 | import org.springframework.beans.factory.annotation.Autowired; |
20 | 20 | import org.springframework.data.repository.CrudRepository; |
21 | 21 | import org.springframework.stereotype.Component; |
22 | -import org.thingsboard.server.common.data.*; | |
22 | +import org.thingsboard.server.common.data.EntitySubtype; | |
23 | +import org.thingsboard.server.common.data.EntityType; | |
24 | +import org.thingsboard.server.common.data.EntityView; | |
25 | +import org.thingsboard.server.common.data.EntityViewInfo; | |
23 | 26 | import org.thingsboard.server.common.data.id.TenantId; |
24 | 27 | import org.thingsboard.server.common.data.page.PageData; |
25 | 28 | import org.thingsboard.server.common.data.page.PageLink; |
... | ... | @@ -37,8 +40,6 @@ import java.util.Objects; |
37 | 40 | import java.util.Optional; |
38 | 41 | import java.util.UUID; |
39 | 42 | |
40 | -import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID; | |
41 | - | |
42 | 43 | /** |
43 | 44 | * Created by Victor Basanets on 8/31/2017. |
44 | 45 | */ |
... | ... | @@ -56,20 +57,20 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity, |
56 | 57 | } |
57 | 58 | |
58 | 59 | @Override |
59 | - protected CrudRepository<EntityViewEntity, String> getCrudRepository() { | |
60 | + protected CrudRepository<EntityViewEntity, UUID> getCrudRepository() { | |
60 | 61 | return entityViewRepository; |
61 | 62 | } |
62 | 63 | |
63 | 64 | @Override |
64 | 65 | public EntityViewInfo findEntityViewInfoById(TenantId tenantId, UUID entityViewId) { |
65 | - return DaoUtil.getData(entityViewRepository.findEntityViewInfoById(fromTimeUUID(entityViewId))); | |
66 | + return DaoUtil.getData(entityViewRepository.findEntityViewInfoById(entityViewId)); | |
66 | 67 | } |
67 | 68 | |
68 | 69 | @Override |
69 | 70 | public PageData<EntityView> findEntityViewsByTenantId(UUID tenantId, PageLink pageLink) { |
70 | 71 | return DaoUtil.toPageData( |
71 | 72 | entityViewRepository.findByTenantId( |
72 | - fromTimeUUID(tenantId), | |
73 | + tenantId, | |
73 | 74 | Objects.toString(pageLink.getTextSearch(), ""), |
74 | 75 | DaoUtil.toPageable(pageLink))); |
75 | 76 | } |
... | ... | @@ -78,7 +79,7 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity, |
78 | 79 | public PageData<EntityViewInfo> findEntityViewInfosByTenantId(UUID tenantId, PageLink pageLink) { |
79 | 80 | return DaoUtil.toPageData( |
80 | 81 | entityViewRepository.findEntityViewInfosByTenantId( |
81 | - fromTimeUUID(tenantId), | |
82 | + tenantId, | |
82 | 83 | Objects.toString(pageLink.getTextSearch(), ""), |
83 | 84 | DaoUtil.toPageable(pageLink, EntityViewInfoEntity.entityViewInfoColumnMap))); |
84 | 85 | } |
... | ... | @@ -87,7 +88,7 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity, |
87 | 88 | public PageData<EntityView> findEntityViewsByTenantIdAndType(UUID tenantId, String type, PageLink pageLink) { |
88 | 89 | return DaoUtil.toPageData( |
89 | 90 | entityViewRepository.findByTenantIdAndType( |
90 | - fromTimeUUID(tenantId), | |
91 | + tenantId, | |
91 | 92 | type, |
92 | 93 | Objects.toString(pageLink.getTextSearch(), ""), |
93 | 94 | DaoUtil.toPageable(pageLink))); |
... | ... | @@ -97,7 +98,7 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity, |
97 | 98 | public PageData<EntityViewInfo> findEntityViewInfosByTenantIdAndType(UUID tenantId, String type, PageLink pageLink) { |
98 | 99 | return DaoUtil.toPageData( |
99 | 100 | entityViewRepository.findEntityViewInfosByTenantIdAndType( |
100 | - fromTimeUUID(tenantId), | |
101 | + tenantId, | |
101 | 102 | type, |
102 | 103 | Objects.toString(pageLink.getTextSearch(), ""), |
103 | 104 | DaoUtil.toPageable(pageLink, EntityViewInfoEntity.entityViewInfoColumnMap))); |
... | ... | @@ -106,7 +107,7 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity, |
106 | 107 | @Override |
107 | 108 | public Optional<EntityView> findEntityViewByTenantIdAndName(UUID tenantId, String name) { |
108 | 109 | return Optional.ofNullable( |
109 | - DaoUtil.getData(entityViewRepository.findByTenantIdAndName(fromTimeUUID(tenantId), name))); | |
110 | + DaoUtil.getData(entityViewRepository.findByTenantIdAndName(tenantId, name))); | |
110 | 111 | } |
111 | 112 | |
112 | 113 | @Override |
... | ... | @@ -115,8 +116,8 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity, |
115 | 116 | PageLink pageLink) { |
116 | 117 | return DaoUtil.toPageData( |
117 | 118 | entityViewRepository.findByTenantIdAndCustomerId( |
118 | - fromTimeUUID(tenantId), | |
119 | - fromTimeUUID(customerId), | |
119 | + tenantId, | |
120 | + customerId, | |
120 | 121 | Objects.toString(pageLink.getTextSearch(), ""), |
121 | 122 | DaoUtil.toPageable(pageLink) |
122 | 123 | )); |
... | ... | @@ -126,8 +127,8 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity, |
126 | 127 | public PageData<EntityViewInfo> findEntityViewInfosByTenantIdAndCustomerId(UUID tenantId, UUID customerId, PageLink pageLink) { |
127 | 128 | return DaoUtil.toPageData( |
128 | 129 | entityViewRepository.findEntityViewInfosByTenantIdAndCustomerId( |
129 | - fromTimeUUID(tenantId), | |
130 | - fromTimeUUID(customerId), | |
130 | + tenantId, | |
131 | + customerId, | |
131 | 132 | Objects.toString(pageLink.getTextSearch(), ""), |
132 | 133 | DaoUtil.toPageable(pageLink, EntityViewInfoEntity.entityViewInfoColumnMap))); |
133 | 134 | } |
... | ... | @@ -136,8 +137,8 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity, |
136 | 137 | public PageData<EntityView> findEntityViewsByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, PageLink pageLink) { |
137 | 138 | return DaoUtil.toPageData( |
138 | 139 | entityViewRepository.findByTenantIdAndCustomerIdAndType( |
139 | - fromTimeUUID(tenantId), | |
140 | - fromTimeUUID(customerId), | |
140 | + tenantId, | |
141 | + customerId, | |
141 | 142 | type, |
142 | 143 | Objects.toString(pageLink.getTextSearch(), ""), |
143 | 144 | DaoUtil.toPageable(pageLink) |
... | ... | @@ -148,8 +149,8 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity, |
148 | 149 | public PageData<EntityViewInfo> findEntityViewInfosByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, PageLink pageLink) { |
149 | 150 | return DaoUtil.toPageData( |
150 | 151 | entityViewRepository.findEntityViewInfosByTenantIdAndCustomerIdAndType( |
151 | - fromTimeUUID(tenantId), | |
152 | - fromTimeUUID(customerId), | |
152 | + tenantId, | |
153 | + customerId, | |
153 | 154 | type, |
154 | 155 | Objects.toString(pageLink.getTextSearch(), ""), |
155 | 156 | DaoUtil.toPageable(pageLink, EntityViewInfoEntity.entityViewInfoColumnMap))); |
... | ... | @@ -158,12 +159,12 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity, |
158 | 159 | @Override |
159 | 160 | public ListenableFuture<List<EntityView>> findEntityViewsByTenantIdAndEntityIdAsync(UUID tenantId, UUID entityId) { |
160 | 161 | return service.submit(() -> DaoUtil.convertDataList( |
161 | - entityViewRepository.findAllByTenantIdAndEntityId(UUIDConverter.fromTimeUUID(tenantId), UUIDConverter.fromTimeUUID(entityId)))); | |
162 | + entityViewRepository.findAllByTenantIdAndEntityId(tenantId, entityId))); | |
162 | 163 | } |
163 | 164 | |
164 | 165 | @Override |
165 | 166 | public ListenableFuture<List<EntitySubtype>> findTenantEntityViewTypesAsync(UUID tenantId) { |
166 | - return service.submit(() -> convertTenantEntityViewTypesToDto(tenantId, entityViewRepository.findTenantEntityViewTypes(fromTimeUUID(tenantId)))); | |
167 | + return service.submit(() -> convertTenantEntityViewTypesToDto(tenantId, entityViewRepository.findTenantEntityViewTypes(tenantId))); | |
167 | 168 | } |
168 | 169 | |
169 | 170 | private List<EntitySubtype> convertTenantEntityViewTypesToDto(UUID tenantId, List<String> types) { | ... | ... |
... | ... | @@ -23,7 +23,6 @@ import org.springframework.transaction.PlatformTransactionManager; |
23 | 23 | import org.springframework.transaction.TransactionDefinition; |
24 | 24 | import org.springframework.transaction.TransactionStatus; |
25 | 25 | import org.springframework.transaction.support.DefaultTransactionDefinition; |
26 | -import org.thingsboard.server.common.data.UUIDConverter; | |
27 | 26 | import org.thingsboard.server.dao.model.sql.EventEntity; |
28 | 27 | |
29 | 28 | import javax.persistence.EntityManager; |
... | ... | @@ -69,7 +68,8 @@ public abstract class AbstractEventInsertRepository implements EventInsertReposi |
69 | 68 | |
70 | 69 | protected Query getQuery(EventEntity entity, String query) { |
71 | 70 | return entityManager.createNativeQuery(query, EventEntity.class) |
72 | - .setParameter("id", UUIDConverter.fromTimeUUID(entity.getUuid())) | |
71 | + .setParameter("id", entity.getUuid()) | |
72 | + .setParameter("created_time", entity.getCreatedTime()) | |
73 | 73 | .setParameter("body", entity.getBody().toString()) |
74 | 74 | .setParameter("entity_id", entity.getEntityId()) |
75 | 75 | .setParameter("entity_type", entity.getEntityType().name()) | ... | ... |
... | ... | @@ -25,60 +25,61 @@ import org.thingsboard.server.dao.model.sql.EventEntity; |
25 | 25 | import org.thingsboard.server.dao.util.SqlDao; |
26 | 26 | |
27 | 27 | import java.util.List; |
28 | +import java.util.UUID; | |
28 | 29 | |
29 | 30 | /** |
30 | 31 | * Created by Valerii Sosliuk on 5/3/2017. |
31 | 32 | */ |
32 | 33 | @SqlDao |
33 | -public interface EventRepository extends PagingAndSortingRepository<EventEntity, String> { | |
34 | +public interface EventRepository extends PagingAndSortingRepository<EventEntity, UUID> { | |
34 | 35 | |
35 | - EventEntity findByTenantIdAndEntityTypeAndEntityIdAndEventTypeAndEventUid(String tenantId, | |
36 | + EventEntity findByTenantIdAndEntityTypeAndEntityIdAndEventTypeAndEventUid(UUID tenantId, | |
36 | 37 | EntityType entityType, |
37 | - String entityId, | |
38 | + UUID entityId, | |
38 | 39 | String eventType, |
39 | 40 | String eventUid); |
40 | 41 | |
41 | - EventEntity findByTenantIdAndEntityTypeAndEntityId(String tenantId, | |
42 | + EventEntity findByTenantIdAndEntityTypeAndEntityId(UUID tenantId, | |
42 | 43 | EntityType entityType, |
43 | - String entityId); | |
44 | + UUID entityId); | |
44 | 45 | |
45 | 46 | @Query("SELECT e FROM EventEntity e WHERE e.tenantId = :tenantId AND e.entityType = :entityType " + |
46 | 47 | "AND e.entityId = :entityId AND e.eventType = :eventType ORDER BY e.eventType DESC, e.id DESC") |
47 | 48 | List<EventEntity> findLatestByTenantIdAndEntityTypeAndEntityIdAndEventType( |
48 | - @Param("tenantId") String tenantId, | |
49 | + @Param("tenantId") UUID tenantId, | |
49 | 50 | @Param("entityType") EntityType entityType, |
50 | - @Param("entityId") String entityId, | |
51 | + @Param("entityId") UUID entityId, | |
51 | 52 | @Param("eventType") String eventType, |
52 | 53 | Pageable pageable); |
53 | 54 | |
54 | 55 | @Query("SELECT e FROM EventEntity e WHERE " + |
55 | 56 | "e.tenantId = :tenantId " + |
56 | 57 | "AND e.entityType = :entityType AND e.entityId = :entityId " + |
57 | - "AND (:startId IS NULL OR e.id >= :startId) " + | |
58 | - "AND (:endId IS NULL OR e.id <= :endId) " + | |
58 | + "AND (:startTime IS NULL OR e.createdTime >= :startTime) " + | |
59 | + "AND (:endTime IS NULL OR e.createdTime <= :endTime) " + | |
59 | 60 | "AND LOWER(e.eventType) LIKE LOWER(CONCAT(:textSearch, '%'))" |
60 | 61 | ) |
61 | - Page<EventEntity> findEventsByTenantIdAndEntityId(@Param("tenantId") String tenantId, | |
62 | + Page<EventEntity> findEventsByTenantIdAndEntityId(@Param("tenantId") UUID tenantId, | |
62 | 63 | @Param("entityType") EntityType entityType, |
63 | - @Param("entityId") String entityId, | |
64 | + @Param("entityId") UUID entityId, | |
64 | 65 | @Param("textSearch") String textSearch, |
65 | - @Param("startId") String startId, | |
66 | - @Param("endId") String endId, | |
66 | + @Param("startTime") Long startTime, | |
67 | + @Param("endTime") Long endTime, | |
67 | 68 | Pageable pageable); |
68 | 69 | |
69 | 70 | @Query("SELECT e FROM EventEntity e WHERE " + |
70 | 71 | "e.tenantId = :tenantId " + |
71 | 72 | "AND e.entityType = :entityType AND e.entityId = :entityId " + |
72 | 73 | "AND e.eventType = :eventType " + |
73 | - "AND (:startId IS NULL OR e.id >= :startId) " + | |
74 | - "AND (:endId IS NULL OR e.id <= :endId)" | |
74 | + "AND (:startTime IS NULL OR e.createdTime >= :startTime) " + | |
75 | + "AND (:endTime IS NULL OR e.createdTime <= :endTime)" | |
75 | 76 | ) |
76 | - Page<EventEntity> findEventsByTenantIdAndEntityIdAndEventType(@Param("tenantId") String tenantId, | |
77 | + Page<EventEntity> findEventsByTenantIdAndEntityIdAndEventType(@Param("tenantId") UUID tenantId, | |
77 | 78 | @Param("entityType") EntityType entityType, |
78 | - @Param("entityId") String entityId, | |
79 | + @Param("entityId") UUID entityId, | |
79 | 80 | @Param("eventType") String eventType, |
80 | - @Param("startId") String startId, | |
81 | - @Param("endId") String endId, | |
81 | + @Param("startTime") Long startTime, | |
82 | + @Param("endTime") Long endTime, | |
82 | 83 | Pageable pageable); |
83 | 84 | |
84 | 85 | } | ... | ... |
... | ... | @@ -16,11 +16,12 @@ |
16 | 16 | package org.thingsboard.server.dao.sql.event; |
17 | 17 | |
18 | 18 | import org.springframework.stereotype.Repository; |
19 | -import org.thingsboard.server.common.data.UUIDConverter; | |
20 | 19 | import org.thingsboard.server.dao.model.sql.EventEntity; |
21 | 20 | import org.thingsboard.server.dao.util.HsqlDao; |
22 | 21 | import org.thingsboard.server.dao.util.SqlDao; |
23 | 22 | |
23 | +import javax.persistence.Query; | |
24 | + | |
24 | 25 | @SqlDao |
25 | 26 | @HsqlDao |
26 | 27 | @Repository |
... | ... | @@ -40,11 +41,25 @@ public class HsqlEventInsertRepository extends AbstractEventInsertRepository { |
40 | 41 | @Override |
41 | 42 | protected EventEntity doProcessSaveOrUpdate(EventEntity entity, String query) { |
42 | 43 | getQuery(entity, query).executeUpdate(); |
43 | - return entityManager.find(EventEntity.class, UUIDConverter.fromTimeUUID(entity.getUuid())); | |
44 | + return entityManager.find(EventEntity.class, entity.getUuid()); | |
45 | + } | |
46 | + | |
47 | + protected Query getQuery(EventEntity entity, String query) { | |
48 | + return entityManager.createNativeQuery(query, EventEntity.class) | |
49 | + .setParameter("id", entity.getUuid().toString()) | |
50 | + .setParameter("created_time", entity.getCreatedTime()) | |
51 | + .setParameter("body", entity.getBody().toString()) | |
52 | + .setParameter("entity_id", entity.getEntityId().toString()) | |
53 | + .setParameter("entity_type", entity.getEntityType().name()) | |
54 | + .setParameter("event_type", entity.getEventType()) | |
55 | + .setParameter("event_uid", entity.getEventUid()) | |
56 | + .setParameter("tenant_id", entity.getTenantId().toString()) | |
57 | + .setParameter("ts", entity.getTs()); | |
44 | 58 | } |
45 | 59 | |
46 | 60 | private static String getInsertString(String conflictStatement) { |
47 | - return "MERGE INTO event USING (VALUES :id, :body, :entity_id, :entity_type, :event_type, :event_uid, :tenant_id, :ts) I (id, body, entity_id, entity_type, event_type, event_uid, tenant_id, ts) ON " + conflictStatement + " WHEN MATCHED THEN UPDATE SET event.id = I.id, event.body = I.body, event.entity_id = I.entity_id, event.entity_type = I.entity_type, event.event_type = I.event_type, event.event_uid = I.event_uid, event.tenant_id = I.tenant_id, event.ts = I.ts" + | |
48 | - " WHEN NOT MATCHED THEN INSERT (id, body, entity_id, entity_type, event_type, event_uid, tenant_id, ts) VALUES (I.id, I.body, I.entity_id, I.entity_type, I.event_type, I.event_uid, I.tenant_id, I.ts)"; | |
61 | + return "MERGE INTO event USING (VALUES UUID(:id), :created_time, :body, UUID(:entity_id), :entity_type, :event_type, :event_uid, UUID(:tenant_id), :ts) I (id, created_time, body, entity_id, entity_type, event_type, event_uid, tenant_id, ts) ON " + conflictStatement | |
62 | + + " WHEN MATCHED THEN UPDATE SET event.id = I.id, event.created_time = I.created_time, event.body = I.body, event.entity_id = I.entity_id, event.entity_type = I.entity_type, event.event_type = I.event_type, event.event_uid = I.event_uid, event.tenant_id = I.tenant_id, event.ts = I.ts" + | |
63 | + " WHEN NOT MATCHED THEN INSERT (id, created_time, body, entity_id, entity_type, event_type, event_uid, tenant_id, ts) VALUES (I.id, I.created_time, I.body, I.entity_id, I.entity_type, I.event_type, I.event_uid, I.tenant_id, I.ts)"; | |
49 | 64 | } |
50 | 65 | } |
\ No newline at end of file | ... | ... |
... | ... | @@ -38,9 +38,12 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTimeDao; |
38 | 38 | import org.thingsboard.server.dao.util.SqlDao; |
39 | 39 | |
40 | 40 | import javax.persistence.criteria.Predicate; |
41 | -import java.util.*; | |
41 | +import java.util.ArrayList; | |
42 | +import java.util.List; | |
43 | +import java.util.Objects; | |
44 | +import java.util.Optional; | |
45 | +import java.util.UUID; | |
42 | 46 | |
43 | -import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID; | |
44 | 47 | import static org.thingsboard.server.dao.DaoUtil.endTimeToId; |
45 | 48 | import static org.thingsboard.server.dao.DaoUtil.startTimeToId; |
46 | 49 | import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; |
... | ... | @@ -67,7 +70,7 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event |
67 | 70 | } |
68 | 71 | |
69 | 72 | @Override |
70 | - protected CrudRepository<EventEntity, String> getCrudRepository() { | |
73 | + protected CrudRepository<EventEntity, UUID> getCrudRepository() { | |
71 | 74 | return eventRepository; |
72 | 75 | } |
73 | 76 | |
... | ... | @@ -75,7 +78,16 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event |
75 | 78 | public Event save(TenantId tenantId, Event event) { |
76 | 79 | log.debug("Save event [{}] ", event); |
77 | 80 | if (event.getId() == null) { |
78 | - event.setId(new EventId(Uuids.timeBased())); | |
81 | + UUID timeBased = Uuids.timeBased(); | |
82 | + event.setId(new EventId(timeBased)); | |
83 | + event.setCreatedTime(Uuids.unixTimestamp(timeBased)); | |
84 | + } else if (event.getCreatedTime() == 0L) { | |
85 | + UUID eventId = event.getId().getId(); | |
86 | + if (eventId.version() == 1) { | |
87 | + event.setCreatedTime(Uuids.unixTimestamp(eventId)); | |
88 | + } else { | |
89 | + event.setCreatedTime(System.currentTimeMillis()); | |
90 | + } | |
79 | 91 | } |
80 | 92 | if (StringUtils.isEmpty(event.getUid())) { |
81 | 93 | event.setUid(event.getId().toString()); |
... | ... | @@ -87,7 +99,16 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event |
87 | 99 | public ListenableFuture<Event> saveAsync(Event event) { |
88 | 100 | log.debug("Save event [{}] ", event); |
89 | 101 | if (event.getId() == null) { |
90 | - event.setId(new EventId(Uuids.timeBased())); | |
102 | + UUID timeBased = Uuids.timeBased(); | |
103 | + event.setId(new EventId(timeBased)); | |
104 | + event.setCreatedTime(Uuids.unixTimestamp(timeBased)); | |
105 | + } else if (event.getCreatedTime() == 0L) { | |
106 | + UUID eventId = event.getId().getId(); | |
107 | + if (eventId.version() == 1) { | |
108 | + event.setCreatedTime(Uuids.unixTimestamp(eventId)); | |
109 | + } else { | |
110 | + event.setCreatedTime(System.currentTimeMillis()); | |
111 | + } | |
91 | 112 | } |
92 | 113 | if (StringUtils.isEmpty(event.getUid())) { |
93 | 114 | event.setUid(event.getId().toString()); |
... | ... | @@ -103,7 +124,7 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event |
103 | 124 | @Override |
104 | 125 | public Event findEvent(UUID tenantId, EntityId entityId, String eventType, String eventUid) { |
105 | 126 | return DaoUtil.getData(eventRepository.findByTenantIdAndEntityTypeAndEntityIdAndEventTypeAndEventUid( |
106 | - UUIDConverter.fromTimeUUID(tenantId), entityId.getEntityType(), UUIDConverter.fromTimeUUID(entityId.getId()), eventType, eventUid)); | |
127 | + tenantId, entityId.getEntityType(), entityId.getId(), eventType, eventUid)); | |
107 | 128 | } |
108 | 129 | |
109 | 130 | @Override |
... | ... | @@ -111,12 +132,12 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event |
111 | 132 | return DaoUtil.toPageData( |
112 | 133 | eventRepository |
113 | 134 | .findEventsByTenantIdAndEntityId( |
114 | - fromTimeUUID(tenantId), | |
135 | + tenantId, | |
115 | 136 | entityId.getEntityType(), |
116 | - fromTimeUUID(entityId.getId()), | |
137 | + entityId.getId(), | |
117 | 138 | Objects.toString(pageLink.getTextSearch(), ""), |
118 | - startTimeToId(pageLink.getStartTime()), | |
119 | - endTimeToId(pageLink.getEndTime()), | |
139 | + pageLink.getStartTime(), | |
140 | + pageLink.getEndTime(), | |
120 | 141 | DaoUtil.toPageable(pageLink))); |
121 | 142 | } |
122 | 143 | |
... | ... | @@ -125,21 +146,21 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event |
125 | 146 | return DaoUtil.toPageData( |
126 | 147 | eventRepository |
127 | 148 | .findEventsByTenantIdAndEntityIdAndEventType( |
128 | - fromTimeUUID(tenantId), | |
149 | + tenantId, | |
129 | 150 | entityId.getEntityType(), |
130 | - fromTimeUUID(entityId.getId()), | |
151 | + entityId.getId(), | |
131 | 152 | eventType, |
132 | - startTimeToId(pageLink.getStartTime()), | |
133 | - endTimeToId(pageLink.getEndTime()), | |
153 | + pageLink.getStartTime(), | |
154 | + pageLink.getEndTime(), | |
134 | 155 | DaoUtil.toPageable(pageLink))); |
135 | 156 | } |
136 | 157 | |
137 | 158 | @Override |
138 | 159 | public List<Event> findLatestEvents(UUID tenantId, EntityId entityId, String eventType, int limit) { |
139 | 160 | List<EventEntity> latest = eventRepository.findLatestByTenantIdAndEntityTypeAndEntityIdAndEventType( |
140 | - UUIDConverter.fromTimeUUID(tenantId), | |
161 | + tenantId, | |
141 | 162 | entityId.getEntityType(), |
142 | - UUIDConverter.fromTimeUUID(entityId.getId()), | |
163 | + entityId.getId(), | |
143 | 164 | eventType, |
144 | 165 | PageRequest.of(0, limit)); |
145 | 166 | return DaoUtil.convertDataList(latest); |
... | ... | @@ -149,7 +170,7 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event |
149 | 170 | log.debug("Save event [{}] ", entity); |
150 | 171 | if (entity.getTenantId() == null) { |
151 | 172 | log.trace("Save system event with predefined id {}", systemTenantId); |
152 | - entity.setTenantId(UUIDConverter.fromTimeUUID(systemTenantId)); | |
173 | + entity.setTenantId(systemTenantId); | |
153 | 174 | } |
154 | 175 | if (entity.getUuid() == null) { |
155 | 176 | entity.setUuid(Uuids.timeBased()); |
... | ... | @@ -168,13 +189,13 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event |
168 | 189 | return (root, criteriaQuery, criteriaBuilder) -> { |
169 | 190 | List<Predicate> predicates = new ArrayList<>(); |
170 | 191 | if (tenantId != null) { |
171 | - Predicate tenantIdPredicate = criteriaBuilder.equal(root.get("tenantId"), UUIDConverter.fromTimeUUID(tenantId)); | |
192 | + Predicate tenantIdPredicate = criteriaBuilder.equal(root.get("tenantId"), tenantId); | |
172 | 193 | predicates.add(tenantIdPredicate); |
173 | 194 | } |
174 | 195 | if (entityId != null) { |
175 | 196 | Predicate entityTypePredicate = criteriaBuilder.equal(root.get("entityType"), entityId.getEntityType()); |
176 | 197 | predicates.add(entityTypePredicate); |
177 | - Predicate entityIdPredicate = criteriaBuilder.equal(root.get("entityId"), UUIDConverter.fromTimeUUID(entityId.getId())); | |
198 | + Predicate entityIdPredicate = criteriaBuilder.equal(root.get("entityId"), entityId.getId()); | |
178 | 199 | predicates.add(entityIdPredicate); |
179 | 200 | } |
180 | 201 | if (eventType != null) { | ... | ... |
... | ... | @@ -28,10 +28,10 @@ import org.thingsboard.server.dao.util.SqlDao; |
28 | 28 | public class PsqlEventInsertRepository extends AbstractEventInsertRepository { |
29 | 29 | |
30 | 30 | private static final String P_KEY_CONFLICT_STATEMENT = "(id)"; |
31 | - private static final String UNQ_KEY_CONFLICT_STATEMENT = "(tenant_id, entity_type, entity_id, event_type, event_uid)"; | |
31 | + private static final String UNQ_KEY_CONFLICT_STATEMENT = "(tenant_id, created_time, entity_type, entity_id, event_type, event_uid)"; | |
32 | 32 | |
33 | 33 | private static final String UPDATE_P_KEY_STATEMENT = "id = :id"; |
34 | - private static final String UPDATE_UNQ_KEY_STATEMENT = "tenant_id = :tenant_id, entity_type = :entity_type, entity_id = :entity_id, event_type = :event_type, event_uid = :event_uid"; | |
34 | + private static final String UPDATE_UNQ_KEY_STATEMENT = "created_time = :created_time, tenant_id = :tenant_id, entity_type = :entity_type, entity_id = :entity_id, event_type = :event_type, event_uid = :event_uid"; | |
35 | 35 | |
36 | 36 | private static final String INSERT_OR_UPDATE_ON_P_KEY_CONFLICT = getInsertOrUpdateString(P_KEY_CONFLICT_STATEMENT, UPDATE_UNQ_KEY_STATEMENT); |
37 | 37 | private static final String INSERT_OR_UPDATE_ON_UNQ_KEY_CONFLICT = getInsertOrUpdateString(UNQ_KEY_CONFLICT_STATEMENT, UPDATE_P_KEY_STATEMENT); |
... | ... | @@ -48,6 +48,8 @@ public class PsqlEventInsertRepository extends AbstractEventInsertRepository { |
48 | 48 | } |
49 | 49 | |
50 | 50 | private static String getInsertOrUpdateString(String eventKeyStatement, String updateKeyStatement) { |
51 | - return "INSERT INTO event (id, body, entity_id, entity_type, event_type, event_uid, tenant_id, ts) VALUES (:id, :body, :entity_id, :entity_type, :event_type, :event_uid, :tenant_id, :ts) ON CONFLICT " + eventKeyStatement + " DO UPDATE SET body = :body, ts = :ts," + updateKeyStatement + " returning *"; | |
51 | + return "INSERT INTO event (id, created_time, body, entity_id, entity_type, event_type, event_uid, tenant_id, ts) " + | |
52 | + "VALUES (:id, :created_time, :body, :entity_id, :entity_type, :event_type, :event_uid, :tenant_id, :ts) " + | |
53 | + "ON CONFLICT " + eventKeyStatement + " DO UPDATE SET body = :body, ts = :ts," + updateKeyStatement + " returning *"; | |
52 | 54 | } |
53 | 55 | } |
\ No newline at end of file | ... | ... |
... | ... | @@ -17,10 +17,10 @@ package org.thingsboard.server.dao.sql.query; |
17 | 17 | |
18 | 18 | import lombok.extern.slf4j.Slf4j; |
19 | 19 | import org.apache.commons.lang3.StringUtils; |
20 | +import org.springframework.beans.factory.annotation.Autowired; | |
21 | +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; | |
20 | 22 | import org.springframework.stereotype.Repository; |
21 | 23 | import org.thingsboard.server.common.data.EntityType; |
22 | -import org.thingsboard.server.common.data.UUIDConverter; | |
23 | -import org.thingsboard.server.common.data.asset.Asset; | |
24 | 24 | import org.thingsboard.server.common.data.id.CustomerId; |
25 | 25 | import org.thingsboard.server.common.data.id.EntityId; |
26 | 26 | import org.thingsboard.server.common.data.id.TenantId; |
... | ... | @@ -46,8 +46,6 @@ import org.thingsboard.server.common.data.relation.EntitySearchDirection; |
46 | 46 | import org.thingsboard.server.common.data.relation.EntityTypeFilter; |
47 | 47 | import org.thingsboard.server.dao.util.SqlDao; |
48 | 48 | |
49 | -import javax.persistence.EntityManager; | |
50 | -import javax.persistence.PersistenceContext; | |
51 | 49 | import java.math.BigInteger; |
52 | 50 | import java.util.Collections; |
53 | 51 | import java.util.HashMap; |
... | ... | @@ -77,7 +75,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
77 | 75 | public static final String HIERARCHICAL_QUERY_TEMPLATE = " FROM (WITH RECURSIVE related_entities(from_id, from_type, to_id, to_type, relation_type, lvl) AS (" + |
78 | 76 | " SELECT from_id, from_type, to_id, to_type, relation_type, 1 as lvl" + |
79 | 77 | " FROM relation" + |
80 | - " WHERE $in_id = '%s' and $in_type = '%s' and relation_type_group = 'COMMON'" + | |
78 | + " WHERE $in_id = :relation_root_id and $in_type = :relation_root_type and relation_type_group = 'COMMON'" + | |
81 | 79 | " UNION ALL" + |
82 | 80 | " SELECT r.from_id, r.from_type, r.to_id, r.to_type, r.relation_type, lvl + 1" + |
83 | 81 | " FROM relation r" + |
... | ... | @@ -90,21 +88,23 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
90 | 88 | public static final String HIERARCHICAL_TO_QUERY_TEMPLATE = HIERARCHICAL_QUERY_TEMPLATE.replace("$in", "to").replace("$out", "from"); |
91 | 89 | public static final String HIERARCHICAL_FROM_QUERY_TEMPLATE = HIERARCHICAL_QUERY_TEMPLATE.replace("$in", "from").replace("$out", "to"); |
92 | 90 | |
93 | - @PersistenceContext | |
94 | - private EntityManager entityManager; | |
91 | + @Autowired | |
92 | + protected NamedParameterJdbcTemplate jdbcTemplate; | |
95 | 93 | |
96 | 94 | @Override |
97 | 95 | public long countEntitiesByQuery(TenantId tenantId, CustomerId customerId, EntityCountQuery query) { |
98 | 96 | EntityType entityType = resolveEntityType(query.getEntityFilter()); |
99 | - String countQuery = String.format("select count(e.id) from %s e where %s", | |
100 | - getEntityTableQuery(query.getEntityFilter(), entityType), this.buildEntityWhere(tenantId, customerId, query.getEntityFilter(), | |
101 | - Collections.emptyList(), entityType)); | |
102 | - return ((BigInteger) entityManager.createNativeQuery(countQuery) | |
103 | - .getSingleResult()).longValue(); | |
97 | + EntityQueryContext ctx = new EntityQueryContext(); | |
98 | + ctx.append("select count(e.id) from "); | |
99 | + ctx.append(addEntityTableQuery(ctx, query.getEntityFilter(), entityType)); | |
100 | + ctx.append(" e where "); | |
101 | + ctx.append(buildEntityWhere(ctx, tenantId, customerId, query.getEntityFilter(), Collections.emptyList(), entityType)); | |
102 | + return jdbcTemplate.queryForObject(ctx.getQuery(), ctx, Long.class); | |
104 | 103 | } |
105 | 104 | |
106 | 105 | @Override |
107 | 106 | public PageData<EntityData> findEntityDataByQuery(TenantId tenantId, CustomerId customerId, EntityDataQuery query) { |
107 | + EntityQueryContext ctx = new EntityQueryContext(); | |
108 | 108 | EntityType entityType = resolveEntityType(query.getEntityFilter()); |
109 | 109 | EntityDataPageLink pageLink = query.getPageLink(); |
110 | 110 | |
... | ... | @@ -128,9 +128,9 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
128 | 128 | .collect(Collectors.toList()); |
129 | 129 | |
130 | 130 | |
131 | - String entityWhereClause = this.buildEntityWhere(tenantId, customerId, query.getEntityFilter(), entityFieldsFiltersMapping, entityType); | |
132 | - String latestJoins = EntityKeyMapping.buildLatestJoins(query.getEntityFilter(), entityType, allLatestMappings); | |
133 | - String whereClause = this.buildWhere(selectionMapping, latestFiltersMapping, pageLink.getTextSearch()); | |
131 | + String entityWhereClause = this.buildEntityWhere(ctx, tenantId, customerId, query.getEntityFilter(), entityFieldsFiltersMapping, entityType); | |
132 | + String latestJoins = EntityKeyMapping.buildLatestJoins(ctx, query.getEntityFilter(), entityType, allLatestMappings); | |
133 | + String whereClause = this.buildWhere(ctx, selectionMapping, latestFiltersMapping, pageLink.getTextSearch()); | |
134 | 134 | String entityFieldsSelection = EntityKeyMapping.buildSelections(entityFieldsSelectionMapping); |
135 | 135 | String entityTypeStr; |
136 | 136 | if (query.getEntityFilter().getType().equals(EntityFilterType.RELATIONS_QUERY)) { |
... | ... | @@ -139,9 +139,9 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
139 | 139 | entityTypeStr = "'" + entityType.name() + "'"; |
140 | 140 | } |
141 | 141 | if (!StringUtils.isEmpty(entityFieldsSelection)) { |
142 | - entityFieldsSelection = String.format("e.id, %s, %s", entityTypeStr, entityFieldsSelection); | |
142 | + entityFieldsSelection = String.format("e.id id, %s entity_type, %s", entityTypeStr, entityFieldsSelection); | |
143 | 143 | } else { |
144 | - entityFieldsSelection = String.format("e.id, %s", entityTypeStr); | |
144 | + entityFieldsSelection = String.format("e.id id, %s entity_type", entityTypeStr); | |
145 | 145 | } |
146 | 146 | String latestSelection = EntityKeyMapping.buildSelections(latestSelectionMapping); |
147 | 147 | String topSelection = "entities.*"; |
... | ... | @@ -152,13 +152,13 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
152 | 152 | String fromClause = String.format("from (select %s from (select %s from %s e where %s) entities %s %s) result", |
153 | 153 | topSelection, |
154 | 154 | entityFieldsSelection, |
155 | - getEntityTableQuery(query.getEntityFilter(), entityType), | |
155 | + addEntityTableQuery(ctx, query.getEntityFilter(), entityType), | |
156 | 156 | entityWhereClause, |
157 | 157 | latestJoins, |
158 | 158 | whereClause); |
159 | 159 | |
160 | - int totalElements = ((BigInteger) entityManager.createNativeQuery(String.format("select count(*) %s", fromClause)) | |
161 | - .getSingleResult()).intValue(); | |
160 | + | |
161 | + int totalElements = jdbcTemplate.queryForObject(String.format("select count(*) %s", fromClause), ctx, Integer.class); | |
162 | 162 | |
163 | 163 | String dataQuery = String.format("select * %s", fromClause); |
164 | 164 | |
... | ... | @@ -179,17 +179,18 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
179 | 179 | if (pageLink.getPageSize() > 0) { |
180 | 180 | dataQuery = String.format("%s limit %s offset %s", dataQuery, pageLink.getPageSize(), startIndex); |
181 | 181 | } |
182 | - List rows = entityManager.createNativeQuery(dataQuery).getResultList(); | |
182 | + List<Map<String, Object>> rows = jdbcTemplate.queryForList(dataQuery, ctx); | |
183 | 183 | return EntityDataAdapter.createEntityData(pageLink, selectionMapping, rows, totalElements); |
184 | 184 | } |
185 | 185 | |
186 | - private String buildEntityWhere(TenantId tenantId, | |
186 | + private String buildEntityWhere(EntityQueryContext ctx, | |
187 | + TenantId tenantId, | |
187 | 188 | CustomerId customerId, |
188 | 189 | EntityFilter entityFilter, |
189 | 190 | List<EntityKeyMapping> entityFieldsFilters, |
190 | 191 | EntityType entityType) { |
191 | - String permissionQuery = this.buildPermissionQuery(entityFilter, tenantId, customerId, entityType); | |
192 | - String entityFilterQuery = this.buildEntityFilterQuery(entityFilter); | |
192 | + String permissionQuery = this.buildPermissionQuery(ctx, entityFilter, tenantId, customerId, entityType); | |
193 | + String entityFilterQuery = this.buildEntityFilterQuery(ctx, entityFilter); | |
193 | 194 | String result = permissionQuery; |
194 | 195 | if (!entityFilterQuery.isEmpty()) { |
195 | 196 | result += " and " + entityFilterQuery; |
... | ... | @@ -200,35 +201,42 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
200 | 201 | return result; |
201 | 202 | } |
202 | 203 | |
203 | - private String buildPermissionQuery(EntityFilter entityFilter, TenantId tenantId, CustomerId customerId, EntityType entityType) { | |
204 | + private String buildPermissionQuery(EntityQueryContext ctx, EntityFilter entityFilter, TenantId tenantId, CustomerId customerId, EntityType entityType) { | |
204 | 205 | switch (entityFilter.getType()) { |
205 | 206 | case RELATIONS_QUERY: |
206 | 207 | case DEVICE_SEARCH_QUERY: |
207 | 208 | case ASSET_SEARCH_QUERY: |
208 | - return String.format("e.tenant_id='%s' and e.customer_id='%s'", UUIDConverter.fromTimeUUID(tenantId.getId()), UUIDConverter.fromTimeUUID(customerId.getId())); | |
209 | + ctx.addUuidParameter("permissions_tenant_id", tenantId.getId()); | |
210 | + ctx.addUuidParameter("permissions_customer_id", customerId.getId()); | |
211 | + return "e.tenant_id=:permissions_tenant_id and e.customer_id=:permissions_customer_id"; | |
209 | 212 | default: |
210 | 213 | if (entityType == EntityType.TENANT) { |
211 | - return String.format("e.id='%s'", UUIDConverter.fromTimeUUID(tenantId.getId())); | |
214 | + ctx.addUuidParameter("permissions_tenant_id", tenantId.getId()); | |
215 | + return "e.id=:permissions_tenant_id"; | |
212 | 216 | } else if (entityType == EntityType.CUSTOMER) { |
213 | - return String.format("e.tenant_id='%s' and e.id='%s'", UUIDConverter.fromTimeUUID(tenantId.getId()), UUIDConverter.fromTimeUUID(customerId.getId())); | |
217 | + ctx.addUuidParameter("permissions_tenant_id", tenantId.getId()); | |
218 | + ctx.addUuidParameter("permissions_customer_id", customerId.getId()); | |
219 | + return "e.tenant_id=:permissions_tenant_id and e.id=:permissions_customer_id"; | |
214 | 220 | } else { |
215 | - return String.format("e.tenant_id='%s' and e.customer_id='%s'", UUIDConverter.fromTimeUUID(tenantId.getId()), UUIDConverter.fromTimeUUID(customerId.getId())); | |
221 | + ctx.addUuidParameter("permissions_tenant_id", tenantId.getId()); | |
222 | + ctx.addUuidParameter("permissions_customer_id", customerId.getId()); | |
223 | + return "e.tenant_id=:permissions_tenant_id and e.customer_id=:permissions_customer_id"; | |
216 | 224 | } |
217 | 225 | } |
218 | 226 | } |
219 | 227 | |
220 | - private String buildEntityFilterQuery(EntityFilter entityFilter) { | |
228 | + private String buildEntityFilterQuery(EntityQueryContext ctx, EntityFilter entityFilter) { | |
221 | 229 | switch (entityFilter.getType()) { |
222 | 230 | case SINGLE_ENTITY: |
223 | - return this.singleEntityQuery((SingleEntityFilter) entityFilter); | |
231 | + return this.singleEntityQuery(ctx, (SingleEntityFilter) entityFilter); | |
224 | 232 | case ENTITY_LIST: |
225 | - return this.entityListQuery((EntityListFilter) entityFilter); | |
233 | + return this.entityListQuery(ctx, (EntityListFilter) entityFilter); | |
226 | 234 | case ENTITY_NAME: |
227 | - return this.entityNameQuery((EntityNameFilter) entityFilter); | |
235 | + return this.entityNameQuery(ctx, (EntityNameFilter) entityFilter); | |
228 | 236 | case ASSET_TYPE: |
229 | 237 | case DEVICE_TYPE: |
230 | 238 | case ENTITY_VIEW_TYPE: |
231 | - return this.typeQuery(entityFilter); | |
239 | + return this.typeQuery(ctx, entityFilter); | |
232 | 240 | case RELATIONS_QUERY: |
233 | 241 | case DEVICE_SEARCH_QUERY: |
234 | 242 | case ASSET_SEARCH_QUERY: |
... | ... | @@ -238,52 +246,60 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
238 | 246 | } |
239 | 247 | } |
240 | 248 | |
241 | - private String getEntityTableQuery(EntityFilter entityFilter, EntityType entityType) { | |
249 | + private String addEntityTableQuery(EntityQueryContext ctx, EntityFilter entityFilter, EntityType entityType) { | |
242 | 250 | switch (entityFilter.getType()) { |
243 | 251 | case RELATIONS_QUERY: |
244 | - return relationQuery((RelationsQueryFilter) entityFilter); | |
252 | + return relationQuery(ctx, (RelationsQueryFilter) entityFilter); | |
245 | 253 | case DEVICE_SEARCH_QUERY: |
246 | 254 | DeviceSearchQueryFilter deviceQuery = (DeviceSearchQueryFilter) entityFilter; |
247 | - return entitySearchQuery(deviceQuery, EntityType.DEVICE, deviceQuery.getDeviceTypes()); | |
255 | + return entitySearchQuery(ctx, deviceQuery, EntityType.DEVICE, deviceQuery.getDeviceTypes()); | |
248 | 256 | case ASSET_SEARCH_QUERY: |
249 | 257 | AssetSearchQueryFilter assetQuery = (AssetSearchQueryFilter) entityFilter; |
250 | - return entitySearchQuery(assetQuery, EntityType.ASSET, assetQuery.getAssetTypes()); | |
258 | + return entitySearchQuery(ctx, assetQuery, EntityType.ASSET, assetQuery.getAssetTypes()); | |
251 | 259 | default: |
252 | 260 | return entityTableMap.get(entityType); |
253 | 261 | } |
254 | 262 | } |
255 | 263 | |
256 | - private String entitySearchQuery(EntitySearchQueryFilter entityFilter, EntityType entityType, List<String> types) { | |
264 | + private String entitySearchQuery(EntityQueryContext ctx, EntitySearchQueryFilter entityFilter, EntityType entityType, List<String> types) { | |
257 | 265 | EntityId rootId = entityFilter.getRootEntity(); |
258 | 266 | //TODO: fetch last level only. |
267 | + //TODO: fetch distinct records. | |
259 | 268 | String lvlFilter = getLvlFilter(entityFilter.getMaxLevel()); |
260 | 269 | String selectFields = "SELECT tenant_id, customer_id, id, type, name, label FROM " + entityType.name() + " WHERE id in ( SELECT entity_id"; |
261 | 270 | String from = getQueryTemplate(entityFilter.getDirection()); |
271 | + String whereFilter = " WHERE re.relation_type = :where_relation_type AND re.to_type = :where_entity_type"; | |
262 | 272 | |
263 | - String whereFilter = " WHERE " + " re.relation_type = '" + entityFilter.getRelationType() + "'" + | |
264 | - " AND re.to_type = '" + entityType.name() + "'"; | |
265 | - from = String.format(from, UUIDConverter.fromTimeUUID(rootId.getId()), rootId.getEntityType().name(), lvlFilter, whereFilter); | |
273 | + from = String.format(from, lvlFilter, whereFilter); | |
266 | 274 | String query = "( " + selectFields + from + ")"; |
267 | 275 | if (types != null && !types.isEmpty()) { |
268 | - query += " and type in (" + types.stream().map(type -> "'" + type + "'").collect(Collectors.joining(", ")) + ")"; | |
276 | + query += " and type in (:relation_sub_types)"; | |
277 | + ctx.addStringListParameter("relation_sub_types", types); | |
269 | 278 | } |
270 | 279 | query += " )"; |
280 | + ctx.addUuidParameter("relation_root_id", rootId.getId()); | |
281 | + ctx.addStringParameter("relation_root_type", rootId.getEntityType().name()); | |
282 | + ctx.addStringParameter("where_relation_type", entityFilter.getRelationType()); | |
283 | + ctx.addStringParameter("where_entity_type", entityType.name()); | |
271 | 284 | return query; |
272 | 285 | } |
273 | 286 | |
274 | - private String relationQuery(RelationsQueryFilter entityFilter) { | |
287 | + private String relationQuery(EntityQueryContext ctx, RelationsQueryFilter entityFilter) { | |
275 | 288 | EntityId rootId = entityFilter.getRootEntity(); |
276 | 289 | String lvlFilter = getLvlFilter(entityFilter.getMaxLevel()); |
277 | 290 | String selectFields = getSelectTenantId() + ", " + getSelectCustomerId() + ", " + |
278 | 291 | " entity.entity_id as id," + getSelectType() + ", " + getSelectName() + ", " + |
279 | 292 | getSelectLabel() + ", entity.entity_type as entity_type"; |
280 | 293 | String from = getQueryTemplate(entityFilter.getDirection()); |
294 | + ctx.addUuidParameter("relation_root_id", rootId.getId()); | |
295 | + ctx.addStringParameter("relation_root_type", rootId.getEntityType().name()); | |
281 | 296 | |
282 | 297 | StringBuilder whereFilter; |
283 | 298 | if (entityFilter.getFilters() != null && !entityFilter.getFilters().isEmpty()) { |
284 | 299 | whereFilter = new StringBuilder(" WHERE "); |
285 | 300 | boolean first = true; |
286 | 301 | boolean single = entityFilter.getFilters().size() == 1; |
302 | + int entityTypeFilterIdx = 0; | |
287 | 303 | for (EntityTypeFilter etf : entityFilter.getFilters()) { |
288 | 304 | if (first) { |
289 | 305 | first = false; |
... | ... | @@ -291,21 +307,23 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
291 | 307 | whereFilter.append(" AND "); |
292 | 308 | } |
293 | 309 | String relationType = etf.getRelationType(); |
294 | - String entityTypes = etf.getEntityTypes().stream().map(type -> "'" + type + "'").collect(Collectors.joining(", ")); | |
295 | 310 | if (!single) { |
296 | 311 | whereFilter.append(" ("); |
297 | 312 | } |
298 | - whereFilter.append(" re.relation_type = '").append(relationType).append("' and re.") | |
313 | + whereFilter.append(" re.relation_type = :where_relation_type").append(entityTypeFilterIdx).append(" and re.") | |
299 | 314 | .append(entityFilter.getDirection().equals(EntitySearchDirection.FROM) ? "to" : "from") |
300 | - .append("_type in (").append(entityTypes).append(")"); | |
315 | + .append("_type in (:where_entity_types").append(entityTypeFilterIdx).append(")"); | |
301 | 316 | if (!single) { |
302 | 317 | whereFilter.append(" )"); |
303 | 318 | } |
319 | + ctx.addStringParameter("where_relation_type" + entityTypeFilterIdx, relationType); | |
320 | + ctx.addStringListParameter("where_entity_types" + entityTypeFilterIdx, etf.getEntityTypes().stream().map(EntityType::name).collect(Collectors.toList())); | |
321 | + entityTypeFilterIdx++; | |
304 | 322 | } |
305 | 323 | } else { |
306 | 324 | whereFilter = new StringBuilder(); |
307 | 325 | } |
308 | - from = String.format(from, UUIDConverter.fromTimeUUID(rootId.getId()), rootId.getEntityType().name(), lvlFilter, whereFilter); | |
326 | + from = String.format(from, lvlFilter, whereFilter); | |
309 | 327 | return "( " + selectFields + from + ")"; |
310 | 328 | } |
311 | 329 | |
... | ... | @@ -344,7 +362,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
344 | 362 | private String getSelectCustomerId() { |
345 | 363 | return "CASE" + |
346 | 364 | " WHEN entity.entity_type = 'TENANT'" + |
347 | - " THEN '" + UUIDConverter.fromTimeUUID(TenantId.NULL_UUID) + "'" + | |
365 | + " THEN UUID('" + TenantId.NULL_UUID + "')" + | |
348 | 366 | " WHEN entity.entity_type = 'CUSTOMER' THEN entity_id" + |
349 | 367 | " WHEN entity.entity_type = 'USER'" + |
350 | 368 | " THEN (select customer_id from tb_user where id = entity_id)" + |
... | ... | @@ -411,10 +429,9 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
411 | 429 | " END as label"; |
412 | 430 | } |
413 | 431 | |
414 | - private String buildWhere | |
415 | - (List<EntityKeyMapping> selectionMapping, List<EntityKeyMapping> latestFiltersMapping, String searchText) { | |
416 | - String latestFilters = EntityKeyMapping.buildQuery(latestFiltersMapping); | |
417 | - String textSearchQuery = this.buildTextSearchQuery(selectionMapping, searchText); | |
432 | + private String buildWhere(EntityQueryContext ctx, List<EntityKeyMapping> selectionMapping, List<EntityKeyMapping> latestFiltersMapping, String searchText) { | |
433 | + String latestFilters = EntityKeyMapping.buildQuery(ctx, latestFiltersMapping); | |
434 | + String textSearchQuery = this.buildTextSearchQuery(ctx, selectionMapping, searchText); | |
418 | 435 | String query; |
419 | 436 | if (!StringUtils.isEmpty(latestFilters) && !StringUtils.isEmpty(textSearchQuery)) { |
420 | 437 | query = String.join(" AND ", latestFilters, textSearchQuery); |
... | ... | @@ -430,32 +447,38 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
430 | 447 | } |
431 | 448 | } |
432 | 449 | |
433 | - private String buildTextSearchQuery(List<EntityKeyMapping> selectionMapping, String searchText) { | |
450 | + private String buildTextSearchQuery(EntityQueryContext ctx, List<EntityKeyMapping> selectionMapping, String searchText) { | |
434 | 451 | if (!StringUtils.isEmpty(searchText) && !selectionMapping.isEmpty()) { |
435 | 452 | String lowerSearchText = searchText.toLowerCase() + "%"; |
436 | - List<String> searchPredicates = selectionMapping.stream().map(mapping -> String.format("LOWER(%s) LIKE '%s'", | |
437 | - mapping.getValueAlias(), lowerSearchText)).collect(Collectors.toList()); | |
453 | + List<String> searchPredicates = selectionMapping.stream().map(mapping -> { | |
454 | + String paramName = mapping.getValueAlias() + "_lowerSearchText"; | |
455 | + ctx.addStringParameter(paramName, lowerSearchText); | |
456 | + return String.format("LOWER(%s) LIKE :%s", mapping.getValueAlias(), paramName); | |
457 | + } | |
458 | + ).collect(Collectors.toList()); | |
438 | 459 | return String.format("(%s)", String.join(" or ", searchPredicates)); |
439 | 460 | } else { |
440 | 461 | return null; |
441 | 462 | } |
463 | + | |
442 | 464 | } |
443 | 465 | |
444 | - private String singleEntityQuery(SingleEntityFilter filter) { | |
445 | - return String.format("e.id='%s'", UUIDConverter.fromTimeUUID(filter.getSingleEntity().getId())); | |
466 | + private String singleEntityQuery(EntityQueryContext ctx, SingleEntityFilter filter) { | |
467 | + ctx.addUuidParameter("entity_filter_single_entity_id", filter.getSingleEntity().getId()); | |
468 | + return "e.id=:entity_filter_single_entity_id"; | |
446 | 469 | } |
447 | 470 | |
448 | - private String entityListQuery(EntityListFilter filter) { | |
449 | - return String.format("e.id in (%s)", | |
450 | - filter.getEntityList().stream().map(UUID::fromString).map(UUIDConverter::fromTimeUUID) | |
451 | - .map(s -> String.format("'%s'", s)).collect(Collectors.joining(","))); | |
471 | + private String entityListQuery(EntityQueryContext ctx, EntityListFilter filter) { | |
472 | + ctx.addUuidListParameter("entity_filter_entity_ids", filter.getEntityList().stream().map(UUID::fromString).collect(Collectors.toList())); | |
473 | + return "e.id in (:entity_filter_entity_ids)"; | |
452 | 474 | } |
453 | 475 | |
454 | - private String entityNameQuery(EntityNameFilter filter) { | |
455 | - return String.format("lower(e.search_text) like lower(concat('%s', '%%'))", filter.getEntityNameFilter()); | |
476 | + private String entityNameQuery(EntityQueryContext ctx, EntityNameFilter filter) { | |
477 | + ctx.addStringParameter("entity_filter_name_filter", filter.getEntityNameFilter()); | |
478 | + return "lower(e.search_text) like lower(concat(:entity_filter_name_filter, '%%'))"; | |
456 | 479 | } |
457 | 480 | |
458 | - private String typeQuery(EntityFilter filter) { | |
481 | + private String typeQuery(EntityQueryContext ctx, EntityFilter filter) { | |
459 | 482 | String type; |
460 | 483 | String name; |
461 | 484 | switch (filter.getType()) { |
... | ... | @@ -474,7 +497,9 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { |
474 | 497 | default: |
475 | 498 | throw new RuntimeException("Not supported!"); |
476 | 499 | } |
477 | - return String.format("e.type = '%s' and lower(e.search_text) like lower(concat('%s', '%%'))", type, name); | |
500 | + ctx.addStringParameter("entity_filter_type_query_type", type); | |
501 | + ctx.addStringParameter("entity_filter_type_query_name", name); | |
502 | + return "e.type = :entity_filter_type_query_type and lower(e.search_text) like lower(concat(:entity_filter_type_query_name, '%%'))"; | |
478 | 503 | } |
479 | 504 | |
480 | 505 | private EntityType resolveEntityType(EntityFilter entityFilter) { | ... | ... |
... | ... | @@ -26,39 +26,41 @@ import org.thingsboard.server.common.data.query.EntityKey; |
26 | 26 | import org.thingsboard.server.common.data.query.EntityKeyType; |
27 | 27 | import org.thingsboard.server.common.data.query.TsValue; |
28 | 28 | |
29 | +import java.nio.ByteBuffer; | |
29 | 30 | import java.util.HashMap; |
30 | 31 | import java.util.List; |
31 | 32 | import java.util.Map; |
33 | +import java.util.UUID; | |
32 | 34 | import java.util.stream.Collectors; |
33 | 35 | |
34 | 36 | public class EntityDataAdapter { |
35 | 37 | |
36 | 38 | public static PageData<EntityData> createEntityData(EntityDataPageLink pageLink, |
37 | 39 | List<EntityKeyMapping> selectionMapping, |
38 | - List<Object[]> rows, | |
40 | + List<Map<String, Object>> rows, | |
39 | 41 | int totalElements) { |
40 | - int totalPages = pageLink.getPageSize() > 0 ? (int)Math.ceil((float)totalElements / pageLink.getPageSize()) : 1; | |
42 | + int totalPages = pageLink.getPageSize() > 0 ? (int) Math.ceil((float) totalElements / pageLink.getPageSize()) : 1; | |
41 | 43 | int startIndex = pageLink.getPageSize() * pageLink.getPage(); |
42 | 44 | boolean hasNext = pageLink.getPageSize() > 0 && totalElements > startIndex + rows.size(); |
43 | 45 | List<EntityData> entitiesData = convertListToEntityData(rows, selectionMapping); |
44 | 46 | return new PageData<>(entitiesData, totalPages, totalElements, hasNext); |
45 | 47 | } |
46 | 48 | |
47 | - private static List<EntityData> convertListToEntityData(List<Object[]> result, List<EntityKeyMapping> selectionMapping) { | |
49 | + private static List<EntityData> convertListToEntityData(List<Map<String, Object>> result, List<EntityKeyMapping> selectionMapping) { | |
48 | 50 | return result.stream().map(row -> toEntityData(row, selectionMapping)).collect(Collectors.toList()); |
49 | 51 | } |
50 | 52 | |
51 | - private static EntityData toEntityData(Object[] row, List<EntityKeyMapping> selectionMapping) { | |
52 | - String id = (String)row[0]; | |
53 | - EntityType entityType = EntityType.valueOf((String)row[1]); | |
54 | - EntityId entityId = EntityIdFactory.getByTypeAndUuid(entityType, UUIDConverter.fromString(id)); | |
53 | + private static EntityData toEntityData(Map<String, Object> row, List<EntityKeyMapping> selectionMapping) { | |
54 | + UUID id = (UUID)row.get("id"); | |
55 | + EntityType entityType = EntityType.valueOf((String) row.get("entity_type")); | |
56 | + EntityId entityId = EntityIdFactory.getByTypeAndUuid(entityType, id); | |
55 | 57 | Map<EntityKeyType, Map<String, TsValue>> latest = new HashMap<>(); |
56 | 58 | Map<String, TsValue[]> timeseries = new HashMap<>(); |
57 | 59 | EntityData entityData = new EntityData(entityId, latest, timeseries); |
58 | - for (EntityKeyMapping mapping: selectionMapping) { | |
60 | + for (EntityKeyMapping mapping : selectionMapping) { | |
59 | 61 | if (!mapping.isIgnore()) { |
60 | 62 | EntityKey entityKey = mapping.getEntityKey(); |
61 | - Object value = row[mapping.getIndex()]; | |
63 | + Object value = row.get(mapping.getValueAlias()); | |
62 | 64 | String strValue; |
63 | 65 | long ts; |
64 | 66 | if (entityKey.getType().equals(EntityKeyType.ENTITY_FIELD)) { |
... | ... | @@ -66,7 +68,7 @@ public class EntityDataAdapter { |
66 | 68 | ts = System.currentTimeMillis(); |
67 | 69 | } else { |
68 | 70 | strValue = convertValue(value); |
69 | - Object tsObject = row[mapping.getIndex() + 1]; | |
71 | + Object tsObject = row.get(mapping.getTsAlias()); | |
70 | 72 | ts = tsObject != null ? Long.parseLong(tsObject.toString()) : 0; |
71 | 73 | } |
72 | 74 | TsValue tsValue = new TsValue(ts, strValue); | ... | ... |
... | ... | @@ -73,6 +73,7 @@ public class EntityKeyMapping { |
73 | 73 | private boolean ignore = false; |
74 | 74 | private List<KeyFilter> keyFilters; |
75 | 75 | private EntityKey entityKey; |
76 | + private int paramIdx = 0; | |
76 | 77 | |
77 | 78 | public boolean hasFilter() { |
78 | 79 | return keyFilters != null && !keyFilters.isEmpty(); |
... | ... | @@ -95,23 +96,23 @@ public class EntityKeyMapping { |
95 | 96 | String column = entityFieldColumnMap.get(entityKey.getKey()); |
96 | 97 | return String.format("e.%s as %s", column, getValueAlias()); |
97 | 98 | } else if (entityKey.getType().equals(EntityKeyType.TIME_SERIES)) { |
98 | - return buildTimeseriesSelection(); | |
99 | + return buildTimeSeriesSelection(); | |
99 | 100 | } else { |
100 | 101 | return buildAttributeSelection(); |
101 | 102 | } |
102 | 103 | } |
103 | 104 | |
104 | - public Stream<String> toQueries() { | |
105 | + public Stream<String> toQueries(EntityQueryContext ctx) { | |
105 | 106 | if (hasFilter()) { |
106 | 107 | String keyAlias = entityKey.getType().equals(EntityKeyType.ENTITY_FIELD) ? "e" : alias; |
107 | 108 | return keyFilters.stream().map(keyFilter -> |
108 | - this.buildKeyQuery(keyAlias, keyFilter)); | |
109 | + this.buildKeyQuery(ctx, keyAlias, keyFilter)); | |
109 | 110 | } else { |
110 | 111 | return null; |
111 | 112 | } |
112 | 113 | } |
113 | 114 | |
114 | - public String toLatestJoin(EntityFilter entityFilter, EntityType entityType) { | |
115 | + public String toLatestJoin(EntityQueryContext ctx, EntityFilter entityFilter, EntityType entityType) { | |
115 | 116 | String entityTypeStr; |
116 | 117 | if (entityFilter.getType().equals(EntityFilterType.RELATIONS_QUERY)) { |
117 | 118 | entityTypeStr = "entities.entity_type"; |
... | ... | @@ -119,12 +120,13 @@ public class EntityKeyMapping { |
119 | 120 | entityTypeStr = "'" + entityType.name() + "'"; |
120 | 121 | } |
121 | 122 | String join = hasFilter() ? "left join" : "left outer join"; |
123 | + ctx.addStringParameter(alias + "_key_id", entityKey.getKey()); | |
122 | 124 | if (entityKey.getType().equals(EntityKeyType.TIME_SERIES)) { |
123 | - // TODO: | |
124 | - throw new RuntimeException("Not implemented!"); | |
125 | + return String.format("%s ts_kv_latest %s ON %s.entity_id=to_uuid(entities.id) AND %s.key = (select key_id from ts_kv_dictionary where key = :%s_key_id)", | |
126 | + join, alias, alias, alias, alias); | |
125 | 127 | } else { |
126 | - String query = String.format("%s attribute_kv %s ON %s.entity_id=entities.id AND %s.entity_type=%s AND %s.attribute_key='%s'", | |
127 | - join, alias, alias, alias, entityTypeStr, alias, entityKey.getKey()); | |
128 | + String query = String.format("%s attribute_kv %s ON %s.entity_id=entities.id AND %s.entity_type=%s AND %s.attribute_key=:%s_key_id", | |
129 | + join, alias, alias, alias, entityTypeStr, alias, alias); | |
128 | 130 | if (!entityKey.getType().equals(EntityKeyType.ATTRIBUTE)) { |
129 | 131 | String scope; |
130 | 132 | if (entityKey.getType().equals(EntityKeyType.CLIENT_ATTRIBUTE)) { |
... | ... | @@ -145,13 +147,13 @@ public class EntityKeyMapping { |
145 | 147 | Collectors.joining(", ")); |
146 | 148 | } |
147 | 149 | |
148 | - public static String buildLatestJoins(EntityFilter entityFilter, EntityType entityType, List<EntityKeyMapping> latestMappings) { | |
149 | - return latestMappings.stream().map(mapping -> mapping.toLatestJoin(entityFilter, entityType)).collect( | |
150 | + public static String buildLatestJoins(EntityQueryContext ctx, EntityFilter entityFilter, EntityType entityType, List<EntityKeyMapping> latestMappings) { | |
151 | + return latestMappings.stream().map(mapping -> mapping.toLatestJoin(ctx, entityFilter, entityType)).collect( | |
150 | 152 | Collectors.joining(" ")); |
151 | 153 | } |
152 | 154 | |
153 | - public static String buildQuery(List<EntityKeyMapping> mappings) { | |
154 | - return mappings.stream().flatMap(EntityKeyMapping::toQueries).collect( | |
155 | + public static String buildQuery(EntityQueryContext ctx, List<EntityKeyMapping> mappings) { | |
156 | + return mappings.stream().flatMap(mapping -> mapping.toQueries(ctx)).collect( | |
155 | 157 | Collectors.joining(" AND ")); |
156 | 158 | } |
157 | 159 | |
... | ... | @@ -250,40 +252,46 @@ public class EntityKeyMapping { |
250 | 252 | return String.join(", ", attrValSelection, attrTsSelection); |
251 | 253 | } |
252 | 254 | |
253 | - private String buildTimeseriesSelection() { | |
254 | - // TODO: | |
255 | + private String buildTimeSeriesSelection() { | |
255 | 256 | String attrValAlias = getValueAlias(); |
256 | 257 | String attrTsAlias = getTsAlias(); |
257 | - return String.format("(select '') as %s, (select 1) as %s", attrValAlias, attrTsAlias); | |
258 | + String attrValSelection = | |
259 | + String.format("(coalesce(cast(%s.bool_v as varchar), '') || " + | |
260 | + "coalesce(%s.str_v, '') || " + | |
261 | + "coalesce(cast(%s.long_v as varchar), '') || " + | |
262 | + "coalesce(cast(%s.dbl_v as varchar), '') || " + | |
263 | + "coalesce(cast(%s.json_v as varchar), '')) as %s", alias, alias, alias, alias, alias, attrValAlias); | |
264 | + String attrTsSelection = String.format("%s.ts as %s", alias, attrTsAlias); | |
265 | + return String.join(", ", attrValSelection, attrTsSelection); | |
258 | 266 | } |
259 | 267 | |
260 | - private String buildKeyQuery(String alias, KeyFilter keyFilter) { | |
261 | - return this.buildPredicateQuery(alias, keyFilter.getKey(), keyFilter.getPredicate()); | |
268 | + private String buildKeyQuery(EntityQueryContext ctx, String alias, KeyFilter keyFilter) { | |
269 | + return this.buildPredicateQuery(ctx, alias, keyFilter.getKey(), keyFilter.getPredicate()); | |
262 | 270 | } |
263 | 271 | |
264 | - private String buildPredicateQuery(String alias, EntityKey key, KeyFilterPredicate predicate) { | |
272 | + private String buildPredicateQuery(EntityQueryContext ctx, String alias, EntityKey key, KeyFilterPredicate predicate) { | |
265 | 273 | if (predicate.getType().equals(FilterPredicateType.COMPLEX)) { |
266 | - return this.buildComplexPredicateQuery(alias, key, (ComplexFilterPredicate) predicate); | |
274 | + return this.buildComplexPredicateQuery(ctx, alias, key, (ComplexFilterPredicate) predicate); | |
267 | 275 | } else { |
268 | - return this.buildSimplePredicateQuery(alias, key, predicate); | |
276 | + return this.buildSimplePredicateQuery(ctx, alias, key, predicate); | |
269 | 277 | } |
270 | 278 | } |
271 | 279 | |
272 | - private String buildComplexPredicateQuery(String alias, EntityKey key, ComplexFilterPredicate predicate) { | |
280 | + private String buildComplexPredicateQuery(EntityQueryContext ctx, String alias, EntityKey key, ComplexFilterPredicate predicate) { | |
273 | 281 | return predicate.getPredicates().stream() |
274 | - .map(keyFilterPredicate -> this.buildPredicateQuery(alias, key, keyFilterPredicate)).collect(Collectors.joining( | |
282 | + .map(keyFilterPredicate -> this.buildPredicateQuery(ctx, alias, key, keyFilterPredicate)).collect(Collectors.joining( | |
275 | 283 | " " + predicate.getOperation().name() + " " |
276 | 284 | )); |
277 | 285 | } |
278 | 286 | |
279 | - private String buildSimplePredicateQuery(String alias, EntityKey key, KeyFilterPredicate predicate) { | |
287 | + private String buildSimplePredicateQuery(EntityQueryContext ctx, String alias, EntityKey key, KeyFilterPredicate predicate) { | |
280 | 288 | if (predicate.getType().equals(FilterPredicateType.NUMERIC)) { |
281 | 289 | if (key.getType().equals(EntityKeyType.ENTITY_FIELD)) { |
282 | 290 | String column = entityFieldColumnMap.get(key.getKey()); |
283 | - return this.buildNumericPredicateQuery(alias + "." + column, (NumericFilterPredicate) predicate); | |
291 | + return this.buildNumericPredicateQuery(ctx, alias + "." + column, (NumericFilterPredicate) predicate); | |
284 | 292 | } else { |
285 | - String longQuery = this.buildNumericPredicateQuery(alias + ".long_v", (NumericFilterPredicate) predicate); | |
286 | - String doubleQuery = this.buildNumericPredicateQuery(alias + ".dbl_v", (NumericFilterPredicate) predicate); | |
293 | + String longQuery = this.buildNumericPredicateQuery(ctx, alias + ".long_v", (NumericFilterPredicate) predicate); | |
294 | + String doubleQuery = this.buildNumericPredicateQuery(ctx, alias + ".dbl_v", (NumericFilterPredicate) predicate); | |
287 | 295 | return String.format("(%s or %s)", longQuery, doubleQuery); |
288 | 296 | } |
289 | 297 | } else { |
... | ... | @@ -295,15 +303,16 @@ public class EntityKeyMapping { |
295 | 303 | } |
296 | 304 | String field = alias + "." + column; |
297 | 305 | if (predicate.getType().equals(FilterPredicateType.STRING)) { |
298 | - return this.buildStringPredicateQuery(field, (StringFilterPredicate) predicate); | |
306 | + return this.buildStringPredicateQuery(ctx, field, (StringFilterPredicate) predicate); | |
299 | 307 | } else { |
300 | - return this.buildBooleanPredicateQuery(field, (BooleanFilterPredicate) predicate); | |
308 | + return this.buildBooleanPredicateQuery(ctx, field, (BooleanFilterPredicate) predicate); | |
301 | 309 | } |
302 | 310 | } |
303 | 311 | } |
304 | 312 | |
305 | - private String buildStringPredicateQuery(String field, StringFilterPredicate stringFilterPredicate) { | |
313 | + private String buildStringPredicateQuery(EntityQueryContext ctx, String field, StringFilterPredicate stringFilterPredicate) { | |
306 | 314 | String operationField = field; |
315 | + String paramName = getNextParameterName(field); | |
307 | 316 | String value = stringFilterPredicate.getValue(); |
308 | 317 | String stringOperationQuery = ""; |
309 | 318 | if (stringFilterPredicate.isIgnoreCase()) { |
... | ... | @@ -312,65 +321,77 @@ public class EntityKeyMapping { |
312 | 321 | } |
313 | 322 | switch (stringFilterPredicate.getOperation()) { |
314 | 323 | case EQUAL: |
315 | - stringOperationQuery = String.format("%s = '%s'", operationField, value); | |
324 | + stringOperationQuery = String.format("%s = :%s", operationField, paramName); | |
316 | 325 | break; |
317 | 326 | case NOT_EQUAL: |
318 | - stringOperationQuery = String.format("%s != '%s'", operationField, value); | |
327 | + stringOperationQuery = String.format("%s != :%s", operationField, paramName); | |
319 | 328 | break; |
320 | 329 | case STARTS_WITH: |
321 | - stringOperationQuery = String.format("%s like '%s%%'", operationField, value); | |
330 | + value += "%"; | |
331 | + stringOperationQuery = String.format("%s like :%s", operationField, paramName); | |
322 | 332 | break; |
323 | 333 | case ENDS_WITH: |
324 | - stringOperationQuery = String.format("%s like '%%%s'", operationField, value); | |
334 | + value = "%" + value; | |
335 | + stringOperationQuery = String.format("%s like :%s", operationField, paramName); | |
325 | 336 | break; |
326 | 337 | case CONTAINS: |
327 | - stringOperationQuery = String.format("%s like '%%%s%%'", operationField, value); | |
338 | + value = "%" + value + "%"; | |
339 | + stringOperationQuery = String.format("%s like :%s", operationField, paramName); | |
328 | 340 | break; |
329 | 341 | case NOT_CONTAINS: |
330 | - stringOperationQuery = String.format("%s not like '%%%s%%'", operationField, value); | |
342 | + value = "%" + value + "%"; | |
343 | + stringOperationQuery = String.format("%s not like :%s", operationField, paramName); | |
331 | 344 | break; |
332 | 345 | } |
346 | + ctx.addStringParameter(paramName, value); | |
333 | 347 | return String.format("(%s is not null and %s)", field, stringOperationQuery); |
334 | 348 | } |
335 | 349 | |
336 | - private String buildNumericPredicateQuery(String field, NumericFilterPredicate numericFilterPredicate) { | |
337 | - double value = numericFilterPredicate.getValue(); | |
350 | + private String buildNumericPredicateQuery(EntityQueryContext ctx, String field, NumericFilterPredicate numericFilterPredicate) { | |
351 | + String paramName = getNextParameterName(field); | |
352 | + ctx.addDoubleParameter(paramName, numericFilterPredicate.getValue()); | |
338 | 353 | String numericOperationQuery = ""; |
339 | 354 | switch (numericFilterPredicate.getOperation()) { |
340 | 355 | case EQUAL: |
341 | - numericOperationQuery = String.format("%s = %s", field, value); | |
356 | + numericOperationQuery = String.format("%s = :%s", field, paramName); | |
342 | 357 | break; |
343 | 358 | case NOT_EQUAL: |
344 | - numericOperationQuery = String.format("%s != '%s'", field, value); | |
359 | + numericOperationQuery = String.format("%s != :%s", field, paramName); | |
345 | 360 | break; |
346 | 361 | case GREATER: |
347 | - numericOperationQuery = String.format("%s > %s", field, value); | |
362 | + numericOperationQuery = String.format("%s > :%s", field, paramName); | |
348 | 363 | break; |
349 | 364 | case GREATER_OR_EQUAL: |
350 | - numericOperationQuery = String.format("%s >= %s", field, value); | |
365 | + numericOperationQuery = String.format("%s >= :%s", field, paramName); | |
351 | 366 | break; |
352 | 367 | case LESS: |
353 | - numericOperationQuery = String.format("%s < %s", field, value); | |
368 | + numericOperationQuery = String.format("%s < :%s", field, paramName); | |
354 | 369 | break; |
355 | 370 | case LESS_OR_EQUAL: |
356 | - numericOperationQuery = String.format("%s <= %s", field, value); | |
371 | + numericOperationQuery = String.format("%s <= :%s", field, paramName); | |
357 | 372 | break; |
358 | 373 | } |
359 | 374 | return String.format("(%s is not null and %s)", field, numericOperationQuery); |
360 | 375 | } |
361 | 376 | |
362 | - private String buildBooleanPredicateQuery(String field, | |
377 | + private String buildBooleanPredicateQuery(EntityQueryContext ctx, String field, | |
363 | 378 | BooleanFilterPredicate booleanFilterPredicate) { |
364 | - boolean value = booleanFilterPredicate.isValue(); | |
379 | + String paramName = getNextParameterName(field); | |
380 | + ctx.addBooleanParameter(paramName, booleanFilterPredicate.isValue()); | |
365 | 381 | String booleanOperationQuery = ""; |
366 | 382 | switch (booleanFilterPredicate.getOperation()) { |
367 | 383 | case EQUAL: |
368 | - booleanOperationQuery = String.format("%s = %s", field, value); | |
384 | + booleanOperationQuery = String.format("%s = :%s", field, paramName); | |
369 | 385 | break; |
370 | 386 | case NOT_EQUAL: |
371 | - booleanOperationQuery = String.format("%s != %s", field, value); | |
387 | + booleanOperationQuery = String.format("%s != :%s", field, paramName); | |
372 | 388 | break; |
373 | 389 | } |
374 | 390 | return String.format("(%s is not null and %s)", field, booleanOperationQuery); |
375 | 391 | } |
392 | + | |
393 | + private String getNextParameterName(String field) { | |
394 | + paramIdx++; | |
395 | + return field.replace(".", "_") + "_" + paramIdx; | |
396 | + } | |
376 | 397 | } | ... | ... |
1 | +/** | |
2 | + * Copyright © 2016-2020 The Thingsboard Authors | |
3 | + * | |
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | + * you may not use this file except in compliance with the License. | |
6 | + * You may obtain a copy of the License at | |
7 | + * | |
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | |
9 | + * | |
10 | + * Unless required by applicable law or agreed to in writing, software | |
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | + * See the License for the specific language governing permissions and | |
14 | + * limitations under the License. | |
15 | + */ | |
16 | +package org.thingsboard.server.dao.sql.query; | |
17 | + | |
18 | +import org.hibernate.type.PostgresUUIDType; | |
19 | +import org.springframework.jdbc.core.namedparam.SqlParameterSource; | |
20 | + | |
21 | +import java.sql.Types; | |
22 | +import java.util.HashMap; | |
23 | +import java.util.List; | |
24 | +import java.util.Map; | |
25 | +import java.util.UUID; | |
26 | + | |
27 | +public class EntityQueryContext implements SqlParameterSource { | |
28 | + private static final PostgresUUIDType UUID_TYPE = new PostgresUUIDType(); | |
29 | + | |
30 | + private final StringBuilder query; | |
31 | + private final Map<String, Parameter> params; | |
32 | + | |
33 | + public EntityQueryContext() { | |
34 | + query = new StringBuilder(); | |
35 | + params = new HashMap<>(); | |
36 | + } | |
37 | + | |
38 | + void addParameter(String name, Object value, int type, String typeName) { | |
39 | + Parameter existing = params.put(name, new Parameter(value, type, typeName)); | |
40 | + if (existing != null) { | |
41 | + throw new RuntimeException("Parameter with name: " + name + " was already registered!"); | |
42 | + } | |
43 | + } | |
44 | + | |
45 | + public void append(String s) { | |
46 | + query.append(s); | |
47 | + } | |
48 | + | |
49 | + @Override | |
50 | + public boolean hasValue(String paramName) { | |
51 | + return params.containsKey(paramName); | |
52 | + } | |
53 | + | |
54 | + @Override | |
55 | + public Object getValue(String paramName) throws IllegalArgumentException { | |
56 | + return checkParameter(paramName).value; | |
57 | + } | |
58 | + | |
59 | + @Override | |
60 | + public int getSqlType(String paramName) { | |
61 | + return checkParameter(paramName).type; | |
62 | + } | |
63 | + | |
64 | + private Parameter checkParameter(String paramName) { | |
65 | + Parameter param = params.get(paramName); | |
66 | + if (param == null) { | |
67 | + throw new RuntimeException("Parameter with name: " + paramName + " is not set!"); | |
68 | + } | |
69 | + return param; | |
70 | + } | |
71 | + | |
72 | + @Override | |
73 | + public String getTypeName(String paramName) { | |
74 | + return params.get(paramName).name; | |
75 | + } | |
76 | + | |
77 | + @Override | |
78 | + public String[] getParameterNames() { | |
79 | + return params.keySet().toArray(new String[]{}); | |
80 | + } | |
81 | + | |
82 | + public void addUuidParameter(String name, UUID value) { | |
83 | + addParameter(name, value, UUID_TYPE.sqlType(), UUID_TYPE.getName()); | |
84 | + } | |
85 | + | |
86 | + public void addStringParameter(String name, String value) { | |
87 | + addParameter(name, value, Types.VARCHAR, "VARCHAR"); | |
88 | + } | |
89 | + | |
90 | + public void addDoubleParameter(String name, double value) { | |
91 | + addParameter(name, value, Types.DOUBLE, "DOUBLE"); | |
92 | + } | |
93 | + | |
94 | + public void addStringListParameter(String name, List<String> value) { | |
95 | + addParameter(name, value, Types.VARCHAR, "VARCHAR"); | |
96 | + } | |
97 | + | |
98 | + public void addBooleanParameter(String name, boolean value) { | |
99 | + addParameter(name, value, Types.BOOLEAN, "BOOLEAN"); | |
100 | + } | |
101 | + | |
102 | + public void addUuidListParameter(String name, List<UUID> value) { | |
103 | + addParameter(name, value, UUID_TYPE.sqlType(), UUID_TYPE.getName()); | |
104 | + } | |
105 | + | |
106 | + public String getQuery() { | |
107 | + return query.toString(); | |
108 | + } | |
109 | + | |
110 | + | |
111 | + public static class Parameter { | |
112 | + private final Object value; | |
113 | + private final int type; | |
114 | + private final String name; | |
115 | + | |
116 | + public Parameter(Object value, int type, String name) { | |
117 | + this.value = value; | |
118 | + this.type = type; | |
119 | + this.name = name; | |
120 | + } | |
121 | + } | |
122 | +} | ... | ... |
... | ... | @@ -22,6 +22,8 @@ import org.thingsboard.server.dao.model.sql.RelationEntity; |
22 | 22 | import org.thingsboard.server.dao.util.HsqlDao; |
23 | 23 | import org.thingsboard.server.dao.util.SqlDao; |
24 | 24 | |
25 | +import javax.persistence.Query; | |
26 | + | |
25 | 27 | @HsqlDao |
26 | 28 | @SqlDao |
27 | 29 | @Repository |
... | ... | @@ -30,9 +32,25 @@ public class HsqlRelationInsertRepository extends AbstractRelationInsertReposito |
30 | 32 | |
31 | 33 | private static final String INSERT_ON_CONFLICT_DO_UPDATE = "MERGE INTO relation USING (VALUES :fromId, :fromType, :toId, :toType, :relationTypeGroup, :relationType, :additionalInfo) R " + |
32 | 34 | "(from_id, from_type, to_id, to_type, relation_type_group, relation_type, additional_info) " + |
33 | - "ON (relation.from_id = R.from_id AND relation.from_type = R.from_type AND relation.relation_type_group = R.relation_type_group AND relation.relation_type = R.relation_type AND relation.to_id = R.to_id AND relation.to_type = R.to_type) " + | |
35 | + "ON (relation.from_id = UUID(R.from_id) AND relation.from_type = R.from_type AND relation.relation_type_group = R.relation_type_group AND relation.relation_type = R.relation_type AND relation.to_id = UUID(R.to_id) AND relation.to_type = R.to_type) " + | |
34 | 36 | "WHEN MATCHED THEN UPDATE SET relation.additional_info = R.additional_info " + |
35 | - "WHEN NOT MATCHED THEN INSERT (from_id, from_type, to_id, to_type, relation_type_group, relation_type, additional_info) VALUES (R.from_id, R.from_type, R.to_id, R.to_type, R.relation_type_group, R.relation_type, R.additional_info)"; | |
37 | + "WHEN NOT MATCHED THEN INSERT (from_id, from_type, to_id, to_type, relation_type_group, relation_type, additional_info) VALUES (UUID(R.from_id), R.from_type, UUID(R.to_id), R.to_type, R.relation_type_group, R.relation_type, R.additional_info)"; | |
38 | + | |
39 | + protected Query getQuery(RelationEntity entity, String query) { | |
40 | + Query nativeQuery = entityManager.createNativeQuery(query, RelationEntity.class); | |
41 | + if (entity.getAdditionalInfo() == null) { | |
42 | + nativeQuery.setParameter("additionalInfo", null); | |
43 | + } else { | |
44 | + nativeQuery.setParameter("additionalInfo", entity.getAdditionalInfo().toString()); | |
45 | + } | |
46 | + return nativeQuery | |
47 | + .setParameter("fromId", entity.getFromId().toString()) | |
48 | + .setParameter("fromType", entity.getFromType()) | |
49 | + .setParameter("toId", entity.getToId().toString()) | |
50 | + .setParameter("toType", entity.getToType()) | |
51 | + .setParameter("relationTypeGroup", entity.getRelationTypeGroup()) | |
52 | + .setParameter("relationType", entity.getRelationType()); | |
53 | + } | |
36 | 54 | |
37 | 55 | @Override |
38 | 56 | public RelationEntity saveOrUpdate(RelationEntity entity) { | ... | ... |
... | ... | @@ -44,8 +44,6 @@ import javax.persistence.criteria.Predicate; |
44 | 44 | import java.util.ArrayList; |
45 | 45 | import java.util.List; |
46 | 46 | |
47 | -import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID; | |
48 | - | |
49 | 47 | /** |
50 | 48 | * Created by Valerii Sosliuk on 5/29/2017. |
51 | 49 | */ |
... | ... | @@ -64,7 +62,7 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple |
64 | 62 | public ListenableFuture<List<EntityRelation>> findAllByFrom(TenantId tenantId, EntityId from, RelationTypeGroup typeGroup) { |
65 | 63 | return service.submit(() -> DaoUtil.convertDataList( |
66 | 64 | relationRepository.findAllByFromIdAndFromTypeAndRelationTypeGroup( |
67 | - UUIDConverter.fromTimeUUID(from.getId()), | |
65 | + from.getId(), | |
68 | 66 | from.getEntityType().name(), |
69 | 67 | typeGroup.name()))); |
70 | 68 | } |
... | ... | @@ -73,7 +71,7 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple |
73 | 71 | public ListenableFuture<List<EntityRelation>> findAllByFromAndType(TenantId tenantId, EntityId from, String relationType, RelationTypeGroup typeGroup) { |
74 | 72 | return service.submit(() -> DaoUtil.convertDataList( |
75 | 73 | relationRepository.findAllByFromIdAndFromTypeAndRelationTypeAndRelationTypeGroup( |
76 | - UUIDConverter.fromTimeUUID(from.getId()), | |
74 | + from.getId(), | |
77 | 75 | from.getEntityType().name(), |
78 | 76 | relationType, |
79 | 77 | typeGroup.name()))); |
... | ... | @@ -83,7 +81,7 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple |
83 | 81 | public ListenableFuture<List<EntityRelation>> findAllByTo(TenantId tenantId, EntityId to, RelationTypeGroup typeGroup) { |
84 | 82 | return service.submit(() -> DaoUtil.convertDataList( |
85 | 83 | relationRepository.findAllByToIdAndToTypeAndRelationTypeGroup( |
86 | - UUIDConverter.fromTimeUUID(to.getId()), | |
84 | + to.getId(), | |
87 | 85 | to.getEntityType().name(), |
88 | 86 | typeGroup.name()))); |
89 | 87 | } |
... | ... | @@ -92,7 +90,7 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple |
92 | 90 | public ListenableFuture<List<EntityRelation>> findAllByToAndType(TenantId tenantId, EntityId to, String relationType, RelationTypeGroup typeGroup) { |
93 | 91 | return service.submit(() -> DaoUtil.convertDataList( |
94 | 92 | relationRepository.findAllByToIdAndToTypeAndRelationTypeAndRelationTypeGroup( |
95 | - UUIDConverter.fromTimeUUID(to.getId()), | |
93 | + to.getId(), | |
96 | 94 | to.getEntityType().name(), |
97 | 95 | relationType, |
98 | 96 | typeGroup.name()))); |
... | ... | @@ -111,9 +109,9 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple |
111 | 109 | } |
112 | 110 | |
113 | 111 | private RelationCompositeKey getRelationCompositeKey(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) { |
114 | - return new RelationCompositeKey(fromTimeUUID(from.getId()), | |
112 | + return new RelationCompositeKey(from.getId(), | |
115 | 113 | from.getEntityType().name(), |
116 | - fromTimeUUID(to.getId()), | |
114 | + to.getId(), | |
117 | 115 | to.getEntityType().name(), |
118 | 116 | relationType, |
119 | 117 | typeGroup.name()); |
... | ... | @@ -166,10 +164,10 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple |
166 | 164 | @Override |
167 | 165 | public boolean deleteOutboundRelations(TenantId tenantId, EntityId entity) { |
168 | 166 | boolean relationExistsBeforeDelete = relationRepository |
169 | - .findAllByFromIdAndFromType(UUIDConverter.fromTimeUUID(entity.getId()), entity.getEntityType().name()) | |
167 | + .findAllByFromIdAndFromType(entity.getId(), entity.getEntityType().name()) | |
170 | 168 | .size() > 0; |
171 | 169 | if (relationExistsBeforeDelete) { |
172 | - relationRepository.deleteByFromIdAndFromType(UUIDConverter.fromTimeUUID(entity.getId()), entity.getEntityType().name()); | |
170 | + relationRepository.deleteByFromIdAndFromType(entity.getId(), entity.getEntityType().name()); | |
173 | 171 | } |
174 | 172 | return relationExistsBeforeDelete; |
175 | 173 | } |
... | ... | @@ -179,33 +177,20 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple |
179 | 177 | return service.submit( |
180 | 178 | () -> { |
181 | 179 | boolean relationExistsBeforeDelete = relationRepository |
182 | - .findAllByFromIdAndFromType(UUIDConverter.fromTimeUUID(entity.getId()), entity.getEntityType().name()) | |
180 | + .findAllByFromIdAndFromType(entity.getId(), entity.getEntityType().name()) | |
183 | 181 | .size() > 0; |
184 | 182 | if (relationExistsBeforeDelete) { |
185 | - relationRepository.deleteByFromIdAndFromType(UUIDConverter.fromTimeUUID(entity.getId()), entity.getEntityType().name()); | |
183 | + relationRepository.deleteByFromIdAndFromType(entity.getId(), entity.getEntityType().name()); | |
186 | 184 | } |
187 | 185 | return relationExistsBeforeDelete; |
188 | 186 | }); |
189 | 187 | } |
190 | 188 | |
191 | - @Override | |
192 | - public ListenableFuture<PageData<EntityRelation>> findRelations(TenantId tenantId, EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType childType, TimePageLink pageLink) { | |
193 | - Specification<RelationEntity> timeSearchSpec = JpaAbstractSearchTimeDao.getTimeSearchPageSpec(pageLink, "toId"); | |
194 | - Specification<RelationEntity> fieldsSpec = getEntityFieldsSpec(from, relationType, typeGroup, childType); | |
195 | - Sort.Direction sortDirection = Sort.Direction.DESC; | |
196 | - if (pageLink.getSortOrder() != null) { | |
197 | - sortDirection = pageLink.getSortOrder().getDirection() == SortOrder.Direction.ASC ? Sort.Direction.ASC : Sort.Direction.DESC; | |
198 | - } | |
199 | - Pageable pageable = PageRequest.of(pageLink.getPage(), pageLink.getPageSize(), sortDirection, "toId"); | |
200 | - return service.submit(() -> | |
201 | - DaoUtil.toPageData(relationRepository.findAll(Specification.where(timeSearchSpec).and(fieldsSpec), pageable))); | |
202 | - } | |
203 | - | |
204 | 189 | private Specification<RelationEntity> getEntityFieldsSpec(EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType childType) { |
205 | 190 | return (root, criteriaQuery, criteriaBuilder) -> { |
206 | 191 | List<Predicate> predicates = new ArrayList<>(); |
207 | 192 | if (from != null) { |
208 | - Predicate fromIdPredicate = criteriaBuilder.equal(root.get("fromId"), UUIDConverter.fromTimeUUID(from.getId())); | |
193 | + Predicate fromIdPredicate = criteriaBuilder.equal(root.get("fromId"), from.getId()); | |
209 | 194 | predicates.add(fromIdPredicate); |
210 | 195 | Predicate fromEntityTypePredicate = criteriaBuilder.equal(root.get("fromType"), from.getEntityType().name()); |
211 | 196 | predicates.add(fromEntityTypePredicate); | ... | ... |