Changeset View
Changeset View
Standalone View
Standalone View
autotests/integration/querytest.cpp
Show First 20 Lines • Show All 44 Lines • ▼ Show 20 Line(s) | 40 | auto touchFile = [](const QString& path) { | |||
---|---|---|---|---|---|
45 | 45 | | |||
46 | return filePathToId(QFile::encodeName(path)); | 46 | return filePathToId(QFile::encodeName(path)); | ||
47 | }; | 47 | }; | ||
48 | 48 | | |||
49 | m_id1 = touchFile(dir->path() + "/file1"); | 49 | m_id1 = touchFile(dir->path() + "/file1"); | ||
50 | m_id2 = touchFile(dir->path() + "/file2"); | 50 | m_id2 = touchFile(dir->path() + "/file2"); | ||
51 | m_id3 = touchFile(dir->path() + "/file3"); | 51 | m_id3 = touchFile(dir->path() + "/file3"); | ||
52 | m_id4 = touchFile(dir->path() + "/file4"); | 52 | m_id4 = touchFile(dir->path() + "/file4"); | ||
53 | | ||||
54 | m_id5 = touchFile(dir->path() + "/tagFile1"); | ||||
55 | m_id6 = touchFile(dir->path() + "/tagFile2"); | ||||
53 | } | 56 | } | ||
54 | 57 | | |||
55 | void init() { | 58 | void init() { | ||
56 | dbDir = new QTemporaryDir(); | 59 | dbDir = new QTemporaryDir(); | ||
57 | db = new Database(dbDir->path()); | 60 | db = new Database(dbDir->path()); | ||
58 | db->open(Database::CreateDatabase); | 61 | db->open(Database::CreateDatabase); | ||
59 | 62 | | |||
60 | insertDocuments(); | 63 | insertDocuments(); | ||
61 | } | 64 | } | ||
62 | 65 | | |||
63 | void cleanup() { | 66 | void cleanup() { | ||
64 | delete db; | 67 | delete db; | ||
65 | delete dbDir; | 68 | delete dbDir; | ||
66 | } | 69 | } | ||
67 | 70 | | |||
68 | void testTermEqual(); | 71 | void testTermEqual(); | ||
69 | void testTermStartsWith(); | 72 | void testTermStartsWith(); | ||
70 | void testTermAnd(); | 73 | void testTermAnd(); | ||
71 | void testTermOr(); | 74 | void testTermOr(); | ||
72 | void testTermPhrase(); | 75 | void testTermPhrase(); | ||
73 | 76 | | |||
77 | void testTagTermAnd_data(); | ||||
78 | void testTagTermAnd(); | ||||
79 | void testTagTermPhrase_data(); | ||||
80 | void testTagTermPhrase(); | ||||
81 | | ||||
74 | private: | 82 | private: | ||
75 | QScopedPointer<QTemporaryDir> dir; | 83 | QScopedPointer<QTemporaryDir> dir; | ||
76 | QTemporaryDir* dbDir; | 84 | QTemporaryDir* dbDir; | ||
77 | Database* db; | 85 | Database* db; | ||
78 | 86 | | |||
79 | void insertDocuments(); | 87 | void insertDocuments(); | ||
80 | void addDocument(Transaction* tr,const QString& text, quint64 id, const QString& url) | 88 | void addDocument(Transaction* tr,const QString& text, quint64 id, const QString& url) | ||
81 | { | 89 | { | ||
82 | Document doc; | 90 | Document doc; | ||
83 | doc.setUrl(QFile::encodeName(url)); | 91 | doc.setUrl(QFile::encodeName(url)); | ||
84 | 92 | | |||
85 | QString fileName = url.mid(url.lastIndexOf('/') + 1); | 93 | QString fileName = url.mid(url.lastIndexOf('/') + 1); | ||
86 | 94 | | |||
87 | TermGenerator tg(doc); | 95 | TermGenerator tg(doc); | ||
88 | tg.indexText(text); | 96 | tg.indexText(text); | ||
89 | tg.indexFileNameText(fileName); | 97 | tg.indexFileNameText(fileName); | ||
90 | doc.setId(id); | 98 | doc.setId(id); | ||
91 | doc.setMTime(1); | 99 | doc.setMTime(1); | ||
92 | doc.setCTime(2); | 100 | doc.setCTime(2); | ||
93 | 101 | | |||
94 | tr->addDocument(doc); | 102 | tr->addDocument(doc); | ||
95 | } | 103 | } | ||
96 | 104 | | |||
105 | void insertTagDocuments(); | ||||
106 | void addTagDocument(Transaction* tr,const QStringList& tags, quint64 id, const QString& url) | ||||
107 | { | ||||
108 | Document doc; | ||||
109 | doc.setUrl(QFile::encodeName(url)); | ||||
110 | | ||||
111 | QString fileName = url.mid(url.lastIndexOf('/') + 1); | ||||
112 | | ||||
113 | TermGenerator tg(doc); | ||||
114 | tg.indexText("text/plain", QByteArray("M")); | ||||
115 | for (const QString& tag : tags) { | ||||
116 | tg.indexXattrText(tag, QByteArray("TA")); | ||||
117 | } | ||||
118 | tg.indexFileNameText(fileName); | ||||
119 | doc.setId(id); | ||||
120 | doc.setMTime(3); | ||||
121 | doc.setCTime(4); | ||||
122 | | ||||
123 | tr->addDocument(doc); | ||||
124 | } | ||||
125 | | ||||
97 | quint64 m_id1; | 126 | quint64 m_id1; | ||
98 | quint64 m_id2; | 127 | quint64 m_id2; | ||
99 | quint64 m_id3; | 128 | quint64 m_id3; | ||
100 | quint64 m_id4; | 129 | quint64 m_id4; | ||
130 | quint64 m_id5; | ||||
131 | quint64 m_id6; | ||||
101 | }; | 132 | }; | ||
102 | 133 | | |||
103 | 134 | | |||
104 | void QueryTest::insertDocuments() | 135 | void QueryTest::insertDocuments() | ||
105 | { | 136 | { | ||
106 | Transaction tr(db, Transaction::ReadWrite); | 137 | Transaction tr(db, Transaction::ReadWrite); | ||
107 | addDocument(&tr, QStringLiteral("The quick brown foxed jumped over the crazy dog"), m_id1, dir->path() + "/file1"); | 138 | addDocument(&tr, QStringLiteral("The quick brown foxed jumped over the crazy dog"), m_id1, dir->path() + "/file1"); | ||
108 | addDocument(&tr, QStringLiteral("The night is dark and full of terror"), m_id2, dir->path() + "/file2"); | 139 | addDocument(&tr, QStringLiteral("The night is dark and full of terror"), m_id2, dir->path() + "/file2"); | ||
109 | addDocument(&tr, QStringLiteral("Don't feel sorry for yourself. Only assholes do that"), m_id3, dir->path() + "/file3"); | 140 | addDocument(&tr, QStringLiteral("Don't feel sorry for yourself. Only assholes do that"), m_id3, dir->path() + "/file3"); | ||
110 | addDocument(&tr, QStringLiteral("Only the dead stay 17 forever. crazy"), m_id4, dir->path() + "/file4"); | 141 | addDocument(&tr, QStringLiteral("Only the dead stay 17 forever. crazy"), m_id4, dir->path() + "/file4"); | ||
111 | tr.commit(); | 142 | tr.commit(); | ||
112 | } | 143 | } | ||
113 | 144 | | |||
145 | void QueryTest::insertTagDocuments() | ||||
146 | { | ||||
147 | Transaction tr(db, Transaction::ReadWrite); | ||||
148 | addTagDocument(&tr, {"One", "Two", "Three", "Four", "F1"}, m_id5, dir->path() + "/tagFile1"); | ||||
149 | addTagDocument(&tr, {"One", "Two-Three", "Four", "F2"}, m_id6, dir->path() + "/tagFile2"); | ||||
150 | tr.commit(); | ||||
151 | } | ||||
152 | | ||||
114 | void QueryTest::testTermEqual() | 153 | void QueryTest::testTermEqual() | ||
115 | { | 154 | { | ||
116 | EngineQuery q("the"); | 155 | EngineQuery q("the"); | ||
117 | 156 | | |||
118 | QVector<quint64> result = {m_id1, m_id2, m_id4}; | 157 | QVector<quint64> result = {m_id1, m_id2, m_id4}; | ||
119 | Transaction tr(db, Transaction::ReadOnly); | 158 | Transaction tr(db, Transaction::ReadOnly); | ||
120 | QCOMPARE(tr.exec(q), result); | 159 | QCOMPARE(tr.exec(q), result); | ||
121 | } | 160 | } | ||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Line(s) | 198 | { | |||
163 | 202 | | |||
164 | EngineQuery q(queries, EngineQuery::Phrase); | 203 | EngineQuery q(queries, EngineQuery::Phrase); | ||
165 | 204 | | |||
166 | QVector<quint64> result = {m_id1}; | 205 | QVector<quint64> result = {m_id1}; | ||
167 | Transaction tr(db, Transaction::ReadOnly); | 206 | Transaction tr(db, Transaction::ReadOnly); | ||
168 | QCOMPARE(tr.exec(q), result); | 207 | QCOMPARE(tr.exec(q), result); | ||
169 | } | 208 | } | ||
170 | 209 | | |||
210 | void QueryTest::testTagTermAnd_data() | ||||
211 | { | ||||
212 | QTest::addColumn<QByteArrayList>("terms"); | ||||
213 | QTest::addColumn<QVector<quint64>>("matchIds"); | ||||
214 | | ||||
215 | QTest::addRow("Simple match") << QByteArrayList({"one", "four"}) | ||||
216 | << QVector<quint64> { m_id5, m_id6 }; | ||||
217 | QTest::addRow("Only one") << QByteArrayList({"one", "f1"}) | ||||
218 | << QVector<quint64> { m_id5 }; | ||||
219 | QTest::addRow("Also from phrase") << QByteArrayList({"two", "three"}) | ||||
220 | << QVector<quint64> { m_id5, m_id6 }; | ||||
221 | } | ||||
222 | | ||||
223 | void QueryTest::testTagTermAnd() | ||||
224 | { | ||||
225 | insertTagDocuments(); | ||||
226 | QFETCH(QByteArrayList, terms); | ||||
227 | QFETCH(QVector<quint64>, matchIds); | ||||
228 | | ||||
229 | QByteArray prefix{"TA"}; | ||||
230 | QVector<EngineQuery> queries; | ||||
231 | for (const QByteArray& term : terms) { | ||||
232 | queries << EngineQuery(prefix + term); | ||||
233 | } | ||||
234 | | ||||
235 | EngineQuery q(queries, EngineQuery::And); | ||||
236 | | ||||
237 | Transaction tr(db, Transaction::ReadOnly); | ||||
238 | qDebug() << matchIds << tr.exec(q); | ||||
239 | QCOMPARE(tr.exec(q), matchIds); | ||||
240 | } | ||||
241 | | ||||
242 | void QueryTest::testTagTermPhrase_data() | ||||
243 | { | ||||
244 | QTest::addColumn<QByteArrayList>("terms"); | ||||
245 | QTest::addColumn<QVector<quint64>>("matchIds"); | ||||
246 | | ||||
247 | QTest::addRow("Simple match") << QByteArrayList({"one"}) | ||||
248 | << QVector<quint64> { m_id5, m_id6 }; | ||||
249 | QTest::addRow("Apart") << QByteArrayList({"two", "four"}) | ||||
250 | << QVector<quint64> { }; | ||||
251 | QTest::addRow("Adjacent") << QByteArrayList({"three", "four"}) | ||||
252 | << QVector<quint64> { }; | ||||
253 | QTest::addRow("Only phrase") << QByteArrayList({"two", "three"}) | ||||
254 | << QVector<quint64> { m_id6 }; | ||||
255 | } | ||||
256 | | ||||
257 | void QueryTest::testTagTermPhrase() | ||||
258 | { | ||||
259 | insertTagDocuments(); | ||||
260 | QFETCH(QByteArrayList, terms); | ||||
261 | QFETCH(QVector<quint64>, matchIds); | ||||
262 | | ||||
263 | QByteArray prefix{"TA"}; | ||||
264 | QVector<EngineQuery> queries; | ||||
265 | for (const QByteArray& term : terms) { | ||||
266 | queries << EngineQuery(prefix + term); | ||||
267 | } | ||||
268 | | ||||
269 | EngineQuery q(queries, EngineQuery::Phrase); | ||||
270 | | ||||
271 | Transaction tr(db, Transaction::ReadOnly); | ||||
272 | auto res = tr.exec(q); | ||||
273 | qDebug() << matchIds << res; | ||||
274 | QCOMPARE(res, matchIds); | ||||
275 | } | ||||
171 | 276 | | |||
172 | QTEST_MAIN(QueryTest) | 277 | QTEST_MAIN(QueryTest) | ||
173 | 278 | | |||
174 | #include "querytest.moc" | 279 | #include "querytest.moc" |