in cpp/src/graphar/high-level/vertices_builder.cc [26:129]
Status VerticesBuilder::validate(const Vertex& v, IdType index,
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 vertices after dumping
if (is_saved_) {
return Status::Invalid(
"The vertices builder has been saved, can not add "
"new vertices any more");
}
// the start vertex index must be aligned with the chunk size
if (start_vertex_index_ % vertex_info_->GetChunkSize() != 0) {
return Status::IndexError("The start vertex index ", start_vertex_index_,
" is not aligned with the chunk size ",
vertex_info_->GetChunkSize());
}
// the vertex index must larger than start index
if (index != -1 && index < start_vertex_index_) {
return Status::IndexError("The vertex index ", index,
" is smaller than the start index ",
start_vertex_index_);
}
// strong validate
if (validate_level == ValidateLevel::strong_validate) {
for (auto& property : v.GetProperties()) {
// check if the property is contained
if (!vertex_info_->HasProperty(property.first)) {
return Status::KeyError("Property with name ", property.first,
" is not contained in the ",
vertex_info_->GetType(), " vertex info.");
}
// check if the property type is correct
auto type = vertex_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();
}