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]