Changeset: e587463c1a47 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e587463c1a47 Modified Files: monetdb5/modules/mal/mat.c Branch: mutation Log Message:
Use newer mat operation diffs (129 lines): diff --git a/monetdb5/modules/mal/mat.c b/monetdb5/modules/mal/mat.c --- a/monetdb5/modules/mal/mat.c +++ b/monetdb5/modules/mal/mat.c @@ -84,12 +84,13 @@ MAThasMoreElements(Client cntxt, MalBlkP * do not produce RUNTIME_OBJECT_MISSING. */ static str -MATpackInternal(MalStkPtr stk, InstrPtr p) +MATpackInternal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p) { int i, *ret = (int*) getArgReference(stk,p,0); BAT *b, *bn; BUN cap = 0; int tt = TYPE_any; + int sorted =1, keyed=1, voidheaded=1; for (i = 1; i < p->argc; i++) { int bid = stk->stk[getArg(p,i)].val.ival; @@ -105,11 +106,16 @@ MATpackInternal(MalStkPtr stk, InstrPtr tt = b->ttype; cap += BATcount(b); } + if ( !b->tsorted) sorted =0; + if ( !b->tkey) keyed =0; + if ( b->htype != TYPE_void ) voidheaded =0; } if (tt == TYPE_any){ *ret = 0; return MAL_SUCCEED; } + if (tt == TYPE_oid && sorted && keyed && voidheaded) + return MATmergepack(cntxt, mb, stk, p); bn = BATnew(TYPE_void, tt, cap); if (bn == NULL) @@ -435,9 +441,7 @@ MATpack3(Client cntxt, MalBlkPtr mb, Mal str MATpack(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p) { - (void) cntxt; - (void) mb; - return MATpackInternal(stk,p); + return MATpackInternal(cntxt,mb,stk,p); } // merging multiple OID lists, optimized for empty bats @@ -445,9 +449,9 @@ MATpack(Client cntxt, MalBlkPtr mb, MalS str MATmergepack(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p) { - int i, *ret = (int*) getArgReference(stk,p,0); + int i,j= 0, *ret = (int*) getArgReference(stk,p,0); int top=0; - oid **o_end, **o_src; + oid **o_end, **o_src, *o, *oo, onxt; BAT *b, *bn, *bm, **bats; BUN cap = 0; @@ -469,9 +473,17 @@ MATmergepack(Client cntxt, MalBlkPtr mb, if (b ){ cap += BATcount(b); if ( BATcount(b) ){ - o_src[top] = (oid*) Tloc(b,BUNfirst(b)); - o_end[top] = o_src[top] + BATcount(b); - bats[top++] = b; + // pre-sort the arguments + onxt = *(oid*) Tloc(b,BUNfirst(b)); + for( j =top; j > 0 && onxt < *o_src[j-1]; j--){ + o_src[j] = o_src[j-1]; + o_end[j] = o_end[j-1]; + bats[j] = bats[j-1]; + } + o_src[j] = (oid*) Tloc(b,BUNfirst(b)); + o_end[j] = o_src[top] + BATcount(b); + bats[j] = b; + top++; } } } @@ -483,23 +495,42 @@ MATmergepack(Client cntxt, MalBlkPtr mb, BATseqbase(bn, 0); BATseqbase(BATmirror(bn), 0); BBPkeepref(*ret = bn->batCacheid); + GDKfree(bats); + GDKfree(o_src); + GDKfree(o_end); return MAL_SUCCEED; } BATseqbase(bn, bats[0]->hseqbase); - // UNROLL THE MULTI-BAT MERGE, TODO - for (i = 0; i < top; i++) - if ( o_src[i] < o_end[i]){ - bm = BATmergecand(bn,bats[i]); - BBPunfix(bn->batCacheid); - bn = bm; + // UNROLL THE MULTI-BAT MERGE + o = (oid*) Tloc(bn,BUNfirst(bn)); + while( top){ + *o++ = *o_src[0]; + o_src[0]++; + if( o_src[0] == o_end[0]){ + // remove this one + for(j=0; j< top; j++){ + o_src[j]= o_src[j+1]; + o_end[j]= o_end[j+1]; + bats[j] = bats[j+1]; + } + top--; + } else{ + onxt= *o_src[0]; + for( j=1; j< top && onxt > *o_src[j]; j++){ + oo = o_src[j]; o_src[j]= o_src[j-1]; o_src[j-1]= oo; + oo = o_end[j]; o_end[j]= o_end[j-1]; o_end[j-1]= oo; + bm = bats[j]; bats[j]=bats[j-1]; bats[j-1] = bm; + } + } } for( i=0; i< top; i++) BBPunfix(bats[i]->batCacheid); + BATsettrivprop(bn); GDKfree(bats); GDKfree(o_src); GDKfree(o_end); /* properties */ - //BATsetcount(bn, (BUN) (p - (oid *) Tloc(bn, BUNfirst(bn)))); + BATsetcount(bn, (BUN) (o - (oid *) Tloc(bn, BUNfirst(bn)))); BATseqbase(bn, 0); bn->trevsorted = 0; bn->tsorted = 1; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list