Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117882967
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
45 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/src/file/CMakeLists.txt b/src/file/CMakeLists.txt
index cef8fc46..0ef5fe6e 100644
--- a/src/file/CMakeLists.txt
+++ b/src/file/CMakeLists.txt
@@ -1,100 +1,98 @@
add_definitions(-DTRANSLATION_DOMAIN=\"baloo_file\")
kde_enable_exceptions()
-add_subdirectory(search)
-
if (NOT BALOO_LIBRARIES_ONLY)
set(file_static_lib_SRCS
# File Indexer
fileindexer.cpp
fileindexerconfig.cpp
indexscheduler.cpp
indexingqueue.cpp
basicindexingqueue.cpp
fileindexingqueue.cpp
commitqueue.cpp
basicindexingjob.cpp
fileindexingjob.cpp
eventmonitor.cpp
util.cpp
# Common
database.cpp
priority.cpp
regexpcache.cpp
fileexcludefilters.cpp
../lib/filemapping.cpp
storagedevices.cpp
# File Watcher
filewatch.cpp
pendingfilequeue.cpp
metadatamover.cpp
pendingfile.cpp
)
set(BUILD_KINOTIFY False)
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
set(BUILD_KINOTIFY True)
set(file_static_lib_SRCS
${file_static_lib_SRCS}
kinotify.cpp
)
add_definitions(-DBUILD_KINOTIFY)
endif()
add_library(baloofilecommon STATIC ${file_static_lib_SRCS})
target_link_libraries(baloofilecommon
Qt5::Sql
Qt5::DBus
KF5::KIOWidgets
KF5::IdleTime
KF5::I18n
KF5::Solid
KF5::Auth
KF5::FileMetaData
KF5::Crash
KF5::ConfigCore
${XAPIAN_LIBRARIES}
KF5::BalooCore
KF5::BalooXapian
KF5::KDELibs4Support # For Solid
)
set(file_SRCS
main.cpp
)
add_executable(baloo_file ${file_SRCS})
target_compile_definitions(baloo_file PRIVATE -DPROJECT_VERSION="${PROJECT_VERSION}")
target_link_libraries(baloo_file
Qt5::Sql
Qt5::DBus
KF5::KIOWidgets
KF5::IdleTime
KF5::I18n
KF5::Solid
KF5::Auth
KF5::FileMetaData
KF5::Crash
KF5::ConfigCore
${XAPIAN_LIBRARIES}
KF5::BalooCore
KF5::BalooXapian
KF5::KDELibs4Support # For Solid
baloofilecommon
)
install(TARGETS baloo_file ${INSTALL_TARGETS_DEFAULT_ARGS})
install(FILES baloo_file.desktop DESTINATION ${AUTOSTART_INSTALL_DIR})
install(FILES org.kde.baloo.file.indexer.xml DESTINATION ${DBUS_INTERFACES_INSTALL_DIR})
add_subdirectory(autotest)
add_subdirectory(tests)
add_subdirectory(extractor)
add_subdirectory(kcm)
add_subdirectory(inotify)
add_subdirectory(cleaner)
endif()
diff --git a/src/file/search/CMakeLists.txt b/src/file/search/CMakeLists.txt
deleted file mode 100644
index 049cce78..00000000
--- a/src/file/search/CMakeLists.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-add_library(filesearchstore MODULE
- wildcardpostingsource.cpp
- pathfilterpostingsource.cpp
- filesearchstore.cpp)
-
-target_link_libraries(filesearchstore
- Qt5::Core
- Qt5::Sql
- ${XAPIAN_LIBRARIES}
- KF5::FileMetaData
- KF5::BalooCore
- KF5::BalooXapian
-)
-
-install(TARGETS filesearchstore DESTINATION ${PLUGIN_INSTALL_DIR}/kf5/baloo)
-
-add_subdirectory(autotest)
diff --git a/src/file/search/autotest/CMakeLists.txt b/src/file/search/autotest/CMakeLists.txt
deleted file mode 100644
index 5cbcd0af..00000000
--- a/src/file/search/autotest/CMakeLists.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-include(ECMAddTests)
-
-include_directories(
- ${CMAKE_CURRENT_SOURCE_DIR}/..
-)
-
-set(filesearchstore_SRCS filesearchstoretest.cpp
- ../filesearchstore.cpp
- ../pathfilterpostingsource.cpp
- ../wildcardpostingsource.cpp
- ../../../lib/filemapping.cpp
- ../../database.cpp
-)
-
-ecm_add_test(${filesearchstore_SRCS}
- TEST_NAME "filesearchstoretest"
- LINK_LIBRARIES
- Qt5::Core
- Qt5::Sql
- Qt5::Test
- ${XAPIAN_LIBRARIES}
- KF5::FileMetaData
- KF5::BalooCore
- KF5::BalooXapian
-)
diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt
index 3110b313..d9b9c507 100644
--- a/src/lib/CMakeLists.txt
+++ b/src/lib/CMakeLists.txt
@@ -1,88 +1,94 @@
kde_enable_exceptions()
set(CORE_SRCS
searchstore.cpp
term.cpp
query.cpp
queryrunnable.cpp
resultiterator.cpp
result.cpp
advancedqueryparser.cpp
file.cpp
filefetchjob.cpp
filemapping.cpp
filemonitor.cpp
taglistjob.cpp
db.cpp
indexerconfig.cpp
../file/fileindexerconfig.cpp
../file/storagedevices.cpp
../file/regexpcache.cpp
../file/fileexcludefilters.cpp
+
+ # Search Store
+ xapiansearchstore.cpp
+ wildcardpostingsource.cpp
+ pathfilterpostingsource.cpp
+ filesearchstore.cpp
)
add_library(KF5BalooCore ${CORE_SRCS})
add_library(KF5::BalooCore ALIAS KF5BalooCore)
target_link_libraries(KF5BalooCore
PUBLIC
Qt5::Core
KF5::CoreAddons
KF5::FileMetaData
PRIVATE
KF5::ConfigCore
Qt5::DBus
Qt5::Sql
KF5::Solid
- ${XAPIAN_LIBRARIES}
+ KF5::BalooXapian
)
set_target_properties(KF5BalooCore PROPERTIES
VERSION ${BALOO_VERSION_STRING}
SOVERSION ${BALOO_SOVERSION}
EXPORT_NAME BalooCore
)
target_include_directories(KF5BalooCore INTERFACE "$<INSTALL_INTERFACE:${KF5_INCLUDE_INSTALL_DIR}/Baloo>")
generate_export_header(KF5BalooCore BASE_NAME BALOO_CORE EXPORT_FILE_NAME core_export.h)
ecm_generate_headers(KF5BalooCore_CamelCase_HEADERS
HEADER_NAMES
Term
Query
QueryRunnable
Result
ResultIterator
SearchStore
File
FileFetchJob
FileMonitor
TagListJob
IndexerConfig
PREFIX baloo
REQUIRED_HEADERS KF5BalooCore_HEADERS
)
install(TARGETS KF5BalooCore EXPORT KF5BalooTargets ${KF5_INSTALL_TARGETS_DEFAULT_ARGS})
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/core_export.h
${KF5BalooCore_HEADERS}
DESTINATION ${KF5_INCLUDE_INSTALL_DIR}/Baloo/baloo
COMPONENT Devel
)
install(FILES
${KF5BalooCore_CamelCase_HEADERS}
DESTINATION ${KF5_INCLUDE_INSTALL_DIR}/Baloo/Baloo
COMPONENT Devel
)
add_subdirectory(tests)
add_subdirectory(autotests)
diff --git a/src/lib/autotests/CMakeLists.txt b/src/lib/autotests/CMakeLists.txt
index c867ab37..876a3c03 100644
--- a/src/lib/autotests/CMakeLists.txt
+++ b/src/lib/autotests/CMakeLists.txt
@@ -1,54 +1,78 @@
#
# Query Serialization
#
set(querySerialization_SRC queryserializationtest.cpp)
ecm_add_test(${querySerialization_SRC}
TEST_NAME "queryserializationtest"
LINK_LIBRARIES Qt5::Test KF5::BalooCore
)
#
# Advanced Query Parser
#
ecm_add_test(advancedqueryparsertest.cpp
TEST_NAME "advancedqueryparsertest"
LINK_LIBRARIES Qt5::Test KF5::BalooCore
)
#
# Fetch Job
#
set(filefetchjobtest_SRC filefetchjobtest.cpp
db.cpp
../filefetchjob.cpp
../filemapping.cpp
../file.cpp)
ecm_add_test(${filefetchjobtest_SRC}
TEST_NAME "filefetchjobtest"
LINK_LIBRARIES
KF5::FileMetaData
KF5::CoreAddons
KF5::ConfigCore
KF5::Solid
Qt5::Test
Qt5::Sql
Qt5::DBus
${XAPIAN_LIBRARIES}
KF5::BalooCore
)
# Pass CMAKE_CURRENT_BINARY_DIR so tests can use it to create some of the
# temporary files they need (as XattrDetector blacklists /tmp by default).
set_target_properties(filefetchjobtest PROPERTIES COMPILE_FLAGS -DBUILDDIR="\\"${CMAKE_CURRENT_BINARY_DIR}/\\""\ -DBALOO_FILE_EXPORT=)
#
# TagList Job
#
ecm_add_test(taglistjobtest.cpp
TEST_NAME "taglistjobtest"
LINK_LIBRARIES
Qt5::Test
KF5::BalooCore
)
+
+#
+# Search Store
+#
+set(filesearchstore_SRCS filesearchstoretest.cpp
+ ../filesearchstore.cpp
+ ../pathfilterpostingsource.cpp
+ ../wildcardpostingsource.cpp
+ ../filemapping.cpp
+ ../xapiansearchstore.cpp
+ ../../file/database.cpp
+)
+
+ecm_add_test(${filesearchstore_SRCS}
+ TEST_NAME "filesearchstoretest"
+ LINK_LIBRARIES
+ Qt5::Core
+ Qt5::Sql
+ Qt5::Test
+ ${XAPIAN_LIBRARIES}
+ KF5::FileMetaData
+ KF5::BalooCore
+ KF5::BalooXapian
+)
diff --git a/src/file/search/autotest/filesearchstoretest.cpp b/src/lib/autotests/filesearchstoretest.cpp
similarity index 99%
rename from src/file/search/autotest/filesearchstoretest.cpp
rename to src/lib/autotests/filesearchstoretest.cpp
index ac816077..c61b9c95 100644
--- a/src/file/search/autotest/filesearchstoretest.cpp
+++ b/src/lib/autotests/filesearchstoretest.cpp
@@ -1,537 +1,537 @@
/*
* This file is part of the KDE Baloo Project
* Copyright (C) 2013 Vishesh Handa <me@vhanda.in>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) version 3, or any
* later version accepted by the membership of KDE e.V. (or its
* successor approved by the membership of KDE e.V.), which shall
* act as a proxy defined in Section 6 of version 3 of the license.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "filesearchstoretest.h"
#include "filesearchstore.h"
-#include "../../database.h"
+#include "../../file/database.h"
#include "filemapping.h"
#include "query.h"
#include "term.h"
#include <QDebug>
#include <QtTest>
#include <xapian.h>
#include <kfilemetadata/properties.h>
#include <kfilemetadata/propertyinfo.h>
using namespace Baloo;
FileSearchStoreTest::FileSearchStoreTest(QObject* parent)
: QObject(parent)
, m_tempDir(0)
, m_db(0)
, m_store(0)
{
}
void FileSearchStoreTest::init()
{
cleanupTestCase();
m_db = new Database(this);
m_tempDir = new QTemporaryDir();
m_db->setPath(m_tempDir->path());
m_db->init();
m_store = new FileSearchStore(this);
m_store->setDbPath(m_tempDir->path());
}
void FileSearchStoreTest::initTestCase()
{
}
void FileSearchStoreTest::cleanupTestCase()
{
delete m_store;
m_store = 0;
delete m_db;
m_db = 0;
delete m_tempDir;
m_tempDir = 0;
}
uint FileSearchStoreTest::insertUrl(const QString& url)
{
FileMapping file(url);
file.create(m_db->sqlDatabase());
return file.id();
}
void FileSearchStoreTest::insertType(int id, const QString& type)
{
Xapian::Document doc;
doc.add_term(("T" + type.toLower()).toUtf8().constData());
std::string dir = m_tempDir->path().toUtf8().constData();
QScopedPointer<Xapian::WritableDatabase> wdb(new Xapian::WritableDatabase(dir,
Xapian::DB_CREATE_OR_OPEN));
wdb->replace_document(id, doc);
wdb->commit();
m_db->xapianDatabase()->db()->reopen();
}
void FileSearchStoreTest::insertExactText(int id, const QString& text, const QString& prefix)
{
Xapian::Document doc;
try {
doc = m_db->xapianDatabase()->db()->get_document(id);
}
catch (...) {
}
doc.add_term((prefix + text).toUtf8().constData());
std::string dir = m_tempDir->path().toUtf8().constData();
QScopedPointer<Xapian::WritableDatabase> wdb(new Xapian::WritableDatabase(dir,
Xapian::DB_CREATE_OR_OPEN));
wdb->replace_document(id, doc);
wdb->commit();
m_db->xapianDatabase()->db()->reopen();
}
void FileSearchStoreTest::insertText(int id, const QString& text)
{
Xapian::Document doc;
Xapian::TermGenerator termGen;
termGen.set_document(doc);
termGen.index_text(text.toUtf8().constData());
std::string dir = m_tempDir->path().toUtf8().constData();
QScopedPointer<Xapian::WritableDatabase> wdb(new Xapian::WritableDatabase(dir,
Xapian::DB_CREATE_OR_OPEN));
wdb->replace_document(id, doc);
wdb->commit();
m_db->xapianDatabase()->db()->reopen();
}
void FileSearchStoreTest::insertRating(int id, int rating)
{
Xapian::Document doc;
QString str = QLatin1Char('R') + QString::number(rating);
doc.add_term(str.toUtf8().constData());
std::string dir = m_tempDir->path().toUtf8().constData();
QScopedPointer<Xapian::WritableDatabase> wdb(new Xapian::WritableDatabase(dir,
Xapian::DB_CREATE_OR_OPEN));
wdb->replace_document(id, doc);
wdb->commit();
m_db->xapianDatabase()->db()->reopen();
}
void FileSearchStoreTest::testSimpleSearchString()
{
QString url1(QLatin1String("/home/t/a"));
uint id1 = insertUrl(url1);
insertText(id1, QLatin1String("This is sample text"));
QString url2(QLatin1String("/home/t/b"));
uint id2 = insertUrl(url2);
insertText(id2, QLatin1String("sample sample more sample text"));
Query q;
q.addType(QLatin1String("File"));
q.setSearchString(QLatin1String("Sample"));
int qid = m_store->exec(q);
QCOMPARE(qid, 1);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", id2));
QCOMPARE(m_store->url(qid), QUrl::fromLocalFile(url2));
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", id1));
QCOMPARE(m_store->url(qid), QUrl::fromLocalFile(url1));
QVERIFY(!m_store->next(qid));
QVERIFY(m_store->id(qid).isEmpty());
QVERIFY(m_store->url(qid).isEmpty());
m_store->close(qid);
}
void FileSearchStoreTest::testPropertyValueEqual()
{
QString url1(QLatin1String("/home/t/a"));
uint id1 = insertUrl(url1);
insertText(id1, QLatin1String("This is sample text"));
QString url2(QLatin1String("/home/t/b"));
uint id2 = insertUrl(url2);
insertText(id2, QLatin1String("sample sample more sample but not text"));
Query q;
q.setTerm(Term(QString(), "Sample text", Baloo::Term::Equal));
q.addType(QLatin1String("File"));
int qid = m_store->exec(q);
QCOMPARE(qid, 1);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", id1));
QCOMPARE(m_store->url(qid), QUrl::fromLocalFile(url1));
QVERIFY(!m_store->next(qid));
QVERIFY(m_store->id(qid).isEmpty());
QVERIFY(m_store->url(qid).isEmpty());
m_store->close(qid);
}
void FileSearchStoreTest::testIncludeDir()
{
QString url1(QLatin1String("/home/t/a"));
uint id1 = insertUrl(url1);
insertText(id1, QLatin1String("This is sample text"));
QString url2(QLatin1String("/home/t/b"));
uint id2 = insertUrl(url2);
insertText(id2, QLatin1String("sample sample more sample text"));
QString url3(QLatin1String("/home/garden/b"));
uint id3 = insertUrl(url3);
insertText(id3, QLatin1String("The grass is green in the garden."));
QString url4(QLatin1String("/home/tt/b"));
uint id4 = insertUrl(url4);
insertText(id4, QLatin1String("Let's see if this works."));
QString url5(QLatin1String("/home/t/c"));
uint id5 = insertUrl(url5);
insertText(id5, QLatin1String("sample sample more sample text"));
Query q;
q.addType(QLatin1String("File"));
q.addCustomOption(QLatin1String("includeFolder"), QVariant(QLatin1String("/home/t")));
int qid = m_store->exec(q);
QCOMPARE(qid, 1);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", id1));
QCOMPARE(m_store->url(qid), QUrl::fromLocalFile(url1));
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", id2));
QCOMPARE(m_store->url(qid), QUrl::fromLocalFile(url2));
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", id5));
QCOMPARE(m_store->url(qid), QUrl::fromLocalFile(url5));
QVERIFY(!m_store->next(qid));
QVERIFY(m_store->id(qid).isEmpty());
QVERIFY(m_store->url(qid).isEmpty());
m_store->close(qid);
}
void FileSearchStoreTest::testRatings()
{
QString url1(QLatin1String("/home/t/a"));
uint id1 = insertUrl(url1);
insertRating(id1, 2);
QString url2(QLatin1String("/home/t/b"));
uint id2 = insertUrl(url2);
insertRating(id2, 4);
QString url3(QLatin1String("/home/garden/b"));
uint id3 = insertUrl(url3);
insertRating(id3, 6);
QString url4(QLatin1String("/home/tt/b"));
uint id4 = insertUrl(url4);
insertRating(id4, 10);
QString url5(QLatin1String("/home/tt/c"));
uint id5 = insertUrl(url5);
insertText(id5, QLatin1String("Test text"));
//
// Less than 5
//
Query q;
q.addType(QLatin1String("File"));
q.setTerm(Term(QLatin1String("rating"), 5, Term::Less));
int qid1 = m_store->exec(q);
QCOMPARE(qid1, 1);
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id1));
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id2));
QVERIFY(!m_store->next(qid1));
//
// Greater than 6
//
q.setTerm(Term(QLatin1String("rating"), 6, Term::Greater));
int qid2 = m_store->exec(q);
QCOMPARE(qid2, 2);
QVERIFY(m_store->next(qid2));
QCOMPARE(m_store->id(qid2), serialize("file", id4));
QVERIFY(!m_store->next(qid2));
}
void FileSearchStoreTest::testEmptySearchString()
{
QString url1(QLatin1String("/home/t/a"));
uint id1 = insertUrl(url1);
insertText(id1, QLatin1String("File A"));
QString url2(QLatin1String("/home/t/b"));
uint id2 = insertUrl(url2);
insertText(id2, QLatin1String("File B"));
QString url3(QLatin1String("/home/garden/b"));
uint id3 = insertUrl(url3);
insertText(id3, QLatin1String("Garden B"));
QString url4(QLatin1String("/home/tt/b"));
uint id4 = insertUrl(url4);
insertText(id4, QLatin1String("TT B"));
QString url5(QLatin1String("/home/tt/c"));
uint id5 = insertUrl(url5);
insertText(id5, QLatin1String("TT C"));
Query q;
q.addType(QLatin1String("File"));
int qid1 = m_store->exec(q);
QCOMPARE(qid1, 1);
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id1));
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id2));
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id3));
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id4));
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id5));
QVERIFY(!m_store->next(qid1));
}
void FileSearchStoreTest::testAllVideos()
{
QString url1(QLatin1String("/home/t/a"));
uint id1 = insertUrl(url1);
insertType(id1, QLatin1String("Video"));
QString url2(QLatin1String("/home/t/b"));
uint id2 = insertUrl(url2);
insertType(id2, QLatin1String("Image"));
QString url3(QLatin1String("/home/garden/b"));
uint id3 = insertUrl(url3);
insertType(id3, QLatin1String("Video"));
Query q;
q.addType(QLatin1String("Video"));
int qid1 = m_store->exec(q);
QCOMPARE(qid1, 1);
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id1));
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id3));
QVERIFY(!m_store->next(qid1));
}
void FileSearchStoreTest::testFileNameSearch()
{
QString url1(QLatin1String("/home/t/a"));
uint id1 = insertUrl(url1);
insertExactText(id1, QLatin1String("flowering"), "F");
insertExactText(id1, QLatin1String("dork"), "F");
insertExactText(id1, QLatin1String("dork"), "A");
insertExactText(id1, QLatin1String("dork"), "G");
QString url2(QLatin1String("/home/t/b"));
uint id2 = insertUrl(url2);
insertExactText(id2, QLatin1String("powering"), "F");
insertExactText(id2, QLatin1String("fire"), "F");
insertExactText(id2, QLatin1String("dork"), "A");
insertExactText(id2, QLatin1String("dork"), "G");
QString url3(QLatin1String("/home/garden/b"));
uint id3 = insertUrl(url3);
insertExactText(id3, QLatin1String("does"), "F");
insertExactText(id3, QLatin1String("not"), "F");
insertExactText(id3, QLatin1String("dork"), "A");
insertExactText(id3, QLatin1String("dork"), "G");
Query q;
q.addType(QLatin1String("File"));
q.setTerm(Term("filename", "dork"));
int qid1 = m_store->exec(q);
QCOMPARE(qid1, 1);
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id1));
QVERIFY(!m_store->next(qid1));
q.setTerm(Term("filename", "do*"));
int qid2 = m_store->exec(q);
QCOMPARE(qid2, 2);
QVERIFY(m_store->next(qid2));
QCOMPARE(m_store->id(qid2), serialize("file", id1));
QVERIFY(m_store->next(qid2));
QCOMPARE(m_store->id(qid2), serialize("file", id3));
QVERIFY(!m_store->next(qid2));
q.setTerm(Term("filename", "*ing"));
int qid3 = m_store->exec(q);
QCOMPARE(qid3, 3);
QVERIFY(m_store->next(qid3));
QCOMPARE(m_store->id(qid3), serialize("file", id1));
QVERIFY(m_store->next(qid3));
QCOMPARE(m_store->id(qid3), serialize("file", id2));
QVERIFY(!m_store->next(qid3));
// Exact match
q.setTerm(Term("filename", "dork", Term::Equal));
int qid4 = m_store->exec(q);
QCOMPARE(qid4, 4);
QVERIFY(m_store->next(qid4));
QCOMPARE(m_store->id(qid4), serialize("file", id1));
QVERIFY(!m_store->next(qid4));
}
void FileSearchStoreTest::testSortingNone()
{
insertText(1, QLatin1String("Power A"));
insertText(2, QLatin1String("Power Power B"));
Query q;
q.addType(QLatin1String("File"));
q.setSearchString("Power");
int qid;
// Auto sort - Based on frequency
qid = m_store->exec(q);
QCOMPARE(qid, 1);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 2));
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 1));
QVERIFY(!m_store->next(qid));
// no sort
q.setSortingOption(Query::SortNone);
qid = m_store->exec(q);
QCOMPARE(qid, 2);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 1));
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 2));
QVERIFY(!m_store->next(qid));
}
void FileSearchStoreTest::testInvalidProperties()
{
Query q;
q.addType(QLatin1String("File"));
q.setTerm(Term("NoNExistingProperty", QVariant(1)));
int qid = m_store->exec(q);
QCOMPARE(qid, 0);
QVERIFY(!m_store->next(qid));
}
void FileSearchStoreTest::testModifiedProperty()
{
QDateTime dt(QDate(2013, 12, 02), QTime(12, 2, 2));
insertExactText(1, dt.toString(Qt::ISODate), "DT_M");
insertExactText(2, QDateTime::currentDateTime().toString(Qt::ISODate), "DT_M");
Query q;
q.addType(QLatin1String("File"));
q.setTerm(Term(("modified"), dt.date(), Term::Equal));
int qid = m_store->exec(q);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 1));
QVERIFY(!m_store->next(qid));
q.setTerm(Term(("modified"), dt, Term::Equal));
qid = m_store->exec(q);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 1));
QVERIFY(!m_store->next(qid));
}
void FileSearchStoreTest::testDateTimeProperty()
{
KFileMetaData::PropertyInfo propInfo(KFileMetaData::Property::CreationDate);
QString prefix = "X" + QString::number((int)propInfo.property());
QDateTime dt(QDate(2013, 12, 02), QTime(12, 2, 2));
insertExactText(1, dt.toString(Qt::ISODate), prefix);
insertExactText(2, QDateTime::currentDateTime().toString(Qt::ISODate), prefix);
Query q;
q.addType(QLatin1String("File"));
q.setTerm(Term(propInfo.name(), dt.date(), Term::Equal));
int qid = m_store->exec(q);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 1));
QVERIFY(!m_store->next(qid));
q.setTerm(Term((propInfo.name()), dt, Term::Equal));
qid = m_store->exec(q);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 1));
QVERIFY(!m_store->next(qid));
}
QTEST_MAIN(Baloo::FileSearchStoreTest)
diff --git a/src/file/search/autotest/filesearchstoretest.h b/src/lib/autotests/filesearchstoretest.h
similarity index 100%
rename from src/file/search/autotest/filesearchstoretest.h
rename to src/lib/autotests/filesearchstoretest.h
diff --git a/src/file/search/filesearchstore.cpp b/src/lib/filesearchstore.cpp
similarity index 100%
rename from src/file/search/filesearchstore.cpp
rename to src/lib/filesearchstore.cpp
diff --git a/src/file/search/filesearchstore.h b/src/lib/filesearchstore.h
similarity index 100%
rename from src/file/search/filesearchstore.h
rename to src/lib/filesearchstore.h
diff --git a/src/file/search/pathfilterpostingsource.cpp b/src/lib/pathfilterpostingsource.cpp
similarity index 100%
rename from src/file/search/pathfilterpostingsource.cpp
rename to src/lib/pathfilterpostingsource.cpp
diff --git a/src/file/search/pathfilterpostingsource.h b/src/lib/pathfilterpostingsource.h
similarity index 100%
rename from src/file/search/pathfilterpostingsource.h
rename to src/lib/pathfilterpostingsource.h
diff --git a/src/lib/query.cpp b/src/lib/query.cpp
index a09b47c5..25438e7a 100644
--- a/src/lib/query.cpp
+++ b/src/lib/query.cpp
@@ -1,400 +1,400 @@
/*
* This file is part of the KDE Baloo Project
* Copyright (C) 2013 Vishesh Handa <me@vhanda.in>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) version 3, or any
* later version accepted by the membership of KDE e.V. (or its
* successor approved by the membership of KDE e.V.), which shall
* act as a proxy defined in Section 6 of version 3 of the license.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "query.h"
#include "term.h"
-#include "searchstore.h"
+#include "filesearchstore.h"
#include <QString>
#include <QStringList>
#include <QSharedPointer>
#include <QList>
#include <QUrlQuery>
#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>
using namespace Baloo;
const int defaultLimit = 100000;
class Baloo::Query::Private {
public:
Private() {
m_limit = defaultLimit;
m_offset = 0;
m_yearFilter = -1;
m_monthFilter = -1;
m_dayFilter = -1;
m_sortingOption = SortAuto;
}
Term m_term;
QStringList m_types;
QString m_searchString;
uint m_limit;
uint m_offset;
int m_yearFilter;
int m_monthFilter;
int m_dayFilter;
SortingOption m_sortingOption;
QString m_sortingProperty;
QVariantMap m_customOptions;
};
Query::Query()
: d(new Private)
{
}
Query::Query(const Term& t)
: d(new Private)
{
d->m_term = t;
}
Query::Query(const Query& rhs)
: d(new Private(*rhs.d))
{
}
Query::~Query()
{
delete d;
}
void Query::setTerm(const Term& t)
{
d->m_term = t;
}
Term Query::term() const
{
return d->m_term;
}
void Query::addType(const QString& type)
{
d->m_types << type.split(QLatin1Char('/'), QString::SkipEmptyParts);
}
void Query::addTypes(const QStringList& typeList)
{
Q_FOREACH (const QString& type, typeList) {
addType(type);
}
}
void Query::setType(const QString& type)
{
d->m_types.clear();
addType(type);
}
void Query::setTypes(const QStringList& types)
{
d->m_types = types;
}
QStringList Query::types() const
{
return d->m_types;
}
QString Query::searchString() const
{
return d->m_searchString;
}
void Query::setSearchString(const QString& str)
{
d->m_searchString = str;
}
uint Query::limit() const
{
return d->m_limit;
}
void Query::setLimit(uint limit)
{
d->m_limit = limit;
}
uint Query::offset() const
{
return d->m_offset;
}
void Query::setOffset(uint offset)
{
d->m_offset = offset;
}
void Query::setDateFilter(int year, int month, int day)
{
d->m_yearFilter = year;
d->m_monthFilter = month;
d->m_dayFilter = day;
}
int Query::yearFilter() const
{
return d->m_yearFilter;
}
int Query::monthFilter() const
{
return d->m_monthFilter;
}
int Query::dayFilter() const
{
return d->m_dayFilter;
}
void Query::setSortingOption(Query::SortingOption option)
{
d->m_sortingOption = option;
}
Query::SortingOption Query::sortingOption() const
{
return d->m_sortingOption;
}
void Query::setSortingProperty(const QString& property)
{
d->m_sortingOption = SortProperty;
d->m_sortingProperty = property;
}
QString Query::sortingProperty() const
{
return d->m_sortingProperty;
}
void Query::addCustomOption(const QString& option, const QVariant& value)
{
d->m_customOptions.insert(option, value);
}
QVariant Query::customOption(const QString& option) const
{
return d->m_customOptions.value(option);
}
QVariantMap Query::customOptions() const
{
return d->m_customOptions;
}
void Query::removeCustomOption(const QString& option)
{
d->m_customOptions.remove(option);
}
Q_GLOBAL_STATIC_WITH_ARGS(SearchStore::List, s_searchStores, (SearchStore::searchStores()))
ResultIterator Query::exec()
{
// vHanda: Maybe this should default to allow searches on all search stores?
Q_ASSERT_X(!types().isEmpty(), "Baloo::Query::exec", "A query is being initialized without a type");
if (types().isEmpty())
return ResultIterator();
SearchStore* storeMatch = 0;
Q_FOREACH (QSharedPointer<SearchStore> store, *s_searchStores) {
bool matches = true;
Q_FOREACH (const QString& type, types()) {
if (!store->types().contains(type)) {
matches = false;
break;
}
}
if (matches) {
storeMatch = store.data();
break;
}
}
if (!storeMatch)
return ResultIterator();
int id = storeMatch->exec(*this);
return ResultIterator(id, storeMatch);
}
QByteArray Query::toJSON()
{
QVariantMap map;
if (!d->m_types.isEmpty())
map[QLatin1String("type")] = d->m_types;
if (d->m_limit != defaultLimit)
map[QLatin1String("limit")] = d->m_limit;
if (d->m_offset)
map[QLatin1String("offset")] = d->m_offset;
if (!d->m_searchString.isEmpty())
map[QLatin1String("searchString")] = d->m_searchString;
if (d->m_term.isValid())
map[QLatin1String("term")] = QVariant(d->m_term.toVariantMap());
if (d->m_yearFilter >= 0)
map[QLatin1String("yearFilter")] = d->m_yearFilter;
if (d->m_monthFilter >= 0)
map[QLatin1String("monthFilter")] = d->m_monthFilter;
if (d->m_dayFilter >= 0)
map[QLatin1String("dayFilter")] = d->m_dayFilter;
if (d->m_sortingOption != SortAuto)
map[QLatin1String("sortingOption")] = static_cast<int>(d->m_sortingOption);
if (!d->m_sortingProperty.isEmpty())
map[QLatin1String("sortingProperty")] = d->m_sortingProperty;
if (d->m_customOptions.size())
map[QLatin1String("customOptions")] = d->m_customOptions;
QJsonObject jo = QJsonObject::fromVariantMap(map);
QJsonDocument jdoc;
jdoc.setObject(jo);
return jdoc.toJson();
}
// static
Query Query::fromJSON(const QByteArray& arr)
{
QJsonDocument jdoc = QJsonDocument::fromJson(arr);
const QVariantMap map = jdoc.object().toVariantMap();
Query query;
query.d->m_types = map[QLatin1String("type")].toStringList();
if (map.contains(QLatin1String("limit")))
query.d->m_limit = map[QLatin1String("limit")].toUInt();
else
query.d->m_limit = defaultLimit;
query.d->m_offset = map[QLatin1String("offset")].toUInt();
query.d->m_searchString = map[QLatin1String("searchString")].toString();
query.d->m_term = Term::fromVariantMap(map[QLatin1String("term")].toMap());
if (map.contains(QLatin1String("yearFilter")))
query.d->m_yearFilter = map[QLatin1String("yearFilter")].toInt();
if (map.contains(QLatin1String("monthFilter")))
query.d->m_monthFilter = map[QLatin1String("monthFilter")].toInt();
if (map.contains(QLatin1String("dayFilter")))
query.d->m_dayFilter = map[QLatin1String("dayFilter")].toInt();
if (map.contains(QLatin1String("sortingOption"))) {
int option = map.value("sortingOption").toInt();
query.d->m_sortingOption = static_cast<SortingOption>(option);
}
if (map.contains(QLatin1String("sortingProperty"))) {
query.d->m_sortingProperty = map.value("sortingProperty").toString();
}
if (map.contains(QLatin1String("customOptions"))) {
QVariant var = map[QLatin1String("customOptions")];
if (var.type() == QVariant::Map) {
query.d->m_customOptions = map[QLatin1String("customOptions")].toMap();
}
else if (var.type() == QVariant::Hash) {
QVariantHash hash = var.toHash();
QHash<QString, QVariant>::const_iterator it = hash.constBegin();
for (; it != hash.constEnd(); ++it)
query.d->m_customOptions.insert(it.key(), it.value());
}
}
return query;
}
QUrl Query::toSearchUrl(const QString& title)
{
QUrl url;
url.setScheme(QLatin1String("baloosearch"));
QUrlQuery urlQuery;
urlQuery.addQueryItem(QLatin1String("json"), QString::fromUtf8(toJSON()));
if (title.size())
urlQuery.addQueryItem(QLatin1String("title"), title);
url.setQuery(urlQuery);
return url;
}
Query Query::fromSearchUrl(const QUrl& url)
{
if (url.scheme() != QLatin1String("baloosearch"))
return Query();
QUrlQuery urlQuery(url);
QString jsonString = urlQuery.queryItemValue(QLatin1String("json"), QUrl::FullyDecoded);
return Query::fromJSON(jsonString.toUtf8());
}
QString Query::titleFromQueryUrl(const QUrl& url)
{
QUrlQuery urlQuery(url);
return urlQuery.queryItemValue(QLatin1String("title"), QUrl::FullyDecoded);
}
bool Query::operator==(const Query& rhs) const
{
if (rhs.d->m_limit != d->m_limit || rhs.d->m_offset != d->m_offset ||
rhs.d->m_dayFilter != d->m_dayFilter || rhs.d->m_monthFilter != d->m_monthFilter ||
rhs.d->m_yearFilter != d->m_yearFilter || rhs.d->m_customOptions != d->m_customOptions ||
rhs.d->m_searchString != d->m_searchString || rhs.d->m_sortingProperty != d->m_sortingProperty ||
rhs.d->m_sortingOption != d->m_sortingOption)
{
return false;
}
if (rhs.d->m_types.size() != d->m_types.size())
return false;
Q_FOREACH (const QString& type, rhs.d->m_types) {
if (!d->m_types.contains(type))
return false;
}
return d->m_term == rhs.d->m_term;
}
Query& Query::operator=(const Query& rhs)
{
*d = *rhs.d;
return *this;
}
diff --git a/src/lib/searchstore.cpp b/src/lib/searchstore.cpp
index 61cea38e..ac0aa768 100644
--- a/src/lib/searchstore.cpp
+++ b/src/lib/searchstore.cpp
@@ -1,140 +1,94 @@
/*
* This file is part of the KDE Baloo Project
* Copyright (C) 2013 Vishesh Handa <me@vhanda.in>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) version 3, or any
* later version accepted by the membership of KDE e.V. (or its
* successor approved by the membership of KDE e.V.), which shall
* act as a proxy defined in Section 6 of version 3 of the license.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "searchstore.h"
+#include "filesearchstore.h"
#include <QDebug>
#include <QThreadStorage>
#include <QMutex>
#include <QSharedPointer>
#include <QCoreApplication>
-#include <QPluginLoader>
#include <QDir>
using namespace Baloo;
SearchStore::SearchStore(QObject* parent)
: QObject(parent)
{
}
SearchStore::~SearchStore()
{
}
QUrl SearchStore::url(int)
{
return QUrl();
}
QString SearchStore::icon(int)
{
return QString();
}
QString SearchStore::text(int)
{
return QString();
}
QString SearchStore::property(int, const QString&)
{
return QString();
}
Q_GLOBAL_STATIC(SearchStore::List, s_overrideSearchStores)
void SearchStore::overrideSearchStores(const QList<SearchStore*> &overrideSearchStores)
{
List* list = &(*s_overrideSearchStores);
list->clear();
Q_FOREACH (SearchStore* store, overrideSearchStores) {
list->append(QSharedPointer<SearchStore>(store));
}
}
//
// Search Stores
//
// static
SearchStore::List SearchStore::searchStores()
{
static QMutex mutex;
QMutexLocker lock(&mutex);
if (s_overrideSearchStores && !s_overrideSearchStores->isEmpty()) {
qDebug() << "Overriding search stores.";
return *s_overrideSearchStores;
}
- // Get all the plugins
- QStringList plugins;
- QStringList pluginPaths;
-
- QStringList paths = QCoreApplication::libraryPaths();
- Q_FOREACH (const QString& libraryPath, paths) {
- QString path(libraryPath + QStringLiteral("/kf5/baloo"));
- QDir dir(path);
-
- if (!dir.exists()) {
- continue;
- }
-
- QStringList entryList = dir.entryList(QDir::Files | QDir::NoDotAndDotDot);
- Q_FOREACH (const QString& fileName, entryList) {
- if (plugins.contains(fileName))
- continue;
-
- plugins << fileName;
- pluginPaths << dir.absoluteFilePath(fileName);
- }
- }
- plugins.clear();
-
SearchStore::List stores;
- Q_FOREACH (const QString& pluginPath, pluginPaths) {
- QPluginLoader loader(pluginPath);
-
- if (!loader.load()) {
- qWarning() << "Could not create Baloo Search Store: " << pluginPath;
- qWarning() << loader.errorString();
- continue;
- }
-
- QObject* obj = loader.instance();
- if (obj) {
- SearchStore* ex = qobject_cast<SearchStore*>(obj);
- if (ex) {
- stores << QSharedPointer<SearchStore>(ex);
- } else {
- qDebug() << "Plugin could not be converted to an Baloo::SearchStore";
- qDebug() << pluginPath;
- }
- }
- else {
- qDebug() << "Plugin could not create instance" << pluginPath;
- }
- }
+ stores << QSharedPointer<SearchStore>(new FileSearchStore());
return stores;
}
diff --git a/src/file/search/wildcardpostingsource.cpp b/src/lib/wildcardpostingsource.cpp
similarity index 100%
rename from src/file/search/wildcardpostingsource.cpp
rename to src/lib/wildcardpostingsource.cpp
diff --git a/src/file/search/wildcardpostingsource.h b/src/lib/wildcardpostingsource.h
similarity index 100%
rename from src/file/search/wildcardpostingsource.h
rename to src/lib/wildcardpostingsource.h
diff --git a/src/xapian/xapiansearchstore.cpp b/src/lib/xapiansearchstore.cpp
similarity index 100%
rename from src/xapian/xapiansearchstore.cpp
rename to src/lib/xapiansearchstore.cpp
diff --git a/src/xapian/xapiansearchstore.h b/src/lib/xapiansearchstore.h
similarity index 97%
rename from src/xapian/xapiansearchstore.h
rename to src/lib/xapiansearchstore.h
index 9f92a836..4939b602 100644
--- a/src/xapian/xapiansearchstore.h
+++ b/src/lib/xapiansearchstore.h
@@ -1,131 +1,130 @@
/*
* This file is part of the KDE Baloo Project
* Copyright (C) 2013 Vishesh Handa <me@vhanda.in>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) version 3, or any
* later version accepted by the membership of KDE e.V. (or its
* successor approved by the membership of KDE e.V.), which shall
* act as a proxy defined in Section 6 of version 3 of the license.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef BALOO_XAPIANSEARCHSTORE_H
#define BALOO_XAPIANSEARCHSTORE_H
#include "searchstore.h"
#include "term.h"
-#include "xapian_export.h"
#include <xapian.h>
#include <QMutex>
namespace Baloo {
/**
* Implements a search store using Xapian
*/
-class BALOO_XAPIAN_EXPORT XapianSearchStore : public SearchStore
+class XapianSearchStore : public SearchStore
{
public:
explicit XapianSearchStore(QObject* parent = 0);
virtual ~XapianSearchStore();
virtual int exec(const Query& query);
virtual void close(int queryId);
virtual bool next(int queryId);
virtual QByteArray id(int queryId);
virtual QUrl url(int queryId);
/**
* Set the path of the xapian database
*/
virtual void setDbPath(const QString& path);
virtual QString dbPath();
protected:
/**
* The derived class should implement the logic for constructing the appropriate
* Xapian::Query class from the given values.
*/
virtual Xapian::Query constructQuery(const QString& property,
const QVariant& value,
Term::Comparator com) = 0;
virtual Xapian::Query constructFilterQuery(int year, int month, int day);
/**
* Apply any final touches to the query
*/
virtual Xapian::Query finalizeQuery(const Xapian::Query& query);
/**
* Create a query for any custom options.
*/
virtual Xapian::Query applyCustomOptions(const Xapian::Query& q, const QVariantMap& options);
/**
* Returns the url for the document with id \p docid.
*/
virtual QUrl constructUrl(const Xapian::docid& docid) = 0;
/**
* Gives a list of types which have been provided with the query.
* This must return the appropriate query which will be ANDed with
* the final query
*/
virtual Xapian::Query convertTypes(const QStringList& types) = 0;
/**
* The prefix that should be used when converting an integer
* id to a byte array
*/
virtual QByteArray idPrefix() = 0;
Xapian::Document docForQuery(int queryId);
/**
* Convenience function to AND two Xapian queries together.
*/
Xapian::Query andQuery(const Xapian::Query& a, const Xapian::Query& b);
Xapian::Database* xapianDb();
protected:
QMutex m_mutex;
private:
Xapian::Query toXapianQuery(const Term& term);
Xapian::Query toXapianQuery(Xapian::Query::op op, const QList<Term>& terms);
Xapian::Query constructSearchQuery(const QString& str);
struct Result {
Xapian::MSet mset;
Xapian::MSetIterator it;
uint lastId;
QUrl lastUrl;
};
QHash<int, Result> m_queryMap;
int m_nextId;
QString m_dbPath;
Xapian::Database* m_db;
};
}
#endif // BALOO_XAPIANSEARCHSTORE_H
diff --git a/src/xapian/CMakeLists.txt b/src/xapian/CMakeLists.txt
index 33e5ca97..dcb23ea3 100644
--- a/src/xapian/CMakeLists.txt
+++ b/src/xapian/CMakeLists.txt
@@ -1,31 +1,29 @@
kde_enable_exceptions()
set(XAPIAN_SRCS
- xapiansearchstore.cpp
xapiandocument.cpp
xapiandatabase.cpp
xapiantermgenerator.cpp
xapianqueryparser.cpp
)
add_library(KF5BalooXapian ${XAPIAN_SRCS})
add_library(KF5::BalooXapian ALIAS KF5BalooXapian)
target_link_libraries(KF5BalooXapian PUBLIC
Qt5::Core
${XAPIAN_LIBRARIES}
- KF5::BalooCore
)
set_target_properties(KF5BalooXapian PROPERTIES
VERSION ${BALOO_VERSION_STRING}
SOVERSION ${BALOO_SOVERSION}
EXPORT_NAME BalooXapian
)
generate_export_header(KF5BalooXapian BASE_NAME BALOO_XAPIAN EXPORT_FILE_NAME xapian_export.h)
install(TARGETS KF5BalooXapian EXPORT KF5BalooTargets ${KF5_INSTALL_TARGETS_DEFAULT_ARGS})
add_subdirectory(autotests)
add_subdirectory(tests)
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Mon, Apr 6, 12:49 AM (5 d, 14 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18831752
Default Alt Text
(45 KB)
Attached To
Mode
rKB baloo
Attached
Detach File
Event Timeline