Changeset: 4dc46abb5f69 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4dc46abb5f69
Modified Files:
        MonetDB5/src/modules/kernel/group.mx
        MonetDB5/src/modules/mal/mat.mx
        MonetDB5/src/optimizer/opt_mergetable.mx
        MonetDB5/src/optimizer/opt_support.mx
        sql/src/backends/monet5/sql.mx
        sql/src/backends/monet5/sql_optimizer.mx
        sql/src/server/rel_bin.mx
        sql/src/server/sql_mvc.mx
        sql/src/test/Tests/big-example.stable.out
        sql/src/test/Tests/marcin2.stable.out
        sql/src/test/leaks/Tests/check0.stable.out
        sql/src/test/leaks/Tests/check1.stable.out
        sql/src/test/leaks/Tests/check2.stable.out
        sql/src/test/leaks/Tests/check3.stable.out
        sql/src/test/leaks/Tests/check4.stable.out
        sql/src/test/leaks/Tests/check5.stable.out
Branch: Oct2010
Log Message:

mitosis + sorting now works.

Also disabled mitosis for point queries.


diffs (truncated from 1541 to 300 lines):

diff -r b951d852d683 -r 4dc46abb5f69 MonetDB5/src/modules/kernel/group.mx
--- a/MonetDB5/src/modules/kernel/group.mx      Thu Sep 30 15:07:36 2010 +0200
+++ b/MonetDB5/src/modules/kernel/group.mx      Fri Oct 01 08:34:58 2010 +0200
@@ -276,6 +276,7 @@
 
 /* used by rdf_shredder.mx */
 group_export int CTrefine(BAT **res, BAT *b, BAT *a);
+group_export int CTrefine_rev(BAT **res, BAT *b, BAT *a);
 
 #endif /* _GROUP_H_ */
 @c
@@ -1689,7 +1690,7 @@
        return refine(res, b, a, FALSE);
 }
 
-static int
+int
 CTrefine_rev(BAT **res, BAT *b, BAT *a)
 {
        return refine(res, b, a, TRUE);
diff -r b951d852d683 -r 4dc46abb5f69 MonetDB5/src/modules/mal/mat.mx
--- a/MonetDB5/src/modules/mal/mat.mx   Thu Sep 30 15:07:36 2010 +0200
+++ b/MonetDB5/src/modules/mal/mat.mx   Fri Oct 01 08:34:58 2010 +0200
@@ -69,6 +69,34 @@
 address MATpackSlice
 comment "Materialize a sliced MAT into a BAT";
 
+pattern project(map:bat[:void,:bte], 
b:bat[:any_1,:any_2]...):bat[:any_1,:any_2]
+address MATproject
+comment "project using the map bat (contains which bat to use in scan order)";
+
+pattern project(map:bat[:void,:bte], b:bat[:any_1,:any_2]...):bat[:void,:any_2]
+address MATproject
+comment "project using the map bat (contains which bat to use in scan order)";
+
+pattern sortTail(b:bat[:any_1,:any_2]...)
+       (sorted:bat[:void,:any_2], map:bat[:void,:bte]) 
+address MATsortTail
+comment "Returns a BAT copy sorted on the head column.";
+
+pattern sortReverseTail(b:bat[:any_1,:any_2]...)
+       (sorted:bat[:void,:any_2], map:bat[:void,:bte]) 
+address MATsortReverseTail
+comment "Returns a BAT copy sorted on the head column.";
+
+pattern refine(sorted:bat[:void,:any_2], map:bat[:void,:bte], 
b:bat[:any_1,:any_3]...)
+       (rsorted:bat[:void,:oid], rmap:bat[:void,:bte]) 
+address MATrefine
+comment "refine map.";
+
+pattern refine_rev(sorted:bat[:void,:any_2], map:bat[:void,:bte], 
b:bat[:any_1,:any_3]...)
+       (rsorted:bat[:void,:oid], rmap:bat[:void,:bte]) 
+address MATrefineReverse
+comment "refine map.";
+
 pattern print(b:bat[:any_1,:any_2]...):void
 address MATprint;
 
@@ -120,6 +148,7 @@
 @c
 #include "mal_config.h"
 #include "mat.h"
+#include "group.h"
 
 str
 MATnewIterator(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p)
@@ -444,4 +473,476 @@
        return MAL_SUCCEED;
 }
 
+static BAT *
+MATproject_any( BAT *map, BAT **bats, unsigned int len )
+{
+       BAT *res;
+       BUN i, cnt = BATcount(map);
+       BATiter *bats_i;
+       BUN *batsT;
+       bte *mapT;
+
+       res = BATnew(TYPE_void, bats[0]->ttype, cnt);
+       BATseqbase(res, map->hseqbase);
+       mapT = (bte*)Tloc(map, 0);
+       batsT = (BUN*)GDKmalloc(sizeof(BUN) * len);
+       bats_i = (BATiter*)GDKmalloc(sizeof(BATiter) * len);
+       for (i=0; i<len; i++) {
+               batsT[i] = 0;
+               bats_i[i] = bat_iterator(bats[i]);
+       }
+       for (i=0; i<cnt; i++)
+               BUNappend(res, BUNtail(bats_i[mapT[i]], batsT[mapT[i]]++), 
FALSE);
+       GDKfree(batsT);
+       return res;
+}
+
+...@= project
+static BAT *
+matproje...@1( BAT *map, BAT **bats, unsigned int len )
+{
+       BAT *res;
+       BUN i, cnt = BATcount(map);
+       @1 *resT, **batsT;
+       bte *mapT;
+
+       res = BATnew(TYPE_void, bats[0]->ttype, cnt);
+       BATseqbase(res, map->hseqbase);
+       resT = (@1*)Tloc(res, 0);
+       mapT = (bte*)Tloc(map, 0);
+       batsT = (@1**)GDKmalloc(sizeof(@1*) * len);
+       for (i=0; i<len; i++)
+               batsT[i] = (@1*)Tloc(bats[i], 0);
+       for (i=0; i<cnt; i++)
+               resT[i] = *batsT[mapT[i]]++;
+       BATsetcount(res, i);
+       GDKfree(batsT);
+       return res;
+}
+...@c
+@:project(bte)@
+@:project(sht)@
+@:project(int)@
+@:project(lng)@
+
+static int
+MATnonil( BAT **bats, int len)
+{
+       int i, nonil = 1;
+
+       for (i=0; i<len && nonil; i++) {
+               nonil &= bats[i]->T->nonil;
+       }
+       return nonil;
+}
+
+BAT *
+MATproject_( BAT *map, BAT **bats, int len ) 
+{
+       BAT *res = NULL;
+
+       if (ATOMstorage(bats[0]->ttype) <= TYPE_void) {
+               //error
+       } else if (ATOMstorage(bats[0]->ttype) <= TYPE_bte) {
+               res = MATproject_bte(map, bats, len);
+       } else if (ATOMstorage(bats[0]->ttype) <= TYPE_sht) {
+               res = MATproject_sht(map, bats, len);
+       } else if (ATOMstorage(bats[0]->ttype) <= TYPE_int) {
+               res = MATproject_int(map, bats, len);
+       } else if (ATOMstorage(bats[0]->ttype) <= TYPE_lng) {
+               res = MATproject_lng(map, bats, len);
+       } else {
+               res = MATproject_any(map, bats, len);
+       }
+       res->tsorted = 0;
+       res->T->nonil = MATnonil(bats, len);
+       return res;
+}
+
+str
+MATproject(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       bat *res_id = (bat*) getArgReference(stk,pci,0);
+       bat map_id = *(bat*) getArgReference(stk,pci,1);
+       BAT *res = NULL, *map;
+       /* rest of the args are parts, (excluding result and map) */
+       BAT **bats = GDKzalloc(sizeof(BAT*) * pci->argc - 2);
+       BUN i, cnt = 0, bcnt = 0; 
+       unsigned int len = pci->argc-2, sorted = 1;
+
+       (void) cntxt; (void) mb; (void) stk; 
+       map = BATdescriptor(map_id);
+       if (!map)
+               goto error;
+       cnt = BATcount(map);
+       for (i=2; i<(unsigned int)pci->argc; i++) {
+               bat id = *(bat*) getArgReference(stk,pci,i);
+               bats[i-2] = BATdescriptor(id);
+               if (!bats[i-2])
+                       goto error;
+               bcnt += BATcount(bats[i-2]);
+               if (bats[i-2]->T->sorted != GDK_SORTED)
+                       sorted = 0;
+       }
+       assert(bcnt == cnt);
+
+       res = MATproject_(map, bats, len );
+       if (sorted && res)
+               BATordered(BATmirror(res));
+error:
+       if (map) BBPunfix(map->batCacheid);
+       if (bats) {
+               for (i=0; i<len && bats[i]; i++)
+                       BBPunfix(bats[i]->batCacheid);
+               GDKfree(bats);
+       }
+       if (res) {
+               BATsettrivprop(res);
+               BBPkeepref( *res_id = res->batCacheid);
+               return MAL_SUCCEED;
+       }
+       throw(SQL, "mat.project","Cannot access descriptor");
+}
+
+...@= sort_any2
+static BAT*
+matsortlo...@1( bte *map_res, BAT *i1, bte *map_i1, int cnt_i1, BAT *i2, bte 
map_i2, int cnt_i2) 
+{
+       int c;
+       BUN val_i1 = BUNfirst(i1);
+       BUN val_i2 = BUNfirst(i2);
+       BUN end_i1 = val_i1 + cnt_i1;
+       BUN end_i2 = val_i2 + cnt_i2;
+       BATiter bi_i1 = bat_iterator(i1); 
+       BATiter bi_i2 = bat_iterator(i2);
+       int (*cmp) (ptr, ptr) = BATatoms[i1->ttype].atomCmp;
+       BAT *res = BATnew(TYPE_void, i1->ttype, cnt_i1 + cnt_i2);
+
+       BATseqbase(res, 0);
+       if (map_i1 == NULL) {
+               /* map_i1 = 0 */
+               while ( val_i1 < end_i1 && val_i2 < end_i2) {
+                       if ((c = 
cmp(BUNtail(bi_i1,val_i1),BUNtail(bi_i2,val_i2))) @2 0) {
+                               BUNappend(res, BUNtail(bi_i1,val_i1), FALSE);
+                               *map_res++ = 0;
+                               val_i1++;
+                       } else if (c @3 0) {
+                               BUNappend(res, BUNtail(bi_i2,val_i2), FALSE);
+                               *map_res++ = map_i2;
+                               val_i2++;
+                       }
+               }
+               while ( val_i1 < end_i1 ) {
+                       BUNappend(res, BUNtail(bi_i1,val_i1), FALSE);
+                       *map_res++ = 0;
+                       val_i1++;
+               }
+       } else {
+               while ( val_i1 < end_i1 && val_i2 < end_i2) {
+                       if ((c = 
cmp(BUNtail(bi_i1,val_i1),BUNtail(bi_i2,val_i2))) @2 0) {
+                               BUNappend(res, BUNtail(bi_i1,val_i1), FALSE);
+                               *map_res++ = *map_i1++;
+                               val_i1++;
+                       } else if (c @3 0) {
+                               BUNappend(res, BUNtail(bi_i2,val_i2), FALSE);
+                               *map_res++ = map_i2;
+                               val_i2++;
+                       }
+               }
+               while ( val_i1 < end_i1 ) {
+                       BUNappend(res, BUNtail(bi_i1,val_i1), FALSE);
+                       *map_res++ = *map_i1++;
+                       val_i1++;
+               }
+       }
+       while ( val_i2 < end_i2 ) {
+               BUNappend(res, BUNtail(bi_i2,val_i2), FALSE);
+               *map_res++ = map_i2;
+               val_i2++;
+       }
+       return res;
+}
+...@c
+
+@:sort_any2(rev,>=,<)@
+@:sort_any2(,<=,>)@
+static BAT *
+MATsort_any( BAT **map, BAT **bats, unsigned int len, BUN cnt, int rev )
+{
+       BAT *res, *in;
+       BUN i;
+       bte *mapT;
+       int len1, len2;
+       bte *map_in = NULL;
+
+       *map = BATnew(TYPE_void, TYPE_bte, cnt);
+       BATseqbase(*map, 0);
+       mapT = (bte*)Tloc(*map, 0);
+       /* merge */
+       /* TODO: change into a tree version */
+       in = bats[0];
+       len1 = BATcount(in);
+       for (i=1; i<len; i++) {
+               len2 = BATcount(bats[i]);
+               if (rev) {
+                       res = MATsortloop_rev( 
+                               mapT+cnt-len1-len2, 
+                               in, map_in, len1, 
+                               bats[i], i, len2);
+               } else {
+                       res = MATsortloop_( 
+                               mapT+cnt-len1-len2, 
+                               in, map_in, len1, 
+                               bats[i], i, len2);
+               }
+               if (i != 1)
+                       BBPunfix(in->batCacheid);
+               in = res;
+               map_in = mapT+cnt-len1-len2;
+               len1 += len2;
+       }
+       BATsetcount(*map, len1);
+       return res;
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to