Code

store: Added support for ALL matchers.
authorSebastian Harl <sh@tokkee.org>
Sat, 25 Oct 2014 19:43:28 +0000 (21:43 +0200)
committerSebastian Harl <sh@tokkee.org>
Sat, 25 Oct 2014 19:43:28 +0000 (21:43 +0200)
Similar to ANY, this matcher iterators over objects. It matches, if *all* of
those objects match another matcher.

src/core/store-private.h
src/core/store_lookup.c
src/include/core/store.h

index 4c38f1570bca1d449a4478fa33119e410cf33136..a0f4ec61db0ece7ebafaf1ed52a96f83db40290e 100644 (file)
@@ -136,6 +136,7 @@ enum {
        MATCHER_AND,
        MATCHER_NOT,
        MATCHER_ANY,
+       MATCHER_ALL,
        MATCHER_LT,
        MATCHER_LE,
        MATCHER_EQ,
@@ -155,6 +156,7 @@ enum {
                : ((t) == MATCHER_NOT) ? "NOT" \
                : ((t) == MATCHER_NAME) ? "NAME" \
                : ((t) == MATCHER_ANY) ? "ANY" \
+               : ((t) == MATCHER_ALL) ? "ALL" \
                : ((t) == MATCHER_LT) ? "<" \
                : ((t) == MATCHER_LE) ? "<=" \
                : ((t) == MATCHER_EQ) ? "=" \
index 11d85fea0a5ead05b42f6fffd089b6b135b0bcb9..513b6a64a7a824c5263eec708945c14a3812cfe6 100644 (file)
@@ -114,9 +114,9 @@ match_iter(sdb_store_matcher_t *m, sdb_store_obj_t *obj,
 {
        sdb_avltree_iter_t *iter = NULL;
        int status;
-       int all = 0;
+       int all = (int)(m->type == MATCHER_ALL);
 
-       assert(m->type == MATCHER_ANY);
+       assert((m->type == MATCHER_ANY) || (m->type == MATCHER_ALL));
 
        /* TODO: support all object types */
        if (obj->type != SDB_HOST)
@@ -361,6 +361,7 @@ matchers[] = {
        match_logical,
        match_unary,
        match_iter,
+       match_iter,
        match_lt,
        match_le,
        match_eq,
@@ -529,7 +530,17 @@ sdb_store_any_matcher(int type, sdb_store_matcher_t *m)
                return NULL;
        return M(sdb_object_create("any-matcher", iter_type,
                                MATCHER_ANY, type, m));
-} /* sdb_store_iter_matcher */
+} /* sdb_store_any_matcher */
+
+sdb_store_matcher_t *
+sdb_store_all_matcher(int type, sdb_store_matcher_t *m)
+{
+       if ((type != SDB_SERVICE) && (type != SDB_METRIC)
+                       && (type != SDB_ATTRIBUTE))
+               return NULL;
+       return M(sdb_object_create("all-matcher", iter_type,
+                               MATCHER_ALL, type, m));
+} /* sdb_store_all_matcher */
 
 sdb_store_matcher_t *
 sdb_store_lt_matcher(sdb_store_expr_t *left, sdb_store_expr_t *right)
index ed445c3a0533b53e40b3858e82ea0e4516188947..9ba19b8acbeb6da1ed3513ac9676080b1ba2f0bf 100644 (file)
@@ -388,6 +388,14 @@ sdb_store_isnnull_matcher(sdb_store_expr_t *expr);
 sdb_store_matcher_t *
 sdb_store_any_matcher(int type, sdb_store_matcher_t *m);
 
+/*
+ * sdb_store_all_matcher:
+ * Creates a matcher iterating over objects of the specified type. It matches
+ * if *all* of those objects match 'm'.
+ */
+sdb_store_matcher_t *
+sdb_store_all_matcher(int type, sdb_store_matcher_t *m);
+
 /*
  * sdb_store_lt_matcher, sdb_store_le_matcher, sdb_store_eq_matcher,
  * sdb_store_ge_matcher, sdb_store_gt_matcher: