@ -16,7 +16,10 @@
package org.thingsboard.server.dao.relation ;
import com.google.common.base.Function ;
import com.google.common.util.concurrent.* ;
import com.google.common.util.concurrent.FutureCallback ;
import com.google.common.util.concurrent.Futures ;
import com.google.common.util.concurrent.ListenableFuture ;
import com.google.common.util.concurrent.MoreExecutors ;
import lombok.extern.slf4j.Slf4j ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.cache.Cache ;
@ -206,17 +209,20 @@ public class BaseRelationService implements RelationService {
relations - > {
List < ListenableFuture < Boolean > > results = deleteRelationGroupsAsync ( tenantId , relations , cache , true ) ;
return Futures . allAsList ( results ) ;
} ) ;
} , MoreExecutors . directExecutor ( ) ) ;
ListenableFuture < List < Boolean > > outboundDeletions = Futures . transformAsync ( outboundRelations ,
relations - > {
List < ListenableFuture < Boolean > > results = deleteRelationGroupsAsync ( tenantId , relations , cache , false ) ;
return Futures . allAsList ( results ) ;
} ) ;
} , MoreExecutors . directExecutor ( ) ) ;
ListenableFuture < List < List < Boolean > > > deletionsFuture = Futures . allAsList ( inboundDeletions , outboundDeletions ) ;
return Futures . transform ( Futures . transformAsync ( deletionsFuture , ( deletions ) - > relationDao . deleteOutboundRelationsAsync ( tenantId , entityId ) ) , result - > null ) ;
return Futures . transform ( Futures . transformAsync ( deletionsFuture ,
( deletions ) - > relationDao . deleteOutboundRelationsAsync ( tenantId , entityId ) ,
MoreExecutors . directExecutor ( ) ) ,
result - > null , MoreExecutors . directExecutor ( ) ) ;
}
private List < ListenableFuture < Boolean > > deleteRelationGroupsAsync ( TenantId tenantId , List < List < EntityRelation > > relations , Cache cache , boolean deleteFromDb ) {
@ -306,9 +312,11 @@ public class BaseRelationService implements RelationService {
public void onSuccess ( @Nullable List < EntityRelation > result ) {
cache . putIfAbsent ( fromAndTypeGroup , result ) ;
}
@Override
public void onFailure ( Throwable t ) { }
} ) ;
public void onFailure ( Throwable t ) {
}
} , MoreExecutors . directExecutor ( ) ) ;
return relationsFuture ;
}
}
@ -328,7 +336,7 @@ public class BaseRelationService implements RelationService {
EntityRelationInfo : : setToName ) )
) ;
return Futures . successfulAsList ( futures ) ;
} ) ;
} , MoreExecutors . directExecutor ( ) ) ;
}
@Cacheable ( cacheNames = RELATIONS_CACHE , key = "{#from, #relationType, #typeGroup, 'FROM'}" )
@ -385,9 +393,11 @@ public class BaseRelationService implements RelationService {
public void onSuccess ( @Nullable List < EntityRelation > result ) {
cache . putIfAbsent ( toAndTypeGroup , result ) ;
}
@Override
public void onFailure ( Throwable t ) { }
} ) ;
public void onFailure ( Throwable t ) {
}
} , MoreExecutors . directExecutor ( ) ) ;
return relationsFuture ;
}
}
@ -407,7 +417,7 @@ public class BaseRelationService implements RelationService {
EntityRelationInfo : : setFromName ) )
) ;
return Futures . successfulAsList ( futures ) ;
} ) ;
} , MoreExecutors . directExecutor ( ) ) ;
}
private ListenableFuture < EntityRelationInfo > fetchRelationInfoAsync ( TenantId tenantId , EntityRelation relation ,
@ -418,7 +428,7 @@ public class BaseRelationService implements RelationService {
EntityRelationInfo entityRelationInfo1 = new EntityRelationInfo ( relation ) ;
entityNameSetter . accept ( entityRelationInfo1 , entityName1 ) ;
return entityRelationInfo1 ;
} ) ;
} , MoreExecutors . directExecutor ( ) ) ;
}
@Cacheable ( cacheNames = RELATIONS_CACHE , key = "{#to, #relationType, #typeGroup, 'TO'}" )
@ -466,7 +476,7 @@ public class BaseRelationService implements RelationService {
}
}
return relations ;
} ) ;
} , MoreExecutors . directExecutor ( ) ) ;
} catch ( Exception e ) {
log . warn ( "Failed to query relations: [{}]" , query , e ) ;
throw new RuntimeException ( e ) ;
@ -493,7 +503,7 @@ public class BaseRelationService implements RelationService {
} ) )
) ;
return Futures . successfulAsList ( futures ) ;
} ) ;
} , MoreExecutors . directExecutor ( ) ) ;
}
protected void validate ( EntityRelation relation ) {
@ -600,7 +610,7 @@ public class BaseRelationService implements RelationService {
}
//TODO: try to remove this blocking operation
List < Set < EntityRelation > > relations = Futures . successfulAsList ( futures ) . get ( ) ;
if ( fetchLastLevelOnly & & lvl > 0 ) {
if ( fetchLastLevelOnly & & lvl > 0 ) {
children . clear ( ) ;
}
relations . forEach ( r - > r . forEach ( children : : add ) ) ;