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 -> {
 | 
			
		||||
                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);
 | 
			
		||||
            }
 | 
			
		||||
            case RULE_CHAIN -> {
 | 
			
		||||
@ -164,7 +164,7 @@ public class EntityStateSourcingListener {
 | 
			
		||||
                Asset asset = (Asset) event.getEntity();
 | 
			
		||||
                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);
 | 
			
		||||
            }
 | 
			
		||||
            case NOTIFICATION_REQUEST -> {
 | 
			
		||||
 | 
			
		||||
@ -589,7 +589,6 @@ public class DefaultTbClusterService implements TbClusterService {
 | 
			
		||||
                EntityType.ENTITY_VIEW,
 | 
			
		||||
                EntityType.NOTIFICATION_RULE,
 | 
			
		||||
                EntityType.CALCULATED_FIELD,
 | 
			
		||||
                EntityType.AI_MODEL_SETTINGS,
 | 
			
		||||
                EntityType.TENANT_PROFILE,
 | 
			
		||||
                EntityType.DEVICE_PROFILE,
 | 
			
		||||
                EntityType.ASSET_PROFILE,
 | 
			
		||||
 | 
			
		||||
@ -22,6 +22,7 @@ import org.thingsboard.server.dao.ExportableEntityDao;
 | 
			
		||||
import org.thingsboard.server.dao.TenantEntityDao;
 | 
			
		||||
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
    int deleteByTenantId(TenantId tenantId);
 | 
			
		||||
    Set<AiModelSettingsId> deleteByTenantId(TenantId tenantId);
 | 
			
		||||
 | 
			
		||||
    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.PageLink;
 | 
			
		||||
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.service.DataValidator;
 | 
			
		||||
import org.thingsboard.server.dao.sql.JpaExecutorService;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import static org.thingsboard.server.dao.service.Validator.validatePageLink;
 | 
			
		||||
 | 
			
		||||
@ -65,7 +63,7 @@ class AiModelSettingsServiceImpl extends CachedVersionedEntityService<AiModelSet
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional
 | 
			
		||||
    public AiModelSettings save(AiModelSettings settings) {
 | 
			
		||||
        AiModelSettings oldSettings = aiModelSettingsValidator.validate(settings, AiModelSettings::getTenantId);
 | 
			
		||||
        aiModelSettingsValidator.validate(settings, AiModelSettings::getTenantId);
 | 
			
		||||
 | 
			
		||||
        AiModelSettings savedSettings;
 | 
			
		||||
        try {
 | 
			
		||||
@ -77,15 +75,6 @@ class AiModelSettingsServiceImpl extends CachedVersionedEntityService<AiModelSet
 | 
			
		||||
            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());
 | 
			
		||||
        publishEvictEvent(new AiModelSettingsCacheEvictEvent.Saved(cacheKey, savedSettings));
 | 
			
		||||
 | 
			
		||||
@ -138,13 +127,8 @@ class AiModelSettingsServiceImpl extends CachedVersionedEntityService<AiModelSet
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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);
 | 
			
		||||
        if (deleted) {
 | 
			
		||||
            publishDeleteEvent(toDeleteOpt.get());
 | 
			
		||||
            publishEvictEvent(new AiModelSettingsCacheEvictEvent.Deleted(AiModelSettingsCacheKey.of(tenantId, settingsId)));
 | 
			
		||||
        }
 | 
			
		||||
        return deleted;
 | 
			
		||||
@ -153,25 +137,8 @@ class AiModelSettingsServiceImpl extends CachedVersionedEntityService<AiModelSet
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional
 | 
			
		||||
    public void deleteByTenantId(TenantId tenantId) {
 | 
			
		||||
        List<AiModelSettings> toDelete = aiModelSettingsDao.findAllByTenantId(tenantId, new PageLink(Integer.MAX_VALUE)).getData();
 | 
			
		||||
        if (toDelete.isEmpty()) {
 | 
			
		||||
            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());
 | 
			
		||||
        Set<AiModelSettingsId> deleted = aiModelSettingsDao.deleteByTenantId(tenantId);
 | 
			
		||||
        deleted.forEach(id -> publishEvictEvent(new AiModelSettingsCacheEvictEvent.Deleted(AiModelSettingsCacheKey.of(tenantId, id))));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 | 
			
		||||
@ -73,8 +73,13 @@ interface AiModelSettingsRepository extends JpaRepository<AiModelSettingsEntity,
 | 
			
		||||
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Modifying
 | 
			
		||||
    @Query("DELETE FROM AiModelSettingsEntity ai_model WHERE ai_model.tenantId = :tenantId")
 | 
			
		||||
    int deleteByTenantId(@Param("tenantId") UUID tenantId);
 | 
			
		||||
    @Query(value = """
 | 
			
		||||
                DELETE FROM ai_model_settings
 | 
			
		||||
                WHERE tenant_id = :tenantId
 | 
			
		||||
                RETURNING id
 | 
			
		||||
            """, nativeQuery = true
 | 
			
		||||
    )
 | 
			
		||||
    Set<UUID> deleteByTenantId(@Param("tenantId") UUID tenantId);
 | 
			
		||||
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Modifying
 | 
			
		||||
 | 
			
		||||
@ -39,6 +39,8 @@ import java.util.Optional;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
import static java.util.stream.Collectors.toSet;
 | 
			
		||||
 | 
			
		||||
@SqlDao
 | 
			
		||||
@Component
 | 
			
		||||
@RequiredArgsConstructor
 | 
			
		||||
@ -108,8 +110,10 @@ class JpaAiModelSettingsDao extends JpaAbstractDao<AiModelSettingsEntity, AiMode
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int deleteByTenantId(TenantId tenantId) {
 | 
			
		||||
        return aiModelSettingsRepository.deleteByTenantId(tenantId.getId());
 | 
			
		||||
    public Set<AiModelSettingsId> deleteByTenantId(TenantId tenantId) {
 | 
			
		||||
        return aiModelSettingsRepository.deleteByTenantId(tenantId.getId()).stream()
 | 
			
		||||
                .map(AiModelSettingsId::new)
 | 
			
		||||
                .collect(toSet());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user