diff options
author | Geir Storli <geirst@yahooinc.com> | 2024-02-20 11:05:49 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-20 11:05:49 +0100 |
commit | 59a93f166b8ebdea93437fce812aa6c88133d4b1 (patch) | |
tree | 80ec58864cc9251f14f18a81d8c4496134a37ac6 /searchlib | |
parent | 9efbed3af288e447f09962ae4e09005c1de72c43 (diff) | |
parent | c71231b506e581e22259b68fcf578d9c0f6c11b2 (diff) |
Merge pull request #30335 from vespa-engine/toregge/rewrite-element-similarity-feature-unit-test-to-gtest
Rewrite element similarity feature unit test to gtest.
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/tests/features/element_similarity_feature/element_similarity_feature_test.cpp | 374 |
1 files changed, 223 insertions, 151 deletions
diff --git a/searchlib/src/tests/features/element_similarity_feature/element_similarity_feature_test.cpp b/searchlib/src/tests/features/element_similarity_feature/element_similarity_feature_test.cpp index 1eda660d2ec..6d6830ea7df 100644 --- a/searchlib/src/tests/features/element_similarity_feature/element_similarity_feature_test.cpp +++ b/searchlib/src/tests/features/element_similarity_feature/element_similarity_feature_test.cpp @@ -1,13 +1,14 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/vespalib/testkit/test_kit.h> #include <vespa/searchlib/features/setup.h> #include <vespa/searchlib/fef/test/indexenvironment.h> #include <vespa/searchlib/fef/test/indexenvironmentbuilder.h> #include <vespa/searchlib/fef/test/queryenvironment.h> #include <vespa/searchlib/features/element_similarity_feature.h> -#include <vespa/searchlib/test/ft_test_app.h> +#define ENABLE_GTEST_MIGRATION +#include <vespa/searchlib/test/ft_test_app_base.h> #include <initializer_list> #include <vespa/searchlib/fef/test/dummy_dependency_handler.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/util/stringfmt.h> using namespace search::fef; @@ -87,11 +88,11 @@ struct RankFixture : BlueprintFactoryFixture { FtFeatureTest ft(factory, names); ft.getIndexEnv().getBuilder().addField(FieldType::INDEX, CollectionType::WEIGHTEDSET, "foo"); ft.getIndexEnv().getBuilder().getIndexEnv().getProperties().import(idx_env.indexEnv.getProperties()); - FtTestApp::FT_SETUP(ft, FtUtil::toQuery(query), index, 1); + FtTestAppBase::FT_SETUP(ft, FtUtil::toQuery(query), index, 1); { RankResult stale; EXPECT_TRUE(ft.executeOnly(stale, 2)); - EXPECT_EQUAL(0.0, stale.getScore(select)); + EXPECT_EQ(0.0, stale.getScore(select)); } RankResult actual; EXPECT_TRUE(ft.executeOnly(actual, 1)); @@ -129,11 +130,14 @@ bool cmp_lists_impl(const A &a, const B &b) { std::vector<typename B::value_type> tmp_b(b.begin(), b.end()); std::sort(tmp_a.begin(), tmp_a.end()); std::sort(tmp_b.begin(), tmp_b.end()); - if (!EXPECT_EQUAL(tmp_a.size(), tmp_b.size())) { + bool failed = false; + EXPECT_EQ(tmp_a.size(), tmp_b.size()) << (failed = true, ""); + if (failed) { return false; } for (size_t i = 0; i < tmp_a.size(); ++i) { - if(!EXPECT_EQUAL(tmp_a[i], tmp_b[i])) { + EXPECT_EQ(tmp_a[i], tmp_b[i]) << (failed = true, ""); + if (failed) { return false; } } @@ -162,13 +166,19 @@ bool cmp_lists(const A &a, const B &b) { //----------------------------------------------------------------------------- -TEST_F("require that blueprint can be created from factory", BlueprintFactoryFixture) { +TEST(ElementSimilarityFeatureTest, require_that_blueprint_can_be_created_from_factory) +{ + BlueprintFactoryFixture f; Blueprint::SP bp = f.factory.createBlueprint("elementSimilarity"); EXPECT_TRUE(bp.get() != 0); EXPECT_TRUE(dynamic_cast<ElementSimilarityBlueprint*>(bp.get()) != 0); } -TEST_FFF("require that appropriate features are dumped", ElementSimilarityBlueprint, IndexFixture, FeatureDumpFixture) { +TEST(ElementSimilarityFeatureTest, require_that_appropriate_features_are_dumped) +{ + ElementSimilarityBlueprint f1; + IndexFixture f2; + FeatureDumpFixture f3; f1.visitDumpFeatures(f2.indexEnv, f3); EXPECT_TRUE(cmp_lists(std::vector<vespalib::string>({"elementSimilarity(foo)", "elementSimilarity(foo).proximity", @@ -186,190 +196,252 @@ bool try_setup(ElementSimilarityBlueprint &blueprint, const IndexFixture &index, return ((Blueprint&)blueprint).setup(index.indexEnv, std::vector<vespalib::string>(1, field)); } -TEST_FF("require that setup can be done on weighted set index field", ElementSimilarityBlueprint, IndexFixture) { +TEST(ElementSimilarityFeatureTest, require_that_setup_can_be_done_on_weighted_set_index_field) +{ + ElementSimilarityBlueprint f1; + IndexFixture f2; EXPECT_TRUE(try_setup(f1, f2, "foo")); } -TEST_FF("require that setup can be done on array index field", ElementSimilarityBlueprint, IndexFixture) { +TEST(ElementSimilarityFeatureTest, require_that_setup_can_be_done_on_array_index_field) +{ + ElementSimilarityBlueprint f1; + IndexFixture f2; EXPECT_TRUE(try_setup(f1, f2, "bar")); } -TEST_FF("require that setup can be done on single value index field", ElementSimilarityBlueprint, IndexFixture) { +TEST(ElementSimilarityFeatureTest, require_that_setup_can_be_done_on_single_value_index_field) +{ + ElementSimilarityBlueprint f1; + IndexFixture f2; EXPECT_TRUE(try_setup(f1, f2, "baz")); } -TEST_FF("require that setup can not be done on single value attribute field", ElementSimilarityBlueprint, IndexFixture) { +TEST(ElementSimilarityFeatureTest, require_that_setup_can_not_be_done_on_single_value_attribute_field) +{ + ElementSimilarityBlueprint f1; + IndexFixture f2; EXPECT_FALSE(try_setup(f1, f2, "fox")); } -TEST_FF("require that setup will fail if output expression does not contain an aggregator", ElementSimilarityBlueprint, IndexFixture) { +TEST(ElementSimilarityFeatureTest, require_that_setup_will_fail_if_output_expression_does_not_contain_an_aggregator) +{ + ElementSimilarityBlueprint f1; + IndexFixture f2; f2.set("elementSimilarity(foo).output.default", "p"); EXPECT_FALSE(try_setup(f1, f2, "foo")); } -TEST_FF("require that setup will fail if output expression contains an unknown aggregator", ElementSimilarityBlueprint, IndexFixture) { +TEST(ElementSimilarityFeatureTest, require_that_setup_will_fail_if_output_expression_contains_an_unknown_aggregator) +{ + ElementSimilarityBlueprint f1; + IndexFixture f2; f2.set("elementSimilarity(foo).output.default", "bogus(p)"); EXPECT_FALSE(try_setup(f1, f2, "foo")); } -TEST_FF("require that setup will fail if output expression contains an unknown symbol", ElementSimilarityBlueprint, IndexFixture) { +TEST(ElementSimilarityFeatureTest, require_that_setup_will_fail_if_output_expression_contains_an_unknown_symbol) +{ + ElementSimilarityBlueprint f1; + IndexFixture f2; f2.set("elementSimilarity(foo).output.default", "max(bogus)"); EXPECT_FALSE(try_setup(f1, f2, "foo")); } -TEST_FF("require that setup will fail if output expression is malformed", ElementSimilarityBlueprint, IndexFixture) { +TEST(ElementSimilarityFeatureTest, require_that_setup_will_fail_if_output_expression_is_malformed) +{ + ElementSimilarityBlueprint f1; + IndexFixture f2; f2.set("elementSimilarity(foo).output.default", "max(w+)"); EXPECT_FALSE(try_setup(f1, f2, "foo")); } -TEST_F("require that no match gives zero outputs", RankFixture) { - EXPECT_EQUAL(0.0, f1.get_feature("x", indexFoo().element("y"), DEFAULT)); - EXPECT_EQUAL(0.0, f1.get_feature("x", indexFoo().element("y"), PROXIMITY)); - EXPECT_EQUAL(0.0, f1.get_feature("x", indexFoo().element("y"), ORDER)); - EXPECT_EQUAL(0.0, f1.get_feature("x", indexFoo().element("y"), QUERY)); - EXPECT_EQUAL(0.0, f1.get_feature("x", indexFoo().element("y"), FIELD)); -} - -TEST_F("require that minal perfect match gives max outputs", RankFixture) { - EXPECT_EQUAL(1.0, f1.get_feature("x", indexFoo().element("x"), DEFAULT)); - EXPECT_EQUAL(1.0, f1.get_feature("x", indexFoo().element("x"), PROXIMITY)); - EXPECT_EQUAL(1.0, f1.get_feature("x", indexFoo().element("x"), ORDER)); - EXPECT_EQUAL(1.0, f1.get_feature("x", indexFoo().element("x"), QUERY)); - EXPECT_EQUAL(1.0, f1.get_feature("x", indexFoo().element("x"), FIELD)); -} - -TEST_F("require that larger perfect match gives max outputs", RankFixture) { - EXPECT_EQUAL(1.0, f1.get_feature("a b c d e f g", indexFoo().element("a b c d e f g"), DEFAULT)); - EXPECT_EQUAL(1.0, f1.get_feature("a b c d e f g", indexFoo().element("a b c d e f g"), PROXIMITY)); - EXPECT_EQUAL(1.0, f1.get_feature("a b c d e f g", indexFoo().element("a b c d e f g"), ORDER)); - EXPECT_EQUAL(1.0, f1.get_feature("a b c d e f g", indexFoo().element("a b c d e f g"), QUERY)); - EXPECT_EQUAL(1.0, f1.get_feature("a b c d e f g", indexFoo().element("a b c d e f g"), FIELD)); -} - -TEST_F("require that extra query terms reduces order but not proximity", RankFixture) { - EXPECT_EQUAL(1.0, f1.get_feature("x y", indexFoo().element("x"), PROXIMITY)); - EXPECT_EQUAL(1.0, f1.get_feature("x y y", indexFoo().element("x"), PROXIMITY)); - EXPECT_EQUAL(1.0, f1.get_feature("x y y y", indexFoo().element("x"), PROXIMITY)); - - EXPECT_EQUAL(0.0, f1.get_feature("x y", indexFoo().element("x"), ORDER)); - EXPECT_EQUAL(0.0, f1.get_feature("x y y", indexFoo().element("x"), ORDER)); - EXPECT_EQUAL(0.0, f1.get_feature("x y y y", indexFoo().element("x"), ORDER)); -} - -TEST_F("require that extra field terms reduces proximity but not order", RankFixture) { - EXPECT_EQUAL(prox(2), f1.get_feature("x", indexFoo().element("x y"), PROXIMITY)); - EXPECT_EQUAL(prox(3), f1.get_feature("x", indexFoo().element("x y y"), PROXIMITY)); - EXPECT_EQUAL(prox(4), f1.get_feature("x", indexFoo().element("x y y y"), PROXIMITY)); - - EXPECT_EQUAL(1.0, f1.get_feature("x", indexFoo().element("x y"), ORDER)); - EXPECT_EQUAL(1.0, f1.get_feature("x", indexFoo().element("x y y"), ORDER)); - EXPECT_EQUAL(1.0, f1.get_feature("x", indexFoo().element("x y y y"), ORDER)); -} - -TEST_F("require that proximity acts as expected", RankFixture) { - EXPECT_EQUAL(1.0, f1.get_feature("a b c d e", indexFoo().element("a b c d e"), PROXIMITY)); - EXPECT_EQUAL(comb({prox(2), prox(1), prox(1), prox(1)}), f1.get_feature("a b c d e", indexFoo().element("a x b c d e"), PROXIMITY)); - EXPECT_EQUAL(comb({prox(3), prox(1), prox(1), prox(1)}), f1.get_feature("a b c d e", indexFoo().element("a x x b c d e"), PROXIMITY)); - EXPECT_EQUAL(comb({prox(4), prox(1), prox(1), prox(1)}), f1.get_feature("a b c d e", indexFoo().element("a x x x b c d e"), PROXIMITY)); - EXPECT_EQUAL(comb({prox(2), prox(2), prox(2), prox(2)}), f1.get_feature("a b c d e", indexFoo().element("a x b x c x d x e"), PROXIMITY)); - EXPECT_EQUAL(comb({prox(2), prox(2), prox(1), prox(3)}), f1.get_feature("a b c d e", indexFoo().element("a x b x c d x x e"), PROXIMITY)); -} - -TEST_F("require that field order does not affect proximity score", RankFixture) { - EXPECT_EQUAL(1.0, f1.get_feature("a b c d e", indexFoo().element("d c a b e"), PROXIMITY)); - EXPECT_EQUAL(comb({prox(2), prox(1), prox(1), prox(1)}), f1.get_feature("a b c d e", indexFoo().element("d x c a b e"), PROXIMITY)); - EXPECT_EQUAL(comb({prox(3), prox(1), prox(1), prox(1)}), f1.get_feature("a b c d e", indexFoo().element("d x x c a b e"), PROXIMITY)); - EXPECT_EQUAL(comb({prox(4), prox(1), prox(1), prox(1)}), f1.get_feature("a b c d e", indexFoo().element("d x x x c a b e"), PROXIMITY)); - EXPECT_EQUAL(comb({prox(2), prox(2), prox(2), prox(2)}), f1.get_feature("a b c d e", indexFoo().element("d x c x a x b x e"), PROXIMITY)); - EXPECT_EQUAL(comb({prox(2), prox(2), prox(1), prox(3)}), f1.get_feature("a b c d e", indexFoo().element("d x c x a b x x e"), PROXIMITY)); -} - -TEST_F("require that order score acts as expected", RankFixture) { - EXPECT_EQUAL(1.0, f1.get_feature("a b c d e", indexFoo().element("a b c d e"), ORDER)); - EXPECT_EQUAL(comb({1.0, 1.0, 1.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("a b c e d"), ORDER)); - EXPECT_EQUAL(comb({0.0, 1.0, 1.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("b a c e d"), ORDER)); - EXPECT_EQUAL(comb({0.0, 1.0, 0.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("b a e d c"), ORDER)); - EXPECT_EQUAL(comb({0.0, 0.0, 0.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("e d c b a"), ORDER)); -} - -TEST_F("require that proximity does not affect order score", RankFixture) { - EXPECT_EQUAL(1.0, f1.get_feature("a b c d e", indexFoo().element("a b c d e"), ORDER)); - EXPECT_EQUAL(comb({1.0, 1.0, 1.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("a x b x c x e x d"), ORDER)); - EXPECT_EQUAL(comb({0.0, 1.0, 1.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("b x a x c x e x d"), ORDER)); - EXPECT_EQUAL(comb({0.0, 1.0, 0.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("b x a x e x d x c"), ORDER)); - EXPECT_EQUAL(comb({0.0, 0.0, 0.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("e x d x c x b x a"), ORDER)); -} - -TEST_F("require that query coverage acts as expected", RankFixture) { - EXPECT_EQUAL(5.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a b c d e"), QUERY)); - EXPECT_EQUAL(4.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a b c d"), QUERY)); - EXPECT_EQUAL(3.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a b c"), QUERY)); - EXPECT_EQUAL(2.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a b"), QUERY)); - EXPECT_EQUAL(4.0/7.0, f1.get_feature("a!200 b!200 c d e", indexFoo().element("a b"), QUERY)); - EXPECT_EQUAL(2.0/7.0, f1.get_feature("a b c!500", indexFoo().element("a b"), QUERY)); - EXPECT_EQUAL(5.0/7.0, f1.get_feature("a b c!500", indexFoo().element("c"), QUERY)); -} - -TEST_F("require that field coverage acts as expected", RankFixture) { - EXPECT_EQUAL(5.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a b c d e"), FIELD)); - EXPECT_EQUAL(4.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a x c d e"), FIELD)); - EXPECT_EQUAL(3.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a b x x e"), FIELD)); - EXPECT_EQUAL(2.0/5.0, f1.get_feature("a b c d e", indexFoo().element("x x x d e"), FIELD)); -} - -TEST_F("require that first unique match is used per query term", RankFixture) { - EXPECT_EQUAL(prox(3), f1.get_feature("a b", indexFoo().element("a a a b"), PROXIMITY)); - EXPECT_EQUAL(1.0, f1.get_feature("a b", indexFoo().element("a a a b"), ORDER)); - EXPECT_EQUAL(1.0, f1.get_feature("a b", indexFoo().element("a a a b"), QUERY)); - EXPECT_EQUAL(2.0/4.0, f1.get_feature("a b", indexFoo().element("a a a b"), FIELD)); - - EXPECT_EQUAL(comb({prox(1), prox(2)}), f1.get_feature("a b a", indexFoo().element("a a a b"), PROXIMITY)); - EXPECT_EQUAL(0.5, f1.get_feature("a b a", indexFoo().element("a a a b"), ORDER)); - EXPECT_EQUAL(1.0, f1.get_feature("a b a", indexFoo().element("a a a b"), QUERY)); - EXPECT_EQUAL(3.0/4.0, f1.get_feature("a b a", indexFoo().element("a a a b"), FIELD)); -} - -TEST_F("require that default score combines individual signals appropriately", RankFixture) { - EXPECT_EQUAL(comb({prox(1), prox(3), prox(2)}), f1.get_feature("a b c d e", indexFoo().element("a c x x b x d"), PROXIMITY)); - EXPECT_EQUAL(comb({1.0, 0.0, 1.0}), f1.get_feature("a b c d e", indexFoo().element("a c x x b x d"), ORDER)); - EXPECT_EQUAL(4.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a c x x b x d"), QUERY)); - EXPECT_EQUAL(4.0/7.0, f1.get_feature("a b c d e", indexFoo().element("a c x x b x d"), FIELD)); - EXPECT_EQUAL(mix(comb({prox(1), prox(3), prox(2)}), comb({1.0, 0.0, 1.0}), 4.0/5.0, 4.0/7.0), +TEST(ElementSimilarityFeatureTest, require_that_no_match_gives_zero_outputs) +{ + RankFixture f1; + EXPECT_EQ(0.0, f1.get_feature("x", indexFoo().element("y"), DEFAULT)); + EXPECT_EQ(0.0, f1.get_feature("x", indexFoo().element("y"), PROXIMITY)); + EXPECT_EQ(0.0, f1.get_feature("x", indexFoo().element("y"), ORDER)); + EXPECT_EQ(0.0, f1.get_feature("x", indexFoo().element("y"), QUERY)); + EXPECT_EQ(0.0, f1.get_feature("x", indexFoo().element("y"), FIELD)); +} + +TEST(ElementSimilarityFeatureTest, require_that_minal_perfect_match_gives_max_outputs) +{ + RankFixture f1; + EXPECT_EQ(1.0, f1.get_feature("x", indexFoo().element("x"), DEFAULT)); + EXPECT_EQ(1.0, f1.get_feature("x", indexFoo().element("x"), PROXIMITY)); + EXPECT_EQ(1.0, f1.get_feature("x", indexFoo().element("x"), ORDER)); + EXPECT_EQ(1.0, f1.get_feature("x", indexFoo().element("x"), QUERY)); + EXPECT_EQ(1.0, f1.get_feature("x", indexFoo().element("x"), FIELD)); +} + +TEST(ElementSimilarityFeatureTest, require_that_larger_perfect_match_gives_max_outputs) +{ + RankFixture f1; + EXPECT_EQ(1.0, f1.get_feature("a b c d e f g", indexFoo().element("a b c d e f g"), DEFAULT)); + EXPECT_EQ(1.0, f1.get_feature("a b c d e f g", indexFoo().element("a b c d e f g"), PROXIMITY)); + EXPECT_EQ(1.0, f1.get_feature("a b c d e f g", indexFoo().element("a b c d e f g"), ORDER)); + EXPECT_EQ(1.0, f1.get_feature("a b c d e f g", indexFoo().element("a b c d e f g"), QUERY)); + EXPECT_EQ(1.0, f1.get_feature("a b c d e f g", indexFoo().element("a b c d e f g"), FIELD)); +} + +TEST(ElementSimilarityFeatureTest, require_that_extra_query_terms_reduces_order_but_not_proximity) +{ + RankFixture f1; + EXPECT_EQ(1.0, f1.get_feature("x y", indexFoo().element("x"), PROXIMITY)); + EXPECT_EQ(1.0, f1.get_feature("x y y", indexFoo().element("x"), PROXIMITY)); + EXPECT_EQ(1.0, f1.get_feature("x y y y", indexFoo().element("x"), PROXIMITY)); + + EXPECT_EQ(0.0, f1.get_feature("x y", indexFoo().element("x"), ORDER)); + EXPECT_EQ(0.0, f1.get_feature("x y y", indexFoo().element("x"), ORDER)); + EXPECT_EQ(0.0, f1.get_feature("x y y y", indexFoo().element("x"), ORDER)); +} + +TEST(ElementSimilarityFeatureTest, require_that_extra_field_terms_reduces_proximity_but_not_order) +{ + RankFixture f1; + EXPECT_EQ(prox(2), f1.get_feature("x", indexFoo().element("x y"), PROXIMITY)); + EXPECT_EQ(prox(3), f1.get_feature("x", indexFoo().element("x y y"), PROXIMITY)); + EXPECT_EQ(prox(4), f1.get_feature("x", indexFoo().element("x y y y"), PROXIMITY)); + + EXPECT_EQ(1.0, f1.get_feature("x", indexFoo().element("x y"), ORDER)); + EXPECT_EQ(1.0, f1.get_feature("x", indexFoo().element("x y y"), ORDER)); + EXPECT_EQ(1.0, f1.get_feature("x", indexFoo().element("x y y y"), ORDER)); +} + +TEST(ElementSimilarityFeatureTest, require_that_proximity_acts_as_expected) +{ + RankFixture f1; + EXPECT_EQ(1.0, f1.get_feature("a b c d e", indexFoo().element("a b c d e"), PROXIMITY)); + EXPECT_EQ(comb({prox(2), prox(1), prox(1), prox(1)}), f1.get_feature("a b c d e", indexFoo().element("a x b c d e"), PROXIMITY)); + EXPECT_EQ(comb({prox(3), prox(1), prox(1), prox(1)}), f1.get_feature("a b c d e", indexFoo().element("a x x b c d e"), PROXIMITY)); + EXPECT_EQ(comb({prox(4), prox(1), prox(1), prox(1)}), f1.get_feature("a b c d e", indexFoo().element("a x x x b c d e"), PROXIMITY)); + EXPECT_EQ(comb({prox(2), prox(2), prox(2), prox(2)}), f1.get_feature("a b c d e", indexFoo().element("a x b x c x d x e"), PROXIMITY)); + EXPECT_EQ(comb({prox(2), prox(2), prox(1), prox(3)}), f1.get_feature("a b c d e", indexFoo().element("a x b x c d x x e"), PROXIMITY)); +} + +TEST(ElementSimilarityFeatureTest, require_that_field_order_does_not_affect_proximity_score) +{ + RankFixture f1; + EXPECT_EQ(1.0, f1.get_feature("a b c d e", indexFoo().element("d c a b e"), PROXIMITY)); + EXPECT_EQ(comb({prox(2), prox(1), prox(1), prox(1)}), f1.get_feature("a b c d e", indexFoo().element("d x c a b e"), PROXIMITY)); + EXPECT_EQ(comb({prox(3), prox(1), prox(1), prox(1)}), f1.get_feature("a b c d e", indexFoo().element("d x x c a b e"), PROXIMITY)); + EXPECT_EQ(comb({prox(4), prox(1), prox(1), prox(1)}), f1.get_feature("a b c d e", indexFoo().element("d x x x c a b e"), PROXIMITY)); + EXPECT_EQ(comb({prox(2), prox(2), prox(2), prox(2)}), f1.get_feature("a b c d e", indexFoo().element("d x c x a x b x e"), PROXIMITY)); + EXPECT_EQ(comb({prox(2), prox(2), prox(1), prox(3)}), f1.get_feature("a b c d e", indexFoo().element("d x c x a b x x e"), PROXIMITY)); +} + +TEST(ElementSimilarityFeatureTest, require_that_order_score_acts_as_expected) +{ + RankFixture f1; + EXPECT_EQ(1.0, f1.get_feature("a b c d e", indexFoo().element("a b c d e"), ORDER)); + EXPECT_EQ(comb({1.0, 1.0, 1.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("a b c e d"), ORDER)); + EXPECT_EQ(comb({0.0, 1.0, 1.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("b a c e d"), ORDER)); + EXPECT_EQ(comb({0.0, 1.0, 0.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("b a e d c"), ORDER)); + EXPECT_EQ(comb({0.0, 0.0, 0.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("e d c b a"), ORDER)); +} + +TEST(ElementSimilarityFeatureTest, require_that_proximity_does_not_affect_order_score) +{ + RankFixture f1; + EXPECT_EQ(1.0, f1.get_feature("a b c d e", indexFoo().element("a b c d e"), ORDER)); + EXPECT_EQ(comb({1.0, 1.0, 1.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("a x b x c x e x d"), ORDER)); + EXPECT_EQ(comb({0.0, 1.0, 1.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("b x a x c x e x d"), ORDER)); + EXPECT_EQ(comb({0.0, 1.0, 0.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("b x a x e x d x c"), ORDER)); + EXPECT_EQ(comb({0.0, 0.0, 0.0, 0.0}), f1.get_feature("a b c d e", indexFoo().element("e x d x c x b x a"), ORDER)); +} + +TEST(ElementSimilarityFeatureTest, require_that_query_coverage_acts_as_expected) +{ + RankFixture f1; + EXPECT_EQ(5.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a b c d e"), QUERY)); + EXPECT_EQ(4.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a b c d"), QUERY)); + EXPECT_EQ(3.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a b c"), QUERY)); + EXPECT_EQ(2.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a b"), QUERY)); + EXPECT_EQ(4.0/7.0, f1.get_feature("a!200 b!200 c d e", indexFoo().element("a b"), QUERY)); + EXPECT_EQ(2.0/7.0, f1.get_feature("a b c!500", indexFoo().element("a b"), QUERY)); + EXPECT_EQ(5.0/7.0, f1.get_feature("a b c!500", indexFoo().element("c"), QUERY)); +} + +TEST(ElementSimilarityFeatureTest, require_that_field_coverage_acts_as_expected) +{ + RankFixture f1; + EXPECT_EQ(5.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a b c d e"), FIELD)); + EXPECT_EQ(4.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a x c d e"), FIELD)); + EXPECT_EQ(3.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a b x x e"), FIELD)); + EXPECT_EQ(2.0/5.0, f1.get_feature("a b c d e", indexFoo().element("x x x d e"), FIELD)); +} + +TEST(ElementSimilarityFeatureTest, require_that_first_unique_match_is_used_per_query_term) +{ + RankFixture f1; + EXPECT_EQ(prox(3), f1.get_feature("a b", indexFoo().element("a a a b"), PROXIMITY)); + EXPECT_EQ(1.0, f1.get_feature("a b", indexFoo().element("a a a b"), ORDER)); + EXPECT_EQ(1.0, f1.get_feature("a b", indexFoo().element("a a a b"), QUERY)); + EXPECT_EQ(2.0/4.0, f1.get_feature("a b", indexFoo().element("a a a b"), FIELD)); + + EXPECT_EQ(comb({prox(1), prox(2)}), f1.get_feature("a b a", indexFoo().element("a a a b"), PROXIMITY)); + EXPECT_EQ(0.5, f1.get_feature("a b a", indexFoo().element("a a a b"), ORDER)); + EXPECT_EQ(1.0, f1.get_feature("a b a", indexFoo().element("a a a b"), QUERY)); + EXPECT_EQ(3.0/4.0, f1.get_feature("a b a", indexFoo().element("a a a b"), FIELD)); +} + +TEST(ElementSimilarityFeatureTest, require_that_default_score_combines_individual_signals_appropriately) +{ + RankFixture f1; + EXPECT_EQ(comb({prox(1), prox(3), prox(2)}), f1.get_feature("a b c d e", indexFoo().element("a c x x b x d"), PROXIMITY)); + EXPECT_EQ(comb({1.0, 0.0, 1.0}), f1.get_feature("a b c d e", indexFoo().element("a c x x b x d"), ORDER)); + EXPECT_EQ(4.0/5.0, f1.get_feature("a b c d e", indexFoo().element("a c x x b x d"), QUERY)); + EXPECT_EQ(4.0/7.0, f1.get_feature("a b c d e", indexFoo().element("a c x x b x d"), FIELD)); + EXPECT_EQ(mix(comb({prox(1), prox(3), prox(2)}), comb({1.0, 0.0, 1.0}), 4.0/5.0, 4.0/7.0), f1.get_feature("a b c d e", indexFoo().element("a c x x b x d"), DEFAULT)); - EXPECT_EQUAL(7.0 * mix(comb({prox(1), prox(3), prox(2)}), comb({1.0, 0.0, 1.0}), 4.0/5.0, 4.0/7.0), + EXPECT_EQ(7.0 * mix(comb({prox(1), prox(3), prox(2)}), comb({1.0, 0.0, 1.0}), 4.0/5.0, 4.0/7.0), f1.get_feature("a b c d e", indexFoo().element("a c x x b x d", 7), DEFAULT)); } -TEST_FF("require that max aggregation works", RankFixture, IndexFixture) { +TEST(ElementSimilarityFeatureTest, require_that_max_aggregation_works) +{ + RankFixture f1; + IndexFixture f2; f2.set("elementSimilarity(foo).output.default", "max(w)"); - EXPECT_EQUAL(5.0, f1.get_feature("x", indexFoo().element("x y", 5), DEFAULT, f2)); - EXPECT_EQUAL(5.0, f1.get_feature("x", indexFoo().element("x y", 5).element("x y", 3), DEFAULT, f2)); - EXPECT_EQUAL(5.0, f1.get_feature("x", indexFoo().element("x y", 3).element("x y", 5), DEFAULT, f2)); + EXPECT_EQ(5.0, f1.get_feature("x", indexFoo().element("x y", 5), DEFAULT, f2)); + EXPECT_EQ(5.0, f1.get_feature("x", indexFoo().element("x y", 5).element("x y", 3), DEFAULT, f2)); + EXPECT_EQ(5.0, f1.get_feature("x", indexFoo().element("x y", 3).element("x y", 5), DEFAULT, f2)); } -TEST_FF("require that avg aggregation works", RankFixture, IndexFixture) { +TEST(ElementSimilarityFeatureTest, require_that_avg_aggregation_works) +{ + RankFixture f1; + IndexFixture f2; f2.set("elementSimilarity(foo).output.default", "avg(w)"); - EXPECT_EQUAL(5.0, f1.get_feature("x", indexFoo().element("x y", 5), DEFAULT, f2)); - EXPECT_EQUAL(4.0, f1.get_feature("x", indexFoo().element("x y", 5).element("x y", 3), DEFAULT, f2)); - EXPECT_EQUAL(4.0, f1.get_feature("x", indexFoo().element("x y", 3).element("x y", 5), DEFAULT, f2)); + EXPECT_EQ(5.0, f1.get_feature("x", indexFoo().element("x y", 5), DEFAULT, f2)); + EXPECT_EQ(4.0, f1.get_feature("x", indexFoo().element("x y", 5).element("x y", 3), DEFAULT, f2)); + EXPECT_EQ(4.0, f1.get_feature("x", indexFoo().element("x y", 3).element("x y", 5), DEFAULT, f2)); } -TEST_FF("require that sum aggregation works", RankFixture, IndexFixture) { +TEST(ElementSimilarityFeatureTest, require_that_sum_aggregation_works) +{ + RankFixture f1; + IndexFixture f2; f2.set("elementSimilarity(foo).output.default", "sum(w)"); - EXPECT_EQUAL(5.0, f1.get_feature("x", indexFoo().element("x y", 5), DEFAULT, f2)); - EXPECT_EQUAL(8.0, f1.get_feature("x", indexFoo().element("x y", 5).element("x y", 3), DEFAULT, f2)); - EXPECT_EQUAL(8.0, f1.get_feature("x", indexFoo().element("x y", 3).element("x y", 5), DEFAULT, f2)); + EXPECT_EQ(5.0, f1.get_feature("x", indexFoo().element("x y", 5), DEFAULT, f2)); + EXPECT_EQ(8.0, f1.get_feature("x", indexFoo().element("x y", 5).element("x y", 3), DEFAULT, f2)); + EXPECT_EQ(8.0, f1.get_feature("x", indexFoo().element("x y", 3).element("x y", 5), DEFAULT, f2)); } -TEST_FF("require that element demultiplexing works", RankFixture, IndexFixture) { +TEST(ElementSimilarityFeatureTest, require_that_element_demultiplexing_works) +{ + RankFixture f1; + IndexFixture f2; f2.set("elementSimilarity(foo).output.default", "sum(q)"); - EXPECT_EQUAL(sum({0.25, 0.5, 0.5, 0.25, 0.5}), - f1.get_feature("x y z t", indexFoo() - .element("x") - .element("x y") - .element("x z") - .element("y") - .element("x z"), DEFAULT, f2)); + EXPECT_EQ(sum({0.25, 0.5, 0.5, 0.25, 0.5}), + f1.get_feature("x y z t", indexFoo() + .element("x") + .element("x y") + .element("x z") + .element("y") + .element("x z"), DEFAULT, f2)); } -TEST_MAIN() { TEST_RUN_ALL(); } +GTEST_MAIN_RUN_ALL_TESTS() |