Changeset: 8f4d2e3652d9 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8f4d2e3652d9 Modified Files: monetdb5/modules/mal/Tests/pqueue.stable.out monetdb5/modules/mal/Tests/pqueue2.mal monetdb5/modules/mal/Tests/pqueue3.mal monetdb5/modules/mal/pqueue.c Branch: default Log Message:
Refinement of the pqueue code base next step SQL testing diffs (truncated from 357 to 300 lines): diff --git a/monetdb5/modules/mal/Tests/pqueue.stable.out b/monetdb5/modules/mal/Tests/pqueue.stable.out --- a/monetdb5/modules/mal/Tests/pqueue.stable.out +++ b/monetdb5/modules/mal/Tests/pqueue.stable.out @@ -125,7 +125,7 @@ end main; [ 2@0, 2@0 ] [ 3@0, 3@0 ] [ 4@0, 6@0 ] -[ 5@0, 5@0 ] +[ 5@0, 4@0 ] #--------------------------# # h t # name # void oid # type @@ -135,8 +135,8 @@ end main; [ 2@0, 2@0 ] [ 3@0, 3@0 ] [ 4@0, 6@0 ] -[ 5@0, 5@0 ] -[ 6@0, 4@0 ] +[ 5@0, 4@0 ] +[ 6@0, 5@0 ] #--------------------------# # h t # name # void oid # type @@ -146,8 +146,8 @@ end main; [ 2@0, 2@0 ] [ 3@0, 3@0 ] [ 4@0, 6@0 ] -[ 5@0, 5@0 ] -[ 6@0, 4@0 ] +[ 5@0, 4@0 ] +[ 6@0, 5@0 ] #--------------------------# # h t # name # void oid # type @@ -177,7 +177,7 @@ end main; [ 0@0, 4@0 ] [ 1@0, 5@0 ] [ 2@0, 6@0 ] -[ 3@0, 3@0 ] +[ 3@0, 2@0 ] #--------------------------# # h t # name # void oid # type @@ -185,8 +185,8 @@ end main; [ 0@0, 4@0 ] [ 1@0, 5@0 ] [ 2@0, 6@0 ] -[ 3@0, 3@0 ] -[ 4@0, 2@0 ] +[ 3@0, 2@0 ] +[ 4@0, 3@0 ] #--------------------------# # h t # name # void oid # type @@ -194,8 +194,8 @@ end main; [ 0@0, 4@0 ] [ 1@0, 5@0 ] [ 2@0, 6@0 ] -[ 3@0, 3@0 ] -[ 4@0, 2@0 ] +[ 3@0, 2@0 ] +[ 4@0, 3@0 ] [ 5@0, 0@0 ] #--------------------------# # h t # name @@ -204,8 +204,8 @@ end main; [ 0@0, 4@0 ] [ 1@0, 5@0 ] [ 2@0, 6@0 ] -[ 3@0, 3@0 ] -[ 4@0, 2@0 ] +[ 3@0, 2@0 ] +[ 4@0, 3@0 ] [ 5@0, 0@0 ] [ 6@0, 1@0 ] #--------------------------# @@ -215,8 +215,8 @@ end main; [ 0@0, 4@0 ] [ 1@0, 5@0 ] [ 2@0, 6@0 ] -[ 3@0, 3@0 ] -[ 4@0, 2@0 ] +[ 3@0, 2@0 ] +[ 4@0, 3@0 ] [ 5@0, 0@0 ] [ 6@0, 1@0 ] diff --git a/monetdb5/modules/mal/Tests/pqueue2.mal b/monetdb5/modules/mal/Tests/pqueue2.mal --- a/monetdb5/modules/mal/Tests/pqueue2.mal +++ b/monetdb5/modules/mal/Tests/pqueue2.mal @@ -23,18 +23,6 @@ bat.append(b,3); io.print(b); -c:= bat.new(:oid,:str); - -bat.append(c,"sjoerd"); -bat.append(c,"peter"); -bat.append(c,"stefan"); -bat.append(c,"stefan"); -bat.append(c,"niels"); -bat.append(c,"martin"); -bat.append(c,"stefan"); - -io.print(c); - # topn of b, new interface should return void,oid(position) bp:= pqueue.topn_min(b,0:wrd); io.print(bp); diff --git a/monetdb5/modules/mal/Tests/pqueue3.mal b/monetdb5/modules/mal/Tests/pqueue3.mal --- a/monetdb5/modules/mal/Tests/pqueue3.mal +++ b/monetdb5/modules/mal/Tests/pqueue3.mal @@ -24,23 +24,23 @@ bat.append(a,"stefan"); io.print(a); # topn of b, new interface should return void,oid(position) -bp:= pqueue.topn_min(b,0:wrd); +bp:= pqueue.topn_min(a,0:wrd); io.print(bp); -bp:= pqueue.topn_min(b,1:wrd); +bp:= pqueue.topn_min(a,1:wrd); io.print(bp); -bp:= pqueue.topn_min(b,2:wrd); +bp:= pqueue.topn_min(a,2:wrd); io.print(bp); -bp:= pqueue.topn_min(b,3:wrd); +bp:= pqueue.topn_min(a,3:wrd); io.print(bp); -bp:= pqueue.topn_min(b,4:wrd); +bp:= pqueue.topn_min(a,4:wrd); io.print(bp); -bp:= pqueue.topn_min(b,5:wrd); +bp:= pqueue.topn_min(a,5:wrd); io.print(bp); -bp:= pqueue.topn_min(b,6:wrd); +bp:= pqueue.topn_min(a,6:wrd); io.print(bp); -bp:= pqueue.topn_min(b,7:wrd); +bp:= pqueue.topn_min(a,7:wrd); io.print(bp); -bp:= pqueue.topn_min(b,8:wrd); +bp:= pqueue.topn_min(a,8:wrd); io.print(bp); # utopn only count the unique values - topn of b, 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 @@ -20,22 +20,17 @@ #include "monetdb_config.h" #include "pqueue.h" -#define QTOPN_shuffle(TYPE,OPER,LAB)\ -{ TYPE *val = (TYPE *) Tloc(b,BUNfirst(b)), v;\ +#define QTOPN_shuffle(TYPE,OPER)\ +{ TYPE *val = (TYPE *) Tloc(b,BUNfirst(b));\ for(o = 0; o < lim; o++){\ - v = val[o];\ - oo = o;\ - if( top == size && !((TYPE) v OPER (TYPE) val[idx[top-1]]) )\ + if( top == size && !((TYPE) val[o] OPER (TYPE) val[idx[top-1]]) )\ continue;\ - for (i= 0; i<top; i++)\ - if ( (TYPE) v OPER (TYPE) val[idx[i]]) {\ - v= val[idx[i]];\ - tmp = idx[i];\ - idx[i]= oo;\ - oo = tmp;\ - } \ - if( top < size)\ - idx[top++] = oo;\ + idx[top] = o;\ + for (i= top; i> 0; i--)\ + if ( (TYPE) val[idx[i]] OPER (TYPE) val[idx[i-1]]) {\ + tmp = idx[i]; idx[i]= idx[i-1]; idx[i-1] = tmp;\ + } else break; \ + if( top < size) top++;\ }\ } @@ -44,8 +39,8 @@ str PQtopn_minmax(Client cntxt, MalBlkPt int tpe, *ret; BAT *b,*bn; BUN i, size,top = 0; - oid *idx, lim, o, oo, tmp, off; - int max = 0; + oid *idx, lim, o, tmp, off; + int max = 0,min=0; (void) cntxt; ret = (int*) getArgReference(stk, pci, 0); @@ -53,8 +48,9 @@ str PQtopn_minmax(Client cntxt, MalBlkPt size = (BUN) *(wrd*) getArgReference(stk,pci,2); max = strstr(getFunctionId(pci),"max") != 0; + min = strstr(getFunctionId(pci),"min") != 0; - max = (max)?0:1; + assert(max+min == 1); b = BATdescriptor(*(bat *) getArgReference(stk, pci, 1)); if (!b) throw(MAL, "topn_min", RUNTIME_OBJECT_MISSING); @@ -86,59 +82,50 @@ str PQtopn_minmax(Client cntxt, MalBlkPt } // shuffle insert new values, keep it simple! if( size){ + if ( min ) + switch(tpe){ + case TYPE_bte: QTOPN_shuffle(bte,<) break; + case TYPE_sht: QTOPN_shuffle(sht,<) break; + case TYPE_int: QTOPN_shuffle(int,<) break; + case TYPE_wrd: QTOPN_shuffle(wrd,<) break; + case TYPE_lng: QTOPN_shuffle(lng,<) break; + case TYPE_flt: QTOPN_shuffle(flt,<) break; + case TYPE_dbl: QTOPN_shuffle(dbl,<) break; + default: + for(o = 0; o < lim; o++){ + if( top == size && atom_CMP((void*) Tloc(b,o), (void*) Tloc(b,idx[top-1]), tpe) > 0 ) + continue; + idx[top] = o; + for (i= top; i> 0; i--) + if ( atom_CMP( Tloc(b,idx[i]), Tloc(b,idx[i-1]), tpe) < 0) { + tmp = idx[i]; idx[i]= idx[i-1]; idx[i-1] = tmp; + } else break; + if( top < size) + top++; + } + } if ( max ) switch(tpe){ - case TYPE_bte: QTOPN_shuffle(bte,>,GTR) break; - case TYPE_sht: QTOPN_shuffle(sht,>,GTR) break; - case TYPE_int: QTOPN_shuffle(int,>,GTR) break; - case TYPE_wrd: QTOPN_shuffle(wrd,>,GTR) break; - case TYPE_lng: QTOPN_shuffle(lng,>,GTR) break; - case TYPE_flt: QTOPN_shuffle(flt,>,GTR) break; - case TYPE_dbl: QTOPN_shuffle(dbl,>,GTR) break; + case TYPE_bte: QTOPN_shuffle(bte,>) break; + case TYPE_sht: QTOPN_shuffle(sht,>) break; + case TYPE_int: QTOPN_shuffle(int,>) break; + case TYPE_wrd: QTOPN_shuffle(wrd,>) break; + case TYPE_lng: QTOPN_shuffle(lng,>) break; + case TYPE_flt: QTOPN_shuffle(flt,>) break; + case TYPE_dbl: QTOPN_shuffle(dbl,>) break; default: - { void *v; - for(o = 0; o < lim; o++){ - v = (void*) Tloc(b,o); - oo = o; - for (i= 0; i<top; i++) - if ( atom_CMP( v, Tloc(b,idx[i]), tpe) > 0) { - v = Tloc(b,idx[i]); - tmp = idx[i]; - idx[i]= oo; - oo = tmp; - } + if( top == size && atom_CMP((void*) Tloc(b,o), (void*) Tloc(b,idx[top-1]), tpe) < 0 ) + continue; + idx[top] = o; + for (i= top; i> 0; i--) + if ( atom_CMP( Tloc(b,idx[i]), Tloc(b,idx[i-1]), tpe) > 0) { + tmp = idx[i]; idx[i]= idx[i-1]; idx[i-1] = tmp; + } else break; if( top < size) - idx[top++] = oo; + top++; } } - } - if ( max == 0 ) - switch(tpe){ - case TYPE_bte: QTOPN_shuffle(bte,<,LESS) break; - case TYPE_sht: QTOPN_shuffle(sht,<,LESS) break; - case TYPE_int: QTOPN_shuffle(int,<,LESS) break; - case TYPE_wrd: QTOPN_shuffle(wrd,<,LESS) break; - case TYPE_lng: QTOPN_shuffle(lng,<,LESS) break; - case TYPE_flt: QTOPN_shuffle(flt,<,LESS) break; - case TYPE_dbl: QTOPN_shuffle(dbl,<,LESS) break; - default: - { void *v; - for(o = 0; o < lim; o++){ - v = (void*) Tloc(b,o); - oo = o; - for (i= 0; i<top; i++) - if ( atom_CMP( v, Tloc(b,idx[i]), tpe) < 0) { - v = Tloc(b,idx[i]); - tmp = idx[i]; - idx[i]= oo; - oo = tmp; - } - if( top < size) - idx[top++] = oo; - } - } - } } BATsetcount(bn, (BUN) top); @@ -159,7 +146,7 @@ str PQtopn_minmax(Client cntxt, MalBlkPt _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list