Commit fa181db5e3cb44cc592dcf01edc571aec9e3bb70

Authored by Igor Kulikov
2 parents f37ebb66 f09f3e5f

Fix conflicts

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 }
... ...
... ... @@ -24,7 +24,6 @@ import org.thingsboard.server.common.data.id.TenantId;
24 24 import org.thingsboard.server.common.data.page.PageData;
25 25 import org.thingsboard.server.dao.Dao;
26 26
27   -import java.util.List;
28 27 import java.util.UUID;
29 28
30 29 /**
... ...
... ... @@ -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 /**
... ...
... ... @@ -24,7 +24,6 @@ import org.thingsboard.server.common.data.plugin.ComponentScope;
24 24 import org.thingsboard.server.common.data.plugin.ComponentType;
25 25 import org.thingsboard.server.dao.Dao;
26 26
27   -import java.util.List;
28 27 import java.util.Optional;
29 28
30 29 /**
... ...
... ... @@ -21,7 +21,6 @@ import org.thingsboard.server.common.data.page.PageData;
21 21 import org.thingsboard.server.common.data.page.PageLink;
22 22 import org.thingsboard.server.dao.Dao;
23 23
24   -import java.util.List;
25 24 import java.util.Optional;
26 25 import java.util.UUID;
27 26
... ...
... ... @@ -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;
... ...
... ... @@ -23,4 +23,8 @@ public interface BaseEntity<D> extends ToData<D> {
23 23
24 24 void setUuid(UUID id);
25 25
  26 + long getCreatedTime();
  27 +
  28 + void setCreatedTime(long createdTime);
  29 +
26 30 }
... ...
... ... @@ -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 }
... ...
... ... @@ -48,7 +48,6 @@ import java.util.HashMap;
48 48 import java.util.List;
49 49 import java.util.Map;
50 50 import java.util.concurrent.ExecutionException;
51   -import java.util.stream.Collectors;
52 51
53 52 /**
54 53 * Created by igor on 3/12/18.
... ...
... ... @@ -20,7 +20,6 @@ import org.thingsboard.server.common.data.page.PageLink;
20 20 import org.thingsboard.server.common.data.rule.RuleChain;
21 21 import org.thingsboard.server.dao.Dao;
22 22
23   -import java.util.List;
24 23 import java.util.UUID;
25 24
26 25 /**
... ...
... ... @@ -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);
... ...