in cpp/src/graphar/high-level/edges_builder.cc [85:182]
Status EdgesBuilder::validate(const Edge& e,
ValidateLevel validate_level) const {
// use the builder's validate level
if (validate_level == ValidateLevel::default_validate)
validate_level = validate_level_;
// no validate
if (validate_level == ValidateLevel::no_validate)
return Status::OK();
// weak validate
// can not add new edges after dumping
if (is_saved_) {
return Status::Invalid(
"The edge builder has been saved, can not add "
"new edges any more");
}
// adj list type not exits in edge info
if (!edge_info_->HasAdjacentListType(adj_list_type_)) {
return Status::KeyError(
"Adj list type ", AdjListTypeToString(adj_list_type_),
" does not exist in the ", edge_info_->GetEdgeType(), " edge info.");
}
// strong validate
if (validate_level == ValidateLevel::strong_validate) {
for (auto& property : e.GetProperties()) {
// check if the property is contained
if (!edge_info_->HasProperty(property.first)) {
return Status::KeyError("Property with name ", property.first,
" is not contained in the ",
edge_info_->GetEdgeType(), " edge info.");
}
// check if the property type is correct
auto type = edge_info_->GetPropertyType(property.first).value();
bool invalid_type = false;
switch (type->id()) {
case Type::BOOL:
if (property.second.type() !=
typeid(typename TypeToArrowType<Type::BOOL>::CType)) {
invalid_type = true;
}
break;
case Type::INT32:
if (property.second.type() !=
typeid(typename TypeToArrowType<Type::INT32>::CType)) {
invalid_type = true;
}
break;
case Type::INT64:
if (property.second.type() !=
typeid(typename TypeToArrowType<Type::INT64>::CType)) {
invalid_type = true;
}
break;
case Type::FLOAT:
if (property.second.type() !=
typeid(typename TypeToArrowType<Type::FLOAT>::CType)) {
invalid_type = true;
}
break;
case Type::DOUBLE:
if (property.second.type() !=
typeid(typename TypeToArrowType<Type::DOUBLE>::CType)) {
invalid_type = true;
}
break;
case Type::STRING:
if (property.second.type() !=
typeid(typename TypeToArrowType<Type::STRING>::CType)) {
invalid_type = true;
}
break;
case Type::DATE:
// date is stored as int32_t
if (property.second.type() !=
typeid(typename TypeToArrowType<Type::DATE>::CType::c_type)) {
invalid_type = true;
}
break;
case Type::TIMESTAMP:
// timestamp is stored as int64_t
if (property.second.type() !=
typeid(typename TypeToArrowType<Type::TIMESTAMP>::CType::c_type)) {
invalid_type = true;
}
break;
default:
return Status::TypeError("Unsupported property type.");
}
if (invalid_type) {
return Status::TypeError(
"Invalid data type for property ", property.first + ", defined as ",
type->ToTypeName(), ", but got ", property.second.type().name());
}
}
}
return Status::OK();
}