-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathsearch.cc
More file actions
159 lines (143 loc) · 6.83 KB
/
search.cc
File metadata and controls
159 lines (143 loc) · 6.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include "search.hh"
#include "support.hh"
using namespace std;
std::vector<SearchHelper::Result> SearchHelper::search(const std::string& query, const std::set<string>& categories, const std::string& cutoff, unsigned int mseclimit, unsigned int itemlimit)
{
std::vector<SearchHelper::Result> ret;
// nummer, category, relurl, score, date, snippet, title
string categoriesstr;
for(const auto& c : categories) {
if(!categoriesstr.empty())
categoriesstr += ", ";
if(c.find_first_of("'\"") != string::npos)
continue;
categoriesstr+= "'" + c + "'";
}
auto matches = d_sqw.queryT("SELECT uuid, datum, snippet(docsearch,-1, '<b>', '</b>', '...', 20) as snip, category, bm25(docsearch) as score FROM docsearch WHERE docsearch match ? and (datum >= ? or datum='') and (? or category in ("+categoriesstr+")) order by rowid desc"
+ (itemlimit ? " limit "+to_string(itemlimit) : ""),
{query, cutoff, categories.empty()}, mseclimit);
for(auto& m : matches) {
Result r;
string category = eget(m, "category");
string id = eget(m, "uuid");
r.categorie = category;
r.snippet = eget(m, "snip");
r.score = get<double>(m["score"]);
r.datum = eget(m, "datum");
if(category == "Document") {
auto doc = d_sqw.queryT("select onderwerp, soort, bijgewerkt, titel, nummer, datum FROM meta.Document where id=?", {id});
if(doc.empty())
continue;
r.nummer = eget(doc[0], "nummer");
r.onderwerp = eget(doc[0], "onderwerp");
r.titel = eget(doc[0], "titel");
r.bijgewerkt = eget(doc[0], "bijgewerkt");
r.soort = eget(doc[0], "soort");
r.relurl = "get/"+r.nummer;
// cout << "Got Document "<< eget(doc[0], "nummer") <<", onderwerp "<<eget(doc[0],"onderwerp")<<endl;
}
else if(category == "Activiteit") {
auto act = d_sqw.queryT("select * from Activiteit where id=?", {id});
if(act.empty()) {
fmt::print("Weird, could not find activity {} in tk", id);
continue;
}
r.nummer = eget(act[0], "nummer");
r.relurl = "activiteit.html?nummer="+ r.nummer;
r.onderwerp = eget(act[0], "onderwerp");
r.titel = eget(act[0], "titel");
r.bijgewerkt = eget(act[0], "bijgewerkt");
r.soort = eget(act[0], "soort");
/*
CREATE TABLE Activiteit ('id' TEXT PRIMARY KEY, 'skiptoken' INT, "nummer" TEXT, "soort" TEXT, "onderwerp" TEXT, "aanvangstijd" TEXT, "eindtijd" TEXT, "besloten" TEXT, "datum" TEXT, "vrsNummer" TEXT, "voortouwNaam" TEXT, "voortouwAfkorting" TEXT, "noot" TEXT, "updated" TEXT, "bijgewerkt" TEXT) STRICT;
*/
// cout << "Got Activiteit "<< eget(act[0], "nummer")<<", onderwerp "<<eget(act[0],"onderwerp") << endl;
}
else if(category == "Verslag") {
auto verslag = d_sqw.queryT("SELECT titel as onderwerp, Vergadering.id as vergaderingId, Verslag.updated as bijgewerkt, '' as titel, Vergadering.datum FROM meta.Verslag, meta.Vergadering WHERE Verslag.id = ? and Vergadering.id = Verslag.vergaderingId", {id});
if(verslag.empty()) {
fmt::print("Weird, could not find verslag {} in tk", id);
continue;
}
// cout << "Got Verslag from vergadering "<< eget(verslag[0], "vergaderingId")<<", onderwerp "<<eget(verslag[0],"onderwerp") << endl;
// we let users find the right Verslag by the Vergaderingid
r.nummer = eget(verslag[0], "vergaderingId");
r.relurl = "verslag.html?vergaderingid="+r.nummer;
r.onderwerp = eget(verslag[0], "onderwerp");
r.titel = eget(verslag[0], "titel");
r.bijgewerkt = eget(verslag[0], "bijgewerkt");
}
else if(category == "Toezegging") {
auto toez = d_sqw.queryT("SELECT tekst, nummer, bijgewerkt FROM meta.Toezegging WHERE id = ?", {id});
if(toez.empty()) {
fmt::print("Weird, could not find toezegging {} in tk", id);
continue;
}
// cout << "Got Verslag from vergadering "<< eget(verslag[0], "vergaderingId")<<", onderwerp "<<eget(verslag[0],"onderwerp") << endl;
r.nummer = eget(toez[0], "nummer");
r.relurl = "toezegging.html?nummer=" + r.nummer;
r.titel = "Toezegging van " +eget(toez[0], "naamToezegger") + " ("+eget(toez[0], "ministerie") +")";
r.onderwerp = eget(toez[0], "tekst");
r.bijgewerkt = eget(toez[0], "bijgewerkt");
}
else if(category == "PersoonGeschenk") {
auto gesch = d_sqw.queryT("SELECT datum, persoongeschenk.bijgewerkt, omschrijving, roepnaam, tussenvoegsel, achternaam, persoon.nummer nummer from PersoonGeschenk, Persoon where PersoonGeschenk.id = ? and Persoon.id = Persoonid", {id});
if(gesch.empty()) {
fmt::print("Weird, could not find geschenk {} in tk", id);
continue;
}
r.nummer = id;
r.relurl = "persoon.html?nummer=" + to_string(get<int64_t>(gesch[0]["nummer"])) +"#" + id;
r.titel = eget(gesch[0], "achternaam");
r.onderwerp = "Geschenk aan " + eget(gesch[0], "roepnaam")
+ " " + eget(gesch[0], "tussenvoegsel") + " " + eget(gesch[0], "achternaam")+": " +
eget(gesch[0], "omschrijving");
r.bijgewerkt = eget(gesch[0], "bijgewerkt");
r.persoonnummer = std::get<int64_t>(gesch[0]["nummer"]);
}
else if(category == "OODocument") {
auto ood = d_sqw.queryT("SELECT id, titel, omschrijvingen, mutatiedatumtijd bijgewerkt, openbaarmakingsdatum datum, omschrijvingen, verantwoordelijke from oo.OODocument where id=?", {id});
if(ood.empty()) {
fmt::print("Weird, could not find OODocument {} in tk", id);
continue;
}
r.nummer = id;
r.relurl = "oo.html?nummer=" + eget(ood[0], "id");
r.titel = eget(ood[0], "omschrijvingen");
r.onderwerp = eget(ood[0],"titel");
r.bijgewerkt = eget(ood[0], "bijgewerkt"); // UTC issue XXX
r.verantwoordelijke = eget(ood[0], "verantwoordelijke");
}
else {
cout<<"Unknown category '"<<category<<"'\n";
}
// cout<<"\t"<<eget(m, "snip")<<"\n";
ret.push_back(r);
}
return ret;
}
set<pair<string,string>> getZakenFromDocument(const std::string& id)
{
SQLiteWriter own("tkindex-small.sqlite3", SQLWFlag::ReadOnly);
own.query("ATTACH database 'tk.sqlite3' as meta");
string q = "\""+id+"\"";
set<pair<string, string>> ret;
auto rows = own.queryT("select uuid, tekst from docsearch where docsearch match ?", {q});
if(rows.empty())
return ret;
std::regex zmatch("(20[0123][0-9]Z[0-9][0-9][0-9][0-9][0-9])");
auto tekst = eget(rows[0], "tekst");
auto words_begin =
std::sregex_iterator(tekst.begin(), tekst.end(), zmatch);
auto words_end = std::sregex_iterator();
// 8064a13e-3827-4f30-a657-f0ff85f5a344
for (auto i = words_begin; i != words_end; ++i) {
string nummer = i->str();
auto znummer = own.queryT("select id from Zaak where nummer=?", {nummer});
if(znummer.size() == 1) {
cout<<"Got: '"<<nummer<<" -> id "<<eget(znummer[0], "id")<<endl;
ret.insert({i->str(), eget(znummer[0], "id")});
}
}
return ret;
}