Merge pull request #13788 from dashevchenko/latestTelemetryEdqsFix
EDQS: fixed displaying of tenant's telemetry saved by sysadmin
This commit is contained in:
		
						commit
						8ce3c1fa33
					
				@ -79,6 +79,7 @@ import org.thingsboard.server.common.data.query.RelationsQueryFilter;
 | 
			
		||||
import org.thingsboard.server.common.data.query.SingleEntityFilter;
 | 
			
		||||
import org.thingsboard.server.common.data.query.StringFilterPredicate;
 | 
			
		||||
import org.thingsboard.server.common.data.query.StringFilterPredicate.StringOperation;
 | 
			
		||||
import org.thingsboard.server.common.data.query.TsValue;
 | 
			
		||||
import org.thingsboard.server.common.data.relation.EntityRelation;
 | 
			
		||||
import org.thingsboard.server.common.data.relation.EntitySearchDirection;
 | 
			
		||||
import org.thingsboard.server.common.data.relation.RelationEntityTypeFilter;
 | 
			
		||||
@ -118,8 +119,10 @@ import java.util.stream.Collectors;
 | 
			
		||||
import java.util.stream.Stream;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
import static org.thingsboard.server.common.data.AttributeScope.SERVER_SCOPE;
 | 
			
		||||
import static org.thingsboard.server.common.data.query.EntityKeyType.ATTRIBUTE;
 | 
			
		||||
import static org.thingsboard.server.common.data.query.EntityKeyType.ENTITY_FIELD;
 | 
			
		||||
import static org.thingsboard.server.common.data.query.EntityKeyType.SERVER_ATTRIBUTE;
 | 
			
		||||
 | 
			
		||||
@Slf4j
 | 
			
		||||
@DaoSqlTest
 | 
			
		||||
@ -604,7 +607,7 @@ public class EntityServiceTest extends AbstractControllerTest {
 | 
			
		||||
        List<ListenableFuture<AttributesSaveResult>> attributeFutures = new ArrayList<>();
 | 
			
		||||
        for (int i = 0; i < assets.size(); i++) {
 | 
			
		||||
            Asset asset = assets.get(i);
 | 
			
		||||
            attributeFutures.add(saveLongAttribute(asset.getId(), "consumption", consumptions.get(i), AttributeScope.SERVER_SCOPE));
 | 
			
		||||
            attributeFutures.add(saveLongAttribute(asset.getId(), "consumption", consumptions.get(i), SERVER_SCOPE));
 | 
			
		||||
        }
 | 
			
		||||
        Futures.allAsList(attributeFutures).get();
 | 
			
		||||
 | 
			
		||||
@ -1745,6 +1748,33 @@ public class EntityServiceTest extends AbstractControllerTest {
 | 
			
		||||
        deviceService.deleteDevicesByTenantId(tenantId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testFindTenantTelemetry() {
 | 
			
		||||
        // save timeseries by sys admin
 | 
			
		||||
        BasicTsKvEntry timeseries = new BasicTsKvEntry(42L, new DoubleDataEntry("temperature", 45.5));
 | 
			
		||||
        timeseriesService.save(TenantId.SYS_TENANT_ID, tenantId, timeseries);
 | 
			
		||||
 | 
			
		||||
        AttributeKvEntry attr = new BaseAttributeKvEntry(new LongDataEntry("attr", 10L), 42L);
 | 
			
		||||
        attributesService.save(TenantId.SYS_TENANT_ID, tenantId, SERVER_SCOPE, List.of(attr));
 | 
			
		||||
 | 
			
		||||
        SingleEntityFilter singleEntityFilter = new SingleEntityFilter();
 | 
			
		||||
        singleEntityFilter.setSingleEntity(AliasEntityId.fromEntityId(tenantId));
 | 
			
		||||
 | 
			
		||||
        List<EntityKey> entityFields = List.of(
 | 
			
		||||
                new EntityKey(ENTITY_FIELD, "name")
 | 
			
		||||
        );
 | 
			
		||||
        List<EntityKey> latestValues =  List.of(
 | 
			
		||||
                new EntityKey(EntityKeyType.TIME_SERIES, "temperature"),
 | 
			
		||||
                new EntityKey(EntityKeyType.SERVER_ATTRIBUTE, "attr")
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
 | 
			
		||||
        EntityDataQuery query = new EntityDataQuery(singleEntityFilter, pageLink, entityFields, latestValues, null);
 | 
			
		||||
 | 
			
		||||
        findByQueryAndCheckTelemetry(query, EntityKeyType.TIME_SERIES, "temperature", List.of("45.5"));
 | 
			
		||||
        findByQueryAndCheckTelemetry(query, EntityKeyType.SERVER_ATTRIBUTE, "attr", List.of("10"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testBuildStringPredicateQueryOperations() throws ExecutionException, InterruptedException {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -26,6 +26,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 | 
			
		||||
import org.springframework.context.annotation.Primary;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.thingsboard.server.common.data.AttributeScope;
 | 
			
		||||
import org.thingsboard.server.common.data.EntityType;
 | 
			
		||||
import org.thingsboard.server.common.data.ObjectType;
 | 
			
		||||
import org.thingsboard.server.common.data.StringUtils;
 | 
			
		||||
import org.thingsboard.server.common.data.edqs.AttributeKv;
 | 
			
		||||
@ -118,7 +119,8 @@ public class BaseAttributesService implements AttributesService {
 | 
			
		||||
        List<ListenableFuture<Long>> futures = new ArrayList<>(attributes.size());
 | 
			
		||||
        for (AttributeKvEntry attribute : attributes) {
 | 
			
		||||
            ListenableFuture<Long> future = Futures.transform(attributesDao.save(tenantId, entityId, scope, attribute), version -> {
 | 
			
		||||
                edqsService.onUpdate(tenantId, ObjectType.ATTRIBUTE_KV, new AttributeKv(entityId, scope, attribute, version));
 | 
			
		||||
                TenantId edqsTenantId = entityId.getEntityType() == EntityType.TENANT ? (TenantId) entityId : tenantId;
 | 
			
		||||
                edqsService.onUpdate(edqsTenantId, ObjectType.ATTRIBUTE_KV, new AttributeKv(entityId, scope, attribute, version));
 | 
			
		||||
                return version;
 | 
			
		||||
            }, MoreExecutors.directExecutor());
 | 
			
		||||
            futures.add(future);
 | 
			
		||||
@ -136,7 +138,8 @@ public class BaseAttributesService implements AttributesService {
 | 
			
		||||
                String key = keyVersionPair.getFirst();
 | 
			
		||||
                Long version = keyVersionPair.getSecond();
 | 
			
		||||
                if (version != null) {
 | 
			
		||||
                    edqsService.onDelete(tenantId, ObjectType.ATTRIBUTE_KV, new AttributeKv(entityId, scope, key, version));
 | 
			
		||||
                    TenantId edqsTenantId = entityId.getEntityType() == EntityType.TENANT ? (TenantId) entityId : tenantId;
 | 
			
		||||
                    edqsService.onDelete(edqsTenantId, ObjectType.ATTRIBUTE_KV, new AttributeKv(entityId, scope, key, version));
 | 
			
		||||
                }
 | 
			
		||||
                keys.add(key);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -30,6 +30,7 @@ import org.springframework.stereotype.Service;
 | 
			
		||||
import org.thingsboard.server.cache.TbCacheValueWrapper;
 | 
			
		||||
import org.thingsboard.server.cache.VersionedTbCache;
 | 
			
		||||
import org.thingsboard.server.common.data.AttributeScope;
 | 
			
		||||
import org.thingsboard.server.common.data.EntityType;
 | 
			
		||||
import org.thingsboard.server.common.data.ObjectType;
 | 
			
		||||
import org.thingsboard.server.common.data.StringUtils;
 | 
			
		||||
import org.thingsboard.server.common.data.edqs.AttributeKv;
 | 
			
		||||
@ -239,7 +240,8 @@ public class CachedAttributesService implements AttributesService {
 | 
			
		||||
            ListenableFuture<Long> future = Futures.transform(attributesDao.save(tenantId, entityId, scope, attribute), version -> {
 | 
			
		||||
                BaseAttributeKvEntry attributeKvEntry = new BaseAttributeKvEntry(((BaseAttributeKvEntry) attribute).getKv(), attribute.getLastUpdateTs(), version);
 | 
			
		||||
                put(entityId, scope, attributeKvEntry);
 | 
			
		||||
                edqsService.onUpdate(tenantId, ObjectType.ATTRIBUTE_KV, new AttributeKv(entityId, scope, attributeKvEntry, version));
 | 
			
		||||
                TenantId edqsTenantId = entityId.getEntityType() == EntityType.TENANT ? (TenantId) entityId : tenantId;
 | 
			
		||||
                edqsService.onUpdate(edqsTenantId, ObjectType.ATTRIBUTE_KV, new AttributeKv(entityId, scope, attributeKvEntry, version));
 | 
			
		||||
                return version;
 | 
			
		||||
            }, cacheExecutor);
 | 
			
		||||
            futures.add(future);
 | 
			
		||||
@ -263,7 +265,8 @@ public class CachedAttributesService implements AttributesService {
 | 
			
		||||
            Long version = keyVersionPair.getSecond();
 | 
			
		||||
            cache.evict(new AttributeCacheKey(scope, entityId, key), version);
 | 
			
		||||
            if (version != null) {
 | 
			
		||||
                edqsService.onDelete(tenantId, ObjectType.ATTRIBUTE_KV, new AttributeKv(entityId, scope, key, version));
 | 
			
		||||
                TenantId edqsTenantId = entityId.getEntityType() == EntityType.TENANT ? (TenantId) entityId : tenantId;
 | 
			
		||||
                edqsService.onDelete(edqsTenantId, ObjectType.ATTRIBUTE_KV, new AttributeKv(entityId, scope, key, version));
 | 
			
		||||
            }
 | 
			
		||||
            return key;
 | 
			
		||||
        }, cacheExecutor)).toList());
 | 
			
		||||
 | 
			
		||||
@ -196,7 +196,8 @@ public class BaseTimeseriesService implements TimeseriesService {
 | 
			
		||||
            if (saveLatest) {
 | 
			
		||||
                latestFutures.add(Futures.transform(timeseriesLatestDao.saveLatest(tenantId, entityId, tsKvEntry), version -> {
 | 
			
		||||
                    if (version != null) {
 | 
			
		||||
                        edqsService.onUpdate(tenantId, ObjectType.LATEST_TS_KV, new LatestTsKv(entityId, tsKvEntry, version));
 | 
			
		||||
                        TenantId edqsTenantId = entityId.getEntityType() == EntityType.TENANT ? (TenantId) entityId : tenantId;
 | 
			
		||||
                        edqsService.onUpdate(edqsTenantId, ObjectType.LATEST_TS_KV, new LatestTsKv(entityId, tsKvEntry, version));
 | 
			
		||||
                    }
 | 
			
		||||
                    return version;
 | 
			
		||||
                }, MoreExecutors.directExecutor()));
 | 
			
		||||
@ -276,7 +277,8 @@ public class BaseTimeseriesService implements TimeseriesService {
 | 
			
		||||
        return Futures.transform(timeseriesLatestDao.removeLatest(tenantId, entityId, query), result -> {
 | 
			
		||||
            if (result.isRemoved()) {
 | 
			
		||||
                Long version = result.getVersion();
 | 
			
		||||
                edqsService.onDelete(tenantId, ObjectType.LATEST_TS_KV, new LatestTsKv(entityId, query.getKey(), version));
 | 
			
		||||
                TenantId edqsTenantId = entityId.getEntityType() == EntityType.TENANT ? (TenantId) entityId : tenantId;
 | 
			
		||||
                edqsService.onDelete(edqsTenantId, ObjectType.LATEST_TS_KV, new LatestTsKv(entityId, query.getKey(), version));
 | 
			
		||||
            }
 | 
			
		||||
            return result;
 | 
			
		||||
        }, MoreExecutors.directExecutor());
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user