added ON DELETE CASCADE and improvements

This commit is contained in:
YevhenBondarenko 2023-09-04 19:45:57 +02:00
parent ffa00bd94a
commit 15d53a95cc
8 changed files with 17 additions and 27 deletions

View File

@ -130,15 +130,10 @@ ALTER TABLE notification_request ALTER COLUMN info SET DATA TYPE varchar(1000000
CREATE TABLE IF NOT EXISTS alarm_types ( CREATE TABLE IF NOT EXISTS alarm_types (
tenant_id uuid NOT NULL, tenant_id uuid NOT NULL,
type varchar(255) NOT NULL, type varchar(255) NOT NULL,
CONSTRAINT tenant_id_type_unq_key UNIQUE (tenant_id, type) CONSTRAINT tenant_id_type_unq_key UNIQUE (tenant_id, type),
CONSTRAINT fk_entity_tenant_id FOREIGN KEY (tenant_id) REFERENCES tenant(id) ON DELETE CASCADE
); );
-- Activate the pg_trgm module for trigram-based searches.
CREATE EXTENSION IF NOT EXISTS pg_trgm;
-- Create a GIN index on the `type` column. (for optimizing `ILIKE` in search query)
CREATE INDEX IF NOT EXISTS idx_gin_alarm_types_type ON alarm_types USING GIN(type gin_trgm_ops);
INSERT INTO alarm_types (tenant_id, type) SELECT DISTINCT tenant_id, type FROM alarm ON CONFLICT (tenant_id, type) DO NOTHING; INSERT INTO alarm_types (tenant_id, type) SELECT DISTINCT tenant_id, type FROM alarm ON CONFLICT (tenant_id, type) DO NOTHING;
ALTER TABLE widget_type ALTER TABLE widget_type

View File

@ -77,7 +77,7 @@ public interface AlarmService extends EntityDaoService {
AlarmApiCallResult delAlarm(TenantId tenantId, AlarmId alarmId); AlarmApiCallResult delAlarm(TenantId tenantId, AlarmId alarmId);
AlarmApiCallResult delAlarm(TenantId tenantId, AlarmId alarmId, boolean deleteAlarmType); AlarmApiCallResult delAlarm(TenantId tenantId, AlarmId alarmId, boolean checkAndDeleteAlarmType);
void delAlarmTypes(TenantId tenantId, Set<String> types); void delAlarmTypes(TenantId tenantId, Set<String> types);

View File

@ -100,5 +100,5 @@ public interface AlarmDao extends Dao<Alarm> {
PageData<EntitySubtype> findTenantAlarmTypes(UUID tenantId, PageLink pageLink); PageData<EntitySubtype> findTenantAlarmTypes(UUID tenantId, PageLink pageLink);
boolean removeAlarmTypes(UUID tenantId, Set<String> types); boolean removeAlarmTypesIfNoAlarmsPresent(UUID tenantId, Set<String> types);
} }

View File

@ -223,7 +223,7 @@ public class BaseAlarmService extends AbstractCachedEntityService<TenantId, Page
@Override @Override
@Transactional @Transactional
public AlarmApiCallResult delAlarm(TenantId tenantId, AlarmId alarmId, boolean deleteAlarmType) { public AlarmApiCallResult delAlarm(TenantId tenantId, AlarmId alarmId, boolean checkAndDeleteAlarmType) {
log.debug("Deleting Alarm Id: {}", alarmId); log.debug("Deleting Alarm Id: {}", alarmId);
AlarmInfo alarm = alarmDao.findAlarmInfoById(tenantId, alarmId.getId()); AlarmInfo alarm = alarmDao.findAlarmInfoById(tenantId, alarmId.getId());
if (alarm == null) { if (alarm == null) {
@ -233,7 +233,7 @@ public class BaseAlarmService extends AbstractCachedEntityService<TenantId, Page
alarmDao.removeById(tenantId, alarm.getUuidId()); alarmDao.removeById(tenantId, alarm.getUuidId());
eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId) eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId)
.entityId(alarmId).entity(alarm).build()); .entityId(alarmId).entity(alarm).build());
if (deleteAlarmType) { if (checkAndDeleteAlarmType) {
delAlarmTypes(tenantId, Collections.singleton(alarm.getType())); delAlarmTypes(tenantId, Collections.singleton(alarm.getType()));
} }
return AlarmApiCallResult.builder().alarm(alarm).deleted(true).successful(true).build(); return AlarmApiCallResult.builder().alarm(alarm).deleted(true).successful(true).build();
@ -243,7 +243,7 @@ public class BaseAlarmService extends AbstractCachedEntityService<TenantId, Page
@Override @Override
@Transactional @Transactional
public void delAlarmTypes(TenantId tenantId, Set<String> types) { public void delAlarmTypes(TenantId tenantId, Set<String> types) {
if (!types.isEmpty() && alarmDao.removeAlarmTypes(tenantId.getId(), types)) { if (!types.isEmpty() && alarmDao.removeAlarmTypesIfNoAlarmsPresent(tenantId.getId(), types)) {
publishEvictEvent(new AlarmTypesCacheEvictEvent(tenantId)); publishEvictEvent(new AlarmTypesCacheEvictEvent(tenantId));
} }
} }

View File

@ -354,6 +354,6 @@ public interface AlarmRepository extends JpaRepository<AlarmEntity, UUID> {
@Transactional @Transactional
@Modifying @Modifying
@Query(value = "DELETE FROM alarm_types AS at WHERE NOT EXISTS (SELECT 1 FROM alarm AS a WHERE a.tenant_id = at.tenant_id AND a.type = at.type) AND at.tenant_id = :tenantId AND at.type IN (:types)", nativeQuery = true) @Query(value = "DELETE FROM alarm_types AS at WHERE NOT EXISTS (SELECT 1 FROM alarm AS a WHERE a.tenant_id = at.tenant_id AND a.type = at.type) AND at.tenant_id = :tenantId AND at.type IN (:types)", nativeQuery = true)
int deleteTypeIfNoOneAlarmExists(@Param("tenantId") UUID tenantId, @Param("types") Set<String> types); int deleteTypeIfNoAlarmsExist(@Param("tenantId") UUID tenantId, @Param("types") Set<String> types);
} }

View File

@ -383,8 +383,8 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A
} }
@Override @Override
public boolean removeAlarmTypes(UUID tenantId, Set<String> types) { public boolean removeAlarmTypesIfNoAlarmsPresent(UUID tenantId, Set<String> types) {
return alarmRepository.deleteTypeIfNoOneAlarmExists(tenantId, types) > 0; return alarmRepository.deleteTypeIfNoAlarmsExist(tenantId, types) > 0;
} }
private static String getPropagationTypes(AlarmPropagationInfo ap) { private static String getPropagationTypes(AlarmPropagationInfo ap) {

View File

@ -115,9 +115,3 @@ CREATE INDEX IF NOT EXISTS idx_notification_id ON notification(id);
CREATE INDEX IF NOT EXISTS idx_notification_recipient_id_created_time ON notification(recipient_id, created_time DESC); CREATE INDEX IF NOT EXISTS idx_notification_recipient_id_created_time ON notification(recipient_id, created_time DESC);
CREATE INDEX IF NOT EXISTS idx_notification_recipient_id_unread ON notification(recipient_id) WHERE status <> 'READ'; CREATE INDEX IF NOT EXISTS idx_notification_recipient_id_unread ON notification(recipient_id) WHERE status <> 'READ';
-- Activate the pg_trgm module for trigram-based searches.
CREATE EXTENSION IF NOT EXISTS pg_trgm;
-- Create a GIN index on the `type` column. (for optimizing `ILIKE` in search query)
CREATE INDEX IF NOT EXISTS idx_gin_alarm_types_type ON alarm_types USING GIN(type gin_trgm_ops);

View File

@ -64,12 +64,6 @@ CREATE TABLE IF NOT EXISTS alarm (
cleared boolean cleared boolean
); );
CREATE TABLE IF NOT EXISTS alarm_types (
tenant_id uuid NOT NULL,
type varchar(255) NOT NULL,
CONSTRAINT tenant_id_type_unq_key UNIQUE (tenant_id, type)
);
CREATE TABLE IF NOT EXISTS alarm_comment ( CREATE TABLE IF NOT EXISTS alarm_comment (
id uuid NOT NULL, id uuid NOT NULL,
created_time bigint NOT NULL, created_time bigint NOT NULL,
@ -862,3 +856,10 @@ CREATE TABLE IF NOT EXISTS user_settings (
CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES tb_user(id) ON DELETE CASCADE, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES tb_user(id) ON DELETE CASCADE,
CONSTRAINT user_settings_pkey PRIMARY KEY (user_id, type) CONSTRAINT user_settings_pkey PRIMARY KEY (user_id, type)
); );
CREATE TABLE IF NOT EXISTS alarm_types (
tenant_id uuid NOT NULL,
type varchar(255) NOT NULL,
CONSTRAINT tenant_id_type_unq_key UNIQUE (tenant_id, type),
CONSTRAINT fk_entity_tenant_id FOREIGN KEY (tenant_id) REFERENCES tenant(id) ON DELETE CASCADE
);