Update of /cvsroot/monetdb/MonetDB5/src/optimizer
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv5179/src/optimizer
Modified Files:
opt_mergetable.mx
Log Message:
(re)introduced module batstr (as opt_remap needs simple translation from
single value at a time module into bluk version module name). Example
str.trim into batstr.trim. This make a lot of functions in sql a lot faster.
Fixed a couple of variable atom referencing bugs in batstr.mx
added a mal function for the new rangejoin to algebra.mx
opt_mergetable got lots of fixes
Index: opt_mergetable.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB5/src/optimizer/opt_mergetable.mx,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -d -r1.26 -r1.27
--- opt_mergetable.mx 9 Dec 2007 21:46:57 -0000 1.26
+++ opt_mergetable.mx 21 Dec 2007 15:29:40 -0000 1.27
@@ -169,9 +169,18 @@
/* unknown ie overlap */
return 1;
}
- if (rub->value.val.lval <= llb->value.val.lval ||
- lub->value.val.lval <= rlb->value.val.lval)
+ if ((rub->value.val.lval != (lng)-1 &&
+ rub->value.val.lval <= llb->value.val.lval) ||
+ (lub->value.val.lval != (lng)-1 &&
+ lub->value.val.lval <= rlb->value.val.lval))
return 0;
+
+ if ((rub->value.val.lval == (lng)-1 &&
+ rlb->value.val.lval > lub->value.val.lval) ||
+ (lub->value.val.lval == (lng)-1 &&
+ llb->value.val.lval > rub->value.val.lval)) {
+ return 0;
+ }
return 1;
}
@@ -185,79 +194,102 @@
/* unknown ie overlap */
return 1;
}
- if (rub->value.val.lval <= llb->value.val.lval ||
- lub->value.val.lval <= rlb->value.val.lval)
+ if ((rub->value.val.lval != (lng)-1 &&
+ rub->value.val.lval <= llb->value.val.lval) ||
+ (lub->value.val.lval != (lng)-1 &&
+ lub->value.val.lval <= rlb->value.val.lval))
+ return 0;
+
+ if ((rub->value.val.lval == (lng)-1 &&
+ rlb->value.val.lval > lub->value.val.lval) ||
+ (lub->value.val.lval == (lng)-1 &&
+ llb->value.val.lval > rub->value.val.lval)) {
return 0;
+ }
return 1;
}
static void
-propagateProp(MalBlkPtr mb, InstrPtr q, int ivar)
+propagateMarkProp(MalBlkPtr mb, InstrPtr q, int ivar, oid l, oid h)
{
int ovar = getArg(q, 0);
VarPtr hlb = varGetProp(mb, ivar, hlbProp);
VarPtr hub = varGetProp(mb, ivar, hubProp);
VarPtr tlb = varGetProp(mb, ivar, tlbProp);
VarPtr tub = varGetProp(mb, ivar, tubProp);
+ ValRecord v;
- if (getFunctionId(q) == reverseRef) {
- if (hlb) varSetProp(mb, ovar, tlbProp, op_gte, &hlb->value);
- if (hub) varSetProp(mb, ovar, tubProp, op_lt, &hub->value);
- if (tlb) varSetProp(mb, ovar, hlbProp, op_gte, &tlb->value);
- if (tub) varSetProp(mb, ovar, hubProp, op_lt, &tub->value);
- } else if (getFunctionId(q) == mirrorRef ||
- (getModuleId(q) == groupRef && (
- getFunctionId(q) == newRef ||
- getFunctionId(q) == deriveRef))) {
- if (hlb) varSetProp(mb, ovar, hlbProp, op_gte, &hlb->value);
- if (hub) varSetProp(mb, ovar, hubProp, op_lt, &hub->value);
- if (hlb) varSetProp(mb, ovar, tlbProp, op_gte, &hlb->value);
- if (hub) varSetProp(mb, ovar, tubProp, op_lt, &hub->value);
- } else if (isFragmentGroup(q)) {
- if (hlb) varSetProp(mb, ovar, hlbProp, op_gte, &hlb->value);
- if (hub) varSetProp(mb, ovar, hubProp, op_lt, &hub->value);
+ if (getFunctionId(q) == markHRef) {
if (tlb) varSetProp(mb, ovar, tlbProp, op_gte, &tlb->value);
if (tub) varSetProp(mb, ovar, tubProp, op_lt, &tub->value);
+ varSetProp(mb, ovar, hlbProp, op_gte, VALset(&v, TYPE_oid, &l));
+ varSetProp(mb, ovar, hubProp, op_lt, VALset(&v, TYPE_oid, &h));
+ } else { /* markTRef */
+ if (hlb) varSetProp(mb, ovar, hlbProp, op_gte, &hlb->value);
+ if (hub) varSetProp(mb, ovar, hubProp, op_lt, &hub->value);
+ varSetProp(mb, ovar, tlbProp, op_gte, VALset(&v, TYPE_oid, &l));
+ varSetProp(mb, ovar, tubProp, op_lt, VALset(&v, TYPE_oid, &h));
}
}
static void
-propagateMarkProp(MalBlkPtr mb, InstrPtr q, int ivar, oid l, oid h)
+propagateBinProp(MalBlkPtr mb, InstrPtr q, int ivarl, int ivarr)
{
int ovar = getArg(q, 0);
- VarPtr hlb = varGetProp(mb, ivar, hlbProp);
- VarPtr hub = varGetProp(mb, ivar, hubProp);
- VarPtr tlb = varGetProp(mb, ivar, tlbProp);
- VarPtr tub = varGetProp(mb, ivar, tubProp);
- ValRecord v;
- if (getFunctionId(q) == markHRef) {
+ if (getFunctionId(q) == joinRef) {
+ VarPtr hlb = varGetProp(mb, ivarl, hlbProp);
+ VarPtr hub = varGetProp(mb, ivarl, hubProp);
+ VarPtr tlb = varGetProp(mb, ivarr, tlbProp);
+ VarPtr tub = varGetProp(mb, ivarr, tubProp);
+
+ if (hlb) varSetProp(mb, ovar, hlbProp, op_gte, &hlb->value);
+ if (hub) varSetProp(mb, ovar, hubProp, op_lt, &hub->value);
if (tlb) varSetProp(mb, ovar, tlbProp, op_gte, &tlb->value);
if (tub) varSetProp(mb, ovar, tubProp, op_lt, &tub->value);
- varSetProp(mb, ovar, hlbProp, op_gte, VALset(&v, TYPE_oid, &l));
- varSetProp(mb, ovar, hubProp, op_lt, VALset(&v, TYPE_oid, &h));
- } else { /* markTRef */
+ } else if (getFunctionId(q) == kunionRef) {
+ /* max ?? */
+ VarPtr hlb = varGetProp(mb, ivarl, hlbProp);
+ VarPtr hub = varGetProp(mb, ivarr, hubProp);
+ VarPtr tlb = varGetProp(mb, ivarl, tlbProp);
+ VarPtr tub = varGetProp(mb, ivarr, tubProp);
+
if (hlb) varSetProp(mb, ovar, hlbProp, op_gte, &hlb->value);
if (hub) varSetProp(mb, ovar, hubProp, op_lt, &hub->value);
- varSetProp(mb, ovar, tlbProp, op_gte, VALset(&v, TYPE_oid, &l));
- varSetProp(mb, ovar, tubProp, op_lt, VALset(&v, TYPE_oid, &h));
+ if (tlb) varSetProp(mb, ovar, tlbProp, op_gte, &tlb->value);
+ if (tub) varSetProp(mb, ovar, tubProp, op_lt, &tub->value);
}
}
static void
-propagateJoinProp(MalBlkPtr mb, InstrPtr q, int ivarl, int ivarr)
+propagateProp(MalBlkPtr mb, InstrPtr q, int ivar)
{
int ovar = getArg(q, 0);
- VarPtr hlb = varGetProp(mb, ivarl, hlbProp);
- VarPtr hub = varGetProp(mb, ivarl, hubProp);
- VarPtr tlb = varGetProp(mb, ivarr, tlbProp);
- VarPtr tub = varGetProp(mb, ivarr, tubProp);
+ VarPtr hlb = varGetProp(mb, ivar, hlbProp);
+ VarPtr hub = varGetProp(mb, ivar, hubProp);
+ VarPtr tlb = varGetProp(mb, ivar, tlbProp);
+ VarPtr tub = varGetProp(mb, ivar, tubProp);
- if (hlb) varSetProp(mb, ovar, hlbProp, op_gte, &hlb->value);
- if (hub) varSetProp(mb, ovar, hubProp, op_lt, &hub->value);
- if (tlb) varSetProp(mb, ovar, tlbProp, op_gte, &tlb->value);
- if (tub) varSetProp(mb, ovar, tubProp, op_lt, &tub->value);
+ if (getFunctionId(q) == reverseRef) {
+ if (hlb) varSetProp(mb, ovar, tlbProp, op_gte, &hlb->value);
+ if (hub) varSetProp(mb, ovar, tubProp, op_lt, &hub->value);
+ if (tlb) varSetProp(mb, ovar, hlbProp, op_gte, &tlb->value);
+ if (tub) varSetProp(mb, ovar, hubProp, op_lt, &tub->value);
+ } else if (getFunctionId(q) == mirrorRef ||
+ (getModuleId(q) == groupRef && (
+ getFunctionId(q) == newRef ||
+ getFunctionId(q) == deriveRef))) {
+ if (hlb) varSetProp(mb, ovar, hlbProp, op_gte, &hlb->value);
+ if (hub) varSetProp(mb, ovar, hubProp, op_lt, &hub->value);
+ if (hlb) varSetProp(mb, ovar, tlbProp, op_gte, &hlb->value);
+ if (hub) varSetProp(mb, ovar, tubProp, op_lt, &hub->value);
+ } else if (isFragmentGroup(q) || getModuleId(q) == mkeyRef) {
+ if (hlb) varSetProp(mb, ovar, hlbProp, op_gte, &hlb->value);
+ if (hub) varSetProp(mb, ovar, hubProp, op_lt, &hub->value);
+ if (tlb) varSetProp(mb, ovar, tlbProp, op_gte, &tlb->value);
+ if (tub) varSetProp(mb, ovar, tubProp, op_lt, &tub->value);
+ }
}
static int
@@ -269,50 +301,140 @@
return -1;
}
[EMAIL PROTECTED]
+Packing the BATs into a single one is handled here
+Note that MATs can be defined recursively.
[EMAIL PROTECTED]
+static InstrPtr
+MATpackAll(MalBlkPtr mb, InstrPtr r, mat_t *mat, int m, int *mtop)
+{
+ int j,l,k;
+
+ if( mat[m].mi->argc-mat[m].mi->retc == 1){
+ /* simple assignment is sufficient */
+ r = newInstruction(mb, ASSIGNsymbol);
+ getArg(r,0) = getArg(mat[m].mi,0);
+ getArg(r,1) = getArg(mat[m].mi,1);
+ /* dirty hack */
+ r->retc = 1;
+ r->argc = 2;
+ } else {
+ if (r == NULL){
+ r = newInstruction(mb, ASSIGNsymbol);
+ setModuleId(r,matRef);
+ setFunctionId(r,packRef);
+ getArg(r,0) = getArg(mat[m].mi,0);
+ }
+ for(l=mat[m].mi->retc; l< mat[m].mi->argc; l++){
+ k= isMATalias( getArg(mat[m].mi,l), mat, *mtop);
+ if( k< 0)
+ r= pushArgument(mb,r, getArg(mat[m].mi,l));
+ else
+ r= MATpackAll(mb, r, mat, k, mtop);
+ }
+ }
+ for(j=m; j < *mtop-1; j++)
+ mat[j] = mat[j+1];
+ *mtop = *mtop-1;
+ pushInstruction(mb,r);
+ return r;
+}
+
+
INLINE static int
-mat_add(mat_t *mat, int mtop, InstrPtr q, mat_type type)
+mat_add(mat_t *mat, int mtop, MalBlkPtr mb, InstrPtr q, mat_type type)
{
+ assert(q->argc > 1);
mat[mtop].mi = q;
mat[mtop].mv = getArg(q,0);
mat[mtop].type = type;
+ (void)mb;
+ //pushInstruction(mb, q);
return mtop+1;
}
+int
+mat_fanout(mat_t *mat, int m, int n, MalBlkPtr mb, int isjoin)
+{
+ int cnt = 0;
+ int k,j;
+
+ for(k=1; k<mat[m].mi->argc; k++) {
+ for(j=1; j<mat[n].mi->argc; j++) {
+ if (isjoin && overlap(mb, getArg(mat[m].mi,k),
getArg(mat[n].mi,j))) {
+ cnt++;
+ } else if (!isjoin && Hoverlap(mb, getArg(mat[m].mi,k),
getArg(mat[n].mi,j))) {
+ cnt++;
+ }
+ }
+ }
+ return cnt;
+}
+
/* mat_apply1 handles both apply and reduce cases */
static InstrPtr
mat_apply1(MalBlkPtr mb, InstrPtr p, mat_t *mat, int m, int var, int reuse)
{
- int tpe, k;
+ int tpe, k, inout = 0, bvar = (var==2)?1:2;
InstrPtr r = NULL;
+ if (getFunctionId(p) == joinRef)
+ assert(0);
+
assert(reuse == 0);
(void)reuse;
- if (isaBatType(getVarType(mb,getArg(p,0)))){
+ if (var == 2 &&
+ getModuleId(p) == algebraRef &&
+ (getFunctionId(p) == semijoinRef ||
+ getFunctionId(p) == kdifferenceRef)) {
+ tpe = getArgType(mb,p,0);
+ /* use results as inputs */
+ inout = 1;
+ } else if (isaBatType(getVarType(mb,getArg(p,0)))){
r = newInstruction(mb, ASSIGNsymbol);
setModuleId(r,matRef);
setFunctionId(r,newRef);
getArg(r,0) = getArg(p,0);
tpe = getArgType(mb,p,0);
} else {
+ assert(0);
tpe = TYPE_any;
- r = 0;
}
for(k=1; k<mat[m].mi->argc; k++) {
- InstrPtr q = copyInstruction(p);
- getArg(q,0) = newTmpVariable(mb, tpe);
- getArg(q,var) = getArg(mat[m].mi,k);
- propagateProp(mb, q, getArg(mat[m].mi, k));
- pushInstruction(mb,q);
- if (r)
- r = pushArgument(mb,r,getArg(q,0));
+ if (inout || p->argc == 2 ||
+ /* join + overlap */
+ /* or calc + hoverlap */
+ ((getFunctionId(p) == joinRef &&
+ overlap(mb, getArg(mat[m].mi,k), getArg(p, bvar))) ||
+ (getFunctionId(p) != joinRef &&
+ Hoverlap(mb, getArg(mat[m].mi,k), getArg(p, bvar))))) {
+ InstrPtr q = copyInstruction(p);
+
+ getArg(q,var) = getArg(mat[m].mi,k);
+ if (!inout)
+ getArg(q,0) = newTmpVariable(mb, tpe);
+ if (inout)
+ inout = getArg(q,0);
+ if (inout && k > 1)
+ getArg(q,1) = inout;
+ if (inout && k == 1)
+ propagateProp(mb, q, getArg(p,1));
+ else if (!inout)
+ propagateProp(mb, q, getArg(mat[m].mi, k));
+ pushInstruction(mb,q);
+ if (r)
+ r = pushArgument(mb,r,getArg(q,0));
+ }
}
+ if (r)
+ assert(r->argc > 1);
freeInstruction(p);
return r;
}
static InstrPtr
-mat_apply2(MalBlkPtr mb, InstrPtr p, mat_t *mat, int a1, int a2, int a3, int
reuse)
+mat_apply2(MalBlkPtr mb, InstrPtr p, mat_t *mat, int *mtop, int a1, int a2,
int a3, int reuse)
{
int tpe = getArgType(mb,p,0);
int k,j,m,n,Am,An;
@@ -334,6 +456,14 @@
Am = (a1>=0)?1:2;
An = (a3>=0)?3:2;
+ if (mat_fanout(mat, m, n, mb, 0) >
+ 2*mat[m].mi->argc + 2*mat[n].mi->argc) {
+ (void)MATpackAll(mb, NULL, mat, m, mtop);
+ (void)MATpackAll(mb, NULL, mat, n, mtop);
+ /* keep old instruction */
+ pushInstruction(mb,p);
+ return NULL;
+ }
setModuleId(r,matRef);
setFunctionId(r,newRef);
getArg(r,0) = getArg(p,0);
@@ -362,8 +492,9 @@
}
}
}
+ if (r)
+ assert(r->argc > 1);
freeInstruction(p);
- pushInstruction(mb, r);
return r;
}
@@ -406,13 +537,14 @@
}
}
}
+ if (r)
+ assert(r->argc > 1);
freeInstruction(p);
- pushInstruction(mb, r);
return r;
}
static InstrPtr
-mat_apply(MalBlkPtr mb, InstrPtr p, mat_t *mat, int a1, int a2, int a3, int
reuse)
+mat_apply(MalBlkPtr mb, InstrPtr p, mat_t *mat, int *mtop, int a1, int a2, int
a3, int reuse)
{
if (a1>=0 && a2<0 && a3<0)
return mat_apply1(mb, p, mat, a1, 1, reuse);
@@ -422,17 +554,17 @@
return mat_apply1(mb, p, mat, a3, 3, reuse);
if (a1<0 || a2<0 || a3<0 || (a1 == a2) || (a1 == a3))
- return mat_apply2(mb, p, mat, a1, a2, a3, reuse);
+ return mat_apply2(mb, p, mat, mtop, a1, a2, a3, reuse);
return mat_apply3(mb, p, mat, a1, a2, a3, reuse);
}
-/* join 2 mats, also handles the case that mat[m].mm is set, ie that we
-have the extend available */
-
+/* join, also handles the case that mat[m].mm is set, ie that we
+ have the extend available.
+*/
static InstrPtr
-mat_hrange_join(MalBlkPtr mb, InstrPtr p, mat_t *mat, int m, int n)
+mat_join(MalBlkPtr mb, InstrPtr p, mat_t *mat, int m, int n)
{
int tpe = getArgType(mb,p,0);
int j,k;
@@ -442,7 +574,10 @@
setFunctionId(r,newRef);
getArg(r,0) = getArg(p,0);
+ assert(m>=0 || n>=0);
if (mat[m].mm) {
+ if (n<0)
+ assert(0);
for (j=1; j<mat[n].mi->argc; j++) {
InstrPtr q = copyInstruction(p);
@@ -450,13 +585,14 @@
getArg(q,1) = getArg(mat[m].mm,0);
getArg(q,2) = getArg(mat[n].mi,j);
pushInstruction(mb,q);
- //propagateJoinProp(mb, q, getArg(mat[m].mm, 0),
getArg(mat[n].mi, k));
+ //propagateBinProp(mb, q, getArg(mat[m].mm, 0),
getArg(mat[n].mi, k));
/* add result to mat */
r = pushArgument(mb,r,getArg(q,0));
}
} else {
- for(k=1; k<mat[m].mi->argc; k++) {
+ if (m >= 0 && n >= 0) {
+ for(k=1; k<mat[m].mi->argc; k++) {
for (j=1; j<mat[n].mi->argc; j++) {
if (overlap(mb, getArg(mat[m].mi, k),
getArg(mat[n].mi, j))){
InstrPtr q = copyInstruction(p);
@@ -465,16 +601,50 @@
getArg(q,1) = getArg(mat[m].mi,k);
getArg(q,2) = getArg(mat[n].mi,j);
pushInstruction(mb,q);
- propagateJoinProp(mb, q,
getArg(mat[m].mi, k), getArg(mat[n].mi, j));
+ propagateBinProp(mb, q,
getArg(mat[m].mi, k), getArg(mat[n].mi, j));
/* add result to mat */
r = pushArgument(mb,r,getArg(q,0));
}
}
+ }
+ } else {
+ int mv = (m>=0)?m:n;
+ int av = (m>=0)?1:2;
+ int bv = (m>=0)?2:1;
+
+ if (bv == 2) {
+ for(k=1; k<mat[mv].mi->argc; k++) {
+ if (overlap(mb, getArg(mat[mv].mi, k), getArg(p,
bv))){
+ InstrPtr q = copyInstruction(p);
+
+ getArg(q,0) = newTmpVariable(mb, tpe);
+ getArg(q,av) = getArg(mat[mv].mi, k);
+ pushInstruction(mb,q);
+ propagateBinProp(mb, q, getArg(mat[mv].mi, k),
getArg(q, bv));
+ /* add result to mat */
+ r = pushArgument(mb,r,getArg(q,0));
+ }
+ }
+ } else {
+ for(k=1; k<mat[mv].mi->argc; k++) {
+ if (overlap(mb, getArg(p, bv), getArg(mat[mv].mi,
k))){
+ InstrPtr q = copyInstruction(p);
+
+ getArg(q,0) = newTmpVariable(mb, tpe);
+ getArg(q,av) = getArg(mat[mv].mi, k);
+ pushInstruction(mb,q);
+ propagateBinProp(mb, q, getArg(q, bv),
getArg(mat[mv].mi, k));
+ /* add result to mat */
+ r = pushArgument(mb,r,getArg(q,0));
+ }
+ }
+ }
}
}
+ if (r)
+ assert(r->argc > 1);
freeInstruction(p);
- pushInstruction(mb, r);
return r;
}
@@ -642,7 +812,7 @@
r = pushZero(mb, r, tp);
pushInstruction(mb,r);
for(k=1; k< mat[m].mi->argc; k++){
- int v = newTmpVariable(mb, TYPE_int);
+ int v = newTmpVariable(mb, tp);
q = newInstruction(mb,ASSIGNsymbol);
setModuleId(q,aggrRef);
@@ -731,8 +901,6 @@
r1 = pushArgument(mb,r1,getArg(q,1));
}
freeInstruction(p);
- pushInstruction(mb, r0);
- pushInstruction(mb, r1);
*ext = r0;
return r1;
}
@@ -774,15 +942,12 @@
}
}
freeInstruction(p);
- pushInstruction(mb, r0);
- pushInstruction(mb, r1);
*exti = r0;
return r1;
}
-/* TODO make more general: ie handle mat union/append/?? (mat,bat,value) */
static InstrPtr
-mat_union(MalBlkPtr mb, InstrPtr p, mat_t *mat, int m)
+mat_union(MalBlkPtr mb, InstrPtr p, mat_t *mat, int m, int n)
{
int k;
InstrPtr r = newInstruction(mb, ASSIGNsymbol);
@@ -791,12 +956,19 @@
setFunctionId(r,newRef);
getArg(r,0) = getArg(p,0);
- for(k=1; k<mat[m].mi->argc; k++) {
- r = pushArgument(mb, r, getArg(mat[m].mi,k));
+ if (m >= 0) {
+ for(k=1; k<mat[m].mi->argc; k++)
+ r = pushArgument(mb, r, getArg(mat[m].mi,k));
+ } else {
+ r = pushArgument(mb, r, getArg(p,1));
+ }
+ if (n >= 0) {
+ for(k=1; k<mat[n].mi->argc; k++)
+ r = pushArgument(mb, r, getArg(mat[n].mi,k));
+ } else {
+ r = pushArgument(mb, r, getArg(p,2));
}
- r = pushArgument(mb, r, getArg(p,2));
freeInstruction(p);
- pushInstruction(mb, r);
return r;
}
@@ -861,44 +1033,8 @@
}
}
freeInstruction(p);
- pushInstruction(mb, r);
- return r;
-}
[EMAIL PROTECTED]
-Packing the BATs into a single one is handled here
-Note that MATs can be defined recursively.
[EMAIL PROTECTED]
-static InstrPtr
-MATpackAll(MalBlkPtr mb, InstrPtr r, mat_t *mat, int m, int *mtop)
-{
- int j,l,k;
- if( mat[m].mi->argc-mat[m].mi->retc == 1){
- /* simple assignment is sufficient */
- r = newInstruction(mb, ASSIGNsymbol);
- getArg(r,0)= getArg(mat[m].mi,0);
- getArg(r,1)= getArg(mat[m].mi,1);
- } else {
- if (r == NULL){
- r = newInstruction(mb, ASSIGNsymbol);
- setModuleId(r,matRef);
- setFunctionId(r,packRef);
- getArg(r,0) = getArg(mat[m].mi,0);
- }
- for(l=mat[m].mi->retc; l< mat[m].mi->argc; l++){
- k= isMATalias( getArg(mat[m].mi,l), mat, *mtop);
- if( k< 0)
- r= pushArgument(mb,r, getArg(mat[m].mi,l));
- else
- r= MATpackAll(mb, r, mat, k, mtop);
- }
- }
- for(j=m; j < *mtop-1; j++)
- mat[j] = mat[j+1];
- *mtop = *mtop-1;
- pushInstruction(mb,r);
return r;
}
-
static void
MATcollect(int m, mat_t *mat, int mtop, int *newvar, int *n){
int i,j,k;
@@ -952,8 +1088,7 @@
p = old[i];
if (getModuleId(p) == matRef &&
(getFunctionId(p) == newRef || getFunctionId(p) == packRef)){
- mtop = mat_add(mat, mtop, p, mat_none);
- pushInstruction(mb,p);
+ mtop = mat_add(mat, mtop, mb, p, mat_none);
continue;
}
@-
@@ -961,8 +1096,17 @@
Otherwise we have to decide on either packing them or replacement.
@c
if ((match = MATcount(p, mat, mtop)) == 0) {
- if (p->argc >= 2)
- propagateProp(mb, p, getArg(p,1));
+ if (p->argc >= 2) {
+ if (getFunctionId(p) == markHRef||
+ getFunctionId(p) == markTRef) {
+ propagateMarkProp(mb, p, getArg(p,1),
0, 1);
+ } else if (getFunctionId(p) == joinRef||
+ getFunctionId(p) == kunionRef) {
+ propagateBinProp(mb, p, getArg(p,1),
getArg(p,2));
+ } else {
+ propagateProp(mb, p, getArg(p,1));
+ }
+ }
pushInstruction(mb,p);
continue;
}
@@ -978,13 +1122,14 @@
x = isMATalias(getArg(p,3), mat, mtop);
assert(m==n);
}
- mat_apply(mb, p, mat, m, o, x, 1);
+ mat_apply(mb, p, mat, &mtop, m, o, x, 1);
actions++;
continue;
}
@-
Here we handle horizontal aligned mats. This information is passed using
-the properties hlb <= x < hub. So if this is available, we can simplify
+the properties hlb <= x < hub.
+So if this is available, we can simplify
batcalc operations and for fetch joins we can use this information to do
per part joins only.
@@ -993,26 +1138,25 @@
@c
/* TODO handle value joins on multiple mats !! */
- if (match == 2 &&
+ if (match > 0 &&
getModuleId(p) == algebraRef &&
- getFunctionId(p) == joinRef &&
- (m=isMATalias(getArg(p,1), mat, mtop)) >= 0 &&
- (n=isMATalias(getArg(p,2), mat, mtop)) >= 0 &&
- ATOMtype(getHeadType(getArgType(mb, mat[m].mi, 0))) ==
TYPE_oid &&
- ATOMtype(getHeadType(getArgType(mb, mat[n].mi, 0))) ==
TYPE_oid
-
- /* number of argument don't need to match (as parts maybe
- reduced) mat[m].mi->argc == mat[n].mi->argc */
- ) {
- InstrPtr j = mat_hrange_join(mb, p, mat, m, n);
+ getFunctionId(p) == joinRef) {
+ InstrPtr j;
- mtop = mat_add(mat, mtop, j, mat_none);
- if (mat[m].type == mat_ext)
+ m = isMATalias(getArg(p,1), mat, mtop);
+ n = isMATalias(getArg(p,2), mat, mtop);
+ j = mat_join(mb, p, mat, m, n);
+ mtop = mat_add(mat, mtop, mb, j, mat_none);
+ if (m >= 0 && mat[m].type == mat_ext)
(void)MATpackAll(mb, NULL, mat, mtop-1, &mtop);
actions++;
continue;
}
- if (match > 1 && getModuleId(p) == batcalcRef) {
+ /* all batcalc and mkey operations assume aligned bats */
+ if (match >= 1 && (getModuleId(p) == batcalcRef ||
+ getModuleId(p) == mkeyRef ||
+ (getModuleId(p) == algebraRef &&
+ getFunctionId(p) == semijoinRef))) {
InstrPtr bc;
m = isMATalias(getArg(p,1), mat, mtop);
@@ -1020,22 +1164,22 @@
n = isMATalias(getArg(p,2), mat, mtop);
if (p->argc >= 4)
o = isMATalias(getArg(p,3), mat, mtop);
- bc = mat_apply(mb, p, mat, m, n, o, 0);
- mtop = mat_add(mat, mtop, bc, mat_none );
+ if ((bc = mat_apply(mb, p, mat, &mtop, m, n, o, 0)) !=
NULL)
+ mtop = mat_add(mat, mtop, mb, bc, mat_none );
actions++;
continue;
}
@-
Now we handle group, derive and aggregation statements.
@c
- if (match ==1 && getModuleId(p) == groupRef &&
+ if (match == 1 && getModuleId(p) == groupRef &&
getFunctionId(p) == newRef &&
((m=isMATalias(getArg(p,2), mat, mtop)) >= 0)) {
InstrPtr ext, grp;
grp = mat_group_new(&ext, mb, p, mat, m);
- mtop = mat_add(mat, mtop, grp, mat_grp);
- mtop = mat_add(mat, mtop, ext, mat_hist);
+ mtop = mat_add(mat, mtop, mb, grp, mat_grp);
+ mtop = mat_add(mat, mtop, mb, ext, mat_hist);
/* here we keep that ext and grp are related */
mat[mtop-1].rm = mtop-2;
mat[mtop-2].rm = mtop-1;
@@ -1050,8 +1194,8 @@
InstrPtr ext, grp;
grp = mat_group_derive(&ext, mb, p, mat, m, n, o);
- mtop = mat_add(mat, mtop, grp, mat_grp);
- mtop = mat_add(mat, mtop, ext, mat_hist);
+ mtop = mat_add(mat, mtop, mb, grp, mat_grp);
+ mtop = mat_add(mat, mtop, mb, ext, mat_hist);
/* here we keep that ext and grp are related */
mat[mtop-1].rm = mtop-2;
mat[mtop-2].rm = mtop-1;
@@ -1099,20 +1243,22 @@
be packed to facilitate updates. We assume the first
partition is dominant.
@c
- if (((getModuleId(p)== batRef &&
+ if (match &&
+ ((getModuleId(p)== batRef &&
(getFunctionId(p)== insertRef ||
getFunctionId(p)== appendRef)) ||
(getModuleId(p) == algebraRef &&
- getFunctionId(p)== kunionRef)) &&
- (m=isMATalias(getArg(p,1), mat, mtop)) >= 0) {
+ getFunctionId(p)== kunionRef))) {
/* bat.insert(mat,b or val)
bat.append()
bat.kunion()
- -> mat.union(mat, b or val) */
- /* todo also handle case with 2 mats */
- InstrPtr u = mat_union(mb, p, mat, m);
+ -> mat.union(mat, b or val) */
+ InstrPtr u;
- mtop = mat_add(mat, mtop, u, mat_none);
+ m = isMATalias(getArg(p,1), mat, mtop);
+ n = isMATalias(getArg(p,2), mat, mtop);
+ u = mat_union(mb, p, mat, m, n);
+ mtop = mat_add(mat, mtop, mb, u, mat_none);
actions++;
continue;
}
@@ -1120,13 +1266,15 @@
The mark operators are a special case of apply on parts as we need too
correct the mark base oid's
@c
- if (getModuleId(p)== algebraRef &&
+ if (match &&
+ getModuleId(p) == algebraRef &&
(getFunctionId(p) == markTRef ||
- getFunctionId(p) == markHRef) &&
- (m=isMATalias(getArg(p,1), mat, mtop)) >= 0) {
- InstrPtr mark = mat_mark(mb, p, mat, m);
+ getFunctionId(p) == markHRef)) {
+ InstrPtr mark;
- mtop = mat_add(mat, mtop, mark, mat_none);
+ m = isMATalias(getArg(p,1), mat, mtop);
+ mark = mat_mark(mb, p, mat, m);
+ mtop = mat_add(mat, mtop, mb, mark, mat_none);
actions++;
continue;
}
@@ -1169,7 +1317,7 @@
mat[m].type == mat_hist)
pack_mirror = 1;
if ((r = mat_apply1(mb, p, mat, m, fm, 0)) != NULL)
- mtop = mat_add(mat, mtop, r, mat_none);
+ mtop = mat_add(mat, mtop, mb, r, mat_none);
/* packed group should include the mirror statement */
if (pack_mirror) {
mat[mtop-1].type = mat_ext;
@@ -1206,6 +1354,8 @@
}
}
pushInstruction(mb,p);
+ if (p->argc >= 2)
+ propagateProp(mb, p, getArg(p,1));
}
GDKfree(old);
@-
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-checkins