diff --git a/include/library.h b/include/library.h index 89514590b..f44b31ee1 100644 --- a/include/library.h +++ b/include/library.h @@ -71,6 +71,7 @@ class Filter { std::string _query; bool _queryIsPartial; std::string _name; + std::string _flavour; public: // functions Filter(); @@ -130,6 +131,7 @@ class Filter { Filter& maxSize(size_t size); Filter& query(std::string query, bool partial=true); Filter& name(std::string name); + Filter& flavour(std::string flavour); Filter& clearLang(); Filter& clearCategory(); @@ -152,6 +154,9 @@ class Filter { bool hasCreator() const; const std::string& getCreator() const { return _creator; } + bool hasFlavour() const; + const std::string& getFlavour() const { return _flavour; } + const Tags& getAcceptTags() const { return _acceptTags; } const Tags& getRejectTags() const { return _rejectTags; } diff --git a/src/library.cpp b/src/library.cpp index a62d4dac6..bc16dc184 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -437,6 +437,7 @@ void Library::updateBookDB(const Book& book) indexer.index_text(normalizeText(book.getCreator()), 1, "A"); indexer.index_text(normalizeText(book.getPublisher()), 1, "XP"); doc.add_term("XN"+normalizeText(book.getName())); + indexer.index_text(normalizeText(book.getFlavour()), 1, "XF"); indexer.index_text(normalizeText(book.getCategory()), 1, "XC"); for ( const auto& tag : split(normalizeText(book.getTags()), ";") ) { @@ -477,6 +478,7 @@ Xapian::Query buildXapianQueryFromFilterQuery(const Filter& filter) queryParser.add_prefix("title", "S"); queryParser.add_prefix("description", "XD"); queryParser.add_prefix("name", "XN"); + queryParser.add_prefix("flavour", "XF"); queryParser.add_prefix("category", "XC"); queryParser.add_prefix("lang", "L"); queryParser.add_prefix("publisher", "XP"); @@ -503,6 +505,12 @@ Xapian::Query nameQuery(const std::string& name) return Xapian::Query("XN" + normalizeText(name)); } +Xapian::Query flavourQuery(const std::string& name) +{ + return Xapian::Query("XF" + normalizeText(name)); +} + + Xapian::Query multipleParamQuery(const std::string& commaSeparatedList, const std::string& prefix) { Xapian::Query q; @@ -570,6 +578,9 @@ Xapian::Query buildXapianQuery(const Filter& filter) if ( filter.hasName() ) { q = Xapian::Query(Xapian::Query::OP_AND, q, nameQuery(filter.getName())); } + if ( filter.hasFlavour() ) { + q = Xapian::Query(Xapian::Query::OP_AND, q, flavourQuery(filter.getFlavour())); + } if ( filter.hasCategory() ) { q = Xapian::Query(Xapian::Query::OP_AND, q, categoryQuery(filter.getCategory())); } @@ -735,6 +746,7 @@ enum filterTypes { QUERY = FLAG(12), NAME = FLAG(13), CATEGORY = FLAG(14), + FLAVOUR = FLAG(15), }; Filter& Filter::local(bool accept) @@ -836,6 +848,13 @@ Filter& Filter::name(std::string name) activeFilters |= NAME; return *this; } + +Filter& Filter::flavour(std::string flavour) +{ + _flavour = flavour; + activeFilters |= FLAVOUR; + return *this; +} Filter& Filter::clearLang() { @@ -881,6 +900,12 @@ bool Filter::hasCreator() const return ACTIVE(_CREATOR); } +bool Filter::hasFlavour() const +{ + return ACTIVE(FLAVOUR); +} + + bool Filter::accept(const Book& book) const { auto local = !book.getPath().empty(); diff --git a/test/library.cpp b/test/library.cpp index f75a4dae9..734351216 100644 --- a/test/library.cpp +++ b/test/library.cpp @@ -570,6 +570,25 @@ TEST_F(LibraryTest, filterByLanguage) ); } +TEST_F(LibraryTest, filterByFlavour) +{ + EXPECT_FILTER_RESULTS(kiwix::Filter().flavour("full"), + "Géographie par Wikipédia", + "Tania Louis", + "Wikiquote" + ); + + EXPECT_FILTER_RESULTS(kiwix::Filter().query("flavour:full"), + "Géographie par Wikipédia", + "Tania Louis", + "Wikiquote" + ); + + EXPECT_FILTER_RESULTS(kiwix::Filter().query("full"), + /* no results */ + ); +} + TEST_F(LibraryTest, filterByTags) { EXPECT_FILTER_RESULTS(kiwix::Filter().acceptTags({"stackexchange"}),