Changeset: 863e6e7c4b9f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=863e6e7c4b9f
Modified Files:
        gdk/gdk_select.c
Branch: default
Log Message:

Layout and comments.


diffs (278 lines):

diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -92,16 +92,6 @@ BATslice2(BAT *b, BUN l1, BUN h1, BUN l2
        return NULL;
 }
 
-/*
- * @-  Value Selections
- * The string search is optimized for the degenerated case that th =
- * tl, and double elimination in the string heap.
- *
- * We allow value selections on the nil atom. This is formally not
- * correct, as in MIL (nil = nil) != true.  However, we do need an
- * implementation for selecting nil (in MIL, this is done through is
- * the "isnil" predicate). So we implement it here.
- */
 static BAT *
 BAT_hashselect(BAT *b, BAT *s, BAT *bn, const void *tl)
 {
@@ -375,7 +365,10 @@ BATsubselect(BAT *b, BAT *s, const void 
 
        if (b->U->count == 0 || (s && s->U->count == 0)) {
                /* trivially empty result */
-               ALGODEBUG fprintf(stderr, 
"#BATsubselect(b=%s#"BUNFMT",s=%s,anti=%d): trivially empty\n", BATgetId(b), 
BATcount(b), s ? BATgetId(s) : "NULL", anti);
+               ALGODEBUG fprintf(stderr, "#BATsubselect(b=%s#" BUNFMT
+                                 ",s=%s,anti=%d): trivially empty\n",
+                                 BATgetId(b), BATcount(b),
+                                 s ? BATgetId(s) : "NULL", anti);
                return newempty();
        }
 
@@ -411,12 +404,20 @@ BATsubselect(BAT *b, BAT *s, const void 
                        hval = ti;
                        lnil = ATOMcmp(t, tl, nil) == 0;
                        anti = 0;
-                       ALGODEBUG fprintf(stderr, 
"#BATsubselect(b=%s#"BUNFMT",s=%s,anti=%d): anti: switch ranges\n", 
BATgetId(b), BATcount(b), s ? BATgetId(s) : "NULL", anti);
+                       ALGODEBUG fprintf(stderr, "#BATsubselect(b=%s#" BUNFMT
+                                         ",s=%s,anti=%d): anti: "
+                                         "switch ranges\n",
+                                         BATgetId(b), BATcount(b),
+                                         s ? BATgetId(s) : "NULL", anti);
                } else if (!lval && !hval) {
                        /* antiselect for nil-nil range: all non-nil
                         * values are in range; we must return all
                         * other non-nil values, i.e. nothing */
-                       ALGODEBUG fprintf(stderr, 
"#BATsubselect(b=%s#"BUNFMT",s=%s,anti=%d): anti: nil-nil range, nonil\n", 
BATgetId(b), BATcount(b), s ? BATgetId(s) : "NULL", anti);
+                       ALGODEBUG fprintf(stderr, "#BATsubselect(b=%s#" BUNFMT
+                                         ",s=%s,anti=%d): anti: "
+                                         "nil-nil range, nonil\n",
+                                         BATgetId(b), BATcount(b),
+                                         s ? BATgetId(s) : "NULL", anti);
                        return newempty();
                } else if (equi && lnil) {
                        /* antiselect for nil value: turn into range
@@ -426,29 +427,42 @@ BATsubselect(BAT *b, BAT *s, const void 
                        anti = 0;
                        lval = 0;
                        hval = 0;
-                       ALGODEBUG fprintf(stderr, 
"#BATsubselect(b=%s#"BUNFMT",s=%s,anti=%d): anti-nil\n", BATgetId(b), 
BATcount(b), s ? BATgetId(s) : "NULL", anti);
+                       ALGODEBUG fprintf(stderr, "#BATsubselect(b=%s#" BUNFMT
+                                         ",s=%s,anti=%d): anti-nil\n",
+                                         BATgetId(b), BATcount(b),
+                                         s ? BATgetId(s) : "NULL", anti);
                } else {
                        equi = 0;
                }
        }
 
-       assert(!equi || (lval && hval)); /* if equi set, then so are both lval 
and hval */
+       /* if equi set, then so are both lval and hval */
+       assert(!equi || (lval && hval));
 
        if (hval && ((equi && !(li && hi)) || ATOMcmp(t, tl, th) > 0)) {
                /* empty range */
-               ALGODEBUG fprintf(stderr, 
"#BATsubselect(b=%s#"BUNFMT",s=%s,anti=%d): empty range\n", BATgetId(b), 
BATcount(b), s ? BATgetId(s) : "NULL", anti);
+               ALGODEBUG fprintf(stderr, "#BATsubselect(b=%s#" BUNFMT
+                                 ",s=%s,anti=%d): empty range\n",
+                                 BATgetId(b), BATcount(b),
+                                 s ? BATgetId(s) : "NULL", anti);
                return newempty();
        }
        if (equi && lnil && b->T->nonil) {
                /* return all nils, but there aren't any */
-               ALGODEBUG fprintf(stderr, 
"#BATsubselect(b=%s#"BUNFMT",s=%s,anti=%d): equi-nil, nonil\n", BATgetId(b), 
BATcount(b), s ? BATgetId(s) : "NULL", anti);
+               ALGODEBUG fprintf(stderr, "#BATsubselect(b=%s#" BUNFMT
+                                 ",s=%s,anti=%d): equi-nil, nonil\n",
+                                 BATgetId(b), BATcount(b),
+                                 s ? BATgetId(s) : "NULL", anti);
                return newempty();
        }
 
        if (!equi && !lval && !hval && lnil && b->T->nonil) {
                /* return all non-nils from a BAT that doesn't have
                 * any: i.e. return everything */
-               ALGODEBUG fprintf(stderr, 
"#BATsubselect(b=%s#"BUNFMT",s=%s,anti=%d): everything, nonil\n", BATgetId(b), 
BATcount(b), s ? BATgetId(s) : "NULL", anti);
+               ALGODEBUG fprintf(stderr, "#BATsubselect(b=%s#" BUNFMT
+                                 ",s=%s,anti=%d): everything, nonil\n",
+                                 BATgetId(b), BATcount(b),
+                                 s ? BATgetId(s) : "NULL", anti);
                if (s) {
                        return BATcopy(s, TYPE_void, s->ttype, 0);
                } else {
@@ -468,7 +482,10 @@ BATsubselect(BAT *b, BAT *s, const void 
                         * nil equiselect (dealt with above) */
                        assert(b->T->nonil);
                        assert(b->tsorted);
-                       ALGODEBUG fprintf(stderr, 
"#BATsubselect(b=%s#"BUNFMT",s=%s,anti=%d): dense\n", BATgetId(b), BATcount(b), 
s ? BATgetId(s) : "NULL", anti);
+                       ALGODEBUG fprintf(stderr, "#BATsubselect(b=%s#" BUNFMT
+                                         ",s=%s,anti=%d): dense\n",
+                                         BATgetId(b), BATcount(b),
+                                         s ? BATgetId(s) : "NULL", anti);
                        if (hval) {
                                oid h = * (oid *) th + hi;
 
@@ -490,7 +507,10 @@ BATsubselect(BAT *b, BAT *s, const void 
                                        low = (BUN) l;
                        }
                } else if (b->tsorted) {
-                       ALGODEBUG fprintf(stderr, 
"#BATsubselect(b=%s#"BUNFMT",s=%s,anti=%d): sorted\n", BATgetId(b), 
BATcount(b), s ? BATgetId(s) : "NULL", anti);
+                       ALGODEBUG fprintf(stderr, "#BATsubselect(b=%s#" BUNFMT
+                                         ",s=%s,anti=%d): sorted\n",
+                                         BATgetId(b), BATcount(b),
+                                         s ? BATgetId(s) : "NULL", anti);
                        if (lval) {
                                if (li)
                                        low = SORTfndfirst(b, tl);
@@ -510,7 +530,10 @@ BATsubselect(BAT *b, BAT *s, const void 
                        }
                } else {
                        assert(b->trevsorted);
-                       ALGODEBUG fprintf(stderr, 
"#BATsubselect(b=%s#"BUNFMT",s=%s,anti=%d): reverse sorted\n", BATgetId(b), 
BATcount(b), s ? BATgetId(s) : "NULL", anti);
+                       ALGODEBUG fprintf(stderr, "#BATsubselect(b=%s#" BUNFMT
+                                         ",s=%s,anti=%d): reverse sorted\n",
+                                         BATgetId(b), BATcount(b),
+                                         s ? BATgetId(s) : "NULL", anti);
                        if (lval) {
                                if (li)
                                        high = SORTfndlast(b, tl);
@@ -603,7 +626,10 @@ BATsubselect(BAT *b, BAT *s, const void 
              (size_t) ATOMsize(b->ttype) > sizeof(BUN) / 4 &&
              estimate < BATcount(b) / 100 &&
              BATcount(b) * (ATOMsize(b->ttype) + 2 * sizeof(BUN)) < 
GDK_mem_maxsize / 2))) {
-               ALGODEBUG fprintf(stderr, 
"#BATsubselect(b=%s#"BUNFMT",s=%s,anti=%d): hash select\n", BATgetId(b), 
BATcount(b), s ? BATgetId(s) : "NULL", anti);
+               ALGODEBUG fprintf(stderr, "#BATsubselect(b=%s#" BUNFMT
+                                 ",s=%s,anti=%d): hash select\n",
+                                 BATgetId(b), BATcount(b),
+                                 s ? BATgetId(s) : "NULL", anti);
                bn = BAT_hashselect(b, s, bn, tl);
        } else {
                bn = BAT_scanselect(b, s, bn, tl, th, li, hi, equi, anti, lval, 
hval);
@@ -612,6 +638,64 @@ BATsubselect(BAT *b, BAT *s, const void 
        return bn;
 }
 
+/* theta select
+ *
+ * Returns a dense-headed BAT with the OID values of b in the tail for
+ * qualifying tuples.  The return BAT is sorted on the tail value
+ * (i.e. in the same order as the input BAT).
+ *
+ * If s[dense,OID] is specified, its tail column is a list of
+ * candidates.  s should be sorted on the tail value.
+ *
+ * Theta select returns all values from b which are less/greater than
+ * or equal to the provided value depending on the value of op.  Op is
+ * a string with one of the values: "=", "==", "<", "<=", ">", ">="
+ * (the first two are equivalent).  Theta select never returns nils.
+ *
+ * If value is nil, the result is empty.
+ */
+BAT *
+BATthetasubselect(BAT *b, BAT *s, const void *val, const char *op)
+{
+       const void *nil;
+
+       BATcheck(b, "BATthetasubselect");
+       BATcheck(val, "BATthetasubselect");
+       BATcheck(op, "BATthetasubselect");
+
+       nil = ATOMnilptr(b->ttype);
+       if (ATOMcmp(b->ttype, val, nil) == 0)
+               return newempty();
+       if (op[0] == '=' && ((op[1] == '=' && op[2] == 0) || op[2] == 0)) {
+               /* "=" or "==" */
+               return BATsubselect(b, s, val, NULL, 1, 1, 0);
+       }
+       if (op[0] == '<') {
+               if (op[1] == 0) {
+                       /* "<" */
+                       return BATsubselect(b, s, nil, val, 0, 0, 0);
+               }
+               if (op[1] == '=' && op[2] == 0) {
+                       /* "<=" */
+                       return BATsubselect(b, s, nil, val, 0, 1, 0);
+               }
+       }
+       if (op[0] == '>') {
+               if (op[1] == 0) {
+                       /* ">" */
+                       return BATsubselect(b, s, val, nil, 0, 0, 0);
+               }
+               if (op[1] == '=' && op[2] == 0) {
+                       /* ">=" */
+                       return BATsubselect(b, s, val, nil, 1, 0, 0);
+               }
+       }
+       GDKerror("BATthetasubselect: unknown operator.\n");
+       return NULL;
+}
+
+/* The rest of this file contains backward-compatible interfaces */
+
 static BAT *
 BAT_select_(BAT *b, const void *tl, const void *th, bit li, bit hi, bit tail, 
bit anti)
 {
@@ -623,11 +707,15 @@ BAT_select_(BAT *b, const void *tl, cons
        BATcheck(b, "BAT_select_");
        /* b is a [any_1,any_2] BAT */
        if (!BAThdense(b)) {
-               ALGODEBUG fprintf(stderr, "#BAT_select_(b=%s#"BUNFMT",tail=%d): 
make map\n", BATgetId(b), BATcount(b), tail);
+               ALGODEBUG fprintf(stderr, "#BAT_select_(b=%s#" BUNFMT
+                                 ",tail=%d): make map\n",
+                                 BATgetId(b), BATcount(b), tail);
                map = BATmirror(BATmark(b, 0)); /* [dense,any_1] */
                b1 = BATmirror(BATmark(BATmirror(b), 0)); /* dense,any_2] */
        } else {
-               ALGODEBUG fprintf(stderr, "#BAT_select_(b=%s#"BUNFMT",tail=%d): 
dense head\n", BATgetId(b), BATcount(b), tail);
+               ALGODEBUG fprintf(stderr, "#BAT_select_(b=%s#" BUNFMT
+                                 ",tail=%d): dense head\n",
+                                 BATgetId(b), BATcount(b), tail);
                map = NULL;
                b1 = b;         /* [dense,any_2] (any_1==dense) */
        }
@@ -743,43 +831,3 @@ BATuselect(BAT *b, const void *h, const 
 {
        return BATuselect_(b, h, t, TRUE, TRUE);
 }
-
-BAT *
-BATthetasubselect(BAT *b, BAT *s, const void *val, const char *op)
-{
-       const void *nil;
-
-       BATcheck(b, "BATthetasubselect");
-       BATcheck(val, "BATthetasubselect");
-       BATcheck(op, "BATthetasubselect");
-
-       nil = ATOMnilptr(b->ttype);
-       if (ATOMcmp(b->ttype, val, nil) == 0)
-               return newempty();
-       if (op[0] == '=' && ((op[1] == '=' && op[2] == 0) || op[2] == 0)) {
-               /* "=" or "==" */
-               return BATsubselect(b, s, val, NULL, 1, 1, 0);
-       }
-       if (op[0] == '<') {
-               if (op[1] == 0) {
-                       /* "<" */
-                       return BATsubselect(b, s, nil, val, 0, 0, 0);
-               }
-               if (op[1] == '=' && op[2] == 0) {
-                       /* "<=" */
-                       return BATsubselect(b, s, nil, val, 0, 1, 0);
-               }
-       }
-       if (op[0] == '>') {
-               if (op[1] == 0) {
-                       /* ">" */
-                       return BATsubselect(b, s, val, nil, 0, 0, 0);
-               }
-               if (op[1] == '=' && op[2] == 0) {
-                       /* ">=" */
-                       return BATsubselect(b, s, val, nil, 1, 0, 0);
-               }
-       }
-       GDKerror("BATthetasubselect: unknown operator.\n");
-       return NULL;
-}
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to