fix: refactor and save work

This commit is contained in:
shenglian zhou 2023-05-17 16:57:09 +08:00
parent 51fa363fd5
commit e16f4c7c44
1 changed files with 124 additions and 96 deletions

View File

@ -22,6 +22,7 @@
#include "sclInt.h"
#include "tcompare.h"
#include "tdatablock.h"
#include "tsimplehash.h"
#include "ttime.h"
bool filterRangeCompGi(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
@ -3958,10 +3959,7 @@ typedef struct {
SFltSclDatumKind kind;
union {
int64_t val; // for int64, uint64 and double and bool (1 true, 0 false)
struct {
uint32_t nData; // TODO maybe remove this and make pData len prefixed?
uint8_t *pData;
}; // for varchar, nchar
uint8_t *pData; // for varchar, nchar
} datum;
SDataType type; // TODO: original data type, may not be used?
} SFltSclDatum;
@ -3979,37 +3977,77 @@ typedef struct {
bool highExcl;
} SFltSclRange;
int32_t fltSclCompareDatum(SFltSclDatum* val1, SFltSclDatum* val2) {
int32_t fltSclCompareWithFloat64(SFltSclDatum *val1, SFltSclDatum *val2) {
// val2->kind == int64
switch (val1->kind) {
case FLT_SCL_DATUM_KIND_NULL: {
if (val2->kind == FLT_SCL_DATUM_KIND_NULL) return 0 ; else return -1;
break;
case FLT_SCL_DATUM_KIND_UINT64:
return compareUint64Double(&val1->datum.val, &val2->datum.val);
case FLT_SCL_DATUM_KIND_INT64:
return compareInt64Double(&val1->datum.val, &val2->datum.val);
case FLT_SCL_DATUM_KIND_FLOAT64: {
return compareDoubleVal(&val1->datum.val, &val2->datum.val);
}
case FLT_SCL_DATUM_KIND_MIN: {
if (val2->kind == FLT_SCL_DATUM_KIND_NULL) return 1;
else {
if (val2->kind == FLT_SCL_DATUM_KIND_MIN) return 0; else return -1;
//TODO: varchar, nchar
default:
qError("not support comparsion. %d, %d", val1->kind, val2->kind);
return (val1->kind - val2->kind);
}
break;
}
case FLT_SCL_DATUM_KIND_MAX: {
if (val2->kind == FLT_SCL_DATUM_KIND_MAX) return 0; else return 1;
int32_t fltSclCompareWithInt64(SFltSclDatum *val1, SFltSclDatum *val2) {
// val2->kind == int64
switch (val1->kind) {
case FLT_SCL_DATUM_KIND_UINT64:
return compareUint64Int64(&val1->datum.val, &val2->datum.val);
case FLT_SCL_DATUM_KIND_INT64:
return compareInt64Val(&val1->datum.val, &val2->datum.val);
case FLT_SCL_DATUM_KIND_FLOAT64: {
return compareDoubleInt64(&val1->datum.val, &val2->datum.val);
}
//TODO: varchar, nchar
default:
qError("not support comparsion. %d, %d", val1->kind, val2->kind);
return (val1->kind - val2->kind);
}
}
int32_t fltSclCompareWithUInt64(SFltSclDatum *val1, SFltSclDatum *val2) {
// val2 kind == uint64
switch (val1->kind) {
case FLT_SCL_DATUM_KIND_UINT64:
return compareUint64Val(&val1->datum.val, &val2->datum.val);
case FLT_SCL_DATUM_KIND_INT64:
return compareInt64Uint64(&val1->datum.val, &val2->datum.val);
case FLT_SCL_DATUM_KIND_FLOAT64: {
return compareDoubleUint64(&val1->datum.val, &val2->datum.val);
}
//TODO: varchar, nchar
default:
qError("not support comparsion. %d, %d", val1->kind, val2->kind);
return (val1->kind - val2->kind);
}
}
int32_t fltSclCompareDatum(SFltSclDatum *val1, SFltSclDatum *val2) {
if (val2->kind == FLT_SCL_DATUM_KIND_NULL || val2->kind == FLT_SCL_DATUM_KIND_MIN ||
val2->kind == FLT_SCL_DATUM_KIND_MAX) {
if (val1->kind == FLT_SCL_DATUM_KIND_NULL || val1->kind == FLT_SCL_DATUM_KIND_MIN ||
val1->kind == FLT_SCL_DATUM_KIND_MAX) {
return (val1->kind < val2->kind) ? -1 : ((val1->kind > val2->kind) ? 1 : 0);
}
}
switch (val2->kind) {
case FLT_SCL_DATUM_KIND_UINT64: {
return compareUint64Val(&val1->datum.val, &val1->datum.val);
return fltSclCompareWithUInt64(val1, val2);
}
case FLT_SCL_DATUM_KIND_INT64: {
return compareInt64Val(&val1->datum.val, &val2->datum.val);
return fltSclCompareWithInt64(val1, val2);
}
case FLT_SCL_DATUM_KIND_FLOAT64: {
return compareFloatDouble(&val1->datum.val, &val2->datum.val);
}
case FLT_SCL_DATUM_KIND_NCHAR: {
return compareLenPrefixedWStr(&val1->datum.pData, &val2->datum.pData); //TODO
}
case FLT_SCL_DATUM_KIND_VARCHAR: {
return compareLenPrefixedStr(&val1->datum.pData, &val2->datum.pData); //TODO
return fltSclCompareWithFloat64(val1, val2);
}
//TODO: varchar/nchar
default:
fltError("not supported kind. just return 0");
return 0;
@ -4094,37 +4132,28 @@ int32_t fltSclMerge(SArray* pts1, SArray* pts2, bool isUnion, SArray* merged) {
return 0;
}
int32_t fltSclIntersect(SArray *pts1, SArray *pts2, SArray *merged) { return fltSclMerge(pts1, pts2, false, merged); }
int32_t fltSclIntersect(SArray* pts1, SArray* pts2, SArray* merged) {
return fltSclMerge(pts1, pts2, false, merged);
}
int32_t fltSclUnion(SArray* pts1, SArray* pts2, SArray* merged) {
return fltSclMerge(pts1, pts2, true, merged);
}
int32_t fltSclUnion(SArray *pts1, SArray *pts2, SArray *merged) { return fltSclMerge(pts1, pts2, true, merged); }
typedef struct {
SColumnNode *colNode;
SValueNode *valNode;
EOperatorType type;
} SFltSclScalarOp;
} SFltSclOperator;
// simple define it, TODO: implement later
typedef struct {
SColumnNode* colNode;
} SFltSclConstColumn;
// simple define it, TODO: implement later
typedef struct {
SValueNode* value;
} SFltSclConstant;
int32_t fltSclBuildRangeFromScalarFunc(SFltSclScalarOp* func, SFltSclPoint* points) {
//TODO: column, constant, operator, and/or/not
int32_t fltSclBuildRangeFromOperator(SFltSclOperator *sclOper, SSHashObj* obj) {
switch (sclOper->type) {
case OP_TYPE_GREATER_THAN: {
}
break;
default:
break;
}
return TSDB_CODE_SUCCESS;
}
typedef struct {
bool useRange;
@ -4136,7 +4165,6 @@ static EDealRes fltSclMayBeOptimed(SNode* pNode, void* pCtx) {
return DEAL_RES_CONTINUE;
}
int32_t fltOptimizeNodes(SFilterInfo *pInfo, SNode **pNode, SFltTreeStat *pStat) {
SFltSclOptCtx ctx;
nodesWalkExprPostOrder(*pNode, fltSclMayBeOptimed, &ctx);