diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2016-09-24 16:02:25 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2016-09-24 16:02:25 +0000 |
commit | 024bc103751ccef2abe9de8632085a0594339df0 (patch) | |
tree | e1472e28736a0d3ef947916c2f221ed7b4fa1f38 | |
parent | dbe9a97ea5cdd14a7043d6ffbb40ea3121b06c98 (diff) |
Just get the term and th eindex name directly from the iterator.
7 files changed, 65 insertions, 106 deletions
diff --git a/searchlib/src/tests/stackdumpiterator/stackdumpiteratortest.cpp b/searchlib/src/tests/stackdumpiterator/stackdumpiteratortest.cpp index 19ce69550f7..326b2c0b280 100644 --- a/searchlib/src/tests/stackdumpiterator/stackdumpiteratortest.cpp +++ b/searchlib/src/tests/stackdumpiterator/stackdumpiteratortest.cpp @@ -137,10 +137,6 @@ StackDumpIteratorTest::ShowResult(int testNo, unsigned int expected) { unsigned int results = 0; - const char *idx_ptr; - const char *term_ptr; - size_t idx_len; - size_t term_len; int num = 0; @@ -149,16 +145,16 @@ StackDumpIteratorTest::ShowResult(int testNo, printf("%03d: ", testNo); while (actual.next()) { - actual.getIndexName(&idx_ptr, &idx_len); - actual.getTerm(&term_ptr, &term_len); + vespalib::stringref idx = actual.getIndexName(); + vespalib::stringref term = actual.getTerm(); #if 0 printf("StackItem #%d: %d %d '%.*s:%.*s'\n", actual.getNum(), actual.getType(), actual.getArity(), - idx_len, idx_ptr, - term_len, term_ptr); + idx.size(), idx.c_str(), + term.size(), term.c_str()); #endif item = correct.Pop(); @@ -178,12 +174,12 @@ StackDumpIteratorTest::ShowResult(int testNo, delete item; break; } - if (strncmp(item->_indexName.c_str(), idx_ptr, idx_len) != 0) { + if (strncmp(item->_indexName.c_str(), idx.c_str(), idx.size()) != 0) { results |= ITERATOR_ERROR_WRONG_INDEX; delete item; break; } - if (strncmp(item->_term.c_str(), term_ptr, term_len) != 0) { + if (strncmp(item->_term.c_str(), term.c_str(), term.size()) != 0) { results |= ITERATOR_ERROR_WRONG_TERM; delete item; break; diff --git a/searchlib/src/vespa/searchlib/parsequery/stackdumpiterator.h b/searchlib/src/vespa/searchlib/parsequery/stackdumpiterator.h index 0a8c95da87a..4ccd7660a0c 100644 --- a/searchlib/src/vespa/searchlib/parsequery/stackdumpiterator.h +++ b/searchlib/src/vespa/searchlib/parsequery/stackdumpiterator.h @@ -152,16 +152,8 @@ public: query::PredicateQueryTerm::UP getPredicateQueryTerm() { return std::move(_predicate_query_term); } - /** - * Get the type of the current item. - * @return the type. - */ - void getIndexName(const char **buf, size_t *buflen) const { *buf = _currIndexName; *buflen = _currIndexNameLen; } - /** - * Get the type of the current item. - * @return the type. - */ - void getTerm(const char **buf, size_t *buflen) const { *buf = _currTerm; *buflen = _currTermLen; } + vespalib::stringref getIndexName() const { return vespalib::stringref(_currIndexName, _currIndexNameLen); } + vespalib::stringref getTerm() const { return vespalib::stringref(_currTerm, _currTermLen); } }; } diff --git a/searchlib/src/vespa/searchlib/query/querynode.cpp b/searchlib/src/vespa/searchlib/query/querynode.cpp index c9428e513d6..17df761af83 100644 --- a/searchlib/src/vespa/searchlib/query/querynode.cpp +++ b/searchlib/src/vespa/searchlib/query/querynode.cpp @@ -61,10 +61,7 @@ QueryNode::UP QueryNode::Build(const QueryNode * parent, const QueryNodeResultBa (type == search::ParseItem::ITEM_DOT_PRODUCT) || (type == search::ParseItem::ITEM_WAND)) { - const char * index; - size_t indexLen(0); - queryRep.getIndexName(&index, &indexLen); - qn->setIndex(vespalib::string(index, indexLen)); + qn->setIndex(queryRep.getIndexName()); } for (size_t i=0; i < arity; i++) { queryRep.next(); @@ -91,22 +88,15 @@ QueryNode::UP QueryNode::Build(const QueryNode * parent, const QueryNodeResultBa case search::ParseItem::ITEM_PURE_WEIGHTED_STRING: case search::ParseItem::ITEM_PURE_WEIGHTED_LONG: { - const char * index; - size_t indexLen(0); - queryRep.getIndexName(&index, &indexLen); - if (indexLen == 0) { + vespalib::stringref index = queryRep.getIndexName(); + if (index.empty()) { if ((type == search::ParseItem::ITEM_PURE_WEIGHTED_STRING) || (type == search::ParseItem::ITEM_PURE_WEIGHTED_LONG)) { - const vespalib::string & ref = parent->getIndex(); - index = ref.c_str(); - indexLen = ref.size(); + index = parent->getIndex(); } else { - index = "default"; - indexLen = strlen(index); + index = DEFAULT; } } - const char * term; - size_t termLen(0); - queryRep.getTerm(&term, &termLen); + vespalib::stringref term = queryRep.getTerm(); QueryTerm::SearchTerm sTerm(QueryTerm::WORD); switch (type) { case search::ParseItem::ITEM_REGEXP: @@ -127,8 +117,8 @@ QueryNode::UP QueryNode::Build(const QueryNode * parent, const QueryNodeResultBa default: break; } - QueryTerm::string ssTerm(term, termLen); - QueryTerm::string ssIndex(index, indexLen); + QueryTerm::string ssTerm(term); + QueryTerm::string ssIndex(index); if (ssIndex == "sddocname") { // This is suboptimal as the term should be checked too. // But it will do for now as only correct sddocname queries are sent down. diff --git a/searchlib/src/vespa/searchlib/query/tree/stackdumpquerycreator.h b/searchlib/src/vespa/searchlib/query/tree/stackdumpquerycreator.h index 7919c0df981..246fd288b0d 100644 --- a/searchlib/src/vespa/searchlib/query/tree/stackdumpquerycreator.h +++ b/searchlib/src/vespa/searchlib/query/tree/stackdumpquerycreator.h @@ -54,19 +54,6 @@ public: } private: - /** - * If changing this class note: - * Note that this method must return a reference into the existing querystack. - * This is necessary to use the non-copying stringref noted in the create method. - */ - static vespalib::stringref readString(SimpleQueryStackDumpIterator &queryStack, void (SimpleQueryStackDumpIterator::*f)(const char **, size_t *) const) - { - const char *p; - size_t len; - (queryStack.*f)(&p, &len); - return vespalib::stringref(p, len); - } - static Term * createQueryTerm(search::SimpleQueryStackDumpIterator &queryStack, QueryBuilder<NodeTypes> & builder, vespalib::stringref & pureTermView) { uint32_t arity = queryStack.getArity(); uint32_t arg1 = queryStack.getArg1(); @@ -82,13 +69,13 @@ private: } else if (type == ParseItem::ITEM_OR) { builder.addOr(arity); } else if (type == ParseItem::ITEM_WORD_ALTERNATIVES) { - vespalib::stringref view = readString(queryStack, &SimpleQueryStackDumpIterator::getIndexName); + vespalib::stringref view = queryStack.getIndexName(); int32_t id = queryStack.getUniqueId(); Weight weight = queryStack.GetWeight(); builder.addEquiv(arity, id, weight); pureTermView = view; } else if (type == ParseItem::ITEM_WEAK_AND) { - vespalib::stringref view = readString(queryStack, &SimpleQueryStackDumpIterator::getIndexName); + vespalib::stringref view = queryStack.getIndexName(); builder.addWeakAnd(arity, arg1, view); pureTermView = view; } else if (type == ParseItem::ITEM_EQUIV) { @@ -100,25 +87,25 @@ private: } else if (type == ParseItem::ITEM_ONEAR) { builder.addONear(arity, arg1); } else if (type == ParseItem::ITEM_PHRASE) { - vespalib::stringref view = readString(queryStack, &SimpleQueryStackDumpIterator::getIndexName); + vespalib::stringref view = queryStack.getIndexName(); int32_t id = queryStack.getUniqueId(); Weight weight = queryStack.GetWeight(); t = &builder.addPhrase(arity, view, id, weight); pureTermView = view; } else if (type == ParseItem::ITEM_WEIGHTED_SET) { - vespalib::stringref view = readString(queryStack, &SimpleQueryStackDumpIterator::getIndexName); + vespalib::stringref view = queryStack.getIndexName(); int32_t id = queryStack.getUniqueId(); Weight weight = queryStack.GetWeight(); t = &builder.addWeightedSetTerm(arity, view, id, weight); pureTermView = vespalib::stringref(); } else if (type == ParseItem::ITEM_DOT_PRODUCT) { - vespalib::stringref view = readString(queryStack, &SimpleQueryStackDumpIterator::getIndexName); + vespalib::stringref view = queryStack.getIndexName(); int32_t id = queryStack.getUniqueId(); Weight weight = queryStack.GetWeight(); t = &builder.addDotProduct(arity, view, id, weight); pureTermView = vespalib::stringref(); } else if (type == ParseItem::ITEM_WAND) { - vespalib::stringref view = readString(queryStack, &SimpleQueryStackDumpIterator::getIndexName); + vespalib::stringref view = queryStack.getIndexName(); int32_t id = queryStack.getUniqueId(); Weight weight = queryStack.GetWeight(); t = &builder.addWandTerm(arity, view, id, weight, arg1, arg2, arg3); @@ -126,8 +113,8 @@ private: } else if (type == ParseItem::ITEM_NOT) { builder.addAndNot(arity); } else { - vespalib::stringref term = readString(queryStack, &SimpleQueryStackDumpIterator::getTerm); - vespalib::stringref view = readString(queryStack, &SimpleQueryStackDumpIterator::getIndexName); + vespalib::stringref term = queryStack.getTerm(); + vespalib::stringref view = queryStack.getIndexName(); int32_t id = queryStack.getUniqueId(); Weight weight = queryStack.GetWeight(); diff --git a/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp index 9a9041ea295..07eaad9807f 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp @@ -169,29 +169,27 @@ public: virtual const char *Index(const juniper::QueryItem* item, size_t *len) const { if (item->_si != NULL) { - const char *ret; - item->_si->getIndexName(&ret, len); - return ret; + *len = item->_si->getIndexName().size(); + return item->_si->getIndexName().c_str(); } else { + *len = item->_data->_indexlen; return item->_data->_index; } } virtual bool UsefulIndex(const juniper::QueryItem* item) const { - const char *buf; - size_t buflen; + vespalib::stringref index; if (_kwExtractor == NULL) return true; if (item->_si != NULL) { - item->_si->getIndexName(&buf, &buflen); + index = item->_si->getIndexName(); } else { - buf = item->_data->_index; - buflen = item->_data->_indexlen; + index = vespalib::stringref(item->_data->_index, item->_data->_indexlen); } - return _kwExtractor->IsLegalIndex(buf, buflen); + return _kwExtractor->IsLegalIndex(index); } }; @@ -203,8 +201,6 @@ JuniperQueryAdapter::Traverse(juniper::IQueryVisitor *v) const bool rc = true; search::SimpleQueryStackDumpIterator iterator(_buf); juniper::QueryItem item(&iterator); - const char *buf; - size_t buflen; if (_highlightTerms->numKeys() > 0) { v->VisitAND(&item, 2); @@ -234,14 +230,15 @@ JuniperQueryAdapter::Traverse(juniper::IQueryVisitor *v) const case search::ParseItem::ITEM_TERM: case search::ParseItem::ITEM_EXACTSTRINGTERM: case search::ParseItem::ITEM_PURE_WEIGHTED_STRING: - iterator.getTerm(&buf, &buflen); - v->VisitKeyword(&item, buf, buflen, false, isSpecialToken); + { + vespalib::stringref term = iterator.getTerm(); + v->VisitKeyword(&item, term.c_str(), term.size(), false, isSpecialToken); + } break; case search::ParseItem::ITEM_NUMTERM: - iterator.getTerm(&buf, &buflen); { - vespalib::string termStr(buf, buflen); - queryeval::SplitFloat splitter(termStr); + vespalib::string term = iterator.getTerm(); + queryeval::SplitFloat splitter(term); if (splitter.parts() > 1) { if (v->VisitPHRASE(&item, splitter.parts())) { for (size_t i = 0; i < splitter.parts(); ++i) { @@ -255,7 +252,7 @@ JuniperQueryAdapter::Traverse(juniper::IQueryVisitor *v) const splitter.getPart(0).c_str(), splitter.getPart(0).size(), false); } else { - v->VisitKeyword(&item, buf, buflen, false, true); + v->VisitKeyword(&item, term.c_str(), term.size(), false, true); } } break; @@ -269,16 +266,14 @@ JuniperQueryAdapter::Traverse(juniper::IQueryVisitor *v) const break; case search::ParseItem::ITEM_PREFIXTERM: case search::ParseItem::ITEM_SUBSTRINGTERM: - iterator.getTerm(&buf, &buflen); - v->VisitKeyword(&item, buf, buflen, true, isSpecialToken); + { + vespalib::stringref term = iterator.getTerm(); + v->VisitKeyword(&item, term.c_str(), term.size(), true, isSpecialToken); + } break; case search::ParseItem::ITEM_ANY: -#if (JUNIPER_RP_API_MINOR_VERSION >= 1) if (!v->VisitANY(&item, iterator.getArity())) -#else - if (!v->VisitOR(&item, iterator.getArity())) -#endif - rc = SkipItem(&iterator); + rc = SkipItem(&iterator); break; case search::ParseItem::ITEM_NEAR: if (!v->VisitNEAR(&item, iterator.getArity(),iterator.getArg1())) diff --git a/searchsummary/src/vespa/searchsummary/docsummary/keywordextractor.cpp b/searchsummary/src/vespa/searchsummary/docsummary/keywordextractor.cpp index 6d567f9a6da..51025ab1034 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/keywordextractor.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/keywordextractor.cpp @@ -111,10 +111,9 @@ KeywordExtractor::GetLegalIndexSpec() bool -KeywordExtractor::IsLegalIndex(const char *idxName, size_t idxNameLen) const +KeywordExtractor::IsLegalIndex(vespalib::stringref idxS) const { vespalib::string resolvedIdxName; - vespalib::string idxS(idxName, idxNameLen); if (_env != NULL) { resolvedIdxName = _env->lookupIndex(idxS); @@ -136,10 +135,8 @@ KeywordExtractor::IsLegalIndex(const char *idxName, size_t idxNameLen) const char * -KeywordExtractor::ExtractKeywords(const vespalib::stringref &buf) const +KeywordExtractor::ExtractKeywords(vespalib::stringref buf) const { - const char *str_ptr; - size_t str_len; search::SimpleQueryStackDumpIterator si(buf); char keywordstore[4096]; // Initial storage for keywords buffer search::RawBuf keywords(keywordstore, sizeof(keywordstore)); @@ -171,27 +168,28 @@ KeywordExtractor::ExtractKeywords(const vespalib::stringref &buf) const keywords.reset(); goto iteratorloopend; } else { - si.getIndexName(&str_ptr, &str_len); - if (!IsLegalIndex(str_ptr, str_len)) + if (!IsLegalIndex(si.getIndexName())) continue; // Found a term - si.getTerm(&str_ptr, &str_len); + vespalib::stringref term = si.getTerm(); search::ParseItem::ItemCreator term_creator = si.getCreator(); - if (str_len > 0 && useful(term_creator)) { + if ( !term.empty() && useful(term_creator)) { // Actual term to add - if (phraseterms_was_added) + if (phraseterms_was_added) { // Not the first term in the phrase keywords += " "; - else + } else { phraseterms_was_added = true; + } - keywords.append(str_ptr, str_len); + keywords.append(term.c_str(), term.size()); } } } - if (phraseterms_was_added) + if (phraseterms_was_added) { // Terms was added, so 0-terminate the string keywords.append("\0", 1); + } break; } @@ -200,15 +198,16 @@ KeywordExtractor::ExtractKeywords(const vespalib::stringref &buf) const case search::ParseItem::ITEM_EXACTSTRINGTERM: case search::ParseItem::ITEM_NUMTERM: case search::ParseItem::ITEM_TERM: - si.getIndexName(&str_ptr, &str_len); - if (!IsLegalIndex(str_ptr, str_len)) + if (!IsLegalIndex(si.getIndexName())) continue; - // add a new keyword - si.getTerm(&str_ptr, &str_len); - if (str_len > 0 && useful(creator)) { - // An actual string to add - keywords.append(str_ptr, str_len); - keywords.append("\0", 1); + { + // add a new keyword + vespalib::stringref term = si.getTerm(); + if ( !term.empty() && useful(creator)) { + // An actual string to add + keywords.append(term.c_str(), term.size()); + keywords.append("\0", 1); + } } break; diff --git a/searchsummary/src/vespa/searchsummary/docsummary/keywordextractor.h b/searchsummary/src/vespa/searchsummary/docsummary/keywordextractor.h index 750cfb2cdee..35c9d387317 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/keywordextractor.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/keywordextractor.h @@ -135,7 +135,7 @@ public: * * @return true if the given index name is legal. **/ - bool IsLegalIndex(const char *idxName, size_t idxNameLen) const; + bool IsLegalIndex(vespalib::stringref idx) const; /** @@ -156,7 +156,7 @@ public: * @return Pointer to a buffer containing zero-terminated keywords, * with an empty word at the end. */ - char *ExtractKeywords(const vespalib::stringref &buf) const; + char *ExtractKeywords(vespalib::stringref buf) const; }; } |