20 #include "graphar/high-level/vertices_builder.h"
21 #include "graphar/convert_to_arrow_type.h"
22 #include "graphar/graph_info.h"
24 namespace graphar::builder {
26 Status VerticesBuilder::validate(
const Vertex& v, IdType index,
27 ValidateLevel validate_level)
const {
29 if (validate_level == ValidateLevel::default_validate)
30 validate_level = validate_level_;
32 if (validate_level == ValidateLevel::no_validate)
39 "The vertices builder has been saved, can not add "
40 "new vertices any more");
43 if (start_vertex_index_ % vertex_info_->GetChunkSize() != 0) {
45 " is not aligned with the chunk size ",
46 vertex_info_->GetChunkSize());
49 if (index != -1 && index < start_vertex_index_) {
51 " is smaller than the start index ",
56 if (validate_level == ValidateLevel::strong_validate) {
57 for (
auto& property : v.GetProperties()) {
59 if (!vertex_info_->HasProperty(property.first)) {
61 " is not contained in the ",
62 vertex_info_->GetLabel(),
" vertex info.");
65 auto type = vertex_info_->GetPropertyType(property.first).value();
66 bool invalid_type =
false;
69 if (property.second.type() !=
70 typeid(
typename TypeToArrowType<Type::BOOL>::CType)) {
75 if (property.second.type() !=
76 typeid(
typename TypeToArrowType<Type::INT32>::CType)) {
81 if (property.second.type() !=
82 typeid(
typename TypeToArrowType<Type::INT64>::CType)) {
87 if (property.second.type() !=
88 typeid(
typename TypeToArrowType<Type::FLOAT>::CType)) {
93 if (property.second.type() !=
94 typeid(
typename TypeToArrowType<Type::DOUBLE>::CType)) {
99 if (property.second.type() !=
100 typeid(
typename TypeToArrowType<Type::STRING>::CType)) {
106 if (property.second.type() !=
107 typeid(
typename TypeToArrowType<Type::DATE>::CType::c_type)) {
111 case Type::TIMESTAMP:
113 if (property.second.type() !=
114 typeid(
typename TypeToArrowType<Type::TIMESTAMP>::CType::c_type)) {
123 "Invalid data type for property ", property.first +
", defined as ",
124 type->ToTypeName(),
", but got ", property.second.type().name());
132 Status VerticesBuilder::tryToAppend(
133 const std::string& property_name,
134 std::shared_ptr<arrow::Array>& array) {
135 using CType =
typename TypeToArrowType<type>::CType;
136 arrow::MemoryPool* pool = arrow::default_memory_pool();
137 typename TypeToArrowType<type>::BuilderType builder(pool);
138 for (
auto& v : vertices_) {
139 if (v.Empty() || !v.ContainProperty(property_name)) {
140 RETURN_NOT_ARROW_OK(builder.AppendNull());
143 builder.Append(std::any_cast<CType>(v.GetProperty(property_name))));
146 array = builder.Finish().ValueOrDie();
151 Status VerticesBuilder::tryToAppend<Type::TIMESTAMP>(
152 const std::string& property_name,
153 std::shared_ptr<arrow::Array>& array) {
154 using CType =
typename TypeToArrowType<Type::TIMESTAMP>::CType::c_type;
155 arrow::MemoryPool* pool = arrow::default_memory_pool();
156 typename TypeToArrowType<Type::TIMESTAMP>::BuilderType builder(
157 arrow::timestamp(arrow::TimeUnit::MILLI), pool);
158 for (
auto& v : vertices_) {
159 if (v.Empty() || !v.ContainProperty(property_name)) {
160 RETURN_NOT_ARROW_OK(builder.AppendNull());
163 builder.Append(std::any_cast<CType>(v.GetProperty(property_name))));
166 array = builder.Finish().ValueOrDie();
171 Status VerticesBuilder::tryToAppend<Type::DATE>(
172 const std::string& property_name,
173 std::shared_ptr<arrow::Array>& array) {
174 using CType =
typename TypeToArrowType<Type::DATE>::CType::c_type;
175 arrow::MemoryPool* pool = arrow::default_memory_pool();
176 typename TypeToArrowType<Type::DATE>::BuilderType builder(pool);
177 for (
auto& v : vertices_) {
178 if (v.Empty() || !v.ContainProperty(property_name)) {
179 RETURN_NOT_ARROW_OK(builder.AppendNull());
182 builder.Append(std::any_cast<CType>(v.GetProperty(property_name))));
185 array = builder.Finish().ValueOrDie();
189 Status VerticesBuilder::appendToArray(
190 const std::shared_ptr<DataType>& type,
const std::string& property_name,
191 std::shared_ptr<arrow::Array>& array) {
192 switch (type->id()) {
194 return tryToAppend<Type::BOOL>(property_name, array);
196 return tryToAppend<Type::INT32>(property_name, array);
198 return tryToAppend<Type::INT64>(property_name, array);
200 return tryToAppend<Type::FLOAT>(property_name, array);
202 return tryToAppend<Type::DOUBLE>(property_name, array);
204 return tryToAppend<Type::STRING>(property_name, array);
206 return tryToAppend<Type::DATE>(property_name, array);
207 case Type::TIMESTAMP:
208 return tryToAppend<Type::TIMESTAMP>(property_name, array);
215 Result<std::shared_ptr<arrow::Table>> VerticesBuilder::convertToTable() {
216 const auto& property_groups = vertex_info_->GetPropertyGroups();
217 std::vector<std::shared_ptr<arrow::Array>> arrays;
218 std::vector<std::shared_ptr<arrow::Field>> schema_vector;
219 for (
auto& property_group : property_groups) {
220 for (
auto& property : property_group->GetProperties()) {
222 schema_vector.push_back(arrow::field(
223 property.name, DataType::DataTypeToArrowDataType(property.type)));
225 std::shared_ptr<arrow::Array> array;
226 appendToArray(property.type, property.name, array);
227 arrays.push_back(array);
230 auto schema = std::make_shared<arrow::Schema>(schema_vector);
231 return arrow::Table::Make(schema, arrays);
static Status IndexError(Args &&... args)
static Status TypeError(Args &&... args)
static Status KeyError(Args &&... args)
static Status Invalid(Args &&... args)