From: Yehuda Sadeh Date: Wed, 22 Mar 2017 21:01:34 +0000 (-0700) Subject: rgw: add permissions and bucket to es query X-Git-Tag: ses5-milestone6~9^2~3^2~53 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=99b49acc2e30c16d97aff1e748beb06920e22ec3;p=ceph.git rgw: add permissions and bucket to es query Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_es_query.cc b/src/rgw/rgw_es_query.cc index dd4a2c57416f..a916b86ece82 100644 --- a/src/rgw/rgw_es_query.cc +++ b/src/rgw/rgw_es_query.cc @@ -130,6 +130,7 @@ class ESQueryNode_Bool : public ESQueryNode { ESQueryNode *second{nullptr}; public: ESQueryNode_Bool() {} + ESQueryNode_Bool(const string& _op, ESQueryNode *_first, ESQueryNode *_second) : op(_op), first(_first), second(_second) {} bool init(ESQueryStack *s) { bool valid = s->pop(&op); if (!valid) { @@ -190,6 +191,11 @@ public: class ESQueryNode_Op_Equal : public ESQueryNode_Op { public: ESQueryNode_Op_Equal() {} + ESQueryNode_Op_Equal(const string& f, const string& v) { + op = "=="; + field = f; + val = v; + } virtual void dump(Formatter *f) const { f->open_object_section("term"); @@ -466,6 +472,11 @@ bool ESQueryCompiler::compile() { return false; } + for (auto& c : eq_conds) { + ESQueryNode_Op_Equal *eq_node = new ESQueryNode_Op_Equal(c.first, c.second); + query_root = new ESQueryNode_Bool("and", eq_node, query_root); + } + return true; } diff --git a/src/rgw/rgw_es_query.h b/src/rgw/rgw_es_query.h index c8b83759db6b..9767725ae99a 100644 --- a/src/rgw/rgw_es_query.h +++ b/src/rgw/rgw_es_query.h @@ -69,8 +69,14 @@ class ESQueryCompiler { bool convert(list& infix); + list > eq_conds; + public: - ESQueryCompiler(const string& query) : parser(query) {} + ESQueryCompiler(const string& query, list > *prepend_eq_conds) : parser(query) { + if (prepend_eq_conds) { + eq_conds = std::move(*prepend_eq_conds); + } + } ~ESQueryCompiler(); bool compile(); diff --git a/src/rgw/rgw_sync_module_es_rest.cc b/src/rgw/rgw_sync_module_es_rest.cc index 458e0630265d..5b43977437ff 100644 --- a/src/rgw/rgw_sync_module_es_rest.cc +++ b/src/rgw/rgw_sync_module_es_rest.cc @@ -131,7 +131,15 @@ void RGWMetadataSearchOp::execute() if (op_ret < 0) return; - ESQueryCompiler es_query(expression); + list > conds; + + conds.push_back(make_pair("permissions", s->user->user_id.to_str())); + + if (!s->bucket_name.empty()) { + conds.push_back(make_pair("bucket", s->bucket_name)); + } + + ESQueryCompiler es_query(expression, &conds); bool valid = es_query.compile(); if (!valid) { @@ -204,6 +212,7 @@ public: for (auto& i : response.hits.hits) { es_index_obj_response& e = i.source; s->formatter->open_object_section("Contents"); + s->formatter->dump_string("Bucket", e.bucket); s->formatter->dump_string("Key", e.key.name); string instance = (!e.key.instance.empty() ? e.key.instance : "null"); s->formatter->dump_string("Instance", instance.c_str());