/** For sword module lists set scope of verses. Scope will not be set if \list is empty. */ void setScope(sword::ListKey list) { _hasScope = list.Count() > 0; _scopeMap.clear(); if(!_module) return; if(_module->type() == CSwordModuleInfo::Lexicon) { CSwordLexiconModuleInfo *mi = qobject_cast<CSwordLexiconModuleInfo*>(_module); for(int i = 0; i < list.Count(); ++i) { CSwordLDKey k(list.GetElement(i), mi); _scopeMap.append(mi->entries().indexOf(k.key())); } } else { for(int i = 0; i < list.Count(); ++i) _scopeMap.append(list.GetElement(i)->getIndex()); } Q_ASSERT(!_scopeMap.contains(-1)); }
bool CSwordModuleInfo::searchIndexed(const QString& searchedText, sword::ListKey& scope) { char utfBuffer[BT_MAX_LUCENE_FIELD_LENGTH + 1]; wchar_t wcharBuffer[BT_MAX_LUCENE_FIELD_LENGTH + 1]; // work around Swords thread insafety for Bibles and Commentaries boost::scoped_ptr < CSwordKey > key(CSwordKey::createInstance(this)); sword::SWKey* s = dynamic_cast < sword::SWKey * >(key.get()); QList<sword::VerseKey*> list; if (s) { m_module->SetKey(*s); } m_searchResult.ClearList(); try { // do not use any stop words const TCHAR* stop_words[] = { NULL }; lucene::analysis::standard::StandardAnalyzer analyzer( stop_words ); lucene::search::IndexSearcher searcher(getModuleStandardIndexLocation().toAscii().constData()); lucene_utf8towcs(wcharBuffer, searchedText.toUtf8().constData(), BT_MAX_LUCENE_FIELD_LENGTH); boost::scoped_ptr<lucene::search::Query> q( lucene::queryParser::QueryParser::parse((const TCHAR*)wcharBuffer, (const TCHAR*)_T("content"), &analyzer) ); boost::scoped_ptr<lucene::search::Hits> h( searcher.search(q.get(), lucene::search::Sort::INDEXORDER) ); const bool useScope = (scope.Count() > 0); // const bool isVerseModule = (type() == CSwordModuleInfo::Bible) || (type() == CSwordModuleInfo::Commentary); lucene::document::Document* doc = 0; boost::scoped_ptr<sword::SWKey> swKey( module()->CreateKey() ); for (int i = 0; i < h->length(); ++i) { doc = &h->doc(i); lucene_wcstoutf8(utfBuffer, (const wchar_t*)doc->get((const TCHAR*)_T("key")), BT_MAX_LUCENE_FIELD_LENGTH); swKey->setText(utfBuffer); // limit results based on scope //if (searchOptions & CSwordModuleSearch::useScope && scope.Count() > 0){ if (useScope) { for (int j = 0; j < scope.Count(); j++) { sword::VerseKey* vkey = dynamic_cast<sword::VerseKey*>(scope.getElement(j)); if (vkey->LowerBound().compare(*swKey) <= 0 && vkey->UpperBound().compare(*swKey) >= 0) { m_searchResult.add(*swKey); } } } else { // no scope, give me all buffers m_searchResult.add(*swKey); } } } catch (...) { qWarning("CLucene exception occurred"); util::showWarning(0, QCoreApplication::tr("Search aborted"), QCoreApplication::tr("An internal error occurred while executing your search.")); return false; } qDeleteAll(list); list.clear(); return (m_searchResult.Count() > 0); }