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);
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;
}
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);
*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);
};
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) {
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 {
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");
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;
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) {
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;
+ }
};
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;