Changeset: 0ee58b99d302 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0ee58b99d302
Modified Files:
gdk/gdk_batop.c
Branch: default
Log Message:
Rewrote BATmark_grp. It now requires dense-headed arguments.
diffs (294 lines):
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1442,219 +1442,95 @@ BATmark(BAT *b, oid oid_base)
return bn;
}
-#define mark_grp_init(BUNfnd) \
- do { \
- BUN w; \
- \
- BUNfnd(w, gi, &v); \
- if (w != BUN_NONE) { \
- n = * (oid *) BUNtloc(gi, w); \
- } else { \
- n = oid_nil; \
- } \
- } while (0)
+BAT *
+BATmark_grp(BAT *g, BAT *e, const oid *s)
+{
+ BAT *bn;
+ BAT *ec;
+ oid *ecp, *bp;
+ oid eco;
+ const oid *gp;
+ BUN i;
-#define mark_grp_loop4(BUNhead, BUNtail, init_n) \
- do { \
- oid u = oid_nil; \
- oid n = oid_nil; \
- \
- bn->T->nil = 0; \
- BATloop(b, p, q) { \
- oid v = * (oid *) BUNtail(bi, p); \
- \
- if (v != u) { \
- init_n; \
- u = v; \
- } else if (n != oid_nil) { \
- n++; \
- } \
- if (n == oid_nil) \
- bn->T->nil =1; \
- bunfastins_nocheck_inc(bn, r, BUNhead(bi, p), &n); \
- } \
- bn->T->nonil = !bn->T->nil; \
- } while (0)
-
-#define mark_grp_loop3(BUNhead, BUNtail, BUNfnd) \
- do { \
- bn->T->nil = 0; \
- BATloop(b, p, q) { \
- oid n = oid_nil; \
- BUN w; \
- const void *v = BUNtail(bi, p); \
- oid *m; \
- \
- BUNfnd(w, gci, v); \
- if (w != BUN_NONE && *(m = (oid*) BUNtloc(gci, w)) !=
oid_nil) { \
- n = (*m)++; \
- } else \
- bn->T->nil = 1; \
- bunfastins_nocheck_inc(bn, r, BUNhead(bi, p), &n); \
- } \
- bn->T->nonil = !bn->T->nil; \
- } while (0)
-
-#define mark_grp_loop2(BUNhead, BUNtail) \
- do { \
- if (gc) { \
- BATiter gci = bat_iterator(gc); \
- \
- if (BAThdense(gc)) { \
- mark_grp_loop3(BUNhead, \
- BUNtail, BUNfndVOID); \
- } else { \
- mark_grp_loop3(BUNhead, \
- BUNtail, BUNfndOID); \
- } \
- } else { \
- if (s) { \
- mark_grp_loop4(BUNhead, \
- BUNtail, n = *s); \
- } else { \
- if (BAThdense(g)) { \
- mark_grp_loop4(BUNhead, \
- BUNtail, \
-
mark_grp_init(BUNfndVOID)); \
- } else { \
- mark_grp_loop4(BUNhead, \
- BUNtail, \
-
mark_grp_init(BUNfndOID)); \
- } \
- } \
- } \
- } while (0)
-
-BAT *
-BATmark_grp(BAT *b, BAT *g, const oid *s)
-{
- BAT *bn = NULL, *gc = NULL;
- bit trivprop = FALSE;
-
- BATcheck(b, "BATmark_grp");
BATcheck(g, "BATmark_grp");
- ERRORcheck(b->ttype != TYPE_void && b->ttype != TYPE_oid,
- "BATmark_grp: tail of BAT b must be oid.\n");
- ERRORcheck(g->htype != TYPE_void && g->htype != TYPE_oid,
- "BATmark_grp: head of BAT g must be oid.\n");
- ERRORcheck(b->ttype == TYPE_void && b->tseqbase == oid_nil,
- "BATmark_grp: tail of BAT b must not be nil.\n");
- ERRORcheck(g->htype == TYPE_void && g->hseqbase == oid_nil,
- "BATmark_grp: head of BAT g must not be nil.\n");
+ BATcheck(e, "BATmark_grp");
+ ERRORcheck(g->ttype != TYPE_void && g->ttype != TYPE_oid,
+ "BATmark_grp: tail of BAT g must be oid.\n");
+ ERRORcheck(e->htype != TYPE_void && e->htype != TYPE_oid,
+ "BATmark_grp: head of BAT e must be oid.\n");
+ ERRORcheck(g->ttype == TYPE_void && g->tseqbase == oid_nil,
+ "BATmark_grp: tail of BAT g must not be nil.\n");
+ ERRORcheck(e->htype == TYPE_void && e->hseqbase == oid_nil,
+ "BATmark_grp: head of BAT e must not be nil.\n");
ERRORcheck(s && *s == oid_nil,
"BATmark_grp: base oid s must not be nil.\n");
- ERRORcheck(!s && g->ttype != TYPE_oid,
- "BATmark_grp: tail of BAT g must be oid.\n");
+ ERRORcheck(!s && e->ttype != TYPE_oid,
+ "BATmark_grp: tail of BAT e must be oid.\n");
- if (BATcount(b) == 0 || BATcount(g) == 1) {
- if (s) {
- return BATmark(b, *s);
- } else {
- BATiter gi = bat_iterator(g);
+ assert(BAThdense(g));
+ assert(BAThdense(e));
+ assert(ATOMtype(g->ttype) == TYPE_oid);
+ assert(ATOMtype(e->ttype) == TYPE_oid);
+ assert(s == NULL || *s != oid_nil);
- return BATmark(b, *(oid *) BUNtloc(gi, BUNfirst(g)));
- }
+ if (BATtdense(g)) {
+ if (s)
+ return BATconst(g, TYPE_oid, s, TRANSIENT);
+ return BATproject(g, e);
}
- if (!BATtordered(b)) {
- if (s) {
- BUN p, q, r;
+ bn = BATnew(TYPE_void, TYPE_oid, BATcount(g), TRANSIENT);
+ if (bn == NULL)
+ return NULL;
- if (BAThdense(g)) {
- gc = BATnew(TYPE_void, TYPE_oid, BATcount(g),
TRANSIENT);
- if (gc == NULL)
- return NULL;
- r = BUNfirst(gc);
- BATloop(g, p, q) {
- bunfastapp_nocheck_inc(gc, r, s);
- }
- } else {
- BATiter gi = bat_iterator(g);
-
- gc = BATnew(TYPE_oid, TYPE_oid, BATcount(g),
TRANSIENT);
- if (gc == NULL)
- return NULL;
- r = BUNfirst(gc);
- BATloop(g, p, q) {
- bunfastins_nocheck_inc(gc, r,
BUNhloc(gi, p), s);
- }
- }
- BATsetcount(gc, BATcount(g));
- gc->hdense = BAThdense(g);
- if (gc->hdense) {
- BATseqbase(gc, g->hseqbase);
- gc->hsorted = 1;
- } else {
- gc->hsorted = BAThordered(g);
- }
- gc->hrevsorted = BAThrevordered(g);
- BATkey(gc, (gc->hdense || g->hkey != FALSE));
- gc->H->nonil = g->H->nonil;
- gc->T->nonil = 1;
- } else {
- gc = BATcopy(g, g->htype, g->ttype, TRUE, TRANSIENT);
- if (gc == NULL)
- return NULL;
- }
- }
- bn = BATnew(b->htype, TYPE_oid, BATcount(b), TRANSIENT);
- if (bn == NULL) {
- if (gc)
- BBPreclaim(gc);
+ if (s)
+ ec = BATconst(e, TYPE_oid, s, TRANSIENT);
+ else
+ ec = BATcopy(e, TYPE_void, TYPE_oid, TRUE, TRANSIENT);
+ if (ec == NULL) {
+ BBPreclaim(bn);
return NULL;
}
- {
- BUN p, q, r = BUNfirst(bn);
- BATiter bi = bat_iterator(b);
- BATiter gi = bat_iterator(g);
+ BATsetcount(bn, BATcount(g));
+ BATseqbase(bn, g->hseqbase);
+ bn->T->nil = 0;
+ if (BATcount(g) <= 1) {
+ bn->T->sorted = 1;
+ bn->T->revsorted = 1;
+ bn->T->key = 1;
+ } else {
+ bn->T->sorted = 0;
+ bn->T->revsorted = 0;
+ bn->T->key = 0;
+ }
+ ecp = (oid *) Tloc(ec, BUNfirst(ec));
+ eco = ec->hseqbase;
+ gp = (const oid *) Tloc(g, BUNfirst(g));
+ bp = (oid *) Tloc(bn, BUNfirst(bn));
- if (b->hvarsized) {
- if (b->ttype == TYPE_void) {
- mark_grp_loop2(BUNhvar, BUNtvar);
- } else {
- mark_grp_loop2(BUNhvar, BUNtloc);
- }
+ for (i = 0; i < g->batCount; i++) {
+ if (gp[i] < eco ||
+ gp[i] >= eco + BATcount(ec) ||
+ ecp[gp[i] - eco] == oid_nil) {
+ bp[i] = oid_nil;
+ bn->T->nil = 1;
} else {
- if (b->ttype == TYPE_void) {
- mark_grp_loop2(BUNhloc, BUNtvar);
- } else {
- mark_grp_loop2(BUNhloc, BUNtloc);
- }
+ bp[i] = ecp[gp[i] - eco]++;
}
- BATsetcount(bn, BATcount(b));
}
-
- trivprop = (BATcount(bn) < 2);
- ALIGNsetH(bn, b);
- bn->hsorted = trivprop || BAThordered(b);
- bn->hrevsorted = trivprop || BAThrevordered(b);
- bn->hdense = BAThdense(b) || (trivprop && b->htype == TYPE_oid);
- if (bn->hdense) {
- BATseqbase(bn, b->hseqbase);
+ BBPreclaim(ec);
+ bn->T->nonil = !bn->T->nil;
+ if (BATcount(e) == 1 && bn->T->nonil) {
+ bn->T->sorted = 1;
+ bn->T->dense = 1;
+ bn->T->key = 1;
+ if (BATcount(bn) > 0)
+ bn->T->seq = bp[0];
+ else
+ bn->T->seq = 0;
}
- BATkey(bn, (bn->hdense || b->hkey != FALSE));
- bn->tsorted = trivprop;
- bn->trevsorted = trivprop;
- bn->tdense = trivprop;
- if (BATtdense(bn)) {
- BATiter bni = bat_iterator(bn);
-
- BATseqbase(BATmirror(bn), *(oid *) BUNtloc(bni, BUNfirst(bn)));
- }
- BATkey(BATmirror(bn), trivprop);
- bn->H->nonil = b->H->nonil;
-
- if (gc)
- BBPreclaim(gc);
return bn;
- bunins_failed:
- hashfnd_failed:
- if (gc)
- BBPreclaim(gc);
- if (bn)
- BBPreclaim(bn);
- return NULL;
}
/* return a new BAT of length n with a dense head and the constant v
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list