aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/fef
diff options
context:
space:
mode:
authorHaavard <havardpe@yahoo-inc.com>2017-02-24 10:30:19 +0000
committerHaavard <havardpe@yahoo-inc.com>2017-02-24 11:21:16 +0000
commit29f34e5800df9e2d249d94ec37887bd2faca5443 (patch)
tree0079853cfa24d62b3e4da7bf21f9fc3d07aa9863 /searchlib/src/tests/fef
parent1168e338f728b9769a69718dad34ca0f33859261 (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.cpp79
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());