Changeset: ddb87e042198 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ddb87e042198
Modified Files:
        monetdb5/modules/mal/calc_arrays.c
        monetdb5/modules/mal/calc_arrays.h
        monetdb5/modules/mal/calc_arrays.mal
Branch: arrays
Log Message:

scalar addition + covert nonDimensional column


diffs (truncated from 682 to 300 lines):

diff --git a/monetdb5/modules/mal/calc_arrays.c 
b/monetdb5/modules/mal/calc_arrays.c
--- a/monetdb5/modules/mal/calc_arrays.c
+++ b/monetdb5/modules/mal/calc_arrays.c
@@ -7,6 +7,60 @@
 
 #include "calc_arrays.h"
 
+static int
+calctype(int tp1, int tp2)
+{
+    int tp1s = ATOMbasetype(tp1);
+    int tp2s = ATOMbasetype(tp2);
+    if (tp1s == TYPE_str && tp2s == TYPE_str)
+        return TYPE_str;
+    if (tp1s < TYPE_flt && tp2s < TYPE_flt) {
+        if (tp1s > tp2s)
+            return tp1;
+        if (tp1s < tp2s)
+            return tp2; 
+        return MAX(tp1, tp2);
+    }
+    if (tp1s == TYPE_dbl || tp2s == TYPE_dbl)
+        return TYPE_dbl; 
+    if (tp1s == TYPE_flt || tp2s == TYPE_flt)
+        return TYPE_flt;
+#ifdef HAVE_HGE 
+    if (tp1s == TYPE_hge || tp2s == TYPE_hge)
+        return TYPE_hge;
+#endif
+    return TYPE_lng;
+}
+
+static int
+calctypeenlarge(int tp1, int tp2)
+{
+    tp1 = calctype(tp1, tp2);
+    switch (tp1) {
+    case TYPE_bte:
+        return TYPE_sht;
+    case TYPE_sht:
+        return TYPE_int;
+    case TYPE_int:
+#if SIZEOF_WRD == SIZEOF_INT
+    case TYPE_wrd:
+#endif
+        return TYPE_lng;
+#ifdef HAVE_HGE
+#if SIZEOF_WRD == SIZEOF_LNG
+    case TYPE_wrd:
+#endif
+    case TYPE_lng:
+        return TYPE_hge;
+#endif
+    case TYPE_flt:
+        return TYPE_dbl;
+    default:
+        /* we shouldn't get here */
+        return tp1;
+    }
+}
+
 static BAT* dimension2BAT(const gdk_analytic_dimension *dim) {
        BAT *dimBAT = BATnew(TYPE_void, dim->type, 3, TRANSIENT);
 
@@ -216,6 +270,93 @@ str CMDdimensionCONVERT_str(ptr *dimRes,
        return CMDdimensionCONVERT((gdk_analytic_dimension**)dimRes, 
(gdk_analytic_dimension*)*dim, TYPE_str);
 }*/
 
+static str CMDnonDimensionalCONVERT(MalStkPtr stk, InstrPtr pci, int tp, int 
abort_on_error) {
+    bat *bid;
+    BAT *b, *bn, *s = NULL;
+       ptr *array_out = getArgReference_ptr(stk, pci, 1);
+       ptr *array_in = getArgReference_ptr(stk, pci, 3);
+
+    bid = getArgReference_bat(stk, pci, 2);
+    if ((b = BATdescriptor(*bid)) == NULL)
+        throw(MAL, "batcalc.convert", RUNTIME_OBJECT_MISSING);
+    assert(BAThdense(b));
+
+    bn = BATconvert(b, s, tp, abort_on_error);
+    BBPunfix(b->batCacheid);
+    if (bn == NULL) 
+        return createException(MAL, "batcalc.%s", ATOMname(tp), 
OPERATION_FAILED);
+    
+    bid = getArgReference_bat(stk, pci, 0);
+    BBPkeepref(*bid = bn->batCacheid);
+       *array_out = arrayCopy((gdk_array*)*array_in);
+    
+       return MAL_SUCCEED;
+}
+
+
+str CMDnonDimensionalCONVERTsignal_bit(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci) {
+    (void) cntxt;
+    (void) mb;
+
+    return CMDnonDimensionalCONVERT(stk, pci, TYPE_bit, 1);
+}
+
+str CMDnonDimensionalCONVERTsignal_bte(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci) {
+    (void) cntxt;
+    (void) mb;
+
+    return CMDnonDimensionalCONVERT(stk, pci, TYPE_bte, 1);
+}
+
+str CMDnonDimensionalCONVERTsignal_sht(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci) {
+    (void) cntxt;
+    (void) mb;
+
+    return CMDnonDimensionalCONVERT(stk, pci, TYPE_sht, 1);
+}
+
+str CMDnonDimensionalCONVERTsignal_int(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci) {
+    (void) cntxt;
+    (void) mb;
+
+    return CMDnonDimensionalCONVERT(stk, pci, TYPE_int, 1);
+}
+
+str CMDnonDimensionalCONVERTsignal_wrd(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci) {
+    (void) cntxt;
+    (void) mb;
+
+    return CMDnonDimensionalCONVERT(stk, pci, TYPE_wrd, 1);
+}
+
+str CMDnonDimensionalCONVERTsignal_lng(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci) {
+    (void) cntxt;
+    (void) mb;
+
+    return CMDnonDimensionalCONVERT(stk, pci, TYPE_lng, 1);
+}
+
+str CMDnonDimensionalCONVERTsignal_flt(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci) {
+    (void) cntxt;
+    (void) mb;
+
+    return CMDnonDimensionalCONVERT(stk, pci, TYPE_flt, 1);
+}
+
+str CMDnonDimensionalCONVERTsignal_dbl(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci) {
+    (void) cntxt;
+    (void) mb;
+
+    return CMDnonDimensionalCONVERT(stk, pci, TYPE_dbl, 1);
+}
+
+str CMDnonDimensionalCONVERTsignal_oid(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci) {
+    (void) cntxt;
+    (void) mb;
+
+    return CMDnonDimensionalCONVERT(stk, pci, TYPE_oid, 1);
+}
+
 
 str CMDdimensionMULsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci) {
        ptr *dimConverted = getArgReference_ptr(stk, pci, 0);
@@ -2218,7 +2359,7 @@ str CMDdimensionMULsignal(Client cntxt, 
 str CMDscalarMULsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci) {
     BAT *s=NULL;
 
-       int resType;
+       int resType, valType;
 
        /*get the arguments */
        bat *result = getArgReference_bat(stk, pci, 0);
@@ -2234,9 +2375,9 @@ str CMDscalarMULsignal(Client cntxt, Mal
        
        /* get the types of the input and output arguments */
        resType = getColumnType(getArgType(mb, pci, 0));
-//     int valType = stk->stk[getArg(pci, 1)].vtype;
-//     if (resType == TYPE_any)
-//        resType = calctype(valType, BATttype(valsBAT));
+       valType = stk->stk[getArg(pci, 1)].vtype;
+       if (resType == TYPE_any)
+        resType = calctype(valType, BATttype(valsBAT));
 
     resBAT = BATcalccstmul(&stk->stk[getArg(pci, 2)], valsBAT, s, resType, 1);
 
@@ -2258,7 +2399,7 @@ str CMDscalarMULsignal(Client cntxt, Mal
 str CMDscalarMULenlarge(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci) {
        BAT *s=NULL;
 
-       int resType;
+       int resType, valType;
 
        /*get the arguments */
        bat *result = getArgReference_bat(stk, pci, 0);
@@ -2274,9 +2415,9 @@ str CMDscalarMULenlarge(Client cntxt, Ma
        
        /* get the types of the input and output arguments */
        resType = getColumnType(getArgType(mb, pci, 0));
-//     int valType = stk->stk[getArg(pci, 1)].vtype;
-//     if (resType == TYPE_any)
-//        resType = calctypeenlarge(valType, BATttype(valsBAT));
+       valType = stk->stk[getArg(pci, 1)].vtype;
+       if (resType == TYPE_any)
+        resType = calctypeenlarge(valType, BATttype(valsBAT));
 
     resBAT = BATcalccstmul(&stk->stk[getArg(pci, 2)], valsBAT, s, resType, 1);
 
@@ -2294,6 +2435,85 @@ str CMDscalarMULenlarge(Client cntxt, Ma
        return MAL_SUCCEED;
 }
 
+str CMDscalarADDsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci) {
+    BAT *s=NULL;
+
+       int resType, valType;
+
+       /*get the arguments */
+       bat *result = getArgReference_bat(stk, pci, 0);
+       BAT *resBAT = NULL;
+       
+       ptr *array_out = getArgReference(stk, pci, 1);
+       ptr *array_in = getArgReference(stk, pci, 4);
+       
+       bat *vals = getArgReference_bat(stk, pci, 3);
+       BAT *valsBAT = BATdescriptor(*vals);
+       if(!valsBAT)
+               return createException(MAL, "calc.*", RUNTIME_OBJECT_MISSING);
+       
+       /* get the types of the input and output arguments */
+       resType = getColumnType(getArgType(mb, pci, 0));
+       valType = stk->stk[getArg(pci, 1)].vtype;
+       if (resType == TYPE_any)
+        resType = calctype(valType, BATttype(valsBAT));
+
+    resBAT = BATcalccstadd(&stk->stk[getArg(pci, 2)], valsBAT, s, resType, 1);
+
+       if (resBAT == NULL) {
+        BBPunfix(valsBAT->batCacheid);
+        return createException(MAL, "calc.*", OPERATION_FAILED);
+    }
+
+
+       (void) cntxt;
+       BBPunfix(valsBAT->batCacheid);
+       BBPkeepref(*result = resBAT->batCacheid);
+       *array_out = arrayCopy((gdk_array*)*array_in);
+
+       return MAL_SUCCEED;
+}
+
+
+str CMDscalarADDenlarge(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci) {
+       BAT *s=NULL;
+
+       int resType, valType;
+
+       /*get the arguments */
+       bat *result = getArgReference_bat(stk, pci, 0);
+       BAT *resBAT = NULL;
+       
+       ptr *array_out = getArgReference(stk, pci, 1);
+       ptr *array_in = getArgReference(stk, pci, 4);
+       
+       bat *vals = getArgReference_bat(stk, pci, 3);
+       BAT *valsBAT = BATdescriptor(*vals);
+       if(!valsBAT)
+               return createException(MAL, "calc.*", RUNTIME_OBJECT_MISSING);
+       
+       /* get the types of the input and output arguments */
+       resType = getColumnType(getArgType(mb, pci, 0));
+       valType = stk->stk[getArg(pci, 1)].vtype;
+       if (resType == TYPE_any)
+        resType = calctypeenlarge(valType, BATttype(valsBAT));
+
+    resBAT = BATcalccstadd(&stk->stk[getArg(pci, 2)], valsBAT, s, resType, 1);
+
+       if (resBAT == NULL) {
+        BBPunfix(valsBAT->batCacheid);
+        return createException(MAL, "calc.*", OPERATION_FAILED);
+    }
+
+
+       (void) cntxt;
+       BBPunfix(valsBAT->batCacheid);
+       BBPkeepref(*result = resBAT->batCacheid);
+       *array_out = arrayCopy((gdk_array*)*array_in);
+
+       return MAL_SUCCEED;
+}
+
 #define checkEqual(TPE1, dimLeft, TPE2, dimRight, vals) \
 do { \
        BUN i=0; \
diff --git a/monetdb5/modules/mal/calc_arrays.h 
b/monetdb5/modules/mal/calc_arrays.h
--- a/monetdb5/modules/mal/calc_arrays.h
+++ b/monetdb5/modules/mal/calc_arrays.h
@@ -14,12 +14,25 @@ str CMDdimensionCONVERT_dbl(ptr *dimRes,
 str CMDdimensionCONVERT_oid(ptr *dimRes, ptr *dimsRes, const ptr *dim, const 
ptr *dims);
 //str CMDdimensionCONVERT_str(ptr *dimRes, ptr *dimsRes, const ptr *dim, const 
ptr *dims);
 
+str CMDnonDimensionalCONVERTsignal_bit(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
+str CMDnonDimensionalCONVERTsignal_bte(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
+str CMDnonDimensionalCONVERTsignal_sht(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
+str CMDnonDimensionalCONVERTsignal_int(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
+str CMDnonDimensionalCONVERTsignal_wrd(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to