Changeset: c134bcfe1c7e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c134bcfe1c7e
Modified Files:
        MonetDB5/src/modules/mal/pqueue.mx
        MonetDB5/src/optimizer/opt_mergetable.mx
Branch: Oct2010
Log Message:

fixed problems in multi column topn


diffs (77 lines):

diff -r a65c9a137a83 -r c134bcfe1c7e MonetDB5/src/modules/mal/pqueue.mx
--- a/MonetDB5/src/modules/mal/pqueue.mx        Wed Sep 15 14:57:55 2010 +0200
+++ b/MonetDB5/src/modules/mal/pqueue.mx        Wed Sep 15 14:58:13 2010 +0200
@@ -954,16 +954,13 @@
        bn = BATnew(TYPE_oid, TYPE_oid, n);
        for(i=0; i<n; ) {
                oid *v = (oid*)Tloc(a,i), ov = *v; 
-               for( j=i; j<n; j++) {
-                       v = (oid*)Tloc(a,j);
-                       if (*v != ov) 
-                               break;
-               }
+               for( j=i; *v == ov; j++, v = (oid*)Tloc(a,j))
+                       ;
                if (j == i+1) {
                        BUNins(bn, Hloc(a,i), &ov, FALSE);
                } else {
                        BAT *s = BATslice(b, i, j), *sbn = NULL;
-                       wrd nn = n-j;
+                       wrd nn = n-i;
 
                        if ((b->htype == TYPE_void ? 
pqueue_topn_v...@1@2(&sbn,s,&nn) : pqueue_to...@1@2(&sbn,s,&nn)) == GDK_SUCCEED 
&& sbn) {
                                BATins(bn, sbn, FALSE);
@@ -1006,16 +1003,13 @@
        bn = BATnew(TYPE_oid, TYPE_oid, n);
        for(i=0; i<n; ) {
                oid *v = (oid*)Tloc(a,i), ov = *v; 
-               for( j=i; j<n; j++) {
-                       v = (oid*)Tloc(a,j);
-                       if (*v != ov) 
-                               break;
-               }
+               for( j=i; *v == ov; j++, v = (oid*)Tloc(a,j))
+                       ;
                if (j == i+1) {
                        BUNins(bn, Hloc(a,i), &ov, FALSE);
                } else {
                        BAT *s = BATslice(b, i, j), *sbn = NULL;
-                       wrd nn = n-j;
+                       wrd nn = n-i;
 
                        if ((b->htype == TYPE_void ? 
pqueue_utopn_v...@1@2(&sbn,s,&nn) : pqueue_uto...@1@2(&sbn,s,&nn)) == 
GDK_SUCCEED && sbn) {
                                BATins(bn, sbn, FALSE);
diff -r a65c9a137a83 -r c134bcfe1c7e MonetDB5/src/optimizer/opt_mergetable.mx
--- a/MonetDB5/src/optimizer/opt_mergetable.mx  Wed Sep 15 14:57:55 2010 +0200
+++ b/MonetDB5/src/optimizer/opt_mergetable.mx  Wed Sep 15 14:58:13 2010 +0200
@@ -1227,13 +1227,29 @@
                }
                pushInstruction(mb, pck);
 
+               /* first project using the current topn as the next topn
+                * operators need aligned bats 
+                */
+               var = getArg(pck,0);
+               if (cur_topn) {
+                       InstrPtr mi = bat_mirror(mb, cur_topn);
+                       q = newInstruction(mb, ASSIGNsymbol);
+                       setModuleId(q, algebraRef);
+                       setFunctionId(q, leftjoinRef);
+                       getArg(q, 0) = newTmpVariable(mb, tpe);
+                       q = pushArgument(mb, q, getArg(mi, 0));
+                       q = pushArgument(mb, q, var);
+                       pushInstruction(mb, q);
+                       var = getArg(q,0);
+               }
+
                /* re-do the topn */
                if (!slc)
                        tpe = newBatType(TYPE_oid, TYPE_oid);
                getArg(tpn, arg++) = newTmpVariable(mb, tpe);
                if (cur_topn)
                        getArg(tpn, arg++) = cur_topn;
-               getArg(tpn, arg) = getArg(pck, 0);
+               getArg(tpn, arg) = var;
                        
                pushInstruction(mb, tpn);
                cur_topn = getArg(tpn, 0);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to