Commit fa181db5e3cb44cc592dcf01edc571aec9e3bb70

Authored by Igor Kulikov
2 parents f37ebb66 f09f3e5f

Fix conflicts

Showing 130 changed files with 1304 additions and 853 deletions
... ... @@ -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);
... ...
... ... @@ -23,30 +23,31 @@ import org.thingsboard.server.dao.model.sql.RelationEntity;
23 23 import org.thingsboard.server.dao.util.SqlDao;
24 24
25 25 import java.util.List;
  26 +import java.util.UUID;
26 27
27 28 @SqlDao
28 29 public interface RelationRepository
29 30 extends CrudRepository<RelationEntity, RelationCompositeKey>, JpaSpecificationExecutor<RelationEntity> {
30 31
31   - List<RelationEntity> findAllByFromIdAndFromTypeAndRelationTypeGroup(String fromId,
  32 + List<RelationEntity> findAllByFromIdAndFromTypeAndRelationTypeGroup(UUID fromId,
32 33 String fromType,
33 34 String relationTypeGroup);
34 35
35   - List<RelationEntity> findAllByFromIdAndFromTypeAndRelationTypeAndRelationTypeGroup(String fromId,
  36 + List<RelationEntity> findAllByFromIdAndFromTypeAndRelationTypeAndRelationTypeGroup(UUID fromId,
36 37 String fromType,
37 38 String relationType,
38 39 String relationTypeGroup);
39 40
40   - List<RelationEntity> findAllByToIdAndToTypeAndRelationTypeGroup(String toId,
  41 + List<RelationEntity> findAllByToIdAndToTypeAndRelationTypeGroup(UUID toId,
41 42 String toType,
42 43 String relationTypeGroup);
43 44
44   - List<RelationEntity> findAllByToIdAndToTypeAndRelationTypeAndRelationTypeGroup(String toId,
  45 + List<RelationEntity> findAllByToIdAndToTypeAndRelationTypeAndRelationTypeGroup(UUID toId,
45 46 String toType,
46 47 String relationType,
47 48 String relationTypeGroup);
48 49
49   - List<RelationEntity> findAllByFromIdAndFromType(String fromId,
  50 + List<RelationEntity> findAllByFromIdAndFromType(UUID fromId,
50 51 String fromType);
51 52
52 53 @Transactional
... ... @@ -56,5 +57,5 @@ public interface RelationRepository
56 57 void deleteById(RelationCompositeKey id);
57 58
58 59 @Transactional
59   - void deleteByFromIdAndFromType(String fromId, String fromType);
  60 + void deleteByFromIdAndFromType(UUID fromId, String fromType);
60 61 }
... ...
... ... @@ -17,10 +17,8 @@ package org.thingsboard.server.dao.sql.rule;
17 17
18 18 import lombok.extern.slf4j.Slf4j;
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   -import org.thingsboard.server.common.data.UUIDConverter;
24 22 import org.thingsboard.server.common.data.page.PageData;
25 23 import org.thingsboard.server.common.data.page.PageLink;
26 24 import org.thingsboard.server.common.data.rule.RuleChain;
... ... @@ -30,12 +28,9 @@ import org.thingsboard.server.dao.rule.RuleChainDao;
30 28 import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
31 29 import org.thingsboard.server.dao.util.SqlDao;
32 30
33   -import java.util.List;
34 31 import java.util.Objects;
35 32 import java.util.UUID;
36 33
37   -import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID_STR;
38   -
39 34 @Slf4j
40 35 @Component
41 36 @SqlDao
... ... @@ -58,7 +53,7 @@ public class JpaRuleChainDao extends JpaAbstractSearchTextDao<RuleChainEntity, R
58 53 public PageData<RuleChain> findRuleChainsByTenantId(UUID tenantId, PageLink pageLink) {
59 54 return DaoUtil.toPageData(ruleChainRepository
60 55 .findByTenantId(
61   - UUIDConverter.fromTimeUUID(tenantId),
  56 + tenantId,
62 57 Objects.toString(pageLink.getTextSearch(), ""),
63 58 DaoUtil.toPageable(pageLink)));
64 59 }
... ...
... ... @@ -18,20 +18,19 @@ package org.thingsboard.server.dao.sql.rule;
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.RuleChainEntity;
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 @SqlDao
30   -public interface RuleChainRepository extends PagingAndSortingRepository<RuleChainEntity, String> {
  29 +public interface RuleChainRepository extends PagingAndSortingRepository<RuleChainEntity, UUID> {
31 30
32 31 @Query("SELECT rc FROM RuleChainEntity rc WHERE rc.tenantId = :tenantId " +
33 32 "AND LOWER(rc.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
34   - Page<RuleChainEntity> findByTenantId(@Param("tenantId") String tenantId,
  33 + Page<RuleChainEntity> findByTenantId(@Param("tenantId") UUID tenantId,
35 34 @Param("searchText") String searchText,
36 35 Pageable pageable);
37 36
... ...
... ... @@ -18,10 +18,12 @@ package org.thingsboard.server.dao.sql.settings;
18 18 import org.springframework.data.repository.CrudRepository;
19 19 import org.thingsboard.server.dao.model.sql.AdminSettingsEntity;
20 20
  21 +import java.util.UUID;
  22 +
21 23 /**
22 24 * Created by Valerii Sosliuk on 5/6/2017.
23 25 */
24   -public interface AdminSettingsRepository extends CrudRepository<AdminSettingsEntity, String> {
  26 +public interface AdminSettingsRepository extends CrudRepository<AdminSettingsEntity, UUID> {
25 27
26 28 AdminSettingsEntity findByKey(String key);
27 29 }
... ...
... ... @@ -27,6 +27,8 @@ import org.thingsboard.server.dao.settings.AdminSettingsDao;
27 27 import org.thingsboard.server.dao.sql.JpaAbstractDao;
28 28 import org.thingsboard.server.dao.util.SqlDao;
29 29
  30 +import java.util.UUID;
  31 +
30 32 @Component
31 33 @Slf4j
32 34 @SqlDao
... ... @@ -41,7 +43,7 @@ public class JpaAdminSettingsDao extends JpaAbstractDao<AdminSettingsEntity, Adm
41 43 }
42 44
43 45 @Override
44   - protected CrudRepository<AdminSettingsEntity, String> getCrudRepository() {
  46 + protected CrudRepository<AdminSettingsEntity, UUID> getCrudRepository() {
45 47 return adminSettingsRepository;
46 48 }
47 49
... ...
... ... @@ -29,6 +29,7 @@ import org.thingsboard.server.dao.tenant.TenantDao;
29 29 import org.thingsboard.server.dao.util.SqlDao;
30 30
31 31 import java.util.Objects;
  32 +import java.util.UUID;
32 33
33 34
34 35 /**
... ... @@ -47,7 +48,7 @@ public class JpaTenantDao extends JpaAbstractSearchTextDao<TenantEntity, Tenant>
47 48 }
48 49
49 50 @Override
50   - protected CrudRepository<TenantEntity, String> getCrudRepository() {
  51 + protected CrudRepository<TenantEntity, UUID> getCrudRepository() {
51 52 return tenantRepository;
52 53 }
53 54
... ...
... ... @@ -18,19 +18,18 @@ package org.thingsboard.server.dao.sql.tenant;
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.TenantEntity;
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 4/30/2017.
31 30 */
32 31 @SqlDao
33   -public interface TenantRepository extends PagingAndSortingRepository<TenantEntity, String> {
  32 +public interface TenantRepository extends PagingAndSortingRepository<TenantEntity, UUID> {
34 33
35 34 @Query("SELECT t FROM TenantEntity t WHERE t.region = :region " +
36 35 "AND LOWER(t.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
... ...
... ... @@ -18,7 +18,6 @@ package org.thingsboard.server.dao.sql.user;
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.UserCredentials;
24 23 import org.thingsboard.server.dao.DaoUtil;
... ... @@ -45,13 +44,13 @@ public class JpaUserCredentialsDao extends JpaAbstractDao<UserCredentialsEntity,
45 44 }
46 45
47 46 @Override
48   - protected CrudRepository<UserCredentialsEntity, String> getCrudRepository() {
  47 + protected CrudRepository<UserCredentialsEntity, UUID> getCrudRepository() {
49 48 return userCredentialsRepository;
50 49 }
51 50
52 51 @Override
53 52 public UserCredentials findByUserId(TenantId tenantId, UUID userId) {
54   - return DaoUtil.getData(userCredentialsRepository.findByUserId(UUIDConverter.fromTimeUUID(userId)));
  53 + return DaoUtil.getData(userCredentialsRepository.findByUserId(userId));
55 54 }
56 55
57 56 @Override
... ...
... ... @@ -32,8 +32,7 @@ import org.thingsboard.server.dao.util.SqlDao;
32 32 import java.util.Objects;
33 33 import java.util.UUID;
34 34
35   -import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID;
36   -import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID_STR;
  35 +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
37 36
38 37 /**
39 38 * @author Valerii Sosliuk
... ... @@ -51,7 +50,7 @@ public class JpaUserDao extends JpaAbstractSearchTextDao<UserEntity, User> imple
51 50 }
52 51
53 52 @Override
54   - protected CrudRepository<UserEntity, String> getCrudRepository() {
  53 + protected CrudRepository<UserEntity, UUID> getCrudRepository() {
55 54 return userRepository;
56 55 }
57 56
... ... @@ -65,8 +64,8 @@ public class JpaUserDao extends JpaAbstractSearchTextDao<UserEntity, User> imple
65 64 return DaoUtil.toPageData(
66 65 userRepository
67 66 .findUsersByAuthority(
68   - fromTimeUUID(tenantId),
69   - NULL_UUID_STR,
  67 + tenantId,
  68 + NULL_UUID,
70 69 Objects.toString(pageLink.getTextSearch(), ""),
71 70 Authority.TENANT_ADMIN,
72 71 DaoUtil.toPageable(pageLink)));
... ... @@ -77,8 +76,8 @@ public class JpaUserDao extends JpaAbstractSearchTextDao<UserEntity, User> imple
77 76 return DaoUtil.toPageData(
78 77 userRepository
79 78 .findUsersByAuthority(
80   - fromTimeUUID(tenantId),
81   - fromTimeUUID(customerId),
  79 + tenantId,
  80 + customerId,
82 81 Objects.toString(pageLink.getTextSearch(), ""),
83 82 Authority.CUSTOMER_USER,
84 83 DaoUtil.toPageable(pageLink)));
... ...
... ... @@ -19,13 +19,15 @@ import org.springframework.data.repository.CrudRepository;
19 19 import org.thingsboard.server.dao.model.sql.UserCredentialsEntity;
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 4/22/2017.
24 26 */
25 27 @SqlDao
26   -public interface UserCredentialsRepository extends CrudRepository<UserCredentialsEntity, String> {
  28 +public interface UserCredentialsRepository extends CrudRepository<UserCredentialsEntity, UUID> {
27 29
28   - UserCredentialsEntity findByUserId(String userId);
  30 + UserCredentialsEntity findByUserId(UUID userId);
29 31
30 32 UserCredentialsEntity findByActivateToken(String activateToken);
31 33
... ...
... ... @@ -18,28 +18,27 @@ package org.thingsboard.server.dao.sql.user;
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.security.Authority;
25 24 import org.thingsboard.server.dao.model.sql.UserEntity;
26 25 import org.thingsboard.server.dao.util.SqlDao;
27 26
28   -import java.util.List;
  27 +import java.util.UUID;
29 28
30 29 /**
31 30 * @author Valerii Sosliuk
32 31 */
33 32 @SqlDao
34   -public interface UserRepository extends PagingAndSortingRepository<UserEntity, String> {
  33 +public interface UserRepository extends PagingAndSortingRepository<UserEntity, UUID> {
35 34
36 35 UserEntity findByEmail(String email);
37 36
38 37 @Query("SELECT u FROM UserEntity u WHERE u.tenantId = :tenantId " +
39 38 "AND u.customerId = :customerId AND u.authority = :authority " +
40 39 "AND LOWER(u.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
41   - Page<UserEntity> findUsersByAuthority(@Param("tenantId") String tenantId,
42   - @Param("customerId") String customerId,
  40 + Page<UserEntity> findUsersByAuthority(@Param("tenantId") UUID tenantId,
  41 + @Param("customerId") UUID customerId,
43 42 @Param("searchText") String searchText,
44 43 @Param("authority") Authority authority,
45 44 Pageable pageable);
... ...
... ... @@ -18,7 +18,6 @@ package org.thingsboard.server.dao.sql.widget;
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.widget.WidgetType;
23 22 import org.thingsboard.server.dao.DaoUtil;
24 23 import org.thingsboard.server.dao.model.sql.WidgetTypeEntity;
... ... @@ -45,17 +44,17 @@ public class JpaWidgetTypeDao extends JpaAbstractDao<WidgetTypeEntity, WidgetTyp
45 44 }
46 45
47 46 @Override
48   - protected CrudRepository<WidgetTypeEntity, String> getCrudRepository() {
  47 + protected CrudRepository<WidgetTypeEntity, UUID> getCrudRepository() {
49 48 return widgetTypeRepository;
50 49 }
51 50
52 51 @Override
53 52 public List<WidgetType> findWidgetTypesByTenantIdAndBundleAlias(UUID tenantId, String bundleAlias) {
54   - return DaoUtil.convertDataList(widgetTypeRepository.findByTenantIdAndBundleAlias(UUIDConverter.fromTimeUUID(tenantId), bundleAlias));
  53 + return DaoUtil.convertDataList(widgetTypeRepository.findByTenantIdAndBundleAlias(tenantId, bundleAlias));
55 54 }
56 55
57 56 @Override
58 57 public WidgetType findByTenantIdBundleAliasAndAlias(UUID tenantId, String bundleAlias, String alias) {
59   - return DaoUtil.getData(widgetTypeRepository.findByTenantIdAndBundleAliasAndAlias(UUIDConverter.fromTimeUUID(tenantId), bundleAlias, alias));
  58 + return DaoUtil.getData(widgetTypeRepository.findByTenantIdAndBundleAliasAndAlias(tenantId, bundleAlias, alias));
60 59 }
61 60 }
... ...
... ... @@ -18,7 +18,6 @@ package org.thingsboard.server.dao.sql.widget;
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.page.PageData;
24 23 import org.thingsboard.server.common.data.page.PageLink;
... ... @@ -32,7 +31,7 @@ import org.thingsboard.server.dao.widget.WidgetsBundleDao;
32 31 import java.util.Objects;
33 32 import java.util.UUID;
34 33
35   -import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID_STR;
  34 +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
36 35
37 36 /**
38 37 * Created by Valerii Sosliuk on 4/23/2017.
... ... @@ -50,13 +49,13 @@ public class JpaWidgetsBundleDao extends JpaAbstractSearchTextDao<WidgetsBundleE
50 49 }
51 50
52 51 @Override
53   - protected CrudRepository<WidgetsBundleEntity, String> getCrudRepository() {
  52 + protected CrudRepository<WidgetsBundleEntity, UUID> getCrudRepository() {
54 53 return widgetsBundleRepository;
55 54 }
56 55
57 56 @Override
58 57 public WidgetsBundle findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias) {
59   - return DaoUtil.getData(widgetsBundleRepository.findWidgetsBundleByTenantIdAndAlias(UUIDConverter.fromTimeUUID(tenantId), alias));
  58 + return DaoUtil.getData(widgetsBundleRepository.findWidgetsBundleByTenantIdAndAlias(tenantId, alias));
60 59 }
61 60
62 61 @Override
... ... @@ -64,7 +63,7 @@ public class JpaWidgetsBundleDao extends JpaAbstractSearchTextDao<WidgetsBundleE
64 63 return DaoUtil.toPageData(
65 64 widgetsBundleRepository
66 65 .findSystemWidgetsBundles(
67   - NULL_UUID_STR,
  66 + NULL_UUID,
68 67 Objects.toString(pageLink.getTextSearch(), ""),
69 68 DaoUtil.toPageable(pageLink)));
70 69 }
... ... @@ -74,7 +73,7 @@ public class JpaWidgetsBundleDao extends JpaAbstractSearchTextDao<WidgetsBundleE
74 73 return DaoUtil.toPageData(
75 74 widgetsBundleRepository
76 75 .findTenantWidgetsBundlesByTenantId(
77   - UUIDConverter.fromTimeUUID(tenantId),
  76 + tenantId,
78 77 Objects.toString(pageLink.getTextSearch(), ""),
79 78 DaoUtil.toPageable(pageLink)));
80 79 }
... ... @@ -84,8 +83,8 @@ public class JpaWidgetsBundleDao extends JpaAbstractSearchTextDao<WidgetsBundleE
84 83 return DaoUtil.toPageData(
85 84 widgetsBundleRepository
86 85 .findAllTenantWidgetsBundlesByTenantId(
87   - UUIDConverter.fromTimeUUID(tenantId),
88   - NULL_UUID_STR,
  86 + tenantId,
  87 + NULL_UUID,
89 88 Objects.toString(pageLink.getTextSearch(), ""),
90 89 DaoUtil.toPageable(pageLink)));
91 90 }
... ...
... ... @@ -20,14 +20,15 @@ import org.thingsboard.server.dao.model.sql.WidgetTypeEntity;
20 20 import org.thingsboard.server.dao.util.SqlDao;
21 21
22 22 import java.util.List;
  23 +import java.util.UUID;
23 24
24 25 /**
25 26 * Created by Valerii Sosliuk on 4/29/2017.
26 27 */
27 28 @SqlDao
28   -public interface WidgetTypeRepository extends CrudRepository<WidgetTypeEntity, String> {
  29 +public interface WidgetTypeRepository extends CrudRepository<WidgetTypeEntity, UUID> {
29 30
30   - List<WidgetTypeEntity> findByTenantIdAndBundleAlias(String tenantId, String bundleAlias);
  31 + List<WidgetTypeEntity> findByTenantIdAndBundleAlias(UUID tenantId, String bundleAlias);
31 32
32   - WidgetTypeEntity findByTenantIdAndBundleAliasAndAlias(String tenantId, String bundleAlias, String alias);
  33 + WidgetTypeEntity findByTenantIdAndBundleAliasAndAlias(UUID tenantId, String bundleAlias, String alias);
33 34 }
... ...
... ... @@ -18,38 +18,37 @@ package org.thingsboard.server.dao.sql.widget;
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.WidgetsBundleEntity;
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 4/23/2017.
31 30 */
32 31 @SqlDao
33   -public interface WidgetsBundleRepository extends PagingAndSortingRepository<WidgetsBundleEntity, String> {
  32 +public interface WidgetsBundleRepository extends PagingAndSortingRepository<WidgetsBundleEntity, UUID> {
34 33
35   - WidgetsBundleEntity findWidgetsBundleByTenantIdAndAlias(String tenantId, String alias);
  34 + WidgetsBundleEntity findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias);
36 35
37 36 @Query("SELECT wb FROM WidgetsBundleEntity wb WHERE wb.tenantId = :systemTenantId " +
38 37 "AND LOWER(wb.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
39   - Page<WidgetsBundleEntity> findSystemWidgetsBundles(@Param("systemTenantId") String systemTenantId,
  38 + Page<WidgetsBundleEntity> findSystemWidgetsBundles(@Param("systemTenantId") UUID systemTenantId,
40 39 @Param("searchText") String searchText,
41 40 Pageable pageable);
42 41
43 42 @Query("SELECT wb FROM WidgetsBundleEntity wb WHERE wb.tenantId = :tenantId " +
44 43 "AND LOWER(wb.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
45   - Page<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantId(@Param("tenantId") String tenantId,
  44 + Page<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantId(@Param("tenantId") UUID tenantId,
46 45 @Param("textSearch") String textSearch,
47 46 Pageable pageable);
48 47
49 48 @Query("SELECT wb FROM WidgetsBundleEntity wb WHERE wb.tenantId IN (:tenantId, :nullTenantId) " +
50 49 "AND LOWER(wb.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
51   - Page<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantId(@Param("tenantId") String tenantId,
52   - @Param("nullTenantId") String nullTenantId,
  50 + Page<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantId(@Param("tenantId") UUID tenantId,
  51 + @Param("nullTenantId") UUID nullTenantId,
53 52 @Param("textSearch") String textSearch,
54 53 Pageable pageable);
55 54 }
... ...
... ... @@ -21,8 +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   -
26 24 public interface TenantDao extends Dao<Tenant> {
27 25
28 26 /**
... ...
... ... @@ -21,7 +21,6 @@ import org.apache.commons.lang3.StringUtils;
21 21 import org.springframework.beans.factory.annotation.Autowired;
22 22 import org.springframework.stereotype.Service;
23 23 import org.thingsboard.server.common.data.Tenant;
24   -import org.thingsboard.server.common.data.asset.Asset;
25 24 import org.thingsboard.server.common.data.id.EntityId;
26 25 import org.thingsboard.server.common.data.id.TenantId;
27 26 import org.thingsboard.server.common.data.page.PageData;
... ... @@ -40,8 +39,6 @@ import org.thingsboard.server.dao.service.Validator;
40 39 import org.thingsboard.server.dao.user.UserService;
41 40 import org.thingsboard.server.dao.widget.WidgetsBundleService;
42 41
43   -import java.util.List;
44   -
45 42 import static org.thingsboard.server.dao.service.Validator.validateId;
46 43
47 44 @Service
... ...
... ... @@ -15,7 +15,6 @@
15 15 */
16 16 package org.thingsboard.server.dao.timeseries;
17 17
18   -import com.datastax.oss.driver.api.core.cql.AsyncResultSet;
19 18 import com.datastax.oss.driver.api.core.cql.Row;
20 19 import com.google.common.util.concurrent.Futures;
21 20 import com.google.common.util.concurrent.ListenableFuture;
... ...
... ... @@ -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.UUID;
26 25
27 26 public interface UserDao extends Dao<User> {
... ...
... ... @@ -46,7 +46,6 @@ import org.thingsboard.server.dao.service.PaginatedRemover;
46 46 import org.thingsboard.server.dao.tenant.TenantDao;
47 47
48 48 import java.util.HashMap;
49   -import java.util.List;
50 49 import java.util.Map;
51 50
52 51 import static org.thingsboard.server.dao.service.Validator.validateId;
... ...
... ... @@ -35,7 +35,15 @@ import org.thingsboard.server.dao.nosql.CassandraStatementTask;
35 35
36 36 import javax.annotation.Nullable;
37 37 import java.util.UUID;
38   -import java.util.concurrent.*;
  38 +import java.util.concurrent.BlockingQueue;
  39 +import java.util.concurrent.ConcurrentHashMap;
  40 +import java.util.concurrent.ConcurrentMap;
  41 +import java.util.concurrent.ExecutorService;
  42 +import java.util.concurrent.Executors;
  43 +import java.util.concurrent.LinkedBlockingDeque;
  44 +import java.util.concurrent.ScheduledExecutorService;
  45 +import java.util.concurrent.TimeUnit;
  46 +import java.util.concurrent.TimeoutException;
39 47 import java.util.concurrent.atomic.AtomicInteger;
40 48 import java.util.regex.Matcher;
41 49
... ...
... ... @@ -21,7 +21,6 @@ import org.thingsboard.server.common.data.page.PageLink;
21 21 import org.thingsboard.server.common.data.widget.WidgetsBundle;
22 22 import org.thingsboard.server.dao.Dao;
23 23
24   -import java.util.List;
25 24 import java.util.UUID;
26 25
27 26 /**
... ...
... ... @@ -16,48 +16,52 @@
16 16
17 17
18 18 CREATE TABLE IF NOT EXISTS admin_settings (
19   - id varchar(31) NOT NULL CONSTRAINT admin_settings_pkey PRIMARY KEY,
  19 + id uuid NOT NULL CONSTRAINT admin_settings_pkey PRIMARY KEY,
  20 + created_time bigint NOT NULL,
20 21 json_value varchar,
21 22 key varchar(255)
22 23 );
23 24
24 25 CREATE TABLE IF NOT EXISTS alarm (
25   - id varchar(31) NOT NULL CONSTRAINT alarm_pkey PRIMARY KEY,
  26 + id uuid NOT NULL CONSTRAINT alarm_pkey PRIMARY KEY,
  27 + created_time bigint NOT NULL,
26 28 ack_ts bigint,
27 29 clear_ts bigint,
28 30 additional_info varchar,
29 31 end_ts bigint,
30   - originator_id varchar(31),
  32 + originator_id uuid,
31 33 originator_type integer,
32 34 propagate boolean,
33 35 severity varchar(255),
34 36 start_ts bigint,
35 37 status varchar(255),
36   - tenant_id varchar(31),
  38 + tenant_id uuid,
37 39 propagate_relation_types varchar,
38 40 type varchar(255)
39 41 );
40 42
41 43 CREATE TABLE IF NOT EXISTS asset (
42   - id varchar(31) NOT NULL CONSTRAINT asset_pkey PRIMARY KEY,
  44 + id uuid NOT NULL CONSTRAINT asset_pkey PRIMARY KEY,
  45 + created_time bigint NOT NULL,
43 46 additional_info varchar,
44   - customer_id varchar(31),
  47 + customer_id uuid,
45 48 name varchar(255),
46 49 label varchar(255),
47 50 search_text varchar(255),
48   - tenant_id varchar(31),
  51 + tenant_id uuid,
49 52 type varchar(255),
50 53 CONSTRAINT asset_name_unq_key UNIQUE (tenant_id, name)
51 54 );
52 55
53 56 CREATE TABLE IF NOT EXISTS audit_log (
54   - id varchar(31) NOT NULL CONSTRAINT audit_log_pkey PRIMARY KEY,
55   - tenant_id varchar(31),
56   - customer_id varchar(31),
57   - entity_id varchar(31),
  57 + id uuid NOT NULL CONSTRAINT audit_log_pkey PRIMARY KEY,
  58 + created_time bigint NOT NULL,
  59 + tenant_id uuid,
  60 + customer_id uuid,
  61 + entity_id uuid,
58 62 entity_type varchar(255),
59 63 entity_name varchar(255),
60   - user_id varchar(31),
  64 + user_id uuid,
61 65 user_name varchar(255),
62 66 action_type varchar(255),
63 67 action_data varchar(1000000),
... ... @@ -67,7 +71,7 @@ CREATE TABLE IF NOT EXISTS audit_log (
67 71
68 72 CREATE TABLE IF NOT EXISTS attribute_kv (
69 73 entity_type varchar(255),
70   - entity_id varchar(31),
  74 + entity_id uuid,
71 75 attribute_type varchar(255),
72 76 attribute_key varchar(255),
73 77 bool_v boolean,
... ... @@ -80,7 +84,8 @@ CREATE TABLE IF NOT EXISTS attribute_kv (
80 84 );
81 85
82 86 CREATE TABLE IF NOT EXISTS component_descriptor (
83   - id varchar(31) NOT NULL CONSTRAINT component_descriptor_pkey PRIMARY KEY,
  87 + id uuid NOT NULL CONSTRAINT component_descriptor_pkey PRIMARY KEY,
  88 + created_time bigint NOT NULL,
84 89 actions varchar(255),
85 90 clazz varchar UNIQUE,
86 91 configuration_descriptor varchar,
... ... @@ -91,7 +96,8 @@ CREATE TABLE IF NOT EXISTS component_descriptor (
91 96 );
92 97
93 98 CREATE TABLE IF NOT EXISTS customer (
94   - id varchar(31) NOT NULL CONSTRAINT customer_pkey PRIMARY KEY,
  99 + id uuid NOT NULL CONSTRAINT customer_pkey PRIMARY KEY,
  100 + created_time bigint NOT NULL,
95 101 additional_info varchar,
96 102 address varchar,
97 103 address2 varchar,
... ... @@ -101,57 +107,61 @@ CREATE TABLE IF NOT EXISTS customer (
101 107 phone varchar(255),
102 108 search_text varchar(255),
103 109 state varchar(255),
104   - tenant_id varchar(31),
  110 + tenant_id uuid,
105 111 title varchar(255),
106 112 zip varchar(255)
107 113 );
108 114
109 115 CREATE TABLE IF NOT EXISTS dashboard (
110   - id varchar(31) NOT NULL CONSTRAINT dashboard_pkey PRIMARY KEY,
  116 + id uuid NOT NULL CONSTRAINT dashboard_pkey PRIMARY KEY,
  117 + created_time bigint NOT NULL,
111 118 configuration varchar(10000000),
112 119 assigned_customers varchar(1000000),
113 120 search_text varchar(255),
114   - tenant_id varchar(31),
  121 + tenant_id uuid,
115 122 title varchar(255)
116 123 );
117 124
118 125 CREATE TABLE IF NOT EXISTS device (
119   - id varchar(31) NOT NULL CONSTRAINT device_pkey PRIMARY KEY,
  126 + id uuid NOT NULL CONSTRAINT device_pkey PRIMARY KEY,
  127 + created_time bigint NOT NULL,
120 128 additional_info varchar,
121   - customer_id varchar(31),
  129 + customer_id uuid,
122 130 type varchar(255),
123 131 name varchar(255),
124 132 label varchar(255),
125 133 search_text varchar(255),
126   - tenant_id varchar(31),
  134 + tenant_id uuid,
127 135 CONSTRAINT device_name_unq_key UNIQUE (tenant_id, name)
128 136 );
129 137
130 138 CREATE TABLE IF NOT EXISTS device_credentials (
131   - id varchar(31) NOT NULL CONSTRAINT device_credentials_pkey PRIMARY KEY,
  139 + id uuid NOT NULL CONSTRAINT device_credentials_pkey PRIMARY KEY,
  140 + created_time bigint NOT NULL,
132 141 credentials_id varchar,
133 142 credentials_type varchar(255),
134 143 credentials_value varchar,
135   - device_id varchar(31),
  144 + device_id uuid,
136 145 CONSTRAINT device_credentials_id_unq_key UNIQUE (credentials_id)
137 146 );
138 147
139 148 CREATE TABLE IF NOT EXISTS event (
140   - id varchar(31) NOT NULL CONSTRAINT event_pkey PRIMARY KEY,
  149 + id uuid NOT NULL CONSTRAINT event_pkey PRIMARY KEY,
  150 + created_time bigint NOT NULL,
141 151 body varchar(10000000),
142   - entity_id varchar(31),
  152 + entity_id uuid,
143 153 entity_type varchar(255),
144 154 event_type varchar(255),
145 155 event_uid varchar(255),
146   - tenant_id varchar(31),
  156 + tenant_id uuid,
147 157 ts bigint NOT NULL,
148 158 CONSTRAINT event_unq_key UNIQUE (tenant_id, entity_type, entity_id, event_type, event_uid)
149 159 );
150 160
151 161 CREATE TABLE IF NOT EXISTS relation (
152   - from_id varchar(31),
  162 + from_id uuid,
153 163 from_type varchar(255),
154   - to_id varchar(31),
  164 + to_id uuid,
155 165 to_type varchar(255),
156 166 relation_type_group varchar(255),
157 167 relation_type varchar(255),
... ... @@ -160,19 +170,21 @@ CREATE TABLE IF NOT EXISTS relation (
160 170 );
161 171
162 172 CREATE TABLE IF NOT EXISTS tb_user (
163   - id varchar(31) NOT NULL CONSTRAINT tb_user_pkey PRIMARY KEY,
  173 + id uuid NOT NULL CONSTRAINT tb_user_pkey PRIMARY KEY,
  174 + created_time bigint NOT NULL,
164 175 additional_info varchar,
165 176 authority varchar(255),
166   - customer_id varchar(31),
  177 + customer_id uuid,
167 178 email varchar(255) UNIQUE,
168 179 first_name varchar(255),
169 180 last_name varchar(255),
170 181 search_text varchar(255),
171   - tenant_id varchar(31)
  182 + tenant_id uuid
172 183 );
173 184
174 185 CREATE TABLE IF NOT EXISTS tenant (
175   - id varchar(31) NOT NULL CONSTRAINT tenant_pkey PRIMARY KEY,
  186 + id uuid NOT NULL CONSTRAINT tenant_pkey PRIMARY KEY,
  187 + created_time bigint NOT NULL,
176 188 additional_info varchar,
177 189 address varchar,
178 190 address2 varchar,
... ... @@ -190,46 +202,51 @@ CREATE TABLE IF NOT EXISTS tenant (
190 202 );
191 203
192 204 CREATE TABLE IF NOT EXISTS user_credentials (
193   - id varchar(31) NOT NULL CONSTRAINT user_credentials_pkey PRIMARY KEY,
  205 + id uuid NOT NULL CONSTRAINT user_credentials_pkey PRIMARY KEY,
  206 + created_time bigint NOT NULL,
194 207 activate_token varchar(255) UNIQUE,
195 208 enabled boolean,
196 209 password varchar(255),
197 210 reset_token varchar(255) UNIQUE,
198   - user_id varchar(31) UNIQUE
  211 + user_id uuid UNIQUE
199 212 );
200 213
201 214 CREATE TABLE IF NOT EXISTS widget_type (
202   - id varchar(31) NOT NULL CONSTRAINT widget_type_pkey PRIMARY KEY,
  215 + id uuid NOT NULL CONSTRAINT widget_type_pkey PRIMARY KEY,
  216 + created_time bigint NOT NULL,
203 217 alias varchar(255),
204 218 bundle_alias varchar(255),
205 219 descriptor varchar(1000000),
206 220 name varchar(255),
207   - tenant_id varchar(31)
  221 + tenant_id uuid
208 222 );
209 223
210 224 CREATE TABLE IF NOT EXISTS widgets_bundle (
211   - id varchar(31) NOT NULL CONSTRAINT widgets_bundle_pkey PRIMARY KEY,
  225 + id uuid NOT NULL CONSTRAINT widgets_bundle_pkey PRIMARY KEY,
  226 + created_time bigint NOT NULL,
212 227 alias varchar(255),
213 228 search_text varchar(255),
214   - tenant_id varchar(31),
  229 + tenant_id uuid,
215 230 title varchar(255)
216 231 );
217 232
218 233 CREATE TABLE IF NOT EXISTS rule_chain (
219   - id varchar(31) NOT NULL CONSTRAINT rule_chain_pkey PRIMARY KEY,
  234 + id uuid NOT NULL CONSTRAINT rule_chain_pkey PRIMARY KEY,
  235 + created_time bigint NOT NULL,
220 236 additional_info varchar,
221 237 configuration varchar(10000000),
222 238 name varchar(255),
223   - first_rule_node_id varchar(31),
  239 + first_rule_node_id uuid,
224 240 root boolean,
225 241 debug_mode boolean,
226 242 search_text varchar(255),
227   - tenant_id varchar(31)
  243 + tenant_id uuid
228 244 );
229 245
230 246 CREATE TABLE IF NOT EXISTS rule_node (
231   - id varchar(31) NOT NULL CONSTRAINT rule_node_pkey PRIMARY KEY,
232   - rule_chain_id varchar(31),
  247 + id uuid NOT NULL CONSTRAINT rule_node_pkey PRIMARY KEY,
  248 + created_time bigint NOT NULL,
  249 + rule_chain_id uuid,
233 250 additional_info varchar,
234 251 configuration varchar(10000000),
235 252 type varchar(255),
... ... @@ -239,11 +256,12 @@ CREATE TABLE IF NOT EXISTS rule_node (
239 256 );
240 257
241 258 CREATE TABLE IF NOT EXISTS entity_view (
242   - id varchar(31) NOT NULL CONSTRAINT entity_view_pkey PRIMARY KEY,
243   - entity_id varchar(31),
  259 + id uuid NOT NULL CONSTRAINT entity_view_pkey PRIMARY KEY,
  260 + created_time bigint NOT NULL,
  261 + entity_id uuid,
244 262 entity_type varchar(255),
245   - tenant_id varchar(31),
246   - customer_id varchar(31),
  263 + tenant_id uuid,
  264 + customer_id uuid,
247 265 type varchar(255),
248 266 name varchar(255),
249 267 keys varchar(10000000),
... ...
... ... @@ -16,48 +16,52 @@
16 16
17 17
18 18 CREATE TABLE IF NOT EXISTS admin_settings (
19   - id varchar(31) NOT NULL CONSTRAINT admin_settings_pkey PRIMARY KEY,
  19 + id uuid NOT NULL CONSTRAINT admin_settings_pkey PRIMARY KEY,
  20 + created_time bigint NOT NULL,
20 21 json_value varchar,
21 22 key varchar(255)
22 23 );
23 24
24 25 CREATE TABLE IF NOT EXISTS alarm (
25   - id varchar(31) NOT NULL CONSTRAINT alarm_pkey PRIMARY KEY,
  26 + id uuid NOT NULL CONSTRAINT alarm_pkey PRIMARY KEY,
  27 + created_time bigint NOT NULL,
26 28 ack_ts bigint,
27 29 clear_ts bigint,
28 30 additional_info varchar,
29 31 end_ts bigint,
30   - originator_id varchar(31),
  32 + originator_id uuid,
31 33 originator_type integer,
32 34 propagate boolean,
33 35 severity varchar(255),
34 36 start_ts bigint,
35 37 status varchar(255),
36   - tenant_id varchar(31),
  38 + tenant_id uuid,
37 39 propagate_relation_types varchar,
38 40 type varchar(255)
39 41 );
40 42
41 43 CREATE TABLE IF NOT EXISTS asset (
42   - id varchar(31) NOT NULL CONSTRAINT asset_pkey PRIMARY KEY,
  44 + id uuid NOT NULL CONSTRAINT asset_pkey PRIMARY KEY,
  45 + created_time bigint NOT NULL,
43 46 additional_info varchar,
44   - customer_id varchar(31),
  47 + customer_id uuid,
45 48 name varchar(255),
46 49 label varchar(255),
47 50 search_text varchar(255),
48   - tenant_id varchar(31),
  51 + tenant_id uuid,
49 52 type varchar(255),
50 53 CONSTRAINT asset_name_unq_key UNIQUE (tenant_id, name)
51 54 );
52 55
53 56 CREATE TABLE IF NOT EXISTS audit_log (
54   - id varchar(31) NOT NULL CONSTRAINT audit_log_pkey PRIMARY KEY,
55   - tenant_id varchar(31),
56   - customer_id varchar(31),
57   - entity_id varchar(31),
  57 + id uuid NOT NULL CONSTRAINT audit_log_pkey PRIMARY KEY,
  58 + created_time bigint NOT NULL,
  59 + tenant_id uuid,
  60 + customer_id uuid,
  61 + entity_id uuid,
58 62 entity_type varchar(255),
59 63 entity_name varchar(255),
60   - user_id varchar(31),
  64 + user_id uuid,
61 65 user_name varchar(255),
62 66 action_type varchar(255),
63 67 action_data varchar(1000000),
... ... @@ -67,7 +71,7 @@ CREATE TABLE IF NOT EXISTS audit_log (
67 71
68 72 CREATE TABLE IF NOT EXISTS attribute_kv (
69 73 entity_type varchar(255),
70   - entity_id varchar(31),
  74 + entity_id uuid,
71 75 attribute_type varchar(255),
72 76 attribute_key varchar(255),
73 77 bool_v boolean,
... ... @@ -80,7 +84,8 @@ CREATE TABLE IF NOT EXISTS attribute_kv (
80 84 );
81 85
82 86 CREATE TABLE IF NOT EXISTS component_descriptor (
83   - id varchar(31) NOT NULL CONSTRAINT component_descriptor_pkey PRIMARY KEY,
  87 + id uuid NOT NULL CONSTRAINT component_descriptor_pkey PRIMARY KEY,
  88 + created_time bigint NOT NULL,
84 89 actions varchar(255),
85 90 clazz varchar UNIQUE,
86 91 configuration_descriptor varchar,
... ... @@ -91,7 +96,8 @@ CREATE TABLE IF NOT EXISTS component_descriptor (
91 96 );
92 97
93 98 CREATE TABLE IF NOT EXISTS customer (
94   - id varchar(31) NOT NULL CONSTRAINT customer_pkey PRIMARY KEY,
  99 + id uuid NOT NULL CONSTRAINT customer_pkey PRIMARY KEY,
  100 + created_time bigint NOT NULL,
95 101 additional_info varchar,
96 102 address varchar,
97 103 address2 varchar,
... ... @@ -101,78 +107,90 @@ CREATE TABLE IF NOT EXISTS customer (
101 107 phone varchar(255),
102 108 search_text varchar(255),
103 109 state varchar(255),
104   - tenant_id varchar(31),
  110 + tenant_id uuid,
105 111 title varchar(255),
106 112 zip varchar(255)
107 113 );
108 114
109 115 CREATE TABLE IF NOT EXISTS dashboard (
110   - id varchar(31) NOT NULL CONSTRAINT dashboard_pkey PRIMARY KEY,
  116 + id uuid NOT NULL CONSTRAINT dashboard_pkey PRIMARY KEY,
  117 + created_time bigint NOT NULL,
111 118 configuration varchar(10000000),
112 119 assigned_customers varchar(1000000),
113 120 search_text varchar(255),
114   - tenant_id varchar(31),
  121 + tenant_id uuid,
115 122 title varchar(255)
116 123 );
117 124
118 125 CREATE TABLE IF NOT EXISTS device (
119   - id varchar(31) NOT NULL CONSTRAINT device_pkey PRIMARY KEY,
  126 + id uuid NOT NULL CONSTRAINT device_pkey PRIMARY KEY,
  127 + created_time bigint NOT NULL,
120 128 additional_info varchar,
121   - customer_id varchar(31),
  129 + customer_id uuid,
122 130 type varchar(255),
123 131 name varchar(255),
124 132 label varchar(255),
125 133 search_text varchar(255),
126   - tenant_id varchar(31),
  134 + tenant_id uuid,
127 135 CONSTRAINT device_name_unq_key UNIQUE (tenant_id, name)
128 136 );
129 137
130 138 CREATE TABLE IF NOT EXISTS device_credentials (
131   - id varchar(31) NOT NULL CONSTRAINT device_credentials_pkey PRIMARY KEY,
  139 + id uuid NOT NULL CONSTRAINT device_credentials_pkey PRIMARY KEY,
  140 + created_time bigint NOT NULL,
132 141 credentials_id varchar,
133 142 credentials_type varchar(255),
134 143 credentials_value varchar,
135   - device_id varchar(31),
  144 + device_id uuid,
136 145 CONSTRAINT device_credentials_id_unq_key UNIQUE (credentials_id)
137 146 );
138 147
139 148 CREATE TABLE IF NOT EXISTS event (
140   - id varchar(31) NOT NULL CONSTRAINT event_pkey PRIMARY KEY,
  149 + id uuid NOT NULL CONSTRAINT event_pkey PRIMARY KEY,
  150 + created_time bigint NOT NULL,
141 151 body varchar(10000000),
142   - entity_id varchar(31),
  152 + entity_id uuid,
143 153 entity_type varchar(255),
144 154 event_type varchar(255),
145 155 event_uid varchar(255),
146   - tenant_id varchar(31),
  156 + tenant_id uuid,
147 157 ts bigint NOT NULL,
148 158 CONSTRAINT event_unq_key UNIQUE (tenant_id, entity_type, entity_id, event_type, event_uid)
149 159 );
150 160
151 161 CREATE TABLE IF NOT EXISTS relation (
152   - from_id varchar(31),
  162 + from_id uuid,
153 163 from_type varchar(255),
154   - to_id varchar(31),
  164 + to_id uuid,
155 165 to_type varchar(255),
156 166 relation_type_group varchar(255),
157 167 relation_type varchar(255),
158 168 additional_info varchar,
159 169 CONSTRAINT relation_pkey PRIMARY KEY (from_id, from_type, relation_type_group, relation_type, to_id, to_type)
160   -);
  170 +) PARTITION BY LIST (relation_type_group);
  171 +
  172 +CREATE TABLE other_relations PARTITION OF relation DEFAULT;
  173 +CREATE TABLE common_relations PARTITION OF relation FOR VALUES IN ('COMMON');
  174 +CREATE TABLE alarm_relations PARTITION OF relation FOR VALUES IN ('ALARM');
  175 +CREATE TABLE dashboard_relations PARTITION OF relation FOR VALUES IN ('DASHBOARD');
  176 +CREATE TABLE rule_relations PARTITION OF relation FOR VALUES IN ('RULE_CHAIN', 'RULE_NODE');
161 177
162 178 CREATE TABLE IF NOT EXISTS tb_user (
163   - id varchar(31) NOT NULL CONSTRAINT tb_user_pkey PRIMARY KEY,
  179 + id uuid NOT NULL CONSTRAINT tb_user_pkey PRIMARY KEY,
  180 + created_time bigint NOT NULL,
164 181 additional_info varchar,
165 182 authority varchar(255),
166   - customer_id varchar(31),
  183 + customer_id uuid,
167 184 email varchar(255) UNIQUE,
168 185 first_name varchar(255),
169 186 last_name varchar(255),
170 187 search_text varchar(255),
171   - tenant_id varchar(31)
  188 + tenant_id uuid
172 189 );
173 190
174 191 CREATE TABLE IF NOT EXISTS tenant (
175   - id varchar(31) NOT NULL CONSTRAINT tenant_pkey PRIMARY KEY,
  192 + id uuid NOT NULL CONSTRAINT tenant_pkey PRIMARY KEY,
  193 + created_time bigint NOT NULL,
176 194 additional_info varchar,
177 195 address varchar,
178 196 address2 varchar,
... ... @@ -190,46 +208,51 @@ CREATE TABLE IF NOT EXISTS tenant (
190 208 );
191 209
192 210 CREATE TABLE IF NOT EXISTS user_credentials (
193   - id varchar(31) NOT NULL CONSTRAINT user_credentials_pkey PRIMARY KEY,
  211 + id uuid NOT NULL CONSTRAINT user_credentials_pkey PRIMARY KEY,
  212 + created_time bigint NOT NULL,
194 213 activate_token varchar(255) UNIQUE,
195 214 enabled boolean,
196 215 password varchar(255),
197 216 reset_token varchar(255) UNIQUE,
198   - user_id varchar(31) UNIQUE
  217 + user_id uuid UNIQUE
199 218 );
200 219
201 220 CREATE TABLE IF NOT EXISTS widget_type (
202   - id varchar(31) NOT NULL CONSTRAINT widget_type_pkey PRIMARY KEY,
  221 + id uuid NOT NULL CONSTRAINT widget_type_pkey PRIMARY KEY,
  222 + created_time bigint NOT NULL,
203 223 alias varchar(255),
204 224 bundle_alias varchar(255),
205 225 descriptor varchar(1000000),
206 226 name varchar(255),
207   - tenant_id varchar(31)
  227 + tenant_id uuid
208 228 );
209 229
210 230 CREATE TABLE IF NOT EXISTS widgets_bundle (
211   - id varchar(31) NOT NULL CONSTRAINT widgets_bundle_pkey PRIMARY KEY,
  231 + id uuid NOT NULL CONSTRAINT widgets_bundle_pkey PRIMARY KEY,
  232 + created_time bigint NOT NULL,
212 233 alias varchar(255),
213 234 search_text varchar(255),
214   - tenant_id varchar(31),
  235 + tenant_id uuid,
215 236 title varchar(255)
216 237 );
217 238
218 239 CREATE TABLE IF NOT EXISTS rule_chain (
219   - id varchar(31) NOT NULL CONSTRAINT rule_chain_pkey PRIMARY KEY,
  240 + id uuid NOT NULL CONSTRAINT rule_chain_pkey PRIMARY KEY,
  241 + created_time bigint NOT NULL,
220 242 additional_info varchar,
221 243 configuration varchar(10000000),
222 244 name varchar(255),
223   - first_rule_node_id varchar(31),
  245 + first_rule_node_id uuid,
224 246 root boolean,
225 247 debug_mode boolean,
226 248 search_text varchar(255),
227   - tenant_id varchar(31)
  249 + tenant_id uuid
228 250 );
229 251
230 252 CREATE TABLE IF NOT EXISTS rule_node (
231   - id varchar(31) NOT NULL CONSTRAINT rule_node_pkey PRIMARY KEY,
232   - rule_chain_id varchar(31),
  253 + id uuid NOT NULL CONSTRAINT rule_node_pkey PRIMARY KEY,
  254 + created_time bigint NOT NULL,
  255 + rule_chain_id uuid,
233 256 additional_info varchar,
234 257 configuration varchar(10000000),
235 258 type varchar(255),
... ... @@ -239,11 +262,12 @@ CREATE TABLE IF NOT EXISTS rule_node (
239 262 );
240 263
241 264 CREATE TABLE IF NOT EXISTS entity_view (
242   - id varchar(31) NOT NULL CONSTRAINT entity_view_pkey PRIMARY KEY,
243   - entity_id varchar(31),
  265 + id uuid NOT NULL CONSTRAINT entity_view_pkey PRIMARY KEY,
  266 + created_time bigint NOT NULL,
  267 + entity_id uuid,
244 268 entity_type varchar(255),
245   - tenant_id varchar(31),
246   - customer_id varchar(31),
  269 + tenant_id uuid,
  270 + customer_id uuid,
247 271 type varchar(255),
248 272 name varchar(255),
249 273 keys varchar(10000000),
... ...
... ... @@ -62,37 +62,37 @@ BEGIN
62 62 END;
63 63 $$ LANGUAGE plpgsql;
64 64
65   -CREATE OR REPLACE FUNCTION delete_device_records_from_ts_kv(tenant_id varchar, customer_id varchar, ttl bigint,
  65 +CREATE OR REPLACE FUNCTION delete_device_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint,
66 66 OUT deleted bigint) AS
67 67 $$
68 68 BEGIN
69 69 EXECUTE format(
70   - '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',
  70 + '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',
71 71 tenant_id, customer_id, ttl) into deleted;
72 72 END;
73 73 $$ LANGUAGE plpgsql;
74 74
75   -CREATE OR REPLACE FUNCTION delete_asset_records_from_ts_kv(tenant_id varchar, customer_id varchar, ttl bigint,
  75 +CREATE OR REPLACE FUNCTION delete_asset_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint,
76 76 OUT deleted bigint) AS
77 77 $$
78 78 BEGIN
79 79 EXECUTE format(
80   - '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',
  80 + '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',
81 81 tenant_id, customer_id, ttl) into deleted;
82 82 END;
83 83 $$ LANGUAGE plpgsql;
84 84
85   -CREATE OR REPLACE FUNCTION delete_customer_records_from_ts_kv(tenant_id varchar, customer_id varchar, ttl bigint,
  85 +CREATE OR REPLACE FUNCTION delete_customer_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint,
86 86 OUT deleted bigint) AS
87 87 $$
88 88 BEGIN
89 89 EXECUTE format(
90   - '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',
  90 + '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',
91 91 tenant_id, customer_id, ttl) into deleted;
92 92 END;
93 93 $$ LANGUAGE plpgsql;
94 94
95   -CREATE OR REPLACE PROCEDURE cleanup_timeseries_by_ttl(IN null_uuid varchar(31),
  95 +CREATE OR REPLACE PROCEDURE cleanup_timeseries_by_ttl(IN null_uuid uuid,
96 96 IN system_ttl bigint, INOUT deleted bigint)
97 97 LANGUAGE plpgsql AS
98 98 $$
... ...
... ... @@ -45,3 +45,8 @@ CREATE TABLE IF NOT EXISTS ts_kv_dictionary (
45 45 key_id int GENERATED BY DEFAULT AS IDENTITY(start with 0 increment by 1) UNIQUE,
46 46 CONSTRAINT ts_key_id_pkey PRIMARY KEY (key)
47 47 );
  48 +
  49 +CREATE FUNCTION to_uuid(IN entity_id varchar)
  50 + RETURNS UUID
  51 + RETURN UUID(substring(entity_id, 8, 8) || '-' || substring(entity_id, 4, 4) || '-1' || substring(entity_id, 1, 3) ||
  52 + '-' || substring(entity_id, 16, 4) || '-' || substring(entity_id, 20, 12));
... ...
... ... @@ -171,37 +171,37 @@ BEGIN
171 171 END;
172 172 $$ LANGUAGE plpgsql;
173 173
174   -CREATE OR REPLACE FUNCTION delete_device_records_from_ts_kv(tenant_id varchar, customer_id varchar, ttl bigint,
  174 +CREATE OR REPLACE FUNCTION delete_device_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint,
175 175 OUT deleted bigint) AS
176 176 $$
177 177 BEGIN
178 178 EXECUTE format(
179   - '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',
  179 + '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',
180 180 tenant_id, customer_id, ttl) into deleted;
181 181 END;
182 182 $$ LANGUAGE plpgsql;
183 183
184   -CREATE OR REPLACE FUNCTION delete_asset_records_from_ts_kv(tenant_id varchar, customer_id varchar, ttl bigint,
  184 +CREATE OR REPLACE FUNCTION delete_asset_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint,
185 185 OUT deleted bigint) AS
186 186 $$
187 187 BEGIN
188 188 EXECUTE format(
189   - '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',
  189 + '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',
190 190 tenant_id, customer_id, ttl) into deleted;
191 191 END;
192 192 $$ LANGUAGE plpgsql;
193 193
194   -CREATE OR REPLACE FUNCTION delete_customer_records_from_ts_kv(tenant_id varchar, customer_id varchar, ttl bigint,
  194 +CREATE OR REPLACE FUNCTION delete_customer_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint,
195 195 OUT deleted bigint) AS
196 196 $$
197 197 BEGIN
198 198 EXECUTE format(
199   - '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',
  199 + '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',
200 200 tenant_id, customer_id, ttl) into deleted;
201 201 END;
202 202 $$ LANGUAGE plpgsql;
203 203
204   -CREATE OR REPLACE PROCEDURE cleanup_timeseries_by_ttl(IN null_uuid varchar(31),
  204 +CREATE OR REPLACE PROCEDURE cleanup_timeseries_by_ttl(IN null_uuid uuid,
205 205 IN system_ttl bigint, INOUT deleted bigint)
206 206 LANGUAGE plpgsql AS
207 207 $$
... ...
... ... @@ -24,20 +24,26 @@ import java.util.Arrays;
24 24
25 25 @RunWith(ClasspathSuite.class)
26 26 @ClassnameFilters({
27   - "org.thingsboard.server.dao.service.*ServiceSqlTest"
  27 + "org.thingsboard.server.dao.service.sql.*SqlTest"
28 28 })
29 29 public class SqlDaoServiceTestSuite {
30 30
31 31 @ClassRule
32 32 public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
33   - Arrays.asList("sql/schema-ts-hsql.sql", "sql/schema-entities-hsql.sql", "sql/schema-entities-idx.sql", "sql/system-data.sql", "sql/system-test.sql"),
  33 + Arrays.asList("sql/schema-ts-hsql.sql", "sql/schema-entities-hsql.sql", "sql/schema-entities-idx.sql"
  34 + , "sql/system-data.sql"
  35 + , "sql/system-test.sql"
  36 + ),
34 37 "sql/hsql/drop-all-tables.sql",
35 38 "sql-test.properties"
36 39 );
37 40
38 41 // @ClassRule
39 42 // public static CustomSqlUnit sqlUnit = new CustomSqlUnit(
40   -// Arrays.asList("sql/schema-ts-psql.sql", "sql/schema-entities.sql", "sql/schema-entities-idx.sql", "sql/system-data.sql", "sql/system-test.sql"),
  43 +// Arrays.asList("sql/schema-ts-psql.sql"
  44 +// , "sql/schema-entities.sql", "sql/schema-entities-idx.sql"
  45 +// , "sql/system-data.sql", "sql/system-test.sql"
  46 +// ),
41 47 // "sql/psql/drop-all-tables.sql",
42 48 // "sql-test.properties"
43 49 // );
... ...
... ... @@ -20,6 +20,7 @@ import com.google.common.util.concurrent.ListenableFuture;
20 20 import org.junit.After;
21 21 import org.junit.Assert;
22 22 import org.junit.Before;
  23 +import org.junit.Ignore;
23 24 import org.junit.Test;
24 25 import org.springframework.beans.factory.annotation.Autowired;
25 26 import org.thingsboard.server.common.data.DataConstants;
... ... @@ -299,6 +300,7 @@ public abstract class BaseEntityServiceTest extends AbstractServiceTest {
299 300 loadedEntities.addAll(data.getData());
300 301 }
301 302 Assert.assertEquals(25, loadedEntities.size());
  303 + loadedEntities.forEach(entity -> Assert.assertTrue(devices.stream().map(Device::getId).collect(Collectors.toSet()).contains(entity.getEntityId())));
302 304 List<String> loadedTemperatures = loadedEntities.stream().map(entityData ->
303 305 entityData.getLatest().get(EntityKeyType.ATTRIBUTE).get("temperature").getValue()).collect(Collectors.toList());
304 306 List<String> deviceTemperatures = temperatures.stream().map(aLong -> Long.toString(aLong)).collect(Collectors.toList());
... ...
... ... @@ -3,7 +3,7 @@ database.ts.type=sql
3 3 sql.ts_inserts_executor_type=fixed
4 4 sql.ts_inserts_fixed_thread_pool_size=200
5 5 sql.ts_key_value_partitioning=MONTHS
6   -
  6 +#
7 7 spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
8 8 spring.jpa.properties.hibernate.order_by.default_null_ordering=last
9 9 spring.jpa.show-sql=false
... ...
... ... @@ -20,3 +20,4 @@ DROP TABLE IF EXISTS widgets_bundle;
20 20 DROP TABLE IF EXISTS rule_node;
21 21 DROP TABLE IF EXISTS rule_chain;
22 22 DROP TABLE IF EXISTS entity_view;
  23 +DROP FUNCTION IF EXISTS to_uuid;
... ...
... ... @@ -17,22 +17,22 @@
17 17 /** SYSTEM **/
18 18
19 19 /** System admin **/
20   -INSERT INTO tb_user ( id, tenant_id, customer_id, email, search_text, authority )
21   -VALUES ( '1e746125a797660a91992ebcb67fe33', '1b21dd2138140008080808080808080', '1b21dd2138140008080808080808080', 'sysadmin@thingsboard.org',
  20 +INSERT INTO tb_user ( id, created_time, tenant_id, customer_id, email, search_text, authority )
  21 +VALUES ( '5a797660-4612-11e7-a919-92ebcb67fe33', 1592576748000, '13814000-1dd2-11b2-8080-808080808080', '13814000-1dd2-11b2-8080-808080808080', 'sysadmin@thingsboard.org',
22 22 'sysadmin@thingsboard.org', 'SYS_ADMIN' );
23 23
24   -INSERT INTO user_credentials ( id, user_id, enabled, password )
25   -VALUES ( '1e7461261441950a91992ebcb67fe33', '1e746125a797660a91992ebcb67fe33', true,
  24 +INSERT INTO user_credentials ( id, created_time, user_id, enabled, password )
  25 +VALUES ( '61441950-4612-11e7-a919-92ebcb67fe33', 1592576748000, '5a797660-4612-11e7-a919-92ebcb67fe33', true,
26 26 '$2a$10$5JTB8/hxWc9WAy62nCGSxeefl3KWmipA9nFpVdDa0/xfIseeBB4Bu' );
27 27
28 28 /** System settings **/
29   -INSERT INTO admin_settings ( id, key, json_value )
30   -VALUES ( '1e746126a2266e4a91992ebcb67fe33', 'general', '{
  29 +INSERT INTO admin_settings ( id, created_time, key, json_value )
  30 +VALUES ( '6a2266e4-4612-11e7-a919-92ebcb67fe33', 1592576748000, 'general', '{
31 31 "baseUrl": "http://localhost:8080"
32 32 }' );
33 33
34   -INSERT INTO admin_settings ( id, key, json_value )
35   -VALUES ( '1e746126eaaefa6a91992ebcb67fe33', 'mail', '{
  34 +INSERT INTO admin_settings ( id, created_time, key, json_value )
  35 +VALUES ( '6eaaefa6-4612-11e7-a919-92ebcb67fe33', 1592576748000, 'mail', '{
36 36 "mailFrom": "Thingsboard <sysadmin@localhost.localdomain>",
37 37 "smtpProtocol": "smtp",
38 38 "smtpHost": "localhost",
... ...