diff --git a/src/library.cpp b/src/library.cpp index fb9fc035b..632b86e3a 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -373,12 +373,28 @@ std::vector Library::getBookPropValueSet(BookStrPropMemFn p) const std::vector Library::getBooksLanguages() const { - return getBookPropValueSet(&Book::getLanguage); + std::vector langs; + for ( const auto& langAndCount : getBooksLanguagesWithCounts() ) { + langs.push_back(langAndCount.first); + } + return langs; } Library::AttributeCounts Library::getBooksLanguagesWithCounts() const { - return getBookAttributeCounts(&Book::getLanguage); + std::lock_guard lock(m_mutex); + AttributeCounts langsWithCounts; + + for (const auto& pair: mp_impl->m_books) { + const auto& book = pair.second; + if (book.getOrigId().empty()) { + const std::string commaSeparatedLangList = book.getLanguage(); + for ( const auto& lang : kiwix::split(commaSeparatedLangList, ",") ) { + ++langsWithCounts[lang]; + } + } + } + return langsWithCounts; } std::vector Library::getBooksCategories() const diff --git a/test/data/library.xml b/test/data/library.xml index d1b15118a..1f569f09e 100644 --- a/test/data/library.xml +++ b/test/data/library.xml @@ -23,7 +23,7 @@ url="https://github.com/kiwix/libkiwix/raw/master/test/data/zimfile.zim" title="Ray (uncategorized) Charles" description="No category is assigned to this library entry." - language="rus" + language="rus,eng" creator="Wikipedia" publisher="Kiwix" date="2020-03-31" diff --git a/test/library.cpp b/test/library.cpp index 60762cb51..f0100db19 100644 --- a/test/library.cpp +++ b/test/library.cpp @@ -69,7 +69,7 @@ const char * sampleOpdsStream = R"( urn:uuid:0ea1cde6-441d-6c58-f2c7-21c2838e659f /meta?name=favicon&content=wikiquote_fr_all_nopic_2019-06 2019-06-05T00:00::00:Z - fra + fra,ita Une page de Wikiquote, le recueil des citations libres. category_defined_via_category_element_only wikiquote;nopic @@ -199,7 +199,7 @@ const char sampleLibraryXML[] = R"( url="https://github.com/kiwix/libkiwix/raw/master/test/data/zimfile.zim" title="Ray Charles" description="Wikipedia articles about Ray Charles" - language="eng" + language="eng,spa" creator="Wikipedia" publisher="Kiwix" date="2020-03-31" @@ -344,7 +344,7 @@ TEST_F(LibraryTest, sanityCheck) { EXPECT_EQ(lib.getBookCount(true, true), 12U); EXPECT_EQ(lib.getBooksLanguages(), - std::vector({"deu", "eng", "fra"}) + std::vector({"deu", "eng", "fra", "ita", "spa"}) ); EXPECT_EQ(lib.getBooksCreators(), std::vector({ "Islam Stack Exchange", diff --git a/test/library_server.cpp b/test/library_server.cpp index 723d0c60c..d5270a200 100644 --- a/test/library_server.cpp +++ b/test/library_server.cpp @@ -140,7 +140,7 @@ std::string maskVariableOPDSFeedData(std::string s) "raycharles_uncategorized",\ "Ray (uncategorized) Charles",\ "No category is assigned to this library entry.",\ - "rus",\ + "rus,eng",\ "wikipedia_ru_ray_charles",\ "",\ "public_tag_with_a_value:value_of_a_public_tag;_private_tag_with_a_value:value_of_a_private_tag;wikipedia;_pictures:no;_videos:no;_details:no",\ @@ -327,10 +327,11 @@ TEST_F(LibraryServerTest, catalog_search_by_language) " 12345678-90ab-cdef-1234-567890abcdef\n" " Filtered zims (lang=eng)\n" " YYYY-MM-DDThh:mm:ssZ\n" - " 1\n" + " 2\n" " 0\n" - " 1\n" + " 2\n" CATALOG_LINK_TAGS + UNCATEGORIZED_RAY_CHARLES_CATALOG_ENTRY RAY_CHARLES_CATALOG_ENTRY "\n" ); @@ -344,12 +345,13 @@ TEST_F(LibraryServerTest, catalog_search_by_language) " 12345678-90ab-cdef-1234-567890abcdef\n" " Filtered zims (lang=eng%2Cfra)\n" " YYYY-MM-DDThh:mm:ssZ\n" - " 2\n" + " 3\n" " 0\n" - " 2\n" + " 3\n" CATALOG_LINK_TAGS - RAY_CHARLES_CATALOG_ENTRY CHARLES_RAY_CATALOG_ENTRY + UNCATEGORIZED_RAY_CHARLES_CATALOG_ENTRY + RAY_CHARLES_CATALOG_ENTRY "\n" ); } @@ -582,7 +584,7 @@ TEST_F(LibraryServerTest, catalog_v2_languages) English eng - 1 + 2 @@ -764,9 +766,10 @@ TEST_F(LibraryServerTest, catalog_v2_entries_filtered_by_language) CATALOG_V2_ENTRIES_PREAMBLE("?lang=eng") " Filtered Entries (lang=eng)\n" " YYYY-MM-DDThh:mm:ssZ\n" - " 1\n" + " 2\n" " 0\n" - " 1\n" + " 2\n" + UNCATEGORIZED_RAY_CHARLES_CATALOG_ENTRY RAY_CHARLES_CATALOG_ENTRY "\n" ); @@ -779,11 +782,12 @@ TEST_F(LibraryServerTest, catalog_v2_entries_filtered_by_language) CATALOG_V2_ENTRIES_PREAMBLE("?lang=eng%2Cfra") " Filtered Entries (lang=eng%2Cfra)\n" " YYYY-MM-DDThh:mm:ssZ\n" - " 2\n" + " 3\n" " 0\n" - " 2\n" - RAY_CHARLES_CATALOG_ENTRY + " 3\n" CHARLES_RAY_CATALOG_ENTRY + UNCATEGORIZED_RAY_CHARLES_CATALOG_ENTRY + RAY_CHARLES_CATALOG_ENTRY "\n" ); } @@ -874,8 +878,8 @@ TEST_F(LibraryServerTest, catalog_search_includes_public_tags) // prefix search works on tag names EXPECT_SEARCH_RESULTS("public_tag", 2, - RAY_CHARLES_CATALOG_ENTRY UNCATEGORIZED_RAY_CHARLES_CATALOG_ENTRY + RAY_CHARLES_CATALOG_ENTRY ); EXPECT_SEARCH_RESULTS("value_of_a_public_tag",