diff options
author | Haavard <havardpe@yahoo-inc.com> | 2017-02-24 10:30:19 +0000 |
---|---|---|
committer | Haavard <havardpe@yahoo-inc.com> | 2017-02-24 11:21:16 +0000 |
commit | 29f34e5800df9e2d249d94ec37887bd2faca5443 (patch) | |
tree | 0079853cfa24d62b3e4da7bf21f9fc3d07aa9863 /searchlib/src/tests/fef | |
parent | 1168e338f728b9769a69718dad34ca0f33859261 (diff) |
add more testing of appropriate lazyness
Diffstat (limited to 'searchlib/src/tests/fef')
-rw-r--r-- | searchlib/src/tests/fef/rank_program/rank_program_test.cpp | 79 |
1 files changed, 71 insertions, 8 deletions
diff --git a/searchlib/src/tests/fef/rank_program/rank_program_test.cpp b/searchlib/src/tests/fef/rank_program/rank_program_test.cpp index 045fee9b6ec..07f82db390e 100644 --- a/searchlib/src/tests/fef/rank_program/rank_program_test.cpp +++ b/searchlib/src/tests/fef/rank_program/rank_program_test.cpp @@ -7,6 +7,7 @@ #include <vespa/searchlib/fef/test/indexenvironment.h> #include <vespa/searchlib/fef/test/queryenvironment.h> #include <vespa/searchlib/fef/test/plugin/sum.h> +#include <vespa/searchlib/fef/test/plugin/double.h> #include <vespa/searchlib/fef/rank_program.h> #include <vespa/searchlib/fef/test/test_features.h> @@ -63,14 +64,17 @@ struct Fixture { BlueprintResolver::SP resolver; Properties overrides; RankProgram program; + size_t track_cnt; Fixture() : factory(), indexEnv(), resolver(new BlueprintResolver(factory, indexEnv)), - overrides(), program(resolver) + overrides(), program(resolver), track_cnt(0) { - factory.addPrototype(Blueprint::SP(new ValueBlueprint())); + factory.addPrototype(Blueprint::SP(new BoxingBlueprint())); + factory.addPrototype(Blueprint::SP(new DocidBlueprint())); + factory.addPrototype(Blueprint::SP(new DoubleBlueprint())); factory.addPrototype(Blueprint::SP(new ImpureValueBlueprint())); factory.addPrototype(Blueprint::SP(new SumBlueprint())); - factory.addPrototype(Blueprint::SP(new DocidBlueprint())); - factory.addPrototype(Blueprint::SP(new BoxingBlueprint())); + factory.addPrototype(Blueprint::SP(new TrackingBlueprint(track_cnt))); + factory.addPrototype(Blueprint::SP(new ValueBlueprint())); } Fixture &add(const vespalib::string &feature) { resolver->addSeed(feature); @@ -92,20 +96,20 @@ struct Fixture { EXPECT_EQUAL(1u, result.num_features()); return result.resolve(0).as_number(docid); } - double get(const vespalib::string &feature) { + double get(const vespalib::string &feature, uint32_t docid = default_docid) { auto result = program.get_seeds(); for (size_t i = 0; i < result.num_features(); ++i) { if (result.name_of(i) == feature) { - return result.resolve(i).as_number(default_docid); + return result.resolve(i).as_number(docid); } } return 31212.0; } - std::map<vespalib::string, double> all() { + std::map<vespalib::string, double> all(uint32_t docid = default_docid) { auto result = program.get_seeds(); std::map<vespalib::string, double> result_map; for (size_t i = 0; i < result.num_features(); ++i) { - result_map[result.name_of(i)] = result.resolve(i).as_number(default_docid); + result_map[result.name_of(i)] = result.resolve(i).as_number(docid); } return result_map; } @@ -183,6 +187,65 @@ TEST_F("require that the rank program can calculate scores for multiple document EXPECT_EQUAL(f1.get(1), 11.0); } +TEST_F("require that only non-const features are calculated per document", Fixture()) { + f1.add("track(mysum(track(value(10)),track(ivalue(5))))").compile(); + EXPECT_EQUAL(6u, f1.program.num_executors()); + EXPECT_EQUAL(6u, count_features(f1.program)); + EXPECT_EQUAL(2u, count_const_features(f1.program)); + EXPECT_EQUAL(f1.track_cnt, 1u); + EXPECT_EQUAL(15.0, f1.get(1)); + EXPECT_EQUAL(f1.track_cnt, 3u); + EXPECT_EQUAL(15.0, f1.get(2)); + EXPECT_EQUAL(f1.track_cnt, 5u); +} + +TEST_F("require that unused features are not calculated", Fixture()) { + f1.add("track(ivalue(1))"); + f1.add("track(ivalue(2))"); + f1.compile(); + EXPECT_EQUAL(4u, f1.program.num_executors()); + EXPECT_EQUAL(4u, count_features(f1.program)); + EXPECT_EQUAL(0u, count_const_features(f1.program)); + EXPECT_EQUAL(f1.track_cnt, 0u); + EXPECT_EQUAL(f1.get("track(ivalue(1))", 1), 1.0); + EXPECT_EQUAL(f1.track_cnt, 1u); + EXPECT_EQUAL(f1.get("track(ivalue(2))", 2), 2.0); + EXPECT_EQUAL(f1.track_cnt, 2u); + EXPECT_EQUAL(f1.get("track(ivalue(1))", 3), 1.0); + EXPECT_EQUAL(f1.get("track(ivalue(2))", 3), 2.0); + EXPECT_EQUAL(f1.track_cnt, 4u); +} + +TEST_F("require that re-used features are only calculated once", Fixture()) { + f1.add("track(mysum(track(ivalue(1)),track(ivalue(1))))").compile(); + EXPECT_EQUAL(4u, f1.program.num_executors()); + EXPECT_EQUAL(4u, count_features(f1.program)); + EXPECT_EQUAL(0u, count_const_features(f1.program)); + EXPECT_EQUAL(f1.track_cnt, 0u); + EXPECT_EQUAL(f1.get(1), 2.0); + EXPECT_EQUAL(f1.track_cnt, 2u); +} + +TEST_F("require that overrides of const features work for multiple documents", Fixture()) { + f1.add("mysum(value(1),docid)").override("value(1)", 10.0).compile(); + EXPECT_EQUAL(3u, f1.program.num_executors()); + EXPECT_EQUAL(3u, count_features(f1.program)); + EXPECT_EQUAL(1u, count_const_features(f1.program)); + EXPECT_EQUAL(11.0, f1.get(1)); + EXPECT_EQUAL(12.0, f1.get(2)); + EXPECT_EQUAL(13.0, f1.get(3)); +} + +TEST_F("require that overrides of non-const features work for multiple documents", Fixture()) { + f1.add("mysum(docid,ivalue(1))").override("ivalue(1)", 10.0).compile(); + EXPECT_EQUAL(3u, f1.program.num_executors()); + EXPECT_EQUAL(3u, count_features(f1.program)); + EXPECT_EQUAL(0u, count_const_features(f1.program)); + EXPECT_EQUAL(11.0, f1.get(1)); + EXPECT_EQUAL(12.0, f1.get(2)); + EXPECT_EQUAL(13.0, f1.get(3)); +} + TEST_F("require that auto-unboxing of const object values work", Fixture()) { f1.add("box(value(10))").compile(); EXPECT_EQUAL(10.0, f1.get()); |