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