]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: support field aliases in es compiler
authorYehuda Sadeh <yehuda@redhat.com>
Wed, 29 Mar 2017 18:22:02 +0000 (11:22 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Tue, 30 May 2017 20:24:43 +0000 (13:24 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_es_main.cc
src/rgw/rgw_es_query.cc
src/rgw/rgw_es_query.h
src/rgw/rgw_sync_module_es_rest.cc

index 2eda54dfa966c61e511a2becf5007b5debd469a0..89b2e0665fff5206c4fe243d98ece1fba2e70465 100644 (file)
@@ -34,10 +34,22 @@ int main(int argc, char *argv[])
 
   ESQueryCompiler es_query(expr, nullptr, "x-amz-meta-");
 
-  map<string, ESEntityTypeMap::EntityType> generic_map = { {"key", ESEntityTypeMap::ES_ENTITY_STR},
+  map<string, string> 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<string, ESEntityTypeMap::EntityType> 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);
 
index bff26ffe6d215bb866bedacffac2666cff87d47b..424f1e2f0ca712db7a2af2a3eada59b7adca1902 100644 (file)
@@ -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;
index d162d2568f03ff5e183ed8f2661754b0103ebcfe..f60ecd85fcb1ea663c0aafc13fd200d4135e8857 100644 (file)
@@ -100,6 +100,8 @@ class ESQueryCompiler {
   ESEntityTypeMap *generic_type_map{nullptr};
   ESEntityTypeMap *custom_type_map{nullptr};
 
+  map<string, string> *field_aliases;
+
 public:
   ESQueryCompiler(const string& query, list<pair<string, string> > *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<string, string> *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;
+  }
 };
 
 
index 20d8702451dde4827f76f63b936d09fd9b1f93ac..b8b3e98ace5aff01d07d2a3e69e7b5be8d083475 100644 (file)
@@ -150,6 +150,30 @@ void RGWMetadataSearchOp::execute()
 
   ESQueryCompiler es_query(expression, &conds, custom_prefix);
   
+  static map<string, string> 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<string, ESEntityTypeMap::EntityType> 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<string, ESEntityTypeMap::EntityType> 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;