Browse Source

Move alias entity resolution to backend.

pull/13734/head
Igor Kulikov 1 year ago
parent
commit
7c2c0357c1
  1. 15
      application/src/main/java/org/thingsboard/server/controller/EntityQueryController.java
  2. 12
      application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractEntityQuerySubCtx.java
  3. 5
      application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractSubCtx.java
  4. 3
      application/src/test/java/org/thingsboard/server/controller/EntityQueryControllerTest.java
  5. 5
      application/src/test/java/org/thingsboard/server/controller/TelemetryControllerTest.java
  6. 7
      application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java
  7. 33
      application/src/test/java/org/thingsboard/server/service/entitiy/EntityServiceTest.java
  8. 5
      application/src/test/java/org/thingsboard/server/transport/coap/attributes/AbstractCoapAttributesIntegrationTest.java
  9. 3
      application/src/test/java/org/thingsboard/server/transport/coap/client/CoapClientIntegrationTest.java
  10. 7
      application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java
  11. 7
      application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv3/attributes/AbstractMqttAttributesIntegrationTest.java
  12. 80
      common/data/src/main/java/org/thingsboard/server/common/data/query/AliasEntityId.java
  13. 58
      common/data/src/main/java/org/thingsboard/server/common/data/query/AliasEntityIdDeserializer.java
  14. 104
      common/data/src/main/java/org/thingsboard/server/common/data/query/AliasEntityIdImpl.java
  15. 47
      common/data/src/main/java/org/thingsboard/server/common/data/query/AliasEntityIdSerializer.java
  16. 23
      common/data/src/main/java/org/thingsboard/server/common/data/query/AliasEntityType.java
  17. 18
      common/data/src/main/java/org/thingsboard/server/common/data/query/EntityFilter.java
  18. 4
      common/data/src/main/java/org/thingsboard/server/common/data/query/EntitySearchQueryFilter.java
  19. 4
      common/data/src/main/java/org/thingsboard/server/common/data/query/RelationsQueryFilter.java
  20. 2
      common/data/src/main/java/org/thingsboard/server/common/data/query/SingleEntityFilter.java
  21. 3
      edqs/src/test/java/org/thingsboard/server/edqs/repo/AssetSearchQueryFilterTest.java
  22. 3
      edqs/src/test/java/org/thingsboard/server/edqs/repo/DeviceSearchQueryFilterTest.java
  23. 3
      edqs/src/test/java/org/thingsboard/server/edqs/repo/EdgeSearchQueryFilterTest.java
  24. 3
      edqs/src/test/java/org/thingsboard/server/edqs/repo/EntityViewSearchQueryFilterTest.java
  25. 3
      edqs/src/test/java/org/thingsboard/server/edqs/repo/RelationsQueryFilterTest.java
  26. 3
      edqs/src/test/java/org/thingsboard/server/edqs/repo/SingleEntityFilterTest.java
  27. 44
      ui-ngx/src/app/core/http/entity.service.ts

15
application/src/main/java/org/thingsboard/server/controller/EntityQueryController.java

@ -42,6 +42,7 @@ import org.thingsboard.server.common.data.query.EntityCountQuery;
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.EntityFilter;
import org.thingsboard.server.common.msg.edqs.EdqsApiService;
import org.thingsboard.server.common.msg.edqs.EdqsService;
import org.thingsboard.server.config.annotations.ApiOperation;
@ -76,6 +77,7 @@ public class EntityQueryController extends BaseController {
@Parameter(description = "A JSON value representing the entity count query. See API call notes above for more details.")
@RequestBody EntityCountQuery query) throws ThingsboardException {
checkNotNull(query);
resolveQuery(query);
return this.entityQueryService.countEntitiesByQuery(getCurrentUser(), query);
}
@ -87,6 +89,7 @@ public class EntityQueryController extends BaseController {
@Parameter(description = "A JSON value representing the entity data query. See API call notes above for more details.")
@RequestBody EntityDataQuery query) throws ThingsboardException {
checkNotNull(query);
resolveQuery(query);
return this.entityQueryService.findEntityDataByQuery(getCurrentUser(), query);
}
@ -103,6 +106,7 @@ public class EntityQueryController extends BaseController {
if (assigneeId != null) {
checkUserId(assigneeId, Operation.READ);
}
resolveQuery(query);
return this.entityQueryService.findAlarmDataByQuery(getCurrentUser(), query);
}
@ -117,6 +121,7 @@ public class EntityQueryController extends BaseController {
if (assigneeId != null) {
checkUserId(assigneeId, Operation.READ);
}
resolveQuery(query);
return this.entityQueryService.countAlarmsByQuery(getCurrentUser(), query);
}
@ -136,6 +141,7 @@ public class EntityQueryController extends BaseController {
@RequestParam(value = "scope", required = false) String scope) throws ThingsboardException {
TenantId tenantId = getTenantId();
checkNotNull(query);
resolveQuery(query);
EntityDataPageLink pageLink = query.getPageLink();
if (pageLink.getPageSize() > MAX_PAGE_SIZE) {
pageLink.setPageSize(MAX_PAGE_SIZE);
@ -155,4 +161,13 @@ public class EntityQueryController extends BaseController {
return edqsService.getState();
}
private void resolveQuery(EntityCountQuery query) throws ThingsboardException {
if (query.getEntityFilter() != null) {
var user = getCurrentUser();
var customerId = user.getCustomerId();
var ownerId = customerId != null && !customerId.isNullUid() ? customerId : getTenantId();
EntityFilter.resolveEntityFilter(query.getEntityFilter(), getTenantId(), user.getId(), ownerId);
}
}
}

12
application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractEntityQuerySubCtx.java

@ -32,6 +32,7 @@ import org.thingsboard.server.common.data.query.ComplexFilterPredicate;
import org.thingsboard.server.common.data.query.DynamicValue;
import org.thingsboard.server.common.data.query.DynamicValueSourceType;
import org.thingsboard.server.common.data.query.EntityCountQuery;
import org.thingsboard.server.common.data.query.EntityFilter;
import org.thingsboard.server.common.data.query.FilterPredicateType;
import org.thingsboard.server.common.data.query.KeyFilter;
import org.thingsboard.server.common.data.query.KeyFilterPredicate;
@ -94,9 +95,14 @@ public abstract class TbAbstractEntityQuerySubCtx<T extends EntityCountQuery> ex
public void setAndResolveQuery(T query) {
dynamicValues.clear();
this.query = query;
if (query != null && query.getKeyFilters() != null) {
for (KeyFilter filter : query.getKeyFilters()) {
registerDynamicValues(filter.getPredicate());
if (query != null) {
if (query.getEntityFilter() != null) {
EntityFilter.resolveEntityFilter(query.getEntityFilter(), getTenantId(), getUserId(), getOwnerId());
}
if (query.getKeyFilters() != null) {
for (KeyFilter filter : query.getKeyFilters()) {
registerDynamicValues(filter.getPredicate());
}
}
}
resolve(getTenantId(), getCustomerId(), getUserId());

5
application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractSubCtx.java

@ -107,6 +107,11 @@ public abstract class TbAbstractSubCtx {
return sessionRef.getSecurityCtx().getId();
}
public EntityId getOwnerId() {
var customerId = getCustomerId();
return customerId != null && !customerId.isNullUid() ? customerId : getTenantId();
}
public void sendWsMsg(CmdUpdate update) {
wsLock.lock();
try {

3
application/src/test/java/org/thingsboard/server/controller/EntityQueryControllerTest.java

@ -44,6 +44,7 @@ import org.thingsboard.server.common.data.query.AlarmCountQuery;
import org.thingsboard.server.common.data.query.AlarmData;
import org.thingsboard.server.common.data.query.AlarmDataPageLink;
import org.thingsboard.server.common.data.query.AlarmDataQuery;
import org.thingsboard.server.common.data.query.AliasEntityId;
import org.thingsboard.server.common.data.query.DeviceTypeFilter;
import org.thingsboard.server.common.data.query.DynamicValue;
import org.thingsboard.server.common.data.query.DynamicValueSourceType;
@ -707,7 +708,7 @@ public class EntityQueryControllerTest extends AbstractControllerTest {
}
RelationsQueryFilter filter = new RelationsQueryFilter();
filter.setRootEntity(mainDevice.getId());
filter.setRootEntity(AliasEntityId.fromEntityId(mainDevice.getId()));
filter.setDirection(EntitySearchDirection.FROM);
filter.setNegate(true);
filter.setFilters(List.of(new RelationEntityTypeFilter("CONTAINS", List.of(EntityType.DEVICE), false)));

5
application/src/test/java/org/thingsboard/server/controller/TelemetryControllerTest.java

@ -23,6 +23,7 @@ import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.SaveDeviceWithCredentialsRequest;
import org.thingsboard.server.common.data.kv.BasicTsKvEntry;
import org.thingsboard.server.common.data.kv.LongDataEntry;
import org.thingsboard.server.common.data.query.AliasEntityId;
import org.thingsboard.server.common.data.query.EntityKey;
import org.thingsboard.server.common.data.query.SingleEntityFilter;
import org.thingsboard.server.common.data.security.DeviceCredentials;
@ -115,7 +116,7 @@ public class TelemetryControllerTest extends AbstractControllerTest {
Device device = createDevice();
SingleEntityFilter filter = new SingleEntityFilter();
filter.setSingleEntity(device.getId());
filter.setSingleEntity(AliasEntityId.fromEntityId(device.getId()));
getWsClient().subscribeLatestUpdate(List.of(new EntityKey(TIME_SERIES, "data")), filter);
@ -159,7 +160,7 @@ public class TelemetryControllerTest extends AbstractControllerTest {
Device device = createDevice();
SingleEntityFilter filter = new SingleEntityFilter();
filter.setSingleEntity(device.getId());
filter.setSingleEntity(AliasEntityId.fromEntityId(device.getId()));
getWsClient().subscribeLatestUpdate(List.of(new EntityKey(TIME_SERIES, "data")), filter);

7
application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java

@ -44,6 +44,7 @@ import org.thingsboard.server.common.data.kv.StringDataEntry;
import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.query.AlarmCountQuery;
import org.thingsboard.server.common.data.query.AliasEntityId;
import org.thingsboard.server.common.data.query.DeviceTypeFilter;
import org.thingsboard.server.common.data.query.EntityCountQuery;
import org.thingsboard.server.common.data.query.EntityData;
@ -332,7 +333,7 @@ public class WebsocketApiTest extends AbstractControllerTest {
loginTenantAdmin();
SingleEntityFilter singleEntityFilter = new SingleEntityFilter();
singleEntityFilter.setSingleEntity(tenantId);
singleEntityFilter.setSingleEntity(AliasEntityId.fromEntityId(tenantId));
AlarmCountQuery alarmCountQuery = new AlarmCountQuery(singleEntityFilter);
AlarmCountCmd cmd1 = new AlarmCountCmd(1, alarmCountQuery);
@ -356,7 +357,7 @@ public class WebsocketApiTest extends AbstractControllerTest {
Assert.assertEquals(1, update.getCount());
// set wrong entity id in filter, check count = 0
singleEntityFilter.setSingleEntity(tenantAdminUserId);
singleEntityFilter.setSingleEntity(AliasEntityId.fromEntityId(tenantAdminUserId));
AlarmCountCmd cmd3 = new AlarmCountCmd(2, alarmCountQuery);
getWsClient().send(cmd3);
@ -865,7 +866,7 @@ public class WebsocketApiTest extends AbstractControllerTest {
public void testAttributesSubscription_sysAdmin() throws Exception {
loginSysAdmin();
SingleEntityFilter entityFilter = new SingleEntityFilter();
entityFilter.setSingleEntity(tenantId);
entityFilter.setSingleEntity(AliasEntityId.fromEntityId(tenantId));
assertThatNoException().as("subscribeForAttributes").isThrownBy(() -> {
JsonNode update = getWsClient().subscribeForAttributes(tenantId, TbAttributeSubscriptionScope.SERVER_SCOPE.name(), List.of("attr"));

33
application/src/test/java/org/thingsboard/server/service/entitiy/EntityServiceTest.java

@ -54,6 +54,7 @@ import org.thingsboard.server.common.data.kv.StringDataEntry;
import org.thingsboard.server.common.data.kv.TimeseriesSaveResult;
import org.thingsboard.server.common.data.objects.TelemetryEntityView;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.query.AliasEntityId;
import org.thingsboard.server.common.data.query.ApiUsageStateFilter;
import org.thingsboard.server.common.data.query.AssetSearchQueryFilter;
import org.thingsboard.server.common.data.query.AssetTypeFilter;
@ -217,7 +218,7 @@ public class EntityServiceTest extends AbstractControllerTest {
createTestHierarchy(tenantId, assets, devices, new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>());
RelationsQueryFilter filter = new RelationsQueryFilter();
filter.setRootEntity(tenantId);
filter.setRootEntity(AliasEntityId.fromEntityId(tenantId));
filter.setDirection(EntitySearchDirection.FROM);
EntityCountQuery countQuery = new EntityCountQuery(filter);
@ -226,13 +227,13 @@ public class EntityServiceTest extends AbstractControllerTest {
filter.setFilters(Collections.singletonList(new RelationEntityTypeFilter("Contains", Collections.singletonList(EntityType.DEVICE))));
countByQueryAndCheck(countQuery, 25);
filter.setRootEntity(devices.get(0).getId());
filter.setRootEntity(AliasEntityId.fromEntityId(devices.get(0).getId()));
filter.setDirection(EntitySearchDirection.TO);
filter.setFilters(Collections.singletonList(new RelationEntityTypeFilter("Manages", Collections.singletonList(EntityType.TENANT))));
countByQueryAndCheck(countQuery, 1);
DeviceSearchQueryFilter filter2 = new DeviceSearchQueryFilter();
filter2.setRootEntity(tenantId);
filter2.setRootEntity(AliasEntityId.fromEntityId(tenantId));
filter2.setDirection(EntitySearchDirection.FROM);
filter2.setRelationType("Contains");
@ -242,12 +243,12 @@ public class EntityServiceTest extends AbstractControllerTest {
filter2.setDeviceTypes(Arrays.asList("default0", "default1"));
countByQueryAndCheck(countQuery, 10);
filter2.setRootEntity(devices.get(0).getId());
filter2.setRootEntity(AliasEntityId.fromEntityId(devices.get(0).getId()));
filter2.setDirection(EntitySearchDirection.TO);
countByQueryAndCheck(countQuery, 0);
AssetSearchQueryFilter filter3 = new AssetSearchQueryFilter();
filter3.setRootEntity(tenantId);
filter3.setRootEntity(AliasEntityId.fromEntityId(tenantId));
filter3.setDirection(EntitySearchDirection.FROM);
filter3.setRelationType("Manages");
@ -257,7 +258,7 @@ public class EntityServiceTest extends AbstractControllerTest {
filter3.setAssetTypes(Arrays.asList("type0", "type1"));
countByQueryAndCheck(countQuery, 2);
filter3.setRootEntity(devices.get(0).getId());
filter3.setRootEntity(AliasEntityId.fromEntityId(devices.get(0).getId()));
filter3.setDirection(EntitySearchDirection.TO);
countByQueryAndCheck(countQuery, 0);
}
@ -268,7 +269,7 @@ public class EntityServiceTest extends AbstractControllerTest {
createTestUserRelations(tenantId, users);
RelationsQueryFilter filter = new RelationsQueryFilter();
filter.setRootEntity(tenantId);
filter.setRootEntity(AliasEntityId.fromEntityId(tenantId));
filter.setDirection(EntitySearchDirection.FROM);
EntityDataPageLink pageLink = new EntityDataPageLink(10, 0, null, null);
@ -352,7 +353,7 @@ public class EntityServiceTest extends AbstractControllerTest {
}
EdgeSearchQueryFilter filter = new EdgeSearchQueryFilter();
filter.setRootEntity(tenantId);
filter.setRootEntity(AliasEntityId.fromEntityId(tenantId));
filter.setDirection(EntitySearchDirection.FROM);
filter.setRelationType("Manages");
@ -404,7 +405,7 @@ public class EntityServiceTest extends AbstractControllerTest {
Futures.allAsList(attributeFutures).get();
RelationsQueryFilter filter = new RelationsQueryFilter();
filter.setRootEntity(tenantId);
filter.setRootEntity(AliasEntityId.fromEntityId(tenantId));
filter.setDirection(EntitySearchDirection.FROM);
filter.setFilters(Collections.singletonList(new RelationEntityTypeFilter("Contains", Collections.singletonList(EntityType.DEVICE))));
filter.setMaxLevel(maxLevel);
@ -554,7 +555,7 @@ public class EntityServiceTest extends AbstractControllerTest {
Futures.allAsList(attributeFutures).get();
DeviceSearchQueryFilter filter = new DeviceSearchQueryFilter();
filter.setRootEntity(tenantId);
filter.setRootEntity(AliasEntityId.fromEntityId(tenantId));
filter.setDirection(EntitySearchDirection.FROM);
filter.setRelationType("Contains");
filter.setMaxLevel(2);
@ -608,7 +609,7 @@ public class EntityServiceTest extends AbstractControllerTest {
Futures.allAsList(attributeFutures).get();
AssetSearchQueryFilter filter = new AssetSearchQueryFilter();
filter.setRootEntity(tenantId);
filter.setRootEntity(AliasEntityId.fromEntityId(tenantId));
filter.setDirection(EntitySearchDirection.FROM);
filter.setRelationType("Manages");
@ -1101,7 +1102,7 @@ public class EntityServiceTest extends AbstractControllerTest {
}
SingleEntityFilter singleEntityFilter = new SingleEntityFilter();
singleEntityFilter.setSingleEntity(devices.get(0).getId());
singleEntityFilter.setSingleEntity(AliasEntityId.fromEntityId(devices.get(0).getId()));
List<EntityKey> entityFields = List.of(
new EntityKey(EntityKeyType.ENTITY_FIELD, "name")
@ -1120,7 +1121,7 @@ public class EntityServiceTest extends AbstractControllerTest {
@Test
public void testFindCustomerBySingleEntityFilter() {
SingleEntityFilter singleEntityFilter = new SingleEntityFilter();
singleEntityFilter.setSingleEntity(customerId);
singleEntityFilter.setSingleEntity(AliasEntityId.fromEntityId(customerId));
List<EntityKey> entityFields = List.of(
new EntityKey(EntityKeyType.ENTITY_FIELD, "name")
);
@ -1192,7 +1193,7 @@ public class EntityServiceTest extends AbstractControllerTest {
List<KeyFilter> keyFiltersEqualString = createStringKeyFilters("name", EntityKeyType.ENTITY_FIELD, StringOperation.STARTS_WITH, "Test device ");
for (Asset asset : assets) {
filter.setRootEntity(asset.getId());
filter.setRootEntity(AliasEntityId.fromEntityId(asset.getId()));
EntityDataQuery query = new EntityDataQuery(filter, pageLink, Collections.emptyList(), Collections.emptyList(), keyFiltersEqualString);
findByQueryAndCheck(customer.getId(), query, relationsCnt);
@ -1384,7 +1385,7 @@ public class EntityServiceTest extends AbstractControllerTest {
}
SingleEntityFilter singleEntityFilter = new SingleEntityFilter();
singleEntityFilter.setSingleEntity(customerDevices.get(0).getId());
singleEntityFilter.setSingleEntity(AliasEntityId.fromEntityId(customerDevices.get(0).getId()));
List<EntityKey> entityFields = List.of(
new EntityKey(EntityKeyType.ENTITY_FIELD, "name")
);
@ -1403,7 +1404,7 @@ public class EntityServiceTest extends AbstractControllerTest {
// try to find tenant device by customer user
SingleEntityFilter tenantDeviceFilter = new SingleEntityFilter();
tenantDeviceFilter.setSingleEntity(tenantDevices.get(0).getId());
tenantDeviceFilter.setSingleEntity(AliasEntityId.fromEntityId(tenantDevices.get(0).getId()));
EntityDataQuery customerQuery2 = new EntityDataQuery(tenantDeviceFilter, pageLink, entityFields, null, null);
findByQueryAndCheck(customerId, customerQuery2, 0);
}

5
application/src/test/java/org/thingsboard/server/transport/coap/attributes/AbstractCoapAttributesIntegrationTest.java

@ -35,6 +35,7 @@ import org.thingsboard.server.common.data.device.profile.DefaultCoapDeviceTypeCo
import org.thingsboard.server.common.data.device.profile.DeviceProfileTransportConfiguration;
import org.thingsboard.server.common.data.device.profile.ProtoTransportPayloadConfiguration;
import org.thingsboard.server.common.data.device.profile.TransportPayloadTypeConfiguration;
import org.thingsboard.server.common.data.query.AliasEntityId;
import org.thingsboard.server.common.data.query.EntityKey;
import org.thingsboard.server.common.data.query.EntityKeyType;
import org.thingsboard.server.common.data.query.SingleEntityFilter;
@ -170,7 +171,7 @@ public abstract class AbstractCoapAttributesIntegrationTest extends AbstractCoap
protected void processJsonTestRequestAttributesValuesFromTheServer() throws Exception {
client = new CoapTestClient(accessToken, FeatureType.ATTRIBUTES);
SingleEntityFilter dtf = new SingleEntityFilter();
dtf.setSingleEntity(savedDevice.getId());
dtf.setSingleEntity(AliasEntityId.fromEntityId(savedDevice.getId()));
String clientKeysStr = "clientStr,clientBool,clientDbl,clientLong,clientJson";
String sharedKeysStr = "sharedStr,sharedBool,sharedDbl,sharedLong,sharedJson";
List<String> clientKeysList = List.of(clientKeysStr.split(","));
@ -200,7 +201,7 @@ public abstract class AbstractCoapAttributesIntegrationTest extends AbstractCoap
protected void processProtoTestRequestAttributesValuesFromTheServer() throws Exception {
client = new CoapTestClient(accessToken, FeatureType.ATTRIBUTES);
SingleEntityFilter dtf = new SingleEntityFilter();
dtf.setSingleEntity(savedDevice.getId());
dtf.setSingleEntity(AliasEntityId.fromEntityId(savedDevice.getId()));
String clientKeysStr = "clientStr,clientBool,clientDbl,clientLong,clientJson";
String sharedKeysStr = "sharedStr,sharedBool,sharedDbl,sharedLong,sharedJson";
List<String> clientKeysList = List.of(clientKeysStr.split(","));

3
application/src/test/java/org/thingsboard/server/transport/coap/client/CoapClientIntegrationTest.java

@ -29,6 +29,7 @@ import org.junit.Before;
import org.junit.Test;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.query.AliasEntityId;
import org.thingsboard.server.common.data.query.EntityKey;
import org.thingsboard.server.common.data.query.EntityKeyType;
import org.thingsboard.server.common.data.query.SingleEntityFilter;
@ -161,7 +162,7 @@ public class CoapClientIntegrationTest extends AbstractCoapIntegrationTest {
protected void processTestRequestAttributesValuesFromTheServer(boolean confirmable) throws Exception {
client = createClientForFeatureWithConfirmableParameter(FeatureType.ATTRIBUTES, confirmable);
SingleEntityFilter dtf = new SingleEntityFilter();
dtf.setSingleEntity(savedDevice.getId());
dtf.setSingleEntity(AliasEntityId.fromEntityId(savedDevice.getId()));
List<EntityKey> csKeys = getEntityKeys(CLIENT_ATTRIBUTE);
List<EntityKey> shKeys = getEntityKeys(SHARED_ATTRIBUTE);
List<EntityKey> keys = new ArrayList<>();

7
application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java

@ -63,6 +63,7 @@ import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.Abstrac
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MBootstrapServerCredential;
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.NoSecLwM2MBootstrapServerCredential;
import org.thingsboard.server.common.data.id.DeviceProfileId;
import org.thingsboard.server.common.data.query.AliasEntityId;
import org.thingsboard.server.common.data.query.EntityData;
import org.thingsboard.server.common.data.query.EntityDataPageLink;
import org.thingsboard.server.common.data.query.EntityDataQuery;
@ -349,7 +350,7 @@ public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportInte
Device device = createLwm2mDevice(deviceCredentials, endpoint, deviceProfile.getId());
SingleEntityFilter sef = new SingleEntityFilter();
sef.setSingleEntity(device.getId());
sef.setSingleEntity(AliasEntityId.fromEntityId(device.getId()));
LatestValueCmd latestCmd = new LatestValueCmd();
latestCmd.setKeys(Collections.singletonList(new EntityKey(EntityKeyType.TIME_SERIES, "batteryLevel")));
EntityDataQuery edq = new EntityDataQuery(sef, new EntityDataPageLink(1, 0, null, null),
@ -416,7 +417,7 @@ public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportInte
Device device = createLwm2mDevice(deviceCredentials, endpoint, deviceProfile.getId());
SingleEntityFilter sef = new SingleEntityFilter();
sef.setSingleEntity(device.getId());
sef.setSingleEntity(AliasEntityId.fromEntityId(device.getId()));
LatestValueCmd latestCmd = new LatestValueCmd();
String key1 = "pkgname";
String key2 = "pkgversion";
@ -594,7 +595,7 @@ public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportInte
SingleEntityFilter sef = new SingleEntityFilter();
sef.setSingleEntity(device.getId());
sef.setSingleEntity(AliasEntityId.fromEntityId(device.getId()));
LatestValueCmd latestCmd = new LatestValueCmd();
latestCmd.setKeys(Collections.singletonList(new EntityKey(EntityKeyType.TIME_SERIES, "batteryLevel")));
EntityDataQuery edq = new EntityDataQuery(sef, new EntityDataPageLink(1, 0, null, null),

7
application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv3/attributes/AbstractMqttAttributesIntegrationTest.java

@ -34,6 +34,7 @@ import org.thingsboard.server.common.data.device.profile.ProtoTransportPayloadCo
import org.thingsboard.server.common.data.device.profile.TransportPayloadTypeConfiguration;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.query.AliasEntityId;
import org.thingsboard.server.common.data.query.DeviceTypeFilter;
import org.thingsboard.server.common.data.query.EntityData;
import org.thingsboard.server.common.data.query.EntityKey;
@ -339,7 +340,7 @@ public abstract class AbstractMqttAttributesIntegrationTest extends AbstractMqtt
MqttTestClient client = new MqttTestClient();
client.connectAndWait(accessToken);
SingleEntityFilter dtf = new SingleEntityFilter();
dtf.setSingleEntity(savedDevice.getId());
dtf.setSingleEntity(AliasEntityId.fromEntityId(savedDevice.getId()));
String clientKeysStr = "clientStr,clientBool,clientDbl,clientLong,clientJson";
String sharedKeysStr = "sharedStr,sharedBool,sharedDbl,sharedLong,sharedJson";
List<String> clientKeysList = List.of(clientKeysStr.split(","));
@ -426,7 +427,7 @@ public abstract class AbstractMqttAttributesIntegrationTest extends AbstractMqtt
});
SingleEntityFilter dtf = new SingleEntityFilter();
dtf.setSingleEntity(device.getId());
dtf.setSingleEntity(AliasEntityId.fromEntityId(device.getId()));
String sharedKeysStr = "sharedStr,sharedBool,sharedDbl,sharedLong,sharedJson";
List<String> clientKeysList = List.of(clientKeysStr.split(","));
List<String> sharedKeysList = List.of(sharedKeysStr.split(","));
@ -481,7 +482,7 @@ public abstract class AbstractMqttAttributesIntegrationTest extends AbstractMqtt
assertNotNull(device);
SingleEntityFilter dtf = new SingleEntityFilter();
dtf.setSingleEntity(device.getId());
dtf.setSingleEntity(AliasEntityId.fromEntityId(device.getId()));
String sharedKeysStr = "sharedStr,sharedBool,sharedDbl,sharedLong,sharedJson";
List<String> sharedKeysList = List.of(sharedKeysStr.split(","));
List<EntityKey> csKeys = getEntityKeys(clientKeysList, CLIENT_ATTRIBUTE);

80
common/data/src/main/java/org/thingsboard/server/common/data/query/AliasEntityId.java

@ -0,0 +1,80 @@
/**
* Copyright © 2016-2025 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.common.data.query;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.UserId;
@JsonDeserialize(using = AliasEntityIdDeserializer.class)
@JsonSerialize(using = AliasEntityIdSerializer.class)
@Schema
public interface AliasEntityId extends EntityId {
AliasEntityType getAliasEntityType();
EntityId defaultEntityId();
EntityId toEntityId();
@JsonIgnore
default boolean isAliasEntityId() {
return getAliasEntityType() != null;
}
static AliasEntityId fromEntityId(EntityId entityId) {
if (entityId != null) {
return new AliasEntityIdImpl(entityId);
} else {
return null;
}
}
static AliasEntityId resolveAliasEntityId(AliasEntityId aliasEntityId, TenantId tenantId, UserId userId, EntityId userOwnerId) {
if (aliasEntityId != null) {
if (aliasEntityId.isAliasEntityId()) {
AliasEntityType aliasEntityType = aliasEntityId.getAliasEntityType();
switch (aliasEntityType) {
case CURRENT_CUSTOMER -> {
if (EntityType.CUSTOMER.equals(userOwnerId.getEntityType())) {
return fromEntityId(userOwnerId);
} else {
return fromEntityId(aliasEntityId.defaultEntityId());
}
}
case CURRENT_TENANT -> {
return fromEntityId(tenantId);
}
case CURRENT_USER -> {
return fromEntityId(userId);
}
case CURRENT_USER_OWNER -> {
return fromEntityId(userOwnerId);
}
}
} else {
return aliasEntityId;
}
}
return null;
}
}

58
common/data/src/main/java/org/thingsboard/server/common/data/query/AliasEntityIdDeserializer.java

@ -0,0 +1,58 @@
/**
* Copyright © 2016-2025 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.common.data.query;
import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.EntityIdFactory;
import java.io.IOException;
import java.util.UUID;
public class AliasEntityIdDeserializer extends JsonDeserializer<AliasEntityId> {
@Override
public AliasEntityId deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException, JacksonException {
ObjectCodec oc = jsonParser.getCodec();
ObjectNode node = oc.readTree(jsonParser);
if (node.has("entityType")) {
String entityType = node.get("entityType").asText();
try {
EntityType.valueOf(entityType);
if (!node.has("id")) {
throw new IOException("Missing entityType or id!");
}
EntityId entityId = EntityIdFactory.getByTypeAndId(node.get("entityType").asText(), node.get("id").asText());
return new AliasEntityIdImpl(entityId);
} catch (IllegalArgumentException e) {
AliasEntityType aliasEntityType = AliasEntityType.valueOf(entityType);
UUID id = null;
if (node.has("id")) {
id = UUID.fromString(node.get("id").asText());
}
return new AliasEntityIdImpl(aliasEntityType, id);
}
} else {
throw new IOException("Missing entityType!");
}
}
}

104
common/data/src/main/java/org/thingsboard/server/common/data/query/AliasEntityIdImpl.java

@ -0,0 +1,104 @@
/**
* Copyright © 2016-2025 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.common.data.query;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.EntityIdFactory;
import java.util.UUID;
class AliasEntityIdImpl implements AliasEntityId {
private UUID id;
private EntityType entityType;
private AliasEntityType aliasEntityType;
private EntityId defaultEntityId;
protected AliasEntityIdImpl(EntityId entityId) {
this.id = entityId.getId();
this.entityType = entityId.getEntityType();
}
protected AliasEntityIdImpl(AliasEntityType aliasEntityType, UUID id) {
this.aliasEntityType = aliasEntityType;
if (id != null) {
switch (this.aliasEntityType) {
case CURRENT_CUSTOMER:
this.defaultEntityId = new CustomerId(id);
break;
}
}
}
@Override
public AliasEntityType getAliasEntityType() {
return aliasEntityType;
}
@Override
public EntityId defaultEntityId() {
return defaultEntityId;
}
@Override
public EntityId toEntityId() {
return EntityIdFactory.getByTypeAndUuid(entityType, id);
}
@Override
public UUID getId() {
return id;
}
@Override
public EntityType getEntityType() {
return entityType;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof EntityId otherEntityId))
return false;
if (obj instanceof AliasEntityId otherAliasEntityId) {
if (otherAliasEntityId.isAliasEntityId()) {
if (!this.isAliasEntityId()) {
return false;
}
if (this.aliasEntityType != otherAliasEntityId.getAliasEntityType()) {
return false;
}
if (this.defaultEntityId != null && !this.defaultEntityId.equals(otherAliasEntityId.defaultEntityId())) {
return false;
}
if (this.defaultEntityId == null && otherAliasEntityId.defaultEntityId() != null) {
return false;
}
}
}
if (this.isAliasEntityId()) {
return false;
}
if (id == null) {
return otherEntityId.getId() == null;
} else return id.equals(otherEntityId.getId());
}
}

47
common/data/src/main/java/org/thingsboard/server/common/data/query/AliasEntityIdSerializer.java

@ -0,0 +1,47 @@
/**
* Copyright © 2016-2025 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.common.data.query;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.util.UUID;
public class AliasEntityIdSerializer extends JsonSerializer<AliasEntityId> {
@Override
public void serialize(AliasEntityId value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
String entityType;
if (value.isAliasEntityId()) {
entityType = value.getAliasEntityType().name();
} else {
entityType = value.getEntityType().name();
}
gen.writeStringField("entityType", entityType);
UUID id = null;
if (value.getId() != null) {
id = value.getId();
} else if (value.defaultEntityId() != null) {
id = value.defaultEntityId().getId();
}
if (id != null) {
gen.writeStringField("id", id.toString());
}
gen.writeEndObject();
}
}

23
common/data/src/main/java/org/thingsboard/server/common/data/query/AliasEntityType.java

@ -0,0 +1,23 @@
/**
* Copyright © 2016-2025 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.common.data.query;
public enum AliasEntityType {
CURRENT_CUSTOMER,
CURRENT_TENANT,
CURRENT_USER,
CURRENT_USER_OWNER
}

18
common/data/src/main/java/org/thingsboard/server/common/data/query/EntityFilter.java

@ -19,6 +19,11 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.UserId;
import static org.thingsboard.server.common.data.query.AliasEntityId.resolveAliasEntityId;
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(
@ -45,4 +50,17 @@ public interface EntityFilter {
@JsonIgnore
EntityFilterType getType();
static void resolveEntityFilter(EntityFilter filter, TenantId tenantId, UserId userId, EntityId userOwnerId) {
if (filter instanceof SingleEntityFilter singleEntityFilter) {
AliasEntityId resolved = resolveAliasEntityId(singleEntityFilter.getSingleEntity(), tenantId, userId, userOwnerId);
singleEntityFilter.setSingleEntity(resolved);
} else if (filter instanceof RelationsQueryFilter queryFilter) {
AliasEntityId resolved = resolveAliasEntityId(queryFilter.getRootEntity(), tenantId, userId, userOwnerId);
queryFilter.setRootEntity(resolved);
} else if (filter instanceof EntitySearchQueryFilter queryFilter) {
AliasEntityId resolved = resolveAliasEntityId(queryFilter.getRootEntity(), tenantId, userId, userOwnerId);
queryFilter.setRootEntity(resolved);
}
}
}

4
common/data/src/main/java/org/thingsboard/server/common/data/query/EntitySearchQueryFilter.java

@ -22,10 +22,12 @@ import org.thingsboard.server.common.data.relation.EntitySearchDirection;
@Data
public abstract class EntitySearchQueryFilter implements EntityFilter {
private EntityId rootEntity;
private AliasEntityId rootEntity;
private String relationType;
private EntitySearchDirection direction;
private int maxLevel;
private boolean fetchLastLevelOnly;
private boolean rootStateEntity;
private AliasEntityId defaultStateEntity;
}

4
common/data/src/main/java/org/thingsboard/server/common/data/query/RelationsQueryFilter.java

@ -32,7 +32,7 @@ public class RelationsQueryFilter implements EntityFilter {
return EntityFilterType.RELATIONS_QUERY;
}
private EntityId rootEntity;
private AliasEntityId rootEntity;
private boolean isMultiRoot;
private EntityType multiRootEntitiesType;
private Set<String> multiRootEntityIds;
@ -41,5 +41,7 @@ public class RelationsQueryFilter implements EntityFilter {
private int maxLevel;
private boolean fetchLastLevelOnly;
private boolean negate;
private boolean rootStateEntity;
private AliasEntityId defaultStateEntity;
}

2
common/data/src/main/java/org/thingsboard/server/common/data/query/SingleEntityFilter.java

@ -25,6 +25,6 @@ public class SingleEntityFilter implements EntityFilter {
return EntityFilterType.SINGLE_ENTITY;
}
private EntityId singleEntity;
private AliasEntityId singleEntity;
}

3
edqs/src/test/java/org/thingsboard/server/edqs/repo/AssetSearchQueryFilterTest.java

@ -26,6 +26,7 @@ import org.thingsboard.server.common.data.id.AssetProfileId;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.query.AliasEntityId;
import org.thingsboard.server.common.data.query.AssetSearchQueryFilter;
import org.thingsboard.server.common.data.query.EntityDataPageLink;
import org.thingsboard.server.common.data.query.EntityDataQuery;
@ -132,7 +133,7 @@ public class AssetSearchQueryFilterTest extends AbstractEDQTest {
private PageData<QueryResult> findData(CustomerId customerId, EntityId rootId,
EntitySearchDirection direction, String relationType, int maxLevel, boolean lastLevelOnly, List<String> assetTypes) {
AssetSearchQueryFilter filter = new AssetSearchQueryFilter();
filter.setRootEntity(rootId);
filter.setRootEntity(AliasEntityId.fromEntityId(rootId));
filter.setDirection(direction);
filter.setRelationType(relationType);
filter.setAssetTypes(assetTypes);

3
edqs/src/test/java/org/thingsboard/server/edqs/repo/DeviceSearchQueryFilterTest.java

@ -27,6 +27,7 @@ import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceProfileId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.query.AliasEntityId;
import org.thingsboard.server.common.data.query.DeviceSearchQueryFilter;
import org.thingsboard.server.common.data.query.EntityDataPageLink;
import org.thingsboard.server.common.data.query.EntityDataQuery;
@ -135,7 +136,7 @@ public class DeviceSearchQueryFilterTest extends AbstractEDQTest {
private PageData<QueryResult> findData(CustomerId customerId, EntityId rootId,
EntitySearchDirection direction, String relationType, int maxLevel, boolean lastLevelOnly, List<String> deviceTypes) {
DeviceSearchQueryFilter filter = new DeviceSearchQueryFilter();
filter.setRootEntity(rootId);
filter.setRootEntity(AliasEntityId.fromEntityId(rootId));
filter.setDirection(direction);
filter.setRelationType(relationType);
filter.setDeviceTypes(deviceTypes);

3
edqs/src/test/java/org/thingsboard/server/edqs/repo/EdgeSearchQueryFilterTest.java

@ -24,6 +24,7 @@ import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.query.AliasEntityId;
import org.thingsboard.server.common.data.query.EdgeSearchQueryFilter;
import org.thingsboard.server.common.data.query.EntityDataPageLink;
import org.thingsboard.server.common.data.query.EntityDataQuery;
@ -101,7 +102,7 @@ public class EdgeSearchQueryFilterTest extends AbstractEDQTest {
private PageData<QueryResult> findData(CustomerId customerId, EntityId rootId,
EntitySearchDirection direction, String relationType, int maxLevel, boolean lastLevelOnly, List<String> edgeTypes) {
EdgeSearchQueryFilter filter = new EdgeSearchQueryFilter();
filter.setRootEntity(rootId);
filter.setRootEntity(AliasEntityId.fromEntityId(rootId));
filter.setDirection(direction);
filter.setRelationType(relationType);
filter.setEdgeTypes(edgeTypes);

3
edqs/src/test/java/org/thingsboard/server/edqs/repo/EntityViewSearchQueryFilterTest.java

@ -24,6 +24,7 @@ import org.thingsboard.server.common.data.id.AssetId;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.query.AliasEntityId;
import org.thingsboard.server.common.data.query.EntityDataPageLink;
import org.thingsboard.server.common.data.query.EntityDataQuery;
import org.thingsboard.server.common.data.query.EntityKeyType;
@ -115,7 +116,7 @@ public class EntityViewSearchQueryFilterTest extends AbstractEDQTest {
private PageData<QueryResult> findData(CustomerId customerId, EntityId rootId,
EntitySearchDirection direction, String relationType, int maxLevel, boolean lastLevelOnly, List<String> entityViewTypes) {
EntityViewSearchQueryFilter filter = new EntityViewSearchQueryFilter();
filter.setRootEntity(rootId);
filter.setRootEntity(AliasEntityId.fromEntityId(rootId));
filter.setDirection(direction);
filter.setRelationType(relationType);
filter.setEntityViewTypes(entityViewTypes);

3
edqs/src/test/java/org/thingsboard/server/edqs/repo/RelationsQueryFilterTest.java

@ -24,6 +24,7 @@ import org.thingsboard.server.common.data.id.AssetId;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.query.AliasEntityId;
import org.thingsboard.server.common.data.query.EntityDataPageLink;
import org.thingsboard.server.common.data.query.EntityDataQuery;
import org.thingsboard.server.common.data.query.EntityKeyType;
@ -146,7 +147,7 @@ public class RelationsQueryFilterTest extends AbstractEDQTest {
private PageData<QueryResult> filter(CustomerId customerId, EntityId rootId, int maxLevel, boolean lastLevelOnly, RelationEntityTypeFilter... relationEntityTypeFilters) {
RelationsQueryFilter filter = new RelationsQueryFilter();
filter.setRootEntity(rootId);
filter.setRootEntity(AliasEntityId.fromEntityId(rootId));
filter.setFilters(Arrays.asList(relationEntityTypeFilters));
filter.setDirection(EntitySearchDirection.FROM);
filter.setFetchLastLevelOnly(lastLevelOnly);

3
edqs/src/test/java/org/thingsboard/server/edqs/repo/SingleEntityFilterTest.java

@ -26,6 +26,7 @@ import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.DeviceProfileId;
import org.thingsboard.server.common.data.kv.BasicTsKvEntry;
import org.thingsboard.server.common.data.kv.StringDataEntry;
import org.thingsboard.server.common.data.query.AliasEntityId;
import org.thingsboard.server.common.data.query.EntityDataPageLink;
import org.thingsboard.server.common.data.query.EntityDataQuery;
import org.thingsboard.server.common.data.query.EntityDataSortOrder;
@ -113,7 +114,7 @@ public class SingleEntityFilterTest extends AbstractEDQTest {
private static EntityDataQuery getEntityDataQuery(DeviceId deviceId) {
SingleEntityFilter filter = new SingleEntityFilter();
filter.setSingleEntity(deviceId);
filter.setSingleEntity(AliasEntityId.fromEntityId(deviceId));
var pageLink = new EntityDataPageLink(20, 0, null, new EntityDataSortOrder(new EntityKey(EntityKeyType.TIME_SERIES, "state"), EntityDataSortOrder.Direction.DESC), false);
var entityFields = Arrays.asList(new EntityKey(EntityKeyType.ENTITY_FIELD, "name"), new EntityKey(EntityKeyType.ENTITY_FIELD, "createdTime"));

44
ui-ngx/src/app/core/http/entity.service.ts

@ -1031,11 +1031,7 @@ export class EntityService {
const stateEntityId = stateEntityInfo.entityId;
switch (filter.type) {
case AliasFilterType.singleEntity:
const aliasEntityId = this.resolveAliasEntityId(filter.singleEntity.entityType, filter.singleEntity.id);
result.entityFilter = {
type: AliasFilterType.singleEntity,
singleEntity: aliasEntityId
};
result.entityFilter = deepClone(filter);
return of(result);
case AliasFilterType.entityList:
result.entityFilter = deepClone(filter);
@ -1086,9 +1082,8 @@ export class EntityService {
rootEntityId = filter.rootEntity.id;
}
if (rootEntityType && rootEntityId) {
const queryRootEntityId = this.resolveAliasEntityId(rootEntityType, rootEntityId);
result.entityFilter = deepClone(filter);
result.entityFilter.rootEntity = queryRootEntityId;
result.entityFilter.rootEntity = {entityType: rootEntityType, id: rootEntityId};
return of(result);
} else {
return of(result);
@ -1387,44 +1382,9 @@ export class EntityService {
if (!entityId) {
entityId = filter.defaultStateEntity;
}
if (entityId) {
entityId = this.resolveAliasEntityId(entityId.entityType, entityId.id);
}
return {entityId};
}
private resolveAliasEntityId(entityType: EntityType | AliasEntityType, id: string): EntityId {
const entityId: EntityId = {
entityType,
id
};
if (entityType === AliasEntityType.CURRENT_CUSTOMER) {
const authUser = getCurrentAuthUser(this.store);
entityId.entityType = EntityType.CUSTOMER;
if (authUser.authority === Authority.CUSTOMER_USER) {
entityId.id = authUser.customerId;
}
} else if (entityType === AliasEntityType.CURRENT_TENANT){
const authUser = getCurrentAuthUser(this.store);
entityId.entityType = EntityType.TENANT;
entityId.id = authUser.tenantId;
} else if (entityType === AliasEntityType.CURRENT_USER){
const authUser = getCurrentAuthUser(this.store);
entityId.entityType = EntityType.USER;
entityId.id = authUser.userId;
} else if (entityType === AliasEntityType.CURRENT_USER_OWNER){
const authUser = getCurrentAuthUser(this.store);
if (authUser.authority === Authority.TENANT_ADMIN) {
entityId.entityType = EntityType.TENANT;
entityId.id = authUser.tenantId;
} else if (authUser.authority === Authority.CUSTOMER_USER) {
entityId.entityType = EntityType.CUSTOMER;
entityId.id = authUser.customerId;
}
}
return entityId;
}
private createDatasourceFromSubscriptionInfo(subscriptionInfo: SubscriptionInfo): Datasource {
subscriptionInfo = this.validateSubscriptionInfo(subscriptionInfo);
let datasource: Datasource = null;

Loading…
Cancel
Save