Проект

Общее

Профиль

Stage-2 » История » Версия 14

Александр Александров, 04.11.2019 04:09

1 1 Александр Александров
h1. План работы
2
3 3 Александр Александров
Работа над тестовым заданием:
4 2 Александр Александров
5 3 Александр Александров
* Схематично отразить работу программы, рассмотреть несколько вариантов работы, где должно быть отражено успех программы или неуспех. Это наглядно покажет как должна работать программа.
6
* Схематично отразить работу программы, рассмотреть несколько вариантов работы, где должны быть отражены успешные и не успешные запросы к сервису. Это наглядно покажет как должна работать программа.
7
* Создать структуру веб-приложения работающего как REST-сервис.
8
* Создание основной бизнес логики.
9
* Покрытие тестами.
10 4 Александр Александров
11
----
12
13
h1. Структура данных.
14
15
h2. Входные данные
16
17
h3. Граф
18
19 11 Александр Александров
Входными данными будет граф G(V,E), где V - множество вершин графа (ноды), E - множество рёбер, соединяющих вершины. Граф не ориентированный. Сама вершина (нода) представляет собой объект, состоящий из уникального имени. Ребро представляет собой объект состоящий из двух ссылок на вершины, которые это ребро соединяет, в данном случае под ссылками подразумевается уникальное имя ноды. В формате JSON это будет выглядеть так:   
20 4 Александр Александров
21
<pre>
22 11 Александр Александров
{[{"name":"unique_node_name"}, ...],[{"nodeOne":"unique_node_one_name", "nodeTwo":"unique_node_one_name"}, ...]}
23 4 Александр Александров
</pre>
24
25
, где
26
27 10 Александр Александров
_{"name":”unique_node_name"}_ - объект описывающий вершину графа (ноду)
28
_{"nodeOne":"unique_node_one_name", "nodeTwo":"unique_node_one_name"}_ - объект описывающий ребро, соединяющее две вершины графа.
29 4 Александр Александров
30
*Примеры входных графов*
31
32
{{dmsf_image(134)}}
33
34
Циклический граф
35
36
{{dmsf_image(131)}}
37
38
Ациклический граф
39
40
Входные графы могут содержать циклы, которые нужно исключить по условию задачи.
41
42
h3. Вершины графа (Ноды)
43
44 12 Александр Александров
Так же на вход будут подаваться списки вершин графа для проверки связности вершин. Представляет собой простой перечень уникальных имён вершин.
45 4 Александр Александров
В представлении JSON будет выглядеть так:
46
47
<pre>
48 12 Александр Александров
["unique_node_name", "unique_node_name", ...]
49 4 Александр Александров
</pre>
50
51 12 Александр Александров
, где unique_node_name - уникальное имя вершины.
52 4 Александр Александров
53
h2. Структура выходных данных
54
55
При запросе к сервису можно получить список вершин (нод) в следующем формате
56
57
<pre>
58 13 Александр Александров
[{"id":1, "name":"unique_name", "counter":0}, ...]
59 4 Александр Александров
</pre>
60 1 Александр Александров
61 13 Александр Александров
или объект отдельной вершины (информацию по отдельной вершине можно получить выполнив соответствующий запрос, либо по уникальному имени или по идентификатору вершины)
62
63
<pre>
64
{"id":1, "name":"unique_name", "counter":0}
65
</pre>
66
67
,где: id - уникальный идентификатор вершины, name - уникальное имя вершины, counter - счётчик посещения вершины.
68 4 Александр Александров
69 14 Александр Александров
Так же есть возможность получить информацию по рёбрам графа в следующем формате
70
71
Списком
72
73
<pre>
74
[{"id":1, "nodeOne":"unique_node_name_one", "nodeOne":"unique_node_name_one"}, ...]
75
</pre>
76
77
Отдельным объектом
78
79
{"id":1, "nodeOne":"unique_node_name_one", "nodeOne":"unique_node_name_one"}
80
81
,где: id - уникальный идентификатор ребра графа, nodeOne, nodeTwo - уникальное имя узла графа. Запись ребра графа хранит информацию о одной паре узлов.
82
83 4 Александр Александров
h2. Модель хранения данных
84
85
Класс *Node* - описывающий модель вершины графа (ноды). Класс состоит из следующих полей:
86
*id* - уникальный идентификатор.
87
*name* - уникальное имя узла (получаем из json).
88
*probability* - вероятность отказа узла (получаем из json).
89
*counter* - при каждом удачном проходе маршрута, через ноду, счётчик ноды увеличивается. 
90
91
92
Класс *Edge* - описывающий модель ребра графа. Класс состоит из следующих полей:
93
*node1* - ссылка на первую ноду
94
*node2* - ссылка на вторую ноду
95
96
h2. Модель хранения данных в БД
97
98
{{dmsf_image(135)}}
99
100 5 Александр Александров
Связь many-to-many
101
102 4 Александр Александров
Предварительно скрипт создания таблиц будет выглядеть так
103
104
<pre><code class="sql">
105
CREATE TABLE NODES(
106
  ID INT NOT NULL AUTO_INCREMENT,
107 1 Александр Александров
  NAME VARCHAR(50) NOT NULL,
108 9 Александр Александров
  PROBABILITY INT DEFAULT 50 NOT NULL,
109 4 Александр Александров
  COUNTER INT DEFAULT 0 NOT NULL,
110
  PRIMARY KEY (ID)
111
);
112
113
CREATE TABLE EDGES(
114
  NODE1_ID INT NOT NULL,
115
  NODE2_ID INT NOT NULL,
116
  FOREIGN KEY (NODE1_ID) REFERENCES NODE(ID), 
117
  FOREIGN KEY (NODE2_ID) REFERENCES NODE(ID),
118
  CHECK (NODE1_ID <> NODE2_ID),
119
  CONSTRAINT UNIQ_EDGE UNIQUE (NODE1_ID,NODE2_ID)
120
);
121
</code></pre>
Go to top