Changeset: 99a7b40605af for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=99a7b40605af Modified Files: monetdb5/mal/mal_interpreter.c monetdb5/mal/mal_listing.c monetdb5/modules/kernel/bat5.c monetdb5/modules/kernel/bat5.h monetdb5/modules/kernel/bat5.mal sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_gencode.c sql/backends/monet5/sql_statement.c sql/backends/monet5/sql_statement.h Branch: graph0 Log Message:
Yield the new resultset after performing the shortest path operator diffs (truncated from 418 to 300 lines): diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c --- a/monetdb5/mal/mal_interpreter.c +++ b/monetdb5/mal/mal_interpreter.c @@ -475,6 +475,9 @@ str runMALsequence(Client cntxt, MalBlkP if (stk == NULL) throw(MAL, "mal.interpreter", MAL_STACK_FAIL); + + printf("[DEBUG] [Interpreter] MAL Plan: %s\n", mal2str(mb, 0, mb->stop)); + /* prepare extended backup and garbage structures */ if (startpc+1 == stoppc) { pci = getInstrPtr(mb, startpc); diff --git a/monetdb5/mal/mal_listing.c b/monetdb5/mal/mal_listing.c --- a/monetdb5/mal/mal_listing.c +++ b/monetdb5/mal/mal_listing.c @@ -289,12 +289,12 @@ instruction2str(MalBlkPtr mb, MalStkPtr case CMDcall: case ASSIGNsymbol : // is any variable explicit or used - for (i = 0; i < p->retc; i++) - if ( !isTmpVar(mb,getArg(p,i)) || isVarUsed(mb, getArg(p, i)) || isVarUDFtype(mb,getArg(p,i))) - break; - - if (i == p->retc) - break; +// for (i = 0; i < p->retc; i++) +// if ( !isTmpVar(mb,getArg(p,i)) || isVarUsed(mb, getArg(p, i)) || isVarUDFtype(mb,getArg(p,i))) +// break; +// +// if (i == p->retc) +// break; /* display multi-assignment list */ if (p->retc > 1) diff --git a/monetdb5/modules/kernel/bat5.c b/monetdb5/modules/kernel/bat5.c --- a/monetdb5/modules/kernel/bat5.c +++ b/monetdb5/modules/kernel/bat5.c @@ -1031,6 +1031,22 @@ BKCgetSequenceBase(oid *r, const bat *bi return MAL_SUCCEED; } +str +BKCresetSequenceBase(bat *ret, const bat *bid) +{ + BAT* b; + + if ((b = BATdescriptor(*bid)) == NULL) { + throw(MAL, "bat.resetSequenceBase", RUNTIME_OBJECT_MISSING); + } + + b->hseqbase = 0; + *ret = b->batCacheid; + BBPkeepref(b->batCacheid); + + return MAL_SUCCEED; +} + /* * Shrinking a void-headed BAT using a list of oids to ignore. */ diff --git a/monetdb5/modules/kernel/bat5.h b/monetdb5/modules/kernel/bat5.h --- a/monetdb5/modules/kernel/bat5.h +++ b/monetdb5/modules/kernel/bat5.h @@ -52,6 +52,7 @@ mal_export str BKCsave2(void *r, const b mal_export str BKCsetHash(bit *ret, const bat *bid); mal_export str BKCsetImprints(bit *ret, const bat *bid); mal_export str BKCgetSequenceBase(oid *r, const bat *bid); +mal_export str BKCresetSequenceBase(bat *ret, const bat *bid); mal_export str BKCshrinkBAT(bat *ret, const bat *bid, const bat *did); mal_export str BKCreuseBAT(bat *ret, const bat *bid, const bat *did); mal_export str BKCshrinkBATmap(bat *ret, const bat *bid, const bat *did); diff --git a/monetdb5/modules/kernel/bat5.mal b/monetdb5/modules/kernel/bat5.mal --- a/monetdb5/modules/kernel/bat5.mal +++ b/monetdb5/modules/kernel/bat5.mal @@ -115,6 +115,10 @@ command getSequenceBase( b:bat[:any_1]): address BKCgetSequenceBase comment "Get the sequence base for the void column of a BAT."; +command resetSequenceBase( b:bat[:any_1]) :bat[:any_1] +address BKCresetSequenceBase +comment "Reset the base index for the input BAT to position zero."; + command isSorted(b:bat[:any_1]) :bit address BKCisSorted comment "Returns true if BAT values are ordered."; diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -2959,7 +2959,8 @@ insert_check_ukey(mvc *sql, list *insert stmt *cs = list_fetch(inserts, c->c->colnr); if (orderby_grp) - orderby = stmt_reorder(sql->sa, cs->op1, 1, orderby_ids, orderby_grp); + orderby = stmt_reorder(sql->sa, // strong suspects these are the output cols of the operator +cs->op1, 1, orderby_ids, orderby_grp); else orderby = stmt_order(sql->sa, cs->op1, 1); orderby_ids = stmt_result(sql->sa, orderby, 1); @@ -4558,10 +4559,10 @@ rel2bin_spfw(mvc *sql, sql_rel *rel, lis stmt *c = NULL, *g = NULL, *groups = NULL, *smpl = NULL; stmt *D = NULL, *vrtx = NULL; list *l = NULL; - stmt *filter = NULL; - stmt *result = NULL; + stmt *split = NULL; stmt *e_from = NULL, *e_to = NULL, *q_from = NULL, *q_to = NULL; stmt *mk_perm = NULL; + stmt *result = NULL; node *n = NULL; // generic var to iterate through a list // materialize the input relations @@ -4591,8 +4592,9 @@ rel2bin_spfw(mvc *sql, sql_rel *rel, lis g = stmt_group(sql->sa, c, NULL, NULL, NULL); groups = stmt_result(sql->sa, g, 0); smpl = stmt_result(sql->sa, g, 1); - e_from = stmt_mkpartition(sql->sa, groups, 0, 2); - e_to = stmt_mkpartition(sql->sa, groups, 1, 2); + split = stmt_slices(sql->sa, groups, 2); + e_from = stmt_result(sql->sa, split, 0); + e_to = stmt_result(sql->sa, split, 1); // mkgraph (naive approach) e_from = stmt_order(sql->sa, e_from, /* direction = */ 0); mk_perm = stmt_result(sql->sa, e_from, 1); @@ -4613,19 +4615,19 @@ rel2bin_spfw(mvc *sql, sql_rel *rel, lis q_from = stmt_result(sql->sa, vrtx, 0); q_to = stmt_result(sql->sa, vrtx, 1); - // finally execute the shortest path operator + // execute the shortest path operator spfw = stmt_spfw(sql->sa, q_from, q_to, graph); - // apply the selection filter - filter = stmt_result(sql->sa, spfw, 0); + // almost done, create the new resultset l = sa_list(sql->sa); - for(node *n = left->op4.lval->h; n; n = n->next){ - stmt *col = n->data; - if(col->nrcols == 0) - col = stmt_const(sql->sa, filter, col); - else - col = stmt_project(sql->sa, filter, col); - list_append(l, col); + for( n = left->op4.lval->h; n; n = n->next ) { + stmt *c = n->data; + const char *rnme = table_name(sql->sa, c); + const char *nme = column_name(sql->sa, c); + stmt *s = stmt_project(sql->sa, spfw, column(sql->sa, c)); + + s = stmt_alias(sql->sa, s, rnme, nme); + list_append(l, s); } result = stmt_list(sql->sa, l); diff --git a/sql/backends/monet5/sql_gencode.c b/sql/backends/monet5/sql_gencode.c --- a/sql/backends/monet5/sql_gencode.c +++ b/sql/backends/monet5/sql_gencode.c @@ -2781,7 +2781,7 @@ static int if(ref_op < 0) return -1; - q = newStmt(mb, batRef, copyRef); + q = newStmt(mb, algebraRef, copyRef); q = pushArgument(mb, q, ref_op); ref_cpy = getDestVar(q); @@ -2806,6 +2806,7 @@ static int InstrPtr join = NULL, cmp = NULL, cmp_not = NULL; int /*jl1 = -1,*/ jl2 = -1, /*jl3 = -1,*/ jr1 = -1, jr2 = -1, jr3 = -1; InstrPtr qfrom_oid = NULL, qto_oid = NULL; + int qtemp = -1; // process the operands ref_left = _dumpstmt(sql, mb, s->op1); @@ -2845,7 +2846,10 @@ static int join = pushArgument(mb, join, getDestVar(cnt1)); jl2 = getDestVar(join); -// qtemp = newTmpVariable(mb, TYPE_bat); // qfrom + qfrom_oid = newAssignment(mb); + qfrom_oid = pushNil(mb, qfrom_oid, TYPE_bat); + qtemp = getDestVar(qfrom_oid); + qto_oid = newAssignment(mb); // qto pushArgument(mb, qto_oid, jr2); @@ -2875,10 +2879,11 @@ static int // jl3 = getDestVar(join); qfrom_oid = newAssignment(mb); - pushArgument(mb, qfrom_oid, jr3); + getArg(qfrom_oid, 0) = qtemp; // dest + qfrom_oid = pushArgument(mb, qfrom_oid, jr3); stmt_endif = newAssignment(mb); - getArg(stmt_endif, 0) = getDestVar(cmp); + getArg(stmt_endif, 0) = getDestVar(stmt_if); stmt_endif->argc = stmt_endif->retc = 1; stmt_endif->barrier = EXITsymbol; @@ -2890,15 +2895,16 @@ static int stmt_else = pushArgument(mb, stmt_else, getDestVar(cmp_not)); qfrom_oid = newAssignment(mb); + getArg(qfrom_oid, 0) = qtemp; // dest pushArgument(mb, qfrom_oid, jr1); stmt_endif = newAssignment(mb); - getArg(stmt_endif, 0) = getDestVar(cmp_not); + getArg(stmt_endif, 0) = getDestVar(stmt_else); stmt_endif->argc = stmt_endif->retc = 1; stmt_endif->barrier = EXITsymbol; // abi convention for st_result - s->nr = getDestVar(qfrom_oid); + s->nr = qtemp; // = qfrom_oid renameVariable(mb, getDestVar(qto_oid), "r1_%d", s->nr); } break; case st_mkpartition: { @@ -2929,41 +2935,103 @@ static int q = pushArgument(mb, q, ref_stmt); s->nr = getDestVar(q); } break; + case st_slices: { + int ref_stmt = -1; + int num_slices = s->flag; + InstrPtr hseqbase_oid = NULL; + InstrPtr hseqbase_lng = NULL; + InstrPtr count = NULL; + InstrPtr interval = NULL; + InstrPtr step = NULL; + + if(num_slices < 1) + return -1; + + ref_stmt = _dumpstmt(sql, mb, s->op1); + if(ref_stmt < 0) + return -1; + + hseqbase_oid = newStmt(mb, "bat", "getSequenceBase"); + hseqbase_oid = pushArgument(mb, hseqbase_oid, ref_stmt); + + hseqbase_lng = newStmt(mb, "calc", "lng"); + hseqbase_lng = pushArgument(mb, hseqbase_lng, getDestVar(hseqbase_oid)); + + count = newStmt(mb, "aggr", "count"); + count = pushArgument(mb, count, ref_stmt); + + interval = newStmt(mb, "calc", "-"); + interval = pushArgument(mb, interval, getDestVar(count)); + interval = pushArgument(mb, interval, getDestVar(hseqbase_lng)); + + // assume that interval % num_slices == 0 + step = newStmt(mb, "calc", "/"); + step = pushArgument(mb, step, getDestVar(interval)); + step = pushLng(mb, step, (lng) num_slices); + + for(int i = 0; i < num_slices; i++){ + InstrPtr start = NULL, end_plus_1 = NULL, end = NULL, + slice_indexed = NULL, slice_final = NULL; + + start = newStmt(mb, "calc", "*"); + start = pushArgument(mb, start, getDestVar(step)); + start = pushLng(mb, start, i); + + end_plus_1 = newStmt(mb, "calc", "+"); + end_plus_1 = pushArgument(mb, end_plus_1, getDestVar(start)); + end_plus_1 = pushArgument(mb, end_plus_1, getDestVar(step)); + + end = newStmt(mb, "calc", "-"); + end = pushArgument(mb, end, getDestVar(end_plus_1)); + end = pushLng(mb, end, 1); + + slice_indexed = newStmt(mb, "algebra", "slice"); + slice_indexed = pushArgument(mb, slice_indexed, ref_stmt); + slice_indexed = pushArgument(mb, slice_indexed, getDestVar(start)); + slice_indexed = pushArgument(mb, slice_indexed, getDestVar(end)); + + // reset hseqbase = 0 + slice_final = newStmt(mb, "bat", "resetSequenceBase"); + slice_final = pushArgument(mb, slice_final, getDestVar(slice_indexed)); + + // abi convention + if(i==0){ + s->nr = getDestVar(slice_final); + } else { + snprintf(mb->var[getDestVar(slice_final)]->id, IDLENGTH, "r%d_%d", i, s->nr); + } + } + } break; case st_spfw: { - int left = -1, right = -1, qfrom = -1, qto = -1; + int efrom = -1, eto = -1, qfrom = -1, qto = -1; node* n = NULL; - left = _dumpstmt(sql, mb, s->op1); - if(left < 0) + qfrom = _dumpstmt(sql, mb, s->op1); + if(qfrom < 0) return -1; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list