Code

Let iterator operators fill in the left operand of child operators.
[sysdb.git] / src / core / store-private.h
index d2ea3f9a08c9f443584a4d021df97e02d1638111..2b6b09662f36a91bad7821ed8baacd152ac7e98c 100644 (file)
@@ -108,6 +108,7 @@ typedef struct {
  */
 
 enum {
+       TYPED_EXPR  = -3, /* obj type stored in data.data.integer */
        ATTR_VALUE  = -2, /* attr name stored in data.data.string */
        FIELD_VALUE = -1, /* field type stored in data.data.integer */
        /*  0: const value (stored in data) */
@@ -125,6 +126,14 @@ struct sdb_store_expr {
 
        sdb_data_t data;
 };
+#define EXPR_INIT { SDB_OBJECT_INIT, 0, -1, NULL, NULL, SDB_DATA_INIT }
+#define EXPR_TO_STRING(e) \
+       (((e)->type == TYPED_EXPR) ? "<typed>" \
+               : ((e)->type == ATTR_VALUE) ? "attribute" \
+               : ((e)->type == FIELD_VALUE) ? SDB_FIELD_TO_NAME((e)->data.data.integer) \
+               : ((e)->type == 0) ? "<constant>" \
+               : ((e)->type > 0) ? SDB_DATA_OP_TO_STRING((e)->type) \
+               : "<unknown>")
 
 /*
  * matchers
@@ -139,6 +148,7 @@ enum {
        MATCHER_ANY,
        MATCHER_ALL,
        MATCHER_IN,
+       MATCHER_NIN,
 
        /* unary operators */
        MATCHER_ISNULL,
@@ -162,6 +172,7 @@ enum {
                : ((t) == MATCHER_ANY) ? "ANY" \
                : ((t) == MATCHER_ALL) ? "ALL" \
                : ((t) == MATCHER_IN) ? "IN" \
+               : ((t) == MATCHER_NIN) ? "NOT IN" \
                : ((t) == MATCHER_ISNULL) ? "IS NULL" \
                : ((t) == MATCHER_ISNNULL) ? "IS NOT NULL" \
                : ((t) == MATCHER_LT) ? "<" \
@@ -204,7 +215,7 @@ typedef struct {
 /* iter matcher */
 typedef struct {
        sdb_store_matcher_t super;
-       int type;
+       sdb_store_expr_t *iter;
        sdb_store_matcher_t *m;
 } iter_matcher_t;
 #define ITER_M(m) ((iter_matcher_t *)(m))