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;
}