flatbuffers::Offset MatchDocFormatter::toFBResultRecordsByColumn()

in aios/matchdoc/MatchDocFormatter.cpp [90:293]


flatbuffers::Offset<FieldValueColumnTable> MatchDocFormatter::toFBResultRecordsByColumn(
    const matchdoc::ReferenceBase *base, const vector<MatchDoc> &docs, flatbuffers::FlatBufferBuilder &fbb) {
    uint32_t recordSize = docs.size();
    matchdoc::BuiltinType builtinType = bt_unknown;
    if (base->getValueType().isBuiltInType()) {
        builtinType = base->getValueType().getBuiltinType();
    }

    auto offsetDefault = CreateUnknownValueColumn(fbb, (int8_t)0).Union();
    flatbuffers::Offset<FieldValueColumnTable> defaultRet =
        CreateFieldValueColumnTable(fbb, FieldValueColumn_UnknownValueColumn, offsetDefault);
    bool isMulti = base->getValueType().isMultiValue();
    if (bt_unknown == builtinType) { // VT_STRING的FB构造比较特殊
        if (typeid(string).name() != base->getVariableType()) {
            AUTIL_LOG(ERROR, "not support [%s] type fb format", base->getVariableType().c_str());
            return defaultRet;
        }
        auto ref = static_cast<const Reference<string> *>(base);
        std::vector<flatbuffers::Offset<flatbuffers::String>> offsets(recordSize);
        for (size_t i = 0; i < recordSize; i++) {
            string value = ref->get(docs[i]);
            offsets[i] = fbb.CreateString(value.data(), value.size());
        }
        flatbuffers::Offset<StringValueColumn> fbValue = CreateStringValueColumn(fbb, fbb.CreateVector(offsets));
        flatbuffers::Offset<void> field_value_column = fbValue.Union();
        return CreateFieldValueColumnTable(fbb, FieldValueColumn_StringValueColumn, field_value_column);
    } else if (bt_string == builtinType) {
        if (false == isMulti) {
            auto isStdType = base->getValueType().isStdType();
            std::vector<flatbuffers::Offset<flatbuffers::String>> offsets(recordSize);
            for (size_t i = 0; i < recordSize; i++) {
                if (isStdType) {
                    auto ref = static_cast<const Reference<std::string> *>(base);
                    std::string value = ref->get(docs[i]);
                    offsets[i] = fbb.CreateString(value.data(), value.size());
                } else {
                    auto ref = static_cast<const Reference<MultiChar> *>(base);
                    MultiChar value = ref->get(docs[i]);
                    offsets[i] = fbb.CreateString(value.data(), value.size());
                }
            }
            flatbuffers::Offset<StringValueColumn> fbValue = CreateStringValueColumn(fbb, fbb.CreateVector(offsets));
            flatbuffers::Offset<void> field_value_column = fbValue.Union();
            return CreateFieldValueColumnTable(fbb, FieldValueColumn_StringValueColumn, field_value_column);
        } else {
            auto ref = static_cast<const Reference<autil::MultiString> *>(base);
            if (nullptr == ref) {
                AUTIL_LOG(WARN, "MultiString ref is null");
                return defaultRet;
            }
            vector<flatbuffers::Offset<MultiStringValue>> offsetVec(recordSize);
            for (size_t i = 0; i < recordSize; ++i) {
                autil::MultiString valueList = ref->get(docs[i]);
                uint32_t value_size = valueList.size();
                std::vector<flatbuffers::Offset<flatbuffers::String>> offsets(value_size);
                for (size_t j = 0; j < valueList.size(); ++j) {
                    offsets[j] = fbb.CreateString(valueList[j].data(), valueList[j].size());
                }
                flatbuffers::Offset<MultiStringValue> offset = CreateMultiStringValue(fbb, fbb.CreateVector(offsets));
                offsetVec[i] = offset;
            }
            flatbuffers::Offset<MultiStringValueColumn> fbValue =
                CreateMultiStringValueColumn(fbb, fbb.CreateVector(offsetVec));
            flatbuffers::Offset<void> fieldValueColumn = fbValue.Union();
            return CreateFieldValueColumnTable(fbb, FieldValueColumn_MultiStringValueColumn, fieldValueColumn);
        }
    } else {
#define DECLARE_FIELD_HELPER(VT,                                                                                       \
                             fb_field_column_type,                                                                     \
                             create_function,                                                                          \
                             fb_field_column_enum_type,                                                                \
                             one_field_type,                                                                           \
                             multi_create_one_field_function,                                                          \
                             multi_fb_field_column_type,                                                               \
                             multi_create_function,                                                                    \
                             multi_fb_field_column_enum_type)                                                          \
    case VT: {                                                                                                         \
        if (isMulti) {                                                                                                 \
            typedef matchdoc::MatchDocBuiltinType2CppType<VT, true>::CppType FieldType;                                \
            typedef matchdoc::MatchDocBuiltinType2CppType<VT, false>::CppType SingleFieldType;                         \
            auto ref = static_cast<const Reference<FieldType> *>(base);                                                \
            vector<flatbuffers::Offset<one_field_type>> offsetVec;                                                     \
            for (uint32_t i = 0; i < recordSize; ++i) {                                                                \
                FieldType value = ref->get(docs[i]);                                                                   \
                flatbuffers::Offset<one_field_type> offset = multi_create_one_field_function(                          \
                    fbb, fbb.CreateVector(static_cast<const SingleFieldType *>(value.data()), value.size()));          \
                offsetVec.push_back(offset);                                                                           \
            }                                                                                                          \
            flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<one_field_type>>> offset =                     \
                fbb.CreateVector(offsetVec);                                                                           \
            flatbuffers::Offset<multi_fb_field_column_type> valueColumnOffset = multi_create_function(fbb, offset);    \
            return CreateFieldValueColumnTable(fbb, multi_fb_field_column_enum_type, valueColumnOffset.Union());       \
        } else {                                                                                                       \
            typedef matchdoc::MatchDocBuiltinType2CppType<VT, false>::CppType FieldType;                               \
            auto ref = static_cast<const Reference<FieldType> *>(base);                                                \
            vector<FieldType> vec;                                                                                     \
            for (uint32_t i = 0; i < recordSize; ++i) {                                                                \
                FieldType value = ref->get(docs[i]);                                                                   \
                vec.push_back(value);                                                                                  \
            }                                                                                                          \
            flatbuffers::Offset<fb_field_column_type> fbValue = create_function(fbb, fbb.CreateVector(vec));           \
            return CreateFieldValueColumnTable(fbb, fb_field_column_enum_type, fbValue.Union());                       \
        }                                                                                                              \
        break;                                                                                                         \
    }
        switch (builtinType) {
            DECLARE_FIELD_HELPER(matchdoc::bt_int8,
                                 Int8ValueColumn,
                                 CreateInt8ValueColumn,
                                 FieldValueColumn_Int8ValueColumn,
                                 MultiInt8Value,
                                 CreateMultiInt8Value,
                                 MultiInt8ValueColumn,
                                 CreateMultiInt8ValueColumn,
                                 FieldValueColumn_MultiInt8ValueColumn)
            DECLARE_FIELD_HELPER(matchdoc::bt_int16,
                                 Int16ValueColumn,
                                 CreateInt16ValueColumn,
                                 FieldValueColumn_Int16ValueColumn,
                                 MultiInt16Value,
                                 CreateMultiInt16Value,
                                 MultiInt16ValueColumn,
                                 CreateMultiInt16ValueColumn,
                                 FieldValueColumn_MultiInt16ValueColumn)
            DECLARE_FIELD_HELPER(matchdoc::bt_int32,
                                 Int32ValueColumn,
                                 CreateInt32ValueColumn,
                                 FieldValueColumn_Int32ValueColumn,
                                 MultiInt32Value,
                                 CreateMultiInt32Value,
                                 MultiInt32ValueColumn,
                                 CreateMultiInt32ValueColumn,
                                 FieldValueColumn_MultiInt32ValueColumn)
            DECLARE_FIELD_HELPER(matchdoc::bt_int64,
                                 Int64ValueColumn,
                                 CreateInt64ValueColumn,
                                 FieldValueColumn_Int64ValueColumn,
                                 MultiInt64Value,
                                 CreateMultiInt64Value,
                                 MultiInt64ValueColumn,
                                 CreateMultiInt64ValueColumn,
                                 FieldValueColumn_MultiInt64ValueColumn)
            DECLARE_FIELD_HELPER(matchdoc::bt_uint8,
                                 UInt8ValueColumn,
                                 CreateUInt8ValueColumn,
                                 FieldValueColumn_UInt8ValueColumn,
                                 MultiUInt8Value,
                                 CreateMultiUInt8Value,
                                 MultiUInt8ValueColumn,
                                 CreateMultiUInt8ValueColumn,
                                 FieldValueColumn_MultiUInt8ValueColumn)
            DECLARE_FIELD_HELPER(matchdoc::bt_uint16,
                                 UInt16ValueColumn,
                                 CreateUInt16ValueColumn,
                                 FieldValueColumn_UInt16ValueColumn,
                                 MultiUInt16Value,
                                 CreateMultiUInt16Value,
                                 MultiUInt16ValueColumn,
                                 CreateMultiUInt16ValueColumn,
                                 FieldValueColumn_MultiUInt16ValueColumn)
            DECLARE_FIELD_HELPER(matchdoc::bt_uint32,
                                 UInt32ValueColumn,
                                 CreateUInt32ValueColumn,
                                 FieldValueColumn_UInt32ValueColumn,
                                 MultiUInt32Value,
                                 CreateMultiUInt32Value,
                                 MultiUInt32ValueColumn,
                                 CreateMultiUInt32ValueColumn,
                                 FieldValueColumn_MultiUInt32ValueColumn)
            DECLARE_FIELD_HELPER(matchdoc::bt_uint64,
                                 UInt64ValueColumn,
                                 CreateUInt64ValueColumn,
                                 FieldValueColumn_UInt64ValueColumn,
                                 MultiUInt64Value,
                                 CreateMultiUInt64Value,
                                 MultiUInt64ValueColumn,
                                 CreateMultiUInt64ValueColumn,
                                 FieldValueColumn_MultiUInt64ValueColumn)
            DECLARE_FIELD_HELPER(matchdoc::bt_float,
                                 FloatValueColumn,
                                 CreateFloatValueColumn,
                                 FieldValueColumn_FloatValueColumn,
                                 MultiFloatValue,
                                 CreateMultiFloatValue,
                                 MultiFloatValueColumn,
                                 CreateMultiFloatValueColumn,
                                 FieldValueColumn_MultiFloatValueColumn)
            DECLARE_FIELD_HELPER(matchdoc::bt_double,
                                 DoubleValueColumn,
                                 CreateDoubleValueColumn,
                                 FieldValueColumn_DoubleValueColumn,
                                 MultiDoubleValue,
                                 CreateMultiDoubleValue,
                                 MultiDoubleValueColumn,
                                 CreateMultiDoubleValueColumn,
                                 FieldValueColumn_MultiDoubleValueColumn)
        default:
            break;
        }
#undef DECLARE_FIELD_HELPER
    }

    return defaultRet;
}