Browse Source

Fix conflicts

pull/3053/head
Igor Kulikov 6 years ago
parent
commit
fa181db5e3
  1. 14
      application/src/main/data/upgrade/2.4.3/schema_update_ttl.sql
  2. 41
      application/src/main/data/upgrade/3.0.1/schema_update_to_uuid.sql
  3. 79
      application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java
  4. 16
      application/src/main/java/org/thingsboard/server/service/telemetry/cmd/v2/EntityDataUpdate.java
  5. 2
      application/src/main/java/org/thingsboard/server/service/ttl/timeseries/PsqlTimeseriesCleanUpService.java
  6. 2
      application/src/main/java/org/thingsboard/server/service/ttl/timeseries/TimescaleTimeseriesCleanUpService.java
  7. 58
      application/src/test/java/org/thingsboard/server/controller/BaseWebsocketApiTest.java
  8. 1
      application/src/test/java/org/thingsboard/server/controller/sql/WebsocketApiSqlTest.java
  9. 8
      common/data/src/main/java/org/thingsboard/server/common/data/page/TimePageLink.java
  10. 15
      common/data/src/test/java/org/thingsboard/server/common/data/UUIDConverterTest.java
  11. 11
      dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java
  12. 1
      dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java
  13. 2
      dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java
  14. 2
      dao/src/main/java/org/thingsboard/server/dao/audit/AuditLogServiceImpl.java
  15. 2
      dao/src/main/java/org/thingsboard/server/dao/audit/DummyAuditLogServiceImpl.java
  16. 1
      dao/src/main/java/org/thingsboard/server/dao/component/BaseComponentDescriptorService.java
  17. 1
      dao/src/main/java/org/thingsboard/server/dao/component/ComponentDescriptorDao.java
  18. 1
      dao/src/main/java/org/thingsboard/server/dao/customer/CustomerDao.java
  19. 1
      dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java
  20. 3
      dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardInfoDao.java
  21. 7
      dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java
  22. 4
      dao/src/main/java/org/thingsboard/server/dao/model/BaseEntity.java
  23. 27
      dao/src/main/java/org/thingsboard/server/dao/model/BaseSqlEntity.java
  24. 3
      dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java
  25. 24
      dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractAlarmEntity.java
  26. 21
      dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractAssetEntity.java
  27. 24
      dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractDeviceEntity.java
  28. 28
      dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractEntityViewEntity.java
  29. 7
      dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java
  30. 5
      dao/src/main/java/org/thingsboard/server/dao/model/sql/AttributeKvCompositeKey.java
  31. 29
      dao/src/main/java/org/thingsboard/server/dao/model/sql/AuditLogEntity.java
  32. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java
  33. 13
      dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java
  34. 11
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java
  35. 11
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java
  36. 11
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceCredentialsEntity.java
  37. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceInfoEntity.java
  38. 19
      dao/src/main/java/org/thingsboard/server/dao/model/sql/EventEntity.java
  39. 10
      dao/src/main/java/org/thingsboard/server/dao/model/sql/RelationCompositeKey.java
  40. 18
      dao/src/main/java/org/thingsboard/server/dao/model/sql/RelationEntity.java
  41. 18
      dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleChainEntity.java
  42. 11
      dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleNodeEntity.java
  43. 4
      dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java
  44. 11
      dao/src/main/java/org/thingsboard/server/dao/model/sql/UserCredentialsEntity.java
  45. 20
      dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java
  46. 11
      dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java
  47. 14
      dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java
  48. 1
      dao/src/main/java/org/thingsboard/server/dao/model/sqlts/latest/TsKvLatestCompositeKey.java
  49. 4
      dao/src/main/java/org/thingsboard/server/dao/model/sqlts/latest/TsKvLatestEntity.java
  50. 4
      dao/src/main/java/org/thingsboard/server/dao/model/sqlts/ts/TsKvEntity.java
  51. 6
      dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraAbstractAsyncDao.java
  52. 1
      dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraBufferedRateExecutor.java
  53. 2
      dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java
  54. 1
      dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java
  55. 1
      dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java
  56. 3
      dao/src/main/java/org/thingsboard/server/dao/service/PaginatedRemover.java
  57. 3
      dao/src/main/java/org/thingsboard/server/dao/service/TimePaginatedRemover.java
  58. 1
      dao/src/main/java/org/thingsboard/server/dao/settings/AdminSettingsServiceImpl.java
  59. 22
      dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java
  60. 1
      dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractSearchTimeDao.java
  61. 25
      dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java
  62. 14
      dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java
  63. 38
      dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java
  64. 40
      dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java
  65. 5
      dao/src/main/java/org/thingsboard/server/dao/sql/attributes/AttributeKvInsertRepository.java
  66. 5
      dao/src/main/java/org/thingsboard/server/dao/sql/attributes/AttributeKvRepository.java
  67. 2
      dao/src/main/java/org/thingsboard/server/dao/sql/attributes/HsqlAttributesInsertRepository.java
  68. 11
      dao/src/main/java/org/thingsboard/server/dao/sql/attributes/JpaAttributeDao.java
  69. 17
      dao/src/main/java/org/thingsboard/server/dao/sql/audit/AuditLogRepository.java
  70. 17
      dao/src/main/java/org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java
  71. 4
      dao/src/main/java/org/thingsboard/server/dao/sql/component/AbstractComponentDescriptorInsertRepository.java
  72. 5
      dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java
  73. 27
      dao/src/main/java/org/thingsboard/server/dao/sql/component/HsqlComponentDescriptorInsertRepository.java
  74. 10
      dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java
  75. 5
      dao/src/main/java/org/thingsboard/server/dao/sql/component/PsqlComponentDescriptorInsertRepository.java
  76. 9
      dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java
  77. 7
      dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java
  78. 11
      dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java
  79. 4
      dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardRepository.java
  80. 4
      dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardDao.java
  81. 7
      dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java
  82. 6
      dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceCredentialsRepository.java
  83. 39
      dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java
  84. 5
      dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceCredentialsDao.java
  85. 42
      dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java
  86. 36
      dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java
  87. 41
      dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java
  88. 4
      dao/src/main/java/org/thingsboard/server/dao/sql/event/AbstractEventInsertRepository.java
  89. 39
      dao/src/main/java/org/thingsboard/server/dao/sql/event/EventRepository.java
  90. 23
      dao/src/main/java/org/thingsboard/server/dao/sql/event/HsqlEventInsertRepository.java
  91. 59
      dao/src/main/java/org/thingsboard/server/dao/sql/event/JpaBaseEventDao.java
  92. 8
      dao/src/main/java/org/thingsboard/server/dao/sql/event/PsqlEventInsertRepository.java
  93. 157
      dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java
  94. 22
      dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityDataAdapter.java
  95. 115
      dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityKeyMapping.java
  96. 122
      dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityQueryContext.java
  97. 22
      dao/src/main/java/org/thingsboard/server/dao/sql/relation/HsqlRelationInsertRepository.java
  98. 37
      dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java
  99. 13
      dao/src/main/java/org/thingsboard/server/dao/sql/relation/RelationRepository.java
  100. 7
      dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java

14
application/src/main/data/upgrade/2.4.3/schema_update_ttl.sql

@ -22,37 +22,37 @@ BEGIN
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION delete_device_records_from_ts_kv(tenant_id varchar, customer_id varchar, ttl bigint,
CREATE OR REPLACE FUNCTION delete_device_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint,
OUT deleted bigint) AS
$$
BEGIN
EXECUTE format(
'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',
'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',
tenant_id, customer_id, ttl) into deleted;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION delete_asset_records_from_ts_kv(tenant_id varchar, customer_id varchar, ttl bigint,
CREATE OR REPLACE FUNCTION delete_asset_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint,
OUT deleted bigint) AS
$$
BEGIN
EXECUTE format(
'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',
'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',
tenant_id, customer_id, ttl) into deleted;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION delete_customer_records_from_ts_kv(tenant_id varchar, customer_id varchar, ttl bigint,
CREATE OR REPLACE FUNCTION delete_customer_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint,
OUT deleted bigint) AS
$$
BEGIN
EXECUTE format(
'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',
'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',
tenant_id, customer_id, ttl) into deleted;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE PROCEDURE cleanup_timeseries_by_ttl(IN null_uuid varchar(31),
CREATE OR REPLACE PROCEDURE cleanup_timeseries_by_ttl(IN null_uuid uuid,
IN system_ttl bigint, INOUT deleted bigint)
LANGUAGE plpgsql AS
$$

41
application/src/main/data/upgrade/3.0.1/schema_update_to_uuid.sql

@ -0,0 +1,41 @@
--
-- Copyright © 2016-2020 The Thingsboard Authors
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
CREATE OR REPLACE FUNCTION extract_ts(uuid UUID) RETURNS BIGINT AS
$$
DECLARE
bytes bytea;
BEGIN
bytes := uuid_send(uuid);
RETURN
(
(
(get_byte(bytes, 0)::bigint << 24) |
(get_byte(bytes, 1)::bigint << 16) |
(get_byte(bytes, 2)::bigint << 8) |
(get_byte(bytes, 3)::bigint << 0)
) + (
((get_byte(bytes, 4)::bigint << 8 |
get_byte(bytes, 5)::bigint)) << 32
) + (
(((get_byte(bytes, 6)::bigint & 15) << 8 | get_byte(bytes, 7)::bigint) & 4095) << 48
) - 122192928000000000
) / 10000::double precision
;
END
$$ LANGUAGE plpgsql
IMMUTABLE PARALLEL SAFE
RETURNS NULL ON NULL INPUT;

79
application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java

@ -15,10 +15,14 @@
*/
package org.thingsboard.server.service.subscription;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
@ -33,6 +37,8 @@ import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.query.EntityData;
import org.thingsboard.server.common.data.query.EntityDataQuery;
import org.thingsboard.server.common.data.query.EntityKey;
import org.thingsboard.server.common.data.query.EntityKeyType;
import org.thingsboard.server.common.data.query.TsValue;
import org.thingsboard.server.common.msg.queue.ServiceType;
import org.thingsboard.server.common.msg.queue.TbCallback;
@ -53,6 +59,7 @@ import org.thingsboard.server.service.telemetry.cmd.v2.EntityDataUpdate;
import org.thingsboard.server.service.telemetry.cmd.v2.EntityHistoryCmd;
import org.thingsboard.server.service.telemetry.cmd.v2.LatestValueCmd;
import org.thingsboard.server.service.telemetry.cmd.v2.TimeSeriesCmd;
import org.thingsboard.server.service.telemetry.sub.SubscriptionErrorCode;
import org.thingsboard.server.service.telemetry.sub.SubscriptionUpdate;
import javax.annotation.PostConstruct;
@ -60,6 +67,7 @@ import javax.annotation.PreDestroy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ -67,7 +75,6 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.function.Function;
import java.util.stream.Collectors;
@Slf4j
@ -101,11 +108,16 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc
@Autowired
private TimeseriesService tsService;
@Value("${database.ts.type}")
private String databaseTsType;
private ExecutorService wsCallBackExecutor;
private boolean tsInSqlDB;
@PostConstruct
public void initExecutor() {
wsCallBackExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("ws-entity-sub-callback"));
tsInSqlDB = databaseTsType.equalsIgnoreCase("sql") || databaseTsType.equalsIgnoreCase("timescale");
}
@PreDestroy
@ -156,7 +168,70 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc
}
private void handleLatestCmd(TelemetryWebSocketSessionRef session, int cmdId, EntityDataQuery query, LatestValueCmd latestCmd) {
TenantId tenantId = session.getSecurityCtx().getTenantId();
CustomerId customerId = session.getSecurityCtx().getCustomerId();
//Step 1. Update existing query with the contents of LatestValueCmd
latestCmd.getKeys().forEach(key -> {
if (!query.getLatestValues().contains(key)) {
query.getLatestValues().add(key);
}
});
//Step 2. Fetch the initial data
PageData<EntityData> data = entityService.findEntityDataByQuery(tenantId, customerId, query);
//Step 3. Fetch the latest values for telemetry keys (in case they are not copied from NoSQL to SQL DB in hybrid mode.
if (!tsInSqlDB) {
List<String> allTsKeys = latestCmd.getKeys().stream()
.filter(key -> key.getType().equals(EntityKeyType.TIME_SERIES))
.map(EntityKey::getKey).collect(Collectors.toList());
Map<EntityData, ListenableFuture<Map<String, TsValue>>> missingTelemetryFurutes = new HashMap<>();
for (EntityData entityData : data.getData()) {
Map<EntityKeyType, Map<String, TsValue>> latestEntityData = entityData.getLatest();
Map<String, TsValue> tsEntityData = latestEntityData.get(EntityKeyType.TIME_SERIES);
Set<String> missingTsKeys = new LinkedHashSet<>(allTsKeys);
if (tsEntityData != null) {
missingTsKeys.removeAll(tsEntityData.keySet());
} else {
tsEntityData = new HashMap<>();
latestEntityData.put(EntityKeyType.TIME_SERIES, tsEntityData);
}
ListenableFuture<List<TsKvEntry>> missingTsData = tsService.findLatest(tenantId, entityData.getEntityId(), missingTsKeys);
missingTelemetryFurutes.put(entityData, Futures.transform(missingTsData, this::toTsValue, MoreExecutors.directExecutor()));
}
Futures.addCallback(Futures.allAsList(missingTelemetryFurutes.values()), new FutureCallback<List<Map<String, TsValue>>>() {
@Override
public void onSuccess(@Nullable List<Map<String, TsValue>> result) {
missingTelemetryFurutes.forEach((key, value) -> {
try {
key.getLatest().get(EntityKeyType.TIME_SERIES).putAll(value.get());
} catch (InterruptedException | ExecutionException e) {
log.warn("[{}][{}] Failed to lookup latest telemetry: {}:{}", session.getSessionId(), cmdId, key.getEntityId(), allTsKeys, e);
}
});
EntityDataUpdate update = new EntityDataUpdate(cmdId, data, null);
wsService.sendWsMsg(session.getSessionId(), update);
//TODO: create context for this (session, cmdId) that contains query, latestCmd and update. Subscribe + periodic updates.
}
@Override
public void onFailure(Throwable t) {
log.warn("[{}][{}] Failed to process websocket command: {}:{}", session.getSessionId(), cmdId, query, latestCmd, t);
wsService.sendWsMsg(session.getSessionId(),
new EntityDataUpdate(cmdId, SubscriptionErrorCode.INTERNAL_ERROR.getCode(), "Failed to process websocket command!"));
}
}, wsCallBackExecutor);
} else {
EntityDataUpdate update = new EntityDataUpdate(cmdId, data, null);
wsService.sendWsMsg(session.getSessionId(), update);
//TODO: create context for this (session, cmdId) that contains query, latestCmd and update. Subscribe + periodic updates.
}
}
private Map<String, TsValue> toTsValue(List<TsKvEntry> data) {
return data.stream().collect(Collectors.toMap(TsKvEntry::getKey, value -> new TsValue(value.getTs(), value.getValueAsString())));
}
private void handleHistoryCmd(TelemetryWebSocketSessionRef session, int cmdId, EntityDataQuery query, EntityHistoryCmd historyCmd) {
@ -181,6 +256,8 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc
keyData.forEach((k, v) -> entityData.getTimeseries().put(k, v.toArray(new TsValue[v.size()])));
} catch (InterruptedException | ExecutionException e) {
log.warn("[{}][{}][{}] Failed to fetch historical data", session.getSessionId(), cmdId, entityData.getEntityId(), e);
wsService.sendWsMsg(session.getSessionId(),
new EntityDataUpdate(cmdId, SubscriptionErrorCode.INTERNAL_ERROR.getCode(), "Failed to fetch historical data!"));
}
});
EntityDataUpdate update = new EntityDataUpdate(cmdId, data, null);

16
application/src/main/java/org/thingsboard/server/service/telemetry/cmd/v2/EntityDataUpdate.java

@ -15,18 +15,30 @@
*/
package org.thingsboard.server.service.telemetry.cmd.v2;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.query.EntityData;
import org.thingsboard.server.service.telemetry.sub.SubscriptionErrorCode;
import java.util.List;
@Data
@AllArgsConstructor
public class EntityDataUpdate {
private final int cmdId;
private final PageData<EntityData> data;
private final List<EntityData> update;
private int errorCode;
private String errorMsg;
private final int errorCode;
private final String errorMsg;
public EntityDataUpdate(int cmdId, PageData<EntityData> data, List<EntityData> update) {
this(cmdId, data, update, SubscriptionErrorCode.NO_ERROR.getCode(), null);
}
public EntityDataUpdate(int cmdId, int errorCode, String errorMsg) {
this(cmdId, null, null, errorCode, errorMsg);
}
}

2
application/src/main/java/org/thingsboard/server/service/ttl/timeseries/PsqlTimeseriesCleanUpService.java

@ -35,7 +35,7 @@ public class PsqlTimeseriesCleanUpService extends AbstractTimeseriesCleanUpServi
protected void doCleanUp(Connection connection) {
long totalPartitionsRemoved = executeQuery(connection, "call drop_partitions_by_max_ttl('" + partitionType + "'," + systemTtl + ", 0);");
log.info("Total partitions removed by TTL: [{}]", totalPartitionsRemoved);
long totalEntitiesTelemetryRemoved = executeQuery(connection, "call cleanup_timeseries_by_ttl('" + ModelConstants.NULL_UUID_STR + "'," + systemTtl + ", 0);");
long totalEntitiesTelemetryRemoved = executeQuery(connection, "call cleanup_timeseries_by_ttl('" + ModelConstants.NULL_UUID + "'," + systemTtl + ", 0);");
log.info("Total telemetry removed stats by TTL for entities: [{}]", totalEntitiesTelemetryRemoved);
}
}

2
application/src/main/java/org/thingsboard/server/service/ttl/timeseries/TimescaleTimeseriesCleanUpService.java

@ -29,7 +29,7 @@ public class TimescaleTimeseriesCleanUpService extends AbstractTimeseriesCleanUp
@Override
protected void doCleanUp(Connection connection) {
long totalEntitiesTelemetryRemoved = executeQuery(connection, "call cleanup_timeseries_by_ttl('" + ModelConstants.NULL_UUID_STR + "'," + systemTtl + ", 0);");
long totalEntitiesTelemetryRemoved = executeQuery(connection, "call cleanup_timeseries_by_ttl('" + ModelConstants.NULL_UUID + "'," + systemTtl + ", 0);");
log.info("Total telemetry removed stats by TTL for entities: [{}]", totalEntitiesTelemetryRemoved);
}
}

58
application/src/test/java/org/thingsboard/server/controller/BaseWebsocketApiTest.java

@ -18,6 +18,7 @@ package org.thingsboard.server.controller;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.Device;
@ -32,6 +33,8 @@ import org.thingsboard.server.common.data.query.DeviceTypeFilter;
import org.thingsboard.server.common.data.query.EntityData;
import org.thingsboard.server.common.data.query.EntityDataPageLink;
import org.thingsboard.server.common.data.query.EntityDataQuery;
import org.thingsboard.server.common.data.query.EntityKey;
import org.thingsboard.server.common.data.query.EntityKeyType;
import org.thingsboard.server.common.data.query.TsValue;
import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.dao.timeseries.TimeseriesService;
@ -39,6 +42,7 @@ import org.thingsboard.server.service.telemetry.cmd.TelemetryPluginCmdsWrapper;
import org.thingsboard.server.service.telemetry.cmd.v2.EntityDataCmd;
import org.thingsboard.server.service.telemetry.cmd.v2.EntityDataUpdate;
import org.thingsboard.server.service.telemetry.cmd.v2.EntityHistoryCmd;
import org.thingsboard.server.service.telemetry.cmd.v2.LatestValueCmd;
import java.util.Arrays;
import java.util.Collections;
@ -142,4 +146,58 @@ public class BaseWebsocketApiTest extends AbstractWebsocketTest {
Assert.assertEquals(new TsValue(dataPoint3.getTs(), dataPoint3.getValueAsString()), tsArray[2]);
}
@Test
@Ignore
public void testEntityDataLatestWsCmd() throws Exception {
Device device = new Device();
device.setName("Device");
device.setType("default");
device.setLabel("testLabel" + (int) (Math.random() * 1000));
device = doPost("/api/device", device, Device.class);
long now = System.currentTimeMillis();
DeviceTypeFilter dtf = new DeviceTypeFilter();
dtf.setDeviceNameFilter("D");
dtf.setDeviceType("default");
EntityDataQuery edq = new EntityDataQuery(dtf, new EntityDataPageLink(1, 0, null, null), Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
LatestValueCmd latestCmd = new LatestValueCmd();
latestCmd.setKeys(Collections.singletonList(new EntityKey(EntityKeyType.TIME_SERIES, "temperature")));
EntityDataCmd cmd = new EntityDataCmd(1, edq, null, latestCmd, null);
TelemetryPluginCmdsWrapper wrapper = new TelemetryPluginCmdsWrapper();
wrapper.setEntityDataCmds(Collections.singletonList(cmd));
wsClient.send(mapper.writeValueAsString(wrapper));
String msg = wsClient.waitForReply();
EntityDataUpdate update = mapper.readValue(msg, EntityDataUpdate.class);
Assert.assertEquals(1, update.getCmdId());
PageData<EntityData> pageData = update.getData();
Assert.assertNotNull(pageData);
Assert.assertEquals(1, pageData.getData().size());
Assert.assertEquals(device.getId(), pageData.getData().get(0).getEntityId());
Assert.assertNull(pageData.getData().get(0).getLatest().get(EntityKeyType.TIME_SERIES).get("temperature"));
TsKvEntry dataPoint1 = new BasicTsKvEntry(now - TimeUnit.MINUTES.toMillis(1), new LongDataEntry("temperature", 42L));
tsService.save(device.getTenantId(), device.getId(), Arrays.asList(dataPoint1), 0).get();
cmd = new EntityDataCmd(2, edq, null, latestCmd, null);
wrapper = new TelemetryPluginCmdsWrapper();
wrapper.setEntityDataCmds(Collections.singletonList(cmd));
wsClient.send(mapper.writeValueAsString(wrapper));
msg = wsClient.waitForReply();
update = mapper.readValue(msg, EntityDataUpdate.class);
Assert.assertEquals(2, update.getCmdId());
pageData = update.getData();
Assert.assertNotNull(pageData);
Assert.assertEquals(1, pageData.getData().size());
Assert.assertEquals(device.getId(), pageData.getData().get(0).getEntityId());
Assert.assertNotNull(pageData.getData().get(0).getLatest().get(EntityKeyType.TIME_SERIES));
TsValue tsValue = pageData.getData().get(0).getLatest().get(EntityKeyType.TIME_SERIES).get("temperature");
Assert.assertEquals(new TsValue(dataPoint1.getTs(), dataPoint1.getValueAsString()), tsValue);
}
}

1
application/src/test/java/org/thingsboard/server/controller/sql/WebsocketApiSqlTest.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.controller.sql;
import org.thingsboard.server.controller.BaseEntityQueryControllerTest;
import org.thingsboard.server.controller.BaseWebsocketApiTest;
import org.thingsboard.server.dao.service.DaoSqlTest;

8
common/data/src/main/java/org/thingsboard/server/common/data/page/TimePageLink.java

@ -15,16 +15,8 @@
*/
package org.thingsboard.server.common.data.page;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.Getter;
import lombok.ToString;
import java.io.Serializable;
import java.util.Arrays;
import java.util.UUID;
@Data
public class TimePageLink extends PageLink {

15
common/data/src/test/java/org/thingsboard/server/common/data/UUIDConverterTest.java

@ -21,8 +21,11 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* Created by ashvayka on 14.07.17.
@ -37,6 +40,18 @@ public class UUIDConverterTest {
Assert.assertEquals("1d8eebc58e0a7d796690800200c9a66", result);
}
@Test
public void basicUuid() {
System.out.println(UUIDConverter.fromString("1e746126eaaefa6a91992ebcb67fe33"));
}
@Test
public void basicUuidConversion() {
UUID original = UUID.fromString("3dd11790-abf2-11ea-b151-83a091b9d4cc");
Assert.assertEquals(Uuids.unixTimestamp(original), 1591886749577L);
}
@Test
public void basicStringToUUIDTest() {
UUID result = UUIDConverter.fromString("1d8eebc58e0a7d796690800200c9a66");

11
dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java

@ -27,7 +27,13 @@ import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.page.SortOrder;
import org.thingsboard.server.dao.model.ToData;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
public abstract class DaoUtil {
@ -77,9 +83,6 @@ public abstract class DaoUtil {
if (columnMap.containsKey(property)) {
property = columnMap.get(property);
}
if (property.equals("createdTime")) {
property = "id";
}
return Sort.by(Sort.Direction.fromString(sortOrder.getDirection().name()), property);
}
}

1
dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java

@ -24,7 +24,6 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.dao.Dao;
import java.util.List;
import java.util.UUID;
/**

2
dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java

@ -29,12 +29,12 @@ import org.springframework.util.StringUtils;
import org.thingsboard.common.util.ThingsBoardThreadFactory;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.alarm.Alarm;
import org.thingsboard.server.common.data.id.AlarmId;
import org.thingsboard.server.common.data.alarm.AlarmInfo;
import org.thingsboard.server.common.data.alarm.AlarmQuery;
import org.thingsboard.server.common.data.alarm.AlarmSearchStatus;
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
import org.thingsboard.server.common.data.alarm.AlarmStatus;
import org.thingsboard.server.common.data.id.AlarmId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;

2
dao/src/main/java/org/thingsboard/server/dao/audit/AuditLogServiceImpl.java

@ -28,7 +28,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.thingsboard.server.common.data.BaseData;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.HasName;
import org.thingsboard.server.common.data.audit.ActionStatus;
@ -38,7 +37,6 @@ import org.thingsboard.server.common.data.id.AuditLogId;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.UUIDBased;
import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
import org.thingsboard.server.common.data.page.PageData;

2
dao/src/main/java/org/thingsboard/server/dao/audit/DummyAuditLogServiceImpl.java

@ -18,14 +18,12 @@ package org.thingsboard.server.dao.audit;
import com.google.common.util.concurrent.ListenableFuture;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.BaseData;
import org.thingsboard.server.common.data.HasName;
import org.thingsboard.server.common.data.audit.ActionType;
import org.thingsboard.server.common.data.audit.AuditLog;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.UUIDBased;
import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.TimePageLink;

1
dao/src/main/java/org/thingsboard/server/dao/component/BaseComponentDescriptorService.java

@ -37,7 +37,6 @@ import org.thingsboard.server.dao.exception.IncorrectParameterException;
import org.thingsboard.server.dao.service.DataValidator;
import org.thingsboard.server.dao.service.Validator;
import java.util.List;
import java.util.Optional;
/**

1
dao/src/main/java/org/thingsboard/server/dao/component/ComponentDescriptorDao.java

@ -24,7 +24,6 @@ import org.thingsboard.server.common.data.plugin.ComponentScope;
import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.dao.Dao;
import java.util.List;
import java.util.Optional;
/**

1
dao/src/main/java/org/thingsboard/server/dao/customer/CustomerDao.java

@ -21,7 +21,6 @@ import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.dao.Dao;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

1
dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java

@ -42,7 +42,6 @@ import org.thingsboard.server.dao.tenant.TenantDao;
import org.thingsboard.server.dao.user.UserService;
import java.io.IOException;
import java.util.List;
import java.util.Optional;
import static org.thingsboard.server.dao.service.Validator.validateId;

3
dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardInfoDao.java

@ -15,14 +15,11 @@
*/
package org.thingsboard.server.dao.dashboard;
import com.google.common.util.concurrent.ListenableFuture;
import org.thingsboard.server.common.data.DashboardInfo;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.page.TimePageLink;
import org.thingsboard.server.dao.Dao;
import java.util.List;
import java.util.UUID;
/**

7
dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java

@ -29,7 +29,12 @@ import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.*;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.EntitySubtype;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.EntityView;
import org.thingsboard.server.common.data.EntityViewInfo;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.entityview.EntityViewSearchQuery;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EntityId;

4
dao/src/main/java/org/thingsboard/server/dao/model/BaseEntity.java

@ -23,4 +23,8 @@ public interface BaseEntity<D> extends ToData<D> {
void setUuid(UUID id);
long getCreatedTime();
void setCreatedTime(long createdTime);
}

27
dao/src/main/java/org/thingsboard/server/dao/model/BaseSqlEntity.java

@ -16,7 +16,6 @@
package org.thingsboard.server.dao.model;
import lombok.Data;
import org.thingsboard.server.common.data.UUIDConverter;
import javax.persistence.Column;
import javax.persistence.Id;
@ -31,28 +30,30 @@ import java.util.UUID;
public abstract class BaseSqlEntity<D> implements BaseEntity<D> {
@Id
@Column(name = ModelConstants.ID_PROPERTY)
protected String id;
@Column(name = ModelConstants.ID_PROPERTY, columnDefinition = "uuid")
protected UUID id;
@Column(name = ModelConstants.CREATED_TIME_PROPERTY)
protected long createdTime;
@Override
public UUID getUuid() {
if (id == null) {
return null;
}
return UUIDConverter.fromString(id);
return id;
}
@Override
public void setUuid(UUID id) {
this.id = UUIDConverter.fromTimeUUID(id);
this.id = id;
}
protected UUID toUUID(String src){
return UUIDConverter.fromString(src);
@Override
public long getCreatedTime() {
return createdTime;
}
protected String toString(UUID timeUUID){
return UUIDConverter.fromTimeUUID(timeUUID);
public void setCreatedTime(long createdTime) {
if (createdTime > 0) {
this.createdTime = createdTime;
}
}
}

3
dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java

@ -17,7 +17,6 @@ package org.thingsboard.server.dao.model;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import org.apache.commons.lang3.ArrayUtils;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.kv.Aggregation;
@ -29,7 +28,6 @@ public class ModelConstants {
}
public static final UUID NULL_UUID = Uuids.startOf(0);
public static final String NULL_UUID_STR = UUIDConverter.fromTimeUUID(NULL_UUID);
public static final TenantId SYSTEM_TENANT = new TenantId(ModelConstants.NULL_UUID);
// 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 {
* Generic constants.
*/
public static final String ID_PROPERTY = "id";
public static final String CREATED_TIME_PROPERTY = "created_time";
public static final String USER_ID_PROPERTY = "user_id";
public static final String TENANT_ID_PROPERTY = "tenant_id";
public static final String CUSTOMER_ID_PROPERTY = "customer_id";

24
dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractAlarmEntity.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -24,11 +23,10 @@ import org.hibernate.annotations.TypeDef;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.alarm.Alarm;
import org.thingsboard.server.common.data.id.AlarmId;
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
import org.thingsboard.server.common.data.alarm.AlarmStatus;
import org.thingsboard.server.common.data.id.AlarmId;
import org.thingsboard.server.common.data.id.EntityIdFactory;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.model.BaseEntity;
@ -42,6 +40,7 @@ import javax.persistence.Enumerated;
import javax.persistence.MappedSuperclass;
import java.util.Arrays;
import java.util.Collections;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.ALARM_ACK_TS_PROPERTY;
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
public abstract class AbstractAlarmEntity<T extends Alarm> extends BaseSqlEntity<T> implements BaseEntity<T> {
@Column(name = ALARM_TENANT_ID_PROPERTY)
private String tenantId;
private UUID tenantId;
@Column(name = ALARM_ORIGINATOR_ID_PROPERTY)
private String originatorId;
private UUID originatorId;
@Column(name = ALARM_ORIGINATOR_TYPE_PROPERTY)
private EntityType originatorType;
@ -110,13 +109,14 @@ public abstract class AbstractAlarmEntity<T extends Alarm> extends BaseSqlEntity
public AbstractAlarmEntity(Alarm alarm) {
if (alarm.getId() != null) {
this.setUuid(alarm.getId().getId());
this.setUuid(alarm.getUuidId());
}
this.setCreatedTime(alarm.getCreatedTime());
if (alarm.getTenantId() != null) {
this.tenantId = UUIDConverter.fromTimeUUID(alarm.getTenantId().getId());
this.tenantId = alarm.getTenantId().getId();
}
this.type = alarm.getType();
this.originatorId = UUIDConverter.fromTimeUUID(alarm.getOriginator().getId());
this.originatorId = alarm.getOriginator().getId();
this.originatorType = alarm.getOriginator().getEntityType();
this.type = alarm.getType();
this.severity = alarm.getSeverity();
@ -153,12 +153,12 @@ public abstract class AbstractAlarmEntity<T extends Alarm> extends BaseSqlEntity
}
protected Alarm toAlarm() {
Alarm alarm = new Alarm(new AlarmId(UUIDConverter.fromString(id)));
alarm.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id)));
Alarm alarm = new Alarm(new AlarmId(id));
alarm.setCreatedTime(createdTime);
if (tenantId != null) {
alarm.setTenantId(new TenantId(UUIDConverter.fromString(tenantId)));
alarm.setTenantId(new TenantId(tenantId));
}
alarm.setOriginator(EntityIdFactory.getByTypeAndUuid(originatorType, UUIDConverter.fromString(originatorId)));
alarm.setOriginator(EntityIdFactory.getByTypeAndUuid(originatorType, originatorId));
alarm.setType(type);
alarm.setSeverity(severity);
alarm.setStatus(status);

21
dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractAssetEntity.java

@ -15,13 +15,11 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.id.AssetId;
import org.thingsboard.server.common.data.id.CustomerId;
@ -33,6 +31,7 @@ import org.thingsboard.server.dao.util.mapping.JsonStringType;
import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.ASSET_CUSTOMER_ID_PROPERTY;
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
public abstract class AbstractAssetEntity<T extends Asset> extends BaseSqlEntity<T> implements SearchTextEntity<T> {
@Column(name = ASSET_TENANT_ID_PROPERTY)
private String tenantId;
private UUID tenantId;
@Column(name = ASSET_CUSTOMER_ID_PROPERTY)
private String customerId;
private UUID customerId;
@Column(name = ASSET_NAME_PROPERTY)
private String name;
@ -77,11 +76,12 @@ public abstract class AbstractAssetEntity<T extends Asset> extends BaseSqlEntity
if (asset.getId() != null) {
this.setUuid(asset.getId().getId());
}
this.setCreatedTime(asset.getCreatedTime());
if (asset.getTenantId() != null) {
this.tenantId = UUIDConverter.fromTimeUUID(asset.getTenantId().getId());
this.tenantId = asset.getTenantId().getId();
}
if (asset.getCustomerId() != null) {
this.customerId = UUIDConverter.fromTimeUUID(asset.getCustomerId().getId());
this.customerId = asset.getCustomerId().getId();
}
this.name = asset.getName();
this.type = asset.getType();
@ -91,6 +91,7 @@ public abstract class AbstractAssetEntity<T extends Asset> extends BaseSqlEntity
public AbstractAssetEntity(AssetEntity assetEntity) {
this.setId(assetEntity.getId());
this.setCreatedTime(assetEntity.getCreatedTime());
this.tenantId = assetEntity.getTenantId();
this.customerId = assetEntity.getCustomerId();
this.type = assetEntity.getType();
@ -115,13 +116,13 @@ public abstract class AbstractAssetEntity<T extends Asset> extends BaseSqlEntity
}
protected Asset toAsset() {
Asset asset = new Asset(new AssetId(UUIDConverter.fromString(id)));
asset.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id)));
Asset asset = new Asset(new AssetId(id));
asset.setCreatedTime(createdTime);
if (tenantId != null) {
asset.setTenantId(new TenantId(UUIDConverter.fromString(tenantId)));
asset.setTenantId(new TenantId(tenantId));
}
if (customerId != null) {
asset.setCustomerId(new CustomerId(UUIDConverter.fromString(customerId)));
asset.setCustomerId(new CustomerId(customerId));
}
asset.setName(name);
asset.setType(type);

24
dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractDeviceEntity.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -32,6 +31,7 @@ import org.thingsboard.server.dao.util.mapping.JsonStringType;
import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import java.util.UUID;
@Data
@EqualsAndHashCode(callSuper = true)
@ -39,11 +39,11 @@ import javax.persistence.MappedSuperclass;
@MappedSuperclass
public abstract class AbstractDeviceEntity<T extends Device> extends BaseSqlEntity<T> implements SearchTextEntity<T> {
@Column(name = ModelConstants.DEVICE_TENANT_ID_PROPERTY)
private String tenantId;
@Column(name = ModelConstants.DEVICE_TENANT_ID_PROPERTY, columnDefinition = "uuid")
private UUID tenantId;
@Column(name = ModelConstants.DEVICE_CUSTOMER_ID_PROPERTY)
private String customerId;
@Column(name = ModelConstants.DEVICE_CUSTOMER_ID_PROPERTY, columnDefinition = "uuid")
private UUID customerId;
@Column(name = ModelConstants.DEVICE_TYPE_PROPERTY)
private String type;
@ -67,13 +67,14 @@ public abstract class AbstractDeviceEntity<T extends Device> extends BaseSqlEnti
public AbstractDeviceEntity(Device device) {
if (device.getId() != null) {
this.setUuid(device.getId().getId());
this.setUuid(device.getUuidId());
}
this.setCreatedTime(device.getCreatedTime());
if (device.getTenantId() != null) {
this.tenantId = toString(device.getTenantId().getId());
this.tenantId = device.getTenantId().getId();
}
if (device.getCustomerId() != null) {
this.customerId = toString(device.getCustomerId().getId());
this.customerId = device.getCustomerId().getId();
}
this.name = device.getName();
this.type = device.getType();
@ -83,6 +84,7 @@ public abstract class AbstractDeviceEntity<T extends Device> extends BaseSqlEnti
public AbstractDeviceEntity(DeviceEntity deviceEntity) {
this.setId(deviceEntity.getId());
this.setCreatedTime(deviceEntity.getCreatedTime());
this.tenantId = deviceEntity.getTenantId();
this.customerId = deviceEntity.getCustomerId();
this.type = deviceEntity.getType();
@ -104,12 +106,12 @@ public abstract class AbstractDeviceEntity<T extends Device> extends BaseSqlEnti
protected Device toDevice() {
Device device = new Device(new DeviceId(getUuid()));
device.setCreatedTime(Uuids.unixTimestamp(getUuid()));
device.setCreatedTime(createdTime);
if (tenantId != null) {
device.setTenantId(new TenantId(toUUID(tenantId)));
device.setTenantId(new TenantId(tenantId));
}
if (customerId != null) {
device.setCustomerId(new CustomerId(toUUID(customerId)));
device.setCustomerId(new CustomerId(customerId));
}
device.setName(name);
device.setType(type);

28
dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractEntityViewEntity.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
@ -35,7 +34,10 @@ import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity;
import org.thingsboard.server.dao.util.mapping.JsonStringType;
import javax.persistence.*;
import javax.persistence.Column;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.MappedSuperclass;
import java.io.IOException;
import java.util.UUID;
@ -53,17 +55,17 @@ import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_TYPE_PROPER
public abstract class AbstractEntityViewEntity<T extends EntityView> extends BaseSqlEntity<T> implements SearchTextEntity<T> {
@Column(name = ModelConstants.ENTITY_VIEW_ENTITY_ID_PROPERTY)
private String entityId;
private UUID entityId;
@Enumerated(EnumType.STRING)
@Column(name = ENTITY_TYPE_PROPERTY)
private EntityType entityType;
@Column(name = ModelConstants.ENTITY_VIEW_TENANT_ID_PROPERTY)
private String tenantId;
private UUID tenantId;
@Column(name = ModelConstants.ENTITY_VIEW_CUSTOMER_ID_PROPERTY)
private String customerId;
private UUID customerId;
@Column(name = ModelConstants.DEVICE_TYPE_PROPERTY)
private String type;
@ -97,15 +99,16 @@ public abstract class AbstractEntityViewEntity<T extends EntityView> extends Bas
if (entityView.getId() != null) {
this.setUuid(entityView.getId().getId());
}
this.setCreatedTime(entityView.getCreatedTime());
if (entityView.getEntityId() != null) {
this.entityId = toString(entityView.getEntityId().getId());
this.entityId = entityView.getEntityId().getId();
this.entityType = entityView.getEntityId().getEntityType();
}
if (entityView.getTenantId() != null) {
this.tenantId = toString(entityView.getTenantId().getId());
this.tenantId = entityView.getTenantId().getId();
}
if (entityView.getCustomerId() != null) {
this.customerId = toString(entityView.getCustomerId().getId());
this.customerId = entityView.getCustomerId().getId();
}
this.type = entityView.getType();
this.name = entityView.getName();
@ -122,6 +125,7 @@ public abstract class AbstractEntityViewEntity<T extends EntityView> extends Bas
public AbstractEntityViewEntity(EntityViewEntity entityViewEntity) {
this.setId(entityViewEntity.getId());
this.setCreatedTime(entityViewEntity.getCreatedTime());
this.entityId = entityViewEntity.getEntityId();
this.entityType = entityViewEntity.getEntityType();
this.tenantId = entityViewEntity.getTenantId();
@ -147,16 +151,16 @@ public abstract class AbstractEntityViewEntity<T extends EntityView> extends Bas
protected EntityView toEntityView() {
EntityView entityView = new EntityView(new EntityViewId(getUuid()));
entityView.setCreatedTime(Uuids.unixTimestamp(getUuid()));
entityView.setCreatedTime(createdTime);
if (entityId != null) {
entityView.setEntityId(EntityIdFactory.getByTypeAndId(entityType.name(), toUUID(entityId).toString()));
entityView.setEntityId(EntityIdFactory.getByTypeAndUuid(entityType.name(), entityId));
}
if (tenantId != null) {
entityView.setTenantId(new TenantId(toUUID(tenantId)));
entityView.setTenantId(new TenantId(tenantId));
}
if (customerId != null) {
entityView.setCustomerId(new CustomerId(toUUID(customerId)));
entityView.setCustomerId(new CustomerId(customerId));
}
entityView.setType(type);
entityView.setName(name);

7
dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java

@ -15,14 +15,12 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.id.AdminSettingsId;
import org.thingsboard.server.dao.model.BaseEntity;
import org.thingsboard.server.dao.model.BaseSqlEntity;
@ -58,14 +56,15 @@ public final class AdminSettingsEntity extends BaseSqlEntity<AdminSettings> impl
if (adminSettings.getId() != null) {
this.setUuid(adminSettings.getId().getId());
}
this.setCreatedTime(adminSettings.getCreatedTime());
this.key = adminSettings.getKey();
this.jsonValue = adminSettings.getJsonValue();
}
@Override
public AdminSettings toData() {
AdminSettings adminSettings = new AdminSettings(new AdminSettingsId(UUIDConverter.fromString(id)));
adminSettings.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id)));
AdminSettings adminSettings = new AdminSettings(new AdminSettingsId(id));
adminSettings.setCreatedTime(createdTime);
adminSettings.setKey(key);
adminSettings.setJsonValue(jsonValue);
return adminSettings;

5
dao/src/main/java/org/thingsboard/server/dao/model/sql/AttributeKvCompositeKey.java

@ -25,6 +25,7 @@ import javax.persistence.Embeddable;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import java.io.Serializable;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.ATTRIBUTE_KEY_COLUMN;
import static org.thingsboard.server.dao.model.ModelConstants.ATTRIBUTE_TYPE_COLUMN;
@ -39,8 +40,8 @@ public class AttributeKvCompositeKey implements Serializable {
@Enumerated(EnumType.STRING)
@Column(name = ENTITY_TYPE_COLUMN)
private EntityType entityType;
@Column(name = ENTITY_ID_COLUMN)
private String entityId;
@Column(name = ENTITY_ID_COLUMN, columnDefinition = "uuid")
private UUID entityId;
@Column(name = ATTRIBUTE_TYPE_COLUMN)
private String attributeType;
@Column(name = ATTRIBUTE_KEY_COLUMN)

29
dao/src/main/java/org/thingsboard/server/dao/model/sql/AuditLogEntity.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -40,6 +39,7 @@ import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Table;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.AUDIT_LOG_ACTION_DATA_PROPERTY;
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
public class AuditLogEntity extends BaseSqlEntity<AuditLog> implements BaseEntity<AuditLog> {
@Column(name = AUDIT_LOG_TENANT_ID_PROPERTY)
private String tenantId;
private UUID tenantId;
@Column(name = AUDIT_LOG_CUSTOMER_ID_PROPERTY)
private String customerId;
private UUID customerId;
@Enumerated(EnumType.STRING)
@Column(name = AUDIT_LOG_ENTITY_TYPE_PROPERTY)
private EntityType entityType;
@Column(name = AUDIT_LOG_ENTITY_ID_PROPERTY)
private String entityId;
private UUID entityId;
@Column(name = AUDIT_LOG_ENTITY_NAME_PROPERTY)
private String entityName;
@Column(name = AUDIT_LOG_USER_ID_PROPERTY)
private String userId;
private UUID userId;
@Column(name = AUDIT_LOG_USER_NAME_PROPERTY)
private String userName;
@ -105,18 +105,19 @@ public class AuditLogEntity extends BaseSqlEntity<AuditLog> implements BaseEntit
if (auditLog.getId() != null) {
this.setUuid(auditLog.getId().getId());
}
this.setCreatedTime(auditLog.getCreatedTime());
if (auditLog.getTenantId() != null) {
this.tenantId = toString(auditLog.getTenantId().getId());
this.tenantId = auditLog.getTenantId().getId();
}
if (auditLog.getCustomerId() != null) {
this.customerId = toString(auditLog.getCustomerId().getId());
this.customerId = auditLog.getCustomerId().getId();
}
if (auditLog.getEntityId() != null) {
this.entityId = toString(auditLog.getEntityId().getId());
this.entityId = auditLog.getEntityId().getId();
this.entityType = auditLog.getEntityId().getEntityType();
}
if (auditLog.getUserId() != null) {
this.userId = toString(auditLog.getUserId().getId());
this.userId = auditLog.getUserId().getId();
}
this.entityName = auditLog.getEntityName();
this.userName = auditLog.getUserName();
@ -129,18 +130,18 @@ public class AuditLogEntity extends BaseSqlEntity<AuditLog> implements BaseEntit
@Override
public AuditLog toData() {
AuditLog auditLog = new AuditLog(new AuditLogId(this.getUuid()));
auditLog.setCreatedTime(Uuids.unixTimestamp(this.getUuid()));
auditLog.setCreatedTime(createdTime);
if (tenantId != null) {
auditLog.setTenantId(new TenantId(toUUID(tenantId)));
auditLog.setTenantId(new TenantId(tenantId));
}
if (customerId != null) {
auditLog.setCustomerId(new CustomerId(toUUID(customerId)));
auditLog.setCustomerId(new CustomerId(customerId));
}
if (entityId != null) {
auditLog.setEntityId(EntityIdFactory.getByTypeAndId(entityType.name(), toUUID(entityId).toString()));
auditLog.setEntityId(EntityIdFactory.getByTypeAndUuid(entityType.name(), entityId));
}
if (userId != null) {
auditLog.setUserId(new UserId(toUUID(userId)));
auditLog.setUserId(new UserId(userId));
}
auditLog.setEntityName(this.entityName);
auditLog.setUserName(this.userName);

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java

@ -73,6 +73,7 @@ public class ComponentDescriptorEntity extends BaseSqlEntity<ComponentDescriptor
if (component.getId() != null) {
this.setUuid(component.getId().getId());
}
this.setCreatedTime(component.getCreatedTime());
this.actions = component.getActions();
this.type = component.getType();
this.scope = component.getScope();
@ -85,6 +86,7 @@ public class ComponentDescriptorEntity extends BaseSqlEntity<ComponentDescriptor
@Override
public ComponentDescriptor toData() {
ComponentDescriptor data = new ComponentDescriptor(new ComponentDescriptorId(this.getUuid()));
data.setCreatedTime(createdTime);
data.setType(type);
data.setScope(scope);
data.setName(this.getName());

13
dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java

@ -15,14 +15,12 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.model.BaseSqlEntity;
@ -33,6 +31,7 @@ import org.thingsboard.server.dao.util.mapping.JsonStringType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.UUID;
@Data
@EqualsAndHashCode(callSuper = true)
@ -42,7 +41,7 @@ import javax.persistence.Table;
public final class CustomerEntity extends BaseSqlEntity<Customer> implements SearchTextEntity<Customer> {
@Column(name = ModelConstants.CUSTOMER_TENANT_ID_PROPERTY)
private String tenantId;
private UUID tenantId;
@Column(name = ModelConstants.CUSTOMER_TITLE_PROPERTY)
private String title;
@ -86,7 +85,8 @@ public final class CustomerEntity extends BaseSqlEntity<Customer> implements Sea
if (customer.getId() != null) {
this.setUuid(customer.getId().getId());
}
this.tenantId = UUIDConverter.fromTimeUUID(customer.getTenantId().getId());
this.setCreatedTime(customer.getCreatedTime());
this.tenantId = customer.getTenantId().getId();
this.title = customer.getTitle();
this.country = customer.getCountry();
this.state = customer.getState();
@ -112,8 +112,8 @@ public final class CustomerEntity extends BaseSqlEntity<Customer> implements Sea
@Override
public Customer toData() {
Customer customer = new Customer(new CustomerId(this.getUuid()));
customer.setCreatedTime(Uuids.unixTimestamp(this.getUuid()));
customer.setTenantId(new TenantId(UUIDConverter.fromString(tenantId)));
customer.setCreatedTime(createdTime);
customer.setTenantId(new TenantId(tenantId));
customer.setTitle(title);
customer.setCountry(country);
customer.setState(state);
@ -126,4 +126,5 @@ public final class CustomerEntity extends BaseSqlEntity<Customer> implements Sea
customer.setAdditionalInfo(additionalInfo);
return customer;
}
}

11
dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonNode;
@ -40,6 +39,7 @@ import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.IOException;
import java.util.HashSet;
import java.util.UUID;
@Data
@Slf4j
@ -54,7 +54,7 @@ public final class DashboardEntity extends BaseSqlEntity<Dashboard> implements S
objectMapper.getTypeFactory().constructCollectionType(HashSet.class, ShortCustomerInfo.class);
@Column(name = ModelConstants.DASHBOARD_TENANT_ID_PROPERTY)
private String tenantId;
private UUID tenantId;
@Column(name = ModelConstants.DASHBOARD_TITLE_PROPERTY)
private String title;
@ -77,8 +77,9 @@ public final class DashboardEntity extends BaseSqlEntity<Dashboard> implements S
if (dashboard.getId() != null) {
this.setUuid(dashboard.getId().getId());
}
this.setCreatedTime(dashboard.getCreatedTime());
if (dashboard.getTenantId() != null) {
this.tenantId = toString(dashboard.getTenantId().getId());
this.tenantId = dashboard.getTenantId().getId();
}
this.title = dashboard.getTitle();
if (dashboard.getAssignedCustomers() != null) {
@ -104,9 +105,9 @@ public final class DashboardEntity extends BaseSqlEntity<Dashboard> implements S
@Override
public Dashboard toData() {
Dashboard dashboard = new Dashboard(new DashboardId(this.getUuid()));
dashboard.setCreatedTime(Uuids.unixTimestamp(this.getUuid()));
dashboard.setCreatedTime(this.getCreatedTime());
if (tenantId != null) {
dashboard.setTenantId(new TenantId(toUUID(tenantId)));
dashboard.setTenantId(new TenantId(tenantId));
}
dashboard.setTitle(title);
if (!StringUtils.isEmpty(assignedCustomers)) {

11
dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
@ -36,6 +35,7 @@ import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.IOException;
import java.util.HashSet;
import java.util.UUID;
@Data
@Slf4j
@ -49,7 +49,7 @@ public class DashboardInfoEntity extends BaseSqlEntity<DashboardInfo> implements
objectMapper.getTypeFactory().constructCollectionType(HashSet.class, ShortCustomerInfo.class);
@Column(name = ModelConstants.DASHBOARD_TENANT_ID_PROPERTY)
private String tenantId;
private UUID tenantId;
@Column(name = ModelConstants.DASHBOARD_TITLE_PROPERTY)
private String title;
@ -68,8 +68,9 @@ public class DashboardInfoEntity extends BaseSqlEntity<DashboardInfo> implements
if (dashboardInfo.getId() != null) {
this.setUuid(dashboardInfo.getId().getId());
}
this.setCreatedTime(dashboardInfo.getCreatedTime());
if (dashboardInfo.getTenantId() != null) {
this.tenantId = toString(dashboardInfo.getTenantId().getId());
this.tenantId = dashboardInfo.getTenantId().getId();
}
this.title = dashboardInfo.getTitle();
if (dashboardInfo.getAssignedCustomers() != null) {
@ -98,9 +99,9 @@ public class DashboardInfoEntity extends BaseSqlEntity<DashboardInfo> implements
@Override
public DashboardInfo toData() {
DashboardInfo dashboardInfo = new DashboardInfo(new DashboardId(this.getUuid()));
dashboardInfo.setCreatedTime(Uuids.unixTimestamp(this.getUuid()));
dashboardInfo.setCreatedTime(createdTime);
if (tenantId != null) {
dashboardInfo.setTenantId(new TenantId(toUUID(tenantId)));
dashboardInfo.setTenantId(new TenantId(tenantId));
}
dashboardInfo.setTitle(title);
if (!StringUtils.isEmpty(assignedCustomers)) {

11
dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceCredentialsEntity.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.DeviceCredentialsId;
@ -31,6 +30,7 @@ import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Table;
import java.util.UUID;
@Data
@EqualsAndHashCode(callSuper = true)
@ -39,7 +39,7 @@ import javax.persistence.Table;
public final class DeviceCredentialsEntity extends BaseSqlEntity<DeviceCredentials> implements BaseEntity<DeviceCredentials> {
@Column(name = ModelConstants.DEVICE_CREDENTIALS_DEVICE_ID_PROPERTY)
private String deviceId;
private UUID deviceId;
@Enumerated(EnumType.STRING)
@Column(name = ModelConstants.DEVICE_CREDENTIALS_CREDENTIALS_TYPE_PROPERTY)
@ -59,8 +59,9 @@ public final class DeviceCredentialsEntity extends BaseSqlEntity<DeviceCredentia
if (deviceCredentials.getId() != null) {
this.setUuid(deviceCredentials.getId().getId());
}
this.setCreatedTime(deviceCredentials.getCreatedTime());
if (deviceCredentials.getDeviceId() != null) {
this.deviceId = toString(deviceCredentials.getDeviceId().getId());
this.deviceId = deviceCredentials.getDeviceId().getId();
}
this.credentialsType = deviceCredentials.getCredentialsType();
this.credentialsId = deviceCredentials.getCredentialsId();
@ -70,9 +71,9 @@ public final class DeviceCredentialsEntity extends BaseSqlEntity<DeviceCredentia
@Override
public DeviceCredentials toData() {
DeviceCredentials deviceCredentials = new DeviceCredentials(new DeviceCredentialsId(this.getUuid()));
deviceCredentials.setCreatedTime(Uuids.unixTimestamp(this.getUuid()));
deviceCredentials.setCreatedTime(createdTime);
if (deviceId != null) {
deviceCredentials.setDeviceId(new DeviceId(toUUID(deviceId)));
deviceCredentials.setDeviceId(new DeviceId(deviceId));
}
deviceCredentials.setCredentialsType(credentialsType);
deviceCredentials.setCredentialsId(credentialsId);

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceInfoEntity.java

@ -15,9 +15,9 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.fasterxml.jackson.databind.JsonNode;
import org.thingsboard.server.common.data.DeviceInfo;
import java.util.HashMap;

19
dao/src/main/java/org/thingsboard/server/dao/model/sql/EventEntity.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -36,7 +35,6 @@ import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Table;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.EPOCH_DIFF;
@ -55,17 +53,17 @@ import static org.thingsboard.server.dao.model.ModelConstants.TS_COLUMN;
@TypeDef(name = "json", typeClass = JsonStringType.class)
@Table(name = EVENT_COLUMN_FAMILY_NAME)
@NoArgsConstructor
public class EventEntity extends BaseSqlEntity<Event> implements BaseEntity<Event> {
public class EventEntity extends BaseSqlEntity<Event> implements BaseEntity<Event> {
@Column(name = EVENT_TENANT_ID_PROPERTY)
private String tenantId;
private UUID tenantId;
@Enumerated(EnumType.STRING)
@Column(name = EVENT_ENTITY_TYPE_PROPERTY)
private EntityType entityType;
@Column(name = EVENT_ENTITY_ID_PROPERTY)
private String entityId;
private UUID entityId;
@Column(name = EVENT_TYPE_PROPERTY)
private String eventType;
@ -87,12 +85,13 @@ public class EventEntity extends BaseSqlEntity<Event> implements BaseEntity<Eve
} else {
this.ts = System.currentTimeMillis();
}
this.setCreatedTime(event.getCreatedTime());
if (event.getTenantId() != null) {
this.tenantId = toString(event.getTenantId().getId());
this.tenantId = event.getTenantId().getId();
}
if (event.getEntityId() != null) {
this.entityType = event.getEntityId().getEntityType();
this.entityId = toString(event.getEntityId().getId());
this.entityId = event.getEntityId().getId();
}
this.eventType = event.getType();
this.eventUid = event.getUid();
@ -103,9 +102,9 @@ public class EventEntity extends BaseSqlEntity<Event> implements BaseEntity<Eve
@Override
public Event toData() {
Event event = new Event(new EventId(this.getUuid()));
event.setCreatedTime(Uuids.unixTimestamp(this.getUuid()));
event.setTenantId(new TenantId(toUUID(tenantId)));
event.setEntityId(EntityIdFactory.getByTypeAndUuid(entityType, toUUID(entityId)));
event.setCreatedTime(createdTime);
event.setTenantId(new TenantId(tenantId));
event.setEntityId(EntityIdFactory.getByTypeAndUuid(entityType, entityId));
event.setBody(body);
event.setType(eventType);
event.setUid(eventUid);

10
dao/src/main/java/org/thingsboard/server/dao/model/sql/RelationCompositeKey.java

@ -18,11 +18,11 @@ package org.thingsboard.server.dao.model.sql;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.relation.EntityRelation;
import javax.persistence.Transient;
import java.io.Serializable;
import java.util.UUID;
@NoArgsConstructor
@AllArgsConstructor
@ -32,17 +32,17 @@ public class RelationCompositeKey implements Serializable {
@Transient
private static final long serialVersionUID = -4089175869616037592L;
private String fromId;
private UUID fromId;
private String fromType;
private String toId;
private UUID toId;
private String toType;
private String relationType;
private String relationTypeGroup;
public RelationCompositeKey(EntityRelation relation) {
this.fromId = UUIDConverter.fromTimeUUID(relation.getFrom().getId());
this.fromId = relation.getFrom().getId();
this.fromType = relation.getFrom().getEntityType().name();
this.toId = UUIDConverter.fromTimeUUID(relation.getTo().getId());
this.toId = relation.getTo().getId();
this.toType = relation.getTo().getEntityType().name();
this.relationType = relation.getType();
this.relationTypeGroup = relation.getTypeGroup().name();

18
dao/src/main/java/org/thingsboard/server/dao/model/sql/RelationEntity.java

@ -19,7 +19,6 @@ import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.id.EntityIdFactory;
import org.thingsboard.server.common.data.relation.EntityRelation;
import org.thingsboard.server.common.data.relation.RelationTypeGroup;
@ -31,6 +30,7 @@ import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.ADDITIONAL_INFO_PROPERTY;
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
public final class RelationEntity implements ToData<EntityRelation> {
@Id
@Column(name = RELATION_FROM_ID_PROPERTY)
private String fromId;
@Column(name = RELATION_FROM_ID_PROPERTY, columnDefinition = "uuid")
private UUID fromId;
@Id
@Column(name = RELATION_FROM_TYPE_PROPERTY)
private String fromType;
@Id
@Column(name = RELATION_TO_ID_PROPERTY)
private String toId;
@Column(name = RELATION_TO_ID_PROPERTY, columnDefinition = "uuid")
private UUID toId;
@Id
@Column(name = RELATION_TO_TYPE_PROPERTY)
@ -82,11 +82,11 @@ public final class RelationEntity implements ToData<EntityRelation> {
public RelationEntity(EntityRelation relation) {
if (relation.getTo() != null) {
this.toId = UUIDConverter.fromTimeUUID(relation.getTo().getId());
this.toId = relation.getTo().getId();
this.toType = relation.getTo().getEntityType().name();
}
if (relation.getFrom() != null) {
this.fromId = UUIDConverter.fromTimeUUID(relation.getFrom().getId());
this.fromId = relation.getFrom().getId();
this.fromType = relation.getFrom().getEntityType().name();
}
this.relationType = relation.getType();
@ -98,10 +98,10 @@ public final class RelationEntity implements ToData<EntityRelation> {
public EntityRelation toData() {
EntityRelation relation = new EntityRelation();
if (toId != null && toType != null) {
relation.setTo(EntityIdFactory.getByTypeAndUuid(toType, UUIDConverter.fromString(toId)));
relation.setTo(EntityIdFactory.getByTypeAndUuid(toType, toId));
}
if (fromId != null && fromType != null) {
relation.setFrom(EntityIdFactory.getByTypeAndUuid(fromType, UUIDConverter.fromString(fromId)));
relation.setFrom(EntityIdFactory.getByTypeAndUuid(fromType, fromId));
}
relation.setType(relationType);
relation.setTypeGroup(RelationTypeGroup.valueOf(relationTypeGroup));

18
dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleChainEntity.java

@ -15,13 +15,11 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.RuleNodeId;
import org.thingsboard.server.common.data.id.TenantId;
@ -35,6 +33,7 @@ import org.thingsboard.server.dao.util.mapping.JsonStringType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.UUID;
@Data
@EqualsAndHashCode(callSuper = true)
@ -44,7 +43,7 @@ import javax.persistence.Table;
public class RuleChainEntity extends BaseSqlEntity<RuleChain> implements SearchTextEntity<RuleChain> {
@Column(name = ModelConstants.RULE_CHAIN_TENANT_ID_PROPERTY)
private String tenantId;
private UUID tenantId;
@Column(name = ModelConstants.RULE_CHAIN_NAME_PROPERTY)
private String name;
@ -53,7 +52,7 @@ public class RuleChainEntity extends BaseSqlEntity<RuleChain> implements SearchT
private String searchText;
@Column(name = ModelConstants.RULE_CHAIN_FIRST_RULE_NODE_ID_PROPERTY)
private String firstRuleNodeId;
private UUID firstRuleNodeId;
@Column(name = ModelConstants.RULE_CHAIN_ROOT_PROPERTY)
private boolean root;
@ -76,11 +75,12 @@ public class RuleChainEntity extends BaseSqlEntity<RuleChain> implements SearchT
if (ruleChain.getId() != null) {
this.setUuid(ruleChain.getUuidId());
}
this.tenantId = toString(DaoUtil.getId(ruleChain.getTenantId()));
this.setCreatedTime(ruleChain.getCreatedTime());
this.tenantId = DaoUtil.getId(ruleChain.getTenantId());
this.name = ruleChain.getName();
this.searchText = ruleChain.getName();
if (ruleChain.getFirstRuleNodeId() != null) {
this.firstRuleNodeId = UUIDConverter.fromTimeUUID(ruleChain.getFirstRuleNodeId().getId());
this.firstRuleNodeId = ruleChain.getFirstRuleNodeId().getId();
}
this.root = ruleChain.isRoot();
this.debugMode = ruleChain.isDebugMode();
@ -101,11 +101,11 @@ public class RuleChainEntity extends BaseSqlEntity<RuleChain> implements SearchT
@Override
public RuleChain toData() {
RuleChain ruleChain = new RuleChain(new RuleChainId(this.getUuid()));
ruleChain.setCreatedTime(Uuids.unixTimestamp(this.getUuid()));
ruleChain.setTenantId(new TenantId(toUUID(tenantId)));
ruleChain.setCreatedTime(createdTime);
ruleChain.setTenantId(new TenantId(tenantId));
ruleChain.setName(name);
if (firstRuleNodeId != null) {
ruleChain.setFirstRuleNodeId(new RuleNodeId(UUIDConverter.fromString(firstRuleNodeId)));
ruleChain.setFirstRuleNodeId(new RuleNodeId(firstRuleNodeId));
}
ruleChain.setRoot(root);
ruleChain.setDebugMode(debugMode);

11
dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleNodeEntity.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -33,6 +32,7 @@ import org.thingsboard.server.dao.util.mapping.JsonStringType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.UUID;
@Data
@EqualsAndHashCode(callSuper = true)
@ -42,7 +42,7 @@ import javax.persistence.Table;
public class RuleNodeEntity extends BaseSqlEntity<RuleNode> implements SearchTextEntity<RuleNode> {
@Column(name = ModelConstants.RULE_NODE_CHAIN_ID_PROPERTY)
private String ruleChainId;
private UUID ruleChainId;
@Column(name = ModelConstants.RULE_NODE_TYPE_PROPERTY)
private String type;
@ -71,8 +71,9 @@ public class RuleNodeEntity extends BaseSqlEntity<RuleNode> implements SearchTex
if (ruleNode.getId() != null) {
this.setUuid(ruleNode.getUuidId());
}
this.setCreatedTime(ruleNode.getCreatedTime());
if (ruleNode.getRuleChainId() != null) {
this.ruleChainId = toString(DaoUtil.getId(ruleNode.getRuleChainId()));
this.ruleChainId = DaoUtil.getId(ruleNode.getRuleChainId());
}
this.type = ruleNode.getType();
this.name = ruleNode.getName();
@ -95,9 +96,9 @@ public class RuleNodeEntity extends BaseSqlEntity<RuleNode> implements SearchTex
@Override
public RuleNode toData() {
RuleNode ruleNode = new RuleNode(new RuleNodeId(this.getUuid()));
ruleNode.setCreatedTime(Uuids.unixTimestamp(this.getUuid()));
ruleNode.setCreatedTime(createdTime);
if (ruleChainId != null) {
ruleNode.setRuleChainId(new RuleChainId(toUUID(ruleChainId)));
ruleNode.setRuleChainId(new RuleChainId(ruleChainId));
}
ruleNode.setType(type);
ruleNode.setName(name);

4
dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -90,6 +89,7 @@ public final class TenantEntity extends BaseSqlEntity<Tenant> implements SearchT
if (tenant.getId() != null) {
this.setUuid(tenant.getId().getId());
}
this.setCreatedTime(tenant.getCreatedTime());
this.title = tenant.getTitle();
this.region = tenant.getRegion();
this.country = tenant.getCountry();
@ -122,7 +122,7 @@ public final class TenantEntity extends BaseSqlEntity<Tenant> implements SearchT
@Override
public Tenant toData() {
Tenant tenant = new Tenant(new TenantId(this.getUuid()));
tenant.setCreatedTime(Uuids.unixTimestamp(this.getUuid()));
tenant.setCreatedTime(createdTime);
tenant.setTitle(title);
tenant.setRegion(region);
tenant.setCountry(country);

11
dao/src/main/java/org/thingsboard/server/dao/model/sql/UserCredentialsEntity.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.UserCredentialsId;
@ -28,6 +27,7 @@ import org.thingsboard.server.dao.model.ModelConstants;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.UUID;
@Data
@EqualsAndHashCode(callSuper = true)
@ -36,7 +36,7 @@ import javax.persistence.Table;
public final class UserCredentialsEntity extends BaseSqlEntity<UserCredentials> implements BaseEntity<UserCredentials> {
@Column(name = ModelConstants.USER_CREDENTIALS_USER_ID_PROPERTY, unique = true)
private String userId;
private UUID userId;
@Column(name = ModelConstants.USER_CREDENTIALS_ENABLED_PROPERTY)
private boolean enabled;
@ -58,8 +58,9 @@ public final class UserCredentialsEntity extends BaseSqlEntity<UserCredentials>
if (userCredentials.getId() != null) {
this.setUuid(userCredentials.getId().getId());
}
this.setCreatedTime(userCredentials.getCreatedTime());
if (userCredentials.getUserId() != null) {
this.userId = toString(userCredentials.getUserId().getId());
this.userId = userCredentials.getUserId().getId();
}
this.enabled = userCredentials.isEnabled();
this.password = userCredentials.getPassword();
@ -70,9 +71,9 @@ public final class UserCredentialsEntity extends BaseSqlEntity<UserCredentials>
@Override
public UserCredentials toData() {
UserCredentials userCredentials = new UserCredentials(new UserCredentialsId(this.getUuid()));
userCredentials.setCreatedTime(Uuids.unixTimestamp(this.getUuid()));
userCredentials.setCreatedTime(createdTime);
if (userId != null) {
userCredentials.setUserId(new UserId(toUUID(userId)));
userCredentials.setUserId(new UserId(userId));
}
userCredentials.setEnabled(enabled);
userCredentials.setPassword(password);

20
dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -36,9 +35,7 @@ import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Table;
import static org.thingsboard.server.common.data.UUIDConverter.fromString;
import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID;
import java.util.UUID;
/**
* Created by Valerii Sosliuk on 4/21/2017.
@ -51,10 +48,10 @@ import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID;
public class UserEntity extends BaseSqlEntity<User> implements SearchTextEntity<User> {
@Column(name = ModelConstants.USER_TENANT_ID_PROPERTY)
private String tenantId;
private UUID tenantId;
@Column(name = ModelConstants.USER_CUSTOMER_ID_PROPERTY)
private String customerId;
private UUID customerId;
@Enumerated(EnumType.STRING)
@Column(name = ModelConstants.USER_AUTHORITY_PROPERTY)
@ -83,12 +80,13 @@ public class UserEntity extends BaseSqlEntity<User> implements SearchTextEntity<
if (user.getId() != null) {
this.setUuid(user.getId().getId());
}
this.setCreatedTime(user.getCreatedTime());
this.authority = user.getAuthority();
if (user.getTenantId() != null) {
this.tenantId = fromTimeUUID(user.getTenantId().getId());
this.tenantId = user.getTenantId().getId();
}
if (user.getCustomerId() != null) {
this.customerId = fromTimeUUID(user.getCustomerId().getId());
this.customerId = user.getCustomerId().getId();
}
this.email = user.getEmail();
this.firstName = user.getFirstName();
@ -109,13 +107,13 @@ public class UserEntity extends BaseSqlEntity<User> implements SearchTextEntity<
@Override
public User toData() {
User user = new User(new UserId(this.getUuid()));
user.setCreatedTime(Uuids.unixTimestamp(this.getUuid()));
user.setCreatedTime(createdTime);
user.setAuthority(authority);
if (tenantId != null) {
user.setTenantId(new TenantId(fromString(tenantId)));
user.setTenantId(new TenantId(tenantId));
}
if (customerId != null) {
user.setCustomerId(new CustomerId(fromString(customerId)));
user.setCustomerId(new CustomerId(customerId));
}
user.setEmail(email);
user.setFirstName(firstName);

11
dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -32,6 +31,7 @@ import org.thingsboard.server.dao.util.mapping.JsonStringType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.UUID;
@Data
@EqualsAndHashCode(callSuper = true)
@ -41,7 +41,7 @@ import javax.persistence.Table;
public final class WidgetTypeEntity extends BaseSqlEntity<WidgetType> implements BaseEntity<WidgetType> {
@Column(name = ModelConstants.WIDGET_TYPE_TENANT_ID_PROPERTY)
private String tenantId;
private UUID tenantId;
@Column(name = ModelConstants.WIDGET_TYPE_BUNDLE_ALIAS_PROPERTY)
private String bundleAlias;
@ -64,8 +64,9 @@ public final class WidgetTypeEntity extends BaseSqlEntity<WidgetType> implement
if (widgetType.getId() != null) {
this.setUuid(widgetType.getId().getId());
}
this.setCreatedTime(widgetType.getCreatedTime());
if (widgetType.getTenantId() != null) {
this.tenantId = toString(widgetType.getTenantId().getId());
this.tenantId = widgetType.getTenantId().getId();
}
this.bundleAlias = widgetType.getBundleAlias();
this.alias = widgetType.getAlias();
@ -76,9 +77,9 @@ public final class WidgetTypeEntity extends BaseSqlEntity<WidgetType> implement
@Override
public WidgetType toData() {
WidgetType widgetType = new WidgetType(new WidgetTypeId(this.getUuid()));
widgetType.setCreatedTime(Uuids.unixTimestamp(this.getUuid()));
widgetType.setCreatedTime(createdTime);
if (tenantId != null) {
widgetType.setTenantId(new TenantId(toUUID(tenantId)));
widgetType.setTenantId(new TenantId(tenantId));
}
widgetType.setBundleAlias(bundleAlias);
widgetType.setAlias(alias);

14
dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java

@ -16,10 +16,8 @@
package org.thingsboard.server.dao.model.sql;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.WidgetsBundleId;
import org.thingsboard.server.common.data.widget.WidgetsBundle;
@ -30,6 +28,7 @@ import org.thingsboard.server.dao.model.SearchTextEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.UUID;
@Data
@EqualsAndHashCode(callSuper = true)
@ -38,7 +37,7 @@ import javax.persistence.Table;
public final class WidgetsBundleEntity extends BaseSqlEntity<WidgetsBundle> implements SearchTextEntity<WidgetsBundle> {
@Column(name = ModelConstants.WIDGETS_BUNDLE_TENANT_ID_PROPERTY)
private String tenantId;
private UUID tenantId;
@Column(name = ModelConstants.WIDGETS_BUNDLE_ALIAS_PROPERTY)
private String alias;
@ -57,8 +56,9 @@ public final class WidgetsBundleEntity extends BaseSqlEntity<WidgetsBundle> impl
if (widgetsBundle.getId() != null) {
this.setUuid(widgetsBundle.getId().getId());
}
this.setCreatedTime(widgetsBundle.getCreatedTime());
if (widgetsBundle.getTenantId() != null) {
this.tenantId = UUIDConverter.fromTimeUUID(widgetsBundle.getTenantId().getId());
this.tenantId = widgetsBundle.getTenantId().getId();
}
this.alias = widgetsBundle.getAlias();
this.title = widgetsBundle.getTitle();
@ -76,10 +76,10 @@ public final class WidgetsBundleEntity extends BaseSqlEntity<WidgetsBundle> impl
@Override
public WidgetsBundle toData() {
WidgetsBundle widgetsBundle = new WidgetsBundle(new WidgetsBundleId(UUIDConverter.fromString(id)));
widgetsBundle.setCreatedTime(Uuids.unixTimestamp(UUIDConverter.fromString(id)));
WidgetsBundle widgetsBundle = new WidgetsBundle(new WidgetsBundleId(id));
widgetsBundle.setCreatedTime(createdTime);
if (tenantId != null) {
widgetsBundle.setTenantId(new TenantId(UUIDConverter.fromString(tenantId)));
widgetsBundle.setTenantId(new TenantId(tenantId));
}
widgetsBundle.setAlias(alias);
widgetsBundle.setTitle(title);

1
dao/src/main/java/org/thingsboard/server/dao/model/sqlts/latest/TsKvLatestCompositeKey.java

@ -18,7 +18,6 @@ package org.thingsboard.server.dao.model.sqlts.latest;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.EntityType;
import javax.persistence.Transient;
import java.io.Serializable;

4
dao/src/main/java/org/thingsboard/server/dao/model/sqlts/latest/TsKvLatestEntity.java

@ -19,11 +19,9 @@ import lombok.Data;
import org.thingsboard.server.dao.model.sql.AbstractTsKvEntity;
import org.thingsboard.server.dao.sqlts.latest.SearchTsKvLatestRepository;
import javax.persistence.Column;
import javax.persistence.ColumnResult;
import javax.persistence.ConstructorResult;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
@ -32,8 +30,6 @@ import javax.persistence.SqlResultSetMappings;
import javax.persistence.Table;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.KEY_COLUMN;
@Data
@Entity
@Table(name = "ts_kv_latest")

4
dao/src/main/java/org/thingsboard/server/dao/model/sqlts/ts/TsKvEntity.java

@ -18,14 +18,10 @@ package org.thingsboard.server.dao.model.sqlts.ts;
import lombok.Data;
import org.thingsboard.server.dao.model.sql.AbstractTsKvEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;
import static org.thingsboard.server.dao.model.ModelConstants.KEY_COLUMN;
@Data
@Entity
@Table(name = "ts_kv")

6
dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraAbstractAsyncDao.java

@ -15,10 +15,7 @@
*/
package org.thingsboard.server.dao.nosql;
import com.datastax.oss.driver.api.core.cql.AsyncResultSet;
import com.datastax.oss.driver.api.core.cql.Row;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.AsyncFunction;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
@ -27,11 +24,8 @@ import org.thingsboard.common.util.ThingsBoardThreadFactory;
import javax.annotation.Nullable;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
/**
* Created by ashvayka on 21.02.17.

1
dao/src/main/java/org/thingsboard/server/dao/nosql/CassandraBufferedRateExecutor.java

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.dao.nosql;
import com.datastax.oss.driver.api.core.cql.AsyncResultSet;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
import lombok.extern.slf4j.Slf4j;

2
dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java

@ -59,6 +59,4 @@ public interface RelationDao {
ListenableFuture<Boolean> deleteOutboundRelationsAsync(TenantId tenantId, EntityId entity);
ListenableFuture<PageData<EntityRelation>> findRelations(TenantId tenantId, EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType toType, TimePageLink pageLink);
}

1
dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleChainService.java

@ -48,7 +48,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
/**
* Created by igor on 3/12/18.

1
dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDao.java

@ -20,7 +20,6 @@ import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.dao.Dao;
import java.util.List;
import java.util.UUID;
/**

3
dao/src/main/java/org/thingsboard/server/dao/service/PaginatedRemover.java

@ -20,9 +20,6 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import java.util.List;
import java.util.UUID;
public abstract class PaginatedRemover<I, D extends IdBased<?>> {
private static final int DEFAULT_LIMIT = 100;

3
dao/src/main/java/org/thingsboard/server/dao/service/TimePaginatedRemover.java

@ -20,9 +20,6 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.TimePageLink;
import java.util.List;
import java.util.UUID;
public abstract class TimePaginatedRemover<I, D extends IdBased<?>> {
private static final int DEFAULT_LIMIT = 100;

1
dao/src/main/java/org/thingsboard/server/dao/settings/AdminSettingsServiceImpl.java

@ -20,7 +20,6 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.AdminSettingsId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.exception.DataValidationException;

22
dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java

@ -30,8 +30,6 @@ import java.util.List;
import java.util.Optional;
import java.util.UUID;
import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID;
/**
* @author Valerii Sosliuk
*/
@ -42,9 +40,10 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D>
protected abstract Class<E> getEntityClass();
protected abstract CrudRepository<E, String> getCrudRepository();
protected abstract CrudRepository<E, UUID> getCrudRepository();
protected void setSearchText(E entity) {}
protected void setSearchText(E entity) {
}
@Override
@Transactional
@ -59,7 +58,9 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D>
setSearchText(entity);
log.debug("Saving entity {}", entity);
if (entity.getUuid() == null) {
entity.setUuid(Uuids.timeBased());
UUID uuid = Uuids.timeBased();
entity.setUuid(uuid);
entity.setCreatedTime(Uuids.unixTimestamp(uuid));
}
entity = getCrudRepository().save(entity);
return DaoUtil.getData(entity);
@ -68,23 +69,22 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D>
@Override
public D findById(TenantId tenantId, UUID key) {
log.debug("Get entity by key {}", key);
Optional<E> entity = getCrudRepository().findById(fromTimeUUID(key));
Optional<E> entity = getCrudRepository().findById(key);
return DaoUtil.getData(entity);
}
@Override
public ListenableFuture<D> findByIdAsync(TenantId tenantId, UUID key) {
log.debug("Get entity by key async {}", key);
return service.submit(() -> DaoUtil.getData(getCrudRepository().findById(fromTimeUUID(key))));
return service.submit(() -> DaoUtil.getData(getCrudRepository().findById(key)));
}
@Override
@Transactional
public boolean removeById(TenantId tenantId, UUID id) {
String key = fromTimeUUID(id);
getCrudRepository().deleteById(key);
log.debug("Remove request: {}", key);
return !getCrudRepository().existsById(key);
getCrudRepository().deleteById(id);
log.debug("Remove request: {}", id);
return !getCrudRepository().existsById(id);
}
@Override

1
dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractSearchTimeDao.java

@ -34,6 +34,7 @@ import java.util.UUID;
*/
public abstract class JpaAbstractSearchTimeDao<E extends BaseEntity<D>, D> extends JpaAbstractDao<E, D> {
//TODO 3.1: refactoring to createdTime column
public static <T> Specification<T> getTimeSearchPageSpec(TimePageLink pageLink, String idColumn) {
return new Specification<T>() {
@Override

25
dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java

@ -20,21 +20,21 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.dao.model.sql.AlarmEntity;
import org.thingsboard.server.dao.model.sql.AlarmInfoEntity;
import org.thingsboard.server.dao.util.SqlDao;
import java.util.List;
import java.util.UUID;
/**
* Created by Valerii Sosliuk on 5/21/2017.
*/
@SqlDao
public interface AlarmRepository extends CrudRepository<AlarmEntity, String> {
public interface AlarmRepository extends CrudRepository<AlarmEntity, UUID> {
@Query("SELECT a FROM AlarmEntity a WHERE a.originatorId = :originatorId AND a.type = :alarmType ORDER BY a.startTs DESC")
List<AlarmEntity> findLatestByOriginatorAndType(@Param("originatorId") String originatorId,
List<AlarmEntity> findLatestByOriginatorAndType(@Param("originatorId") UUID originatorId,
@Param("alarmType") String alarmType,
Pageable pageable);
@ -46,9 +46,8 @@ public interface AlarmRepository extends CrudRepository<AlarmEntity, String> {
"AND re.relationType = :relationType " +
"AND re.fromId = :affectedEntityId " +
"AND re.fromType = :affectedEntityType " +
"AND (:startId IS NULL OR a.id >= :startId) " +
"AND (:endId IS NULL OR a.id <= :endId) " +
"AND (:idOffset IS NULL OR a.id < :idOffset) " +
"AND (:startTime IS NULL OR a.createdTime >= :startTime) " +
"AND (:endTime IS NULL OR a.createdTime <= :endTime) " +
"AND (LOWER(a.type) LIKE LOWER(CONCAT(:searchText, '%'))" +
"OR LOWER(a.severity) LIKE LOWER(CONCAT(:searchText, '%'))" +
"OR LOWER(a.status) LIKE LOWER(CONCAT(:searchText, '%')))",
@ -60,19 +59,17 @@ public interface AlarmRepository extends CrudRepository<AlarmEntity, String> {
"AND re.relationType = :relationType " +
"AND re.fromId = :affectedEntityId " +
"AND re.fromType = :affectedEntityType " +
"AND (:startId IS NULL OR a.id >= :startId) " +
"AND (:endId IS NULL OR a.id <= :endId) " +
"AND (:idOffset IS NULL OR a.id < :idOffset) " +
"AND (:startTime IS NULL OR a.createdTime >= :startTime) " +
"AND (:endTime IS NULL OR a.createdTime <= :endTime) " +
"AND (LOWER(a.type) LIKE LOWER(CONCAT(:searchText, '%'))" +
"OR LOWER(a.severity) LIKE LOWER(CONCAT(:searchText, '%'))" +
"OR LOWER(a.status) LIKE LOWER(CONCAT(:searchText, '%')))")
Page<AlarmInfoEntity> findAlarms(@Param("tenantId") String tenantId,
@Param("affectedEntityId") String affectedEntityId,
Page<AlarmInfoEntity> findAlarms(@Param("tenantId") UUID tenantId,
@Param("affectedEntityId") UUID affectedEntityId,
@Param("affectedEntityType") String affectedEntityType,
@Param("relationType") String relationType,
@Param("startId") String startId,
@Param("endId") String endId,
@Param("idOffset") String idOffset,
@Param("startTime") Long startTime,
@Param("endTime") Long endTime,
@Param("searchText") String searchText,
Pageable pageable);
}

14
dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java

@ -41,7 +41,6 @@ import java.util.List;
import java.util.Objects;
import java.util.UUID;
import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID;
import static org.thingsboard.server.dao.DaoUtil.endTimeToId;
import static org.thingsboard.server.dao.DaoUtil.startTimeToId;
@ -65,7 +64,7 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A
}
@Override
protected CrudRepository<AlarmEntity, String> getCrudRepository() {
protected CrudRepository<AlarmEntity, UUID> getCrudRepository() {
return alarmRepository;
}
@ -78,7 +77,7 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A
public ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) {
return service.submit(() -> {
List<AlarmEntity> latest = alarmRepository.findLatestByOriginatorAndType(
UUIDConverter.fromTimeUUID(originator.getId()),
originator.getId(),
type,
PageRequest.of(0, 1));
return latest.isEmpty() ? null : DaoUtil.getData(latest.get(0));
@ -106,13 +105,12 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A
return DaoUtil.toPageData(
alarmRepository.findAlarms(
fromTimeUUID(tenantId.getId()),
fromTimeUUID(affectedEntity.getId()),
tenantId.getId(),
affectedEntity.getId(),
affectedEntity.getEntityType().name(),
relationType,
startTimeToId(query.getPageLink().getStartTime()),
endTimeToId(query.getPageLink().getEndTime()),
query.getIdOffset() != null ? UUIDConverter.fromTimeUUID(query.getIdOffset()) : null,
query.getPageLink().getStartTime(),
query.getPageLink().getEndTime(),
Objects.toString(query.getPageLink().getTextSearch(), ""),
DaoUtil.toPageable(query.getPageLink())
)

38
dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java

@ -18,7 +18,6 @@ package org.thingsboard.server.dao.sql.asset;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.thingsboard.server.dao.model.sql.AssetEntity;
@ -26,22 +25,23 @@ import org.thingsboard.server.dao.model.sql.AssetInfoEntity;
import org.thingsboard.server.dao.util.SqlDao;
import java.util.List;
import java.util.UUID;
/**
* Created by Valerii Sosliuk on 5/21/2017.
*/
@SqlDao
public interface AssetRepository extends PagingAndSortingRepository<AssetEntity, String> {
public interface AssetRepository extends PagingAndSortingRepository<AssetEntity, UUID> {
@Query("SELECT new org.thingsboard.server.dao.model.sql.AssetInfoEntity(a, c.title, c.additionalInfo) " +
"FROM AssetEntity a " +
"LEFT JOIN CustomerEntity c on c.id = a.customerId " +
"WHERE a.id = :assetId")
AssetInfoEntity findAssetInfoById(@Param("assetId") String assetId);
AssetInfoEntity findAssetInfoById(@Param("assetId") UUID assetId);
@Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " +
"AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<AssetEntity> findByTenantId(@Param("tenantId") String tenantId,
Page<AssetEntity> findByTenantId(@Param("tenantId") UUID tenantId,
@Param("textSearch") String textSearch,
Pageable pageable);
@ -50,15 +50,15 @@ public interface AssetRepository extends PagingAndSortingRepository<AssetEntity,
"LEFT JOIN CustomerEntity c on c.id = a.customerId " +
"WHERE a.tenantId = :tenantId " +
"AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<AssetInfoEntity> findAssetInfosByTenantId(@Param("tenantId") String tenantId,
Page<AssetInfoEntity> findAssetInfosByTenantId(@Param("tenantId") UUID tenantId,
@Param("textSearch") String textSearch,
Pageable pageable);
@Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " +
"AND a.customerId = :customerId " +
"AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<AssetEntity> findByTenantIdAndCustomerId(@Param("tenantId") String tenantId,
@Param("customerId") String customerId,
Page<AssetEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("textSearch") String textSearch,
Pageable pageable);
@ -68,21 +68,21 @@ public interface AssetRepository extends PagingAndSortingRepository<AssetEntity,
"WHERE a.tenantId = :tenantId " +
"AND a.customerId = :customerId " +
"AND LOWER(a.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
Page<AssetInfoEntity> findAssetInfosByTenantIdAndCustomerId(@Param("tenantId") String tenantId,
@Param("customerId") String customerId,
Page<AssetInfoEntity> findAssetInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("searchText") String searchText,
Pageable pageable);
List<AssetEntity> findByTenantIdAndIdIn(String tenantId, List<String> assetIds);
List<AssetEntity> findByTenantIdAndIdIn(UUID tenantId, List<UUID> assetIds);
List<AssetEntity> findByTenantIdAndCustomerIdAndIdIn(String tenantId, String customerId, List<String> assetIds);
List<AssetEntity> findByTenantIdAndCustomerIdAndIdIn(UUID tenantId, UUID customerId, List<UUID> assetIds);
AssetEntity findByTenantIdAndName(String tenantId, String name);
AssetEntity findByTenantIdAndName(UUID tenantId, String name);
@Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " +
"AND a.type = :type " +
"AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<AssetEntity> findByTenantIdAndType(@Param("tenantId") String tenantId,
Page<AssetEntity> findByTenantIdAndType(@Param("tenantId") UUID tenantId,
@Param("type") String type,
@Param("textSearch") String textSearch,
Pageable pageable);
@ -93,7 +93,7 @@ public interface AssetRepository extends PagingAndSortingRepository<AssetEntity,
"WHERE a.tenantId = :tenantId " +
"AND a.type = :type " +
"AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<AssetInfoEntity> findAssetInfosByTenantIdAndType(@Param("tenantId") String tenantId,
Page<AssetInfoEntity> findAssetInfosByTenantIdAndType(@Param("tenantId") UUID tenantId,
@Param("type") String type,
@Param("textSearch") String textSearch,
Pageable pageable);
@ -102,8 +102,8 @@ public interface AssetRepository extends PagingAndSortingRepository<AssetEntity,
@Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " +
"AND a.customerId = :customerId AND a.type = :type " +
"AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<AssetEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") String tenantId,
@Param("customerId") String customerId,
Page<AssetEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("type") String type,
@Param("textSearch") String textSearch,
Pageable pageable);
@ -115,13 +115,13 @@ public interface AssetRepository extends PagingAndSortingRepository<AssetEntity,
"AND a.customerId = :customerId " +
"AND a.type = :type " +
"AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<AssetInfoEntity> findAssetInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") String tenantId,
@Param("customerId") String customerId,
Page<AssetInfoEntity> findAssetInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("type") String type,
@Param("textSearch") String textSearch,
Pageable pageable);
@Query("SELECT DISTINCT a.type FROM AssetEntity a WHERE a.tenantId = :tenantId")
List<String> findTenantAssetTypes(@Param("tenantId") String tenantId);
List<String> findTenantAssetTypes(@Param("tenantId") UUID tenantId);
}

40
dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java

@ -17,7 +17,6 @@ package org.thingsboard.server.dao.sql.asset;
import com.google.common.util.concurrent.ListenableFuture;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.EntitySubtype;
@ -41,9 +40,6 @@ import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID;
import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUIDs;
/**
* Created by Valerii Sosliuk on 5/19/2017.
*/
@ -60,20 +56,20 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
}
@Override
protected CrudRepository<AssetEntity, String> getCrudRepository() {
protected CrudRepository<AssetEntity, UUID> getCrudRepository() {
return assetRepository;
}
@Override
public AssetInfo findAssetInfoById(TenantId tenantId, UUID assetId) {
return DaoUtil.getData(assetRepository.findAssetInfoById(fromTimeUUID(assetId)));
return DaoUtil.getData(assetRepository.findAssetInfoById(assetId));
}
@Override
public PageData<Asset> findAssetsByTenantId(UUID tenantId, PageLink pageLink) {
return DaoUtil.toPageData(assetRepository
.findByTenantId(
fromTimeUUID(tenantId),
tenantId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)));
}
@ -82,7 +78,7 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
public PageData<AssetInfo> findAssetInfosByTenantId(UUID tenantId, PageLink pageLink) {
return DaoUtil.toPageData(
assetRepository.findAssetInfosByTenantId(
fromTimeUUID(tenantId),
tenantId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap)));
}
@ -90,15 +86,15 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
@Override
public ListenableFuture<List<Asset>> findAssetsByTenantIdAndIdsAsync(UUID tenantId, List<UUID> assetIds) {
return service.submit(() ->
DaoUtil.convertDataList(assetRepository.findByTenantIdAndIdIn(fromTimeUUID(tenantId), fromTimeUUIDs(assetIds))));
DaoUtil.convertDataList(assetRepository.findByTenantIdAndIdIn(tenantId, assetIds)));
}
@Override
public PageData<Asset> findAssetsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, PageLink pageLink) {
return DaoUtil.toPageData(assetRepository
.findByTenantIdAndCustomerId(
fromTimeUUID(tenantId),
fromTimeUUID(customerId),
tenantId,
customerId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)));
}
@ -107,8 +103,8 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
public PageData<AssetInfo> findAssetInfosByTenantIdAndCustomerId(UUID tenantId, UUID customerId, PageLink pageLink) {
return DaoUtil.toPageData(
assetRepository.findAssetInfosByTenantIdAndCustomerId(
fromTimeUUID(tenantId),
fromTimeUUID(customerId),
tenantId,
customerId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap)));
}
@ -116,12 +112,12 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
@Override
public ListenableFuture<List<Asset>> findAssetsByTenantIdAndCustomerIdAndIdsAsync(UUID tenantId, UUID customerId, List<UUID> assetIds) {
return service.submit(() ->
DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdAndIdIn(fromTimeUUID(tenantId), fromTimeUUID(customerId), fromTimeUUIDs(assetIds))));
DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdAndIdIn(tenantId, customerId, assetIds)));
}
@Override
public Optional<Asset> findAssetsByTenantIdAndName(UUID tenantId, String name) {
Asset asset = DaoUtil.getData(assetRepository.findByTenantIdAndName(fromTimeUUID(tenantId), name));
Asset asset = DaoUtil.getData(assetRepository.findByTenantIdAndName(tenantId, name));
return Optional.ofNullable(asset);
}
@ -129,7 +125,7 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
public PageData<Asset> findAssetsByTenantIdAndType(UUID tenantId, String type, PageLink pageLink) {
return DaoUtil.toPageData(assetRepository
.findByTenantIdAndType(
fromTimeUUID(tenantId),
tenantId,
type,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)));
@ -139,7 +135,7 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
public PageData<AssetInfo> findAssetInfosByTenantIdAndType(UUID tenantId, String type, PageLink pageLink) {
return DaoUtil.toPageData(
assetRepository.findAssetInfosByTenantIdAndType(
fromTimeUUID(tenantId),
tenantId,
type,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap)));
@ -149,8 +145,8 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
public PageData<Asset> findAssetsByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, PageLink pageLink) {
return DaoUtil.toPageData(assetRepository
.findByTenantIdAndCustomerIdAndType(
fromTimeUUID(tenantId),
fromTimeUUID(customerId),
tenantId,
customerId,
type,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)));
@ -160,8 +156,8 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
public PageData<AssetInfo> findAssetInfosByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, PageLink pageLink) {
return DaoUtil.toPageData(
assetRepository.findAssetInfosByTenantIdAndCustomerIdAndType(
fromTimeUUID(tenantId),
fromTimeUUID(customerId),
tenantId,
customerId,
type,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap)));
@ -169,7 +165,7 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
@Override
public ListenableFuture<List<EntitySubtype>> findTenantAssetTypesAsync(UUID tenantId) {
return service.submit(() -> convertTenantAssetTypesToDto(tenantId, assetRepository.findTenantAssetTypes(fromTimeUUID(tenantId))));
return service.submit(() -> convertTenantAssetTypesToDto(tenantId, assetRepository.findTenantAssetTypes(tenantId)));
}
private List<EntitySubtype> convertTenantAssetTypesToDto(UUID tenantId, List<String> types) {

5
dao/src/main/java/org/thingsboard/server/dao/sql/attributes/AttributeKvInsertRepository.java

@ -29,6 +29,7 @@ import org.thingsboard.server.dao.util.SqlDao;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.SQLType;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
@ -92,7 +93,7 @@ public abstract class AttributeKvInsertRepository {
ps.setLong(6, kvEntity.getLastUpdateTs());
ps.setString(7, kvEntity.getId().getEntityType().name());
ps.setString(8, kvEntity.getId().getEntityId());
ps.setObject(8, kvEntity.getId().getEntityId());
ps.setString(9, kvEntity.getId().getAttributeType());
ps.setString(10, kvEntity.getId().getAttributeKey());
}
@ -122,7 +123,7 @@ public abstract class AttributeKvInsertRepository {
public void setValues(PreparedStatement ps, int i) throws SQLException {
AttributeKvEntity kvEntity = insertEntities.get(i);
ps.setString(1, kvEntity.getId().getEntityType().name());
ps.setString(2, kvEntity.getId().getEntityId());
ps.setObject(2, kvEntity.getId().getEntityId());
ps.setString(3, kvEntity.getId().getAttributeType());
ps.setString(4, kvEntity.getId().getAttributeKey());

5
dao/src/main/java/org/thingsboard/server/dao/sql/attributes/AttributeKvRepository.java

@ -26,6 +26,7 @@ import org.thingsboard.server.dao.model.sql.AttributeKvEntity;
import org.thingsboard.server.dao.util.SqlDao;
import java.util.List;
import java.util.UUID;
@SqlDao
public interface AttributeKvRepository extends CrudRepository<AttributeKvEntity, AttributeKvCompositeKey> {
@ -34,7 +35,7 @@ public interface AttributeKvRepository extends CrudRepository<AttributeKvEntity,
"AND a.id.entityId = :entityId " +
"AND a.id.attributeType = :attributeType")
List<AttributeKvEntity> findAllByEntityTypeAndEntityIdAndAttributeType(@Param("entityType") EntityType entityType,
@Param("entityId") String entityId,
@Param("entityId") UUID entityId,
@Param("attributeType") String attributeType);
@Transactional
@ -44,7 +45,7 @@ public interface AttributeKvRepository extends CrudRepository<AttributeKvEntity,
"AND a.id.attributeType = :attributeType " +
"AND a.id.attributeKey = :attributeKey")
void delete(@Param("entityType") EntityType entityType,
@Param("entityId") String entityId,
@Param("entityId") UUID entityId,
@Param("attributeType") String attributeType,
@Param("attributeKey") String attributeKey);
}

2
dao/src/main/java/org/thingsboard/server/dao/sql/attributes/HsqlAttributesInsertRepository.java

@ -46,7 +46,7 @@ public class HsqlAttributesInsertRepository extends AttributeKvInsertRepository
entities.forEach(entity -> {
jdbcTemplate.update(INSERT_OR_UPDATE, ps -> {
ps.setString(1, entity.getId().getEntityType().name());
ps.setString(2, entity.getId().getEntityId());
ps.setObject(2, entity.getId().getEntityId());
ps.setString(3, entity.getId().getAttributeType());
ps.setString(4, entity.getId().getAttributeKey());
ps.setString(5, entity.getStrValue());

11
dao/src/main/java/org/thingsboard/server/dao/sql/attributes/JpaAttributeDao.java

@ -22,7 +22,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
@ -43,8 +42,6 @@ import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID;
@Component
@Slf4j
@SqlDao
@ -115,14 +112,14 @@ public class JpaAttributeDao extends JpaAbstractDaoListeningExecutorService impl
DaoUtil.convertDataList(Lists.newArrayList(
attributeKvRepository.findAllByEntityTypeAndEntityIdAndAttributeType(
entityId.getEntityType(),
UUIDConverter.fromTimeUUID(entityId.getId()),
entityId.getId(),
attributeType))));
}
@Override
public ListenableFuture<Void> save(TenantId tenantId, EntityId entityId, String attributeType, AttributeKvEntry attribute) {
AttributeKvEntity entity = new AttributeKvEntity();
entity.setId(new AttributeKvCompositeKey(entityId.getEntityType(), fromTimeUUID(entityId.getId()), attributeType, attribute.getKey()));
entity.setId(new AttributeKvCompositeKey(entityId.getEntityType(), entityId.getId(), attributeType, attribute.getKey()));
entity.setLastUpdateTs(attribute.getLastUpdateTs());
entity.setStrValue(attribute.getStrValue().orElse(null));
entity.setDoubleValue(attribute.getDoubleValue().orElse(null));
@ -140,7 +137,7 @@ public class JpaAttributeDao extends JpaAbstractDaoListeningExecutorService impl
public ListenableFuture<List<Void>> removeAll(TenantId tenantId, EntityId entityId, String attributeType, List<String> keys) {
return service.submit(() -> {
keys.forEach(key ->
attributeKvRepository.delete(entityId.getEntityType(), UUIDConverter.fromTimeUUID(entityId.getId()), attributeType, key)
attributeKvRepository.delete(entityId.getEntityType(), entityId.getId(), attributeType, key)
);
return null;
});
@ -149,7 +146,7 @@ public class JpaAttributeDao extends JpaAbstractDaoListeningExecutorService impl
private AttributeKvCompositeKey getAttributeKvCompositeKey(EntityId entityId, String attributeType, String attributeKey) {
return new AttributeKvCompositeKey(
entityId.getEntityType(),
fromTimeUUID(entityId.getId()),
entityId.getId(),
attributeType,
attributeKey);
}

17
dao/src/main/java/org/thingsboard/server/dao/sql/audit/AuditLogRepository.java

@ -25,8 +25,9 @@ import org.thingsboard.server.common.data.audit.ActionType;
import org.thingsboard.server.dao.model.sql.AuditLogEntity;
import java.util.List;
import java.util.UUID;
public interface AuditLogRepository extends PagingAndSortingRepository<AuditLogEntity, String> {
public interface AuditLogRepository extends PagingAndSortingRepository<AuditLogEntity, UUID> {
@Query("SELECT a FROM AuditLogEntity a WHERE " +
"a.tenantId = :tenantId " +
@ -40,7 +41,7 @@ public interface AuditLogRepository extends PagingAndSortingRepository<AuditLogE
"OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))"
)
Page<AuditLogEntity> findByTenantId(
@Param("tenantId") String tenantId,
@Param("tenantId") UUID tenantId,
@Param("textSearch") String textSearch,
@Param("startId") String startId,
@Param("endId") String endId,
@ -58,9 +59,9 @@ public interface AuditLogRepository extends PagingAndSortingRepository<AuditLogE
"OR LOWER(a.actionType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))"
)
Page<AuditLogEntity> findAuditLogsByTenantIdAndEntityId(@Param("tenantId") String tenantId,
Page<AuditLogEntity> findAuditLogsByTenantIdAndEntityId(@Param("tenantId") UUID tenantId,
@Param("entityType") EntityType entityType,
@Param("entityId") String entityId,
@Param("entityId") UUID entityId,
@Param("textSearch") String textSearch,
@Param("startId") String startId,
@Param("endId") String endId,
@ -79,8 +80,8 @@ public interface AuditLogRepository extends PagingAndSortingRepository<AuditLogE
"OR LOWER(a.actionType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))"
)
Page<AuditLogEntity> findAuditLogsByTenantIdAndCustomerId(@Param("tenantId") String tenantId,
@Param("customerId") String customerId,
Page<AuditLogEntity> findAuditLogsByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("textSearch") String textSearch,
@Param("startId") String startId,
@Param("endId") String endId,
@ -98,8 +99,8 @@ public interface AuditLogRepository extends PagingAndSortingRepository<AuditLogE
"OR LOWER(a.actionType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))"
)
Page<AuditLogEntity> findAuditLogsByTenantIdAndUserId(@Param("tenantId") String tenantId,
@Param("userId") String userId,
Page<AuditLogEntity> findAuditLogsByTenantIdAndUserId(@Param("tenantId") UUID tenantId,
@Param("userId") UUID userId,
@Param("textSearch") String textSearch,
@Param("startId") String startId,
@Param("endId") String endId,

17
dao/src/main/java/org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java

@ -36,7 +36,6 @@ import java.util.List;
import java.util.Objects;
import java.util.UUID;
import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID;
import static org.thingsboard.server.dao.DaoUtil.endTimeToId;
import static org.thingsboard.server.dao.DaoUtil.startTimeToId;
@ -53,7 +52,7 @@ public class JpaAuditLogDao extends JpaAbstractDao<AuditLogEntity, AuditLog> imp
}
@Override
protected CrudRepository<AuditLogEntity, String> getCrudRepository() {
protected CrudRepository<AuditLogEntity, UUID> getCrudRepository() {
return auditLogRepository;
}
@ -70,9 +69,9 @@ public class JpaAuditLogDao extends JpaAbstractDao<AuditLogEntity, AuditLog> imp
return DaoUtil.toPageData(
auditLogRepository
.findAuditLogsByTenantIdAndEntityId(
fromTimeUUID(tenantId),
tenantId,
entityId.getEntityType(),
fromTimeUUID(entityId.getId()),
entityId.getId(),
Objects.toString(pageLink.getTextSearch(), ""),
startTimeToId(pageLink.getStartTime()),
endTimeToId(pageLink.getEndTime()),
@ -85,8 +84,8 @@ public class JpaAuditLogDao extends JpaAbstractDao<AuditLogEntity, AuditLog> imp
return DaoUtil.toPageData(
auditLogRepository
.findAuditLogsByTenantIdAndCustomerId(
fromTimeUUID(tenantId),
fromTimeUUID(customerId.getId()),
tenantId,
customerId.getId(),
Objects.toString(pageLink.getTextSearch(), ""),
startTimeToId(pageLink.getStartTime()),
endTimeToId(pageLink.getEndTime()),
@ -99,8 +98,8 @@ public class JpaAuditLogDao extends JpaAbstractDao<AuditLogEntity, AuditLog> imp
return DaoUtil.toPageData(
auditLogRepository
.findAuditLogsByTenantIdAndUserId(
fromTimeUUID(tenantId),
fromTimeUUID(userId.getId()),
tenantId,
userId.getId(),
Objects.toString(pageLink.getTextSearch(), ""),
startTimeToId(pageLink.getStartTime()),
endTimeToId(pageLink.getEndTime()),
@ -112,7 +111,7 @@ public class JpaAuditLogDao extends JpaAbstractDao<AuditLogEntity, AuditLog> imp
public PageData<AuditLog> findAuditLogsByTenantId(UUID tenantId, List<ActionType> actionTypes, TimePageLink pageLink) {
return DaoUtil.toPageData(
auditLogRepository.findByTenantId(
fromTimeUUID(tenantId),
tenantId,
Objects.toString(pageLink.getTextSearch(), ""),
startTimeToId(pageLink.getStartTime()),
endTimeToId(pageLink.getEndTime()),

4
dao/src/main/java/org/thingsboard/server/dao/sql/component/AbstractComponentDescriptorInsertRepository.java

@ -23,7 +23,6 @@ import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
import javax.persistence.EntityManager;
@ -69,7 +68,8 @@ public abstract class AbstractComponentDescriptorInsertRepository implements Com
protected Query getQuery(ComponentDescriptorEntity entity, String query) {
return entityManager.createNativeQuery(query, ComponentDescriptorEntity.class)
.setParameter("id", UUIDConverter.fromTimeUUID(entity.getUuid()))
.setParameter("id", entity.getUuid())
.setParameter("created_time", entity.getCreatedTime())
.setParameter("actions", entity.getActions())
.setParameter("clazz", entity.getClazz())
.setParameter("configuration_descriptor", entity.getConfigurationDescriptor().toString())

5
dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java

@ -18,7 +18,6 @@ package org.thingsboard.server.dao.sql.component;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.thingsboard.server.common.data.plugin.ComponentScope;
@ -26,13 +25,13 @@ import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
import org.thingsboard.server.dao.util.SqlDao;
import java.util.List;
import java.util.UUID;
/**
* Created by Valerii Sosliuk on 5/6/2017.
*/
@SqlDao
public interface ComponentDescriptorRepository extends PagingAndSortingRepository<ComponentDescriptorEntity, String> {
public interface ComponentDescriptorRepository extends PagingAndSortingRepository<ComponentDescriptorEntity, UUID> {
ComponentDescriptorEntity findByClazz(String clazz);

27
dao/src/main/java/org/thingsboard/server/dao/sql/component/HsqlComponentDescriptorInsertRepository.java

@ -16,17 +16,18 @@
package org.thingsboard.server.dao.sql.component;
import org.springframework.stereotype.Repository;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
import org.thingsboard.server.dao.util.HsqlDao;
import org.thingsboard.server.dao.util.SqlDao;
import javax.persistence.Query;
@SqlDao
@HsqlDao
@Repository
public class HsqlComponentDescriptorInsertRepository extends AbstractComponentDescriptorInsertRepository {
private static final String P_KEY_CONFLICT_STATEMENT = "(component_descriptor.id=I.id)";
private static final String P_KEY_CONFLICT_STATEMENT = "(component_descriptor.id=UUID(I.id))";
private static final String UNQ_KEY_CONFLICT_STATEMENT = "(component_descriptor.clazz=I.clazz)";
private static final String INSERT_OR_UPDATE_ON_P_KEY_CONFLICT = getInsertString(P_KEY_CONFLICT_STATEMENT);
@ -37,14 +38,30 @@ public class HsqlComponentDescriptorInsertRepository extends AbstractComponentDe
return saveAndGet(entity, INSERT_OR_UPDATE_ON_P_KEY_CONFLICT, INSERT_OR_UPDATE_ON_UNQ_KEY_CONFLICT);
}
@Override
protected Query getQuery(ComponentDescriptorEntity entity, String query) {
return entityManager.createNativeQuery(query, ComponentDescriptorEntity.class)
.setParameter("id", entity.getUuid().toString())
.setParameter("created_time", entity.getCreatedTime())
.setParameter("actions", entity.getActions())
.setParameter("clazz", entity.getClazz())
.setParameter("configuration_descriptor", entity.getConfigurationDescriptor().toString())
.setParameter("name", entity.getName())
.setParameter("scope", entity.getScope().name())
.setParameter("search_text", entity.getSearchText())
.setParameter("type", entity.getType().name());
}
@Override
protected ComponentDescriptorEntity doProcessSaveOrUpdate(ComponentDescriptorEntity entity, String query) {
getQuery(entity, query).executeUpdate();
return entityManager.find(ComponentDescriptorEntity.class, UUIDConverter.fromTimeUUID(entity.getUuid()));
return entityManager.find(ComponentDescriptorEntity.class, entity.getUuid());
}
private static String getInsertString(String conflictStatement) {
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" +
" 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)";
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 "
+ conflictStatement
+ " 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" +
" 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)";
}
}

10
dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java

@ -20,7 +20,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.id.ComponentDescriptorId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
@ -36,6 +35,7 @@ import org.thingsboard.server.dao.util.SqlDao;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
/**
* Created by Valerii Sosliuk on 5/6/2017.
@ -57,16 +57,18 @@ public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao<Comp
}
@Override
protected CrudRepository<ComponentDescriptorEntity, String> getCrudRepository() {
protected CrudRepository<ComponentDescriptorEntity, UUID> getCrudRepository() {
return componentDescriptorRepository;
}
@Override
public Optional<ComponentDescriptor> saveIfNotExist(TenantId tenantId, ComponentDescriptor component) {
if (component.getId() == null) {
component.setId(new ComponentDescriptorId(Uuids.timeBased()));
UUID uuid = Uuids.timeBased();
component.setId(new ComponentDescriptorId(uuid));
component.setCreatedTime(Uuids.unixTimestamp(uuid));
}
if (!componentDescriptorRepository.existsById(UUIDConverter.fromTimeUUID(component.getId().getId()))) {
if (!componentDescriptorRepository.existsById(component.getId().getId())) {
ComponentDescriptorEntity componentDescriptorEntity = new ComponentDescriptorEntity(component);
ComponentDescriptorEntity savedEntity = componentDescriptorInsertRepository.saveOrUpdate(componentDescriptorEntity);
return Optional.of(savedEntity.toData());

5
dao/src/main/java/org/thingsboard/server/dao/sql/component/PsqlComponentDescriptorInsertRepository.java

@ -19,7 +19,6 @@ import org.springframework.stereotype.Repository;
import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
import org.thingsboard.server.dao.util.PsqlDao;
import org.thingsboard.server.dao.util.SqlDao;
import org.thingsboard.server.dao.util.SqlTsDao;
@SqlDao
@PsqlDao
@ -49,10 +48,10 @@ public class PsqlComponentDescriptorInsertRepository extends AbstractComponentDe
}
private static String getInsertOrUpdateStatement(String conflictKeyStatement, String updateKeyStatement) {
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 *";
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 *";
}
private static String getUpdateStatement(String id) {
return "actions = :actions, " + id + ", configuration_descriptor = :configuration_descriptor, name = :name, scope = :scope, search_text = :search_text, type = :type";
return "actions = :actions, " + id + ",created_time = :created_time, configuration_descriptor = :configuration_descriptor, name = :name, scope = :scope, search_text = :search_text, type = :type";
}
}

9
dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java

@ -18,26 +18,25 @@ package org.thingsboard.server.dao.sql.customer;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.thingsboard.server.dao.model.sql.CustomerEntity;
import org.thingsboard.server.dao.util.SqlDao;
import java.util.List;
import java.util.UUID;
/**
* Created by Valerii Sosliuk on 5/6/2017.
*/
@SqlDao
public interface CustomerRepository extends PagingAndSortingRepository<CustomerEntity, String> {
public interface CustomerRepository extends PagingAndSortingRepository<CustomerEntity, UUID> {
@Query("SELECT c FROM CustomerEntity c WHERE c.tenantId = :tenantId " +
"AND LOWER(c.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<CustomerEntity> findByTenantId(@Param("tenantId") String tenantId,
Page<CustomerEntity> findByTenantId(@Param("tenantId") UUID tenantId,
@Param("textSearch") String textSearch,
Pageable pageable);
CustomerEntity findByTenantIdAndTitle(String tenantId, String title);
CustomerEntity findByTenantIdAndTitle(UUID tenantId, String title);
}

7
dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java

@ -19,7 +19,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.dao.DaoUtil;
@ -48,21 +47,21 @@ public class JpaCustomerDao extends JpaAbstractSearchTextDao<CustomerEntity, Cus
}
@Override
protected CrudRepository<CustomerEntity, String> getCrudRepository() {
protected CrudRepository<CustomerEntity, UUID> getCrudRepository() {
return customerRepository;
}
@Override
public PageData<Customer> findCustomersByTenantId(UUID tenantId, PageLink pageLink) {
return DaoUtil.toPageData(customerRepository.findByTenantId(
UUIDConverter.fromTimeUUID(tenantId),
tenantId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)));
}
@Override
public Optional<Customer> findCustomersByTenantIdAndTitle(UUID tenantId, String title) {
Customer customer = DaoUtil.getData(customerRepository.findByTenantIdAndTitle(UUIDConverter.fromTimeUUID(tenantId), title));
Customer customer = DaoUtil.getData(customerRepository.findByTenantIdAndTitle(tenantId, title));
return Optional.ofNullable(customer);
}
}

11
dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java

@ -18,23 +18,22 @@ package org.thingsboard.server.dao.sql.dashboard;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.thingsboard.server.dao.model.sql.DashboardInfoEntity;
import org.thingsboard.server.dao.util.SqlDao;
import java.util.List;
import java.util.UUID;
/**
* Created by Valerii Sosliuk on 5/6/2017.
*/
@SqlDao
public interface DashboardInfoRepository extends PagingAndSortingRepository<DashboardInfoEntity, String> {
public interface DashboardInfoRepository extends PagingAndSortingRepository<DashboardInfoEntity, UUID> {
@Query("SELECT di FROM DashboardInfoEntity di WHERE di.tenantId = :tenantId " +
"AND LOWER(di.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
Page<DashboardInfoEntity> findByTenantId(@Param("tenantId") String tenantId,
Page<DashboardInfoEntity> findByTenantId(@Param("tenantId") UUID tenantId,
@Param("searchText") String searchText,
Pageable pageable);
@ -42,8 +41,8 @@ public interface DashboardInfoRepository extends PagingAndSortingRepository<Dash
"AND di.id = re.toId AND re.toType = 'DASHBOARD' AND re.relationTypeGroup = 'DASHBOARD' " +
"AND re.relationType = 'Contains' AND re.fromId = :customerId AND re.fromType = 'CUSTOMER' " +
"AND LOWER(di.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
Page<DashboardInfoEntity> findByTenantIdAndCustomerId(@Param("tenantId") String tenantId,
@Param("customerId") String customerId,
Page<DashboardInfoEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("searchText") String searchText,
Pageable pageable);

4
dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardRepository.java

@ -19,9 +19,11 @@ import org.springframework.data.repository.CrudRepository;
import org.thingsboard.server.dao.model.sql.DashboardEntity;
import org.thingsboard.server.dao.util.SqlDao;
import java.util.UUID;
/**
* Created by Valerii Sosliuk on 5/6/2017.
*/
@SqlDao
public interface DashboardRepository extends CrudRepository<DashboardEntity, String> {
public interface DashboardRepository extends CrudRepository<DashboardEntity, UUID> {
}

4
dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardDao.java

@ -24,6 +24,8 @@ import org.thingsboard.server.dao.model.sql.DashboardEntity;
import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
import org.thingsboard.server.dao.util.SqlDao;
import java.util.UUID;
/**
* Created by Valerii Sosliuk on 5/6/2017.
*/
@ -40,7 +42,7 @@ public class JpaDashboardDao extends JpaAbstractSearchTextDao<DashboardEntity, D
}
@Override
protected CrudRepository<DashboardEntity, String> getCrudRepository() {
protected CrudRepository<DashboardEntity, UUID> getCrudRepository() {
return dashboardRepository;
}
}

7
dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java

@ -20,7 +20,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.DashboardInfo;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.dao.DaoUtil;
@ -61,7 +60,7 @@ public class JpaDashboardInfoDao extends JpaAbstractSearchTextDao<DashboardInfoE
public PageData<DashboardInfo> findDashboardsByTenantId(UUID tenantId, PageLink pageLink) {
return DaoUtil.toPageData(dashboardInfoRepository
.findByTenantId(
UUIDConverter.fromTimeUUID(tenantId),
tenantId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)));
}
@ -70,8 +69,8 @@ public class JpaDashboardInfoDao extends JpaAbstractSearchTextDao<DashboardInfoE
public PageData<DashboardInfo> findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, PageLink pageLink) {
return DaoUtil.toPageData(dashboardInfoRepository
.findByTenantIdAndCustomerId(
UUIDConverter.fromTimeUUID(tenantId),
UUIDConverter.fromTimeUUID(customerId),
tenantId,
customerId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)));
}

6
dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceCredentialsRepository.java

@ -19,13 +19,15 @@ import org.springframework.data.repository.CrudRepository;
import org.thingsboard.server.dao.model.sql.DeviceCredentialsEntity;
import org.thingsboard.server.dao.util.SqlDao;
import java.util.UUID;
/**
* Created by Valerii Sosliuk on 5/6/2017.
*/
@SqlDao
public interface DeviceCredentialsRepository extends CrudRepository<DeviceCredentialsEntity, String> {
public interface DeviceCredentialsRepository extends CrudRepository<DeviceCredentialsEntity, UUID> {
DeviceCredentialsEntity findByDeviceId(String deviceId);
DeviceCredentialsEntity findByDeviceId(UUID deviceId);
DeviceCredentialsEntity findByCredentialsId(String credentialsId);
}

39
dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java

@ -25,24 +25,25 @@ import org.thingsboard.server.dao.model.sql.DeviceInfoEntity;
import org.thingsboard.server.dao.util.SqlDao;
import java.util.List;
import java.util.UUID;
/**
* Created by Valerii Sosliuk on 5/6/2017.
*/
@SqlDao
public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntity, String> {
public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntity, UUID> {
@Query("SELECT new org.thingsboard.server.dao.model.sql.DeviceInfoEntity(d, c.title, c.additionalInfo) " +
"FROM DeviceEntity d " +
"LEFT JOIN CustomerEntity c on c.id = d.customerId " +
"WHERE d.id = :deviceId")
DeviceInfoEntity findDeviceInfoById(@Param("deviceId") String deviceId);
DeviceInfoEntity findDeviceInfoById(@Param("deviceId") UUID deviceId);
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
"AND d.customerId = :customerId " +
"AND LOWER(d.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
Page<DeviceEntity> findByTenantIdAndCustomerId(@Param("tenantId") String tenantId,
@Param("customerId") String customerId,
Page<DeviceEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("searchText") String searchText,
Pageable pageable);
@ -52,18 +53,18 @@ public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntit
"WHERE d.tenantId = :tenantId " +
"AND d.customerId = :customerId " +
"AND LOWER(d.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndCustomerId(@Param("tenantId") String tenantId,
@Param("customerId") String customerId,
Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("searchText") String searchText,
Pageable pageable);
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId")
Page<DeviceEntity> findByTenantId(@Param("tenantId") String tenantId,
Page<DeviceEntity> findByTenantId(@Param("tenantId") UUID tenantId,
Pageable pageable);
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
"AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<DeviceEntity> findByTenantId(@Param("tenantId") String tenantId,
Page<DeviceEntity> findByTenantId(@Param("tenantId") UUID tenantId,
@Param("textSearch") String textSearch,
Pageable pageable);
@ -72,14 +73,14 @@ public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntit
"LEFT JOIN CustomerEntity c on c.id = d.customerId " +
"WHERE d.tenantId = :tenantId " +
"AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<DeviceInfoEntity> findDeviceInfosByTenantId(@Param("tenantId") String tenantId,
Page<DeviceInfoEntity> findDeviceInfosByTenantId(@Param("tenantId") UUID tenantId,
@Param("textSearch") String textSearch,
Pageable pageable);
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
"AND d.type = :type " +
"AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<DeviceEntity> findByTenantIdAndType(@Param("tenantId") String tenantId,
Page<DeviceEntity> findByTenantIdAndType(@Param("tenantId") UUID tenantId,
@Param("type") String type,
@Param("textSearch") String textSearch,
Pageable pageable);
@ -90,7 +91,7 @@ public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntit
"WHERE d.tenantId = :tenantId " +
"AND d.type = :type " +
"AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndType(@Param("tenantId") String tenantId,
Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndType(@Param("tenantId") UUID tenantId,
@Param("type") String type,
@Param("textSearch") String textSearch,
Pageable pageable);
@ -99,8 +100,8 @@ public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntit
"AND d.customerId = :customerId " +
"AND d.type = :type " +
"AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<DeviceEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") String tenantId,
@Param("customerId") String customerId,
Page<DeviceEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("type") String type,
@Param("textSearch") String textSearch,
Pageable pageable);
@ -112,18 +113,18 @@ public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntit
"AND d.customerId = :customerId " +
"AND d.type = :type " +
"AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") String tenantId,
@Param("customerId") String customerId,
Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("type") String type,
@Param("textSearch") String textSearch,
Pageable pageable);
@Query("SELECT DISTINCT d.type FROM DeviceEntity d WHERE d.tenantId = :tenantId")
List<String> findTenantDeviceTypes(@Param("tenantId") String tenantId);
List<String> findTenantDeviceTypes(@Param("tenantId") UUID tenantId);
DeviceEntity findByTenantIdAndName(String tenantId, String name);
DeviceEntity findByTenantIdAndName(UUID tenantId, String name);
List<DeviceEntity> findDevicesByTenantIdAndCustomerIdAndIdIn(String tenantId, String customerId, List<String> deviceIds);
List<DeviceEntity> findDevicesByTenantIdAndCustomerIdAndIdIn(UUID tenantId, UUID customerId, List<UUID> deviceIds);
List<DeviceEntity> findDevicesByTenantIdAndIdIn(String tenantId, List<String> deviceIds);
List<DeviceEntity> findDevicesByTenantIdAndIdIn(UUID tenantId, List<UUID> deviceIds);
}

5
dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceCredentialsDao.java

@ -18,7 +18,6 @@ package org.thingsboard.server.dao.sql.device;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.dao.DaoUtil;
@ -45,13 +44,13 @@ public class JpaDeviceCredentialsDao extends JpaAbstractDao<DeviceCredentialsEnt
}
@Override
protected CrudRepository<DeviceCredentialsEntity, String> getCrudRepository() {
protected CrudRepository<DeviceCredentialsEntity, UUID> getCrudRepository() {
return deviceCredentialsRepository;
}
@Override
public DeviceCredentials findByDeviceId(TenantId tenantId, UUID deviceId) {
return DaoUtil.getData(deviceCredentialsRepository.findByDeviceId(UUIDConverter.fromTimeUUID(deviceId)));
return DaoUtil.getData(deviceCredentialsRepository.findByDeviceId(deviceId));
}
@Override

42
dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java

@ -24,7 +24,6 @@ import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.DeviceInfo;
import org.thingsboard.server.common.data.EntitySubtype;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
@ -42,9 +41,6 @@ import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID;
import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUIDs;
/**
* Created by Valerii Sosliuk on 5/6/2017.
*/
@ -61,13 +57,13 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
}
@Override
protected CrudRepository<DeviceEntity, String> getCrudRepository() {
protected CrudRepository<DeviceEntity, UUID> getCrudRepository() {
return deviceRepository;
}
@Override
public DeviceInfo findDeviceInfoById(TenantId tenantId, UUID deviceId) {
return DaoUtil.getData(deviceRepository.findDeviceInfoById(fromTimeUUID(deviceId)));
return DaoUtil.getData(deviceRepository.findDeviceInfoById(deviceId));
}
@Override
@ -75,12 +71,12 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
if (StringUtils.isEmpty(pageLink.getTextSearch())) {
return DaoUtil.toPageData(
deviceRepository.findByTenantId(
fromTimeUUID(tenantId),
tenantId,
DaoUtil.toPageable(pageLink)));
} else {
return DaoUtil.toPageData(
deviceRepository.findByTenantId(
fromTimeUUID(tenantId),
tenantId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)));
}
@ -90,22 +86,22 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
public PageData<DeviceInfo> findDeviceInfosByTenantId(UUID tenantId, PageLink pageLink) {
return DaoUtil.toPageData(
deviceRepository.findDeviceInfosByTenantId(
fromTimeUUID(tenantId),
tenantId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink, DeviceInfoEntity.deviceInfoColumnMap)));
}
@Override
public ListenableFuture<List<Device>> findDevicesByTenantIdAndIdsAsync(UUID tenantId, List<UUID> deviceIds) {
return service.submit(() -> DaoUtil.convertDataList(deviceRepository.findDevicesByTenantIdAndIdIn(UUIDConverter.fromTimeUUID(tenantId), fromTimeUUIDs(deviceIds))));
return service.submit(() -> DaoUtil.convertDataList(deviceRepository.findDevicesByTenantIdAndIdIn(tenantId, deviceIds)));
}
@Override
public PageData<Device> findDevicesByTenantIdAndCustomerId(UUID tenantId, UUID customerId, PageLink pageLink) {
return DaoUtil.toPageData(
deviceRepository.findByTenantIdAndCustomerId(
fromTimeUUID(tenantId),
fromTimeUUID(customerId),
tenantId,
customerId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)));
}
@ -114,8 +110,8 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
public PageData<DeviceInfo> findDeviceInfosByTenantIdAndCustomerId(UUID tenantId, UUID customerId, PageLink pageLink) {
return DaoUtil.toPageData(
deviceRepository.findDeviceInfosByTenantIdAndCustomerId(
fromTimeUUID(tenantId),
fromTimeUUID(customerId),
tenantId,
customerId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink, DeviceInfoEntity.deviceInfoColumnMap)));
}
@ -123,12 +119,12 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
@Override
public ListenableFuture<List<Device>> findDevicesByTenantIdCustomerIdAndIdsAsync(UUID tenantId, UUID customerId, List<UUID> deviceIds) {
return service.submit(() -> DaoUtil.convertDataList(
deviceRepository.findDevicesByTenantIdAndCustomerIdAndIdIn(fromTimeUUID(tenantId), fromTimeUUID(customerId), fromTimeUUIDs(deviceIds))));
deviceRepository.findDevicesByTenantIdAndCustomerIdAndIdIn(tenantId, customerId, deviceIds)));
}
@Override
public Optional<Device> findDeviceByTenantIdAndName(UUID tenantId, String name) {
Device device = DaoUtil.getData(deviceRepository.findByTenantIdAndName(fromTimeUUID(tenantId), name));
Device device = DaoUtil.getData(deviceRepository.findByTenantIdAndName(tenantId, name));
return Optional.ofNullable(device);
}
@ -136,7 +132,7 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
public PageData<Device> findDevicesByTenantIdAndType(UUID tenantId, String type, PageLink pageLink) {
return DaoUtil.toPageData(
deviceRepository.findByTenantIdAndType(
fromTimeUUID(tenantId),
tenantId,
type,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)));
@ -146,7 +142,7 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
public PageData<DeviceInfo> findDeviceInfosByTenantIdAndType(UUID tenantId, String type, PageLink pageLink) {
return DaoUtil.toPageData(
deviceRepository.findDeviceInfosByTenantIdAndType(
fromTimeUUID(tenantId),
tenantId,
type,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink, DeviceInfoEntity.deviceInfoColumnMap)));
@ -156,8 +152,8 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
public PageData<Device> findDevicesByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, PageLink pageLink) {
return DaoUtil.toPageData(
deviceRepository.findByTenantIdAndCustomerIdAndType(
fromTimeUUID(tenantId),
fromTimeUUID(customerId),
tenantId,
customerId,
type,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)));
@ -167,8 +163,8 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
public PageData<DeviceInfo> findDeviceInfosByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, PageLink pageLink) {
return DaoUtil.toPageData(
deviceRepository.findDeviceInfosByTenantIdAndCustomerIdAndType(
fromTimeUUID(tenantId),
fromTimeUUID(customerId),
tenantId,
customerId,
type,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink, DeviceInfoEntity.deviceInfoColumnMap)));
@ -176,7 +172,7 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
@Override
public ListenableFuture<List<EntitySubtype>> findTenantDeviceTypesAsync(UUID tenantId) {
return service.submit(() -> convertTenantDeviceTypesToDto(tenantId, deviceRepository.findTenantDeviceTypes(fromTimeUUID(tenantId))));
return service.submit(() -> convertTenantDeviceTypesToDto(tenantId, deviceRepository.findTenantDeviceTypes(tenantId)));
}
private List<EntitySubtype> convertTenantDeviceTypesToDto(UUID tenantId, List<String> types) {

36
dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java

@ -18,7 +18,6 @@ package org.thingsboard.server.dao.sql.entityview;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.thingsboard.server.dao.model.sql.EntityViewEntity;
@ -26,22 +25,23 @@ import org.thingsboard.server.dao.model.sql.EntityViewInfoEntity;
import org.thingsboard.server.dao.util.SqlDao;
import java.util.List;
import java.util.UUID;
/**
* Created by Victor Basanets on 8/31/2017.
*/
@SqlDao
public interface EntityViewRepository extends PagingAndSortingRepository<EntityViewEntity, String> {
public interface EntityViewRepository extends PagingAndSortingRepository<EntityViewEntity, UUID> {
@Query("SELECT new org.thingsboard.server.dao.model.sql.EntityViewInfoEntity(e, c.title, c.additionalInfo) " +
"FROM EntityViewEntity e " +
"LEFT JOIN CustomerEntity c on c.id = e.customerId " +
"WHERE e.id = :entityViewId")
EntityViewInfoEntity findEntityViewInfoById(@Param("entityViewId") String entityViewId);
EntityViewInfoEntity findEntityViewInfoById(@Param("entityViewId") UUID entityViewId);
@Query("SELECT e FROM EntityViewEntity e WHERE e.tenantId = :tenantId " +
"AND LOWER(e.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<EntityViewEntity> findByTenantId(@Param("tenantId") String tenantId,
Page<EntityViewEntity> findByTenantId(@Param("tenantId") UUID tenantId,
@Param("textSearch") String textSearch,
Pageable pageable);
@ -50,14 +50,14 @@ public interface EntityViewRepository extends PagingAndSortingRepository<EntityV
"LEFT JOIN CustomerEntity c on c.id = e.customerId " +
"WHERE e.tenantId = :tenantId " +
"AND LOWER(e.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<EntityViewInfoEntity> findEntityViewInfosByTenantId(@Param("tenantId") String tenantId,
Page<EntityViewInfoEntity> findEntityViewInfosByTenantId(@Param("tenantId") UUID tenantId,
@Param("textSearch") String textSearch,
Pageable pageable);
@Query("SELECT e FROM EntityViewEntity e WHERE e.tenantId = :tenantId " +
"AND e.type = :type " +
"AND LOWER(e.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<EntityViewEntity> findByTenantIdAndType(@Param("tenantId") String tenantId,
Page<EntityViewEntity> findByTenantIdAndType(@Param("tenantId") UUID tenantId,
@Param("type") String type,
@Param("textSearch") String textSearch,
Pageable pageable);
@ -68,7 +68,7 @@ public interface EntityViewRepository extends PagingAndSortingRepository<EntityV
"WHERE e.tenantId = :tenantId " +
"AND e.type = :type " +
"AND LOWER(e.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<EntityViewInfoEntity> findEntityViewInfosByTenantIdAndType(@Param("tenantId") String tenantId,
Page<EntityViewInfoEntity> findEntityViewInfosByTenantIdAndType(@Param("tenantId") UUID tenantId,
@Param("type") String type,
@Param("textSearch") String textSearch,
Pageable pageable);
@ -76,8 +76,8 @@ public interface EntityViewRepository extends PagingAndSortingRepository<EntityV
@Query("SELECT e FROM EntityViewEntity e WHERE e.tenantId = :tenantId " +
"AND e.customerId = :customerId " +
"AND LOWER(e.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
Page<EntityViewEntity> findByTenantIdAndCustomerId(@Param("tenantId") String tenantId,
@Param("customerId") String customerId,
Page<EntityViewEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("searchText") String searchText,
Pageable pageable);
@ -87,8 +87,8 @@ public interface EntityViewRepository extends PagingAndSortingRepository<EntityV
"WHERE e.tenantId = :tenantId " +
"AND e.customerId = :customerId " +
"AND LOWER(e.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
Page<EntityViewInfoEntity> findEntityViewInfosByTenantIdAndCustomerId(@Param("tenantId") String tenantId,
@Param("customerId") String customerId,
Page<EntityViewInfoEntity> findEntityViewInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("searchText") String searchText,
Pageable pageable);
@ -96,8 +96,8 @@ public interface EntityViewRepository extends PagingAndSortingRepository<EntityV
"AND e.customerId = :customerId " +
"AND e.type = :type " +
"AND LOWER(e.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
Page<EntityViewEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") String tenantId,
@Param("customerId") String customerId,
Page<EntityViewEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("type") String type,
@Param("searchText") String searchText,
Pageable pageable);
@ -109,16 +109,16 @@ public interface EntityViewRepository extends PagingAndSortingRepository<EntityV
"AND e.customerId = :customerId " +
"AND e.type = :type " +
"AND LOWER(e.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))")
Page<EntityViewInfoEntity> findEntityViewInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") String tenantId,
@Param("customerId") String customerId,
Page<EntityViewInfoEntity> findEntityViewInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("type") String type,
@Param("textSearch") String textSearch,
Pageable pageable);
EntityViewEntity findByTenantIdAndName(String tenantId, String name);
EntityViewEntity findByTenantIdAndName(UUID tenantId, String name);
List<EntityViewEntity> findAllByTenantIdAndEntityId(String tenantId, String entityId);
List<EntityViewEntity> findAllByTenantIdAndEntityId(UUID tenantId, UUID entityId);
@Query("SELECT DISTINCT ev.type FROM EntityViewEntity ev WHERE ev.tenantId = :tenantId")
List<String> findTenantEntityViewTypes(@Param("tenantId") String tenantId);
List<String> findTenantEntityViewTypes(@Param("tenantId") UUID tenantId);
}

41
dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java

@ -19,7 +19,10 @@ import com.google.common.util.concurrent.ListenableFuture;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.*;
import org.thingsboard.server.common.data.EntitySubtype;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.EntityView;
import org.thingsboard.server.common.data.EntityViewInfo;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
@ -37,8 +40,6 @@ import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID;
/**
* Created by Victor Basanets on 8/31/2017.
*/
@ -56,20 +57,20 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity,
}
@Override
protected CrudRepository<EntityViewEntity, String> getCrudRepository() {
protected CrudRepository<EntityViewEntity, UUID> getCrudRepository() {
return entityViewRepository;
}
@Override
public EntityViewInfo findEntityViewInfoById(TenantId tenantId, UUID entityViewId) {
return DaoUtil.getData(entityViewRepository.findEntityViewInfoById(fromTimeUUID(entityViewId)));
return DaoUtil.getData(entityViewRepository.findEntityViewInfoById(entityViewId));
}
@Override
public PageData<EntityView> findEntityViewsByTenantId(UUID tenantId, PageLink pageLink) {
return DaoUtil.toPageData(
entityViewRepository.findByTenantId(
fromTimeUUID(tenantId),
tenantId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)));
}
@ -78,7 +79,7 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity,
public PageData<EntityViewInfo> findEntityViewInfosByTenantId(UUID tenantId, PageLink pageLink) {
return DaoUtil.toPageData(
entityViewRepository.findEntityViewInfosByTenantId(
fromTimeUUID(tenantId),
tenantId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink, EntityViewInfoEntity.entityViewInfoColumnMap)));
}
@ -87,7 +88,7 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity,
public PageData<EntityView> findEntityViewsByTenantIdAndType(UUID tenantId, String type, PageLink pageLink) {
return DaoUtil.toPageData(
entityViewRepository.findByTenantIdAndType(
fromTimeUUID(tenantId),
tenantId,
type,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)));
@ -97,7 +98,7 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity,
public PageData<EntityViewInfo> findEntityViewInfosByTenantIdAndType(UUID tenantId, String type, PageLink pageLink) {
return DaoUtil.toPageData(
entityViewRepository.findEntityViewInfosByTenantIdAndType(
fromTimeUUID(tenantId),
tenantId,
type,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink, EntityViewInfoEntity.entityViewInfoColumnMap)));
@ -106,7 +107,7 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity,
@Override
public Optional<EntityView> findEntityViewByTenantIdAndName(UUID tenantId, String name) {
return Optional.ofNullable(
DaoUtil.getData(entityViewRepository.findByTenantIdAndName(fromTimeUUID(tenantId), name)));
DaoUtil.getData(entityViewRepository.findByTenantIdAndName(tenantId, name)));
}
@Override
@ -115,8 +116,8 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity,
PageLink pageLink) {
return DaoUtil.toPageData(
entityViewRepository.findByTenantIdAndCustomerId(
fromTimeUUID(tenantId),
fromTimeUUID(customerId),
tenantId,
customerId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)
));
@ -126,8 +127,8 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity,
public PageData<EntityViewInfo> findEntityViewInfosByTenantIdAndCustomerId(UUID tenantId, UUID customerId, PageLink pageLink) {
return DaoUtil.toPageData(
entityViewRepository.findEntityViewInfosByTenantIdAndCustomerId(
fromTimeUUID(tenantId),
fromTimeUUID(customerId),
tenantId,
customerId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink, EntityViewInfoEntity.entityViewInfoColumnMap)));
}
@ -136,8 +137,8 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity,
public PageData<EntityView> findEntityViewsByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, PageLink pageLink) {
return DaoUtil.toPageData(
entityViewRepository.findByTenantIdAndCustomerIdAndType(
fromTimeUUID(tenantId),
fromTimeUUID(customerId),
tenantId,
customerId,
type,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)
@ -148,8 +149,8 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity,
public PageData<EntityViewInfo> findEntityViewInfosByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, PageLink pageLink) {
return DaoUtil.toPageData(
entityViewRepository.findEntityViewInfosByTenantIdAndCustomerIdAndType(
fromTimeUUID(tenantId),
fromTimeUUID(customerId),
tenantId,
customerId,
type,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink, EntityViewInfoEntity.entityViewInfoColumnMap)));
@ -158,12 +159,12 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity,
@Override
public ListenableFuture<List<EntityView>> findEntityViewsByTenantIdAndEntityIdAsync(UUID tenantId, UUID entityId) {
return service.submit(() -> DaoUtil.convertDataList(
entityViewRepository.findAllByTenantIdAndEntityId(UUIDConverter.fromTimeUUID(tenantId), UUIDConverter.fromTimeUUID(entityId))));
entityViewRepository.findAllByTenantIdAndEntityId(tenantId, entityId)));
}
@Override
public ListenableFuture<List<EntitySubtype>> findTenantEntityViewTypesAsync(UUID tenantId) {
return service.submit(() -> convertTenantEntityViewTypesToDto(tenantId, entityViewRepository.findTenantEntityViewTypes(fromTimeUUID(tenantId))));
return service.submit(() -> convertTenantEntityViewTypesToDto(tenantId, entityViewRepository.findTenantEntityViewTypes(tenantId)));
}
private List<EntitySubtype> convertTenantEntityViewTypesToDto(UUID tenantId, List<String> types) {

4
dao/src/main/java/org/thingsboard/server/dao/sql/event/AbstractEventInsertRepository.java

@ -23,7 +23,6 @@ import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.dao.model.sql.EventEntity;
import javax.persistence.EntityManager;
@ -69,7 +68,8 @@ public abstract class AbstractEventInsertRepository implements EventInsertReposi
protected Query getQuery(EventEntity entity, String query) {
return entityManager.createNativeQuery(query, EventEntity.class)
.setParameter("id", UUIDConverter.fromTimeUUID(entity.getUuid()))
.setParameter("id", entity.getUuid())
.setParameter("created_time", entity.getCreatedTime())
.setParameter("body", entity.getBody().toString())
.setParameter("entity_id", entity.getEntityId())
.setParameter("entity_type", entity.getEntityType().name())

39
dao/src/main/java/org/thingsboard/server/dao/sql/event/EventRepository.java

@ -25,60 +25,61 @@ import org.thingsboard.server.dao.model.sql.EventEntity;
import org.thingsboard.server.dao.util.SqlDao;
import java.util.List;
import java.util.UUID;
/**
* Created by Valerii Sosliuk on 5/3/2017.
*/
@SqlDao
public interface EventRepository extends PagingAndSortingRepository<EventEntity, String> {
public interface EventRepository extends PagingAndSortingRepository<EventEntity, UUID> {
EventEntity findByTenantIdAndEntityTypeAndEntityIdAndEventTypeAndEventUid(String tenantId,
EventEntity findByTenantIdAndEntityTypeAndEntityIdAndEventTypeAndEventUid(UUID tenantId,
EntityType entityType,
String entityId,
UUID entityId,
String eventType,
String eventUid);
EventEntity findByTenantIdAndEntityTypeAndEntityId(String tenantId,
EventEntity findByTenantIdAndEntityTypeAndEntityId(UUID tenantId,
EntityType entityType,
String entityId);
UUID entityId);
@Query("SELECT e FROM EventEntity e WHERE e.tenantId = :tenantId AND e.entityType = :entityType " +
"AND e.entityId = :entityId AND e.eventType = :eventType ORDER BY e.eventType DESC, e.id DESC")
List<EventEntity> findLatestByTenantIdAndEntityTypeAndEntityIdAndEventType(
@Param("tenantId") String tenantId,
@Param("tenantId") UUID tenantId,
@Param("entityType") EntityType entityType,
@Param("entityId") String entityId,
@Param("entityId") UUID entityId,
@Param("eventType") String eventType,
Pageable pageable);
@Query("SELECT e FROM EventEntity e WHERE " +
"e.tenantId = :tenantId " +
"AND e.entityType = :entityType AND e.entityId = :entityId " +
"AND (:startId IS NULL OR e.id >= :startId) " +
"AND (:endId IS NULL OR e.id <= :endId) " +
"AND (:startTime IS NULL OR e.createdTime >= :startTime) " +
"AND (:endTime IS NULL OR e.createdTime <= :endTime) " +
"AND LOWER(e.eventType) LIKE LOWER(CONCAT(:textSearch, '%'))"
)
Page<EventEntity> findEventsByTenantIdAndEntityId(@Param("tenantId") String tenantId,
Page<EventEntity> findEventsByTenantIdAndEntityId(@Param("tenantId") UUID tenantId,
@Param("entityType") EntityType entityType,
@Param("entityId") String entityId,
@Param("entityId") UUID entityId,
@Param("textSearch") String textSearch,
@Param("startId") String startId,
@Param("endId") String endId,
@Param("startTime") Long startTime,
@Param("endTime") Long endTime,
Pageable pageable);
@Query("SELECT e FROM EventEntity e WHERE " +
"e.tenantId = :tenantId " +
"AND e.entityType = :entityType AND e.entityId = :entityId " +
"AND e.eventType = :eventType " +
"AND (:startId IS NULL OR e.id >= :startId) " +
"AND (:endId IS NULL OR e.id <= :endId)"
"AND (:startTime IS NULL OR e.createdTime >= :startTime) " +
"AND (:endTime IS NULL OR e.createdTime <= :endTime)"
)
Page<EventEntity> findEventsByTenantIdAndEntityIdAndEventType(@Param("tenantId") String tenantId,
Page<EventEntity> findEventsByTenantIdAndEntityIdAndEventType(@Param("tenantId") UUID tenantId,
@Param("entityType") EntityType entityType,
@Param("entityId") String entityId,
@Param("entityId") UUID entityId,
@Param("eventType") String eventType,
@Param("startId") String startId,
@Param("endId") String endId,
@Param("startTime") Long startTime,
@Param("endTime") Long endTime,
Pageable pageable);
}

23
dao/src/main/java/org/thingsboard/server/dao/sql/event/HsqlEventInsertRepository.java

@ -16,11 +16,12 @@
package org.thingsboard.server.dao.sql.event;
import org.springframework.stereotype.Repository;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.dao.model.sql.EventEntity;
import org.thingsboard.server.dao.util.HsqlDao;
import org.thingsboard.server.dao.util.SqlDao;
import javax.persistence.Query;
@SqlDao
@HsqlDao
@Repository
@ -40,11 +41,25 @@ public class HsqlEventInsertRepository extends AbstractEventInsertRepository {
@Override
protected EventEntity doProcessSaveOrUpdate(EventEntity entity, String query) {
getQuery(entity, query).executeUpdate();
return entityManager.find(EventEntity.class, UUIDConverter.fromTimeUUID(entity.getUuid()));
return entityManager.find(EventEntity.class, entity.getUuid());
}
protected Query getQuery(EventEntity entity, String query) {
return entityManager.createNativeQuery(query, EventEntity.class)
.setParameter("id", entity.getUuid().toString())
.setParameter("created_time", entity.getCreatedTime())
.setParameter("body", entity.getBody().toString())
.setParameter("entity_id", entity.getEntityId().toString())
.setParameter("entity_type", entity.getEntityType().name())
.setParameter("event_type", entity.getEventType())
.setParameter("event_uid", entity.getEventUid())
.setParameter("tenant_id", entity.getTenantId().toString())
.setParameter("ts", entity.getTs());
}
private static String getInsertString(String conflictStatement) {
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" +
" 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)";
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
+ " 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" +
" 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)";
}
}

59
dao/src/main/java/org/thingsboard/server/dao/sql/event/JpaBaseEventDao.java

@ -38,9 +38,12 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTimeDao;
import org.thingsboard.server.dao.util.SqlDao;
import javax.persistence.criteria.Predicate;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID;
import static org.thingsboard.server.dao.DaoUtil.endTimeToId;
import static org.thingsboard.server.dao.DaoUtil.startTimeToId;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@ -67,7 +70,7 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event
}
@Override
protected CrudRepository<EventEntity, String> getCrudRepository() {
protected CrudRepository<EventEntity, UUID> getCrudRepository() {
return eventRepository;
}
@ -75,7 +78,16 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event
public Event save(TenantId tenantId, Event event) {
log.debug("Save event [{}] ", event);
if (event.getId() == null) {
event.setId(new EventId(Uuids.timeBased()));
UUID timeBased = Uuids.timeBased();
event.setId(new EventId(timeBased));
event.setCreatedTime(Uuids.unixTimestamp(timeBased));
} else if (event.getCreatedTime() == 0L) {
UUID eventId = event.getId().getId();
if (eventId.version() == 1) {
event.setCreatedTime(Uuids.unixTimestamp(eventId));
} else {
event.setCreatedTime(System.currentTimeMillis());
}
}
if (StringUtils.isEmpty(event.getUid())) {
event.setUid(event.getId().toString());
@ -87,7 +99,16 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event
public ListenableFuture<Event> saveAsync(Event event) {
log.debug("Save event [{}] ", event);
if (event.getId() == null) {
event.setId(new EventId(Uuids.timeBased()));
UUID timeBased = Uuids.timeBased();
event.setId(new EventId(timeBased));
event.setCreatedTime(Uuids.unixTimestamp(timeBased));
} else if (event.getCreatedTime() == 0L) {
UUID eventId = event.getId().getId();
if (eventId.version() == 1) {
event.setCreatedTime(Uuids.unixTimestamp(eventId));
} else {
event.setCreatedTime(System.currentTimeMillis());
}
}
if (StringUtils.isEmpty(event.getUid())) {
event.setUid(event.getId().toString());
@ -103,7 +124,7 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event
@Override
public Event findEvent(UUID tenantId, EntityId entityId, String eventType, String eventUid) {
return DaoUtil.getData(eventRepository.findByTenantIdAndEntityTypeAndEntityIdAndEventTypeAndEventUid(
UUIDConverter.fromTimeUUID(tenantId), entityId.getEntityType(), UUIDConverter.fromTimeUUID(entityId.getId()), eventType, eventUid));
tenantId, entityId.getEntityType(), entityId.getId(), eventType, eventUid));
}
@Override
@ -111,12 +132,12 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event
return DaoUtil.toPageData(
eventRepository
.findEventsByTenantIdAndEntityId(
fromTimeUUID(tenantId),
tenantId,
entityId.getEntityType(),
fromTimeUUID(entityId.getId()),
entityId.getId(),
Objects.toString(pageLink.getTextSearch(), ""),
startTimeToId(pageLink.getStartTime()),
endTimeToId(pageLink.getEndTime()),
pageLink.getStartTime(),
pageLink.getEndTime(),
DaoUtil.toPageable(pageLink)));
}
@ -125,21 +146,21 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event
return DaoUtil.toPageData(
eventRepository
.findEventsByTenantIdAndEntityIdAndEventType(
fromTimeUUID(tenantId),
tenantId,
entityId.getEntityType(),
fromTimeUUID(entityId.getId()),
entityId.getId(),
eventType,
startTimeToId(pageLink.getStartTime()),
endTimeToId(pageLink.getEndTime()),
pageLink.getStartTime(),
pageLink.getEndTime(),
DaoUtil.toPageable(pageLink)));
}
@Override
public List<Event> findLatestEvents(UUID tenantId, EntityId entityId, String eventType, int limit) {
List<EventEntity> latest = eventRepository.findLatestByTenantIdAndEntityTypeAndEntityIdAndEventType(
UUIDConverter.fromTimeUUID(tenantId),
tenantId,
entityId.getEntityType(),
UUIDConverter.fromTimeUUID(entityId.getId()),
entityId.getId(),
eventType,
PageRequest.of(0, limit));
return DaoUtil.convertDataList(latest);
@ -149,7 +170,7 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event
log.debug("Save event [{}] ", entity);
if (entity.getTenantId() == null) {
log.trace("Save system event with predefined id {}", systemTenantId);
entity.setTenantId(UUIDConverter.fromTimeUUID(systemTenantId));
entity.setTenantId(systemTenantId);
}
if (entity.getUuid() == null) {
entity.setUuid(Uuids.timeBased());
@ -168,13 +189,13 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event
return (root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
if (tenantId != null) {
Predicate tenantIdPredicate = criteriaBuilder.equal(root.get("tenantId"), UUIDConverter.fromTimeUUID(tenantId));
Predicate tenantIdPredicate = criteriaBuilder.equal(root.get("tenantId"), tenantId);
predicates.add(tenantIdPredicate);
}
if (entityId != null) {
Predicate entityTypePredicate = criteriaBuilder.equal(root.get("entityType"), entityId.getEntityType());
predicates.add(entityTypePredicate);
Predicate entityIdPredicate = criteriaBuilder.equal(root.get("entityId"), UUIDConverter.fromTimeUUID(entityId.getId()));
Predicate entityIdPredicate = criteriaBuilder.equal(root.get("entityId"), entityId.getId());
predicates.add(entityIdPredicate);
}
if (eventType != null) {

8
dao/src/main/java/org/thingsboard/server/dao/sql/event/PsqlEventInsertRepository.java

@ -28,10 +28,10 @@ import org.thingsboard.server.dao.util.SqlDao;
public class PsqlEventInsertRepository extends AbstractEventInsertRepository {
private static final String P_KEY_CONFLICT_STATEMENT = "(id)";
private static final String UNQ_KEY_CONFLICT_STATEMENT = "(tenant_id, entity_type, entity_id, event_type, event_uid)";
private static final String UNQ_KEY_CONFLICT_STATEMENT = "(tenant_id, created_time, entity_type, entity_id, event_type, event_uid)";
private static final String UPDATE_P_KEY_STATEMENT = "id = :id";
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";
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";
private static final String INSERT_OR_UPDATE_ON_P_KEY_CONFLICT = getInsertOrUpdateString(P_KEY_CONFLICT_STATEMENT, UPDATE_UNQ_KEY_STATEMENT);
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 {
}
private static String getInsertOrUpdateString(String eventKeyStatement, String updateKeyStatement) {
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 *";
return "INSERT INTO event (id, created_time, body, entity_id, entity_type, event_type, event_uid, tenant_id, ts) " +
"VALUES (:id, :created_time, :body, :entity_id, :entity_type, :event_type, :event_uid, :tenant_id, :ts) " +
"ON CONFLICT " + eventKeyStatement + " DO UPDATE SET body = :body, ts = :ts," + updateKeyStatement + " returning *";
}
}

157
dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java

@ -17,10 +17,10 @@ package org.thingsboard.server.dao.sql.query;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
@ -46,8 +46,6 @@ import org.thingsboard.server.common.data.relation.EntitySearchDirection;
import org.thingsboard.server.common.data.relation.EntityTypeFilter;
import org.thingsboard.server.dao.util.SqlDao;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.math.BigInteger;
import java.util.Collections;
import java.util.HashMap;
@ -77,7 +75,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
public static final String HIERARCHICAL_QUERY_TEMPLATE = " FROM (WITH RECURSIVE related_entities(from_id, from_type, to_id, to_type, relation_type, lvl) AS (" +
" SELECT from_id, from_type, to_id, to_type, relation_type, 1 as lvl" +
" FROM relation" +
" WHERE $in_id = '%s' and $in_type = '%s' and relation_type_group = 'COMMON'" +
" WHERE $in_id = :relation_root_id and $in_type = :relation_root_type and relation_type_group = 'COMMON'" +
" UNION ALL" +
" SELECT r.from_id, r.from_type, r.to_id, r.to_type, r.relation_type, lvl + 1" +
" FROM relation r" +
@ -90,21 +88,23 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
public static final String HIERARCHICAL_TO_QUERY_TEMPLATE = HIERARCHICAL_QUERY_TEMPLATE.replace("$in", "to").replace("$out", "from");
public static final String HIERARCHICAL_FROM_QUERY_TEMPLATE = HIERARCHICAL_QUERY_TEMPLATE.replace("$in", "from").replace("$out", "to");
@PersistenceContext
private EntityManager entityManager;
@Autowired
protected NamedParameterJdbcTemplate jdbcTemplate;
@Override
public long countEntitiesByQuery(TenantId tenantId, CustomerId customerId, EntityCountQuery query) {
EntityType entityType = resolveEntityType(query.getEntityFilter());
String countQuery = String.format("select count(e.id) from %s e where %s",
getEntityTableQuery(query.getEntityFilter(), entityType), this.buildEntityWhere(tenantId, customerId, query.getEntityFilter(),
Collections.emptyList(), entityType));
return ((BigInteger) entityManager.createNativeQuery(countQuery)
.getSingleResult()).longValue();
EntityQueryContext ctx = new EntityQueryContext();
ctx.append("select count(e.id) from ");
ctx.append(addEntityTableQuery(ctx, query.getEntityFilter(), entityType));
ctx.append(" e where ");
ctx.append(buildEntityWhere(ctx, tenantId, customerId, query.getEntityFilter(), Collections.emptyList(), entityType));
return jdbcTemplate.queryForObject(ctx.getQuery(), ctx, Long.class);
}
@Override
public PageData<EntityData> findEntityDataByQuery(TenantId tenantId, CustomerId customerId, EntityDataQuery query) {
EntityQueryContext ctx = new EntityQueryContext();
EntityType entityType = resolveEntityType(query.getEntityFilter());
EntityDataPageLink pageLink = query.getPageLink();
@ -128,9 +128,9 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
.collect(Collectors.toList());
String entityWhereClause = this.buildEntityWhere(tenantId, customerId, query.getEntityFilter(), entityFieldsFiltersMapping, entityType);
String latestJoins = EntityKeyMapping.buildLatestJoins(query.getEntityFilter(), entityType, allLatestMappings);
String whereClause = this.buildWhere(selectionMapping, latestFiltersMapping, pageLink.getTextSearch());
String entityWhereClause = this.buildEntityWhere(ctx, tenantId, customerId, query.getEntityFilter(), entityFieldsFiltersMapping, entityType);
String latestJoins = EntityKeyMapping.buildLatestJoins(ctx, query.getEntityFilter(), entityType, allLatestMappings);
String whereClause = this.buildWhere(ctx, selectionMapping, latestFiltersMapping, pageLink.getTextSearch());
String entityFieldsSelection = EntityKeyMapping.buildSelections(entityFieldsSelectionMapping);
String entityTypeStr;
if (query.getEntityFilter().getType().equals(EntityFilterType.RELATIONS_QUERY)) {
@ -139,9 +139,9 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
entityTypeStr = "'" + entityType.name() + "'";
}
if (!StringUtils.isEmpty(entityFieldsSelection)) {
entityFieldsSelection = String.format("e.id, %s, %s", entityTypeStr, entityFieldsSelection);
entityFieldsSelection = String.format("e.id id, %s entity_type, %s", entityTypeStr, entityFieldsSelection);
} else {
entityFieldsSelection = String.format("e.id, %s", entityTypeStr);
entityFieldsSelection = String.format("e.id id, %s entity_type", entityTypeStr);
}
String latestSelection = EntityKeyMapping.buildSelections(latestSelectionMapping);
String topSelection = "entities.*";
@ -152,13 +152,13 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
String fromClause = String.format("from (select %s from (select %s from %s e where %s) entities %s %s) result",
topSelection,
entityFieldsSelection,
getEntityTableQuery(query.getEntityFilter(), entityType),
addEntityTableQuery(ctx, query.getEntityFilter(), entityType),
entityWhereClause,
latestJoins,
whereClause);
int totalElements = ((BigInteger) entityManager.createNativeQuery(String.format("select count(*) %s", fromClause))
.getSingleResult()).intValue();
int totalElements = jdbcTemplate.queryForObject(String.format("select count(*) %s", fromClause), ctx, Integer.class);
String dataQuery = String.format("select * %s", fromClause);
@ -179,17 +179,18 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
if (pageLink.getPageSize() > 0) {
dataQuery = String.format("%s limit %s offset %s", dataQuery, pageLink.getPageSize(), startIndex);
}
List rows = entityManager.createNativeQuery(dataQuery).getResultList();
List<Map<String, Object>> rows = jdbcTemplate.queryForList(dataQuery, ctx);
return EntityDataAdapter.createEntityData(pageLink, selectionMapping, rows, totalElements);
}
private String buildEntityWhere(TenantId tenantId,
private String buildEntityWhere(EntityQueryContext ctx,
TenantId tenantId,
CustomerId customerId,
EntityFilter entityFilter,
List<EntityKeyMapping> entityFieldsFilters,
EntityType entityType) {
String permissionQuery = this.buildPermissionQuery(entityFilter, tenantId, customerId, entityType);
String entityFilterQuery = this.buildEntityFilterQuery(entityFilter);
String permissionQuery = this.buildPermissionQuery(ctx, entityFilter, tenantId, customerId, entityType);
String entityFilterQuery = this.buildEntityFilterQuery(ctx, entityFilter);
String result = permissionQuery;
if (!entityFilterQuery.isEmpty()) {
result += " and " + entityFilterQuery;
@ -200,35 +201,42 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
return result;
}
private String buildPermissionQuery(EntityFilter entityFilter, TenantId tenantId, CustomerId customerId, EntityType entityType) {
private String buildPermissionQuery(EntityQueryContext ctx, EntityFilter entityFilter, TenantId tenantId, CustomerId customerId, EntityType entityType) {
switch (entityFilter.getType()) {
case RELATIONS_QUERY:
case DEVICE_SEARCH_QUERY:
case ASSET_SEARCH_QUERY:
return String.format("e.tenant_id='%s' and e.customer_id='%s'", UUIDConverter.fromTimeUUID(tenantId.getId()), UUIDConverter.fromTimeUUID(customerId.getId()));
ctx.addUuidParameter("permissions_tenant_id", tenantId.getId());
ctx.addUuidParameter("permissions_customer_id", customerId.getId());
return "e.tenant_id=:permissions_tenant_id and e.customer_id=:permissions_customer_id";
default:
if (entityType == EntityType.TENANT) {
return String.format("e.id='%s'", UUIDConverter.fromTimeUUID(tenantId.getId()));
ctx.addUuidParameter("permissions_tenant_id", tenantId.getId());
return "e.id=:permissions_tenant_id";
} else if (entityType == EntityType.CUSTOMER) {
return String.format("e.tenant_id='%s' and e.id='%s'", UUIDConverter.fromTimeUUID(tenantId.getId()), UUIDConverter.fromTimeUUID(customerId.getId()));
ctx.addUuidParameter("permissions_tenant_id", tenantId.getId());
ctx.addUuidParameter("permissions_customer_id", customerId.getId());
return "e.tenant_id=:permissions_tenant_id and e.id=:permissions_customer_id";
} else {
return String.format("e.tenant_id='%s' and e.customer_id='%s'", UUIDConverter.fromTimeUUID(tenantId.getId()), UUIDConverter.fromTimeUUID(customerId.getId()));
ctx.addUuidParameter("permissions_tenant_id", tenantId.getId());
ctx.addUuidParameter("permissions_customer_id", customerId.getId());
return "e.tenant_id=:permissions_tenant_id and e.customer_id=:permissions_customer_id";
}
}
}
private String buildEntityFilterQuery(EntityFilter entityFilter) {
private String buildEntityFilterQuery(EntityQueryContext ctx, EntityFilter entityFilter) {
switch (entityFilter.getType()) {
case SINGLE_ENTITY:
return this.singleEntityQuery((SingleEntityFilter) entityFilter);
return this.singleEntityQuery(ctx, (SingleEntityFilter) entityFilter);
case ENTITY_LIST:
return this.entityListQuery((EntityListFilter) entityFilter);
return this.entityListQuery(ctx, (EntityListFilter) entityFilter);
case ENTITY_NAME:
return this.entityNameQuery((EntityNameFilter) entityFilter);
return this.entityNameQuery(ctx, (EntityNameFilter) entityFilter);
case ASSET_TYPE:
case DEVICE_TYPE:
case ENTITY_VIEW_TYPE:
return this.typeQuery(entityFilter);
return this.typeQuery(ctx, entityFilter);
case RELATIONS_QUERY:
case DEVICE_SEARCH_QUERY:
case ASSET_SEARCH_QUERY:
@ -238,52 +246,60 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
}
}
private String getEntityTableQuery(EntityFilter entityFilter, EntityType entityType) {
private String addEntityTableQuery(EntityQueryContext ctx, EntityFilter entityFilter, EntityType entityType) {
switch (entityFilter.getType()) {
case RELATIONS_QUERY:
return relationQuery((RelationsQueryFilter) entityFilter);
return relationQuery(ctx, (RelationsQueryFilter) entityFilter);
case DEVICE_SEARCH_QUERY:
DeviceSearchQueryFilter deviceQuery = (DeviceSearchQueryFilter) entityFilter;
return entitySearchQuery(deviceQuery, EntityType.DEVICE, deviceQuery.getDeviceTypes());
return entitySearchQuery(ctx, deviceQuery, EntityType.DEVICE, deviceQuery.getDeviceTypes());
case ASSET_SEARCH_QUERY:
AssetSearchQueryFilter assetQuery = (AssetSearchQueryFilter) entityFilter;
return entitySearchQuery(assetQuery, EntityType.ASSET, assetQuery.getAssetTypes());
return entitySearchQuery(ctx, assetQuery, EntityType.ASSET, assetQuery.getAssetTypes());
default:
return entityTableMap.get(entityType);
}
}
private String entitySearchQuery(EntitySearchQueryFilter entityFilter, EntityType entityType, List<String> types) {
private String entitySearchQuery(EntityQueryContext ctx, EntitySearchQueryFilter entityFilter, EntityType entityType, List<String> types) {
EntityId rootId = entityFilter.getRootEntity();
//TODO: fetch last level only.
//TODO: fetch distinct records.
String lvlFilter = getLvlFilter(entityFilter.getMaxLevel());
String selectFields = "SELECT tenant_id, customer_id, id, type, name, label FROM " + entityType.name() + " WHERE id in ( SELECT entity_id";
String from = getQueryTemplate(entityFilter.getDirection());
String whereFilter = " WHERE re.relation_type = :where_relation_type AND re.to_type = :where_entity_type";
String whereFilter = " WHERE " + " re.relation_type = '" + entityFilter.getRelationType() + "'" +
" AND re.to_type = '" + entityType.name() + "'";
from = String.format(from, UUIDConverter.fromTimeUUID(rootId.getId()), rootId.getEntityType().name(), lvlFilter, whereFilter);
from = String.format(from, lvlFilter, whereFilter);
String query = "( " + selectFields + from + ")";
if (types != null && !types.isEmpty()) {
query += " and type in (" + types.stream().map(type -> "'" + type + "'").collect(Collectors.joining(", ")) + ")";
query += " and type in (:relation_sub_types)";
ctx.addStringListParameter("relation_sub_types", types);
}
query += " )";
ctx.addUuidParameter("relation_root_id", rootId.getId());
ctx.addStringParameter("relation_root_type", rootId.getEntityType().name());
ctx.addStringParameter("where_relation_type", entityFilter.getRelationType());
ctx.addStringParameter("where_entity_type", entityType.name());
return query;
}
private String relationQuery(RelationsQueryFilter entityFilter) {
private String relationQuery(EntityQueryContext ctx, RelationsQueryFilter entityFilter) {
EntityId rootId = entityFilter.getRootEntity();
String lvlFilter = getLvlFilter(entityFilter.getMaxLevel());
String selectFields = getSelectTenantId() + ", " + getSelectCustomerId() + ", " +
" entity.entity_id as id," + getSelectType() + ", " + getSelectName() + ", " +
getSelectLabel() + ", entity.entity_type as entity_type";
String from = getQueryTemplate(entityFilter.getDirection());
ctx.addUuidParameter("relation_root_id", rootId.getId());
ctx.addStringParameter("relation_root_type", rootId.getEntityType().name());
StringBuilder whereFilter;
if (entityFilter.getFilters() != null && !entityFilter.getFilters().isEmpty()) {
whereFilter = new StringBuilder(" WHERE ");
boolean first = true;
boolean single = entityFilter.getFilters().size() == 1;
int entityTypeFilterIdx = 0;
for (EntityTypeFilter etf : entityFilter.getFilters()) {
if (first) {
first = false;
@ -291,21 +307,23 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
whereFilter.append(" AND ");
}
String relationType = etf.getRelationType();
String entityTypes = etf.getEntityTypes().stream().map(type -> "'" + type + "'").collect(Collectors.joining(", "));
if (!single) {
whereFilter.append(" (");
}
whereFilter.append(" re.relation_type = '").append(relationType).append("' and re.")
whereFilter.append(" re.relation_type = :where_relation_type").append(entityTypeFilterIdx).append(" and re.")
.append(entityFilter.getDirection().equals(EntitySearchDirection.FROM) ? "to" : "from")
.append("_type in (").append(entityTypes).append(")");
.append("_type in (:where_entity_types").append(entityTypeFilterIdx).append(")");
if (!single) {
whereFilter.append(" )");
}
ctx.addStringParameter("where_relation_type" + entityTypeFilterIdx, relationType);
ctx.addStringListParameter("where_entity_types" + entityTypeFilterIdx, etf.getEntityTypes().stream().map(EntityType::name).collect(Collectors.toList()));
entityTypeFilterIdx++;
}
} else {
whereFilter = new StringBuilder();
}
from = String.format(from, UUIDConverter.fromTimeUUID(rootId.getId()), rootId.getEntityType().name(), lvlFilter, whereFilter);
from = String.format(from, lvlFilter, whereFilter);
return "( " + selectFields + from + ")";
}
@ -344,7 +362,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
private String getSelectCustomerId() {
return "CASE" +
" WHEN entity.entity_type = 'TENANT'" +
" THEN '" + UUIDConverter.fromTimeUUID(TenantId.NULL_UUID) + "'" +
" THEN UUID('" + TenantId.NULL_UUID + "')" +
" WHEN entity.entity_type = 'CUSTOMER' THEN entity_id" +
" WHEN entity.entity_type = 'USER'" +
" THEN (select customer_id from tb_user where id = entity_id)" +
@ -411,10 +429,9 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
" END as label";
}
private String buildWhere
(List<EntityKeyMapping> selectionMapping, List<EntityKeyMapping> latestFiltersMapping, String searchText) {
String latestFilters = EntityKeyMapping.buildQuery(latestFiltersMapping);
String textSearchQuery = this.buildTextSearchQuery(selectionMapping, searchText);
private String buildWhere(EntityQueryContext ctx, List<EntityKeyMapping> selectionMapping, List<EntityKeyMapping> latestFiltersMapping, String searchText) {
String latestFilters = EntityKeyMapping.buildQuery(ctx, latestFiltersMapping);
String textSearchQuery = this.buildTextSearchQuery(ctx, selectionMapping, searchText);
String query;
if (!StringUtils.isEmpty(latestFilters) && !StringUtils.isEmpty(textSearchQuery)) {
query = String.join(" AND ", latestFilters, textSearchQuery);
@ -430,32 +447,38 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
}
}
private String buildTextSearchQuery(List<EntityKeyMapping> selectionMapping, String searchText) {
private String buildTextSearchQuery(EntityQueryContext ctx, List<EntityKeyMapping> selectionMapping, String searchText) {
if (!StringUtils.isEmpty(searchText) && !selectionMapping.isEmpty()) {
String lowerSearchText = searchText.toLowerCase() + "%";
List<String> searchPredicates = selectionMapping.stream().map(mapping -> String.format("LOWER(%s) LIKE '%s'",
mapping.getValueAlias(), lowerSearchText)).collect(Collectors.toList());
List<String> searchPredicates = selectionMapping.stream().map(mapping -> {
String paramName = mapping.getValueAlias() + "_lowerSearchText";
ctx.addStringParameter(paramName, lowerSearchText);
return String.format("LOWER(%s) LIKE :%s", mapping.getValueAlias(), paramName);
}
).collect(Collectors.toList());
return String.format("(%s)", String.join(" or ", searchPredicates));
} else {
return null;
}
}
private String singleEntityQuery(SingleEntityFilter filter) {
return String.format("e.id='%s'", UUIDConverter.fromTimeUUID(filter.getSingleEntity().getId()));
private String singleEntityQuery(EntityQueryContext ctx, SingleEntityFilter filter) {
ctx.addUuidParameter("entity_filter_single_entity_id", filter.getSingleEntity().getId());
return "e.id=:entity_filter_single_entity_id";
}
private String entityListQuery(EntityListFilter filter) {
return String.format("e.id in (%s)",
filter.getEntityList().stream().map(UUID::fromString).map(UUIDConverter::fromTimeUUID)
.map(s -> String.format("'%s'", s)).collect(Collectors.joining(",")));
private String entityListQuery(EntityQueryContext ctx, EntityListFilter filter) {
ctx.addUuidListParameter("entity_filter_entity_ids", filter.getEntityList().stream().map(UUID::fromString).collect(Collectors.toList()));
return "e.id in (:entity_filter_entity_ids)";
}
private String entityNameQuery(EntityNameFilter filter) {
return String.format("lower(e.search_text) like lower(concat('%s', '%%'))", filter.getEntityNameFilter());
private String entityNameQuery(EntityQueryContext ctx, EntityNameFilter filter) {
ctx.addStringParameter("entity_filter_name_filter", filter.getEntityNameFilter());
return "lower(e.search_text) like lower(concat(:entity_filter_name_filter, '%%'))";
}
private String typeQuery(EntityFilter filter) {
private String typeQuery(EntityQueryContext ctx, EntityFilter filter) {
String type;
String name;
switch (filter.getType()) {
@ -474,7 +497,9 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
default:
throw new RuntimeException("Not supported!");
}
return String.format("e.type = '%s' and lower(e.search_text) like lower(concat('%s', '%%'))", type, name);
ctx.addStringParameter("entity_filter_type_query_type", type);
ctx.addStringParameter("entity_filter_type_query_name", name);
return "e.type = :entity_filter_type_query_type and lower(e.search_text) like lower(concat(:entity_filter_type_query_name, '%%'))";
}
private EntityType resolveEntityType(EntityFilter entityFilter) {

22
dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityDataAdapter.java

@ -26,39 +26,41 @@ import org.thingsboard.server.common.data.query.EntityKey;
import org.thingsboard.server.common.data.query.EntityKeyType;
import org.thingsboard.server.common.data.query.TsValue;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
public class EntityDataAdapter {
public static PageData<EntityData> createEntityData(EntityDataPageLink pageLink,
List<EntityKeyMapping> selectionMapping,
List<Object[]> rows,
List<Map<String, Object>> rows,
int totalElements) {
int totalPages = pageLink.getPageSize() > 0 ? (int)Math.ceil((float)totalElements / pageLink.getPageSize()) : 1;
int totalPages = pageLink.getPageSize() > 0 ? (int) Math.ceil((float) totalElements / pageLink.getPageSize()) : 1;
int startIndex = pageLink.getPageSize() * pageLink.getPage();
boolean hasNext = pageLink.getPageSize() > 0 && totalElements > startIndex + rows.size();
List<EntityData> entitiesData = convertListToEntityData(rows, selectionMapping);
return new PageData<>(entitiesData, totalPages, totalElements, hasNext);
}
private static List<EntityData> convertListToEntityData(List<Object[]> result, List<EntityKeyMapping> selectionMapping) {
private static List<EntityData> convertListToEntityData(List<Map<String, Object>> result, List<EntityKeyMapping> selectionMapping) {
return result.stream().map(row -> toEntityData(row, selectionMapping)).collect(Collectors.toList());
}
private static EntityData toEntityData(Object[] row, List<EntityKeyMapping> selectionMapping) {
String id = (String)row[0];
EntityType entityType = EntityType.valueOf((String)row[1]);
EntityId entityId = EntityIdFactory.getByTypeAndUuid(entityType, UUIDConverter.fromString(id));
private static EntityData toEntityData(Map<String, Object> row, List<EntityKeyMapping> selectionMapping) {
UUID id = (UUID)row.get("id");
EntityType entityType = EntityType.valueOf((String) row.get("entity_type"));
EntityId entityId = EntityIdFactory.getByTypeAndUuid(entityType, id);
Map<EntityKeyType, Map<String, TsValue>> latest = new HashMap<>();
Map<String, TsValue[]> timeseries = new HashMap<>();
EntityData entityData = new EntityData(entityId, latest, timeseries);
for (EntityKeyMapping mapping: selectionMapping) {
for (EntityKeyMapping mapping : selectionMapping) {
if (!mapping.isIgnore()) {
EntityKey entityKey = mapping.getEntityKey();
Object value = row[mapping.getIndex()];
Object value = row.get(mapping.getValueAlias());
String strValue;
long ts;
if (entityKey.getType().equals(EntityKeyType.ENTITY_FIELD)) {
@ -66,7 +68,7 @@ public class EntityDataAdapter {
ts = System.currentTimeMillis();
} else {
strValue = convertValue(value);
Object tsObject = row[mapping.getIndex() + 1];
Object tsObject = row.get(mapping.getTsAlias());
ts = tsObject != null ? Long.parseLong(tsObject.toString()) : 0;
}
TsValue tsValue = new TsValue(ts, strValue);

115
dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityKeyMapping.java

@ -73,6 +73,7 @@ public class EntityKeyMapping {
private boolean ignore = false;
private List<KeyFilter> keyFilters;
private EntityKey entityKey;
private int paramIdx = 0;
public boolean hasFilter() {
return keyFilters != null && !keyFilters.isEmpty();
@ -95,23 +96,23 @@ public class EntityKeyMapping {
String column = entityFieldColumnMap.get(entityKey.getKey());
return String.format("e.%s as %s", column, getValueAlias());
} else if (entityKey.getType().equals(EntityKeyType.TIME_SERIES)) {
return buildTimeseriesSelection();
return buildTimeSeriesSelection();
} else {
return buildAttributeSelection();
}
}
public Stream<String> toQueries() {
public Stream<String> toQueries(EntityQueryContext ctx) {
if (hasFilter()) {
String keyAlias = entityKey.getType().equals(EntityKeyType.ENTITY_FIELD) ? "e" : alias;
return keyFilters.stream().map(keyFilter ->
this.buildKeyQuery(keyAlias, keyFilter));
this.buildKeyQuery(ctx, keyAlias, keyFilter));
} else {
return null;
}
}
public String toLatestJoin(EntityFilter entityFilter, EntityType entityType) {
public String toLatestJoin(EntityQueryContext ctx, EntityFilter entityFilter, EntityType entityType) {
String entityTypeStr;
if (entityFilter.getType().equals(EntityFilterType.RELATIONS_QUERY)) {
entityTypeStr = "entities.entity_type";
@ -119,12 +120,13 @@ public class EntityKeyMapping {
entityTypeStr = "'" + entityType.name() + "'";
}
String join = hasFilter() ? "left join" : "left outer join";
ctx.addStringParameter(alias + "_key_id", entityKey.getKey());
if (entityKey.getType().equals(EntityKeyType.TIME_SERIES)) {
// TODO:
throw new RuntimeException("Not implemented!");
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)",
join, alias, alias, alias, alias);
} else {
String query = String.format("%s attribute_kv %s ON %s.entity_id=entities.id AND %s.entity_type=%s AND %s.attribute_key='%s'",
join, alias, alias, alias, entityTypeStr, alias, entityKey.getKey());
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",
join, alias, alias, alias, entityTypeStr, alias, alias);
if (!entityKey.getType().equals(EntityKeyType.ATTRIBUTE)) {
String scope;
if (entityKey.getType().equals(EntityKeyType.CLIENT_ATTRIBUTE)) {
@ -145,13 +147,13 @@ public class EntityKeyMapping {
Collectors.joining(", "));
}
public static String buildLatestJoins(EntityFilter entityFilter, EntityType entityType, List<EntityKeyMapping> latestMappings) {
return latestMappings.stream().map(mapping -> mapping.toLatestJoin(entityFilter, entityType)).collect(
public static String buildLatestJoins(EntityQueryContext ctx, EntityFilter entityFilter, EntityType entityType, List<EntityKeyMapping> latestMappings) {
return latestMappings.stream().map(mapping -> mapping.toLatestJoin(ctx, entityFilter, entityType)).collect(
Collectors.joining(" "));
}
public static String buildQuery(List<EntityKeyMapping> mappings) {
return mappings.stream().flatMap(EntityKeyMapping::toQueries).collect(
public static String buildQuery(EntityQueryContext ctx, List<EntityKeyMapping> mappings) {
return mappings.stream().flatMap(mapping -> mapping.toQueries(ctx)).collect(
Collectors.joining(" AND "));
}
@ -250,40 +252,46 @@ public class EntityKeyMapping {
return String.join(", ", attrValSelection, attrTsSelection);
}
private String buildTimeseriesSelection() {
// TODO:
private String buildTimeSeriesSelection() {
String attrValAlias = getValueAlias();
String attrTsAlias = getTsAlias();
return String.format("(select '') as %s, (select 1) as %s", attrValAlias, attrTsAlias);
String attrValSelection =
String.format("(coalesce(cast(%s.bool_v as varchar), '') || " +
"coalesce(%s.str_v, '') || " +
"coalesce(cast(%s.long_v as varchar), '') || " +
"coalesce(cast(%s.dbl_v as varchar), '') || " +
"coalesce(cast(%s.json_v as varchar), '')) as %s", alias, alias, alias, alias, alias, attrValAlias);
String attrTsSelection = String.format("%s.ts as %s", alias, attrTsAlias);
return String.join(", ", attrValSelection, attrTsSelection);
}
private String buildKeyQuery(String alias, KeyFilter keyFilter) {
return this.buildPredicateQuery(alias, keyFilter.getKey(), keyFilter.getPredicate());
private String buildKeyQuery(EntityQueryContext ctx, String alias, KeyFilter keyFilter) {
return this.buildPredicateQuery(ctx, alias, keyFilter.getKey(), keyFilter.getPredicate());
}
private String buildPredicateQuery(String alias, EntityKey key, KeyFilterPredicate predicate) {
private String buildPredicateQuery(EntityQueryContext ctx, String alias, EntityKey key, KeyFilterPredicate predicate) {
if (predicate.getType().equals(FilterPredicateType.COMPLEX)) {
return this.buildComplexPredicateQuery(alias, key, (ComplexFilterPredicate) predicate);
return this.buildComplexPredicateQuery(ctx, alias, key, (ComplexFilterPredicate) predicate);
} else {
return this.buildSimplePredicateQuery(alias, key, predicate);
return this.buildSimplePredicateQuery(ctx, alias, key, predicate);
}
}
private String buildComplexPredicateQuery(String alias, EntityKey key, ComplexFilterPredicate predicate) {
private String buildComplexPredicateQuery(EntityQueryContext ctx, String alias, EntityKey key, ComplexFilterPredicate predicate) {
return predicate.getPredicates().stream()
.map(keyFilterPredicate -> this.buildPredicateQuery(alias, key, keyFilterPredicate)).collect(Collectors.joining(
.map(keyFilterPredicate -> this.buildPredicateQuery(ctx, alias, key, keyFilterPredicate)).collect(Collectors.joining(
" " + predicate.getOperation().name() + " "
));
}
private String buildSimplePredicateQuery(String alias, EntityKey key, KeyFilterPredicate predicate) {
private String buildSimplePredicateQuery(EntityQueryContext ctx, String alias, EntityKey key, KeyFilterPredicate predicate) {
if (predicate.getType().equals(FilterPredicateType.NUMERIC)) {
if (key.getType().equals(EntityKeyType.ENTITY_FIELD)) {
String column = entityFieldColumnMap.get(key.getKey());
return this.buildNumericPredicateQuery(alias + "." + column, (NumericFilterPredicate) predicate);
return this.buildNumericPredicateQuery(ctx, alias + "." + column, (NumericFilterPredicate) predicate);
} else {
String longQuery = this.buildNumericPredicateQuery(alias + ".long_v", (NumericFilterPredicate) predicate);
String doubleQuery = this.buildNumericPredicateQuery(alias + ".dbl_v", (NumericFilterPredicate) predicate);
String longQuery = this.buildNumericPredicateQuery(ctx, alias + ".long_v", (NumericFilterPredicate) predicate);
String doubleQuery = this.buildNumericPredicateQuery(ctx, alias + ".dbl_v", (NumericFilterPredicate) predicate);
return String.format("(%s or %s)", longQuery, doubleQuery);
}
} else {
@ -295,15 +303,16 @@ public class EntityKeyMapping {
}
String field = alias + "." + column;
if (predicate.getType().equals(FilterPredicateType.STRING)) {
return this.buildStringPredicateQuery(field, (StringFilterPredicate) predicate);
return this.buildStringPredicateQuery(ctx, field, (StringFilterPredicate) predicate);
} else {
return this.buildBooleanPredicateQuery(field, (BooleanFilterPredicate) predicate);
return this.buildBooleanPredicateQuery(ctx, field, (BooleanFilterPredicate) predicate);
}
}
}
private String buildStringPredicateQuery(String field, StringFilterPredicate stringFilterPredicate) {
private String buildStringPredicateQuery(EntityQueryContext ctx, String field, StringFilterPredicate stringFilterPredicate) {
String operationField = field;
String paramName = getNextParameterName(field);
String value = stringFilterPredicate.getValue();
String stringOperationQuery = "";
if (stringFilterPredicate.isIgnoreCase()) {
@ -312,65 +321,77 @@ public class EntityKeyMapping {
}
switch (stringFilterPredicate.getOperation()) {
case EQUAL:
stringOperationQuery = String.format("%s = '%s'", operationField, value);
stringOperationQuery = String.format("%s = :%s", operationField, paramName);
break;
case NOT_EQUAL:
stringOperationQuery = String.format("%s != '%s'", operationField, value);
stringOperationQuery = String.format("%s != :%s", operationField, paramName);
break;
case STARTS_WITH:
stringOperationQuery = String.format("%s like '%s%%'", operationField, value);
value += "%";
stringOperationQuery = String.format("%s like :%s", operationField, paramName);
break;
case ENDS_WITH:
stringOperationQuery = String.format("%s like '%%%s'", operationField, value);
value = "%" + value;
stringOperationQuery = String.format("%s like :%s", operationField, paramName);
break;
case CONTAINS:
stringOperationQuery = String.format("%s like '%%%s%%'", operationField, value);
value = "%" + value + "%";
stringOperationQuery = String.format("%s like :%s", operationField, paramName);
break;
case NOT_CONTAINS:
stringOperationQuery = String.format("%s not like '%%%s%%'", operationField, value);
value = "%" + value + "%";
stringOperationQuery = String.format("%s not like :%s", operationField, paramName);
break;
}
ctx.addStringParameter(paramName, value);
return String.format("(%s is not null and %s)", field, stringOperationQuery);
}
private String buildNumericPredicateQuery(String field, NumericFilterPredicate numericFilterPredicate) {
double value = numericFilterPredicate.getValue();
private String buildNumericPredicateQuery(EntityQueryContext ctx, String field, NumericFilterPredicate numericFilterPredicate) {
String paramName = getNextParameterName(field);
ctx.addDoubleParameter(paramName, numericFilterPredicate.getValue());
String numericOperationQuery = "";
switch (numericFilterPredicate.getOperation()) {
case EQUAL:
numericOperationQuery = String.format("%s = %s", field, value);
numericOperationQuery = String.format("%s = :%s", field, paramName);
break;
case NOT_EQUAL:
numericOperationQuery = String.format("%s != '%s'", field, value);
numericOperationQuery = String.format("%s != :%s", field, paramName);
break;
case GREATER:
numericOperationQuery = String.format("%s > %s", field, value);
numericOperationQuery = String.format("%s > :%s", field, paramName);
break;
case GREATER_OR_EQUAL:
numericOperationQuery = String.format("%s >= %s", field, value);
numericOperationQuery = String.format("%s >= :%s", field, paramName);
break;
case LESS:
numericOperationQuery = String.format("%s < %s", field, value);
numericOperationQuery = String.format("%s < :%s", field, paramName);
break;
case LESS_OR_EQUAL:
numericOperationQuery = String.format("%s <= %s", field, value);
numericOperationQuery = String.format("%s <= :%s", field, paramName);
break;
}
return String.format("(%s is not null and %s)", field, numericOperationQuery);
}
private String buildBooleanPredicateQuery(String field,
private String buildBooleanPredicateQuery(EntityQueryContext ctx, String field,
BooleanFilterPredicate booleanFilterPredicate) {
boolean value = booleanFilterPredicate.isValue();
String paramName = getNextParameterName(field);
ctx.addBooleanParameter(paramName, booleanFilterPredicate.isValue());
String booleanOperationQuery = "";
switch (booleanFilterPredicate.getOperation()) {
case EQUAL:
booleanOperationQuery = String.format("%s = %s", field, value);
booleanOperationQuery = String.format("%s = :%s", field, paramName);
break;
case NOT_EQUAL:
booleanOperationQuery = String.format("%s != %s", field, value);
booleanOperationQuery = String.format("%s != :%s", field, paramName);
break;
}
return String.format("(%s is not null and %s)", field, booleanOperationQuery);
}
private String getNextParameterName(String field) {
paramIdx++;
return field.replace(".", "_") + "_" + paramIdx;
}
}

122
dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityQueryContext.java

@ -0,0 +1,122 @@
/**
* Copyright © 2016-2020 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.dao.sql.query;
import org.hibernate.type.PostgresUUIDType;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import java.sql.Types;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
public class EntityQueryContext implements SqlParameterSource {
private static final PostgresUUIDType UUID_TYPE = new PostgresUUIDType();
private final StringBuilder query;
private final Map<String, Parameter> params;
public EntityQueryContext() {
query = new StringBuilder();
params = new HashMap<>();
}
void addParameter(String name, Object value, int type, String typeName) {
Parameter existing = params.put(name, new Parameter(value, type, typeName));
if (existing != null) {
throw new RuntimeException("Parameter with name: " + name + " was already registered!");
}
}
public void append(String s) {
query.append(s);
}
@Override
public boolean hasValue(String paramName) {
return params.containsKey(paramName);
}
@Override
public Object getValue(String paramName) throws IllegalArgumentException {
return checkParameter(paramName).value;
}
@Override
public int getSqlType(String paramName) {
return checkParameter(paramName).type;
}
private Parameter checkParameter(String paramName) {
Parameter param = params.get(paramName);
if (param == null) {
throw new RuntimeException("Parameter with name: " + paramName + " is not set!");
}
return param;
}
@Override
public String getTypeName(String paramName) {
return params.get(paramName).name;
}
@Override
public String[] getParameterNames() {
return params.keySet().toArray(new String[]{});
}
public void addUuidParameter(String name, UUID value) {
addParameter(name, value, UUID_TYPE.sqlType(), UUID_TYPE.getName());
}
public void addStringParameter(String name, String value) {
addParameter(name, value, Types.VARCHAR, "VARCHAR");
}
public void addDoubleParameter(String name, double value) {
addParameter(name, value, Types.DOUBLE, "DOUBLE");
}
public void addStringListParameter(String name, List<String> value) {
addParameter(name, value, Types.VARCHAR, "VARCHAR");
}
public void addBooleanParameter(String name, boolean value) {
addParameter(name, value, Types.BOOLEAN, "BOOLEAN");
}
public void addUuidListParameter(String name, List<UUID> value) {
addParameter(name, value, UUID_TYPE.sqlType(), UUID_TYPE.getName());
}
public String getQuery() {
return query.toString();
}
public static class Parameter {
private final Object value;
private final int type;
private final String name;
public Parameter(Object value, int type, String name) {
this.value = value;
this.type = type;
this.name = name;
}
}
}

22
dao/src/main/java/org/thingsboard/server/dao/sql/relation/HsqlRelationInsertRepository.java

@ -22,6 +22,8 @@ import org.thingsboard.server.dao.model.sql.RelationEntity;
import org.thingsboard.server.dao.util.HsqlDao;
import org.thingsboard.server.dao.util.SqlDao;
import javax.persistence.Query;
@HsqlDao
@SqlDao
@Repository
@ -30,9 +32,25 @@ public class HsqlRelationInsertRepository extends AbstractRelationInsertReposito
private static final String INSERT_ON_CONFLICT_DO_UPDATE = "MERGE INTO relation USING (VALUES :fromId, :fromType, :toId, :toType, :relationTypeGroup, :relationType, :additionalInfo) R " +
"(from_id, from_type, to_id, to_type, relation_type_group, relation_type, additional_info) " +
"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) " +
"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) " +
"WHEN MATCHED THEN UPDATE SET relation.additional_info = R.additional_info " +
"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)";
"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)";
protected Query getQuery(RelationEntity entity, String query) {
Query nativeQuery = entityManager.createNativeQuery(query, RelationEntity.class);
if (entity.getAdditionalInfo() == null) {
nativeQuery.setParameter("additionalInfo", null);
} else {
nativeQuery.setParameter("additionalInfo", entity.getAdditionalInfo().toString());
}
return nativeQuery
.setParameter("fromId", entity.getFromId().toString())
.setParameter("fromType", entity.getFromType())
.setParameter("toId", entity.getToId().toString())
.setParameter("toType", entity.getToType())
.setParameter("relationTypeGroup", entity.getRelationTypeGroup())
.setParameter("relationType", entity.getRelationType());
}
@Override
public RelationEntity saveOrUpdate(RelationEntity entity) {

37
dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java

@ -44,8 +44,6 @@ import javax.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.List;
import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID;
/**
* Created by Valerii Sosliuk on 5/29/2017.
*/
@ -64,7 +62,7 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple
public ListenableFuture<List<EntityRelation>> findAllByFrom(TenantId tenantId, EntityId from, RelationTypeGroup typeGroup) {
return service.submit(() -> DaoUtil.convertDataList(
relationRepository.findAllByFromIdAndFromTypeAndRelationTypeGroup(
UUIDConverter.fromTimeUUID(from.getId()),
from.getId(),
from.getEntityType().name(),
typeGroup.name())));
}
@ -73,7 +71,7 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple
public ListenableFuture<List<EntityRelation>> findAllByFromAndType(TenantId tenantId, EntityId from, String relationType, RelationTypeGroup typeGroup) {
return service.submit(() -> DaoUtil.convertDataList(
relationRepository.findAllByFromIdAndFromTypeAndRelationTypeAndRelationTypeGroup(
UUIDConverter.fromTimeUUID(from.getId()),
from.getId(),
from.getEntityType().name(),
relationType,
typeGroup.name())));
@ -83,7 +81,7 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple
public ListenableFuture<List<EntityRelation>> findAllByTo(TenantId tenantId, EntityId to, RelationTypeGroup typeGroup) {
return service.submit(() -> DaoUtil.convertDataList(
relationRepository.findAllByToIdAndToTypeAndRelationTypeGroup(
UUIDConverter.fromTimeUUID(to.getId()),
to.getId(),
to.getEntityType().name(),
typeGroup.name())));
}
@ -92,7 +90,7 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple
public ListenableFuture<List<EntityRelation>> findAllByToAndType(TenantId tenantId, EntityId to, String relationType, RelationTypeGroup typeGroup) {
return service.submit(() -> DaoUtil.convertDataList(
relationRepository.findAllByToIdAndToTypeAndRelationTypeAndRelationTypeGroup(
UUIDConverter.fromTimeUUID(to.getId()),
to.getId(),
to.getEntityType().name(),
relationType,
typeGroup.name())));
@ -111,9 +109,9 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple
}
private RelationCompositeKey getRelationCompositeKey(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
return new RelationCompositeKey(fromTimeUUID(from.getId()),
return new RelationCompositeKey(from.getId(),
from.getEntityType().name(),
fromTimeUUID(to.getId()),
to.getId(),
to.getEntityType().name(),
relationType,
typeGroup.name());
@ -166,10 +164,10 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple
@Override
public boolean deleteOutboundRelations(TenantId tenantId, EntityId entity) {
boolean relationExistsBeforeDelete = relationRepository
.findAllByFromIdAndFromType(UUIDConverter.fromTimeUUID(entity.getId()), entity.getEntityType().name())
.findAllByFromIdAndFromType(entity.getId(), entity.getEntityType().name())
.size() > 0;
if (relationExistsBeforeDelete) {
relationRepository.deleteByFromIdAndFromType(UUIDConverter.fromTimeUUID(entity.getId()), entity.getEntityType().name());
relationRepository.deleteByFromIdAndFromType(entity.getId(), entity.getEntityType().name());
}
return relationExistsBeforeDelete;
}
@ -179,33 +177,20 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple
return service.submit(
() -> {
boolean relationExistsBeforeDelete = relationRepository
.findAllByFromIdAndFromType(UUIDConverter.fromTimeUUID(entity.getId()), entity.getEntityType().name())
.findAllByFromIdAndFromType(entity.getId(), entity.getEntityType().name())
.size() > 0;
if (relationExistsBeforeDelete) {
relationRepository.deleteByFromIdAndFromType(UUIDConverter.fromTimeUUID(entity.getId()), entity.getEntityType().name());
relationRepository.deleteByFromIdAndFromType(entity.getId(), entity.getEntityType().name());
}
return relationExistsBeforeDelete;
});
}
@Override
public ListenableFuture<PageData<EntityRelation>> findRelations(TenantId tenantId, EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType childType, TimePageLink pageLink) {
Specification<RelationEntity> timeSearchSpec = JpaAbstractSearchTimeDao.getTimeSearchPageSpec(pageLink, "toId");
Specification<RelationEntity> fieldsSpec = getEntityFieldsSpec(from, relationType, typeGroup, childType);
Sort.Direction sortDirection = Sort.Direction.DESC;
if (pageLink.getSortOrder() != null) {
sortDirection = pageLink.getSortOrder().getDirection() == SortOrder.Direction.ASC ? Sort.Direction.ASC : Sort.Direction.DESC;
}
Pageable pageable = PageRequest.of(pageLink.getPage(), pageLink.getPageSize(), sortDirection, "toId");
return service.submit(() ->
DaoUtil.toPageData(relationRepository.findAll(Specification.where(timeSearchSpec).and(fieldsSpec), pageable)));
}
private Specification<RelationEntity> getEntityFieldsSpec(EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType childType) {
return (root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
if (from != null) {
Predicate fromIdPredicate = criteriaBuilder.equal(root.get("fromId"), UUIDConverter.fromTimeUUID(from.getId()));
Predicate fromIdPredicate = criteriaBuilder.equal(root.get("fromId"), from.getId());
predicates.add(fromIdPredicate);
Predicate fromEntityTypePredicate = criteriaBuilder.equal(root.get("fromType"), from.getEntityType().name());
predicates.add(fromEntityTypePredicate);

13
dao/src/main/java/org/thingsboard/server/dao/sql/relation/RelationRepository.java

@ -23,30 +23,31 @@ import org.thingsboard.server.dao.model.sql.RelationEntity;
import org.thingsboard.server.dao.util.SqlDao;
import java.util.List;
import java.util.UUID;
@SqlDao
public interface RelationRepository
extends CrudRepository<RelationEntity, RelationCompositeKey>, JpaSpecificationExecutor<RelationEntity> {
List<RelationEntity> findAllByFromIdAndFromTypeAndRelationTypeGroup(String fromId,
List<RelationEntity> findAllByFromIdAndFromTypeAndRelationTypeGroup(UUID fromId,
String fromType,
String relationTypeGroup);
List<RelationEntity> findAllByFromIdAndFromTypeAndRelationTypeAndRelationTypeGroup(String fromId,
List<RelationEntity> findAllByFromIdAndFromTypeAndRelationTypeAndRelationTypeGroup(UUID fromId,
String fromType,
String relationType,
String relationTypeGroup);
List<RelationEntity> findAllByToIdAndToTypeAndRelationTypeGroup(String toId,
List<RelationEntity> findAllByToIdAndToTypeAndRelationTypeGroup(UUID toId,
String toType,
String relationTypeGroup);
List<RelationEntity> findAllByToIdAndToTypeAndRelationTypeAndRelationTypeGroup(String toId,
List<RelationEntity> findAllByToIdAndToTypeAndRelationTypeAndRelationTypeGroup(UUID toId,
String toType,
String relationType,
String relationTypeGroup);
List<RelationEntity> findAllByFromIdAndFromType(String fromId,
List<RelationEntity> findAllByFromIdAndFromType(UUID fromId,
String fromType);
@Transactional
@ -56,5 +57,5 @@ public interface RelationRepository
void deleteById(RelationCompositeKey id);
@Transactional
void deleteByFromIdAndFromType(String fromId, String fromType);
void deleteByFromIdAndFromType(UUID fromId, String fromType);
}

7
dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java

@ -17,10 +17,8 @@ package org.thingsboard.server.dao.sql.rule;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.rule.RuleChain;
@ -30,12 +28,9 @@ import org.thingsboard.server.dao.rule.RuleChainDao;
import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
import org.thingsboard.server.dao.util.SqlDao;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID_STR;
@Slf4j
@Component
@SqlDao
@ -58,7 +53,7 @@ public class JpaRuleChainDao extends JpaAbstractSearchTextDao<RuleChainEntity, R
public PageData<RuleChain> findRuleChainsByTenantId(UUID tenantId, PageLink pageLink) {
return DaoUtil.toPageData(ruleChainRepository
.findByTenantId(
UUIDConverter.fromTimeUUID(tenantId),
tenantId,
Objects.toString(pageLink.getTextSearch(), ""),
DaoUtil.toPageable(pageLink)));
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save