Changeset: 7bd377d7b351 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7bd377d7b351 Added Files: sql/benchmarks/tpch/drop.sql Modified Files: monetdb5/modules/mal/pqueue.c monetdb5/modules/mal/pqueue.mal monetdb5/optimizer/opt_mergetable.c sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_gencode.c sql/backends/monet5/sql_statement.c sql/backends/monet5/sql_statement.h Branch: default Log Message:
use new pqueue interface diffs (truncated from 2157 to 300 lines): diff --git a/monetdb5/modules/mal/pqueue.c b/monetdb5/modules/mal/pqueue.c --- a/monetdb5/modules/mal/pqueue.c +++ b/monetdb5/modules/mal/pqueue.c @@ -17,1398 +17,9 @@ * All Rights Reserved. */ -/* - * Nikos Mamoulis, Niels Nes - * Priority queues - * - * This module includes functions for accessing and updating a pqueue. - * A pqueue is an (oid,any) bat. The tail is used as a comparison key. - * The first element of the pqueue is the smallest one in a min-pqueue - * or the largest one in a max-pqueue. - * Each element is larger than (smaller than) or equal to - * its parent which is defined by (position/2) if position is odd or - * (position-1)/2 if position is even (positions are from 0 to n-1). - * The head of the bat is used to keep track of the object-ids which are - * organized in the heap with respect to their values (tail column). - * - */ - #include "monetdb_config.h" #include "pqueue.h" -/* returns the parent of a pqueue position */ -static inline BUN -parent(BUN posel) -{ - if (posel % 2) /*odd */ - return posel / 2; - else - return (posel - 1) / 2; -} - -/* initialize pqueue */ -static int -do_pqueue_init(BAT **h, BAT *b, BUN maxsize) -{ - *h = BATnew(TYPE_oid, b->ttype, maxsize); - if (*h == NULL) - return GDK_FAIL; - (*h)->batDirty |= 2; - return GDK_SUCCEED; -} - -static int -pqueue_init(BAT **h, BAT *b, wrd *maxsize) -{ - return do_pqueue_init(h, b, (BUN) *maxsize); -} - -#define ht_swap(tpe,cur,ins) \ - do { \ - oid htmp = *(oid*)BUNhloc(hi,cur); \ - tpe ttmp = *(tpe*)BUNtloc(hi,cur); \ - *(oid*)BUNhloc(hi,cur) = *(oid*)BUNhloc(hi,ins); \ - *(tpe*)BUNtloc(hi,cur) = *(tpe*)BUNtloc(hi,ins); \ - *(oid*)BUNhloc(hi,ins) = htmp; \ - *(tpe*)BUNtloc(hi,ins) = ttmp; \ - } while (0) - -#define any_swap(cur,ins,ts) \ - do { \ - unsigned int i; \ - char ch; \ - /* only swap the locations (ie var_t's) */ \ - char *c1 = BUNtloc(hi,cur), *c2 = BUNtloc(hi,ins); \ - oid htmp = *(oid*)BUNhloc(hi,cur); \ - *(oid*)BUNhloc(hi,cur) = *(oid*)BUNhloc(hi,ins); \ - *(oid*)BUNhloc(hi,ins) = htmp; \ - for(i=0;i<ts;i++) { \ - ch= c1[i]; c1[i]=c2[i]; c2[i]=ch; \ - } \ - } while (0) - -#define pqueueimpl_minmax(TYPE,NAME,OPER) \ - /*enqueue an element*/ \ - static int pqueue_enqueue_##NAME(BAT *h, oid *idx, TYPE *el) \ - { \ - BATiter hi = bat_iterator(h); \ - BUN ins,cur; \ - \ - BUN hbase = BUNfirst(h); \ - BUN p, posel = BATcount(h); /*last position*/ \ - \ - BUNins(h, (ptr)idx, (ptr)el, FALSE); \ - ins = hbase+posel; \ - \ - while(posel >0) { \ - p=parent(posel); \ - cur = hbase+p; \ - if (*(TYPE *)BUNtloc(hi,ins) OPER *(TYPE *)BUNtloc(hi,cur)) { \ - /* swap element with its parent */ \ - ht_swap(TYPE,cur,ins); \ - ins = cur; \ - posel = parent(posel); \ - } \ - else break; \ - } \ - h->hsorted = h->tsorted = FALSE; \ - h->hrevsorted = h->trevsorted = FALSE; \ - \ - return GDK_SUCCEED; \ - } \ - \ - /* moves down the root element */ \ - /* used by dequeue (see below) */ \ - static int pqueue_movedowntop_##NAME(BAT *h) \ - { \ - BATiter hi = bat_iterator(h); \ - BUN swp, cur, hbase = BUNfirst(h); \ - BUN swap, num_elems = BATcount(h); \ - BUN posel = 0; \ - \ - cur = hbase; \ - \ - /*while posel is not a leaf and pqueue[posel].tail > any of childen*/ \ - while (posel*2+1 < num_elems) { /*there exists a left son*/ \ - if (posel*2+2< num_elems) { /*there exists a right son*/ \ - if (*(TYPE *)BUNtloc(hi,hbase+(posel*2+1)) OPER \ - *(TYPE *)BUNtloc(hi,hbase+(posel*2+2))) \ - swap = posel*2+1; \ - else \ - swap = posel*2+2; \ - } else \ - swap = posel*2+1; \ - \ - swp = hbase+swap; \ - \ - if (*(TYPE *)BUNtloc(hi,swp) OPER *(TYPE *)BUNtloc(hi,cur)) { \ - /*swap elements*/ \ - ht_swap(TYPE,cur,swp); \ - cur = swp; \ - posel = swap; \ - } else \ - break; \ - } \ - \ - return GDK_SUCCEED; \ - } \ - \ - /* removes the root element, puts the last element as root and */ \ - /* moves it down */ \ - static int pqueue_dequeue_##NAME(BAT *h) \ - { \ - BATiter hi = bat_iterator(h); \ - BUN hbase; \ - BUN num_elements; \ - \ - if (!(num_elements = BATcount(h))) { \ - /* pqueue_dequeue: Cannot dequeue from empty queue */ \ - return GDK_FAIL; \ - } \ - \ - hbase = BUNfirst(h); \ - \ - /* copy last element to the first position*/ \ - ht_swap(TYPE,hbase, hbase+(num_elements-1)); \ - \ - /*delete last element*/ \ - BUNdelete(h, hbase+(num_elements-1), FALSE); \ - \ - pqueue_movedowntop_##NAME(h); \ - return GDK_SUCCEED; \ - } \ - \ - /* replaces the top element with the input if it is larger */ \ - /* (smaller) and \ updates the heap */ \ - static int pqueue_topreplace_##NAME(BAT *h, oid *idx, TYPE *el) \ - { \ - BATiter hi = bat_iterator(h); \ - BUN hbase; \ - \ - hbase = BUNfirst(h); \ - \ - if (*(TYPE *)BUNtloc(hi,hbase) OPER *el) { \ - *(oid*)BUNhloc(hi,hbase) = *idx; \ - *(TYPE*)BUNtloc(hi,hbase) = *el; \ - pqueue_movedowntop_##NAME(h); \ - } \ - \ - return GDK_SUCCEED; \ - } \ - \ - /* TopN, based on ##NAME-pqueue */ \ - \ - static BAT * \ - heap2bat_##NAME(BAT *h) \ - { \ - BAT *r, *n = BATnew(TYPE_oid, TYPE_oid, BATcount(h)); \ - BUN f = BUNfirst(h); \ - oid *o = (oid*)Hloc(h, f), oo = *o; \ - TYPE *v = (TYPE*)Tloc(h, f), ov = *v; \ - \ - for(f = BUNfirst(h); f < BUNlast(h); f = BUNfirst(h)) { \ - o = (oid*)Hloc(h, f); \ - v = (TYPE*)Tloc(h, f); \ - if (ov != *v) { \ - oo = *o; \ - ov = *v; \ - } \ - BUNins(n, o, &oo, FALSE); \ - pqueue_dequeue_##NAME(h); \ - } \ - r = BATrevert(n); \ - return r; \ - } \ - \ - static int pqueue_topn_void##NAME(BAT **H, BAT *t, wrd *N) \ - { \ - BAT *h = NULL; \ - BATiter ti = bat_iterator(t); \ - TYPE *v; \ - BUN i, n = BATcount(t); \ - oid idx = t->hseqbase; \ - \ - if (*N != wrd_nil && *N >= 0 && *N <= (wrd) BUN_MAX && (BUN) *N < n) \ - n = (BUN) *N; \ - if (do_pqueue_init(&h,t,n) == GDK_FAIL) \ - return GDK_FAIL; \ - v = (TYPE*)BUNtail(ti,BUNfirst(t)); \ - \ - for(i=0; i<n; i++, idx++, v++) { \ - pqueue_enqueue_##NAME(h, &idx, v); \ - } \ - n = BATcount(t); \ - for(; i<n; i++, idx++, v++) { \ - pqueue_topreplace_##NAME(h, &idx, v); \ - } \ - *H = heap2bat_##NAME(h); \ - BBPunfix(h->batCacheid); \ - return GDK_SUCCEED; \ - } \ - \ - static int pqueue_topn_##NAME(BAT **H, BAT *t, wrd *N) \ - { \ - BAT *h = NULL; \ - BATiter ti = bat_iterator(t); \ - BUN i, n = BATcount(t); \ - BUN p = BUNfirst(t); \ - \ - if (*N != wrd_nil && *N >= 0 && *N <= (wrd) BUN_MAX && (BUN) *N < n) \ - n = (BUN) *N; \ - if (do_pqueue_init(&h,t,n) == GDK_FAIL) \ - return GDK_FAIL; \ - \ - for(i=0; i<n; i++, p++) { \ - pqueue_enqueue_##NAME(h, (oid*)BUNhloc(ti,p), (TYPE*)BUNtloc(ti,p)); \ - } \ - n = BATcount(t); \ - for(; i<n; i++, p++) { \ - pqueue_topreplace_##NAME(h, (oid*)BUNhloc(ti,p), (TYPE*)BUNtloc(ti,p)); \ - } \ - *H = heap2bat_##NAME(h); \ - BBPunfix(h->batCacheid); \ - return GDK_SUCCEED; \ - } \ - \ - /* TopN (unique values), based on ##NAME-pqueue */ \ - \ - static int pqueue_utopn_void##NAME(BAT **H, BAT *t, wrd *N) \ - { \ - BAT *duplicates = NULL, *b; \ - BATiter ti = bat_iterator(t); \ - TYPE *v; \ - BUN i, j, n, cnt = BATcount(t), p; \ - oid idx = t->hseqbase; \ - \ - n = cnt; \ - if (*N != wrd_nil && *N >= 0 && *N <= (wrd) BUN_MAX) \ - n = (BUN) *N; \ - if (do_pqueue_init(H,t,n) == GDK_FAIL) \ - return GDK_FAIL; \ - duplicates = BATnew(TYPE_oid, TYPE_oid, n); \ - if (duplicates == NULL) { \ - BBPunfix((*H)->batCacheid); \ - return GDK_FAIL; \ - } \ - v = (TYPE*)BUNtail(ti,BUNfirst(t)); \ - \ - for(i=0, j=0; j < cnt && i<n; j++, idx++, v++) { \ - if ((p = BUNfnd(BATmirror(*H), v)) == BUN_NONE) { \ - pqueue_enqueue_##NAME(*H, &idx, v); \ - HASHdestroy(*H); \ - BUNins(duplicates, &idx, &idx, FALSE); \ - i++; \ - } else { \ - BUNins(duplicates, Hloc(*H, p), &idx, FALSE); \ - } \ - } \ - for(; j<cnt; j++, idx++, v++) { \ - if (*(TYPE *)Tloc(*H,BUNfirst(*H)) OPER##= *v) { \ - if ((p = BUNfnd(BATmirror(*H), v)) == BUN_NONE) { \ - oid o_idx = *(oid*)Hloc(*H, BUNfirst(*H)); \ - BUNdelHead(duplicates, &o_idx, TRUE); \ - pqueue_topreplace_##NAME(*H, &idx, v); \ - HASHdestroy(*H); \ - BUNins(duplicates, &idx, &idx, FALSE); \ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list