Commit 1ebb669c50d37a21533f6d2f9acdecfc188ac052
Merge branch 'master' of github.com:thingsboard/thingsboard
Showing
8 changed files
with
19 additions
and
13 deletions
common/data/src/main/java/org/thingsboard/server/common/data/relation/RelationsSearchParameters.java
... | ... | @@ -35,17 +35,19 @@ public class RelationsSearchParameters { |
35 | 35 | private EntitySearchDirection direction; |
36 | 36 | private RelationTypeGroup relationTypeGroup; |
37 | 37 | private int maxLevel = 1; |
38 | + private boolean fetchLastLevelOnly; | |
38 | 39 | |
39 | - public RelationsSearchParameters(EntityId entityId, EntitySearchDirection direction, int maxLevel) { | |
40 | - this(entityId, direction, maxLevel, RelationTypeGroup.COMMON); | |
40 | + public RelationsSearchParameters(EntityId entityId, EntitySearchDirection direction, int maxLevel, boolean fetchLastLevelOnly) { | |
41 | + this(entityId, direction, maxLevel, RelationTypeGroup.COMMON, fetchLastLevelOnly); | |
41 | 42 | } |
42 | 43 | |
43 | - public RelationsSearchParameters(EntityId entityId, EntitySearchDirection direction, int maxLevel, RelationTypeGroup relationTypeGroup) { | |
44 | + public RelationsSearchParameters(EntityId entityId, EntitySearchDirection direction, int maxLevel, RelationTypeGroup relationTypeGroup, boolean fetchLastLevelOnly) { | |
44 | 45 | this.rootId = entityId.getId(); |
45 | 46 | this.rootType = entityId.getEntityType(); |
46 | 47 | this.direction = direction; |
47 | 48 | this.maxLevel = maxLevel; |
48 | 49 | this.relationTypeGroup = relationTypeGroup; |
50 | + this.fetchLastLevelOnly = fetchLastLevelOnly; | |
49 | 51 | } |
50 | 52 | |
51 | 53 | public EntityId getEntityId() { | ... | ... |
... | ... | @@ -153,7 +153,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ |
153 | 153 | |
154 | 154 | private List<EntityId> getParentEntities(Alarm alarm) throws InterruptedException, ExecutionException { |
155 | 155 | EntityRelationsQuery query = new EntityRelationsQuery(); |
156 | - query.setParameters(new RelationsSearchParameters(alarm.getOriginator(), EntitySearchDirection.TO, Integer.MAX_VALUE)); | |
156 | + query.setParameters(new RelationsSearchParameters(alarm.getOriginator(), EntitySearchDirection.TO, Integer.MAX_VALUE, false)); | |
157 | 157 | return relationService.findByQuery(alarm.getTenantId(), query).get().stream().map(EntityRelation::getFrom).collect(Collectors.toList()); |
158 | 158 | } |
159 | 159 | ... | ... |
... | ... | @@ -26,7 +26,6 @@ import org.springframework.cache.annotation.Cacheable; |
26 | 26 | import org.springframework.cache.annotation.Caching; |
27 | 27 | import org.springframework.stereotype.Service; |
28 | 28 | import org.springframework.util.StringUtils; |
29 | -import org.thingsboard.server.common.data.Tenant; | |
30 | 29 | import org.thingsboard.server.common.data.id.EntityId; |
31 | 30 | import org.thingsboard.server.common.data.id.TenantId; |
32 | 31 | import org.thingsboard.server.common.data.relation.EntityRelation; |
... | ... | @@ -443,6 +442,7 @@ public class BaseRelationService implements RelationService { |
443 | 442 | |
444 | 443 | @Override |
445 | 444 | public ListenableFuture<List<EntityRelation>> findByQuery(TenantId tenantId, EntityRelationsQuery query) { |
445 | + //boolean fetchLastLevelOnly = true; | |
446 | 446 | log.trace("Executing findByQuery [{}]", query); |
447 | 447 | RelationsSearchParameters params = query.getParameters(); |
448 | 448 | final List<EntityTypeFilter> filters = query.getFilters(); |
... | ... | @@ -453,7 +453,7 @@ public class BaseRelationService implements RelationService { |
453 | 453 | int maxLvl = params.getMaxLevel() > 0 ? params.getMaxLevel() : Integer.MAX_VALUE; |
454 | 454 | |
455 | 455 | try { |
456 | - ListenableFuture<Set<EntityRelation>> relationSet = findRelationsRecursively(tenantId, params.getEntityId(), params.getDirection(), params.getRelationTypeGroup(), maxLvl, new ConcurrentHashMap<>()); | |
456 | + ListenableFuture<Set<EntityRelation>> relationSet = findRelationsRecursively(tenantId, params.getEntityId(), params.getDirection(), params.getRelationTypeGroup(), maxLvl, params.isFetchLastLevelOnly(), new ConcurrentHashMap<>()); | |
457 | 457 | return Futures.transform(relationSet, input -> { |
458 | 458 | List<EntityRelation> relations = new ArrayList<>(); |
459 | 459 | if (filters == null || filters.isEmpty()) { |
... | ... | @@ -570,7 +570,7 @@ public class BaseRelationService implements RelationService { |
570 | 570 | } |
571 | 571 | |
572 | 572 | private ListenableFuture<Set<EntityRelation>> findRelationsRecursively(final TenantId tenantId, final EntityId rootId, final EntitySearchDirection direction, |
573 | - RelationTypeGroup relationTypeGroup, int lvl, | |
573 | + RelationTypeGroup relationTypeGroup, int lvl, boolean fetchLastLevelOnly, | |
574 | 574 | final ConcurrentHashMap<EntityId, Boolean> uniqueMap) throws Exception { |
575 | 575 | if (lvl == 0) { |
576 | 576 | return Futures.immediateFuture(Collections.emptySet()); |
... | ... | @@ -596,10 +596,13 @@ public class BaseRelationService implements RelationService { |
596 | 596 | } |
597 | 597 | List<ListenableFuture<Set<EntityRelation>>> futures = new ArrayList<>(); |
598 | 598 | for (EntityId entityId : childrenIds) { |
599 | - futures.add(findRelationsRecursively(tenantId, entityId, direction, relationTypeGroup, lvl, uniqueMap)); | |
599 | + futures.add(findRelationsRecursively(tenantId, entityId, direction, relationTypeGroup, lvl, fetchLastLevelOnly, uniqueMap)); | |
600 | 600 | } |
601 | 601 | //TODO: try to remove this blocking operation |
602 | 602 | List<Set<EntityRelation>> relations = Futures.successfulAsList(futures).get(); |
603 | + if (fetchLastLevelOnly && lvl > 0){ | |
604 | + children.clear(); | |
605 | + } | |
603 | 606 | relations.forEach(r -> r.forEach(children::add)); |
604 | 607 | return Futures.immediateFuture(children); |
605 | 608 | } | ... | ... |
... | ... | @@ -220,7 +220,7 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { |
220 | 220 | saveRelation(relationC); |
221 | 221 | |
222 | 222 | EntityRelationsQuery query = new EntityRelationsQuery(); |
223 | - query.setParameters(new RelationsSearchParameters(assetA, EntitySearchDirection.FROM, -1)); | |
223 | + query.setParameters(new RelationsSearchParameters(assetA, EntitySearchDirection.FROM, -1, false)); | |
224 | 224 | query.setFilters(Collections.singletonList(new EntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.singletonList(EntityType.ASSET)))); |
225 | 225 | List<EntityRelation> relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
226 | 226 | Assert.assertEquals(3, relations.size()); |
... | ... | @@ -254,7 +254,7 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { |
254 | 254 | saveRelation(relationBD); |
255 | 255 | |
256 | 256 | EntityRelationsQuery query = new EntityRelationsQuery(); |
257 | - query.setParameters(new RelationsSearchParameters(assetA, EntitySearchDirection.FROM, -1)); | |
257 | + query.setParameters(new RelationsSearchParameters(assetA, EntitySearchDirection.FROM, -1, false)); | |
258 | 258 | query.setFilters(Collections.singletonList(new EntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.singletonList(EntityType.ASSET)))); |
259 | 259 | List<EntityRelation> relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); |
260 | 260 | Assert.assertEquals(2, relations.size()); | ... | ... |
... | ... | @@ -46,7 +46,7 @@ public class EntitiesRelatedDeviceIdAsyncLoader { |
46 | 46 | private static DeviceSearchQuery buildQuery(EntityId originator, DeviceRelationsQuery deviceRelationsQuery) { |
47 | 47 | DeviceSearchQuery query = new DeviceSearchQuery(); |
48 | 48 | RelationsSearchParameters parameters = new RelationsSearchParameters(originator, |
49 | - deviceRelationsQuery.getDirection(), deviceRelationsQuery.getMaxLevel()); | |
49 | + deviceRelationsQuery.getDirection(), deviceRelationsQuery.getMaxLevel(), deviceRelationsQuery.isFetchLastLevelOnly()); | |
50 | 50 | query.setParameters(parameters); |
51 | 51 | query.setRelationType(deviceRelationsQuery.getRelationType()); |
52 | 52 | query.setDeviceTypes(deviceRelationsQuery.getDeviceTypes()); | ... | ... |
... | ... | @@ -50,7 +50,7 @@ public class EntitiesRelatedEntityIdAsyncLoader { |
50 | 50 | private static EntityRelationsQuery buildQuery(EntityId originator, RelationsQuery relationsQuery) { |
51 | 51 | EntityRelationsQuery query = new EntityRelationsQuery(); |
52 | 52 | RelationsSearchParameters parameters = new RelationsSearchParameters(originator, |
53 | - relationsQuery.getDirection(), relationsQuery.getMaxLevel()); | |
53 | + relationsQuery.getDirection(), relationsQuery.getMaxLevel(), relationsQuery.isFetchLastLevelOnly()); | |
54 | 54 | query.setParameters(parameters); |
55 | 55 | query.setFilters(relationsQuery.getFilters()); |
56 | 56 | return query; | ... | ... |