refactor pow/log
This commit is contained in:
parent
2a6262f9ad
commit
b601542094
|
@ -173,7 +173,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.finalizeFunc = NULL
|
.finalizeFunc = NULL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "power",
|
.name = "pow",
|
||||||
.type = FUNCTION_TYPE_POW,
|
.type = FUNCTION_TYPE_POW,
|
||||||
.classification = FUNC_MGT_SCALAR_FUNC,
|
.classification = FUNC_MGT_SCALAR_FUNC,
|
||||||
.checkFunc = stubCheckAndGetResultType,
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
|
@ -332,13 +332,29 @@ int32_t stubCheckAndGetResultType(SFunctionNode* pFunc) {
|
||||||
// todo
|
// todo
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FUNCTION_TYPE_ABS: {
|
case FUNCTION_TYPE_ABS:
|
||||||
|
case FUNCTION_TYPE_CEIL:
|
||||||
|
case FUNCTION_TYPE_FLOOR:
|
||||||
|
case FUNCTION_TYPE_ROUND: {
|
||||||
SColumnNode* pParam = nodesListGetNode(pFunc->pParameterList, 0);
|
SColumnNode* pParam = nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
int32_t paraType = pParam->node.resType.type;
|
int32_t paraType = pParam->node.resType.type;
|
||||||
pFunc->node.resType = (SDataType) { .bytes = tDataTypes[paraType].bytes, .type = paraType };
|
pFunc->node.resType = (SDataType) { .bytes = tDataTypes[paraType].bytes, .type = paraType };
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case FUNCTION_TYPE_SIN:
|
||||||
|
case FUNCTION_TYPE_COS:
|
||||||
|
case FUNCTION_TYPE_TAN:
|
||||||
|
case FUNCTION_TYPE_ASIN:
|
||||||
|
case FUNCTION_TYPE_ACOS:
|
||||||
|
case FUNCTION_TYPE_ATAN:
|
||||||
|
case FUNCTION_TYPE_SQRT:
|
||||||
|
case FUNCTION_TYPE_LOG:
|
||||||
|
case FUNCTION_TYPE_POW: {
|
||||||
|
pFunc->node.resType = (SDataType) { .bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE };
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ASSERT(0); // to found the fault ASAP.
|
ASSERT(0); // to found the fault ASAP.
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,8 +107,8 @@ int32_t absFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutpu
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t logFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
|
||||||
#if 0
|
#if 0
|
||||||
|
int32_t logFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
||||||
if (inputNum != 2 || !IS_NUMERIC_TYPE(pInput[0].type) || !IS_NUMERIC_TYPE(pInput[1].type)) {
|
if (inputNum != 2 || !IS_NUMERIC_TYPE(pInput[0].type) || !IS_NUMERIC_TYPE(pInput[1].type)) {
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
@ -144,13 +144,13 @@ int32_t logFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutpu
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFree(input);
|
taosMemoryFree(input);
|
||||||
#endif
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int32_t powFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
|
||||||
#if 0
|
#if 0
|
||||||
|
int32_t powFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
||||||
if (inputNum != 2 || !IS_NUMERIC_TYPE(pInput[0].type) || !IS_NUMERIC_TYPE(pInput[1].type)) {
|
if (inputNum != 2 || !IS_NUMERIC_TYPE(pInput[0].type) || !IS_NUMERIC_TYPE(pInput[1].type)) {
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
@ -189,12 +189,13 @@ int32_t powFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutpu
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFree(input);
|
taosMemoryFree(input);
|
||||||
#endif
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef float (*_float_fn)(float);
|
typedef float (*_float_fn)(float);
|
||||||
typedef double (*_double_fn)(double);
|
typedef double (*_double_fn)(double);
|
||||||
|
typedef double (*_double_fn_2)(double, double);
|
||||||
|
|
||||||
int32_t doScalarFunctionUnique(SScalarParam *pInput, int32_t inputNum, SScalarParam* pOutput, _double_fn valFn) {
|
int32_t doScalarFunctionUnique(SScalarParam *pInput, int32_t inputNum, SScalarParam* pOutput, _double_fn valFn) {
|
||||||
int32_t type = GET_PARAM_TYPE(pInput);
|
int32_t type = GET_PARAM_TYPE(pInput);
|
||||||
|
@ -221,6 +222,39 @@ int32_t doScalarFunctionUnique(SScalarParam *pInput, int32_t inputNum, SScalarPa
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double tlog(double v, double base) {
|
||||||
|
return log(v) / log(base);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t doScalarFunctionUnique2(SScalarParam *pInput, int32_t inputNum, SScalarParam* pOutput, _double_fn_2 valFn) {
|
||||||
|
if (inputNum != 2 || !IS_NUMERIC_TYPE(GET_PARAM_TYPE(&pInput[0])) || !IS_NUMERIC_TYPE(GET_PARAM_TYPE(&pInput[1]))) {
|
||||||
|
return TSDB_CODE_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
SColumnInfoData *pInputData[2];
|
||||||
|
SColumnInfoData *pOutputData = pOutput->columnData;
|
||||||
|
_getDoubleValue_fn_t getValueFn[2];
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < inputNum; ++i) {
|
||||||
|
pInputData[i] = pInput[i].columnData;
|
||||||
|
getValueFn[i]= getVectorDoubleValueFn(GET_PARAM_TYPE(&pInput[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
double *out = (double *)pOutputData->pData;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pInput->numOfRows; ++i) {
|
||||||
|
if (colDataIsNull_f(pInputData[0]->nullbitmap, i) ||
|
||||||
|
colDataIsNull_f(pInputData[1]->nullbitmap, 0)) {
|
||||||
|
colDataSetNull_f(pOutputData->nullbitmap, i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
out[i] = valFn(getValueFn[0](pInputData[0]->pData, i), getValueFn[1](pInputData[1]->pData, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
pOutput->numOfRows = pInput->numOfRows;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t doScalarFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam* pOutput, _float_fn f1, _double_fn d1) {
|
int32_t doScalarFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam* pOutput, _float_fn f1, _double_fn d1) {
|
||||||
int32_t type = GET_PARAM_TYPE(pInput);
|
int32_t type = GET_PARAM_TYPE(pInput);
|
||||||
if (inputNum != 1 || !IS_NUMERIC_TYPE(type)) {
|
if (inputNum != 1 || !IS_NUMERIC_TYPE(type)) {
|
||||||
|
@ -292,6 +326,14 @@ int32_t acosFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp
|
||||||
return doScalarFunctionUnique(pInput, inputNum, pOutput, acos);
|
return doScalarFunctionUnique(pInput, inputNum, pOutput, acos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t powFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
||||||
|
return doScalarFunctionUnique2(pInput, inputNum, pOutput, pow);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t logFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
||||||
|
return doScalarFunctionUnique2(pInput, inputNum, pOutput, tlog);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t sqrtFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
int32_t sqrtFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
||||||
return doScalarFunctionUnique(pInput, inputNum, pOutput, sqrt);
|
return doScalarFunctionUnique(pInput, inputNum, pOutput, sqrt);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue