From: Yehuda Sadeh Date: Wed, 29 Mar 2017 18:22:02 +0000 (-0700) Subject: rgw: support field aliases in es compiler X-Git-Tag: ses5-milestone6~9^2~3^2~48 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=484fd2b8cbe07a55e867efb4624ff8c745f818b6;p=ceph.git rgw: support field aliases in es compiler Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_es_main.cc b/src/rgw/rgw_es_main.cc index 2eda54dfa966..89b2e0665fff 100644 --- a/src/rgw/rgw_es_main.cc +++ b/src/rgw/rgw_es_main.cc @@ -34,10 +34,22 @@ int main(int argc, char *argv[]) ESQueryCompiler es_query(expr, nullptr, "x-amz-meta-"); - map generic_map = { {"key", ESEntityTypeMap::ES_ENTITY_STR}, + map aliases = { { "key", "name" }, + { "etag", "meta.etag" }, + { "size", "meta.size" }, + { "mtime", "meta.mtime" }, + { "lastmodified", "meta.mtime" }, + { "contenttype", "meta.contenttype" }, + }; + es_query.set_field_aliases(&aliases); + + map generic_map = { {"bucket", ESEntityTypeMap::ES_ENTITY_STR}, + {"name", ESEntityTypeMap::ES_ENTITY_STR}, {"instance", ESEntityTypeMap::ES_ENTITY_STR}, - {"lastmodified", ESEntityTypeMap::ES_ENTITY_DATE}, - {"size", ESEntityTypeMap::ES_ENTITY_DATE} }; + {"meta.etag", ESEntityTypeMap::ES_ENTITY_STR}, + {"meta.contenttype", ESEntityTypeMap::ES_ENTITY_STR}, + {"meta.mtime", ESEntityTypeMap::ES_ENTITY_DATE}, + {"meta.size", ESEntityTypeMap::ES_ENTITY_INT} }; ESEntityTypeMap gm(generic_map); es_query.set_generic_type_map(&gm); diff --git a/src/rgw/rgw_es_query.cc b/src/rgw/rgw_es_query.cc index bff26ffe6d21..424f1e2f0ca7 100644 --- a/src/rgw/rgw_es_query.cc +++ b/src/rgw/rgw_es_query.cc @@ -219,10 +219,11 @@ class ESQueryNode_Op : public ESQueryNode { protected: string op; string field; + string str_val; ESQueryNodeLeafVal *val{nullptr}; ESEntityTypeMap::EntityType entity_type{ESEntityTypeMap::ES_ENTITY_NONE}; - bool val_from_str(const string& str_val, string *perr) { + bool val_from_str(string *perr) { switch (entity_type) { case ESEntityTypeMap::ES_ENTITY_DATE: val = new ESQueryNodeLeafVal_Date; @@ -235,13 +236,25 @@ protected: } return val->init(str_val, perr); } + bool do_init(ESQueryNode **pnode, string *perr) { + field = compiler->unalias_field(field); + ESQueryNode *effective_node; + if (!handle_nested(&effective_node, perr)) { + return false; + } + if (!val_from_str(perr)) { + return false; + } + *pnode = effective_node; + return true; + } + public: ESQueryNode_Op(ESQueryCompiler *compiler) : ESQueryNode(compiler) {} ~ESQueryNode_Op() { delete val; } virtual bool init(ESQueryStack *s, ESQueryNode **pnode, string *perr) override { - string str_val; bool valid = s->pop(&op) && s->pop(&str_val) && s->pop(&field); @@ -249,15 +262,7 @@ public: *perr = "invalid expression"; return false; } - ESQueryNode *effective_node; - if (!handle_nested(&effective_node, perr)) { - return false; - } - if (!val_from_str(str_val, perr)) { - return false; - } - *pnode = effective_node; - return true; + return do_init(pnode, perr); } bool handle_nested(ESQueryNode **pnode, string *perr); @@ -265,7 +270,6 @@ public: }; class ESQueryNode_Op_Equal : public ESQueryNode_Op { - string str_val; public: ESQueryNode_Op_Equal(ESQueryCompiler *compiler) : ESQueryNode_Op(compiler) {} ESQueryNode_Op_Equal(ESQueryCompiler *compiler, const string& f, const string& v) : ESQueryNode_Op(compiler) { @@ -278,7 +282,7 @@ public: if (op.empty()) { return ESQueryNode_Op::init(s, pnode, perr); } - return val_from_str(str_val, perr); + return do_init(pnode, perr); } virtual void dump(Formatter *f) const { @@ -322,7 +326,7 @@ public: virtual void dump(Formatter *f) const { f->open_object_section("nested"); - string s = string("custom-") + type_str(); + string s = string("meta.custom-") + type_str(); encode_json("path", s.c_str(), f); f->open_object_section("query"); f->open_object_section("bool"); @@ -628,7 +632,12 @@ bool ESQueryCompiler::compile(string *perr) { for (auto& c : eq_conds) { ESQueryNode_Op_Equal *eq_node = new ESQueryNode_Op_Equal(this, c.first, c.second); - query_root = new ESQueryNode_Bool(this, "and", eq_node, query_root); + ESQueryNode *effective_node; + if (!eq_node->init(nullptr, &effective_node, perr)) { + delete eq_node; + return false; + } + query_root = new ESQueryNode_Bool(this, "and", effective_node, query_root); } return true; diff --git a/src/rgw/rgw_es_query.h b/src/rgw/rgw_es_query.h index d162d2568f03..f60ecd85fcb1 100644 --- a/src/rgw/rgw_es_query.h +++ b/src/rgw/rgw_es_query.h @@ -100,6 +100,8 @@ class ESQueryCompiler { ESEntityTypeMap *generic_type_map{nullptr}; ESEntityTypeMap *custom_type_map{nullptr}; + map *field_aliases; + public: ESQueryCompiler(const string& query, list > *prepend_eq_conds, const string& _custom_prefix) : parser(query), custom_prefix(_custom_prefix) { if (prepend_eq_conds) { @@ -127,6 +129,22 @@ public: ESEntityTypeMap *get_custom_type_map() { return custom_type_map; } + + void set_field_aliases(map *fa) { + field_aliases = fa; + } + + string unalias_field(const string& field) { + if (!field_aliases) { + return field; + } + auto i = field_aliases->find(field); + if (i == field_aliases->end()) { + return field; + } + + return i->second; + } }; diff --git a/src/rgw/rgw_sync_module_es_rest.cc b/src/rgw/rgw_sync_module_es_rest.cc index 20d8702451dd..b8b3e98ace5a 100644 --- a/src/rgw/rgw_sync_module_es_rest.cc +++ b/src/rgw/rgw_sync_module_es_rest.cc @@ -150,6 +150,30 @@ void RGWMetadataSearchOp::execute() ESQueryCompiler es_query(expression, &conds, custom_prefix); + static map aliases = { { "key", "name" }, + { "etag", "meta.etag" }, + { "size", "meta.size" }, + { "mtime", "meta.mtime" }, + { "lastmodified", "meta.mtime" }, + { "contenttype", "meta.contenttype" }, + }; + es_query.set_field_aliases(&aliases); +#warning permissions need to be restricted value + static map generic_map = { {"bucket", ESEntityTypeMap::ES_ENTITY_STR}, + {"name", ESEntityTypeMap::ES_ENTITY_STR}, + {"instance", ESEntityTypeMap::ES_ENTITY_STR}, + {"permissions", ESEntityTypeMap::ES_ENTITY_STR}, + {"meta.etag", ESEntityTypeMap::ES_ENTITY_STR}, + {"meta.contenttype", ESEntityTypeMap::ES_ENTITY_STR}, + {"meta.mtime", ESEntityTypeMap::ES_ENTITY_DATE}, + {"meta.size", ESEntityTypeMap::ES_ENTITY_INT} }; + ESEntityTypeMap gm(generic_map); + es_query.set_generic_type_map(&gm); + + static map custom_map = { }; + ESEntityTypeMap em(custom_map); + es_query.set_custom_type_map(&em); + bool valid = es_query.compile(&err); if (!valid) { ldout(s->cct, 10) << "invalid query, failed generating request json" << dendl;