mirror of https://gitee.com/bigwinds/arangodb
Bug fix/fix cluster tests for analyzers (#9370)
* Fixed analyzer definition in test (definition should be object). Fixed proper reporting of invalid parameter error. * Restored ability to parse string-encoded json object in analyzers rest hadler. Test was reverted to pass string again. * Fixed test run * Get rid of shared ptr to simplify code.
This commit is contained in:
parent
9cb08ded92
commit
1f8099e295
|
@ -113,14 +113,21 @@ void RestAnalyzerHandler::createAnalyzer( // create
|
|||
}
|
||||
|
||||
type = getStringRef(typeSlice);
|
||||
|
||||
auto const properties = body.get(StaticStrings::AnalyzerPropertiesField);
|
||||
|
||||
|
||||
std::shared_ptr<VPackBuilder> propertiesFromStringBuilder;
|
||||
auto properties = body.get(StaticStrings::AnalyzerPropertiesField);
|
||||
if(properties.isString()) { // string still could be parsed to an object
|
||||
auto string_ref = getStringRef(properties);
|
||||
propertiesFromStringBuilder = arangodb::velocypack::Parser::fromJson(string_ref);
|
||||
properties = propertiesFromStringBuilder->slice();
|
||||
}
|
||||
|
||||
if (!properties.isNone() && !properties.isObject()) { // optional parameter
|
||||
generateError(arangodb::Result( // generate error
|
||||
TRI_ERROR_BAD_PARAMETER, // code
|
||||
"invalid 'properties', expecting body to be of the form { name: <string>, type: <string>[, properties: <object>[, features: <string-array>]] }"
|
||||
));
|
||||
return;
|
||||
}
|
||||
|
||||
irs::flags features;
|
||||
|
|
|
@ -301,25 +301,29 @@ void JS_Create(v8::FunctionCallbackInfo<v8::Value> const& args) {
|
|||
|
||||
auto type = TRI_ObjectToString(isolate, args[1]);
|
||||
|
||||
std::shared_ptr<VPackBuilder> properties;
|
||||
VPackSlice propertiesSlice = VPackSlice::emptyObjectSlice();
|
||||
VPackBuilder propertiesBuilder;
|
||||
|
||||
if (args.Length() > 2) { // have properties
|
||||
if (args[2]->IsString()) {
|
||||
std::string const propertiesBuf = TRI_ObjectToString(isolate, args[2]);
|
||||
properties = arangodb::velocypack::Parser::fromJson(propertiesBuf);
|
||||
arangodb::velocypack::Parser(propertiesBuilder).parse(propertiesBuf);
|
||||
propertiesSlice = propertiesBuilder.slice();
|
||||
} else if (args[2]->IsObject()) {
|
||||
auto value = args[2]->ToObject(TRI_IGETC).FromMaybe(v8::Local<v8::Object>());
|
||||
properties = std::make_shared<VPackBuilder>();
|
||||
auto res = TRI_V8ToVPack(isolate, *properties, value, false);
|
||||
|
||||
auto res = TRI_V8ToVPack(isolate, propertiesBuilder, value, false);
|
||||
if (TRI_ERROR_NO_ERROR != res) {
|
||||
TRI_V8_THROW_EXCEPTION(res);
|
||||
}
|
||||
|
||||
propertiesSlice = propertiesBuilder.slice();
|
||||
} else if (!args[2]->IsNull()) {
|
||||
TRI_V8_THROW_TYPE_ERROR("<properties> must be an object");
|
||||
}
|
||||
}
|
||||
// properties at the end should be parsed into object
|
||||
if (!propertiesSlice.isObject()) {
|
||||
TRI_V8_THROW_TYPE_ERROR("<properties> must be an object");
|
||||
}
|
||||
|
||||
irs::flags features;
|
||||
|
||||
|
@ -362,7 +366,7 @@ void JS_Create(v8::FunctionCallbackInfo<v8::Value> const& args) {
|
|||
try {
|
||||
arangodb::iresearch::IResearchAnalyzerFeature::EmplaceResult result;
|
||||
auto res = analyzers->emplace(result, name, type,
|
||||
properties.use_count() ? properties->slice() : VPackSlice::emptyObjectSlice(),
|
||||
propertiesSlice,
|
||||
features);
|
||||
|
||||
if (!res.ok()) {
|
||||
|
|
|
@ -185,14 +185,14 @@ TEST_F(RestAnalyzerHandlerTest, test_create) {
|
|||
{
|
||||
const auto name = arangodb::StaticStrings::SystemDatabase + "::testAnalyzer1";
|
||||
ASSERT_TRUE(analyzers->emplace(result, name, "identity",
|
||||
VPackParser::fromJson("\"abc\"")->slice())
|
||||
VPackParser::fromJson("{\"args\":\"abc\"}")->slice())
|
||||
.ok());
|
||||
}
|
||||
|
||||
{
|
||||
const auto name = arangodb::StaticStrings::SystemDatabase + "::emptyAnalyzer";
|
||||
ASSERT_TRUE(analyzers->emplace(result, name, "rest-analyzer-empty",
|
||||
VPackParser::fromJson("\"en\"")->slice(),
|
||||
VPackParser::fromJson("{\"args\":\"en\"}")->slice(),
|
||||
irs::flags{irs::frequency::type()})
|
||||
.ok());
|
||||
}
|
||||
|
@ -438,7 +438,7 @@ TEST_F(RestAnalyzerHandlerTest, test_create) {
|
|||
request._payload.openObject();
|
||||
request._payload.add("name", arangodb::velocypack::Value("emptyAnalyzer"));
|
||||
request._payload.add("type", arangodb::velocypack::Value("rest-analyzer-empty"));
|
||||
request._payload.add("properties", arangodb::velocypack::Value("abc"));
|
||||
request._payload.add("properties", arangodb::velocypack::Value("{\"args\":\"abc\"}"));
|
||||
request._payload.close();
|
||||
|
||||
arangodb::auth::UserMap userMap; // empty map, no user -> no permissions
|
||||
|
@ -481,7 +481,7 @@ TEST_F(RestAnalyzerHandlerTest, test_create) {
|
|||
request._payload.openObject();
|
||||
request._payload.add("name", VPackValue("testAnalyzer1"));
|
||||
request._payload.add("type", VPackValue("identity"));
|
||||
request._payload.add("properties", VPackValue(arangodb::velocypack::ValueType::Null));
|
||||
request._payload.add("properties", VPackSlice::noneSlice());
|
||||
request._payload.close();
|
||||
|
||||
arangodb::auth::UserMap userMap; // empty map, no user -> no permissions
|
||||
|
@ -522,7 +522,7 @@ TEST_F(RestAnalyzerHandlerTest, test_create) {
|
|||
request._payload.openObject();
|
||||
request._payload.add("name", VPackValue("testAnalyzer2"));
|
||||
request._payload.add("type", VPackValue("identity"));
|
||||
request._payload.add("properties", arangodb::velocypack::Value("abc"));
|
||||
request._payload.add("properties", arangodb::velocypack::Value("{\"args\":\"abc\"}"));
|
||||
request._payload.close();
|
||||
|
||||
arangodb::auth::UserMap userMap; // empty map, no user -> no permissions
|
||||
|
@ -565,7 +565,7 @@ TEST_F(RestAnalyzerHandlerTest, test_create) {
|
|||
request._payload.openObject();
|
||||
request._payload.add("name", arangodb::velocypack::Value("testAnalyzer2"));
|
||||
request._payload.add("type", arangodb::velocypack::Value("identity"));
|
||||
request._payload.add("properties", arangodb::velocypack::Value("abc"));
|
||||
request._payload.add("properties", arangodb::velocypack::Value("{\"args\":\"abc\"}"));
|
||||
request._payload.close();
|
||||
|
||||
arangodb::auth::UserMap userMap; // empty map, no user -> no permissions
|
||||
|
|
|
@ -717,7 +717,7 @@ TEST_F(V8AnalyzersTest, test_create) {
|
|||
{
|
||||
const auto name = arangodb::StaticStrings::SystemDatabase + "::emptyAnalyzer";
|
||||
ASSERT_TRUE(analyzers->emplace(result, name, "v8-analyzer-empty",
|
||||
VPackParser::fromJson("\"en\"")->slice(),
|
||||
VPackParser::fromJson("{\"args\":\"12312\"}")->slice(),
|
||||
irs::flags{irs::frequency::type()}).ok());
|
||||
}
|
||||
|
||||
|
@ -1050,7 +1050,7 @@ TEST_F(V8AnalyzersTest, test_create) {
|
|||
std::vector<v8::Local<v8::Value>> args = {
|
||||
TRI_V8_STD_STRING(isolate.get(), "emptyAnalyzer"s),
|
||||
TRI_V8_ASCII_STRING(isolate.get(), "v8-analyzer-empty"),
|
||||
TRI_V8_ASCII_STRING(isolate.get(), "\"abc\""),
|
||||
TRI_V8_ASCII_STRING(isolate.get(), "{\"abc\":1}"),
|
||||
};
|
||||
|
||||
arangodb::auth::UserMap userMap; // empty map, no user -> no permissions
|
||||
|
@ -1168,7 +1168,7 @@ TEST_F(V8AnalyzersTest, test_create) {
|
|||
std::vector<v8::Local<v8::Value>> args = {
|
||||
TRI_V8_STD_STRING(isolate.get(), "testAnalyzer2"s),
|
||||
TRI_V8_ASCII_STRING(isolate.get(), "identity"),
|
||||
TRI_V8_ASCII_STRING(isolate.get(), "\"abc\""),
|
||||
TRI_V8_ASCII_STRING(isolate.get(), "{\"abc\":1}"),
|
||||
};
|
||||
|
||||
arangodb::auth::UserMap userMap; // empty map, no user -> no permissions
|
||||
|
@ -1226,7 +1226,7 @@ TEST_F(V8AnalyzersTest, test_create) {
|
|||
std::vector<v8::Local<v8::Value>> args = {
|
||||
TRI_V8_STD_STRING(isolate.get(), "testAnalyzer2"s),
|
||||
TRI_V8_ASCII_STRING(isolate.get(), "identity"),
|
||||
TRI_V8_ASCII_STRING(isolate.get(), "\"abc\"")
|
||||
TRI_V8_ASCII_STRING(isolate.get(), "{\"abc\":1}")
|
||||
};
|
||||
|
||||
arangodb::auth::UserMap userMap; // empty map, no user -> no permissions
|
||||
|
|
Loading…
Reference in New Issue