diff --git a/include/library.h b/include/library.h index 856a3a9e..fa8f2426 100644 --- a/include/library.h +++ b/include/library.h @@ -106,7 +106,15 @@ class Filter { Filter& rejectTags(const Tags& tags); Filter& category(std::string category); + + /** + * Set the filter to only accept books in the specified language. + * + * Multiple languages can be specified as a comma-separated list (in + * which case a book in any of those languages will match). + */ Filter& lang(std::string lang); + Filter& publisher(std::string publisher); Filter& creator(std::string creator); Filter& maxSize(size_t size); diff --git a/src/library.cpp b/src/library.cpp index 508d7c8e..fb9fc035 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -535,9 +535,20 @@ Xapian::Query categoryQuery(const std::string& category) return Xapian::Query("XC" + normalizeText(category)); } -Xapian::Query langQuery(const std::string& lang) +Xapian::Query langQuery(const std::string& commaSeparatedLanguageList) { - return Xapian::Query("L" + normalizeText(lang)); + Xapian::Query q; + bool firstIteration = true; + for ( const auto& lang : kiwix::split(commaSeparatedLanguageList, ",") ) { + const Xapian::Query singleLangQuery("L" + normalizeText(lang)); + if ( firstIteration ) { + q = singleLangQuery; + firstIteration = false; + } else { + q = Xapian::Query(Xapian::Query::OP_OR, q, singleLangQuery); + } + } + return q; } Xapian::Query publisherQuery(const std::string& publisher) diff --git a/test/library_server.cpp b/test/library_server.cpp index e5e330d6..ee20b954 100644 --- a/test/library_server.cpp +++ b/test/library_server.cpp @@ -344,10 +344,12 @@ TEST_F(LibraryServerTest, catalog_search_by_language) " 12345678-90ab-cdef-1234-567890abcdef\n" " Filtered zims (lang=eng,fra)\n" " YYYY-MM-DDThh:mm:ssZ\n" - " 0\n" + " 2\n" " 0\n" - " 0\n" + " 2\n" CATALOG_LINK_TAGS + RAY_CHARLES_CATALOG_ENTRY + CHARLES_RAY_CATALOG_ENTRY "\n" ); } @@ -727,9 +729,11 @@ TEST_F(LibraryServerTest, catalog_v2_entries_filtered_by_language) CATALOG_V2_ENTRIES_PREAMBLE("?lang=eng,fra") " Filtered Entries (lang=eng,fra)\n" " YYYY-MM-DDThh:mm:ssZ\n" - " 0\n" + " 2\n" " 0\n" - " 0\n" + " 2\n" + RAY_CHARLES_CATALOG_ENTRY + CHARLES_RAY_CATALOG_ENTRY "\n" ); }