AI rule node: optimize bulk deletion by tenant ID; remove application events
This commit is contained in:
		
							parent
							
								
									cde8bd1c93
								
							
						
					
					
						commit
						41257b6138
					
				@ -99,7 +99,7 @@ public class EntityStateSourcingListener {
 | 
				
			|||||||
            case ASSET -> {
 | 
					            case ASSET -> {
 | 
				
			||||||
                onAssetUpdate(event.getEntity(), event.getOldEntity());
 | 
					                onAssetUpdate(event.getEntity(), event.getOldEntity());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case ASSET_PROFILE, ENTITY_VIEW, NOTIFICATION_RULE, AI_MODEL_SETTINGS -> {
 | 
					            case ASSET_PROFILE, ENTITY_VIEW, NOTIFICATION_RULE -> {
 | 
				
			||||||
                tbClusterService.broadcastEntityStateChangeEvent(tenantId, entityId, lifecycleEvent);
 | 
					                tbClusterService.broadcastEntityStateChangeEvent(tenantId, entityId, lifecycleEvent);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case RULE_CHAIN -> {
 | 
					            case RULE_CHAIN -> {
 | 
				
			||||||
@ -164,7 +164,7 @@ public class EntityStateSourcingListener {
 | 
				
			|||||||
                Asset asset = (Asset) event.getEntity();
 | 
					                Asset asset = (Asset) event.getEntity();
 | 
				
			||||||
                tbClusterService.onAssetDeleted(tenantId, asset, null);
 | 
					                tbClusterService.onAssetDeleted(tenantId, asset, null);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case ASSET_PROFILE, ENTITY_VIEW, CUSTOMER, EDGE, NOTIFICATION_RULE, AI_MODEL_SETTINGS -> {
 | 
					            case ASSET_PROFILE, ENTITY_VIEW, CUSTOMER, EDGE, NOTIFICATION_RULE -> {
 | 
				
			||||||
                tbClusterService.broadcastEntityStateChangeEvent(tenantId, entityId, ComponentLifecycleEvent.DELETED);
 | 
					                tbClusterService.broadcastEntityStateChangeEvent(tenantId, entityId, ComponentLifecycleEvent.DELETED);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case NOTIFICATION_REQUEST -> {
 | 
					            case NOTIFICATION_REQUEST -> {
 | 
				
			||||||
 | 
				
			|||||||
@ -589,7 +589,6 @@ public class DefaultTbClusterService implements TbClusterService {
 | 
				
			|||||||
                EntityType.ENTITY_VIEW,
 | 
					                EntityType.ENTITY_VIEW,
 | 
				
			||||||
                EntityType.NOTIFICATION_RULE,
 | 
					                EntityType.NOTIFICATION_RULE,
 | 
				
			||||||
                EntityType.CALCULATED_FIELD,
 | 
					                EntityType.CALCULATED_FIELD,
 | 
				
			||||||
                EntityType.AI_MODEL_SETTINGS,
 | 
					 | 
				
			||||||
                EntityType.TENANT_PROFILE,
 | 
					                EntityType.TENANT_PROFILE,
 | 
				
			||||||
                EntityType.DEVICE_PROFILE,
 | 
					                EntityType.DEVICE_PROFILE,
 | 
				
			||||||
                EntityType.ASSET_PROFILE,
 | 
					                EntityType.ASSET_PROFILE,
 | 
				
			||||||
 | 
				
			|||||||
@ -22,6 +22,7 @@ import org.thingsboard.server.dao.ExportableEntityDao;
 | 
				
			|||||||
import org.thingsboard.server.dao.TenantEntityDao;
 | 
					import org.thingsboard.server.dao.TenantEntityDao;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Optional;
 | 
					import java.util.Optional;
 | 
				
			||||||
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public interface AiModelSettingsDao extends TenantEntityDao<AiModelSettings>, ExportableEntityDao<AiModelSettingsId, AiModelSettings> {
 | 
					public interface AiModelSettingsDao extends TenantEntityDao<AiModelSettings>, ExportableEntityDao<AiModelSettingsId, AiModelSettings> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -29,7 +30,7 @@ public interface AiModelSettingsDao extends TenantEntityDao<AiModelSettings>, Ex
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    boolean deleteById(TenantId tenantId, AiModelSettingsId settingsId);
 | 
					    boolean deleteById(TenantId tenantId, AiModelSettingsId settingsId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int deleteByTenantId(TenantId tenantId);
 | 
					    Set<AiModelSettingsId> deleteByTenantId(TenantId tenantId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    boolean deleteByTenantIdAndId(TenantId tenantId, AiModelSettingsId settingsId);
 | 
					    boolean deleteByTenantIdAndId(TenantId tenantId, AiModelSettingsId settingsId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -29,14 +29,12 @@ import org.thingsboard.server.common.data.id.TenantId;
 | 
				
			|||||||
import org.thingsboard.server.common.data.page.PageData;
 | 
					import org.thingsboard.server.common.data.page.PageData;
 | 
				
			||||||
import org.thingsboard.server.common.data.page.PageLink;
 | 
					import org.thingsboard.server.common.data.page.PageLink;
 | 
				
			||||||
import org.thingsboard.server.dao.entity.CachedVersionedEntityService;
 | 
					import org.thingsboard.server.dao.entity.CachedVersionedEntityService;
 | 
				
			||||||
import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent;
 | 
					 | 
				
			||||||
import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent;
 | 
					 | 
				
			||||||
import org.thingsboard.server.dao.model.sql.AiModelSettingsEntity;
 | 
					import org.thingsboard.server.dao.model.sql.AiModelSettingsEntity;
 | 
				
			||||||
import org.thingsboard.server.dao.service.DataValidator;
 | 
					import org.thingsboard.server.dao.service.DataValidator;
 | 
				
			||||||
import org.thingsboard.server.dao.sql.JpaExecutorService;
 | 
					import org.thingsboard.server.dao.sql.JpaExecutorService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import java.util.Optional;
 | 
					import java.util.Optional;
 | 
				
			||||||
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import static org.thingsboard.server.dao.service.Validator.validatePageLink;
 | 
					import static org.thingsboard.server.dao.service.Validator.validatePageLink;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -65,7 +63,7 @@ class AiModelSettingsServiceImpl extends CachedVersionedEntityService<AiModelSet
 | 
				
			|||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    @Transactional
 | 
					    @Transactional
 | 
				
			||||||
    public AiModelSettings save(AiModelSettings settings) {
 | 
					    public AiModelSettings save(AiModelSettings settings) {
 | 
				
			||||||
        AiModelSettings oldSettings = aiModelSettingsValidator.validate(settings, AiModelSettings::getTenantId);
 | 
					        aiModelSettingsValidator.validate(settings, AiModelSettings::getTenantId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        AiModelSettings savedSettings;
 | 
					        AiModelSettings savedSettings;
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
@ -77,15 +75,6 @@ class AiModelSettingsServiceImpl extends CachedVersionedEntityService<AiModelSet
 | 
				
			|||||||
            throw e;
 | 
					            throw e;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        eventPublisher.publishEvent(SaveEntityEvent.builder()
 | 
					 | 
				
			||||||
                .tenantId(savedSettings.getTenantId())
 | 
					 | 
				
			||||||
                .entity(savedSettings)
 | 
					 | 
				
			||||||
                .oldEntity(oldSettings)
 | 
					 | 
				
			||||||
                .entityId(savedSettings.getId())
 | 
					 | 
				
			||||||
                .created(oldSettings == null)
 | 
					 | 
				
			||||||
                .broadcastEvent(true)
 | 
					 | 
				
			||||||
                .build());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        var cacheKey = AiModelSettingsCacheKey.of(savedSettings.getTenantId(), savedSettings.getId());
 | 
					        var cacheKey = AiModelSettingsCacheKey.of(savedSettings.getTenantId(), savedSettings.getId());
 | 
				
			||||||
        publishEvictEvent(new AiModelSettingsCacheEvictEvent.Saved(cacheKey, savedSettings));
 | 
					        publishEvictEvent(new AiModelSettingsCacheEvictEvent.Saved(cacheKey, savedSettings));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -138,13 +127,8 @@ class AiModelSettingsServiceImpl extends CachedVersionedEntityService<AiModelSet
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private boolean deleteByTenantIdAndIdInternal(TenantId tenantId, AiModelSettingsId settingsId) {
 | 
					    private boolean deleteByTenantIdAndIdInternal(TenantId tenantId, AiModelSettingsId settingsId) {
 | 
				
			||||||
        Optional<AiModelSettings> toDeleteOpt = aiModelSettingsDao.findByTenantIdAndId(tenantId, settingsId);
 | 
					 | 
				
			||||||
        if (toDeleteOpt.isEmpty()) {
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        boolean deleted = aiModelSettingsDao.deleteByTenantIdAndId(tenantId, settingsId);
 | 
					        boolean deleted = aiModelSettingsDao.deleteByTenantIdAndId(tenantId, settingsId);
 | 
				
			||||||
        if (deleted) {
 | 
					        if (deleted) {
 | 
				
			||||||
            publishDeleteEvent(toDeleteOpt.get());
 | 
					 | 
				
			||||||
            publishEvictEvent(new AiModelSettingsCacheEvictEvent.Deleted(AiModelSettingsCacheKey.of(tenantId, settingsId)));
 | 
					            publishEvictEvent(new AiModelSettingsCacheEvictEvent.Deleted(AiModelSettingsCacheKey.of(tenantId, settingsId)));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return deleted;
 | 
					        return deleted;
 | 
				
			||||||
@ -153,25 +137,8 @@ class AiModelSettingsServiceImpl extends CachedVersionedEntityService<AiModelSet
 | 
				
			|||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    @Transactional
 | 
					    @Transactional
 | 
				
			||||||
    public void deleteByTenantId(TenantId tenantId) {
 | 
					    public void deleteByTenantId(TenantId tenantId) {
 | 
				
			||||||
        List<AiModelSettings> toDelete = aiModelSettingsDao.findAllByTenantId(tenantId, new PageLink(Integer.MAX_VALUE)).getData();
 | 
					        Set<AiModelSettingsId> deleted = aiModelSettingsDao.deleteByTenantId(tenantId);
 | 
				
			||||||
        if (toDelete.isEmpty()) {
 | 
					        deleted.forEach(id -> publishEvictEvent(new AiModelSettingsCacheEvictEvent.Deleted(AiModelSettingsCacheKey.of(tenantId, id))));
 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        aiModelSettingsDao.deleteByTenantId(tenantId);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        toDelete.forEach(settings -> {
 | 
					 | 
				
			||||||
            publishDeleteEvent(settings);
 | 
					 | 
				
			||||||
            publishEvictEvent(new AiModelSettingsCacheEvictEvent.Deleted(AiModelSettingsCacheKey.of(settings.getTenantId(), settings.getId())));
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private void publishDeleteEvent(AiModelSettings settings) {
 | 
					 | 
				
			||||||
        eventPublisher.publishEvent(DeleteEntityEvent.builder()
 | 
					 | 
				
			||||||
                .tenantId(settings.getTenantId())
 | 
					 | 
				
			||||||
                .entityId(settings.getId())
 | 
					 | 
				
			||||||
                .entity(settings)
 | 
					 | 
				
			||||||
                .build());
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
 | 
				
			|||||||
@ -73,8 +73,13 @@ interface AiModelSettingsRepository extends JpaRepository<AiModelSettingsEntity,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Transactional
 | 
					    @Transactional
 | 
				
			||||||
    @Modifying
 | 
					    @Modifying
 | 
				
			||||||
    @Query("DELETE FROM AiModelSettingsEntity ai_model WHERE ai_model.tenantId = :tenantId")
 | 
					    @Query(value = """
 | 
				
			||||||
    int deleteByTenantId(@Param("tenantId") UUID tenantId);
 | 
					                DELETE FROM ai_model_settings
 | 
				
			||||||
 | 
					                WHERE tenant_id = :tenantId
 | 
				
			||||||
 | 
					                RETURNING id
 | 
				
			||||||
 | 
					            """, nativeQuery = true
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    Set<UUID> deleteByTenantId(@Param("tenantId") UUID tenantId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Transactional
 | 
					    @Transactional
 | 
				
			||||||
    @Modifying
 | 
					    @Modifying
 | 
				
			||||||
 | 
				
			|||||||
@ -39,6 +39,8 @@ import java.util.Optional;
 | 
				
			|||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
import java.util.UUID;
 | 
					import java.util.UUID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static java.util.stream.Collectors.toSet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@SqlDao
 | 
					@SqlDao
 | 
				
			||||||
@Component
 | 
					@Component
 | 
				
			||||||
@RequiredArgsConstructor
 | 
					@RequiredArgsConstructor
 | 
				
			||||||
@ -108,8 +110,10 @@ class JpaAiModelSettingsDao extends JpaAbstractDao<AiModelSettingsEntity, AiMode
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public int deleteByTenantId(TenantId tenantId) {
 | 
					    public Set<AiModelSettingsId> deleteByTenantId(TenantId tenantId) {
 | 
				
			||||||
        return aiModelSettingsRepository.deleteByTenantId(tenantId.getId());
 | 
					        return aiModelSettingsRepository.deleteByTenantId(tenantId.getId()).stream()
 | 
				
			||||||
 | 
					                .map(AiModelSettingsId::new)
 | 
				
			||||||
 | 
					                .collect(toSet());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user