mirror of
https://github.com/kiwix/libkiwix.git
synced 2025-09-22 11:45:45 -04:00
Merge pull request #674 from kiwix/deprecated
This commit is contained in:
commit
715151d725
@ -24,6 +24,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
namespace pugi {
|
namespace pugi {
|
||||||
class xml_node;
|
class xml_node;
|
||||||
@ -68,7 +69,7 @@ class Book
|
|||||||
~Book();
|
~Book();
|
||||||
|
|
||||||
bool update(const Book& other);
|
bool update(const Book& other);
|
||||||
void update(const Reader& reader);
|
DEPRECATED void update(const Reader& reader);
|
||||||
void update(const zim::Archive& archive);
|
void update(const zim::Archive& archive);
|
||||||
void updateFromXml(const pugi::xml_node& node, const std::string& baseDir);
|
void updateFromXml(const pugi::xml_node& node, const std::string& baseDir);
|
||||||
void updateFromOpds(const pugi::xml_node& node, const std::string& urlHost);
|
void updateFromOpds(const pugi::xml_node& node, const std::string& urlHost);
|
||||||
@ -95,9 +96,9 @@ class Book
|
|||||||
const uint64_t& getArticleCount() const { return m_articleCount; }
|
const uint64_t& getArticleCount() const { return m_articleCount; }
|
||||||
const uint64_t& getMediaCount() const { return m_mediaCount; }
|
const uint64_t& getMediaCount() const { return m_mediaCount; }
|
||||||
const uint64_t& getSize() const { return m_size; }
|
const uint64_t& getSize() const { return m_size; }
|
||||||
const std::string& getFavicon() const;
|
DEPRECATED const std::string& getFavicon() const;
|
||||||
const std::string& getFaviconUrl() const;
|
DEPRECATED const std::string& getFaviconUrl() const;
|
||||||
const std::string& getFaviconMimeType() const;
|
DEPRECATED const std::string& getFaviconMimeType() const;
|
||||||
|
|
||||||
Illustrations getIllustrations() const;
|
Illustrations getIllustrations() const;
|
||||||
std::shared_ptr<const Illustration> getIllustration(unsigned int size) const;
|
std::shared_ptr<const Illustration> getIllustration(unsigned int size) const;
|
||||||
|
@ -47,7 +47,7 @@ class Entry
|
|||||||
*
|
*
|
||||||
* @param article a zim::Article object
|
* @param article a zim::Article object
|
||||||
*/
|
*/
|
||||||
Entry(zim::Entry entry);
|
DEPRECATED Entry(zim::Entry entry) : Entry(entry, true) {};
|
||||||
virtual ~Entry() = default;
|
virtual ~Entry() = default;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -176,6 +176,16 @@ class Entry
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
zim::Entry entry;
|
zim::Entry entry;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Entry is deprecated, so we've marked the constructor as deprecated.
|
||||||
|
// But we still need to construct the entry (in our deprecated code)
|
||||||
|
// To avoid warning because we use deprecated function, we create a second
|
||||||
|
// constructor not deprecated. The `bool marker` is unused, it sole purpose
|
||||||
|
// is to change the signature to have two different constructor.
|
||||||
|
// This one is not deprecated and we must use it in our private code.
|
||||||
|
Entry(zim::Entry entry, bool marker);
|
||||||
|
friend class Reader;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -240,7 +240,7 @@ class Library : private LibraryBase
|
|||||||
|
|
||||||
Book getBookByIdThreadSafe(const std::string& id) const;
|
Book getBookByIdThreadSafe(const std::string& id) const;
|
||||||
|
|
||||||
std::shared_ptr<Reader> getReaderById(const std::string& id);
|
DEPRECATED std::shared_ptr<Reader> getReaderById(const std::string& id);
|
||||||
std::shared_ptr<zim::Archive> getArchiveById(const std::string& id);
|
std::shared_ptr<zim::Archive> getArchiveById(const std::string& id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -325,17 +325,6 @@ class Library : private LibraryBase
|
|||||||
*/
|
*/
|
||||||
BookIdCollection getBooksIds() const;
|
BookIdCollection getBooksIds() const;
|
||||||
|
|
||||||
/**
|
|
||||||
* Filter the library and generate a new one with the keep elements.
|
|
||||||
*
|
|
||||||
* This is equivalent to `listBookIds(ALL, UNSORTED, search)`.
|
|
||||||
*
|
|
||||||
* @param search List only books with search in the title or description.
|
|
||||||
* @return The list of bookIds corresponding to the query.
|
|
||||||
*/
|
|
||||||
DEPRECATED BookIdCollection filter(const std::string& search) const;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filter the library and return the id of the keep elements.
|
* Filter the library and return the id of the keep elements.
|
||||||
*
|
*
|
||||||
@ -354,38 +343,6 @@ class Library : private LibraryBase
|
|||||||
*/
|
*/
|
||||||
void sort(BookIdCollection& bookIds, supportedListSortBy sortBy, bool ascending) const;
|
void sort(BookIdCollection& bookIds, supportedListSortBy sortBy, bool ascending) const;
|
||||||
|
|
||||||
/**
|
|
||||||
* List books in the library.
|
|
||||||
*
|
|
||||||
* @param mode The mode of listing :
|
|
||||||
* - LOCAL : list only local books (with a path).
|
|
||||||
* - REMOTE : list only remote books (with an url).
|
|
||||||
* - VALID : list only valid books (without a path or with a
|
|
||||||
* path pointing to a valid zim file).
|
|
||||||
* - NOLOCAL : list only books without valid path.
|
|
||||||
* - NOREMOTE : list only books without url.
|
|
||||||
* - NOVALID : list only books not valid.
|
|
||||||
* - ALL : Do not do any filter (LOCAL or REMOTE)
|
|
||||||
* - Flags can be combined.
|
|
||||||
* @param sortBy Attribute to sort by the book list.
|
|
||||||
* @param search List only books with search in the title, description.
|
|
||||||
* @param language List only books in this language.
|
|
||||||
* @param creator List only books of this creator.
|
|
||||||
* @param publisher List only books of this publisher.
|
|
||||||
* @param maxSize Do not list book bigger than maxSize.
|
|
||||||
* Set to 0 to cancel this filter.
|
|
||||||
* @return The list of bookIds corresponding to the query.
|
|
||||||
*/
|
|
||||||
DEPRECATED BookIdCollection listBooksIds(
|
|
||||||
int supportedListMode = ALL,
|
|
||||||
supportedListSortBy sortBy = UNSORTED,
|
|
||||||
const std::string& search = "",
|
|
||||||
const std::string& language = "",
|
|
||||||
const std::string& creator = "",
|
|
||||||
const std::string& publisher = "",
|
|
||||||
const std::vector<std::string>& tags = {},
|
|
||||||
size_t maxSize = 0) const;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the current revision of the library.
|
* Return the current revision of the library.
|
||||||
*
|
*
|
||||||
|
@ -42,7 +42,6 @@ namespace kiwix
|
|||||||
class SuggestionItem
|
class SuggestionItem
|
||||||
{
|
{
|
||||||
// Functions
|
// Functions
|
||||||
// Temporarily making the constructor public until the code move is complete
|
|
||||||
public:
|
public:
|
||||||
// Create a sugggestion item.
|
// Create a sugggestion item.
|
||||||
explicit SuggestionItem(const std::string& title, const std::string& normalizedTitle,
|
explicit SuggestionItem(const std::string& title, const std::string& normalizedTitle,
|
||||||
@ -66,13 +65,13 @@ class SuggestionItem
|
|||||||
std::string normalizedTitle;
|
std::string normalizedTitle;
|
||||||
std::string path;
|
std::string path;
|
||||||
std::string snippet;
|
std::string snippet;
|
||||||
|
|
||||||
friend class Reader;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Reader class is the class who allow to get an entry content from a zim
|
* The Reader class is the class who allow to get an entry content from a zim
|
||||||
* file.
|
* file.
|
||||||
|
*
|
||||||
|
* Reader is now deprecated. Directly use `zim::Archive`.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using SuggestionsList_t = std::vector<SuggestionItem>;
|
using SuggestionsList_t = std::vector<SuggestionItem>;
|
||||||
@ -88,17 +87,17 @@ class Reader
|
|||||||
* unsplitted path as if the file were not splitted
|
* unsplitted path as if the file were not splitted
|
||||||
* (.zim extesion).
|
* (.zim extesion).
|
||||||
*/
|
*/
|
||||||
explicit Reader(const string zimFilePath);
|
explicit DEPRECATED Reader(const string zimFilePath);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a Reader to read a zim file given by the Archive.
|
* Create a Reader to read a zim file given by the Archive.
|
||||||
*
|
*
|
||||||
* @param archive The shared pointer to the Archive object.
|
* @param archive The shared pointer to the Archive object.
|
||||||
*/
|
*/
|
||||||
explicit Reader(const std::shared_ptr<zim::Archive> archive);
|
explicit DEPRECATED Reader(const std::shared_ptr<zim::Archive> archive);
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
explicit Reader(int fd);
|
explicit DEPRECATED Reader(int fd);
|
||||||
Reader(int fd, zim::offset_type offset, zim::size_type size);
|
DEPRECATED Reader(int fd, zim::offset_type offset, zim::size_type size);
|
||||||
#endif
|
#endif
|
||||||
~Reader() = default;
|
~Reader() = default;
|
||||||
|
|
||||||
@ -330,28 +329,6 @@ class Reader
|
|||||||
*/
|
*/
|
||||||
Entry getEntryFromTitle(const std::string& title) const;
|
Entry getEntryFromTitle(const std::string& title) const;
|
||||||
|
|
||||||
/**
|
|
||||||
* Search for entries with title starting with prefix (case sensitive).
|
|
||||||
*
|
|
||||||
* Suggestions are stored in an internal vector and can be retrieved using
|
|
||||||
* `getNextSuggestion` method.
|
|
||||||
* This method is not thread safe and is deprecated. Use :
|
|
||||||
* bool searchSuggestions(const string& prefix,
|
|
||||||
* unsigned int suggestionsCount,
|
|
||||||
* SuggestionsList_t& results);
|
|
||||||
*
|
|
||||||
* @param prefix The prefix to search.
|
|
||||||
* @param suggestionsCount How many suggestions to search for.
|
|
||||||
* @param reset If true, remove previous suggestions in the internal vector.
|
|
||||||
* If false, add suggestions to the internal vector
|
|
||||||
* (until internal vector size is suggestionCount (or no more
|
|
||||||
* suggestion))
|
|
||||||
* @return True if some suggestions have been added to the internal vector.
|
|
||||||
*/
|
|
||||||
DEPRECATED bool searchSuggestions(const string& prefix,
|
|
||||||
unsigned int suggestionsCount,
|
|
||||||
const bool reset = true);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Search for entries with title starting with prefix (case sensitive).
|
* Search for entries with title starting with prefix (case sensitive).
|
||||||
*
|
*
|
||||||
@ -367,28 +344,6 @@ class Reader
|
|||||||
unsigned int suggestionsCount,
|
unsigned int suggestionsCount,
|
||||||
SuggestionsList_t& resuls);
|
SuggestionsList_t& resuls);
|
||||||
|
|
||||||
/**
|
|
||||||
* Search for entries for the given prefix.
|
|
||||||
*
|
|
||||||
* If the zim file has a internal fulltext index, the suggestions will be
|
|
||||||
* searched using it.
|
|
||||||
* Else the suggestions will be search using `searchSuggestions` while trying
|
|
||||||
* to be smart about case sensitivity (using `getTitleVariants`).
|
|
||||||
*
|
|
||||||
* In any case, suggestions are stored in an internal vector and can be
|
|
||||||
* retrieved using `getNextSuggestion` method.
|
|
||||||
* The internal vector will be reset.
|
|
||||||
* This method is not thread safe and is deprecated. Use :
|
|
||||||
* bool searchSuggestionsSmart(const string& prefix,
|
|
||||||
* unsigned int suggestionsCount,
|
|
||||||
* SuggestionsList_t& results);
|
|
||||||
*
|
|
||||||
* @param prefix The prefix to search for.
|
|
||||||
* @param suggestionsCount How many suggestions to search for.
|
|
||||||
*/
|
|
||||||
DEPRECATED bool searchSuggestionsSmart(const string& prefix,
|
|
||||||
unsigned int suggestionsCount);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Search for entries for the given prefix.
|
* Search for entries for the given prefix.
|
||||||
*
|
*
|
||||||
@ -435,22 +390,6 @@ class Reader
|
|||||||
*/
|
*/
|
||||||
std::vector<std::string> getTitleVariants(const std::string& title) const;
|
std::vector<std::string> getTitleVariants(const std::string& title) const;
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the next suggestion title.
|
|
||||||
*
|
|
||||||
* @param[out] title the title of the suggestion.
|
|
||||||
* @return True if title has been set.
|
|
||||||
*/
|
|
||||||
DEPRECATED bool getNextSuggestion(string& title);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the next suggestion title and url.
|
|
||||||
*
|
|
||||||
* @param[out] title the title of the suggestion.
|
|
||||||
* @param[out] url the url of the suggestion.
|
|
||||||
* @return True if title and url have been set.
|
|
||||||
*/
|
|
||||||
DEPRECATED bool getNextSuggestion(string& title, string& url);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get if we can check zim file integrity (has a checksum).
|
* Get if we can check zim file integrity (has a checksum).
|
||||||
@ -486,9 +425,6 @@ class Reader
|
|||||||
std::shared_ptr<zim::Archive> zimArchive;
|
std::shared_ptr<zim::Archive> zimArchive;
|
||||||
std::string zimFilePath;
|
std::string zimFilePath;
|
||||||
|
|
||||||
SuggestionsList_t suggestions;
|
|
||||||
SuggestionsList_t::iterator suggestionsOffset;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::map<const std::string, unsigned int> parseCounterMetadata() const;
|
std::map<const std::string, unsigned int> parseCounterMetadata() const;
|
||||||
};
|
};
|
||||||
|
@ -35,12 +35,24 @@ class SearchRenderer
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* The default constructor.
|
* Construct a SearchRenderer from a Searcher.
|
||||||
*
|
*
|
||||||
* @param humanReadableName The global zim's humanReadableName.
|
* This method is now deprecated. Construct the renderer from a
|
||||||
* Used to generate pagination links.
|
* `zim::SearchResultSet`
|
||||||
|
*
|
||||||
|
* @param searcher The `Searcher` to render.
|
||||||
|
* @param mapper The `NameMapper` to use to do the rendering.
|
||||||
|
*/
|
||||||
|
DEPRECATED SearchRenderer(Searcher* searcher, NameMapper* mapper);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a SearchRenderer from a SearchResultSet.
|
||||||
|
*
|
||||||
|
* @param srs The `SearchResultSet` to render.
|
||||||
|
* @param mapper The `NameMapper` to use to do the rendering.
|
||||||
|
* @param start The start offset used for the srs.
|
||||||
|
* @param estimatedResultCount The estimatedResultCount of the whole search
|
||||||
*/
|
*/
|
||||||
SearchRenderer(Searcher* searcher, NameMapper* mapper);
|
|
||||||
SearchRenderer(zim::SearchResultSet srs, NameMapper* mapper,
|
SearchRenderer(zim::SearchResultSet srs, NameMapper* mapper,
|
||||||
unsigned int start, unsigned int estimatedResultCount);
|
unsigned int start, unsigned int estimatedResultCount);
|
||||||
|
|
||||||
|
@ -56,6 +56,8 @@ struct SuggestionInternal;
|
|||||||
/**
|
/**
|
||||||
* The Searcher class is reponsible to do different kind of search using the
|
* The Searcher class is reponsible to do different kind of search using the
|
||||||
* fulltext index.
|
* fulltext index.
|
||||||
|
*
|
||||||
|
* The Searcher is now deprecated. Use libzim search feature.
|
||||||
*/
|
*/
|
||||||
class Searcher
|
class Searcher
|
||||||
{
|
{
|
||||||
@ -63,7 +65,7 @@ class Searcher
|
|||||||
/**
|
/**
|
||||||
* The default constructor.
|
* The default constructor.
|
||||||
*/
|
*/
|
||||||
Searcher();
|
DEPRECATED Searcher();
|
||||||
|
|
||||||
~Searcher();
|
~Searcher();
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
namespace kiwix
|
namespace kiwix
|
||||||
{
|
{
|
||||||
|
|
||||||
Entry::Entry(zim::Entry entry)
|
Entry::Entry(zim::Entry entry, bool _marker)
|
||||||
: entry(entry)
|
: entry(entry)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -53,7 +53,7 @@ Entry Entry::getRedirectEntry() const
|
|||||||
throw NoEntry();
|
throw NoEntry();
|
||||||
}
|
}
|
||||||
|
|
||||||
return entry.getRedirectEntry();
|
return Entry(entry.getRedirectEntry(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
Entry Entry::getFinalEntry() const
|
Entry Entry::getFinalEntry() const
|
||||||
@ -67,7 +67,7 @@ Entry Entry::getFinalEntry() const
|
|||||||
if (final_entry.isRedirect()) {
|
if (final_entry.isRedirect()) {
|
||||||
throw NoEntry();
|
throw NoEntry();
|
||||||
}
|
}
|
||||||
return final_entry;
|
return Entry(final_entry, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -366,15 +366,6 @@ Library::BookIdCollection Library::getBooksIds() const
|
|||||||
return bookIds;
|
return bookIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
Library::BookIdCollection Library::filter(const std::string& search) const
|
|
||||||
{
|
|
||||||
if (search.empty()) {
|
|
||||||
return getBooksIds();
|
|
||||||
}
|
|
||||||
|
|
||||||
return filter(Filter().query(search));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Library::updateBookDB(const Book& book)
|
void Library::updateBookDB(const Book& book)
|
||||||
{
|
{
|
||||||
@ -658,48 +649,6 @@ void Library::sort(BookIdCollection& bookIds, supportedListSortBy sort, bool asc
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Library::BookIdCollection Library::listBooksIds(
|
|
||||||
int mode,
|
|
||||||
supportedListSortBy sortBy,
|
|
||||||
const std::string& search,
|
|
||||||
const std::string& language,
|
|
||||||
const std::string& creator,
|
|
||||||
const std::string& publisher,
|
|
||||||
const std::vector<std::string>& tags,
|
|
||||||
size_t maxSize) const {
|
|
||||||
|
|
||||||
Filter _filter;
|
|
||||||
if (mode & LOCAL)
|
|
||||||
_filter.local(true);
|
|
||||||
if (mode & NOLOCAL)
|
|
||||||
_filter.local(false);
|
|
||||||
if (mode & VALID)
|
|
||||||
_filter.valid(true);
|
|
||||||
if (mode & NOVALID)
|
|
||||||
_filter.valid(false);
|
|
||||||
if (mode & REMOTE)
|
|
||||||
_filter.remote(true);
|
|
||||||
if (mode & NOREMOTE)
|
|
||||||
_filter.remote(false);
|
|
||||||
if (!tags.empty())
|
|
||||||
_filter.acceptTags(tags);
|
|
||||||
if (maxSize != 0)
|
|
||||||
_filter.maxSize(maxSize);
|
|
||||||
if (!language.empty())
|
|
||||||
_filter.lang(language);
|
|
||||||
if (!publisher.empty())
|
|
||||||
_filter.publisher(publisher);
|
|
||||||
if (!creator.empty())
|
|
||||||
_filter.creator(creator);
|
|
||||||
if (!search.empty())
|
|
||||||
_filter.query(search);
|
|
||||||
|
|
||||||
auto bookIds = filter(_filter);
|
|
||||||
|
|
||||||
sort(bookIds, sortBy, true);
|
|
||||||
return bookIds;
|
|
||||||
}
|
|
||||||
|
|
||||||
Filter::Filter()
|
Filter::Filter()
|
||||||
: activeFilters(0),
|
: activeFilters(0),
|
||||||
_maxSize(0)
|
_maxSize(0)
|
||||||
|
@ -60,10 +60,13 @@ void LibXMLDumper::handleBook(Book book, pugi::xml_node root_node) {
|
|||||||
ADD_ATTR_NOT_EMPTY(entry_node, "name", book.getName());
|
ADD_ATTR_NOT_EMPTY(entry_node, "name", book.getName());
|
||||||
ADD_ATTR_NOT_EMPTY(entry_node, "flavour", book.getFlavour());
|
ADD_ATTR_NOT_EMPTY(entry_node, "flavour", book.getFlavour());
|
||||||
ADD_ATTR_NOT_EMPTY(entry_node, "tags", book.getTags());
|
ADD_ATTR_NOT_EMPTY(entry_node, "tags", book.getTags());
|
||||||
ADD_ATTR_NOT_EMPTY(entry_node, "faviconMimeType", book.getFaviconMimeType());
|
try {
|
||||||
ADD_ATTR_NOT_EMPTY(entry_node, "faviconUrl", book.getFaviconUrl());
|
auto defaultIllustration = book.getIllustration(48);
|
||||||
if (!book.getFavicon().empty())
|
ADD_ATTR_NOT_EMPTY(entry_node, "faviconMimeType", defaultIllustration->mimeType);
|
||||||
ADD_ATTRIBUTE(entry_node, "favicon", base64_encode(book.getFavicon()));
|
ADD_ATTR_NOT_EMPTY(entry_node, "faviconUrl", defaultIllustration->url);
|
||||||
|
if (!defaultIllustration->getData().empty())
|
||||||
|
ADD_ATTRIBUTE(entry_node, "favicon", base64_encode(defaultIllustration->getData()));
|
||||||
|
} catch(...) {}
|
||||||
} else {
|
} else {
|
||||||
ADD_ATTRIBUTE(entry_node, "origId", book.getOrigId());
|
ADD_ATTRIBUTE(entry_node, "origId", book.getOrigId());
|
||||||
}
|
}
|
||||||
|
@ -122,7 +122,7 @@ string Reader::getId() const
|
|||||||
Entry Reader::getRandomPage() const
|
Entry Reader::getRandomPage() const
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
return zimArchive->getRandomEntry();
|
return Entry(zimArchive->getRandomEntry(), true);
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
throw NoEntry();
|
throw NoEntry();
|
||||||
}
|
}
|
||||||
@ -130,7 +130,7 @@ Entry Reader::getRandomPage() const
|
|||||||
|
|
||||||
Entry Reader::getMainPage() const
|
Entry Reader::getMainPage() const
|
||||||
{
|
{
|
||||||
return zimArchive->getMainEntry();
|
return Entry(zimArchive->getMainEntry(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Reader::getFavicon(string& content, string& mimeType) const
|
bool Reader::getFavicon(string& content, string& mimeType) const
|
||||||
@ -242,7 +242,7 @@ string Reader::getScraper() const
|
|||||||
Entry Reader::getEntryFromPath(const std::string& path) const
|
Entry Reader::getEntryFromPath(const std::string& path) const
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
return kiwix::getEntryFromPath(*zimArchive, path);
|
return Entry(kiwix::getEntryFromPath(*zimArchive, path), true);
|
||||||
} catch (zim::EntryNotFound& e) {
|
} catch (zim::EntryNotFound& e) {
|
||||||
throw NoEntry();
|
throw NoEntry();
|
||||||
}
|
}
|
||||||
@ -256,7 +256,7 @@ Entry Reader::getEntryFromEncodedPath(const std::string& path) const
|
|||||||
Entry Reader::getEntryFromTitle(const std::string& title) const
|
Entry Reader::getEntryFromTitle(const std::string& title) const
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
return zimArchive->getEntryByTitle(title);
|
return Entry(zimArchive->getEntryByTitle(title), true);
|
||||||
} catch(zim::EntryNotFound& e) {
|
} catch(zim::EntryNotFound& e) {
|
||||||
throw NoEntry();
|
throw NoEntry();
|
||||||
}
|
}
|
||||||
@ -273,32 +273,6 @@ bool Reader::hasFulltextIndex() const
|
|||||||
return zimArchive->hasFulltextIndex();
|
return zimArchive->hasFulltextIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Search titles by prefix */
|
|
||||||
|
|
||||||
bool Reader::searchSuggestions(const string& prefix,
|
|
||||||
unsigned int suggestionsCount,
|
|
||||||
const bool reset)
|
|
||||||
{
|
|
||||||
/* Reset the suggestions otherwise check if the suggestions number is less
|
|
||||||
* than the suggestionsCount */
|
|
||||||
if (reset) {
|
|
||||||
this->suggestions.clear();
|
|
||||||
this->suggestionsOffset = this->suggestions.begin();
|
|
||||||
} else {
|
|
||||||
if (this->suggestions.size() > suggestionsCount) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
auto ret = searchSuggestions(prefix, suggestionsCount, this->suggestions);
|
|
||||||
|
|
||||||
/* Set the cursor to the begining */
|
|
||||||
this->suggestionsOffset = this->suggestions.begin();
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Reader::searchSuggestions(const string& prefix,
|
bool Reader::searchSuggestions(const string& prefix,
|
||||||
unsigned int suggestionsCount,
|
unsigned int suggestionsCount,
|
||||||
SuggestionsList_t& results)
|
SuggestionsList_t& results)
|
||||||
@ -359,19 +333,6 @@ std::vector<std::string> Reader::getTitleVariants(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Reader::searchSuggestionsSmart(const string& prefix,
|
|
||||||
unsigned int suggestionsCount)
|
|
||||||
{
|
|
||||||
this->suggestions.clear();
|
|
||||||
this->suggestionsOffset = this->suggestions.begin();
|
|
||||||
|
|
||||||
auto ret = searchSuggestionsSmart(prefix, suggestionsCount, this->suggestions);
|
|
||||||
|
|
||||||
this->suggestionsOffset = this->suggestions.begin();
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Try also a few variations of the prefix to have better results */
|
/* Try also a few variations of the prefix to have better results */
|
||||||
bool Reader::searchSuggestionsSmart(const string& prefix,
|
bool Reader::searchSuggestionsSmart(const string& prefix,
|
||||||
unsigned int suggestionsCount,
|
unsigned int suggestionsCount,
|
||||||
@ -410,38 +371,6 @@ bool Reader::searchSuggestionsSmart(const string& prefix,
|
|||||||
return results.size() > 0;
|
return results.size() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get next suggestion */
|
|
||||||
bool Reader::getNextSuggestion(string& title)
|
|
||||||
{
|
|
||||||
if (this->suggestionsOffset != this->suggestions.end()) {
|
|
||||||
/* title */
|
|
||||||
title = (*(this->suggestionsOffset)).getTitle();
|
|
||||||
|
|
||||||
/* increment the cursor for the next call */
|
|
||||||
this->suggestionsOffset++;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Reader::getNextSuggestion(string& title, string& url)
|
|
||||||
{
|
|
||||||
if (this->suggestionsOffset != this->suggestions.end()) {
|
|
||||||
/* title */
|
|
||||||
title = (*(this->suggestionsOffset)).getTitle();
|
|
||||||
url = (*(this->suggestionsOffset)).getPath();
|
|
||||||
|
|
||||||
/* increment the cursor for the next call */
|
|
||||||
this->suggestionsOffset++;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if the file has as checksum */
|
/* Check if the file has as checksum */
|
||||||
bool Reader::canCheckIntegrity() const
|
bool Reader::canCheckIntegrity() const
|
||||||
{
|
{
|
||||||
|
@ -52,9 +52,10 @@ TEST(BookTest, updateFromXMLTest)
|
|||||||
EXPECT_EQ(book.getArticleCount(), 123456U);
|
EXPECT_EQ(book.getArticleCount(), 123456U);
|
||||||
EXPECT_EQ(book.getMediaCount(), 234567U);
|
EXPECT_EQ(book.getMediaCount(), 234567U);
|
||||||
EXPECT_EQ(book.getSize(), 345678U*1024U);
|
EXPECT_EQ(book.getSize(), 345678U*1024U);
|
||||||
EXPECT_EQ(book.getFavicon(), "fake-book-favicon-data");
|
auto defaultIllustration = book.getIllustration(48);
|
||||||
EXPECT_EQ(book.getFaviconMimeType(), "text/plain");
|
EXPECT_EQ(defaultIllustration->getData(), "fake-book-favicon-data");
|
||||||
EXPECT_EQ(book.getFaviconUrl(), "http://who.org/zara.fav");
|
EXPECT_EQ(defaultIllustration->mimeType, "text/plain");
|
||||||
|
EXPECT_EQ(defaultIllustration->url, "http://who.org/zara.fav");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(BookTest, updateFromXMLCategoryHandlingTest)
|
TEST(BookTest, updateFromXMLCategoryHandlingTest)
|
||||||
@ -175,8 +176,10 @@ TEST(BookTest, updateTest)
|
|||||||
EXPECT_EQ(newBook.getTags(), book.getTags());
|
EXPECT_EQ(newBook.getTags(), book.getTags());
|
||||||
EXPECT_EQ(newBook.getCategory(), book.getCategory());
|
EXPECT_EQ(newBook.getCategory(), book.getCategory());
|
||||||
EXPECT_EQ(newBook.getName(), book.getName());
|
EXPECT_EQ(newBook.getName(), book.getName());
|
||||||
EXPECT_EQ(newBook.getFavicon(), book.getFavicon());
|
auto defaultIllustration = book.getIllustration(48);
|
||||||
EXPECT_EQ(newBook.getFaviconMimeType(), book.getFaviconMimeType());
|
auto newDefaultIllustration = newBook.getIllustration(48);
|
||||||
|
EXPECT_EQ(newDefaultIllustration->getData(), defaultIllustration->getData());
|
||||||
|
EXPECT_EQ(newDefaultIllustration->mimeType, defaultIllustration->mimeType);
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
|
@ -684,9 +684,9 @@ TEST_F(LibraryTest, removeBookByIdRemovesTheBook)
|
|||||||
|
|
||||||
TEST_F(LibraryTest, removeBookByIdDropsTheReader)
|
TEST_F(LibraryTest, removeBookByIdDropsTheReader)
|
||||||
{
|
{
|
||||||
EXPECT_NE(nullptr, lib.getReaderById("raycharles"));
|
EXPECT_NE(nullptr, lib.getArchiveById("raycharles"));
|
||||||
lib.removeBookById("raycharles");
|
lib.removeBookById("raycharles");
|
||||||
EXPECT_THROW(lib.getReaderById("raycharles"), std::out_of_range);
|
EXPECT_THROW(lib.getArchiveById("raycharles"), std::out_of_range);
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST_F(LibraryTest, removeBookByIdUpdatesTheSearchDB)
|
TEST_F(LibraryTest, removeBookByIdUpdatesTheSearchDB)
|
||||||
|
@ -9,9 +9,7 @@ tests = [
|
|||||||
'book',
|
'book',
|
||||||
'manager',
|
'manager',
|
||||||
'name_mapper',
|
'name_mapper',
|
||||||
'opds_catalog',
|
'opds_catalog'
|
||||||
'reader',
|
|
||||||
'searcher'
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if build_machine.system() != 'windows'
|
if build_machine.system() != 'windows'
|
||||||
|
@ -1,62 +0,0 @@
|
|||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
#include "../include/reader.h"
|
|
||||||
#include "zim/archive.h"
|
|
||||||
|
|
||||||
namespace kiwix
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* This test file is written primarily to demonstrate how Reader is simply a
|
|
||||||
* wrapper over an archive. We will be dropping this wrapper soon.
|
|
||||||
**/
|
|
||||||
TEST (Reader, archiveWrapper) {
|
|
||||||
Reader reader("./test/zimfile.zim");
|
|
||||||
zim::Archive archive = *reader.getZimArchive();
|
|
||||||
|
|
||||||
std::ostringstream s;
|
|
||||||
s << archive.getUuid();
|
|
||||||
|
|
||||||
ASSERT_EQ(reader.getId(), s.str());
|
|
||||||
ASSERT_EQ(reader.getGlobalCount(), archive.getEntryCount());
|
|
||||||
ASSERT_EQ(reader.getMainPage().getTitle(), archive.getMainEntry().getTitle());
|
|
||||||
ASSERT_EQ(reader.hasFulltextIndex(), archive.hasFulltextIndex());
|
|
||||||
ASSERT_NO_THROW(reader.getRandomPage());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST (Reader, getFunctions) {
|
|
||||||
zim::Archive archive("./test/zimfile.zim");
|
|
||||||
Reader reader("./test/zimfile.zim");
|
|
||||||
|
|
||||||
auto archiveEntry = archive.getRandomEntry();
|
|
||||||
ASSERT_TRUE(reader.pathExists(archiveEntry.getPath()));
|
|
||||||
auto readerEntry = reader.getEntryFromPath(archiveEntry.getPath());
|
|
||||||
ASSERT_EQ(readerEntry.getTitle(), archiveEntry.getTitle());
|
|
||||||
|
|
||||||
ASSERT_FALSE(reader.pathExists("invalidEntryPath"));
|
|
||||||
ASSERT_THROW(reader.getEntryFromPath("invalidEntryPath"), NoEntry);
|
|
||||||
|
|
||||||
readerEntry = reader.getEntryFromTitle(archiveEntry.getTitle());
|
|
||||||
ASSERT_EQ(readerEntry.getTitle(), archiveEntry.getTitle());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST (Reader, suggestions) {
|
|
||||||
Reader reader("./test/zimfile.zim");
|
|
||||||
SuggestionsList_t suggestions;
|
|
||||||
reader.searchSuggestionsSmart("The Genius", 4, suggestions);
|
|
||||||
|
|
||||||
std::vector<std::string> suggestionResult, expectedResult;
|
|
||||||
std::string suggestionTitle;
|
|
||||||
for (auto it = suggestions.begin(); it != suggestions.end(); it++) {
|
|
||||||
suggestionResult.push_back(it->getTitle());
|
|
||||||
}
|
|
||||||
|
|
||||||
expectedResult = {
|
|
||||||
"The Genius After Hours",
|
|
||||||
"The Genius Hits the Road",
|
|
||||||
"The Genius Sings the Blues",
|
|
||||||
"The Genius of Ray Charles"
|
|
||||||
};
|
|
||||||
|
|
||||||
ASSERT_EQ(suggestionResult, expectedResult);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,79 +0,0 @@
|
|||||||
#include "gtest/gtest.h"
|
|
||||||
#include "../include/searcher.h"
|
|
||||||
#include "../include/reader.h"
|
|
||||||
|
|
||||||
namespace kiwix
|
|
||||||
{
|
|
||||||
|
|
||||||
TEST(Searcher, add_reader) {
|
|
||||||
Reader reader1("./test/example.zim");
|
|
||||||
Reader reader2("./test/example.zim");
|
|
||||||
Reader reader3("./test/../test/example.zim");
|
|
||||||
|
|
||||||
Searcher searcher;
|
|
||||||
ASSERT_TRUE (searcher.add_reader(&reader1));
|
|
||||||
ASSERT_FALSE(searcher.add_reader(&reader1));
|
|
||||||
ASSERT_FALSE(searcher.add_reader(&reader2));
|
|
||||||
ASSERT_FALSE(searcher.add_reader(&reader3));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(Searcher, search) {
|
|
||||||
Reader reader("./test/example.zim");
|
|
||||||
|
|
||||||
Searcher searcher;
|
|
||||||
searcher.add_reader(&reader);
|
|
||||||
ASSERT_EQ(searcher.get_reader(0)->getTitle(), reader.getTitle());
|
|
||||||
|
|
||||||
searcher.search("wiki", 0, 2);
|
|
||||||
searcher.restart_search();
|
|
||||||
ASSERT_EQ(searcher.getEstimatedResultCount(), (unsigned int)2);
|
|
||||||
|
|
||||||
auto result = searcher.getNextResult();
|
|
||||||
ASSERT_EQ(result->get_title(), "FreedomBox for Communities/Offline Wikipedia - Wikibooks, open books for an open world");
|
|
||||||
result = searcher.getNextResult();
|
|
||||||
ASSERT_EQ(result->get_title(), "Wikibooks");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(Searcher, suggestion) {
|
|
||||||
Reader reader("./test/zimfile.zim");
|
|
||||||
|
|
||||||
Searcher searcher;
|
|
||||||
searcher.add_reader(&reader);
|
|
||||||
ASSERT_EQ(searcher.get_reader(0)->getTitle(), reader.getTitle());
|
|
||||||
|
|
||||||
std::string query = "ray";
|
|
||||||
searcher.suggestions(query, true);
|
|
||||||
searcher.restart_search();
|
|
||||||
|
|
||||||
auto result = searcher.getNextResult();
|
|
||||||
ASSERT_EQ(result->get_title(), "Charles, Ray");
|
|
||||||
ASSERT_EQ(result->get_url(), "A/Charles,_Ray");
|
|
||||||
ASSERT_EQ(result->get_snippet(), "Charles, <b>Ray</b>");
|
|
||||||
ASSERT_EQ(result->get_score(), 0);
|
|
||||||
ASSERT_EQ(result->get_content(), "");
|
|
||||||
ASSERT_EQ(result->get_size(), 0);
|
|
||||||
ASSERT_EQ(result->get_wordCount(), 0);
|
|
||||||
ASSERT_EQ(result->get_zimId(), "");
|
|
||||||
|
|
||||||
result = searcher.getNextResult();
|
|
||||||
ASSERT_EQ(result->get_title(), "Ray (film)");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(Searcher, incrementalRange) {
|
|
||||||
// Attempt to get 50 results in steps of 5
|
|
||||||
zim::Archive archive("./test/zimfile.zim");
|
|
||||||
zim::Searcher ftsearcher(archive);
|
|
||||||
zim::Query query;
|
|
||||||
query.setQuery("ray");
|
|
||||||
auto search = ftsearcher.search(query);
|
|
||||||
|
|
||||||
int suggCount = 0;
|
|
||||||
for (int i = 0; i < 10; i++) {
|
|
||||||
auto srs = search.getResults(i*5, 5); // get 5 results
|
|
||||||
ASSERT_EQ(srs.size(), 5);
|
|
||||||
suggCount += srs.size();
|
|
||||||
}
|
|
||||||
ASSERT_EQ(suggCount, 50);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user