CalculatedField functionality support for Edge
- changed logic for sync CalculatedField
This commit is contained in:
parent
b747b6b1bf
commit
33d80df54c
@ -49,6 +49,7 @@ import org.thingsboard.server.gen.edge.v1.AlarmUpdateMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.AssetProfileUpdateMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.AttributesRequestMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.CalculatedFieldRequestMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.CalculatedFieldUpdateMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.ConnectRequestMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.ConnectResponseCode;
|
||||
@ -882,6 +883,11 @@ public abstract class EdgeGrpcSession implements Closeable {
|
||||
result.add(ctx.getEdgeRequestsService().processRelationRequestMsg(edge.getTenantId(), edge, relationRequestMsg));
|
||||
}
|
||||
}
|
||||
if (uplinkMsg.getCalculatedFieldRequestMsgCount() > 0) {
|
||||
for (CalculatedFieldRequestMsg calculatedFieldRequestMsg : uplinkMsg.getCalculatedFieldRequestMsgList()) {
|
||||
result.add(ctx.getEdgeRequestsService().processCalculatedFieldRequestMsg(edge.getTenantId(), edge, calculatedFieldRequestMsg));
|
||||
}
|
||||
}
|
||||
if (uplinkMsg.getUserCredentialsRequestMsgCount() > 0) {
|
||||
for (UserCredentialsRequestMsg userCredentialsRequestMsg : uplinkMsg.getUserCredentialsRequestMsgList()) {
|
||||
result.add(ctx.getEdgeRequestsService().processUserCredentialsRequestMsg(edge.getTenantId(), edge, userCredentialsRequestMsg));
|
||||
|
||||
@ -25,7 +25,6 @@ import org.thingsboard.common.util.JacksonUtil;
|
||||
import org.thingsboard.server.common.data.AttributeScope;
|
||||
import org.thingsboard.server.common.data.EdgeUtils;
|
||||
import org.thingsboard.server.common.data.EntityType;
|
||||
import org.thingsboard.server.common.data.cf.CalculatedField;
|
||||
import org.thingsboard.server.common.data.edge.Edge;
|
||||
import org.thingsboard.server.common.data.edge.EdgeEvent;
|
||||
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
||||
@ -54,13 +53,11 @@ import org.thingsboard.server.common.msg.TbMsgDataType;
|
||||
import org.thingsboard.server.common.msg.TbMsgMetaData;
|
||||
import org.thingsboard.server.dao.edge.EdgeSynchronizationManager;
|
||||
import org.thingsboard.server.dao.entity.EntityDaoRegistry;
|
||||
import org.thingsboard.server.gen.edge.v1.CalculatedFieldUpdateMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos;
|
||||
import org.thingsboard.server.queue.TbQueueCallback;
|
||||
import org.thingsboard.server.queue.TbQueueMsgMetadata;
|
||||
import org.thingsboard.server.service.edge.EdgeContextComponent;
|
||||
import org.thingsboard.server.service.edge.EdgeMsgConstructorUtils;
|
||||
import org.thingsboard.server.service.executors.DbCallbackExecutorService;
|
||||
import org.thingsboard.server.service.state.DefaultDeviceStateService;
|
||||
|
||||
@ -384,12 +381,4 @@ public abstract class BaseEdgeProcessor implements EdgeProcessor {
|
||||
});
|
||||
}
|
||||
|
||||
protected List<CalculatedFieldUpdateMsg> getCalculatedFieldUpdateMsgs(TenantId tenantId, EntityId entityId) {
|
||||
List<CalculatedField> calculatedFields = edgeCtx.getCalculatedFieldService().findCalculatedFieldsByEntityId(tenantId, entityId);
|
||||
|
||||
return calculatedFields.stream()
|
||||
.map(calculatedField -> EdgeMsgConstructorUtils.constructCalculatedFieldUpdatedMsg(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, calculatedField))
|
||||
.toList();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -120,8 +120,6 @@ public class AssetEdgeProcessor extends BaseAssetProcessor implements AssetProce
|
||||
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
|
||||
.addAssetUpdateMsg(assetUpdateMsg);
|
||||
|
||||
getCalculatedFieldUpdateMsgs(edgeEvent.getTenantId(), assetId).forEach(builder::addCalculatedFieldUpdateMsg);
|
||||
|
||||
if (UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE.equals(msgType)) {
|
||||
AssetProfile assetProfile = edgeCtx.getAssetProfileService().findAssetProfileById(edgeEvent.getTenantId(), asset.getAssetProfileId());
|
||||
builder.addAssetProfileUpdateMsg(EdgeMsgConstructorUtils.constructAssetProfileUpdatedMsg(msgType, assetProfile));
|
||||
|
||||
@ -80,7 +80,7 @@ public abstract class BaseCalculatedFieldProcessor extends BaseEdgeProcessor {
|
||||
calculatedField.setId(calculatedFieldId);
|
||||
}
|
||||
|
||||
edgeCtx.getCalculatedFieldService().save(calculatedField, false);
|
||||
edgeCtx.getCalculatedFieldService().save(calculatedField);
|
||||
} catch (Exception e) {
|
||||
log.error("[{}] Failed to process calculatedField update msg [{}]", tenantId, calculatedFieldUpdateMsg, e);
|
||||
throw e;
|
||||
|
||||
@ -244,8 +244,6 @@ public class DeviceEdgeProcessor extends BaseDeviceProcessor implements DevicePr
|
||||
builder.addDeviceCredentialsUpdateMsg(deviceCredentialsUpdateMsg).build();
|
||||
}
|
||||
|
||||
getCalculatedFieldUpdateMsgs(edgeEvent.getTenantId(), deviceId).forEach(builder::addCalculatedFieldUpdateMsg);
|
||||
|
||||
if (UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE.equals(msgType)) {
|
||||
DeviceProfile deviceProfile = edgeCtx.getDeviceProfileService().findDeviceProfileById(edgeEvent.getTenantId(), device.getDeviceProfileId());
|
||||
builder.addDeviceProfileUpdateMsg(EdgeMsgConstructorUtils.constructDeviceProfileUpdatedMsg(msgType, deviceProfile));
|
||||
|
||||
@ -23,6 +23,7 @@ import com.google.common.util.concurrent.ListenableFuture;
|
||||
import com.google.common.util.concurrent.SettableFuture;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Service;
|
||||
@ -31,6 +32,7 @@ import org.thingsboard.server.common.data.AttributeScope;
|
||||
import org.thingsboard.server.common.data.EdgeUtils;
|
||||
import org.thingsboard.server.common.data.EntityType;
|
||||
import org.thingsboard.server.common.data.EntityView;
|
||||
import org.thingsboard.server.common.data.ExportableEntity;
|
||||
import org.thingsboard.server.common.data.edge.Edge;
|
||||
import org.thingsboard.server.common.data.edge.EdgeEvent;
|
||||
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
||||
@ -46,6 +48,8 @@ import org.thingsboard.server.common.data.id.WidgetsBundleId;
|
||||
import org.thingsboard.server.common.data.kv.AttributeKvEntry;
|
||||
import org.thingsboard.server.common.data.kv.DataType;
|
||||
import org.thingsboard.server.common.data.kv.TsKvEntry;
|
||||
import org.thingsboard.server.common.data.page.PageData;
|
||||
import org.thingsboard.server.common.data.page.PageLink;
|
||||
import org.thingsboard.server.common.data.relation.EntityRelation;
|
||||
import org.thingsboard.server.common.data.relation.EntityRelationsQuery;
|
||||
import org.thingsboard.server.common.data.relation.EntitySearchDirection;
|
||||
@ -53,13 +57,19 @@ import org.thingsboard.server.common.data.relation.RelationTypeGroup;
|
||||
import org.thingsboard.server.common.data.relation.RelationsSearchParameters;
|
||||
import org.thingsboard.server.common.data.widget.WidgetType;
|
||||
import org.thingsboard.server.common.data.widget.WidgetsBundle;
|
||||
import org.thingsboard.server.dao.asset.AssetProfileService;
|
||||
import org.thingsboard.server.dao.asset.AssetService;
|
||||
import org.thingsboard.server.dao.attributes.AttributesService;
|
||||
import org.thingsboard.server.dao.cf.CalculatedFieldService;
|
||||
import org.thingsboard.server.dao.device.DeviceProfileService;
|
||||
import org.thingsboard.server.dao.device.DeviceService;
|
||||
import org.thingsboard.server.dao.edge.EdgeEventService;
|
||||
import org.thingsboard.server.dao.relation.RelationService;
|
||||
import org.thingsboard.server.dao.timeseries.TimeseriesService;
|
||||
import org.thingsboard.server.dao.widget.WidgetTypeService;
|
||||
import org.thingsboard.server.dao.widget.WidgetsBundleService;
|
||||
import org.thingsboard.server.gen.edge.v1.AttributesRequestMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.CalculatedFieldRequestMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.DeviceCredentialsRequestMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.EntityViewsRequestMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.RelationRequestMsg;
|
||||
@ -72,10 +82,16 @@ import org.thingsboard.server.service.executors.DbCallbackExecutorService;
|
||||
import org.thingsboard.server.service.state.DefaultDeviceStateService;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@TbCoreComponent
|
||||
@ -104,6 +120,17 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService {
|
||||
@Autowired
|
||||
private WidgetTypeService widgetTypeService;
|
||||
|
||||
@Autowired
|
||||
private CalculatedFieldService calculatedFieldService;
|
||||
@Autowired
|
||||
private DeviceService deviceService;
|
||||
@Autowired
|
||||
private DeviceProfileService deviceProfileService;
|
||||
@Autowired
|
||||
private AssetService assetService;
|
||||
@Autowired
|
||||
private AssetProfileService assetProfileService;
|
||||
|
||||
@Autowired
|
||||
private DbCallbackExecutorService dbCallbackExecutorService;
|
||||
|
||||
@ -293,6 +320,116 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService {
|
||||
return futureToSet;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListenableFuture<Void> processCalculatedFieldRequestMsg(TenantId tenantId, Edge edge, CalculatedFieldRequestMsg calculatedFieldRequestMsg) {
|
||||
log.trace("[{}] processCalculatedFieldRequestMsg [{}][{}]", tenantId, edge.getName(), calculatedFieldRequestMsg);
|
||||
|
||||
EntityId entityId = EntityIdFactory.getByTypeAndUuid(
|
||||
EntityType.valueOf(calculatedFieldRequestMsg.getEntityType()),
|
||||
new UUID(calculatedFieldRequestMsg.getEntityIdMSB(), calculatedFieldRequestMsg.getEntityIdLSB()));
|
||||
|
||||
if (entityId.getEntityType() == EntityType.EDGE) {
|
||||
log.trace("[{}] processAllCalculatedField [{}][{}]", tenantId, edge.getName(), calculatedFieldRequestMsg);
|
||||
return syncAllCalculatedFieldForEdge(tenantId, edge, calculatedFieldRequestMsg);
|
||||
} else {
|
||||
log.trace("[{}] processCalculatedField [{}][{}] for entity [{}][{}]", tenantId, edge.getName(), calculatedFieldRequestMsg, entityId.getEntityType(), entityId.getId());
|
||||
return saveCalculatedFieldsToEdge(tenantId, edge.getId(), entityId);
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private ListenableFuture<Void> syncAllCalculatedFieldForEdge(TenantId tenantId, Edge edge, CalculatedFieldRequestMsg calculatedFieldRequestMsg) {
|
||||
EdgeId edgeId = edge.getId();
|
||||
ListenableFuture<List<EntityId>> deviceIdsFuture =
|
||||
findAllEntityIdsAsync(pageLink -> deviceService.findDevicesByTenantIdAndEdgeId(tenantId, edgeId, pageLink));
|
||||
ListenableFuture<List<EntityId>> assetIdsFuture =
|
||||
findAllEntityIdsAsync(pageLink -> assetService.findAssetsByTenantIdAndEdgeId(tenantId, edgeId, pageLink));
|
||||
ListenableFuture<List<EntityId>> deviceProfileIdsFuture =
|
||||
findAllEntityIdsAsync(pageLink -> deviceProfileService.findDeviceProfiles(tenantId, pageLink));
|
||||
ListenableFuture<List<EntityId>> assetProfileIdsFuture =
|
||||
findAllEntityIdsAsync(pageLink -> assetProfileService.findAssetProfiles(tenantId, pageLink));
|
||||
|
||||
ListenableFuture<List<EntityId>> allEntityIdFuture =
|
||||
mergeEntityIdFutures(deviceIdsFuture, assetIdsFuture, deviceProfileIdsFuture, assetProfileIdsFuture);
|
||||
|
||||
return Futures.transformAsync(allEntityIdFuture, allIds -> {
|
||||
log.trace("[{}][{}] Going to sync calculatedFields for [{}] entities", tenantId, edge.getName(), allIds.size());
|
||||
List<ListenableFuture<Void>> saveFutures = allIds.stream()
|
||||
.map(id -> saveCalculatedFieldsToEdge(tenantId, edge.getId(), id))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
return Futures.transform(
|
||||
Futures.allAsList(saveFutures),
|
||||
result -> null,
|
||||
dbCallbackExecutorService
|
||||
);
|
||||
}, dbCallbackExecutorService);
|
||||
}
|
||||
|
||||
private <T extends ExportableEntity<? extends EntityId>> ListenableFuture<List<EntityId>> findAllEntityIdsAsync(Function<PageLink, PageData<T>> fetcher) {
|
||||
return dbCallbackExecutorService.submit(() -> {
|
||||
List<EntityId> result = new ArrayList<>();
|
||||
PageLink pageLink = new PageLink(100);
|
||||
PageData<T> pageData;
|
||||
while (true) {
|
||||
pageData = fetcher.apply(pageLink);
|
||||
|
||||
Optional.ofNullable(pageData)
|
||||
.map(PageData::getData)
|
||||
.ifPresent(dataList -> dataList.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.map(ExportableEntity::getId)
|
||||
.forEach(result::add));
|
||||
|
||||
if (pageData == null || !pageData.hasNext()) {
|
||||
break;
|
||||
}
|
||||
|
||||
pageLink = pageLink.nextPageLink();
|
||||
}
|
||||
return result;
|
||||
});
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
private ListenableFuture<List<EntityId>> mergeEntityIdFutures(ListenableFuture<List<EntityId>>... futures) {
|
||||
return Futures.transform(
|
||||
Futures.allAsList(Arrays.asList(futures)),
|
||||
listsOfIds -> listsOfIds.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.flatMap(Collection::stream)
|
||||
.collect(Collectors.toList()),
|
||||
dbCallbackExecutorService
|
||||
);
|
||||
}
|
||||
|
||||
private ListenableFuture<Void> saveCalculatedFieldsToEdge(TenantId tenantId, EdgeId edgeId, EntityId entityId) {
|
||||
return Futures.transformAsync(
|
||||
dbCallbackExecutorService.submit(() -> calculatedFieldService.findCalculatedFieldsByEntityId(tenantId, entityId)),
|
||||
calculatedFields -> {
|
||||
log.trace("[{}][{}][{}][{}] calculatedField(s) are going to be pushed to edge.", tenantId, edgeId, entityId, calculatedFields.size());
|
||||
|
||||
List<ListenableFuture<?>> futures = calculatedFields.stream().map(calculatedField -> {
|
||||
try {
|
||||
return saveEdgeEvent(tenantId, edgeId, EdgeEventType.CALCULATED_FIELD,
|
||||
EdgeEventActionType.ADDED, calculatedField.getId(), JacksonUtil.valueToTree(calculatedField));
|
||||
} catch (Exception e) {
|
||||
String errMsg = String.format("[%s][%s] Exception during loading calculatedField [%s] to edge on sync!", tenantId, edgeId, calculatedField);
|
||||
log.error(errMsg, e);
|
||||
return Futures.immediateFailedFuture(e);
|
||||
}
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
return Futures.transform(
|
||||
Futures.allAsList(futures),
|
||||
voids -> null,
|
||||
dbCallbackExecutorService
|
||||
);
|
||||
},
|
||||
dbCallbackExecutorService
|
||||
);
|
||||
}
|
||||
|
||||
private ListenableFuture<List<EntityRelation>> findRelationByQuery(TenantId tenantId, Edge edge, EntityId entityId, EntitySearchDirection direction) {
|
||||
EntityRelationsQuery query = new EntityRelationsQuery();
|
||||
query.setParameters(new RelationsSearchParameters(entityId, direction, 1, false));
|
||||
|
||||
@ -19,6 +19,7 @@ import com.google.common.util.concurrent.ListenableFuture;
|
||||
import org.thingsboard.server.common.data.edge.Edge;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.gen.edge.v1.AttributesRequestMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.CalculatedFieldRequestMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.DeviceCredentialsRequestMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.EntityViewsRequestMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.RelationRequestMsg;
|
||||
@ -35,6 +36,8 @@ public interface EdgeRequestsService {
|
||||
|
||||
ListenableFuture<Void> processRelationRequestMsg(TenantId tenantId, Edge edge, RelationRequestMsg relationRequestMsg);
|
||||
|
||||
ListenableFuture<Void> processCalculatedFieldRequestMsg(TenantId tenantId, Edge edge, CalculatedFieldRequestMsg calculatedFieldRequestMsg);
|
||||
|
||||
@Deprecated(since = "3.9.1", forRemoval = true)
|
||||
ListenableFuture<Void> processDeviceCredentialsRequestMsg(TenantId tenantId, Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg);
|
||||
|
||||
@ -46,4 +49,5 @@ public interface EdgeRequestsService {
|
||||
|
||||
@Deprecated(since = "3.9.1", forRemoval = true)
|
||||
ListenableFuture<Void> processEntityViewsRequestMsg(TenantId tenantId, Edge edge, EntityViewsRequestMsg entityViewsRequestMsg);
|
||||
|
||||
}
|
||||
|
||||
@ -31,8 +31,6 @@ public interface CalculatedFieldService extends EntityDaoService {
|
||||
|
||||
CalculatedField save(CalculatedField calculatedField);
|
||||
|
||||
CalculatedField save(CalculatedField calculatedField, boolean doValidate);
|
||||
|
||||
CalculatedField findById(TenantId tenantId, CalculatedFieldId calculatedFieldId);
|
||||
|
||||
CalculatedField findByEntityIdAndName(EntityId entityId, String name);
|
||||
|
||||
@ -334,6 +334,12 @@ message RelationRequestMsg {
|
||||
string entityType = 3;
|
||||
}
|
||||
|
||||
message CalculatedFieldRequestMsg {
|
||||
int64 entityIdMSB = 1;
|
||||
int64 entityIdLSB = 2;
|
||||
string entityType = 3;
|
||||
}
|
||||
|
||||
// DEPRECATED. FOR REMOVAL
|
||||
message UserCredentialsRequestMsg {
|
||||
option deprecated = true;
|
||||
@ -433,6 +439,7 @@ message UplinkMsg {
|
||||
repeated RuleChainUpdateMsg ruleChainUpdateMsg = 23;
|
||||
repeated RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = 24;
|
||||
repeated CalculatedFieldUpdateMsg calculatedFieldUpdateMsg = 25;
|
||||
repeated CalculatedFieldRequestMsg calculatedFieldRequestMsg = 26;
|
||||
}
|
||||
|
||||
message UplinkResponseMsg {
|
||||
|
||||
@ -62,17 +62,6 @@ public class BaseCalculatedFieldService extends AbstractEntityService implements
|
||||
return doSave(calculatedField, oldCalculatedField);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CalculatedField save(CalculatedField calculatedField, boolean doValidate) {
|
||||
CalculatedField oldCalculatedField = null;
|
||||
|
||||
if (doValidate) {
|
||||
oldCalculatedField = calculatedFieldDataValidator.validate(calculatedField, CalculatedField::getTenantId);
|
||||
}
|
||||
|
||||
return doSave(calculatedField, oldCalculatedField);
|
||||
}
|
||||
|
||||
private CalculatedField doSave(CalculatedField calculatedField, CalculatedField oldCalculatedField) {
|
||||
try {
|
||||
TenantId tenantId = calculatedField.getTenantId();
|
||||
@ -104,7 +93,7 @@ public class BaseCalculatedFieldService extends AbstractEntityService implements
|
||||
log.trace("Executing findByEntityIdAndName [{}], calculatedFieldName[{}]", entityId, name);
|
||||
validateId(entityId.getId(), id -> INCORRECT_ENTITY_ID + id);
|
||||
|
||||
return calculatedFieldDao.findByEntityIdAndName(entityId, name).orElse(null);
|
||||
return calculatedFieldDao.findByEntityIdAndName(entityId, name);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -24,7 +24,6 @@ import org.thingsboard.server.common.data.page.PageLink;
|
||||
import org.thingsboard.server.dao.Dao;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public interface CalculatedFieldDao extends Dao<CalculatedField> {
|
||||
|
||||
@ -36,7 +35,7 @@ public interface CalculatedFieldDao extends Dao<CalculatedField> {
|
||||
|
||||
List<CalculatedField> findAll();
|
||||
|
||||
Optional<CalculatedField> findByEntityIdAndName(EntityId entityId, String name);
|
||||
CalculatedField findByEntityIdAndName(EntityId entityId, String name);
|
||||
|
||||
PageData<CalculatedField> findAll(PageLink pageLink);
|
||||
|
||||
|
||||
@ -34,7 +34,6 @@ import org.thingsboard.server.dao.sql.JpaAbstractDao;
|
||||
import org.thingsboard.server.dao.util.SqlDao;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
@Slf4j
|
||||
@ -67,9 +66,8 @@ public class JpaCalculatedFieldDao extends JpaAbstractDao<CalculatedFieldEntity,
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<CalculatedField> findByEntityIdAndName(EntityId entityId, String name) {
|
||||
CalculatedField calculatedField = DaoUtil.getData(calculatedFieldRepository.findByEntityIdAndName(entityId.getId(), name));
|
||||
return Optional.ofNullable(calculatedField);
|
||||
public CalculatedField findByEntityIdAndName(EntityId entityId, String name) {
|
||||
return DaoUtil.getData(calculatedFieldRepository.findByEntityIdAndName(entityId.getId(), name));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user