@@ -11,6 +11,8 @@ DbManager::DbManager()
11
11
" dbname=searcher "
12
12
" user=searcher "
13
13
" password=searcher" );
14
+ createTables ();
15
+
14
16
} catch (pqxx::sql_error e) {
15
17
std::cout << e.what () << std::endl;
16
18
}
@@ -24,12 +26,14 @@ DbManager::~DbManager()
24
26
25
27
void DbManager::createTables ()
26
28
{
29
+ // создание таблиц при первом запуске
30
+
27
31
pqxx::transaction<> tx{ *conn };
28
32
29
33
// таблица слов
30
34
tx.exec (" CREATE TABLE IF NOT EXISTS words ( "
31
35
" id SERIAL primary key, "
32
- " word varchar(32) not null uniq "
36
+ " word varchar(32) not null unique "
33
37
" );" );
34
38
35
39
// таблица ресурсов
@@ -45,7 +49,7 @@ void DbManager::createTables()
45
49
" url_id serial, "
46
50
" frequency int not null, "
47
51
48
- " UNIQUE KEY (word_id, url_id)"
52
+ " CONSTRAINT uniq_word_url UNIQUE (word_id, url_id), "
49
53
" FOREIGN KEY (word_id) REFERENCES words (id), "
50
54
" FOREIGN KEY (url_id) REFERENCES urls (id) "
51
55
" );" );
@@ -55,6 +59,8 @@ void DbManager::createTables()
55
59
56
60
std::string DbManager::getStringFromVector (std::vector<int > sourceVector)
57
61
{
62
+ // преобразование верктора int к их перечислению через запятую (для использования в SELECT)
63
+
58
64
std::string line = " " ;
59
65
auto it = sourceVector.begin ();
60
66
int val = *it;
@@ -72,8 +78,11 @@ std::string DbManager::getStringFromVector(std::vector<int> sourceVector)
72
78
73
79
template <typename T>
74
80
std::vector<std::pair<T, std::size_t >> DbManager::adjacent_count (const std::vector<T>& v)
75
- // https://stackoverflow.com/questions/39596336/how-to-count-equal-adjacent-elements-in-a-vector
76
81
{
82
+ // преобразование списка ресурсов к таблице ресурс - количество
83
+ // источник готовой функции:
84
+ // https://stackoverflow.com/questions/39596336/how-to-count-equal-adjacent-elements-in-a-vector
85
+
77
86
std::vector<std::pair<T, std::size_t >> res;
78
87
79
88
for (auto it = v.begin (), e = v.end (); it != e; /* Empty*/ ) {
@@ -89,6 +98,8 @@ std::vector<std::pair<T, std::size_t>> DbManager::adjacent_count(const std::vect
89
98
90
99
unsigned int DbManager::insertWord (std::string word)
91
100
{
101
+ // добавление слова в базу данных
102
+
92
103
try {
93
104
pqxx::transaction<> tx{ *conn };
94
105
pqxx::result r = tx.exec (
@@ -108,6 +119,8 @@ unsigned int DbManager::insertWord(std::string word)
108
119
109
120
unsigned int DbManager::insertUrl (std::string url)
110
121
{
122
+ // добавление ресурса в базу данных
123
+
111
124
try {
112
125
pqxx::transaction<> tx{ *conn };
113
126
pqxx::result r = tx.exec (
@@ -127,6 +140,8 @@ unsigned int DbManager::insertUrl(std::string url)
127
140
128
141
bool DbManager::insertPresence (WordPresence presence)
129
142
{
143
+ // добавление новой частоты в базу данных, а также слова и ресурса, если их еще нет
144
+
130
145
try {
131
146
std::string word = presence.word ;
132
147
std::string url = presence.url ;
@@ -161,6 +176,8 @@ bool DbManager::insertPresence(WordPresence presence)
161
176
162
177
unsigned int DbManager::getWordId (std::string word)
163
178
{
179
+ // получение id слова
180
+
164
181
try {
165
182
pqxx::work tx{ *conn };
166
183
unsigned int id = tx.query_value <unsigned int >(" select id from words " " where word = '" + tx.esc (word) + " ';" );
@@ -172,6 +189,8 @@ unsigned int DbManager::getWordId(std::string word)
172
189
173
190
unsigned int DbManager::getUrlId (std::string url)
174
191
{
192
+ // получение id ресурса
193
+
175
194
try {
176
195
pqxx::work tx{ *conn };
177
196
unsigned int id = tx.query_value <unsigned int >(" select id from urls " " where url = '" + tx.esc (url) + " ';" );
@@ -183,6 +202,8 @@ unsigned int DbManager::getUrlId(std::string url)
183
202
184
203
std::vector<int > DbManager::getWordsIds (std::vector<std::string> words)
185
204
{
205
+ // получние id слов по списку слов
206
+
186
207
std::vector<int > ids;
187
208
for (auto & word : words) {
188
209
ids.push_back (getWordId (word));
@@ -192,6 +213,8 @@ std::vector<int> DbManager::getWordsIds(std::vector<std::string> words)
192
213
193
214
std::vector<int > DbManager::getUrlsIdsByWord (std::string word)
194
215
{
216
+ // получение ресурсов по конкретному слову из таблицы частот
217
+
195
218
std::vector<int > urlIds;
196
219
int wordId = getWordId (word);
197
220
std::string wordIdStr = std::to_string (wordId);
@@ -205,6 +228,9 @@ std::vector<int> DbManager::getUrlsIdsByWord(std::string word)
205
228
206
229
std::vector<int > DbManager::getUrlsIdsByWords (std::vector<std::string> words)
207
230
{
231
+ // получение ресурсов, каждый из которых содержит все слова из запроса
232
+
233
+ // получение просто всех ресурсов по словам из таблицы частот
208
234
std::vector<int > urlIds;
209
235
std::vector<int > urlIdsAccepted;
210
236
std::vector<int > word_ids = getWordsIds (words);
@@ -213,6 +239,7 @@ std::vector<int> DbManager::getUrlsIdsByWords(std::vector<std::string> words)
213
239
urlIds.push_back (urlIdd);
214
240
}
215
241
242
+ // фильтрация ответа по тем ресурсам, которых вернулось не меньше, чем слов
216
243
for (auto pair : adjacent_count (urlIds)) {
217
244
int urlId = pair.first ;
218
245
int count = pair.second ;
@@ -225,6 +252,8 @@ std::vector<int> DbManager::getUrlsIdsByWords(std::vector<std::string> words)
225
252
226
253
std::vector<std::string> DbManager::getSortedUrlsByWords (std::vector<std::string> words)
227
254
{
255
+ // получение списка ресурсов, сразу отсортированного по сумме вхождений слов
256
+
228
257
std::vector<int > url_ids = getUrlsIdsByWords (words);
229
258
std::vector<int > word_ids = getWordsIds (words);
230
259
0 commit comments