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