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