Проект

Общее

Профиль

Stage-2 » История » Редакция 16

Редакция 15 (Александр Александров, 04.11.2019 04:13) → Редакция 16/31 (Александр Александров, 04.11.2019 04:26)

h1. План работы 

 Работа над тестовым заданием: 

 * Схематично отразить работу программы, рассмотреть несколько вариантов работы, где должно быть отражено успех программы или неуспех. Это наглядно покажет как должна работать программа. 
 * Схематично отразить работу программы, рассмотреть несколько вариантов работы, где должны быть отражены успешные и не успешные запросы к сервису. Это наглядно покажет как должна работать программа. 
 * Создать структуру веб-приложения работающего как REST-сервис. 
 * Создание основной бизнес логики. 
 * Покрытие тестами. 

 ---- 

 h1. Структура данных. 

 h2. Входные данные 

 h3. Граф 

 Входными данными будет граф G(V,E), где V - множество вершин графа (ноды), E - множество рёбер, соединяющих вершины. Граф не ориентированный. Сама вершина (нода) представляет собой объект, состоящий из уникального имени. Ребро представляет собой объект состоящий из двух ссылок на вершины, которые это ребро соединяет, в данном случае под ссылками подразумевается уникальное имя ноды. В формате JSON это будет выглядеть так:    

 <pre> 
 {[{"name":"unique_node_name"}, ...],[{"nodeOne":"unique_node_one_name", "nodeTwo":"unique_node_one_name"}, ...]} 
 </pre> 

 , где 

 _{"name":”unique_node_name"}_ - объект описывающий вершину графа (ноду) 
 _{"nodeOne":"unique_node_one_name", "nodeTwo":"unique_node_one_name"}_ - объект описывающий ребро, соединяющее две вершины графа. 

 *Примеры входных графов* 

 {{dmsf_image(134)}} 

 Циклический граф 

 {{dmsf_image(131)}} 

 Ациклический граф 

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

 h3. Вершины графа (Ноды) 

 Так же на вход будут подаваться списки вершин графа для проверки связности вершин. Представляет собой простой перечень уникальных имён вершин. 
 В представлении JSON будет выглядеть так: 

 <pre> 
 ["unique_node_name", "unique_node_name", ...] 
 </pre> 

 , где unique_node_name - уникальное имя вершины. 

 h2. Структура выходных данных 

 При запросе к сервису можно получить список вершин (нод) в следующем формате 

 <pre> 
 [{"id":1, "name":"unique_name", "counter":0}, ...] 
 </pre> 

 или объект отдельной вершины (информацию по отдельной вершине можно получить выполнив соответствующий запрос, либо по уникальному имени или по идентификатору вершины) 

 <pre> 
 {"id":1, "name":"unique_name", "counter":0} 
 </pre> 

 ,где: id - уникальный идентификатор вершины, name - уникальное имя вершины, counter - счётчик посещения вершины. 

 Так же есть возможность получить информацию по рёбрам графа в следующем формате 

 Списком 

 <pre> 
 [{"id":1, "nodeOne":"unique_node_name_one", "nodeOne":"unique_node_name_one"}, ...] 
 </pre> 

 Отдельным объектом 

 {"id":1, "nodeOne":"unique_node_name_one", "nodeOne":"unique_node_name_one"} 

 ,где: id - уникальный идентификатор ребра графа, nodeOne, nodeTwo - уникальное имя узла графа. Запись ребра графа хранит информацию о одной паре узлов. 

 h2. Модель хранения данных 

 Класс *Node* - описывающий модель вершины графа (ноды). Класс состоит из следующих полей: 

 *id* - уникальный идентификатор (нужен для хранения в БД). Присваивается автоматически при    записи в БД, его нельзя изменить из вне, данный параметр только на отдачу из базы. 
 *name* - уникальное имя узла (получаем из json). 
 *counter* - при каждом удачном проходе маршрута через ноду, счётчик ноды увеличивается автоматически, данный параметр только на отдачу из базы, его нельзя заменить из вне. 


 Класс *Edge* - описывающий модель ребра графа. Ребро графа способно хранить информацию только о одной паре паре узлов. Класс состоит из следующих полей: 

 *id* - уникальный идентификатор записи (нужен для хранения в БД). Присваивается автоматически при    записи в БД, его нельзя изменить из вне, данный параметр только на отдачу из базы. 
 *nodeOne* - ссылка на первую ноду 
 *nodeTwo* - ссылка на вторую ноду 

 h2. Модель хранения данных в БД 

 {{dmsf_image(135)}} 

 Связь один-к-одному Одна запись ребра графа хранит две ссылки на разные ноды many-to-many 

 Предварительно скрипт создания таблиц будет выглядеть так 

 <pre><code class="sql"> 
 DROP TABLE IF EXISTS nodes CASCADE; 
 DROP TABLE IF EXISTS edges; 
 DROP SEQUENCE IF EXISTS global_seq CASCADE; 

 CREATE SEQUENCE global_seq START 5000; 

 CREATE TABLE nodes ( 
     id INTEGER PRIMARY KEY NODES( 
   ID INT NOT NULL AUTO_INCREMENT, 
   NAME VARCHAR(50) NOT NULL, 
   PROBABILITY INT DEFAULT nextval('global_seq'), 
     name VARCHAR 50 NOT NULL, 
     counter INTEGER 
   COUNTER INT DEFAULT 0 NOT NULL NULL, 
   PRIMARY KEY (ID) 
 ); 
 CREATE UNIQUE INDEX nodes_unique_name_idx ON nodes(name); 

 CREATE TABLE edges ( 
     id INTEGER PRIMARY KEY DEFAULT nextval('global_seq'), 
     nodeone EDGES( 
   NODE1_ID INT NOT NULL, 
     nodetwo 
   NODE2_ID INT NOT NULL, 
     
   FOREIGN KEY (nodeone) (NODE1_ID) REFERENCES nodes(id) ON DELETE CASCADE, 
     NODE(ID),  
   FOREIGN KEY (nodetwo) (NODE2_ID) REFERENCES nodes(id) ON DELETE CASCADE, 
     NODE(ID), 
   CHECK (nodeone (NODE1_ID <> nodetwo), 
     NODE2_ID), 
   CONSTRAINT unique_edge UNIQ_EDGE UNIQUE (nodeone, nodetwo) (NODE1_ID,NODE2_ID) 
 ); 
 </code></pre>
Go to top