thingsboard-aplcache

Details

diff --git a/application/src/main/java/org/thingsboard/server/controller/EntityRelationController.java b/application/src/main/java/org/thingsboard/server/controller/EntityRelationController.java
index 4aa1a0a..ec158fe 100644
--- a/application/src/main/java/org/thingsboard/server/controller/EntityRelationController.java
+++ b/application/src/main/java/org/thingsboard/server/controller/EntityRelationController.java
@@ -97,8 +97,8 @@ public class EntityRelationController extends BaseController {
 
     @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
     @RequestMapping(value = "/relation", method = RequestMethod.GET, params = {"fromId", "fromType", "relationType", "toId", "toType"})
-    @ResponseStatus(value = HttpStatus.OK)
-    public void checkRelation(@RequestParam("fromId") String strFromId,
+    @ResponseBody
+    public EntityRelation getRelation(@RequestParam("fromId") String strFromId,
                               @RequestParam("fromType") String strFromType,
                               @RequestParam("relationType") String strRelationType,
                               @RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup,
@@ -114,10 +114,7 @@ public class EntityRelationController extends BaseController {
             checkEntityId(fromId);
             checkEntityId(toId);
             RelationTypeGroup typeGroup = parseRelationTypeGroup(strRelationTypeGroup, RelationTypeGroup.COMMON);
-            Boolean found = relationService.checkRelation(fromId, toId, strRelationType, typeGroup).get();
-            if (!found) {
-                throw new ThingsboardException("Requested item wasn't found!", ThingsboardErrorCode.ITEM_NOT_FOUND);
-            }
+            return checkNotNull(relationService.getRelation(fromId, toId, strRelationType, typeGroup).get());
         } catch (Exception e) {
             throw handleException(e);
         }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationDao.java b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationDao.java
index 72f159e..195a9d9 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationDao.java
@@ -128,6 +128,19 @@ public class BaseRelationDao extends CassandraAbstractAsyncDao implements Relati
     }
 
     @Override
+    public ListenableFuture<EntityRelation> getRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
+        BoundStatement stmt = getCheckRelationStmt().bind()
+                .setUUID(0, from.getId())
+                .setString(1, from.getEntityType().name())
+                .setUUID(2, to.getId())
+                .setString(3, to.getEntityType().name())
+                .set(4, typeGroup, relationTypeGroupCodec)
+                .setString(5, relationType);
+        return getFuture(executeAsyncRead(stmt), rs -> rs != null ? getEntityRelation(rs.one()) : null);
+    }
+
+
+    @Override
     public ListenableFuture<Boolean> saveRelation(EntityRelation relation) {
         BoundStatement stmt = getSaveStmt().bind()
                 .setUUID(0, relation.getFrom().getId())
diff --git a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java
index d9b2f44..3e16e81 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java
@@ -56,6 +56,13 @@ public class BaseRelationService implements RelationService {
     }
 
     @Override
+    public ListenableFuture<EntityRelation> getRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
+        log.trace("Executing EntityRelation [{}][{}][{}][{}]", from, to, relationType, typeGroup);
+        validate(from, to, relationType, typeGroup);
+        return relationDao.getRelation(from, to, relationType, typeGroup);
+    }
+
+    @Override
     public ListenableFuture<Boolean> saveRelation(EntityRelation relation) {
         log.trace("Executing saveRelation [{}]", relation);
         validate(relation);
diff --git a/dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java b/dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java
index 3abadb8..ec946d0 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java
@@ -39,6 +39,8 @@ public interface RelationDao {
 
     ListenableFuture<Boolean> checkRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
 
+    ListenableFuture<EntityRelation> getRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
+
     ListenableFuture<Boolean> saveRelation(EntityRelation relation);
 
     ListenableFuture<Boolean> deleteRelation(EntityRelation relation);
diff --git a/dao/src/main/java/org/thingsboard/server/dao/relation/RelationService.java b/dao/src/main/java/org/thingsboard/server/dao/relation/RelationService.java
index bd2e785..cdecf39 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/relation/RelationService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/relation/RelationService.java
@@ -30,6 +30,8 @@ public interface RelationService {
 
     ListenableFuture<Boolean> checkRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
 
+    ListenableFuture<EntityRelation> getRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
+
     ListenableFuture<Boolean> saveRelation(EntityRelation relation);
 
     ListenableFuture<Boolean> deleteRelation(EntityRelation relation);
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java
index 365b90f..e6a5c79 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java
@@ -109,6 +109,18 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple
     }
 
     @Override
+    public ListenableFuture<EntityRelation> getRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup) {
+        RelationCompositeKey key =
+                new RelationCompositeKey(from.getId(),
+                        from.getEntityType().name(),
+                        to.getId(),
+                        to.getEntityType().name(),
+                        relationType,
+                        typeGroup.name());
+        return service.submit(() -> DaoUtil.getData(relationRepository.findOne(key)));
+    }
+
+    @Override
     public ListenableFuture<Boolean> saveRelation(EntityRelation relation) {
         return service.submit(() -> relationRepository.save(new RelationEntity(relation)) != null);
     }
diff --git a/ui/src/app/api/entity-relation.service.js b/ui/src/app/api/entity-relation.service.js
index 351c252..742aec7 100644
--- a/ui/src/app/api/entity-relation.service.js
+++ b/ui/src/app/api/entity-relation.service.js
@@ -24,6 +24,7 @@ function EntityRelationService($http, $q) {
         saveRelation: saveRelation,
         deleteRelation: deleteRelation,
         deleteRelations: deleteRelations,
+        getRelation: getRelation,
         findByFrom: findByFrom,
         findInfoByFrom: findInfoByFrom,
         findByFromAndType: findByFromAndType,
@@ -74,6 +75,20 @@ function EntityRelationService($http, $q) {
         return deferred.promise;
     }
 
+    function getRelation(fromId, fromType, relationType, toId, toType) {
+        var deferred = $q.defer();
+        var url = '/api/relation?fromId=' + fromId;
+        url += '&fromType=' + fromType;
+        url += '&relationType=' + relationType;
+        url += '&toId=' + toId;
+        url += '&toType=' + toType;
+        $http.get(url).then(function success(response) {
+            deferred.resolve(response.data);
+        }, function fail() {
+            deferred.reject();
+        });
+        return deferred.promise;
+    }
 
     function findByFrom(fromId, fromType) {
         var deferred = $q.defer();
diff --git a/ui/src/app/entity/entity-autocomplete.directive.js b/ui/src/app/entity/entity-autocomplete.directive.js
index 350bde9..8f8153d 100644
--- a/ui/src/app/entity/entity-autocomplete.directive.js
+++ b/ui/src/app/entity/entity-autocomplete.directive.js
@@ -34,9 +34,23 @@ export default function EntityAutocomplete($compile, $templateCache, $q, $filter
 
         scope.fetchEntities = function(searchText) {
             var deferred = $q.defer();
-            entityService.getEntitiesByNameFilter(scope.entityType, searchText, 50, null, scope.entitySubtype).then(function success(result) {
+            var limit = 50;
+            if (scope.excludeEntityIds && scope.excludeEntityIds.length) {
+                limit += scope.excludeEntityIds.length;
+            }
+            entityService.getEntitiesByNameFilter(scope.entityType, searchText, limit, null, scope.entitySubtype).then(function success(result) {
                 if (result) {
-                    deferred.resolve(result);
+                    if (scope.excludeEntityIds && scope.excludeEntityIds.length) {
+                        var entities = [];
+                        result.forEach(function(entity) {
+                            if (scope.excludeEntityIds.indexOf(entity.id.id) == -1) {
+                                entities.push(entity);
+                            }
+                        });
+                        deferred.resolve(entities);
+                    } else {
+                        deferred.resolve(result);
+                    }
                 } else {
                     deferred.resolve([]);
                 }
@@ -165,7 +179,8 @@ export default function EntityAutocomplete($compile, $templateCache, $q, $filter
             tbRequired: '=?',
             disabled:'=ngDisabled',
             entityType: '=',
-            entitySubtype: '=?'
+            entitySubtype: '=?',
+            excludeEntityIds: '=?'
         }
     };
 }