AI rule node: optimize bulk deletion by tenant ID; remove application events

This commit is contained in:
Dmytro Skarzhynets 2025-07-01 16:58:24 +03:00
parent cde8bd1c93
commit 41257b6138
No known key found for this signature in database
GPG Key ID: 2B51652F224037DF
6 changed files with 21 additions and 45 deletions

View File

@ -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 -> {

View File

@ -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,

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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