feat: allow querying of json objects stored as strings (#4399)

Signed-off-by: Roman Gershman <roman@dragonflydb.io>
This commit is contained in:
Roman Gershman 2025-01-06 21:20:52 +02:00 committed by GitHub
parent 1c0f22f5fa
commit 21fcf5808e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 40 additions and 3 deletions

View file

@ -657,11 +657,29 @@ bool LegacyModeIsEnabled(const std::vector<std::pair<std::string_view, WrappedJs
OpResult<std::string> OpJsonGet(const OpArgs& op_args, string_view key,
const JsonGetParams& params) {
OpResult<JsonType*> result = GetJson(op_args, key);
RETURN_ON_BAD_STATUS(result);
auto it = op_args.GetDbSlice().FindReadOnly(op_args.db_cntx, key).it;
if (!IsValid(it))
return OpStatus::KEY_NOTFOUND;
const JsonType* json_ptr = nullptr;
JsonType json;
if (it->second.ObjType() == OBJ_JSON) {
json_ptr = it->second.GetJson();
} else if (it->second.ObjType() == OBJ_STRING) {
string tmp;
it->second.GetString(&tmp);
auto parsed_json = ShardJsonFromString(tmp);
if (!parsed_json) {
return OpStatus::WRONG_TYPE;
}
json.swap(*parsed_json);
json_ptr = &json;
} else {
return OpStatus::WRONG_TYPE;
}
const auto& paths = params.paths;
const JsonType& json_entry = *(result.value());
const JsonType& json_entry = *json_ptr;
if (paths.empty()) {
// this implicitly means that we're using . which