diff --git a/src/core/store_expr.c b/src/core/store_expr.c
index 5e15f5350b9ca26d16564317e46957e8285fbcd3..6405002cfda3187177dc9b49dae9ce2bc8e82322 100644 (file)
--- a/src/core/store_expr.c
+++ b/src/core/store_expr.c
return status;
} /* sdb_store_expr_eval */
return status;
} /* sdb_store_expr_eval */
-bool
-sdb_store_expr_iterable(sdb_store_expr_t *expr, int context)
-{
- if (expr->type == TYPED_EXPR) {
- if ((context != SDB_HOST) && (context != SDB_SERVICE)
- && (context != SDB_METRIC))
- return 0;
- if (context == expr->data.data.integer)
- return 0;
- if ((expr->data.data.integer != SDB_SERVICE)
- && (expr->data.data.integer != SDB_METRIC)
- && (expr->data.data.integer != SDB_ATTRIBUTE))
- return 0;
- if ((context == SDB_SERVICE)
- && (expr->data.data.integer == SDB_METRIC))
- return 0;
- else if ((context == SDB_METRIC)
- && (expr->data.data.integer == SDB_SERVICE))
- return 0;
- return 1;
- }
- else if (expr->type == FIELD_VALUE) {
- if ((context != SDB_HOST) && (context != SDB_SERVICE)
- && (context != SDB_METRIC) && (context != SDB_ATTRIBUTE))
- return 0;
- if (expr->data.data.integer == SDB_FIELD_BACKEND)
- return 1;
- else if (expr->data.data.integer == SDB_FIELD_VALUE)
- /* we don't current support this just like when using
- * the attribute[<name>] syntax */
- return 0;
- }
- else if (! expr->type) {
- return !!(expr->data.type & SDB_TYPE_ARRAY);
- }
- return 0;
-} /* sdb_store_expr_iterable */
-
sdb_store_expr_iter_t *
sdb_store_expr_iter(sdb_store_expr_t *expr, sdb_store_obj_t *obj,
sdb_store_matcher_t *filter)
sdb_store_expr_iter_t *
sdb_store_expr_iter(sdb_store_expr_t *expr, sdb_store_obj_t *obj,
sdb_store_matcher_t *filter)
if (! expr)
return NULL;
if (! expr)
return NULL;
+ while (expr->type == TYPED_EXPR) {
+ int type = (int)expr->data.data.integer;
+
+ if (obj->type == type) {
+ /* self reference */
+ }
+ else if ((type == SDB_HOST)
+ && ((obj->type == SDB_SERVICE)
+ || (obj->type == SDB_METRIC))) {
+ /* reference to parent host */
+ obj = obj->parent;
+ }
+ else
+ break;
+ expr = expr->left;
+ }
+
if (expr->type == TYPED_EXPR) {
if (! obj)
return NULL;
if (expr->type == TYPED_EXPR) {
if (! obj)
return NULL;