// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include #include #include #include #include #include #include #include #include #include #include using search::feature_t; using namespace search::fef; using namespace search::fef::test; using namespace search::features; using search::AttributeFactory; using search::IntegerAttribute; using search::FloatingPointAttribute; using AVC = search::attribute::Config; using AVBT = search::attribute::BasicType; using AVCT = search::attribute::CollectionType; using AttributePtr = search::AttributeVector::SP; using FTA = FtTestApp; using CollectionType = FieldInfo::CollectionType; struct SetupFixture { EuclideanDistanceBlueprint blueprint; IndexEnvironment indexEnv; SetupFixture() : blueprint(), indexEnv() { FieldInfo myField(FieldType::ATTRIBUTE, CollectionType::ARRAY, "myAttribute", 1); indexEnv.getFields().push_back(myField); } }; TEST_F("require that blueprint can be created from factory", SetupFixture) { EXPECT_TRUE(FTA::assertCreateInstance(f.blueprint, "euclideanDistance")); } TEST_F("require that setup succeeds with attribute source", SetupFixture) { FTA::FT_SETUP_OK(f.blueprint, f.indexEnv, StringList().add("myAttribute").add("myVector"), StringList(), StringList().add("distance")); } struct ExecFixture { BlueprintFactory factory; FtFeatureTest test; ExecFixture(const vespalib::string &feature) : factory(), test(factory, feature) { setup_search_features(factory); setupAttributeVectors(); setupQueryEnvironment(); ASSERT_TRUE(test.setup()); } void setupAttributeVectors() { std::vector attrs; attrs.push_back(AttributeFactory::createAttribute("aint", AVC(AVBT::INT32, AVCT::ARRAY))); attrs.push_back(AttributeFactory::createAttribute("afloat", AVC(AVBT::FLOAT, AVCT::ARRAY))); test.getIndexEnv().getFields().push_back(FieldInfo(FieldType::ATTRIBUTE, CollectionType::ARRAY, "aint", 0)); test.getIndexEnv().getFields().push_back(FieldInfo(FieldType::ATTRIBUTE, CollectionType::ARRAY, "afloat", 1)); for (const auto &attr : attrs) { attr->addReservedDoc(); attr->addDocs(1); test.getIndexEnv().getAttributeMap().add(attr); } IntegerAttribute *aint = static_cast(attrs[0].get()); aint->append(1, 1, 0); aint->append(1, -2, 0); aint->append(1, 3, 0); FloatingPointAttribute *afloat = static_cast(attrs[1].get()); afloat->append(1, 1.3, 0); afloat->append(1, 1.5, 0); afloat->append(1, -1.7, 0); for (const auto &attr : attrs) { attr->commit(); } } void setupQueryEnvironment() { test.getQueryEnv().getProperties().add("euclideanDistance.intquery", "[4 5 -6]"); test.getQueryEnv().getProperties().add("euclideanDistance.floatquery", "[4.1 15 0.001]"); } }; TEST_F("require that distance is calculated for integer vectors", ExecFixture("euclideanDistance(aint,intquery)")) { EXPECT_TRUE(f.test.execute(11.789826, 0.000001)); } TEST_F("require that distance is calculated for floating point vectors", ExecFixture("euclideanDistance(afloat,floatquery)")) { EXPECT_TRUE(f.test.execute(13.891846, 0.000001)); } TEST_MAIN() { TEST_RUN_ALL(); }