Changeset: 98347cb474bb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/98347cb474bb
Modified Files:
monetdb5/modules/kernel/algebra.c
sql/backends/monet5/rel_bin.c
Branch: groupjoin
Log Message:
flipped logic for outermarkjoin (ie step of full mark join), ie now always use
match == TRUE, no match == FALSE (empty set), and nil if nil in predicate
diffs (117 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
@@ -390,7 +390,7 @@ static str
ALGmarkselect(bat *r1, bat *r2, const bat *gid, const bat *mid, const bat
*pid, const bit *Any)
{
BAT *g = BATdescriptor(*gid); /* oid */
- BAT *m = BATdescriptor(*mid); /* bit, true: match, nil: empty set,
false: nil on left */
+ BAT *m = BATdescriptor(*mid); /* bit, true: match, false: empty set,
nil: nil on left */
BAT *p = BATdescriptor(*pid); /* bit */
BAT *res1 = NULL, *res2 = NULL;
bit any = *Any; /* any or normal comparision semantics */
@@ -422,9 +422,9 @@ ALGmarkselect(bat *r1, bat *r2, const ba
oid c = g->hseqbase;
for (BUN n = 0; n < nr; n++, c++) {
ri1[q] = c;
- if (mi[n] == bit_nil) /* empty */
+ if (mi[n] == FALSE) /* empty */
ri2[q] = FALSE;
- else if (pi[n] == bit_nil || mi[n] == false)
+ else if (pi[n] == bit_nil || mi[n] == bit_nil)
ri2[q] = bit_nil;
else
ri2[q] = (mi[n] == TRUE && pi[n] ==
TRUE)?TRUE:FALSE;
@@ -447,7 +447,7 @@ ALGmarkselect(bat *r1, bat *r2, const ba
}
if (m == TRUE)
continue;
- if ((mi[n] == FALSE && pi[n] == TRUE) /* ie has nil */
|| (any && mi[n] == TRUE && pi[n] == bit_nil))
+ if ((mi[n] == bit_nil && pi[n] == TRUE) /* ie has nil
*/ || (any && mi[n] == TRUE && pi[n] == bit_nil))
has_nil = true;
else if (mi[n] == TRUE && pi[n] == TRUE)
m = TRUE;
@@ -483,9 +483,8 @@ ALGmarkselect(bat *r1, bat *r2, const ba
static str
ALGouterselect(bat *r1, bat *r2, const bat *gid, const bat *mid, const bat
*pid, const bit *Any)
{
- /* for each l-cand in lid, return atleast one, if rid == nil, return
nil else pid */
BAT *g = BATdescriptor(*gid); /* oid */
- BAT *m = BATdescriptor(*mid); /* bit, true: match, nil: empty set,
false: nil on left */
+ BAT *m = BATdescriptor(*mid); /* bit, true: match, false: empty set,
nil: nil on left */
BAT *p = BATdescriptor(*pid); /* bit */
BAT *res1 = NULL, *res2 = NULL;
bit any = *Any; /* any or normal comparision semantics */
@@ -517,7 +516,7 @@ ALGouterselect(bat *r1, bat *r2, const b
oid c = g->hseqbase;
for (BUN n = 0; n < nr; n++, c++) {
ri1[q] = c;
- ri2[q] = (mi[n]==bit_nil || pi[n] == FALSE || (!any &&
pi[n] == bit_nil))?bit_nil:(pi[n] == TRUE)?TRUE:FALSE;
+ ri2[q] = (any && (mi[n] == bit_nil || pi[n] ==
bit_nil))?bit_nil:(mi[n] == TRUE && pi[n] == TRUE)?TRUE:FALSE;
q++;
}
} else {
@@ -529,7 +528,7 @@ ALGouterselect(bat *r1, bat *r2, const b
if (c && cur != gi[n]) {
if (!used) {
ri1[q] = c-1;
- ri2[q] = bit_nil;
+ ri2[q] = false;
q++;
}
used = false;
@@ -540,21 +539,21 @@ ALGouterselect(bat *r1, bat *r2, const b
ri2[q] = TRUE;
used = true;
q++;
- } else if (mi[n] == bit_nil) { /* empty */
+ } else if (mi[n] == FALSE) { /* empty */
+ ri1[q] = c;
+ ri2[q] = FALSE;
+ used = true;
+ q++;
+ } else if (any && (mi[n] == bit_nil /* ie has nil */ ||
pi[n] == bit_nil)) {
ri1[q] = c;
ri2[q] = bit_nil;
used = true;
q++;
- } else if (any && (mi[n] == FALSE /* ie has nil */ ||
pi[n] == bit_nil)) {
- ri1[q] = c;
- ri2[q] = FALSE;
- used = true;
- q++;
}
}
if (nr && !used) {
ri1[q] = c-1;
- ri2[q] = bit_nil;
+ ri2[q] = FALSE;
q++;
}
}
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
@@ -2925,15 +2925,18 @@ rel2bin_groupjoin(backend *be, sql_rel *
* jr==bit_nil if left == NULL else true/false?
* else simple mark
* jr = isnull(jr) bit_nil else alse
+ *
+ * ls == NULL -> false
+ * m==bit_nil iff left == NULL else true/false
*/
if (ls) {
stmt *nls = stmt_project(be, jl, ls);
- jr = sql_Nop_(be, "ifthenelse", sql_unop_(be, "isnull",
nls), stmt_bool(be, 0),
- sql_Nop_(be, "ifthenelse",
sql_unop_(be, "isnull", jr), stmt_bool(be, bit_nil), stmt_bool(be, 1), NULL),
+ jr = sql_Nop_(be, "ifthenelse", sql_unop_(be, "isnull",
nls), stmt_bool(be, bit_nil),
+ sql_Nop_(be, "ifthenelse",
sql_unop_(be, "isnull", jr), stmt_bool(be, 0), stmt_bool(be, 1), NULL),
NULL);
} else {
- /* nil == empty, 0 - no match (ie nil), 1 match */
- jr = sql_Nop_(be, "ifthenelse", sql_unop_(be, "isnull",
jr), stmt_bool(be, bit_nil), stmt_bool(be, 1), NULL);
+ /* 0 == empty (no matches possible), nil - no match
(but has nil), 1 match */
+ jr = sql_Nop_(be, "ifthenelse", sql_unop_(be, "isnull",
jr), stmt_bool(be, 0), stmt_bool(be, 1), NULL);
}
/* continue with non equi-joins */
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]