diff options
author | Geir Storli <geirst@verizonmedia.com> | 2019-04-23 14:29:31 +0000 |
---|---|---|
committer | Geir Storli <geirst@verizonmedia.com> | 2019-04-23 14:29:31 +0000 |
commit | ba63e24873c5147a2bf401ef640abbe0ec7e1c24 (patch) | |
tree | 119b1672f01ee5dad7e0f366b674bae87a8c89a4 | |
parent | 4c4afce3ab48fdfca83f0a3217d0fe18431e68a7 (diff) |
Move conformance test for field index posting iterator to separate binary.
4 files changed, 149 insertions, 93 deletions
diff --git a/searchlib/src/tests/memoryindex/field_index/CMakeLists.txt b/searchlib/src/tests/memoryindex/field_index/CMakeLists.txt index 767097b99db..8377fbcf0ca 100644 --- a/searchlib/src/tests/memoryindex/field_index/CMakeLists.txt +++ b/searchlib/src/tests/memoryindex/field_index/CMakeLists.txt @@ -7,3 +7,12 @@ vespa_add_executable(searchlib_field_index_test_app TEST searchlib_test ) vespa_add_test(NAME searchlib_field_index_test_app COMMAND searchlib_field_index_test_app) + +vespa_add_executable(searchlib_field_index_iterator_test_app TEST + SOURCES + field_index_iterator_test.cpp + DEPENDS + searchlib + searchlib_test +) +vespa_add_test(NAME searchlib_field_index_iterator_test_app COMMAND searchlib_field_index_iterator_test_app) diff --git a/searchlib/src/tests/memoryindex/field_index/field_index_iterator_test.cpp b/searchlib/src/tests/memoryindex/field_index/field_index_iterator_test.cpp new file mode 100644 index 00000000000..df7f80e8601 --- /dev/null +++ b/searchlib/src/tests/memoryindex/field_index/field_index_iterator_test.cpp @@ -0,0 +1,73 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include <vespa/searchcommon/common/schema.h> +#include <vespa/searchlib/memoryindex/field_index.h> +#include <vespa/searchlib/memoryindex/posting_iterator.h> +#include <vespa/searchlib/test/memoryindex/wrap_inserter.h> +#include <vespa/searchlib/test/searchiteratorverifier.h> +#include <vespa/vespalib/testkit/testapp.h> + +#include <vespa/log/log.h> +LOG_SETUP("field_index_iterator_test"); + +using namespace search::fef; +using namespace search::index; +using namespace search::memoryindex::test; +using namespace search::memoryindex; + +using search::index::schema::DataType; +using search::test::SearchIteratorVerifier; + +class Verifier : public SearchIteratorVerifier { +private: + mutable TermFieldMatchData _tfmd; + FieldIndex _field_index; + +public: + Verifier(const Schema& schema) + : _tfmd(), + _field_index(schema, 0) + { + WrapInserter inserter(_field_index); + inserter.word("a"); + for (uint32_t docId : getExpectedDocIds()) { + inserter.add(docId); + } + inserter.flush(); + } + ~Verifier() {} + + SearchIterator::UP create(bool strict) const override { + (void) strict; + TermFieldMatchDataArray match_data; + match_data.add(&_tfmd); + return std::make_unique<PostingIterator>(_field_index.find("a"), + _field_index.getFeatureStore(), 0, match_data); + } +}; + +Schema +get_schema() +{ + Schema result; + result.addIndexField(Schema::IndexField("f0", DataType::STRING)); + return result; +} + +struct Fixture { + Schema schema; + Verifier verifier; + Fixture() + : schema(get_schema()), + verifier(schema) + { + } +}; + +TEST_F("require that posting iterator conforms", Fixture) +{ + f.verifier.verify(); +} + +TEST_MAIN() { TEST_RUN_ALL(); } + diff --git a/searchlib/src/tests/memoryindex/field_index/field_index_test.cpp b/searchlib/src/tests/memoryindex/field_index/field_index_test.cpp index 3a635756ec7..9da0e6ab6ed 100644 --- a/searchlib/src/tests/memoryindex/field_index/field_index_test.cpp +++ b/searchlib/src/tests/memoryindex/field_index/field_index_test.cpp @@ -15,11 +15,11 @@ #include <vespa/searchlib/memoryindex/field_inverter.h> #include <vespa/searchlib/memoryindex/ordered_field_index_inserter.h> #include <vespa/searchlib/memoryindex/posting_iterator.h> -#include <vespa/searchlib/test/searchiteratorverifier.h> +#include <vespa/searchlib/test/memoryindex/wrap_inserter.h> #include <vespa/vespalib/testkit/testapp.h> #include <vespa/log/log.h> -LOG_SETUP("dictionary_test"); +LOG_SETUP("field_index_test"); namespace search { @@ -32,11 +32,11 @@ using document::Document; using queryeval::SearchIterator; using search::index::schema::CollectionType; using search::index::schema::DataType; -using test::SearchIteratorVerifier; using vespalib::GenerationHandler; namespace memoryindex { +using test::WrapInserter; typedef FieldIndex::PostingList PostingList; typedef PostingList::ConstIterator PostingConstItr; @@ -448,61 +448,6 @@ myremove(uint32_t docId, DocumentInverter &inv, FieldIndexCollection &fieldIndex inv.pushDocuments(fieldIndexes, std::shared_ptr<IDestructorCallback>()); } - -class WrapInserter -{ - OrderedFieldIndexInserter &_inserter; -public: - WrapInserter(FieldIndexCollection &fieldIndexes, uint32_t fieldId) - : _inserter(fieldIndexes.getFieldIndex(fieldId)->getInserter()) - { - } - - WrapInserter &word(vespalib::stringref word_) - { - _inserter.setNextWord(word_); - return *this; - } - - WrapInserter &add(uint32_t docId, const index::DocIdAndFeatures &features) - { - _inserter.add(docId, features); - return *this; - } - - WrapInserter &add(uint32_t docId) - { - DocIdAndPosOccFeatures features; - features.addNextOcc(0, 0, 1, 1); - return add(docId, features); - } - - WrapInserter &remove(uint32_t docId) - { - _inserter.remove(docId); - return *this; - } - - WrapInserter &flush() - { - _inserter.flush(); - return *this; - } - - WrapInserter &rewind() - { - _inserter.rewind(); - return *this; - } - - datastore::EntryRef - getWordRef() - { - return _inserter.getWordRef(); - } -}; - - class MyDrainRemoves : IFieldIndexRemoveListener { FieldIndexRemover &_remover; @@ -742,42 +687,7 @@ TEST_F("requireThatFeaturesAreInPostingLists", Fixture) featureStorePtr(fic, 1))); } -class Verifier : public SearchIteratorVerifier { -public: - Verifier(const Schema & schema); - ~Verifier(); - SearchIterator::UP create(bool strict) const override { - (void) strict; - TermFieldMatchDataArray matchData; - matchData.add(&_tfmd); - return std::make_unique<PostingIterator>(_fieldIndexes.find("a", 0), featureStoreRef(_fieldIndexes, 0), 0, matchData); - } - -private: - mutable TermFieldMatchData _tfmd; - FieldIndexCollection _fieldIndexes; -}; - - -Verifier::Verifier(const Schema & schema) - : _tfmd(), - _fieldIndexes(schema) -{ - WrapInserter inserter(_fieldIndexes, 0); - inserter.word("a"); - for (uint32_t docId : getExpectedDocIds()) { - inserter.add(docId); - } - inserter.flush(); -} -Verifier::~Verifier() {} - -TEST_F("require that postingiterator conforms", Fixture) { - Verifier verifier(f.getSchema()); - verifier.verify(); - -} TEST_F("requireThatPostingIteratorIsWorking", Fixture) { diff --git a/searchlib/src/vespa/searchlib/test/memoryindex/wrap_inserter.h b/searchlib/src/vespa/searchlib/test/memoryindex/wrap_inserter.h new file mode 100644 index 00000000000..eeb09898aa2 --- /dev/null +++ b/searchlib/src/vespa/searchlib/test/memoryindex/wrap_inserter.h @@ -0,0 +1,64 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include <vespa/searchlib/memoryindex/field_index_collection.h> +#include <vespa/searchlib/memoryindex/ordered_field_index_inserter.h> + +namespace search::memoryindex::test { + +/** + * Test class used to populate a FieldIndex. + */ +class WrapInserter { +private: + OrderedFieldIndexInserter& _inserter; + +public: + WrapInserter(FieldIndexCollection& field_indexes, uint32_t field_id) + : _inserter(field_indexes.getFieldIndex(field_id)->getInserter()) + { + } + + WrapInserter(FieldIndex& field_index) + : _inserter(field_index.getInserter()) + { + } + + WrapInserter& word(vespalib::stringref word_) { + _inserter.setNextWord(word_); + return *this; + } + + WrapInserter& add(uint32_t doc_id, const index::DocIdAndFeatures& features) { + _inserter.add(doc_id, features); + return *this; + } + + WrapInserter& add(uint32_t doc_id) { + index::DocIdAndPosOccFeatures features; + features.addNextOcc(0, 0, 1, 1); + return add(doc_id, features); + } + + WrapInserter& remove(uint32_t doc_id) { + _inserter.remove(doc_id); + return *this; + } + + WrapInserter& flush() { + _inserter.flush(); + return *this; + } + + WrapInserter& rewind() { + _inserter.rewind(); + return *this; + } + + datastore::EntryRef getWordRef() { + return _inserter.getWordRef(); + } +}; + +} |