mirror of https://github.com/kiwix/libkiwix.git
Merge pull request #974 from kiwix/multipleCategories
This commit is contained in:
commit
09476ededb
|
@ -105,6 +105,12 @@ class Filter {
|
||||||
Filter& acceptTags(const Tags& tags);
|
Filter& acceptTags(const Tags& tags);
|
||||||
Filter& rejectTags(const Tags& tags);
|
Filter& rejectTags(const Tags& tags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the filter to only accept books in the specified category.
|
||||||
|
*
|
||||||
|
* Multiple categories can be specified as a comma-separated list (in
|
||||||
|
* which case a book in any of those categories will match).
|
||||||
|
*/
|
||||||
Filter& category(std::string category);
|
Filter& category(std::string category);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -549,25 +549,30 @@ Xapian::Query nameQuery(const std::string& name)
|
||||||
return Xapian::Query("XN" + normalizeText(name));
|
return Xapian::Query("XN" + normalizeText(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
Xapian::Query categoryQuery(const std::string& category)
|
Xapian::Query multipleParamQuery(const std::string& commaSeparatedList, const std::string& prefix)
|
||||||
{
|
{
|
||||||
return Xapian::Query("XC" + normalizeText(category));
|
Xapian::Query q;
|
||||||
|
bool firstIteration = true;
|
||||||
|
for ( const auto& elem : kiwix::split(commaSeparatedList, ",") ) {
|
||||||
|
const Xapian::Query singleQuery(prefix + normalizeText(elem));
|
||||||
|
if ( firstIteration ) {
|
||||||
|
q = singleQuery;
|
||||||
|
firstIteration = false;
|
||||||
|
} else {
|
||||||
|
q = Xapian::Query(Xapian::Query::OP_OR, q, singleQuery);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return q;
|
||||||
|
}
|
||||||
|
|
||||||
|
Xapian::Query categoryQuery(const std::string& commaSeparatedCategoryList)
|
||||||
|
{
|
||||||
|
return multipleParamQuery(commaSeparatedCategoryList, "XC");
|
||||||
}
|
}
|
||||||
|
|
||||||
Xapian::Query langQuery(const std::string& commaSeparatedLanguageList)
|
Xapian::Query langQuery(const std::string& commaSeparatedLanguageList)
|
||||||
{
|
{
|
||||||
Xapian::Query q;
|
return multipleParamQuery(commaSeparatedLanguageList, "L");
|
||||||
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)
|
Xapian::Query publisherQuery(const std::string& publisher)
|
||||||
|
|
|
@ -300,6 +300,8 @@ TEST_F(LibraryServerTest, catalog_search_by_tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(LibraryServerTest, catalog_search_by_category)
|
TEST_F(LibraryServerTest, catalog_search_by_category)
|
||||||
|
{
|
||||||
|
|
||||||
{
|
{
|
||||||
const auto r = zfs1_->GET("/ROOT%23%3F/catalog/search?category=jazz");
|
const auto r = zfs1_->GET("/ROOT%23%3F/catalog/search?category=jazz");
|
||||||
EXPECT_EQ(r->status, 200);
|
EXPECT_EQ(r->status, 200);
|
||||||
|
@ -317,6 +319,25 @@ TEST_F(LibraryServerTest, catalog_search_by_category)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const auto r = zfs1_->GET("/ROOT%23%3F/catalog/search?category=jazz,wikipedia");
|
||||||
|
EXPECT_EQ(r->status, 200);
|
||||||
|
EXPECT_EQ(maskVariableOPDSFeedData(r->body),
|
||||||
|
OPDS_FEED_TAG
|
||||||
|
" <id>12345678-90ab-cdef-1234-567890abcdef</id>\n"
|
||||||
|
" <title>Filtered zims (category=jazz%2Cwikipedia)</title>\n"
|
||||||
|
" <updated>YYYY-MM-DDThh:mm:ssZ</updated>\n"
|
||||||
|
" <totalResults>2</totalResults>\n"
|
||||||
|
" <startIndex>0</startIndex>\n"
|
||||||
|
" <itemsPerPage>2</itemsPerPage>\n"
|
||||||
|
CATALOG_LINK_TAGS
|
||||||
|
RAY_CHARLES_CATALOG_ENTRY
|
||||||
|
CHARLES_RAY_CATALOG_ENTRY
|
||||||
|
"</feed>\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(LibraryServerTest, catalog_search_by_language)
|
TEST_F(LibraryServerTest, catalog_search_by_language)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
@ -793,6 +814,40 @@ TEST_F(LibraryServerTest, catalog_v2_entries_filtered_by_language)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(LibraryServerTest, catalog_v2_entries_filtered_by_category)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
const auto r = zfs1_->GET("/ROOT%23%3F/catalog/v2/entries?category=jazz");
|
||||||
|
EXPECT_EQ(r->status, 200);
|
||||||
|
EXPECT_EQ(maskVariableOPDSFeedData(r->body),
|
||||||
|
CATALOG_V2_ENTRIES_PREAMBLE("?category=jazz")
|
||||||
|
" <title>Filtered Entries (category=jazz)</title>\n"
|
||||||
|
" <updated>YYYY-MM-DDThh:mm:ssZ</updated>\n"
|
||||||
|
" <totalResults>1</totalResults>\n"
|
||||||
|
" <startIndex>0</startIndex>\n"
|
||||||
|
" <itemsPerPage>1</itemsPerPage>\n"
|
||||||
|
CHARLES_RAY_CATALOG_ENTRY
|
||||||
|
"</feed>\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const auto r = zfs1_->GET("/ROOT%23%3F/catalog/v2/entries?category=jazz,wikipedia");
|
||||||
|
EXPECT_EQ(r->status, 200);
|
||||||
|
EXPECT_EQ(maskVariableOPDSFeedData(r->body),
|
||||||
|
CATALOG_V2_ENTRIES_PREAMBLE("?category=jazz%2Cwikipedia")
|
||||||
|
" <title>Filtered Entries (category=jazz%2Cwikipedia)</title>\n"
|
||||||
|
" <updated>YYYY-MM-DDThh:mm:ssZ</updated>\n"
|
||||||
|
" <totalResults>2</totalResults>\n"
|
||||||
|
" <startIndex>0</startIndex>\n"
|
||||||
|
" <itemsPerPage>2</itemsPerPage>\n"
|
||||||
|
RAY_CHARLES_CATALOG_ENTRY
|
||||||
|
CHARLES_RAY_CATALOG_ENTRY
|
||||||
|
"</feed>\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(LibraryServerTest, catalog_v2_entries_multiple_filters)
|
TEST_F(LibraryServerTest, catalog_v2_entries_multiple_filters)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue