Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2. Приёмы моделирования перечислений.docx
Скачиваний:
9
Добавлен:
19.06.2023
Размер:
290.96 Кб
Скачать

Аннотация

Приводятся результаты проектирования и фрагменты реализации каркаса, поддерживающего работу с перечислениями на различных примерах изделий. Представлены результаты тестирования разработанных процедур с примерами различных перечислений.

SUMMARY

The results of the design and fragments of the implementation of the framework, which supports the work with enumerations on various examples of products, are given. The results of testing the developed procedures with examples of various enumerations are presented.

Содержание

1. Разработка функциональных требований к подсистеме 6

2. Разработка модели классов 6

3. Разработка модели хранения 6

4. Подготовка скриптов метаданных 6

5. Разработка основных процедур 8

6. Тестирование разработки. 10

Выводы 12

1. Разработка функциональных требований к подсистеме

Для разработки концептуального проекта будем использовать веб-редактор diagrams.net.

Рис. 1. Диаграмма прецендентов работы с перечислениями.

2. Разработка модели классов

Рис. 2. Диаграмма классов перечислений.

3. Разработка модели хранения

Рис. 3. ER-диаграмма перечислений.

4. Подготовка скриптов метаданных

Создание таблиц:

CREATE TABLE Enum ( s_name VARCHAR(15), name VARCHAR(100), PRIMARY KEY (name), UNIQUE (s_name) ); CREATE TABLE EnumVal ( idVal SERIAL, s_name VARCHAR(15), name VARCHAR(100), val DOUBLE PRECISION, s_enumName VARCHAR(15) NOT NULL, PRIMARY KEY (idVal), UNIQUE (s_enumName, name), UNIQUE (s_enumName, s_name), FOREIGN KEY (s_enumName) REFERENCES Enum (s_name) ON DELETE CASCADE ); /* Создание нового перeчисления*/ CREATE OR REPLACE FUNCTION CreateEnum(shortName VARCHAR(15), fullName VARCHAR(100)) RETURNS INTEGER AS $$ DECLARE ALREADY_THERE INTEGER; BEGIN /* Check if name or short name is already in a table */ SELECT COUNT(*) FROM Enum WHERE (name = fullName OR s_name = shortName) INTO ALREADY_THERE; /* Main condition */ IF (ALREADY_THERE = 0) THEN /* Success */ INSERT INTO Enum VALUES (shortName, fullName); RETURN 1; END IF; /* Error */ RETURN 0; END $$ LANGUAGE plpgsql;

Рис. 4. Представление метаданных таблиц в DataGrip.

5. Разработка основных процедур

/* Создание нового значения перeчисления */ CREATE OR REPLACE FUNCTION CreateEnumValue(shortEnumName VARCHAR(15), shortValName VARCHAR(15), fullValName VARCHAR(100), val DOUBLE PRECISION) RETURNS INTEGER AS $$ DECLARE ENUM_FOUND INTEGER; DECLARE ALREADY_THERE INTEGER; BEGIN /* Check if short and full names are already in a table */ SELECT COUNT(*) FROM EnumVal WHERE (s_enumName = shortEnumName AND (s_name = shortValName OR name = fullValName)) INTO ALREADY_THERE; /* Check if enum exists */ SELECT COUNT(*) FROM Enum WHERE s_name = shortEnumName INTO ENUM_FOUND; /* Main condition */ IF (ALREADY_THERE = 0 AND ENUM_FOUND > 0) THEN /* Success */ INSERT INTO EnumVal(s_name, name, val, s_enumName) VALUES(shortValName, fullValName, val, shortEnumName); RETURN 1; END IF; /* Error */ RETURN 0; END $$ LANGUAGE plpgsql; /* Изменение порядка размещения позиций в списке значений */ CREATE OR REPLACE FUNCTION SwapValRows(id1 INTEGER, id2 INTEGER) RETURNS INTEGER AS $$ DECLARE IDS_FOUND INTEGER; BEGIN /* Check if values with given ids exist */ SELECT COUNT(*) FROM EnumVal WHERE (idVal = id1 OR idVal = id2) INTO IDS_FOUND; IF (IDS_FOUND != 2) THEN /* Error */ RETURN 0; END IF; /* Success */ /* Save both rows into separate tables */ CREATE TABLE row1 AS (SELECT * FROM EnumVal WHERE idVal = id1); CREATE TABLE row2 AS (SELECT * FROM EnumVal WHERE idVal = id2); /* Removing these rows form initial table */ DELETE FROM EnumVal WHERE idVal = id1; DELETE FROM EnumVal WHERE idVal = id2; /* Swapping */ INSERT INTO EnumVal (SELECT id2, s_name, name, val, s_enumName FROM row1); INSERT INTO EnumVal (SELECT id1, s_name, name, val, s_enumName FROM row2); /* Removing temporary tables */ DROP TABLE row1; DROP TABLE row2; RETURN 1; END $$ LANGUAGE plpgsql; /* Редактирование значений перечислений */ CREATE OR REPLACE FUNCTION EditValue(valueId INTEGER, shortName VARCHAR(15), fullName VARCHAR(100), value DOUBLE PRECISION, shortEnumName VARCHAR(15)) RETURNS INTEGER AS $$ DECLARE ID_EXISTS INTEGER; DECLARE ENUM_FOUND INTEGER; DECLARE ALREADY_THERE INTEGER; BEGIN /* Check if id exists */ SELECT COUNT(*) FROM EnumVal WHERE (idVal = valueId) INTO ID_EXISTS; /* Check if name or short name are already in the table */ SELECT COUNT(*) FROM EnumVal WHERE (s_enumName = shortEnumName AND idVal != valueId AND (s_name = shortName OR name = fullName)) INTO ALREADY_THERE; /* Check if enum exists */ SELECT COUNT(*) FROM Enum WHERE s_name = shortEnumName INTO ENUM_FOUND; /* Main condition */ IF (ALREADY_THERE = 0 AND ID_EXISTS > 0 AND ENUM_FOUND > 0) THEN /* Success */ UPDATE EnumVal SET s_name = shortName, name = fullName, val = value, s_enumName = shortEnumName WHERE idVal = valueId; RETURN 1; END IF; /* Error */ RETURN 0; END $$ LANGUAGE plpgsql; /* Вывод всех перечислений */ CREATE OR REPLACE FUNCTION PrintEnums() RETURNS TABLE(s_name VARCHAR(15), name VARCHAR(100)) AS $$ SELECT * FROM Enum; $$ LANGUAGE SQL; /* Вывод всех значений перечисления */ CREATE OR REPLACE FUNCTION PrintEnum(shortEnumName VARCHAR(15)) RETURNS TABLE(idVal INTEGER, s_name VARCHAR(15), name VARCHAR(100), val DOUBLE PRECISION) AS $$ SELECT idVal, s_name, name, val FROM EnumVal WHERE s_enumName = shortEnumName; $$ LANGUAGE SQL; /* Удаление перечеслиния */ CREATE OR REPLACE FUNCTION RemoveEnum(shortName VARCHAR(15)) RETURNS INTEGER /* Casually deleting enum by a name, because foreign key flag "ON DELETE CASCADE" is set */ AS $$ DECLARE NODE_FOUND INTEGER; BEGIN /* Check if MetaClass exists */ SELECT COUNT(*) FROM Enum WHERE s_name = shortName INTO NODE_FOUND; IF (NODE_FOUND) THEN /* Success */ DELETE FROM Enum WHERE s_name = shortName; RETURN 1; END IF; /* Error */ RETURN 0; END $$ LANGUAGE plpgsql; /* Удаление значения перечеслиния */ CREATE OR REPLACE FUNCTION RemoveValue(id INTEGER) RETURNS INTEGER AS $$ DECLARE NODE_FOUND INTEGER; BEGIN /* Check if MetaClass exists */ SELECT COUNT(*) FROM EnumVal WHERE idVal = id INTO NODE_FOUND; IF (NODE_FOUND) THEN /* Success */ DELETE FROM EnumVal WHERE idVal = id; RETURN 1; END IF; /* Error */ RETURN 0; END $$ LANGUAGE plpgsql;