Changeset: f01342883541 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f01342883541
Modified Files:
        monetdb5/modules/kernel/algebra.c
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
Branch: groupjoin
Log Message:

handle single expression group joins via markjoin


diffs (162 lines):

diff --git a/monetdb5/modules/kernel/algebra.c 
b/monetdb5/modules/kernel/algebra.c
--- a/monetdb5/modules/kernel/algebra.c
+++ b/monetdb5/modules/kernel/algebra.c
@@ -799,6 +799,7 @@ ALGmarkjoin(bat *r1, bat *r2, const bat 
        str res = NULL;
        bit max_one = false;
        *r1 = *r2 = 0;
+       (void)any;
        (void)estimate;
        /* for now: (left) cross aggr (any-equal) */
        BAT *rr = BATdescriptor(is_bat_nil(*srid)?*rid:*srid);
@@ -814,7 +815,7 @@ ALGmarkjoin(bat *r1, bat *r2, const bat 
                } else {
                        l = BATdescriptor(*slid);
                }
-               bit v = *any?false:true;
+               bit v = false;//*any?false:true;
                BAT *m =  BATconstant( l->hseqbase, TYPE_bit, &v, BATcount(l), 
TRANSIENT);
                BBPkeepref(l);
                BBPkeepref(m);
@@ -843,10 +844,12 @@ ALGmarkjoin(bat *r1, bat *r2, const bat 
                        BBPreclaim(rp);
                        BAT *m;
 
-                       if (*any)
+                       //if (*any)
                                m = BATanyequal_grp(l, r, g, e, NULL);
+                               /*
                        else
                                m = BATallnotequal_grp(l, r, g, e, NULL);
+                               */
 
                        BBPreclaim(l);
                        BBPreclaim(r);
@@ -871,6 +874,7 @@ ALGmarkjoin(bat *r1, bat *r2, const bat 
        }
        return res;
 }
+
 static str
 ALGouterjoin(bat *r1, bat *r2, const bat *lid, const bat *rid, const bat *slid,
                         const bat *srid, const bit *nil_matches, const bit 
*match_one,
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
@@ -2785,7 +2785,7 @@ gj_outerjoin_exp(sql_rel *rel, sql_exp *
 
 #define is_equi_exp_(e) ((e)->flag == cmp_equal)
 static list *
-get_simple_equi_joins_first(mvc *sql, list *exps, bool *equality_only)
+get_simple_equi_joins_first(mvc *sql, sql_rel *rel, list *exps, bool 
*equality_only)
 {
        list *new_exps = sa_list(sql->sa);
        *equality_only = true;
@@ -2796,7 +2796,7 @@ get_simple_equi_joins_first(mvc *sql, li
        for (node *n = exps->h; n; n = n->next) {
                sql_exp *e = n->data;
 
-               if (is_equi_exp_(e) /*&& !is_any(e)*/)
+               if (can_join_exp(rel, e, false) && is_equi_exp_(e) /*&& 
!is_any(e)*/)
                        list_append(new_exps, e);
                else /*if (!is_equi_exp_(e))*/
                        *equality_only = false;
@@ -2804,7 +2804,7 @@ get_simple_equi_joins_first(mvc *sql, li
        for (node *n = exps->h; n; n = n->next) {
                sql_exp *e = n->data;
 
-               if (!is_equi_exp_(e) /*|| is_any(e)*/)
+               if (!is_equi_exp_(e) || !can_join_exp(rel, e, false) /*|| 
is_any(e)*/)
                        list_append(new_exps, e);
        }
        return new_exps;
@@ -2841,10 +2841,10 @@ rel2bin_groupjoin(backend *be, sql_rel *
        right = row2cols(be, right);
 
        bool equality_only = true;
-       list *jexps = get_simple_equi_joins_first(sql, rel->exps, 
&equality_only);
+       list *jexps = get_simple_equi_joins_first(sql, rel, rel->exps, 
&equality_only);
 
        en = jexps?jexps->h:NULL;
-       if (/*list_empty(jexps)*/ list_length(jexps) <= 1 || 
!gj_outerjoin_exp(rel, en->data)) {
+       if ((/*list_empty(jexps)*/ list_length(jexps) <= 1 || 
!gj_outerjoin_exp(rel, en->data)) && !(list_length(jexps) == 1 && 
is_equi_exp_((sql_exp*)en->data) && can_join_exp(rel, en->data, false))) {
                printf("# outer cross\n");
                stmt *l = bin_find_smallest_column(be, left);
                stmt *r = bin_find_smallest_column(be, right);
@@ -2855,7 +2855,6 @@ rel2bin_groupjoin(backend *be, sql_rel *
                join = stmt_join_cand(be, column(be, l), column(be, r), 
left->cand, NULL/*right->cand*/, 0, cmp_all, 0, 0, false, rel->op == 
op_left?false:true);
                need_project = true;
        } else if (!list_empty(jexps)) {
-               printf("# outer join\n");
                sql_exp *e = en->data;
                en = en->next;
                stmt *l = exp_bin(be, e->l, left, NULL, NULL, NULL, NULL, NULL, 
0, 1, 0), *r = NULL;
@@ -2881,10 +2880,11 @@ rel2bin_groupjoin(backend *be, sql_rel *
                }
                ls = l;
                if (en) {
+                       printf("# outer join\n");
                        join = stmt_join_cand(be, column(be, l), column(be, r), 
left->cand, NULL/*right->cand*/, is_anti(e), (comp_type) cmp_equal/*e->flag*/, 
0, is_any(e)|is_semantics(e), false, rel->op == op_left?false:true);
                } else {
-                       /* todo mark as mark/outerjoin */
-                       join = stmt_join(be, l, r, 0, /*cmp*/cmp_equal, 0, 0, 
false);
+                       printf("# mark join\n");
+                       join = stmt_markjoin(be, l, r, is_any(e));
                }
        }
        jl = stmt_result(be, join, 0);
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -2107,6 +2107,40 @@ stmt_markselect(backend *be, stmt *g, st
 }
 
 stmt *
+stmt_markjoin(backend *be, stmt *l, stmt *r, bool any)
+{
+       MalBlkPtr mb = be->mb;
+       InstrPtr q;
+
+       q = newStmtArgs(mb, algebraRef, markjoinRef, 8);
+       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+       q = pushArgument(mb, q, l->nr); /* left ids */
+       q = pushArgument(mb, q, r->nr); /* mark info mask */
+       q = pushNil(mb, q, TYPE_bat);
+       q = pushNil(mb, q, TYPE_bat);
+       q = pushBit(mb, q, (any)?TRUE:FALSE);
+       q = pushNil(mb, q, TYPE_lng);
+       pushInstruction(mb, q);
+
+       if (!q)
+               return NULL;
+       stmt *s = stmt_create(be->mvc->sa, st_join);
+       if (s == NULL) {
+               freeInstruction(q);
+               return NULL;
+       }
+
+       s->op1 = l;
+       s->op2 = r;
+       s->flag = MARKJOIN;
+       s->key = 0;
+       s->nrcols = l->nrcols;
+       s->nr = getDestVar(q);
+       s->q = q;
+       return s;
+}
+
+stmt *
 stmt_uselect2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt 
*sub, int anti, int symmetric, int reduce)
 {
        stmt *sel = sub;
diff --git a/sql/backends/monet5/sql_statement.h 
b/sql/backends/monet5/sql_statement.h
--- a/sql/backends/monet5/sql_statement.h
+++ b/sql/backends/monet5/sql_statement.h
@@ -198,6 +198,7 @@ extern stmt *stmt_uselect2(backend *be, 
 extern stmt *stmt_genselect(backend *be, stmt *lops, stmt *rops, sql_subfunc 
*f, stmt *sub, int anti);
 extern stmt *stmt_outerselect(backend *be, stmt *g, stmt *m, stmt *p, bool 
any);
 extern stmt *stmt_markselect(backend *be, stmt *g, stmt *m, stmt *p, bool any);
+extern stmt *stmt_markjoin(backend *be, stmt *l, stmt *r, bool any);
 
 extern stmt *stmt_tunion(backend *be, stmt *op1, stmt *op2);
 extern stmt *stmt_tdiff(backend *be, stmt *op1, stmt *op2, stmt *lcand);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to