in aios/storage/indexlib/indexlib/document/query/range_query_evaluator.cpp [26:109]
EvaluatorState RangeQueryEvaluator::DoEvaluate(EvaluatorStateHandler& handler, const RawDocumentPtr& rawDoc,
EvaluateParam param)
{
if (!rawDoc) {
return ES_PENDING;
}
if (mFunc) {
mFunc->Execute(rawDoc);
}
if (!rawDoc->exist(mFieldName)) {
return param.pendingForFieldNotExist ? ES_PENDING : ES_FALSE;
}
std::string fieldValue = rawDoc->getField(mFieldName);
RangeQuery::RangeValueType type = RangeQuery::GetValueType(fieldValue);
if (type == mRangeInfo.valueType) {
switch (type) {
case RangeQuery::RVT_UINT: {
uint64_t value;
if (!StringUtil::fromString(fieldValue, value)) {
return ES_FALSE;
}
bool leftResult = mRangeInfo.leftInclude ? mRangeInfo.leftValue.uintValue <= value
: mRangeInfo.leftValue.uintValue < value;
bool rightResult = mRangeInfo.rightInclude ? mRangeInfo.rightValue.uintValue >= value
: mRangeInfo.rightValue.uintValue > value;
return (leftResult && rightResult) ? ES_TRUE : ES_FALSE;
}
case RangeQuery::RVT_INT: {
int64_t value;
if (!StringUtil::fromString(fieldValue, value)) {
return ES_FALSE;
}
bool leftResult =
mRangeInfo.leftInclude ? mRangeInfo.leftValue.intValue <= value : mRangeInfo.leftValue.intValue < value;
bool rightResult = mRangeInfo.rightInclude ? mRangeInfo.rightValue.intValue >= value
: mRangeInfo.rightValue.intValue > value;
return (leftResult && rightResult) ? ES_TRUE : ES_FALSE;
}
case RangeQuery::RVT_DOUBLE: {
double value;
if (!StringUtil::fromString(fieldValue, value)) {
return ES_FALSE;
}
bool leftResult = mRangeInfo.leftInclude ? mRangeInfo.leftValue.doubleValue <= value
: mRangeInfo.leftValue.doubleValue < value;
bool rightResult = mRangeInfo.rightInclude ? mRangeInfo.rightValue.doubleValue >= value
: mRangeInfo.rightValue.doubleValue > value;
return (leftResult && rightResult) ? ES_TRUE : ES_FALSE;
}
default:
return ES_FALSE;
}
}
type = (RangeQuery::RangeValueType)max((int)type, (int)mRangeInfo.valueType);
switch (type) {
case RangeQuery::RVT_INT: {
int64_t value, leftValue, rightValue;
if (!StringUtil::fromString(fieldValue, value) || !StringUtil::fromString(mRangeInfo.leftStr, leftValue) ||
!StringUtil::fromString(mRangeInfo.rightStr, rightValue)) {
return ES_FALSE;
}
bool leftResult = mRangeInfo.leftInclude ? leftValue <= value : leftValue < value;
bool rightResult = mRangeInfo.rightInclude ? rightValue >= value : rightValue > value;
return (leftResult && rightResult) ? ES_TRUE : ES_FALSE;
}
case RangeQuery::RVT_DOUBLE: {
double value, leftValue, rightValue;
if (!StringUtil::fromString(fieldValue, value) || !StringUtil::fromString(mRangeInfo.leftStr, leftValue) ||
!StringUtil::fromString(mRangeInfo.rightStr, rightValue)) {
return ES_FALSE;
}
bool leftResult = mRangeInfo.leftInclude ? leftValue <= value : leftValue < value;
bool rightResult = mRangeInfo.rightInclude ? rightValue >= value : rightValue > value;
return (leftResult && rightResult) ? ES_TRUE : ES_FALSE;
}
default:
return ES_FALSE;
}
return ES_FALSE;
}