From 5b94f14096fe9f813cd54278f2dfc51287a0a0c5 Mon Sep 17 00:00:00 2001 From: IrynaMatveieva Date: Thu, 26 Mar 2026 14:14:10 +0200 Subject: [PATCH 1/2] Fix calculated field cache to filter by tenant --- .../server/service/cf/CalculatedFieldCache.java | 6 +++--- .../service/cf/DefaultCalculatedFieldCache.java | 16 ++++++++++------ .../cf/DefaultCalculatedFieldQueueService.java | 6 +++--- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/cf/CalculatedFieldCache.java b/application/src/main/java/org/thingsboard/server/service/cf/CalculatedFieldCache.java index 720a1b48b0..0889f0e688 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/CalculatedFieldCache.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/CalculatedFieldCache.java @@ -28,13 +28,13 @@ public interface CalculatedFieldCache { CalculatedField getCalculatedField(CalculatedFieldId calculatedFieldId); - List getCalculatedFieldsByEntityId(EntityId entityId); + List getCalculatedFieldsByEntityId(TenantId tenantId, EntityId entityId); - List getCalculatedFieldLinksByEntityId(EntityId entityId); + List getCalculatedFieldLinksByEntityId(TenantId tenantId, EntityId entityId); CalculatedFieldCtx getCalculatedFieldCtx(CalculatedFieldId calculatedFieldId); - List getCalculatedFieldCtxsByEntityId(EntityId entityId); + List getCalculatedFieldCtxsByEntityId(TenantId tenantId, EntityId entityId); void addCalculatedField(TenantId tenantId, CalculatedFieldId calculatedFieldId); diff --git a/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldCache.java b/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldCache.java index 1eba2c4549..34e905553e 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldCache.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldCache.java @@ -91,13 +91,17 @@ public class DefaultCalculatedFieldCache implements CalculatedFieldCache { } @Override - public List getCalculatedFieldsByEntityId(EntityId entityId) { - return entityIdCalculatedFields.getOrDefault(entityId, Collections.emptyList()); + public List getCalculatedFieldsByEntityId(TenantId tenantId, EntityId entityId) { + return entityIdCalculatedFields.getOrDefault(entityId, Collections.emptyList()).stream() + .filter(cf -> cf.getTenantId().equals(tenantId)) + .toList(); } @Override - public List getCalculatedFieldLinksByEntityId(EntityId entityId) { - return entityIdCalculatedFieldLinks.getOrDefault(entityId, Collections.emptyList()); + public List getCalculatedFieldLinksByEntityId(TenantId tenantId, EntityId entityId) { + return entityIdCalculatedFieldLinks.getOrDefault(entityId, Collections.emptyList()).stream() + .filter(link -> link.getTenantId().equals(tenantId)) + .toList(); } @Override @@ -125,11 +129,11 @@ public class DefaultCalculatedFieldCache implements CalculatedFieldCache { } @Override - public List getCalculatedFieldCtxsByEntityId(EntityId entityId) { + public List getCalculatedFieldCtxsByEntityId(TenantId tenantId, EntityId entityId) { if (entityId == null) { return Collections.emptyList(); } - return getCalculatedFieldsByEntityId(entityId).stream() + return getCalculatedFieldsByEntityId(tenantId, entityId).stream() .map(cf -> getCalculatedFieldCtx(cf.getId())) .toList(); } diff --git a/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldQueueService.java b/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldQueueService.java index a816eb104c..13dc16b702 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldQueueService.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldQueueService.java @@ -158,7 +158,7 @@ public class DefaultCalculatedFieldQueueService implements CalculatedFieldQueueS if (!supportedReferencedEntities.contains(entityId.getEntityType())) { return false; } - List entityCfs = calculatedFieldCache.getCalculatedFieldCtxsByEntityId(entityId); + List entityCfs = calculatedFieldCache.getCalculatedFieldCtxsByEntityId(tenantId, entityId); for (CalculatedFieldCtx ctx : entityCfs) { if (filter.test(ctx)) { return true; @@ -167,7 +167,7 @@ public class DefaultCalculatedFieldQueueService implements CalculatedFieldQueueS EntityId profileId = getProfileId(tenantId, entityId); if (profileId != null) { - List profileCfs = calculatedFieldCache.getCalculatedFieldCtxsByEntityId(profileId); + List profileCfs = calculatedFieldCache.getCalculatedFieldCtxsByEntityId(tenantId, profileId); for (CalculatedFieldCtx ctx : profileCfs) { if (filter.test(ctx)) { return true; @@ -175,7 +175,7 @@ public class DefaultCalculatedFieldQueueService implements CalculatedFieldQueueS } } - List links = calculatedFieldCache.getCalculatedFieldLinksByEntityId(entityId); + List links = calculatedFieldCache.getCalculatedFieldLinksByEntityId(tenantId, entityId); for (CalculatedFieldLink link : links) { CalculatedFieldCtx ctx = calculatedFieldCache.getCalculatedFieldCtx(link.getCalculatedFieldId()); if (ctx != null && linkedEntityFilter.test(ctx)) { From 0e8995eb93102ee159e6c83183c9e92d1f1a4aa4 Mon Sep 17 00:00:00 2001 From: IrynaMatveieva Date: Thu, 26 Mar 2026 15:35:27 +0200 Subject: [PATCH 2/2] revert tenant filtering except for type-based lookup --- .../service/cf/CalculatedFieldCache.java | 6 +++--- .../cf/DefaultCalculatedFieldCache.java | 20 ++++++++----------- .../DefaultCalculatedFieldQueueService.java | 6 +++--- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/cf/CalculatedFieldCache.java b/application/src/main/java/org/thingsboard/server/service/cf/CalculatedFieldCache.java index 17d9c1672b..3ea6925695 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/CalculatedFieldCache.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/CalculatedFieldCache.java @@ -33,13 +33,13 @@ public interface CalculatedFieldCache { CalculatedField getCalculatedField(CalculatedFieldId calculatedFieldId); - List getCalculatedFieldsByEntityId(TenantId tenantId, EntityId entityId); + List getCalculatedFieldsByEntityId(EntityId entityId); - List getCalculatedFieldLinksByEntityId(TenantId tenantId, EntityId entityId); + List getCalculatedFieldLinksByEntityId(EntityId entityId); CalculatedFieldCtx getCalculatedFieldCtx(CalculatedFieldId calculatedFieldId); - List getCalculatedFieldCtxsByEntityId(TenantId tenantId, EntityId entityId); + List getCalculatedFieldCtxsByEntityId(EntityId entityId); Stream getCalculatedFieldCtxsByType(TenantId tenantId, CalculatedFieldType cfType); diff --git a/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldCache.java b/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldCache.java index b52a989c64..8a7d38970f 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldCache.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldCache.java @@ -108,17 +108,13 @@ public class DefaultCalculatedFieldCache implements CalculatedFieldCache { } @Override - public List getCalculatedFieldsByEntityId(TenantId tenantId, EntityId entityId) { - return entityIdCalculatedFields.getOrDefault(entityId, Collections.emptyList()).stream() - .filter(cf -> cf.getTenantId().equals(tenantId)) - .toList(); + public List getCalculatedFieldsByEntityId(EntityId entityId) { + return entityIdCalculatedFields.getOrDefault(entityId, Collections.emptyList()); } @Override - public List getCalculatedFieldLinksByEntityId(TenantId tenantId, EntityId entityId) { - return entityIdCalculatedFieldLinks.getOrDefault(entityId, Collections.emptyList()).stream() - .filter(link -> link.tenantId().equals(tenantId)) - .toList(); + public List getCalculatedFieldLinksByEntityId(EntityId entityId) { + return entityIdCalculatedFieldLinks.getOrDefault(entityId, Collections.emptyList()); } @Override @@ -146,11 +142,11 @@ public class DefaultCalculatedFieldCache implements CalculatedFieldCache { } @Override - public List getCalculatedFieldCtxsByEntityId(TenantId tenantId, EntityId entityId) { + public List getCalculatedFieldCtxsByEntityId(EntityId entityId) { if (entityId == null) { return Collections.emptyList(); } - return getCalculatedFieldsByEntityId(tenantId, entityId).stream() + return getCalculatedFieldsByEntityId(entityId).stream() .map(cf -> getCalculatedFieldCtx(cf.getId())) .toList(); } @@ -164,7 +160,7 @@ public class DefaultCalculatedFieldCache implements CalculatedFieldCache { @Override public boolean hasCalculatedFields(TenantId tenantId, EntityId entityId, Predicate filter) { - List entityCfs = getCalculatedFieldCtxsByEntityId(tenantId, entityId); + List entityCfs = getCalculatedFieldCtxsByEntityId(entityId); for (CalculatedFieldCtx ctx : entityCfs) { if (filter.test(ctx)) { return true; @@ -177,7 +173,7 @@ public class DefaultCalculatedFieldCache implements CalculatedFieldCache { public boolean hasCalculatedFieldsByProfile(TenantId tenantId, EntityId entityId, Predicate filter) { EntityId profileId = getProfileId(tenantId, entityId); if (profileId != null) { - List profileCfs = getCalculatedFieldCtxsByEntityId(tenantId, profileId); + List profileCfs = getCalculatedFieldCtxsByEntityId(profileId); for (CalculatedFieldCtx ctx : profileCfs) { if (filter.test(ctx)) { return true; diff --git a/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldQueueService.java b/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldQueueService.java index 4dae1c6549..4c6128f4ba 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldQueueService.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldQueueService.java @@ -171,7 +171,7 @@ public class DefaultCalculatedFieldQueueService implements CalculatedFieldQueueS return true; } - List links = calculatedFieldCache.getCalculatedFieldLinksByEntityId(tenantId, entityId); + List links = calculatedFieldCache.getCalculatedFieldLinksByEntityId(entityId); for (CalculatedFieldLink link : links) { CalculatedFieldCtx ctx = calculatedFieldCache.getCalculatedFieldCtx(link.calculatedFieldId()); if (ctx != null && linkedEntityFilter.test(ctx)) { @@ -180,11 +180,11 @@ public class DefaultCalculatedFieldQueueService implements CalculatedFieldQueueS } for (EntityId dynamicEntity : calculatedFieldCache.getDynamicEntities(tenantId, entityId)) { - if (calculatedFieldCache.getCalculatedFieldCtxsByEntityId(tenantId, dynamicEntity).stream().anyMatch(dynamicSourceFilter)) { + if (calculatedFieldCache.getCalculatedFieldCtxsByEntityId(dynamicEntity).stream().anyMatch(dynamicSourceFilter)) { return true; } EntityId dynamicEntityProfileId = calculatedFieldCache.getProfileId(tenantId, dynamicEntity); - if (calculatedFieldCache.getCalculatedFieldCtxsByEntityId(tenantId, dynamicEntityProfileId).stream().anyMatch(dynamicSourceFilter)) { + if (calculatedFieldCache.getCalculatedFieldCtxsByEntityId(dynamicEntityProfileId).stream().anyMatch(dynamicSourceFilter)) { return true; } }