mirror of https://github.com/kiwix/libkiwix.git
Merge pull request #95 from kiwix/geo_loc
Add small API to do geo query.
This commit is contained in:
commit
e2f16f6030
|
@ -67,6 +67,10 @@ class Searcher
|
||||||
unsigned int resultStart,
|
unsigned int resultStart,
|
||||||
unsigned int resultEnd,
|
unsigned int resultEnd,
|
||||||
const bool verbose = false);
|
const bool verbose = false);
|
||||||
|
void geo_search(float latitude, float longitude, float distance,
|
||||||
|
unsigned int resultStart,
|
||||||
|
unsigned int resultEnd,
|
||||||
|
const bool verbose = false);
|
||||||
void suggestions(std::string& search, const bool verbose = false);
|
void suggestions(std::string& search, const bool verbose = false);
|
||||||
Result* getNextResult();
|
Result* getNextResult();
|
||||||
void restart_search();
|
void restart_search();
|
||||||
|
|
|
@ -176,6 +176,63 @@ void Searcher::search(std::string& search,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Searcher::geo_search(float latitude, float longitude, float distance,
|
||||||
|
unsigned int resultStart,
|
||||||
|
unsigned int resultEnd,
|
||||||
|
const bool verbose)
|
||||||
|
{
|
||||||
|
this->reset();
|
||||||
|
|
||||||
|
if (verbose == true) {
|
||||||
|
cout << "Performing geo query `" << distance << "&(" << latitude << ";" << longitude << ")'" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If resultEnd & resultStart inverted */
|
||||||
|
if (resultStart > resultEnd) {
|
||||||
|
resultEnd += resultStart;
|
||||||
|
resultStart = resultEnd - resultStart;
|
||||||
|
resultEnd -= resultStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try to find results */
|
||||||
|
if (resultStart == resultEnd) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (internal->_xapianSearcher) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Avoid big researches */
|
||||||
|
this->resultCountPerPage = resultEnd - resultStart;
|
||||||
|
if (this->resultCountPerPage > MAX_SEARCH_LEN) {
|
||||||
|
resultEnd = resultStart + MAX_SEARCH_LEN;
|
||||||
|
this->resultCountPerPage = MAX_SEARCH_LEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perform the search */
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << "Articles located less than " << distance << " meters of " << latitude << ";" << longitude;
|
||||||
|
this->searchPattern = oss.str();
|
||||||
|
this->resultStart = resultStart;
|
||||||
|
this->resultEnd = resultEnd;
|
||||||
|
|
||||||
|
std::vector<const zim::File*> zims;
|
||||||
|
for (auto current = this->readers.begin(); current != this->readers.end();
|
||||||
|
current++) {
|
||||||
|
zims.push_back((*current)->getZimFileHandler());
|
||||||
|
}
|
||||||
|
zim::Search* search = new zim::Search(zims);
|
||||||
|
search->set_query("");
|
||||||
|
search->set_georange(latitude, longitude, distance);
|
||||||
|
search->set_range(resultStart, resultEnd);
|
||||||
|
internal->_search = search;
|
||||||
|
internal->current_iterator = internal->_search->begin();
|
||||||
|
this->estimatedResultCount = internal->_search->get_matches_estimated();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Searcher::restart_search()
|
void Searcher::restart_search()
|
||||||
{
|
{
|
||||||
if (internal->_xapianSearcher) {
|
if (internal->_xapianSearcher) {
|
||||||
|
|
Loading…
Reference in New Issue