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]

Reply via email to