From c938101c70c25906c582d94db7d50f8db2447f9c Mon Sep 17 00:00:00 2001
From: Nikhil Tanwar <2002nikhiltanwar@gmail.com>
Date: Sun, 23 Jul 2023 18:57:42 +0530
Subject: [PATCH 1/2] Allow multiple category support
Created a generic function multipleQuery which takes:
1. string (representing a comma separated list)
2. param (the value to query on using Xapian).
Category and language query will use this function.
---
include/library.h | 6 ++++++
src/library.cpp | 33 +++++++++++++++++++--------------
2 files changed, 25 insertions(+), 14 deletions(-)
diff --git a/include/library.h b/include/library.h
index 3fefa140e..602cfb9fd 100644
--- a/include/library.h
+++ b/include/library.h
@@ -105,6 +105,12 @@ class Filter {
Filter& acceptTags(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);
/**
diff --git a/src/library.cpp b/src/library.cpp
index 4ce865b7f..6ee51602f 100644
--- a/src/library.cpp
+++ b/src/library.cpp
@@ -549,25 +549,30 @@ Xapian::Query nameQuery(const std::string& 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 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;
+ return multipleParamQuery(commaSeparatedLanguageList, "L");
}
Xapian::Query publisherQuery(const std::string& publisher)
From d47c4fa72f94dd360be8cc2259cbf227fb4d9dff Mon Sep 17 00:00:00 2001
From: Nikhil Tanwar <2002nikhiltanwar@gmail.com>
Date: Sun, 23 Jul 2023 19:54:07 +0530
Subject: [PATCH 2/2] Unit tests for OPDS filtering by category
Added tests for multiple category filtering for zims
Added new test: catalog_v2_entries_filtered_by_category for entry filtering by category.
---
test/library_server.cpp | 83 ++++++++++++++++++++++++++++++++++-------
1 file changed, 69 insertions(+), 14 deletions(-)
diff --git a/test/library_server.cpp b/test/library_server.cpp
index 2274ccf4c..c9c34e367 100644
--- a/test/library_server.cpp
+++ b/test/library_server.cpp
@@ -301,20 +301,41 @@ TEST_F(LibraryServerTest, catalog_search_by_tag)
TEST_F(LibraryServerTest, catalog_search_by_category)
{
- const auto r = zfs1_->GET("/ROOT%23%3F/catalog/search?category=jazz");
- EXPECT_EQ(r->status, 200);
- EXPECT_EQ(maskVariableOPDSFeedData(r->body),
- OPDS_FEED_TAG
- "