Проект

Общее

Профиль

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

Александр Александров, 04.11.2019 15:12

1 1 Александр Александров
h1. План работы
2
3 3 Александр Александров
Работа над тестовым заданием:
4 2 Александр Александров
5 3 Александр Александров
* Схематично отразить работу программы, рассмотреть несколько вариантов работы, где должно быть отражено успех программы или неуспех. Это наглядно покажет как должна работать программа.
6
* Схематично отразить работу программы, рассмотреть несколько вариантов работы, где должны быть отражены успешные и не успешные запросы к сервису. Это наглядно покажет как должна работать программа.
7 1 Александр Александров
* Создание основной бизнес логики.
8 18 Александр Александров
* Создать структуру веб-приложения работающего как REST-сервис.
9 3 Александр Александров
* Покрытие тестами.
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 19 Александр Александров
*Графическое представление входных графов*
31 4 Александр Александров
32
{{dmsf_image(134)}}
33
34
Циклический граф
35
36
{{dmsf_image(131)}}
37
38
Ациклический граф
39
40
Входные графы могут содержать циклы, которые нужно исключить по условию задачи.
41 1 Александр Александров
42 19 Александр Александров
*В качестве дополнения (это не входило в основную задачу)*
43
44
Возможность работы с нодами отдельно, т.е. в граф можно добавить ноду или набор нод отдельным запросом
45
46
Входной одиночный объект, описывающий ноду
47
48
<pre>
49
{"name":"unique_node_name"}
50
</pre>
51
52
Входной набор нод
53
54
<pre>
55
[{"name":"unique_node_name"}, {"name":"unique_node_name"}, ...]
56
</pre>
57
58
Возможность работы с рёбрами графа отдельно, т.е. в граф можно добавить ребро или набор ребёр отдельным запросом
59
60
Входной, одиночный объект описывающий ребро графа
61
62
<pre>
63
{"nodeOne":"unique_node_one_name", "nodeTwo":"unique_node_one_name"}
64
</pre>
65
66
Входной набор ребёр
67
68
<pre>
69
[{"nodeOne":"unique_node_one_name", "nodeTwo":"unique_node_one_name"}, {"nodeOne":"unique_node_one_name", "nodeTwo":"unique_node_one_name"}, ...]
70
</pre>
71
72
73 4 Александр Александров
h3. Вершины графа (Ноды)
74 12 Александр Александров
75 4 Александр Александров
Так же на вход будут подаваться списки вершин графа для проверки связности вершин. Представляет собой простой перечень уникальных имён вершин.
76
В представлении JSON будет выглядеть так:
77
78 12 Александр Александров
<pre>
79 4 Александр Александров
["unique_node_name", "unique_node_name", ...]
80
</pre>
81 12 Александр Александров
82 4 Александр Александров
, где unique_node_name - уникальное имя вершины.
83
84 1 Александр Александров
h2. Структура выходных данных
85
86 19 Александр Александров
При запросе к сервису можно получить следующие данные:
87
88
*Граф целиком*
89
90
<pre>
91
{"nodes":[{"id":1, "name":"unique_name", "counter":0}, ...], "edges":[{"id":1, "nodeOne":"unique_node_name_one", "nodeOne":"unique_node_name_one"}, ...]}
92
</pre>
93
94
95
*Список вершин графа*
96 4 Александр Александров
97
<pre>
98 13 Александр Александров
[{"id":1, "name":"unique_name", "counter":0}, ...]
99 4 Александр Александров
</pre>
100 1 Александр Александров
101 13 Александр Александров
или объект отдельной вершины (информацию по отдельной вершине можно получить выполнив соответствующий запрос, либо по уникальному имени или по идентификатору вершины)
102
103
<pre>
104
{"id":1, "name":"unique_name", "counter":0}
105
</pre>
106
107
,где: id - уникальный идентификатор вершины, name - уникальное имя вершины, counter - счётчик посещения вершины.
108 4 Александр Александров
109 14 Александр Александров
Так же есть возможность получить информацию по рёбрам графа в следующем формате
110
111
Списком
112
113
<pre>
114
[{"id":1, "nodeOne":"unique_node_name_one", "nodeOne":"unique_node_name_one"}, ...]
115
</pre>
116
117
Отдельным объектом
118
119
{"id":1, "nodeOne":"unique_node_name_one", "nodeOne":"unique_node_name_one"}
120
121
,где: id - уникальный идентификатор ребра графа, nodeOne, nodeTwo - уникальное имя узла графа. Запись ребра графа хранит информацию о одной паре узлов.
122
123 4 Александр Александров
h2. Модель хранения данных
124
125
Класс *Node* - описывающий модель вершины графа (ноды). Класс состоит из следующих полей:
126 15 Александр Александров
127
*id* - уникальный идентификатор (нужен для хранения в БД). Присваивается автоматически при  записи в БД, его нельзя изменить из вне, данный параметр только на отдачу из базы.
128 4 Александр Александров
*name* - уникальное имя узла (получаем из json).
129 15 Александр Александров
*counter* - при каждом удачном проходе маршрута через ноду, счётчик ноды увеличивается автоматически, данный параметр только на отдачу из базы, его нельзя заменить из вне.
130 1 Александр Александров
131 4 Александр Александров
132 15 Александр Александров
Класс *Edge* - описывающий модель ребра графа. Ребро графа способно хранить информацию только о одной паре паре узлов. Класс состоит из следующих полей:
133
134
*id* - уникальный идентификатор записи (нужен для хранения в БД). Присваивается автоматически при  записи в БД, его нельзя изменить из вне, данный параметр только на отдачу из базы.
135
*nodeOne* - ссылка на первую ноду
136
*nodeTwo* - ссылка на вторую ноду
137 4 Александр Александров
138
h2. Модель хранения данных в БД
139
140
{{dmsf_image(135)}}
141
142 16 Александр Александров
Связь один-к-одному Одна запись ребра графа хранит две ссылки на разные ноды
143 5 Александр Александров
144 17 Александр Александров
SQL Schema (PostgreSQL notation)
145 4 Александр Александров
146 1 Александр Александров
<pre><code class="sql">
147 16 Александр Александров
DROP TABLE IF EXISTS nodes CASCADE;
148
DROP TABLE IF EXISTS edges;
149
DROP SEQUENCE IF EXISTS global_seq CASCADE;
150
151
CREATE SEQUENCE global_seq START 5000;
152
153
CREATE TABLE nodes (
154
    id INTEGER PRIMARY KEY DEFAULT nextval('global_seq'),
155
    name VARCHAR NOT NULL,
156
    counter INTEGER DEFAULT 0 NOT NULL
157 4 Александр Александров
);
158 16 Александр Александров
CREATE UNIQUE INDEX nodes_unique_name_idx ON nodes(name);
159 4 Александр Александров
160 16 Александр Александров
CREATE TABLE edges (
161
    id INTEGER PRIMARY KEY DEFAULT nextval('global_seq'),
162
    nodeone INT NOT NULL,
163
    nodetwo INT NOT NULL,
164
    FOREIGN KEY (nodeone) REFERENCES nodes(id) ON DELETE CASCADE,
165
    FOREIGN KEY (nodetwo) REFERENCES nodes(id) ON DELETE CASCADE,
166
    CHECK (nodeone <> nodetwo),
167
    CONSTRAINT unique_edge UNIQUE (nodeone, nodetwo)
168 1 Александр Александров
);
169
</code></pre>
Go to top