aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/fef/featureoverride
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /searchlib/src/tests/fef/featureoverride
Publish
Diffstat (limited to 'searchlib/src/tests/fef/featureoverride')
-rw-r--r--searchlib/src/tests/fef/featureoverride/.gitignore4
-rw-r--r--searchlib/src/tests/fef/featureoverride/CMakeLists.txt8
-rw-r--r--searchlib/src/tests/fef/featureoverride/DESC1
-rw-r--r--searchlib/src/tests/fef/featureoverride/FILES1
-rw-r--r--searchlib/src/tests/fef/featureoverride/featureoverride.cpp175
5 files changed, 189 insertions, 0 deletions
diff --git a/searchlib/src/tests/fef/featureoverride/.gitignore b/searchlib/src/tests/fef/featureoverride/.gitignore
new file mode 100644
index 00000000000..35285582ceb
--- /dev/null
+++ b/searchlib/src/tests/fef/featureoverride/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+featureoverride_test
+searchlib_featureoverride_test_app
diff --git a/searchlib/src/tests/fef/featureoverride/CMakeLists.txt b/searchlib/src/tests/fef/featureoverride/CMakeLists.txt
new file mode 100644
index 00000000000..23370d51d22
--- /dev/null
+++ b/searchlib/src/tests/fef/featureoverride/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(searchlib_featureoverride_test_app
+ SOURCES
+ featureoverride.cpp
+ DEPENDS
+ searchlib
+)
+vespa_add_test(NAME searchlib_featureoverride_test_app COMMAND searchlib_featureoverride_test_app)
diff --git a/searchlib/src/tests/fef/featureoverride/DESC b/searchlib/src/tests/fef/featureoverride/DESC
new file mode 100644
index 00000000000..1605959dae6
--- /dev/null
+++ b/searchlib/src/tests/fef/featureoverride/DESC
@@ -0,0 +1 @@
+featureoverride test. Take a look at featureoverride.cpp for details.
diff --git a/searchlib/src/tests/fef/featureoverride/FILES b/searchlib/src/tests/fef/featureoverride/FILES
new file mode 100644
index 00000000000..864ca65657a
--- /dev/null
+++ b/searchlib/src/tests/fef/featureoverride/FILES
@@ -0,0 +1 @@
+featureoverride.cpp
diff --git a/searchlib/src/tests/fef/featureoverride/featureoverride.cpp b/searchlib/src/tests/fef/featureoverride/featureoverride.cpp
new file mode 100644
index 00000000000..b0929f50fa9
--- /dev/null
+++ b/searchlib/src/tests/fef/featureoverride/featureoverride.cpp
@@ -0,0 +1,175 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("featureoverride_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/searchlib/fef/fef.h>
+
+#include <vespa/searchlib/fef/test/indexenvironment.h>
+#include <vespa/searchlib/fef/test/queryenvironment.h>
+#include <vespa/searchlib/fef/test/plugin/double.h>
+#include <vespa/searchlib/fef/test/plugin/sum.h>
+#include <vespa/searchlib/features/valuefeature.h>
+
+using namespace search::fef;
+using namespace search::fef::test;
+using namespace search::features;
+using search::feature_t;
+
+typedef FeatureExecutor::LP FESP;
+typedef Blueprint::SP BPSP;
+
+struct Fixture
+{
+ MatchDataLayout mdl;
+ std::vector<FeatureExecutor::LP> executors;
+ MatchData::UP md;
+ Fixture() : mdl(), executors(), md() {}
+ Fixture &add(FeatureExecutor::LP &executor, size_t outCnt) {
+ executor->inputs_done();
+ for (uint32_t outIdx = 0; outIdx < outCnt; ++outIdx) {
+ executor->bindOutput(mdl.allocFeature());
+ }
+ executor->outputs_done();
+ executors.push_back(executor);
+ return *this;
+ }
+ Fixture &run() {
+ md = mdl.createMatchData();
+ for (const auto &executor : executors) {
+ executor->execute(*md);
+ }
+ return *this;
+ }
+ feature_t resolveFeature(FeatureHandle handle) {
+ return *md->resolveFeature(handle);
+ }
+ FESP createValueExecutor() {
+ std::vector<feature_t> values;
+ values.push_back(1.0);
+ values.push_back(2.0);
+ values.push_back(3.0);
+ return FESP(new ValueExecutor(values));
+ }
+};
+
+TEST_F("test decorator - single override", Fixture)
+{
+ FESP fe = f.createValueExecutor();
+ fe = FESP(new FeatureOverrider(fe, 1, 50.0));
+ f.add(fe, 3).run();
+ EXPECT_EQUAL(fe->outputs().size(), 3u);
+
+ EXPECT_EQUAL(f.resolveFeature(fe->outputs()[0]), 1.0);
+ EXPECT_EQUAL(f.resolveFeature(fe->outputs()[1]), 50.0);
+ EXPECT_EQUAL(f.resolveFeature(fe->outputs()[2]), 3.0);
+}
+
+TEST_F("test decorator - multiple overrides", Fixture)
+{
+ FESP fe = f.createValueExecutor();
+ fe = FESP(new FeatureOverrider(fe, 0, 50.0));
+ fe = FESP(new FeatureOverrider(fe, 2, 100.0));
+ f.add(fe, 3).run();
+ EXPECT_EQUAL(fe->outputs().size(), 3u);
+
+ EXPECT_EQUAL(f.resolveFeature(fe->outputs()[0]), 50.0);
+ EXPECT_EQUAL(f.resolveFeature(fe->outputs()[1]), 2.0);
+ EXPECT_EQUAL(f.resolveFeature(fe->outputs()[2]), 100.0);
+}
+
+TEST_F("test decorator - non-existing override", Fixture)
+{
+ FESP fe = f.createValueExecutor();
+ fe = FESP(new FeatureOverrider(fe, 1000, 50.0));
+ f.add(fe, 3).run();
+ EXPECT_EQUAL(fe->outputs().size(), 3u);
+
+ EXPECT_EQUAL(f.resolveFeature(fe->outputs()[0]), 1.0);
+ EXPECT_EQUAL(f.resolveFeature(fe->outputs()[1]), 2.0);
+ EXPECT_EQUAL(f.resolveFeature(fe->outputs()[2]), 3.0);
+}
+
+TEST_F("test decorator - transitive override", Fixture)
+{
+ FeatureExecutor::SharedInputs inputs;
+ FESP fe = f.createValueExecutor();
+ fe = FESP(new FeatureOverrider(fe, 1, 50.0));
+ f.add(fe, 3);
+ EXPECT_EQUAL(fe->outputs().size(), 3u);
+
+ FESP fe2 = FESP(new DoubleExecutor(3));
+ fe2->bind_shared_inputs(inputs);
+ fe2->addInput(fe->outputs()[0]);
+ fe2->addInput(fe->outputs()[1]);
+ fe2->addInput(fe->outputs()[2]);
+ fe2 = FESP(new FeatureOverrider(fe2, 2, 10.0));
+ f.add(fe2, 3).run();
+ EXPECT_EQUAL(fe2->outputs().size(), 3u);
+
+ EXPECT_EQUAL(f.resolveFeature(fe->outputs()[0]), 1.0);
+ EXPECT_EQUAL(f.resolveFeature(fe->outputs()[1]), 50.0);
+ EXPECT_EQUAL(f.resolveFeature(fe->outputs()[2]), 3.0);
+ EXPECT_EQUAL(f.resolveFeature(fe2->outputs()[0]), 2.0);
+ EXPECT_EQUAL(f.resolveFeature(fe2->outputs()[1]), 100.0);
+ EXPECT_EQUAL(f.resolveFeature(fe2->outputs()[2]), 10.0);
+}
+
+TEST("test overrides")
+{
+ BlueprintFactory bf;
+ bf.addPrototype(BPSP(new ValueBlueprint()));
+ bf.addPrototype(BPSP(new DoubleBlueprint()));
+ bf.addPrototype(BPSP(new SumBlueprint()));
+
+ IndexEnvironment idxEnv;
+ RankSetup rs(bf, idxEnv);
+
+ rs.addDumpFeature("value(1,2,3)");
+ rs.addDumpFeature("double(value(1))");
+ rs.addDumpFeature("double(value(2))");
+ rs.addDumpFeature("double(value(3))");
+ rs.addDumpFeature("mysum(value(2),value(2))");
+ rs.addDumpFeature("mysum(value(1),value(2),value(3))");
+ EXPECT_TRUE(rs.compile());
+
+ RankProgram::UP rankProgram = rs.create_dump_program();
+
+ MatchDataLayout mdl;
+ QueryEnvironment queryEnv;
+ Properties overrides;
+
+ overrides.add("value(2)", "20.0");
+ overrides.add("value(1,2,3).1", "4.0");
+ overrides.add("value(1,2,3).2", "6.0");
+ overrides.add("bogus(feature)", "10.0");
+
+ rankProgram->setup(mdl, queryEnv, overrides);
+ rankProgram->run(2);
+
+ std::map<vespalib::string, feature_t> res = Utils::getAllFeatures(*rankProgram);
+
+ EXPECT_EQUAL(res.size(), 20u);
+ EXPECT_APPROX(res["value(1)"], 1.0, 1e-6);
+ EXPECT_APPROX(res["value(1).0"], 1.0, 1e-6);
+ EXPECT_APPROX(res["value(2)"], 20.0, 1e-6);
+ EXPECT_APPROX(res["value(2).0"], 20.0, 1e-6);
+ EXPECT_APPROX(res["value(3)"], 3.0, 1e-6);
+ EXPECT_APPROX(res["value(3).0"], 3.0, 1e-6);
+ EXPECT_APPROX(res["value(1,2,3)"], 1.0, 1e-6);
+ EXPECT_APPROX(res["value(1,2,3).0"], 1.0, 1e-6);
+ EXPECT_APPROX(res["value(1,2,3).1"], 4.0, 1e-6);
+ EXPECT_APPROX(res["value(1,2,3).2"], 6.0, 1e-6);
+ EXPECT_APPROX(res["mysum(value(2),value(2))"], 40.0, 1e-6);
+ EXPECT_APPROX(res["mysum(value(2),value(2)).out"], 40.0, 1e-6);
+ EXPECT_APPROX(res["mysum(value(1),value(2),value(3))"], 24.0, 1e-6);
+ EXPECT_APPROX(res["mysum(value(1),value(2),value(3)).out"], 24.0, 1e-6);
+ EXPECT_APPROX(res["double(value(1))"], 2.0, 1e-6);
+ EXPECT_APPROX(res["double(value(1)).0"], 2.0, 1e-6);
+ EXPECT_APPROX(res["double(value(2))"], 40.0, 1e-6);
+ EXPECT_APPROX(res["double(value(2)).0"], 40.0, 1e-6);
+ EXPECT_APPROX(res["double(value(3))"], 6.0, 1e-6);
+ EXPECT_APPROX(res["double(value(3)).0"], 6.0, 1e-6);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }