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

View File

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

View File

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

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

View File

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

View File

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