Changeset: 01c31162353f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=01c31162353f
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
clients/Tests/exports.stable.out
monetdb5/modules/mal/Tests/hashpartition.malC
monetdb5/modules/mal/Tests/hashpartition.stable.out
monetdb5/modules/mal/partition.c
monetdb5/modules/mal/partition.h
monetdb5/modules/mal/partition.mal
Branch: partition
Log Message:
Add hash-partitioning producing candidate lists
diffs (270 lines):
diff --git a/clients/Tests/MAL-signatures.stable.out
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -8228,6 +8228,7 @@ Ready.
[ "optimizer", "wlc", "pattern optimizer.wlc():str ", "OPTwrapper;", ""
]
[ "optimizer", "wlc", "pattern optimizer.wlc(mod:str, fcn:str):str ",
"OPTwrapper;", "Inject the workload capture-replay primitives." ]
[ "partition", "hash", "pattern partition.hash(b:bat[:any_2]):bat[:any_2]...
", "PARThash;", "Perform a value based partition " ]
+[ "partition", "slice", "pattern
partition.slice(b:bat[:any_2]):bat[:oid]... ", "PARTslice;", "Perform a value
based partition to produce candidate lists " ]
[ "pcre", "imatch", "command pcre.imatch(s:str, pat:str):bit ",
"PCREimatch;", "Caseless Perl Compatible Regular Expression pattern matching
against a string" ]
[ "pcre", "index", "command pcre.index(pat:pcre, s:str):int ",
"PCREindex;", "match a pattern, return matched position (or 0 when not
found)" ]
[ "pcre", "match", "command pcre.match(s:str, pat:str):bit ",
"PCREmatch;", "Perl Compatible Regular Expression pattern matching against a
string" ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -10590,6 +10590,7 @@ Ready.
[ "optimizer", "wlc", "pattern optimizer.wlc():str ", "OPTwrapper;", ""
]
[ "optimizer", "wlc", "pattern optimizer.wlc(mod:str, fcn:str):str ",
"OPTwrapper;", "Inject the workload capture-replay primitives." ]
[ "partition", "hash", "pattern partition.hash(b:bat[:any_2]):bat[:any_2]...
", "PARThash;", "Perform a value based partition " ]
+[ "partition", "slice", "pattern
partition.slice(b:bat[:any_2]):bat[:oid]... ", "PARTslice;", "Perform a value
based partition to produce candidate lists " ]
[ "pcre", "imatch", "command pcre.imatch(s:str, pat:str):bit ",
"PCREimatch;", "Caseless Perl Compatible Regular Expression pattern matching
against a string" ]
[ "pcre", "index", "command pcre.index(pat:pcre, s:str):int ",
"PCREindex;", "match a pattern, return matched position (or 0 when not
found)" ]
[ "pcre", "match", "command pcre.match(s:str, pat:str):bit ",
"PCREmatch;", "Perl Compatible Regular Expression pattern matching against a
string" ]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1597,6 +1597,7 @@ str OPTvolcanoImplementation(Client cntx
str OPTwlcImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci);
str OPTwrapper(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
str PARThash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
+str PARTslice(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
str PCREilike2(bit *ret, const str *s, const str *pat);
str PCREilike3(bit *ret, const str *s, const str *pat, const str *esc);
str PCREimatch(bit *ret, const str *val, const str *pat);
diff --git a/monetdb5/modules/mal/Tests/hashpartition.malC
b/monetdb5/modules/mal/Tests/hashpartition.malC
--- a/monetdb5/modules/mal/Tests/hashpartition.malC
+++ b/monetdb5/modules/mal/Tests/hashpartition.malC
@@ -42,5 +42,18 @@ io.print(c2);
io.print(c3);
io.print(c4);
io.print(c5);
+
+(o1,o2):= partition.slice(b);
+io.print(o1);
+io.print(o2);
+
+(o1,o2,o3,o4,o5):= partition.slice(b);
+io.print(o1);
+io.print(o2);
+io.print(o3);
+io.print(o4);
+io.print(o5);
+
end tst;
+
tst();
diff --git a/monetdb5/modules/mal/Tests/hashpartition.stable.out
b/monetdb5/modules/mal/Tests/hashpartition.stable.out
--- a/monetdb5/modules/mal/Tests/hashpartition.stable.out
+++ b/monetdb5/modules/mal/Tests/hashpartition.stable.out
@@ -148,6 +148,94 @@ Ready.
[ 3@0, 19 ]
[ 4@0, 24 ]
[ 5@0, 29 ]
+#--------------------------#
+# h t # name
+# void oid # type
+#--------------------------#
+[ 0@0, 0@0 ]
+[ 1@0, 2@0 ]
+[ 2@0, 4@0 ]
+[ 3@0, 6@0 ]
+[ 4@0, 8@0 ]
+[ 5@0, 10@0 ]
+[ 6@0, 12@0 ]
+[ 7@0, 14@0 ]
+[ 8@0, 16@0 ]
+[ 9@0, 18@0 ]
+[ 10@0, 20@0 ]
+[ 11@0, 22@0 ]
+[ 12@0, 24@0 ]
+[ 13@0, 26@0 ]
+[ 14@0, 28@0 ]
+#--------------------------#
+# h t # name
+# void oid # type
+#--------------------------#
+[ 0@0, 1@0 ]
+[ 1@0, 3@0 ]
+[ 2@0, 5@0 ]
+[ 3@0, 7@0 ]
+[ 4@0, 9@0 ]
+[ 5@0, 11@0 ]
+[ 6@0, 13@0 ]
+[ 7@0, 15@0 ]
+[ 8@0, 17@0 ]
+[ 9@0, 19@0 ]
+[ 10@0, 21@0 ]
+[ 11@0, 23@0 ]
+[ 12@0, 25@0 ]
+[ 13@0, 27@0 ]
+[ 14@0, 29@0 ]
+#--------------------------#
+# h t # name
+# void oid # type
+#--------------------------#
+[ 0@0, 0@0 ]
+[ 1@0, 5@0 ]
+[ 2@0, 10@0 ]
+[ 3@0, 15@0 ]
+[ 4@0, 20@0 ]
+[ 5@0, 25@0 ]
+#--------------------------#
+# h t # name
+# void oid # type
+#--------------------------#
+[ 0@0, 1@0 ]
+[ 1@0, 6@0 ]
+[ 2@0, 11@0 ]
+[ 3@0, 16@0 ]
+[ 4@0, 21@0 ]
+[ 5@0, 26@0 ]
+#--------------------------#
+# h t # name
+# void oid # type
+#--------------------------#
+[ 0@0, 2@0 ]
+[ 1@0, 7@0 ]
+[ 2@0, 12@0 ]
+[ 3@0, 17@0 ]
+[ 4@0, 22@0 ]
+[ 5@0, 27@0 ]
+#--------------------------#
+# h t # name
+# void oid # type
+#--------------------------#
+[ 0@0, 3@0 ]
+[ 1@0, 8@0 ]
+[ 2@0, 13@0 ]
+[ 3@0, 18@0 ]
+[ 4@0, 23@0 ]
+[ 5@0, 28@0 ]
+#--------------------------#
+# h t # name
+# void oid # type
+#--------------------------#
+[ 0@0, 4@0 ]
+[ 1@0, 9@0 ]
+[ 2@0, 14@0 ]
+[ 3@0, 19@0 ]
+[ 4@0, 24@0 ]
+[ 5@0, 29@0 ]
# 14:09:25 >
# 14:09:25 > "Done."
diff --git a/monetdb5/modules/mal/partition.c b/monetdb5/modules/mal/partition.c
--- a/monetdb5/modules/mal/partition.c
+++ b/monetdb5/modules/mal/partition.c
@@ -15,6 +15,7 @@
#include "partition.h"
#define MAXPART 256
+
#define hashpartition(TYPE) \
do { p= BATcount(b); \
bi = bat_iterator(b); \
@@ -28,6 +29,19 @@
} \
} while (0)
+#define slicepartition(TYPE) \
+ do { p= BATcount(b); \
+ bi = bat_iterator(b); \
+ for (r=0; r < p; r++) { \
+ TYPE *v = (TYPE *) BUNtloc(bi, r); \
+ TYPE c = mix_##TYPE((*v)); \
+ if( BUNappend(bn[(int) (c % pieces)], (void*) &r, FALSE) !=
GDK_SUCCEED){ \
+ msg = createException(MAL,"partition.slice","Storage
failed");\
+ break;\
+ }\
+ } \
+ } while (0)
+
str
PARThash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
@@ -97,3 +111,64 @@ PARThash(Client cntxt, MalBlkPtr mb, Mal
BBPunfix(b->batCacheid);
return msg;
}
+
+str
+PARTslice(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+ bat *ret = getArgReference_bat(stk,pci,0);
+ int i, pieces;
+ BAT *b, *bn[MAXPART];
+ BUN r, p;
+ BATiter bi;
+ str msg = MAL_SUCCEED;
+
+
+ (void) cntxt;
+ (void) mb;
+ pieces = pci->retc;
+ if ( pieces >= MAXPART)
+ throw(MAL,"partition.slice","too many partitions");
+ b = BATdescriptor( stk->stk[getArg(pci, pci->retc)].val.ival);
+ if ( b == NULL)
+ throw(MAL, "partition.slice", SQLSTATE(HY002)
RUNTIME_OBJECT_MISSING);
+
+ for( i = 0; i < pieces; i++){
+ size_t cap = BATcount(b) / pieces * 1.1;
+ bn[i] = COLnew(0, TYPE_oid, cap, TRANSIENT);
+ if (bn[i] == NULL){
+ for(i--; i>=0; i--)
+ BBPunfix(bn[i]->batCacheid);
+ BBPunfix(b->batCacheid);
+ throw(MAL, "partition.slice", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ }
+ }
+ /* distribute the elements over multiple partitions */
+ switch(ATOMstorage(b->ttype)){
+ case TYPE_bte:
+ slicepartition(bte);
+ break;
+ case TYPE_sht:
+ slicepartition(sht);
+ break;
+ case TYPE_int:
+ slicepartition(int);
+ break;
+ case TYPE_lng:
+ slicepartition(lng);
+ break;
+#ifdef HAVE_HGE
+ case TYPE_hge:
+ slicepartition(hge);
+ break;
+#endif
+ default:
+ msg =
createException(MAL,"partition.slice","Non-supported type");
+ }
+
+ for(i=0; i< pieces; i++){
+ ret = getArgReference_bat(stk,pci,i);
+ BBPkeepref(*ret = bn[i]->batCacheid);
+ }
+ BBPunfix(b->batCacheid);
+ return msg;
+}
diff --git a/monetdb5/modules/mal/partition.h b/monetdb5/modules/mal/partition.h
--- a/monetdb5/modules/mal/partition.h
+++ b/monetdb5/modules/mal/partition.h
@@ -14,5 +14,6 @@
#include "mal_interpreter.h"
mal_export str PARThash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
+mal_export str PARTslice(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
p);
#endif /* _PART_H */
diff --git a/monetdb5/modules/mal/partition.mal
b/monetdb5/modules/mal/partition.mal
--- a/monetdb5/modules/mal/partition.mal
+++ b/monetdb5/modules/mal/partition.mal
@@ -9,3 +9,7 @@ module partition;
pattern partition.hash(b:bat[:any_2]):bat[:any_2]...
address PARThash
comment "Perform a value based partition ";
+
+pattern partition.slice(b:bat[:any_2]):bat[:oid]...
+address PARTslice
+comment "Perform a value based partition to produce candidate lists ";
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list