Changeset: 413a6264f93a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/413a6264f93a
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/rel_tvtree.c
        sql/backends/monet5/rel_tvtree.h
Branch: tvtree
Log Message:

tv_tree now supports multiset/arrayof for composite types


diffs (183 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -828,6 +828,8 @@ tuple_result(backend *be, list *cols)
 static stmt *
 value_list(backend *be, sql_exp *vals_exp, stmt *left, stmt *sel)
 {
+       if (!be) return NULL;
+
        assert(is_values(vals_exp));
        list *vals = exp_get_values(vals_exp);
        sql_subtype *type = exp_subtype(vals_exp);
@@ -877,6 +879,8 @@ value_list(backend *be, sql_exp *vals_ex
 static stmt *
 value_tvtree(backend *be, sql_exp *vals_exp, stmt *left, stmt *sel)
 {
+       if (!be) return NULL;
+
        assert(is_values(vals_exp));
        list *vals = exp_get_values(vals_exp);
        sql_subtype *st = exp_subtype(vals_exp);
@@ -1866,8 +1870,9 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        assert(vname->name);
                        s = stmt_var(be, vname->sname ? a_create(sql->sa, 
sa_strdup(sql->sa, vname->sname)) : NULL, sa_strdup(sql->sa, vname->name), 
e->tpe.type?&e->tpe:NULL, 0, e->flag);
                } else if (e->f) {              /* values */
-                       s = value_list(be, e, left, sel);
-                       /*s = value_tvtree(be, e, left, sel);*/
+                       // TODO: >>>>>>>>>>>>>>>>>>>> remove value_list and 
friends
+                       value_list(NULL, e, left, sel);
+                       s = value_tvtree(be, e, left, sel);
                } else {                        /* arguments */
                        sql_subtype *t = e->tpe.type?&e->tpe:NULL;
                        if (!t && 0) {
diff --git a/sql/backends/monet5/rel_tvtree.c b/sql/backends/monet5/rel_tvtree.c
--- a/sql/backends/monet5/rel_tvtree.c
+++ b/sql/backends/monet5/rel_tvtree.c
@@ -42,6 +42,7 @@ tv_node(allocator *sa, sql_subtype *st)
 
        n->st = st;
        n->tvt = tv_get_type(st);
+       n->rid_idx = 0;
        n->cf = n->rid = n->msid = n->msnr = n->vals = NULL;
 
        /* allocate only the lists that we need based on tv-tree type */
@@ -113,12 +114,48 @@ tv_tuple_value(backend *be, tv_tree *t, 
                        assert(!tuple->f);
                        stmt *i = exp_bin(be, tuple, left, NULL, NULL, NULL, 
NULL, sel, 0, 0, 0);
                        if (!i)
-                               return NULL;
+                               return false;
+                       assert(t->vals);
                        list_append(t->vals, i);
                        break;
                case TV_MS_COMP:
                case TV_SO_COMP:
-                       // TODO
+                       assert(tuple->f);
+
+                       /* add the rowid to the mset "origin" table */
+                       stmt *rid = stmt_atom_int(be, t->rid_idx);
+                       if (!rid)
+                               return false;
+                       assert(t->rid);
+                       list_append(t->rid, rid);
+
+                       /* per tuple insert actual data, msid(=rowid), msnr(for 
MS only) */
+                       list *ms_vals = tuple->f;
+                       for (node *n = ms_vals->h; n; n = n->next) {
+
+                               int msnr_idx = 1;  /* NOTE: in mset-value 
values are 1-offset indexed */
+                               list *cvals = ((sql_exp*)n->data)->f;
+                               for (node *m = cvals->h; m; m = m->next, 
msnr_idx++)
+                                       if (false == tv_tuple_value(be, 
list_fetch(t->cf, msnr_idx - 1), m->data, left, sel))
+                                               return false;
+
+                               stmt *msid = stmt_atom_int(be, t->rid_idx);
+                               if (!msid)
+                                       return false;
+                               list_append(t->msid, msid);
+
+                               if (t->tvt == TV_MS_COMP) {
+                                       stmt *msnr = stmt_atom_int(be, 
msnr_idx);
+                                       if (!msnr)
+                                               return false;
+                                       list_append(t->msnr, msnr);
+                               }
+                       }
+
+                       /* we inserted all the mset values for a tuple for a 
given
+                        * row so now increment this tv_tree node's (mset) 
rowid */
+                       t->rid_idx++;
+
                        break;
                case TV_COMP:
                        assert(tuple->f);
@@ -148,30 +185,59 @@ tv_parse_values(backend *be, tv_tree *t,
        return true;
 }
 
-stmt *
-tv_generate_stmts(backend *be, tv_tree *t)
+static void
+tv_generate_stmts_(backend *be, tv_tree *t, list *stmts_list)
 {
+       stmt *ap;
+
        switch (t->tvt) {
                case TV_MS_BSC:
                case TV_SO_BSC:
                        // TODO
                        break;
                case TV_BASIC:
-                       return stmt_append_bulk(be, stmt_temp(be, t->st), 
t->vals);
+                       ap = stmt_append_bulk(be, stmt_temp(be, t->st), 
t->vals);
+                       list_append(stmts_list, ap);
+                       break;
                case TV_MS_COMP:
                case TV_SO_COMP:
-                       // TODO
+                       stmt *tmp;
+
+                       tmp = stmt_temp(be, tail_type(t->rid->h->data));
+                       ap = stmt_append_bulk(be, tmp, t->rid);
+                       append(stmts_list, ap);
+
+                       for (node *n = t->cf->h; n; n = n->next)
+                               tv_generate_stmts_(be, n->data, stmts_list);
+
+                       tmp = stmt_temp(be, tail_type(t->msid->h->data));
+                       ap = stmt_append_bulk(be, tmp, t->msid);
+                       append(stmts_list, ap);
+
+                       if (t->tvt == TV_MS_COMP) {
+                               tmp = stmt_temp(be, 
tail_type(t->msnr->h->data));
+                               ap = stmt_append_bulk(be, tmp, t->msnr);
+                               append(stmts_list, ap);
+                       }
                        break;
                case TV_COMP:
                        /* gather all the composite (sub)field's statements */
-                       list *fsts = sa_list(be->mvc->sa);
                        for (node *n = t->cf->h; n; n = n->next)
-                               append(fsts, tv_generate_stmts(be, n->data));
-                       return stmt_list(be, fsts);
+                               tv_generate_stmts_(be, n->data, stmts_list);
+                       break;
                default:
                        assert(0);
                        break;
        }
+}
 
-       return NULL;
+stmt *
+tv_generate_stmts(backend *be, tv_tree *t)
+{
+       list *stmts_list = sa_list(be->mvc->sa);
+       tv_generate_stmts_(be, t, stmts_list);
+       if (t->tvt == TV_BASIC)
+               return stmts_list->h->data;
+       else
+               return stmt_list(be, stmts_list);
 }
diff --git a/sql/backends/monet5/rel_tvtree.h b/sql/backends/monet5/rel_tvtree.h
--- a/sql/backends/monet5/rel_tvtree.h
+++ b/sql/backends/monet5/rel_tvtree.h
@@ -44,11 +44,12 @@ typedef enum tv_type {
 typedef struct type_values_tree {
        tv_type tvt;
        sql_subtype *st;
-       list *cf;    // list of composite type (sub)fields
+       int rid_idx;  // mset values needs to know to which row they correspond 
to
+       list *cf;     // list of composite type (sub)fields
        /* next members are lists of stmts IF they are instantiated */
-       list *rid;
-       list *msid;
-       list *msnr;
+       list *rid;    // row id for multisets
+       list *msid;   // multiset id (always refers to a row id)
+       list *msnr;   // multiset number is the index inside a multiset entry
        list *vals;
 } tv_tree;
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to