Changeset: 56700be97dc8 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=56700be97dc8 Added Files: monetdb5/modules/mal/orderidx.c monetdb5/modules/mal/orderidx.h monetdb5/modules/mal/orderidx.mal Removed Files: monetdb5/modules/mal/arrange.c monetdb5/modules/mal/arrange.h monetdb5/modules/mal/arrange.mal Branch: leftmart Log Message:
changing names on files diffs (truncated from 946 to 300 lines): diff --git a/monetdb5/modules/mal/arrange.c b/monetdb5/modules/mal/arrange.c deleted file mode 100644 --- a/monetdb5/modules/mal/arrange.c +++ /dev/null @@ -1,411 +0,0 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2008-2015 MonetDB B.V. - */ - -/* - * (c) Martin Kersten - * Implement a parallel sort-merge MAL program generator - */ -#include "monetdb_config.h" -#include "arrange.h" -#include "gdk.h" - -str -ARNGcreate(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) -{ - int pieces = 3; - int i, loopvar, bid, arg; - BUN cnt, step=0,o; - MalBlkPtr smb; - MalStkPtr newstk; - Symbol snew; - InstrPtr q, pack; - BAT *b; - char name[IDLENGTH]; - str msg= MAL_SUCCEED; - - if (pci->argc == 3) { - pieces = stk->stk[pci->argv[2]].val.ival; - } else { - /* TODO: educated guess needed on number of partitions */ - } -#ifdef _DEBUG_ARNG_ - mnstr_printf(cntxt->fdout,"#bat.arrange pieces %d\n",pieces); -#endif - - if (pieces < 0) - throw(MAL,"bat.arrange","Positive number expected"); - - bid = *getArgReference_bat(stk, pci, 1); - b = BATdescriptor(bid); - if (b == NULL) - throw(MAL, "bat.arrange", RUNTIME_OBJECT_MISSING); - - /* TODO: check if b already has index */ - /* TODO: check if b is sorted, then index does nto make sense, other action is needed*/ - /* TODO: check if b is view and parent has index do a range select */ - - // create a temporary MAL function - snprintf(name, IDLENGTH, "sort%d", rand()%1000); - snew = newFunction(putName("user", 4), putName(name, strlen(name)), FUNCTIONsymbol); - smb = snew->def; - q = getInstrPtr(smb, 0); - arg = newTmpVariable(smb, getArgType(mb,pci,1)); - pushArgument(smb, q, arg); - getArg(q,0) = newTmpVariable(smb, TYPE_void); - - resizeMalBlk(smb, 2*pieces+10, 2*pieces+10); // large enough - // create the pack instruction first, as it will hold intermediate variables - pack = newInstruction(0, ASSIGNsymbol); - setModuleId(pack, putName("bat", 3)); - setFunctionId(pack, putName("arrange", 7)); - pack->argv[0] = newTmpVariable(smb, TYPE_void); - pack = pushArgument(smb, pack, arg); - setVarFixed(smb, getArg(pack, 0)); - - // the costly part executed as a parallel block - loopvar = newTmpVariable(smb, TYPE_bit); - q = newStmt(smb, putName("language", 8), putName("dataflow", 8)); - q->barrier = BARRIERsymbol; - q->argv[0] = loopvar; - - cnt = BATcount(b); - step = cnt/pieces; - o = 0; - for (i=0; i< pieces; i++) { - // add slice instruction - q = newStmt(smb, putName("algebra", 7),putName("slice", 5)); - setVarType(smb, getArg(q,0), getArgType(mb, pci, 1)); - setVarFixed(smb, getArg(q,0)); - q = pushArgument(smb, q, arg); - pack = pushArgument(smb, pack, getArg(q,0)); - q = pushOid(smb, q, o); - if (i == pieces-1) { - o = cnt; - } else { - o += step; - } - q = pushOid(smb, q, o); - } - for (i=0; i< pieces; i++) { - // add sort instruction - q = newStmt(smb, putName("algebra",7), putName("arrangeorder", 9)); - setVarType(smb, getArg(q, 0), newBatType(TYPE_oid, TYPE_oid)); - setVarFixed(smb, getArg(q, 0)); - q = pushArgument(smb, q, pack->argv[2+i]); - q = pushBit(smb, q, 0); - q = pushBit(smb, q, 0); - pack->argv[2+i] = getArg(q, 0); - } - // finalize, check, and evaluate - pushInstruction(smb,pack); - q = newAssignment(smb); - q->barrier = EXITsymbol; - q->argv[0] =loopvar; - pushEndInstruction(smb); - chkProgram(cntxt->fdout, cntxt->nspace, smb); - if (smb->errors) { - msg = createException(MAL, "bat.arrange", "Type errors in generated code"); - } else { - // evaluate MAL block - newstk = prepareMALstack(smb, smb->vsize); - newstk->up = 0; - VALcopy(&newstk->stk[arg], &stk->stk[getArg(pci,1)]); - BBPincref(newstk->stk[arg].val.bval, TRUE); - msg = runMALsequence(cntxt, smb, 1, 0, newstk, 0, 0); - freeStack(newstk); - } -#ifdef _DEBUG_INDEX_ - printFunction(cntxt->fdout, smb, 0, LIST_MAL_ALL); -#endif - BBPunfix(b->batCacheid); - // get rid of temporary MAL block - freeSymbol(snew); - return msg; -} - - -str -ARNGmerge(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) -{ - bat bid; - BAT *b; - bat *aid; - BAT **a; - int i, j, n_ar; - - (void) cntxt; - (void) mb; - - assert(pci->argc > 2); - n_ar = pci->argc-2; - - bid = *getArgReference_bat(stk, pci, 1); - b = BATdescriptor(bid); - if (b == NULL) - throw(MAL, "bat.arrange", RUNTIME_OBJECT_MISSING); - - assert(BAThdense(b)); /* assert void headed */ - switch (ATOMstorage(b->ttype)) { - case TYPE_bte: - case TYPE_sht: - case TYPE_int: - case TYPE_lng: -#ifdef HAVE_HGE - case TYPE_hge: -#endif - case TYPE_flt: - case TYPE_dbl: - break; - case TYPE_void: - case TYPE_str: - case TYPE_ptr: - default: - /* TODO: support strings, date, timestamps etc. */ - throw(MAL, "bat.arrange", TYPE_NOT_SUPPORTED); - } - - if ((aid = (bat *) GDKzalloc(n_ar*sizeof(bat))) == NULL ) { - BBPunfix(bid); - throw(MAL, "bat.arrange", MAL_MALLOC_FAIL); - } - if ((a = (BAT **) GDKzalloc(n_ar*sizeof(BAT *))) == NULL) { - BBPunfix(bid); - GDKfree(aid); - throw(MAL, "bat.arrange", MAL_MALLOC_FAIL); - } - for (i = 0; i < n_ar; i++) { - aid[i] = *getArgReference_bat(stk, pci, i+2); - a[i] = BATdescriptor(aid[i]); - if (a[i] == NULL) { - for (j = i-1; j >= 0; j--) { - BBPunfix(aid[j]); - } - GDKfree(aid); - GDKfree(a); - BBPunfix(bid); - throw(MAL, "bat.arrange", RUNTIME_OBJECT_MISSING); - } - } - - if (n_ar == 1) { - /* One oid order bat, nothing to merge */ - if (ARNGindex(b, a[0]) == GDK_FAIL) { - BBPunfix(aid[0]); - BBPunfix(bid); - GDKfree(aid); - GDKfree(a); - throw(MAL,"bat.arrange", OPERATION_FAILED); - } - } else { - BAT *m; /* merged oid's */ - oid *mv; - BUN m_sz; - - for (i=0, m_sz = 0; i < n_ar; i++) { - m_sz += BATcount(a[i]); - } - m = BATnew(TYPE_void, TYPE_oid, m_sz, TRANSIENT); - if (m == NULL) { - for (i = 0; i < n_ar; i++) - BBPunfix(aid[i]); - BBPunfix(bid); - GDKfree(aid); - GDKfree(a); - throw(MAL,"bat.arrange", MAL_MALLOC_FAIL); - } - mv = (oid *) Tloc(m, BUNfirst(m)); - - /* sort merge with 1 comparison per BUN */ - if (n_ar == 2) { - oid *p0, *p1, *q0, *q1; - p0 = (oid *) Tloc(a[0], BUNfirst(a[0])); - q0 = (oid *) Tloc(a[0], BUNlast(a[0])); - p1 = (oid *) Tloc(a[1], BUNfirst(a[1])); - q1 = (oid *) Tloc(a[1], BUNlast(a[1])); - -#define BINARY_MERGE(TYPE) \ -do { \ - TYPE *v = (TYPE *) Tloc(b, BUNfirst(b)); \ - for (; p0 < q0 && p1 < q1; ) { \ - if (v[*p0] < v[*p1]) { \ - *mv++ = *p0++; \ - } else { \ - *mv++ = *p1++; \ - } \ - } \ - while (p0 < q0) { \ - *mv++ = *p0++; \ - } \ - while (p1 < q1) { \ - *mv++ = *p1++; \ - } \ -} while(0) - - switch (ATOMstorage(b->ttype)) { - case TYPE_bte: BINARY_MERGE(bte); break; - case TYPE_sht: BINARY_MERGE(sht); break; - case TYPE_int: BINARY_MERGE(int); break; - case TYPE_lng: BINARY_MERGE(lng); break; -#ifdef HAVE_HGE - case TYPE_hge: BINARY_MERGE(hge); break; -#endif - case TYPE_flt: BINARY_MERGE(flt); break; - case TYPE_dbl: BINARY_MERGE(dbl); break; - case TYPE_void: - case TYPE_str: - case TYPE_ptr: - default: - /* TODO: support strings, date, timestamps etc. */ - throw(MAL, "bat.arrange", TYPE_NOT_SUPPORTED); - } - - /* use min-heap */ - } else { - oid **p, **q, *t_oid; - - if ((p = (oid **) GDKzalloc(n_ar*sizeof(oid *))) == NULL) { - for (i = 0; i < n_ar; i++) - BBPunfix(aid[i]); - BBPunfix(bid); - BBPunfix(m->batCacheid); - GDKfree(aid); - GDKfree(a); - throw(MAL,"bat.arrange", MAL_MALLOC_FAIL); - } - if ((q = (oid **) GDKzalloc(n_ar*sizeof(oid *))) == NULL) { - for (i = 0; i < n_ar; i++) - BBPunfix(aid[i]); - BBPunfix(bid); - BBPunfix(m->batCacheid); - GDKfree(aid); - GDKfree(a); - GDKfree(p); - throw(MAL,"bat.arrange", MAL_MALLOC_FAIL); - } - for (i = 0; i < n_ar; i++) { - p[i] = (oid *) Tloc(a[i], BUNfirst(a[i])); - q[i] = (oid *) Tloc(a[i], BUNlast(a[i])); - } - -#define swap(X,Y,TMP) (TMP)=(X);(X)=(Y);(Y)=(TMP) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list