summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2016-02-20 11:29:30 +0100
committerChristian Mollekopf <chrigi_1@fastmail.fm>2016-02-20 11:29:30 +0100
commitd89c27c9a1cc4d2c4ea806d71653e32c2891077b (patch)
tree1bae2be5286e281c946b425b05346f7966c4cc6e
parenta4cf8be92253d1696a8907da85b1b6a8f5d4ad05 (diff)
downloadsink-d89c27c9a1cc4d2c4ea806d71653e32c2891077b.tar.gz
sink-d89c27c9a1cc4d2c4ea806d71653e32c2891077b.zip
Get substring matches to work with sorted duplicates in store
-rw-r--r--common/storage_lmdb.cpp7
-rw-r--r--tests/indextest.cpp9
-rw-r--r--tests/storagetest.cpp15
3 files changed, 30 insertions, 1 deletions
diff --git a/common/storage_lmdb.cpp b/common/storage_lmdb.cpp
index 8cb965f..2d8b187 100644
--- a/common/storage_lmdb.cpp
+++ b/common/storage_lmdb.cpp
@@ -224,7 +224,12 @@ int Storage::NamedDatabase::scan(const QByteArray &k,
224 if (QByteArray::fromRawData((char*)key.mv_data, key.mv_size).startsWith(k)) { 224 if (QByteArray::fromRawData((char*)key.mv_data, key.mv_size).startsWith(k)) {
225 numberOfRetrievedValues++; 225 numberOfRetrievedValues++;
226 if (resultHandler(QByteArray::fromRawData((char*)key.mv_data, key.mv_size), QByteArray::fromRawData((char*)data.mv_data, data.mv_size))) { 226 if (resultHandler(QByteArray::fromRawData((char*)key.mv_data, key.mv_size), QByteArray::fromRawData((char*)data.mv_data, data.mv_size))) {
227 MDB_cursor_op nextOp = d->allowDuplicates ? MDB_NEXT_DUP : MDB_NEXT; 227 if (findSubstringKeys) {
228 //Reset the key to what we search for
229 key.mv_data = (void*)k.constData();
230 key.mv_size = k.size();
231 }
232 MDB_cursor_op nextOp = (d->allowDuplicates && !findSubstringKeys) ? MDB_NEXT_DUP : MDB_NEXT;
228 while ((rc = mdb_cursor_get(cursor, &key, &data, nextOp)) == 0) { 233 while ((rc = mdb_cursor_get(cursor, &key, &data, nextOp)) == 0) {
229 //Every consequent lookup simply iterates through the list 234 //Every consequent lookup simply iterates through the list
230 if (QByteArray::fromRawData((char*)key.mv_data, key.mv_size).startsWith(k)) { 235 if (QByteArray::fromRawData((char*)key.mv_data, key.mv_size).startsWith(k)) {
diff --git a/tests/indextest.cpp b/tests/indextest.cpp
index ce1fde7..1676ecb 100644
--- a/tests/indextest.cpp
+++ b/tests/indextest.cpp
@@ -58,6 +58,15 @@ private slots:
58 [](const Index::Error &error){ qWarning() << "Error: "; }); 58 [](const Index::Error &error){ qWarning() << "Error: "; });
59 QCOMPARE(values.size(), 0); 59 QCOMPARE(values.size(), 0);
60 } 60 }
61 {
62 QList<QByteArray> values;
63 index.lookup(QByteArray("key"), [&values](const QByteArray &value) {
64 values << value;
65 },
66 [](const Index::Error &error){ qWarning() << "Error: "; },
67 true);
68 QCOMPARE(values.size(), 3);
69 }
61 } 70 }
62}; 71};
63 72
diff --git a/tests/storagetest.cpp b/tests/storagetest.cpp
index 6341808..ebd9b8f 100644
--- a/tests/storagetest.cpp
+++ b/tests/storagetest.cpp
@@ -334,6 +334,21 @@ private slots:
334 QCOMPARE(numValues, 2); 334 QCOMPARE(numValues, 2);
335 } 335 }
336 336
337 void testFindSubstringKeysWithDuplicatesEnabled()
338 {
339 Sink::Storage store(testDataPath, dbName, Sink::Storage::ReadWrite);
340 auto transaction = store.createTransaction(Sink::Storage::ReadWrite);
341 auto db = transaction.openDatabase("test", nullptr, true);
342 db.write("sub","value1");
343 db.write("subsub","value2");
344 db.write("wubsub","value3");
345 int numValues = db.scan("sub", [&](const QByteArray &key, const QByteArray &value) -> bool {
346 return true;
347 }, nullptr, true);
348
349 QCOMPARE(numValues, 2);
350 }
351
337 void testKeySorting() 352 void testKeySorting()
338 { 353 {
339 Sink::Storage store(testDataPath, dbName, Sink::Storage::ReadWrite); 354 Sink::Storage store(testDataPath, dbName, Sink::Storage::ReadWrite);