Changeset: cc4b8786f139 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cc4b8786f139
Modified Files:
        gdk/gdk.h
        gdk/gdk_batop.c
Branch: headless
Log Message:

Implemented COLmark_grp and fixed compilation issues.
Apart from the reference to scanselect, gdk_batop.c now compiles.


diffs (truncated from 980 to 300 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1512,8 +1512,8 @@
  */
 gdk_export COL *COLclear(COL *b);
 gdk_export COL *COLcopy(COL *b, int tp, int writeable);
-gdk_export COL *COLmark_grp(COL *b, COL *g, oid *base);
-gdk_export COL *COLgroup(COL *b, int start, int incr, int grpsize);
+gdk_export COL *COLmark_grp(COL *b, COL *g, COL *c, oid *base);
+gdk_export COL *COLgroup(COL *b, oid start, int incr, int grpsize);
 
 /*
  *
@@ -1674,17 +1674,17 @@
  * this does not necessarily mean that they are sorted in reverse order!
  */
 
-gdk_export COL *COLsort(COL *b);
-gdk_export COL *COLsort_rev(COL *b);
-gdk_export COL *COLorder(COL *b);
-gdk_export COL *COLorder_rev(COL *b);
+gdk_export COL *COLsort(COL *b, COL **o);
+gdk_export COL *COLsort_rev(COL *b, COL **o);
+gdk_export COL *COLorder(COL *b, COL *o);
+gdk_export COL *COLorder_rev(COL *b, COL *o);
 gdk_export COL *COLrevert(COL *b);
 gdk_export int COLordered(COL *b);
 gdk_export int COLordered_rev(COL *b);
-gdk_export COL *COLssort(COL *b);
-gdk_export COL *COLssort_rev(COL *b);
-gdk_export COL *COLsorder(COL *b);
-gdk_export COL *COLsorder_rev(COL *b);
+gdk_export COL *COLssort(COL *b, COL **o);
+gdk_export COL *COLssort_rev(COL *b, COL **o);
+gdk_export COL *COLsorder(COL *b, COL *o);
+gdk_export COL *COLsorder_rev(COL *b, COL *o);
 
 gdk_export void GDKqsort(void *h, void *t, void *base, size_t n, int s, int 
tpe);
 gdk_export void GDKqsort_rev(void *h, void *t, void *base, size_t n, int s, 
int tpe);
@@ -3090,7 +3090,7 @@
 gdk_export void COLsetprop_str(COL *b, int idx, str val);
 gdk_export void COLpropagate(COL *dst, COL *src, int idx);
 gdk_export COL *COLsample(COL *b, oid n);
-gdk_export COL *COLhistogram(COL *b);
+gdk_export COL *COLhistogram(COL *b, COL **unique);
 gdk_export int COLtopN(COL *b, oid topN);      /* used in 
monet5/src/modules/kernel/algebra.mx */
 
 /*
@@ -3206,7 +3206,7 @@
 gdk_export COL *COLselect(COL *b, ptr tl, ptr th);
 gdk_export COL *COLsubselect(COL *b, COL *s, ptr tl, ptr th, bit li, bit hi, 
bit anti);
 
-gdk_export COL *COLconst(COL *l, int tt, ptr val);
+gdk_export COL *COLconst(oid cnt, int tpe, ptr val);
 gdk_export COL *COLthetajoin(COL *l, COL *r, int mode, oid estimate);
 gdk_export COL *COLleftthetajoin(COL *l, COL *r, int mode, oid estimate);
 gdk_export COL *COLnlthetajoin(COL *l, COL *r, int mode, oid estimate);
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -60,8 +60,7 @@
        int tt;                 /* col types */
        size_t toff = ~(size_t) 0;      /* head and tail offsets */
        oid p, q;               /* loop variables */
-       oid o = 0;              /* in case we're appending */
-       ptr hp, tp;             /* value pointers */
+       ptr tp;                 /* value pointer */
        unsigned char tbv;      /* value-as-bte */
        unsigned short tsv;     /* value-as-sht */
 #if SIZEOF_VAR_T == 8
@@ -71,7 +70,7 @@
        var_t v;                /* value */
        int ntw, btw;           /* shortcuts for {b,n}->width */
 
-       if (n->batCount == 0)
+       if (n->count == 0)
                return b;
        ni = col_iterator(n);
        btw = b->width;
@@ -300,7 +299,7 @@
                        }
                }
                if (b->type == TYPE_str &&
-                   (b->batCount == 0 || !GDK_ELIMDOUBLES(b->vheap)) &&
+                   (b->count == 0 || !GDK_ELIMDOUBLES(b->vheap)) &&
                    !GDK_ELIMDOUBLES(n->vheap) &&
                    b->vheap->hashash == n->vheap->hashash &&
                    VIEWparent(n) == 0) {
@@ -309,7 +308,7 @@
                        COLiter ni = col_iterator(n);
 
                        COLloop(n, p, q) {
-                               bunfastins_nocheck(b, r, BUNhead(ni, p), 0, 
COLwidth(b));
+                               bunfastins_nocheck(b, r, BUNhead(ni, p), 
COLwidth(b));
                                r++;
                        }
                }
@@ -369,7 +368,7 @@
        ALIGNdel(b, "COLdel", force);
        TYPEcheck(b->type, n->type);
        COLloop(n, p1, p2) {
-               if (BUNdel(b, BUNhead(bi, p1)) == NULL) {
+               if (BUNdel(b, BUNhead(bi, p1), force) == NULL) {
                        GDKerror("COLdel: oid does not occur.\n");
                        return NULL;
                }
@@ -493,7 +492,6 @@
 {
        oid size = COLcount(bn);
        oid i;
-       int revsorted = 1;
 
        COLcheck(b, "COL_hashselect");
        assert(bn->type == TYPE_oid);
@@ -518,7 +516,7 @@
                HASHloop_typed(bi, b->hash, i, tl, TYPE) {              \
                        if (q < r) {                                    \
                                bunfastins_nocheck(bn, q, &i, COLwidth(bn)); \
-                               if (q > 0 && * (oid *) COLelement(nb,q-1) < i) \
+                               if (q > 0 && bn->revsorted && * (oid *) 
COLelement(bn,q-1) < i) \
                                        bn->revsorted = 0;              \
                        }                                               \
                        q++;                                            \
@@ -569,7 +567,7 @@
                                HASHloop_fstr(bi, b->hash, p, j, tl) {
                                        if (q < r) {
                                                bunfastins_nocheck(bn, q, &i, 
COLwidth(bn));
-                                               if (q > 0 && * (oid *) 
COLelement(nb,q-1) < i)
+                                               if (q > 0 && bn->revsorted && * 
(oid *) COLelement(bn,q-1) < i)
                                                        bn->revsorted = 0;
                                        }
                                        q++;
@@ -580,7 +578,7 @@
                                HASHloop_str(bi, b->hash, p, tl) {
                                        if (q < r) {
                                                bunfastins_nocheck(bn, q, &i, 
COLwidth(bn));
-                                               if (q > 0 && * (oid *) 
COLelement(nb,q-1) < i)
+                                               if (q > 0 && bn->revsorted && * 
(oid *) COLelement(bn,q-1) < i)
                                                        bn->revsorted = 0;
                                        }
                                        q++;
@@ -593,7 +591,7 @@
                                HASHloopvar(bi, b->hash, i, tl) {
                                        if (q < r) {
                                                bunfastins_nocheck(bn, q, &i, 
COLwidth(bn));
-                                               if (q > 0 && * (oid *) 
COLelement(nb,q-1) < i)
+                                               if (q > 0 && bn->revsorted && * 
(oid *) COLelement(bn,q-1) < i)
                                                        bn->revsorted = 0;
                                        }
                                        q++;
@@ -602,7 +600,7 @@
                                HASHlooploc(bi, b->hash, i, tl) {
                                        if (q < r) {
                                                bunfastins_nocheck(bn, q, &i, 
COLwidth(bn));
-                                               if (q > 0 && * (oid *) 
COLelement(nb,q-1) < i)
+                                               if (q > 0 && bn->revsorted && * 
(oid *) COLelement(bn,q-1) < i)
                                                        bn->revsorted = 0;
                                        }
                                        q++;
@@ -768,7 +766,7 @@
                                        high = 0;
                        }
                }
-               ALGODEBUG THRprintf(GDKout, "#COL_select_(b=%s): COLslice(v=%s, 
low=" OIDFMT ", high=" OIDFMT ");\n", COLgetId(b), COLgetId(v), low, high);
+               ALGODEBUG THRprintf(GDKout, "#COL_select_(b=%s): slice: low=" 
OIDFMT ", high=" OIDFMT "\n", COLgetId(b), low, high);
 
                if (anti) {
                        oid first = SORTfndlast(b, nil);
@@ -793,7 +791,7 @@
         * @-
         * Use sampling to determine a good result size, when the bat is large.
         */
-       if (COLkey(b)) {
+       if (COLiskey(b)) {
                estimate = 1;
        } else if (batcnt > 100000) {
                oid _lo = batcnt / 2, _hi = _lo + 105;
@@ -829,10 +827,10 @@
 
                        bn = COL_hashselect(b, bn, tl);
                } else if (equi &&
-                          b->batPersistence == PERSISTENT &&
-                          (size_t) ATOMsize(b->ttype) > sizeof(oid) / 4 &&
+                          b->persistence == PERSISTENT &&
+                          (size_t) ATOMsize(b->type) > sizeof(oid) / 4 &&
                           estimate < batcnt / 100 &&
-                          batcnt * (ATOMsize(b->ttype) + 2 * sizeof(oid)) < 
(GDK_mem_maxsize / 2) /* MT_npages() * MT_pagesize() / (GDKnr_threads ? 
GDKnr_threads : 1) */ ) {
+                          batcnt * (ATOMsize(b->type) + 2 * sizeof(oid)) < 
(GDK_mem_maxsize / 2) /* MT_npages() * MT_pagesize() / (GDKnr_threads ? 
GDKnr_threads : 1) */ ) {
                        /* Build a hash-table on the fly for
                         * equi-select on persistent COL if tail-type
                         * is large (wide) and selectivity is low and
@@ -900,7 +898,7 @@
                /* no boundaries */
                if (anti)
                        return COLnewdensecol(0);
-               CBPfix(s);
+               CBPfix(s->batCacheid);
                return s;
        }
 
@@ -1088,6 +1086,8 @@
        int (*cmp)(ptr, ptr);
        ptr prev, v;
        COLiter bi;
+       oid p, q;
+       int c;
 
        COLsettrivprop(b);      /* make sure easy properties are set */
        if (b->count <= 1) {
@@ -1111,7 +1111,7 @@
        prev = BUNhead(bi, COLfirst(b));
        for (p = COLfirst(b) + 1, q = COLlast(b); p < q; p++) {
                v = BUNhead(bi, p);
-               c = (*cmp)(prev, p);
+               c = (*cmp)(prev, v);
                if (ordered && c > 0) {
                        ordered = 0;
                        if (b->nosorted != p) {
@@ -1177,10 +1177,10 @@
        COLcheck(b, "COLorder_internal");
        assert(o == NULL || (o->type == TYPE_oid && o->count == b->count));
 
-       if (b->type == TYPE_void && b->seqbase == oid_nil ||
+       if ((b->type == TYPE_void && b->seqbase == oid_nil) ||
            (!reverse && b->type == TYPE_void) ||
            (b->type != TYPE_void && COLordered_internal(b, reverse))) {
-               /* b's head is void-nil, hence we return b as is */
+               /* b is void-nil, or b is already sorted, hence we return b as 
is */
                return COLcopy(b, b->type, FALSE);
        }
        if (COLcount(b) <= 1) {
@@ -1418,9 +1418,8 @@
 {
 /* 64bit: this should probably use wrd instead of int */
        oid p, q, r;
-       int i = 0;
+       oid i = 0;
        COL *bn;
-       COLiter bi = col_iterator(b);
 
        COLcheck(b, "COLgroup");
        bn = COLnew(TYPE_oid, COLcount(b));
@@ -1431,15 +1430,16 @@
        ALIGNset(bn, b);
 
        COLloop(b, p, q) {
-               bunfastins_nocheck(bn, r, (ptr) &start, COLwidth(bn));
+               fastins_nocheck(bn, r, &start, COLwidth(bn));
                r++;
-               if (i == grpsize - 1) {
+               if (grpsize > 0 && i == (oid) grpsize - 1) {
                        start += incr;
                        i = 0;
                } else {
                        i++;
                }
        }
+       COLsetcount(bn, b->count);
        bn->sorted = 1;
        bn->revsorted = r == i; /* single group, all values identical */
        bn->nonil = 1;
@@ -1450,547 +1450,91 @@
 }
 
 COL *
-COLmark_grp(COL *b, COL *g, oid *s)
+COLmark_grp(COL *b, COL *g, COL *c, oid *s)
 {
-       COL *bn, *gc = NULL;
-       bit trivprop = FALSE;
+       oid *cnts;
        oid p, q, r;
-       COLiter bi;
-       COLiter gi;
+       ptr v;
+       COLiter bi, gi;
+       COL *bn;
 
        COLcheck(b, "COLmark_grp");
        COLcheck(g, "COLmark_grp");
-       ERRORcheck(b->ttype != TYPE_void && b->ttype != TYPE_oid,
-                  "COLmark_grp: tail of COL b must be oid.\n");
-       ERRORcheck(g->htype != TYPE_void && g->htype != TYPE_oid,
-                  "COLmark_grp: head of COL g must be oid.\n");
-       ERRORcheck(b->ttype == TYPE_void && b->tseqbase == oid_nil,
-                  "COLmark_grp: tail of COL b must not be nil.\n");
-       ERRORcheck(g->htype == TYPE_void && g->hseqbase == oid_nil,
-                  "COLmark_grp: head of COL g must not be nil.\n");
-       ERRORcheck(s && *s == oid_nil,
-                  "COLmark_grp: base oid s must not be nil.\n");
-       ERRORcheck(!s && g->ttype != TYPE_oid,
-                  "COLmark_grp: tail of COL g must be oid.\n");
+       if (s == NULL) {
+               COLcheck(c, "COLmark_grp");
+               ERRORcheck(c->type != TYPE_void && c->type != TYPE_oid,
+                          "COLmark_grp: COL c must be oid.\n");
+               ERRORcheck(COLcount(c) != COLcount(g),
+                          "COLmark_grp: base oid COL must be aligned with 
group COL.\n");
+       } else {
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to