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

Reply via email to