From 23d09fe002acbcc36387f886e5cccd72858ce62b Mon Sep 17 00:00:00 2001 From: Liu Jiajun <85552719+jasinliu@users.noreply.github.com> Date: Sun, 30 Jun 2024 16:19:34 +0800 Subject: [PATCH] Add GraphAr parser in importor (#568) * Add vertex GraphAr column parser * Add edge GraphAr parser * Update dockerfile * Parse GraphAr graph.yml * fix cpplint & add comments for gar config * change dockerfile * change git submodule * change submodule java * update gar ut & pytest * fix pytest * fix gar config make error * improve gar ut * fix cpplint error * improve the ut * solve the comments * improve the code * check edge label * remove some test data * fix: build bug, empty file and mem error * update GraphAr * Update person_knows_person.edge.yml * fix an string error * fix import error * fix import error * fix throw code error --------- Co-authored-by: Shipeng Qi Co-authored-by: Shipeng Qi --- CMakeLists.txt | 2 +- src/BuildLGraphServer.cmake | 3 + src/import/block_parser.h | 30 ++ src/import/column_parser.h | 236 +------------ src/import/graphar_config.h | 189 +++++++++++ src/import/graphar_parser.cpp | 179 ++++++++++ src/import/graphar_parser.h | 58 ++++ src/import/import_config_parser.h | 6 +- src/import/import_v2.h | 1 + src/import/import_v3.cpp | 319 +++++++++--------- src/import/import_v3.h | 3 + src/import/jsonlines_parser.h | 258 ++++++++++++++ test/CMakeLists.txt | 4 +- test/integration/test_import_gar.py | 50 +++ .../data/gar_test/edge_test/actor.vertex.yml | 10 + .../edge_test/actor_comment_movie.edge.yml | 19 ++ .../data/gar_test/edge_test/movie.graph.yml | 9 + .../data/gar_test/edge_test/movie.vertex.yml | 10 + .../data/gar_test/edge_test/viewer.vertex.yml | 10 + .../edge_test/viewer_comment_movie.edge.yml | 19 ++ .../ordered_by_source/adj_list/part0/chunk0 | Bin 0 -> 2491 bytes .../ordered_by_source/adj_list/part1/chunk0 | Bin 0 -> 2455 bytes .../ordered_by_source/adj_list/part2/chunk0 | Bin 0 -> 3029 bytes .../ordered_by_source/adj_list/part2/chunk1 | Bin 0 -> 969 bytes .../ordered_by_source/adj_list/part3/chunk0 | Bin 0 -> 2583 bytes .../ordered_by_source/adj_list/part4/chunk0 | Bin 0 -> 2482 bytes .../ordered_by_source/adj_list/part5/chunk0 | Bin 0 -> 2639 bytes .../ordered_by_source/adj_list/part6/chunk0 | Bin 0 -> 2350 bytes .../ordered_by_source/adj_list/part7/chunk0 | Bin 0 -> 2525 bytes .../ordered_by_source/adj_list/part8/chunk0 | Bin 0 -> 2466 bytes .../ordered_by_source/adj_list/part9/chunk0 | Bin 0 -> 809 bytes .../creationDate/part0/chunk0 | Bin 0 -> 7662 bytes .../creationDate/part1/chunk0 | Bin 0 -> 7444 bytes .../creationDate/part2/chunk0 | Bin 0 -> 11418 bytes .../creationDate/part2/chunk1 | Bin 0 -> 1088 bytes .../creationDate/part3/chunk0 | Bin 0 -> 8590 bytes .../creationDate/part4/chunk0 | Bin 0 -> 7333 bytes .../creationDate/part5/chunk0 | Bin 0 -> 8983 bytes .../creationDate/part6/chunk0 | Bin 0 -> 7081 bytes .../creationDate/part7/chunk0 | Bin 0 -> 8448 bytes .../creationDate/part8/chunk0 | Bin 0 -> 8016 bytes .../creationDate/part9/chunk0 | Bin 0 -> 553 bytes .../ordered_by_source/edge_count0 | Bin 0 -> 8 bytes .../ordered_by_source/edge_count1 | Bin 0 -> 8 bytes .../ordered_by_source/edge_count2 | Bin 0 -> 8 bytes .../ordered_by_source/edge_count3 | Bin 0 -> 8 bytes .../ordered_by_source/edge_count4 | Bin 0 -> 8 bytes .../ordered_by_source/edge_count5 | Bin 0 -> 8 bytes .../ordered_by_source/edge_count6 | Bin 0 -> 8 bytes .../ordered_by_source/edge_count7 | Bin 0 -> 8 bytes .../ordered_by_source/edge_count8 | Bin 0 -> 8 bytes .../ordered_by_source/edge_count9 | Bin 0 -> 8 bytes .../ordered_by_source/offset/chunk0 | Bin 0 -> 674 bytes .../ordered_by_source/offset/chunk1 | Bin 0 -> 679 bytes .../ordered_by_source/offset/chunk2 | Bin 0 -> 667 bytes .../ordered_by_source/offset/chunk3 | Bin 0 -> 678 bytes .../ordered_by_source/offset/chunk4 | Bin 0 -> 682 bytes .../ordered_by_source/offset/chunk5 | Bin 0 -> 680 bytes .../ordered_by_source/offset/chunk6 | Bin 0 -> 673 bytes .../ordered_by_source/offset/chunk7 | Bin 0 -> 678 bytes .../ordered_by_source/offset/chunk8 | Bin 0 -> 677 bytes .../ordered_by_source/offset/chunk9 | Bin 0 -> 439 bytes .../ordered_by_source/vertex_count | Bin 0 -> 8 bytes .../ldbc_parquet/ldbc_sample.graph.yml | 6 + .../gar_test/ldbc_parquet/person.vertex.yml | 21 ++ .../ldbc_parquet/person_knows_person.edge.yml | 19 ++ .../person/firstName_lastName_gender/chunk0 | Bin 0 -> 2113 bytes .../person/firstName_lastName_gender/chunk1 | Bin 0 -> 2093 bytes .../person/firstName_lastName_gender/chunk2 | Bin 0 -> 2078 bytes .../person/firstName_lastName_gender/chunk3 | Bin 0 -> 2090 bytes .../person/firstName_lastName_gender/chunk4 | Bin 0 -> 2050 bytes .../person/firstName_lastName_gender/chunk5 | Bin 0 -> 2129 bytes .../person/firstName_lastName_gender/chunk6 | Bin 0 -> 2091 bytes .../person/firstName_lastName_gender/chunk7 | Bin 0 -> 2034 bytes .../person/firstName_lastName_gender/chunk8 | Bin 0 -> 2064 bytes .../person/firstName_lastName_gender/chunk9 | Bin 0 -> 948 bytes .../ldbc_parquet/vertex/person/id/chunk0 | Bin 0 -> 822 bytes .../ldbc_parquet/vertex/person/id/chunk1 | Bin 0 -> 838 bytes .../ldbc_parquet/vertex/person/id/chunk2 | Bin 0 -> 836 bytes .../ldbc_parquet/vertex/person/id/chunk3 | Bin 0 -> 840 bytes .../ldbc_parquet/vertex/person/id/chunk4 | Bin 0 -> 842 bytes .../ldbc_parquet/vertex/person/id/chunk5 | Bin 0 -> 826 bytes .../ldbc_parquet/vertex/person/id/chunk6 | Bin 0 -> 819 bytes .../ldbc_parquet/vertex/person/id/chunk7 | Bin 0 -> 837 bytes .../ldbc_parquet/vertex/person/id/chunk8 | Bin 0 -> 833 bytes .../ldbc_parquet/vertex/person/id/chunk9 | Bin 0 -> 407 bytes .../ldbc_parquet/vertex/person/vertex_count | Bin 0 -> 8 bytes test/test_import_gar.cpp | 68 ++++ toolkits/CMakeLists.txt | 8 +- toolkits/lgraph_import.cpp | 8 +- 90 files changed, 1138 insertions(+), 407 deletions(-) create mode 100644 src/import/block_parser.h create mode 100644 src/import/graphar_config.h create mode 100644 src/import/graphar_parser.cpp create mode 100644 src/import/graphar_parser.h create mode 100644 src/import/jsonlines_parser.h create mode 100644 test/integration/test_import_gar.py create mode 100644 test/resource/data/gar_test/edge_test/actor.vertex.yml create mode 100644 test/resource/data/gar_test/edge_test/actor_comment_movie.edge.yml create mode 100644 test/resource/data/gar_test/edge_test/movie.graph.yml create mode 100644 test/resource/data/gar_test/edge_test/movie.vertex.yml create mode 100644 test/resource/data/gar_test/edge_test/viewer.vertex.yml create mode 100644 test/resource/data/gar_test/edge_test/viewer_comment_movie.edge.yml create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part0/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part1/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part2/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part2/chunk1 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part3/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part4/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part5/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part6/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part7/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part8/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part9/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part0/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part1/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part2/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part2/chunk1 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part3/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part4/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part5/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part6/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part7/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part8/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part9/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count1 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count2 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count3 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count4 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count5 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count6 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count7 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count8 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count9 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk1 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk2 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk3 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk4 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk5 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk6 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk7 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk8 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk9 create mode 100644 test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/vertex_count create mode 100644 test/resource/data/gar_test/ldbc_parquet/ldbc_sample.graph.yml create mode 100644 test/resource/data/gar_test/ldbc_parquet/person.vertex.yml create mode 100644 test/resource/data/gar_test/ldbc_parquet/person_knows_person.edge.yml create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk1 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk2 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk3 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk4 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk5 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk6 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk7 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk8 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk9 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk0 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk1 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk2 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk3 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk4 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk5 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk6 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk7 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk8 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk9 create mode 100644 test/resource/data/gar_test/ldbc_parquet/vertex/person/vertex_count create mode 100644 test/test_import_gar.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 10c7b6f22b..94ecfe9c50 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.13) +cmake_minimum_required(VERSION 3.16) project(TuGraph C CXX) message("Community version.") diff --git a/src/BuildLGraphServer.cmake b/src/BuildLGraphServer.cmake index c3fcd3394f..17d022f976 100644 --- a/src/BuildLGraphServer.cmake +++ b/src/BuildLGraphServer.cmake @@ -51,6 +51,7 @@ add_library(${TARGET_SERVER_LIB} STATIC import/import_online.cpp import/import_v2.cpp import/import_v3.cpp + import/graphar_parser.cpp restful/server/rest_server.cpp restful/server/stdafx.cpp http/http_server.cpp @@ -72,6 +73,7 @@ if (NOT (CMAKE_SYSTEM_NAME STREQUAL "Darwin")) lgraph_cypher_lib geax_isogql bolt + gar # begin static linking -Wl,-Bstatic cpprest @@ -111,6 +113,7 @@ else () cpprest boost_thread boost_chrono + gar profiler snappy pthread diff --git a/src/import/block_parser.h b/src/import/block_parser.h new file mode 100644 index 0000000000..c1f2b26db5 --- /dev/null +++ b/src/import/block_parser.h @@ -0,0 +1,30 @@ +/** + * Copyright 2022 AntGroup CO., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + */ + +#pragma once + +#include "core/data_type.h" + +namespace lgraph { +namespace import_v2 { + +// The base class for ColumnParser, JsonLinesParser and GraphArParser +class BlockParser { + public: + virtual bool ReadBlock(std::vector>& buf) = 0; + virtual ~BlockParser() {} +}; + +} // namespace import_v2 +} // namespace lgraph diff --git a/src/import/column_parser.h b/src/import/column_parser.h index d5b784de44..4ca240f132 100644 --- a/src/import/column_parser.h +++ b/src/import/column_parser.h @@ -18,22 +18,14 @@ #include "core/data_type.h" #include "core/field_data_helper.h" +#include "import/block_parser.h" #include "import/import_config_parser.h" #include "restful/server/json_convert.h" #include "tools/json.hpp" -#include -#include - namespace lgraph { namespace import_v2 { -class BlockParser { - public: - virtual bool ReadBlock(std::vector>& buf) = 0; - virtual ~BlockParser(){} -}; - /** Parse each line of a csv into a vector of FieldData, excluding SKIP columns. * vector specifies what each column contains. */ @@ -414,231 +406,5 @@ class ColumnParser : public BlockParser { } }; -class JsonLinesParser : public BlockParser { - public: - typedef std::function(const char*, const char*, - std::vector&)> - ParseFunc; - JsonLinesParser(std::unique_ptr stream, - const std::vector& field_specs, size_t block_size, size_t n_threads, - size_t n_header_lines, bool forgiving, int64_t max_err_msgs = 100) - : stream_(std::move(stream)), - field_specs_(field_specs), - forgiving_(forgiving), - max_errors_(max_err_msgs) { - init(block_size, n_threads, n_header_lines); - } - JsonLinesParser(const std::string& path, const std::vector& field_specs, - size_t block_size, size_t n_threads, size_t n_header_lines, bool forgiving, - int64_t max_err_msgs = 100) - : stream_(new fma_common::InputFmaStream(path)), - field_specs_(field_specs), - forgiving_(forgiving), - max_errors_(max_err_msgs) { - if (!stream_->Good()) { - LOG_INFO() << "Failed to open input file " << path; - throw std::runtime_error("failed to open input file [" + path + "]"); - } - init(block_size, n_threads, n_header_lines); - } - - ~JsonLinesParser() { parser_->Stop(); } - - bool ReadBlock(std::vector>& buf) { return parser_->ReadBlock(buf); } - - private: - void init(size_t block_size, size_t n_threads, size_t n_header_lines) { - parser_.reset(new fma_common::TextParser, ParseFunc>( - *stream_, - [this](const char* start, const char* end, std::vector& fds) { - return parse_jsonline(start, end, fds); - }, - block_size, n_threads, n_header_lines)); - } - - std::tuple parse_jsonline(const char* start, const char* end, - std::vector& fds) { - using namespace web; - using namespace boost; - size_t trim_count = 0; - const char* original_starting = start; - while (start < end && fma_common::TextParserUtils::IsTrimable(*start)) { - start++; - trim_count++; - } - if (start == end) { - return std::tuple(trim_count, false); - } - -#define SKIP_OR_THROW(except) \ - if (forgiving_) { \ - if (errors_++ < max_errors_) LOG_INFO() << except.what(); \ - while (start < end && !fma_common::TextParserUtils::IsNewLine(*start)) start++; \ - while (start < end && fma_common::TextParserUtils::IsNewLine(*start)) start++; \ - return std::tuple(start - original_starting, false); \ - } else { \ - std::throw_with_nested(except); \ - } - - // use stream parse to avoid memory copy - iostreams::stream istr(start, end - start); - std::error_code err_code; - json::value json_obj = json::value::parse(istr, err_code); - switch (err_code.value()) { - case 0: - break; - case 1: - { - istr.unget(); // hack - break; - } - default: - { - SKIP_OR_THROW(ParseJsonException(start, end, err_code.message())); - } - } - using namespace lgraph::field_data_helper; - try { - for (size_t column = 0; column < field_specs_.size(); column++) { - FieldSpec& field_spec = field_specs_[column]; - if (field_spec.name.empty()) { - continue; - } - if (json_obj.at(column).is_null() && field_spec.optional) { - fds.emplace_back(); - continue; - } - FieldData fd; - switch (field_spec.type) { - case FieldType::NUL: - FMA_ASSERT(false); - case FieldType::BOOL: - { - const auto& val = json_obj.at(column); - if (val.is_string()) { - const auto& str = ToStdString(val.as_string()); - ParseStringIntoFieldData(str.data(), - str.data() + str.size(), fd); - } else { - fd = FieldData::Bool(val.as_bool()); - } - break; - } - case FieldType::INT8: - { - const auto& val = json_obj.at(column); - if (val.is_string()) { - const auto& str = ToStdString(val.as_string()); - ParseStringIntoFieldData(str.data(), - str.data() + str.size(), fd); - } else { - fd = FieldData::Int8(val.as_number().to_int32()); - } - break; - } - case FieldType::INT16: - { - const auto& val = json_obj.at(column); - if (val.is_string()) { - const auto& str = ToStdString(val.as_string()); - ParseStringIntoFieldData(str.data(), - str.data() + str.size(), fd); - } else { - fd = FieldData::Int16(val.as_number().to_int32()); - } - break; - } - case FieldType::INT32: - { - const auto& val = json_obj.at(column); - if (val.is_string()) { - const auto& str = ToStdString(val.as_string()); - ParseStringIntoFieldData(str.data(), - str.data() + str.size(), fd); - } else { - fd = FieldData::Int32(val.as_number().to_int32()); - } - break; - } - case FieldType::INT64: - { - const auto& val = json_obj.at(column); - if (val.is_string()) { - const auto& str = ToStdString(val.as_string()); - ParseStringIntoFieldData(str.data(), - str.data() + str.size(), fd); - } else { - fd = FieldData::Int64(val.as_number().to_int64()); - } - break; - } - case FieldType::FLOAT: - { - const auto& val = json_obj.at(column); - if (val.is_string()) { - const auto& str = ToStdString(val.as_string()); - ParseStringIntoFieldData(str.data(), - str.data() + str.size(), fd); - } else { - fd = FieldData::Float(static_cast(val.as_double())); - } - break; - } - case FieldType::DOUBLE: - { - const auto& val = json_obj.at(column); - if (val.is_string()) { - const auto& str = ToStdString(val.as_string()); - ParseStringIntoFieldData( - str.data(), str.data() + str.size(), fd); - } else { - fd = FieldData::Double(val.as_double()); - } - break; - } - case FieldType::DATE: - fd = FieldData::Date(ToStdString(json_obj.at(column).as_string())); - break; - case FieldType::DATETIME: - fd = FieldData::DateTime(ToStdString(json_obj.at(column).as_string())); - break; - case FieldType::STRING: - fd = FieldData::String(ToStdString(json_obj.at(column).as_string())); - break; - case FieldType::BLOB: - fd = FieldData::Blob(ToStdString(json_obj.at(column).as_string())); - break; - case FieldType::POINT: - // TODO(shw): Support import for point type; - case FieldType::LINESTRING: - // TODO(shw): support import for linestring type; - case FieldType::POLYGON: - // TODO(shw): support import for polygon type; - case FieldType::SPATIAL: - // TODO(shw): support import for spatial type; - throw std::runtime_error("do not support spatial type now!"); - } - if (fd.is_null()) { - throw std::bad_cast(); - } - fds.emplace_back(std::move(fd)); - } - } catch (std::exception& e) { - SKIP_OR_THROW(JsonReadException(start, end, e.what())); - } catch (...) { - SKIP_OR_THROW(JsonReadException(start, end, "Unknown exception")); - } - return std::tuple(static_cast(istr.tellg()) + trim_count, true); - } - - std::unique_ptr stream_; - std::vector field_specs_; - std::unique_ptr, ParseFunc>> parser_; - bool forgiving_ = false; - int64_t errors_ = 0; - int64_t max_errors_ = 100; -#undef SKIP_OR_THROW -}; - } // namespace import_v2 } // namespace lgraph diff --git a/src/import/graphar_config.h b/src/import/graphar_config.h new file mode 100644 index 0000000000..84a4d2267f --- /dev/null +++ b/src/import/graphar_config.h @@ -0,0 +1,189 @@ +/** + * Copyright 2022 AntGroup CO., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + */ + +#pragma once + +#include +#include +#include + +#include "tools/json.hpp" + +namespace lgraph { +namespace import_v3 { + +// Configuration of imported vertex or edge data properties field +typedef std::vector> Properties; + +/** + * @brief Parse the gar DataType to FieldType in config. + * + * @param[in] data_type The GraphAr DataType of the vetex or edge property. + * @param[out] type_name The FieldType string which used to make json object. + */ +inline void ParseType(const std::shared_ptr& data_type, + std::string& type_name) { + switch (data_type->id()) { + case GraphArchive::Type::BOOL: + type_name = "BOOL"; + break; + case GraphArchive::Type::INT32: + type_name = "INT32"; + break; + case GraphArchive::Type::INT64: + type_name = "INT64"; + break; + case GraphArchive::Type::FLOAT: + type_name = "FLOAT"; + break; + case GraphArchive::Type::DOUBLE: + type_name = "DOUBLE"; + break; + case GraphArchive::Type::STRING: + type_name = "STRING"; + break; + default: + THROW_CODE(InputError, "Unsupported data type error!"); + break; + } +} + +/** + * Traverse all properties of the vertex, get the primary key, the properties and the property + * names. Keep the original order in yml config. + * + * @param[in] ver_info The gar vertex information. + * @param[out] primary The primary key of the vertex. + * @param[out] props All the properties of the vertex. One of it maybe + * {"name":"id","type":"INT64"}. + * @param[out] prop_names All the property names of the vertex. One of it maybe "id". + */ +inline void WalkVertex(const GraphArchive::VertexInfo& ver_info, std::string& primary, + Properties& props, std::vector& prop_names) { + auto& ver_groups = ver_info.GetPropertyGroups(); + for (auto& ver_props : ver_groups) { + for (const auto& prop : ver_props->GetProperties()) { + if (prop.is_primary) primary = prop.name; + prop_names.emplace_back(std::move(prop.name)); + std::string type_name; + ParseType(prop.type, type_name); + props.emplace_back( + std::map{{"name", prop.name}, {"type", type_name}}); + } + } +} + +/** + * Traverse all properties of the edge, get the properties and the property names. + * Keep the original order in yml config. Similar to WalkVertex, but don't get primary. + * + * @param[in] edge_info The gar edge information. + * @param[out] props All the properties of the vertex. One of it maybe + * {"name":"id","type":"INT64"}. + * @param[out] prop_names All the property names of the vertex. One of it maybe "id". + */ +inline void WalkEdge(const GraphArchive::EdgeInfo& edge_info, Properties& props, + std::vector& prop_names) { + auto& edge_groups = edge_info.GetPropertyGroups(); + for (const auto& edge_props : edge_groups) { + for (const auto& prop : edge_props->GetProperties()) { + prop_names.emplace_back(std::move(prop.name)); + std::string type_name; + ParseType(prop.type, type_name); + props.emplace_back( + std::map{{"name", prop.name}, {"type", type_name}}); + } + } +} + +/** + * Compare the properties of two edges to see if they are equal. + * + * @param props1 The first edge properties. + * @param props2 The second edge properties. + * @return Result of the comparison. + */ +inline bool CheckEdgePropsEqual(const Properties& props1, const Properties& props2) { + json json1(props1); + json json2(props2); + return json1 == json2; +} + +/** + * @brief Read the gar yml file to construct the import config in json form. + * + * @param[out] gar_conf The json object of the import config used in import_v3. + * @param[in] path The location of gar yml file. + */ +inline void ParserGraphArConf(nlohmann::json& gar_conf, const std::string& path) { + auto graph_info = GraphArchive::GraphInfo::Load(path).value(); + gar_conf["schema"] = {}; + gar_conf["files"] = {}; + auto vertex_infos = graph_info->GetVertexInfos(); + for (const auto& vertex_info : vertex_infos) { + nlohmann::json schema_node; + schema_node["label"] = vertex_info->GetLabel(); + schema_node["type"] = "VERTEX"; + std::string primary; + Properties properties; + std::vector prop_names; + WalkVertex(*vertex_info, primary, properties, prop_names); + schema_node["primary"] = primary; + schema_node["properties"] = properties; + gar_conf["schema"].push_back(schema_node); + + nlohmann::json file_node; + file_node["path"] = path; + file_node["format"] = "GraphAr"; + file_node["label"] = vertex_info->GetLabel(); + file_node["columns"] = prop_names; + gar_conf["files"].push_back(file_node); + } + + auto edge_infos = graph_info->GetEdgeInfos(); + // The map of edge_label and its properties + std::unordered_map edge_labels; + for (const auto& edge_info : edge_infos) { + std::string label = edge_info->GetEdgeLabel(); + Properties properties; + std::vector prop_names = {"SRC_ID", "DST_ID"}; + WalkEdge(*edge_info, properties, prop_names); + if (!edge_labels.count(label)) { + edge_labels[label] = properties; + nlohmann::json schema_node; + schema_node["label"] = label; + schema_node["type"] = "EDGE"; + if (properties.size()) { + schema_node["properties"] = properties; + } + gar_conf["schema"].push_back(schema_node); + } else { + if (!CheckEdgePropsEqual(properties, edge_labels[label])) { + THROW_CODE(InputError, "The edge [" + label + "] has different properties!"); + } + } + + nlohmann::json file_node; + file_node["path"] = path; + file_node["format"] = "GraphAr"; + file_node["label"] = edge_info->GetEdgeLabel(); + file_node["SRC_ID"] = edge_info->GetSrcLabel(); + file_node["DST_ID"] = edge_info->GetDstLabel(); + file_node["columns"] = prop_names; + gar_conf["files"].push_back(file_node); + } +} + +} // namespace import_v3 +} // namespace lgraph diff --git a/src/import/graphar_parser.cpp b/src/import/graphar_parser.cpp new file mode 100644 index 0000000000..9aa3fd4d57 --- /dev/null +++ b/src/import/graphar_parser.cpp @@ -0,0 +1,179 @@ +/** + * Copyright 2022 AntGroup CO., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + */ + +#include "import/graphar_parser.h" +#include "import/graphar_config.h" +#include "import/import_exception.h" + +namespace lgraph { +namespace import_v2 { + +// The map contains PrimaryMaps of all vertices as endpoints of edges +std::unordered_map GraphArParser::primary_maps = {}; + +GraphArParser::GraphArParser(const CsvDesc& cd) : cd_(cd) {} + +GraphArParser::~GraphArParser() {} + +/** + * @brief Traverse the vertex properties to get the primary key. + * @param ver_info The gar vertex information. + * @return The primary key of the vertex. + */ +GraphArchive::Property GraphArParser::GetPrimaryKey(const GraphArchive::VertexInfo& ver_info) { + const auto& ver_groups = ver_info.GetPropertyGroups(); + for (const auto& ver_props : ver_groups) + for (const auto& prop : ver_props->GetProperties()) + if (prop.is_primary) return prop; + THROW_CODE(InputError, "The primary key of [" + ver_info.GetLabel() + "] is not found!"); +} + +/** + * @brief Parse the gar data of a vertex or edge property to FieldData. + * @param T The GraphAr vertex data or edge data. + * @param prop The property name. + * @param data_type The GraphAr DataType of the vetex property. + * @return The converted FieldData. + */ +template +FieldData GraphArParser::ParseData(T& data, const std::string& prop, + const std::shared_ptr& type) { + switch (type->id()) { + case GraphArchive::Type::BOOL: + return FieldData(data.template property(prop).value()); + case GraphArchive::Type::INT32: + return FieldData(data.template property(prop).value()); + case GraphArchive::Type::INT64: + return FieldData(data.template property(prop).value()); + case GraphArchive::Type::FLOAT: + return FieldData(data.template property(prop).value()); + case GraphArchive::Type::DOUBLE: + return FieldData(data.template property(prop).value()); + case GraphArchive::Type::STRING: + return FieldData::String(data.template property(prop).value()); + default: + THROW_CODE(InputError, "Unsupported data type error!"); + break; + } + return FieldData(); +} + +/** + * Map the GraphAr vertex ID and the vertex primary property FieldData, to get the + * primary data. + * @param[out] primary_map To save the map. + * @param[in] graph_info The GraphAr graph information, to get the vertex information. + * @param[in] ver_label The vertex label to get the vertex information. + */ +void GraphArParser::MapIdPrimary(PrimaryMap& primary_map, + const std::shared_ptr& graph_info, + const std::string& ver_label) { + if (primary_maps.count(ver_label)) { + primary_map = primary_maps[ver_label]; + return; + } + auto ver_info = graph_info->GetVertexInfo(ver_label); + GraphArchive::Property ver_prop = GetPrimaryKey(*ver_info); + if (!ver_prop.is_primary) { + THROW_CODE(InputError, "the primary key of [" + ver_label + "] is not found!"); + } + auto vertices = GraphArchive::VerticesCollection::Make(graph_info, ver_label).value(); + for (auto it = vertices->begin(); it != vertices->end(); ++it) { + auto vertex = *it; + primary_map[vertex.id()] = + ParseData(vertex, ver_prop.name, ver_prop.type); + } + primary_maps[ver_label] = primary_map; +} + +/** + * @brief Get the adjacency list type of the edge + * + * @param edge_info An object to describe the edge information + * @return One of GraphArchive::AdjListType + */ +GraphArchive::AdjListType GraphArParser::GetOneAdjListType( + const GraphArchive::EdgeInfo& edge_info) { + if (edge_info.HasAdjacentListType(GraphArchive::AdjListType::unordered_by_source)) + return GraphArchive::AdjListType::unordered_by_source; + if (edge_info.HasAdjacentListType(GraphArchive::AdjListType::unordered_by_dest)) + return GraphArchive::AdjListType::unordered_by_dest; + if (edge_info.HasAdjacentListType(GraphArchive::AdjListType::ordered_by_source)) + return GraphArchive::AdjListType::ordered_by_source; + if (edge_info.HasAdjacentListType(GraphArchive::AdjListType::ordered_by_dest)) + return GraphArchive::AdjListType::ordered_by_dest; + THROW_CODE(InputError, "The GraphAr edge" + edge_info.GetEdgeLabel() + " has not AdjListType!"); +} + +/** + * Read the gar data via the CsvDesc, and parse the gar data to the block of FieldData. + * @param[out] buf The block import_v3 needed. + * @return Whether the read process has been finished. + */ +bool GraphArParser::ReadBlock(std::vector>& buf) { + if (label_read) return false; + label_read = true; + auto graph_info = GraphArchive::GraphInfo::Load(cd_.path).value(); + if (cd_.is_vertex_file) { + auto vertices = GraphArchive::VerticesCollection::Make(graph_info, cd_.label).value(); + auto ver_info = graph_info->GetVertexInfo(cd_.label); + for (auto it = vertices->begin(); it != vertices->end(); ++it) { + auto vertex = *it; + std::vector temp_vf; + for (std::string& prop : cd_.columns) { + auto data_type = ver_info->GetPropertyType(prop).value(); + FieldData fd = ParseData(vertex, prop, data_type); + temp_vf.emplace_back(std::move(fd)); + } + buf.emplace_back(std::move(temp_vf)); + } + return true; + } else { + auto edge_info = graph_info->GetEdgeInfo(cd_.edge_src.label, cd_.label, cd_.edge_dst.label); + auto edges = + GraphArchive::EdgesCollection::Make(graph_info, cd_.edge_src.label, cd_.label, + cd_.edge_dst.label, GetOneAdjListType(*edge_info)) + .value(); + + PrimaryMap src_id_primary; + PrimaryMap dst_id_primary; + MapIdPrimary(src_id_primary, graph_info, cd_.edge_src.label); + MapIdPrimary(dst_id_primary, graph_info, cd_.edge_dst.label); + + size_t edge_num = edges->size(); + buf.reserve(edge_num); + for (auto it = edges->begin(); it != edges->end(); ++it) { + auto edge = *it; + std::vector temp_vf; + for (auto& prop : cd_.columns) { + if (prop == "SRC_ID") { + FieldData src_data = src_id_primary[edge.source()]; + temp_vf.emplace_back(std::move(src_data)); + } else if (prop == "DST_ID") { + FieldData dst_data = dst_id_primary[edge.destination()]; + temp_vf.emplace_back(std::move(dst_data)); + } else { + auto data_type = edge_info->GetPropertyType(prop).value(); + FieldData edge_data = ParseData(edge, prop, data_type); + temp_vf.emplace_back(std::move(edge_data)); + } + } + buf.emplace_back(std::move(temp_vf)); + } + return true; + } +} + +} // namespace import_v2 +} // namespace lgraph diff --git a/src/import/graphar_parser.h b/src/import/graphar_parser.h new file mode 100644 index 0000000000..63cea2efd8 --- /dev/null +++ b/src/import/graphar_parser.h @@ -0,0 +1,58 @@ +/** + * Copyright 2022 AntGroup CO., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + */ + +#pragma once + +#include +#include +#include + +#include "core/data_type.h" +#include "core/field_data_helper.h" +#include "import/block_parser.h" +#include "import/import_config_parser.h" + +namespace lgraph { +namespace import_v2 { + +// The map to get primary data of a vertex +typedef std::unordered_map PrimaryMap; + +// Parse gar file into a block of FieldData +class GraphArParser : public BlockParser { + protected: + CsvDesc cd_; // Schema definition and config + bool label_read = false; // Means the block has been read + + static std::unordered_map primary_maps; + + GraphArchive::Property GetPrimaryKey(const GraphArchive::VertexInfo&); + template + FieldData ParseData(T& data, const std::string& prop, + const std::shared_ptr& data_type); + void MapIdPrimary(PrimaryMap& primary_map, + const std::shared_ptr& graph_info, + const std::string& ver_label); + GraphArchive::AdjListType GetOneAdjListType(const GraphArchive::EdgeInfo &edge_info); + + public: + explicit GraphArParser(const CsvDesc& cd); + + bool ReadBlock(std::vector>& buf); + + ~GraphArParser(); +}; + +} // namespace import_v2 +} // namespace lgraph diff --git a/src/import/import_config_parser.h b/src/import/import_config_parser.h index b47eadd5fb..ef968fa4d8 100644 --- a/src/import/import_config_parser.h +++ b/src/import/import_config_parser.h @@ -958,9 +958,11 @@ class ImportConfParser { cd.size = fs::file_size(file); } cd.data_format = item["format"]; - if (cd.data_format != "CSV" && cd.data_format != "JSON") { + + if (cd.data_format != "CSV" && cd.data_format != "JSON" && + cd.data_format != "GraphAr") { THROW_CODE(InputError, - "\"format\" value error : {}, should be CSV or JSON in json {}", + "\"format\" value error : {}, should be CSV, JSON or GraphAr in json {}", cd.data_format, item.dump(4)); } cd.label = item["label"]; diff --git a/src/import/import_v2.h b/src/import/import_v2.h index 829bd7a335..a3141c6b9a 100644 --- a/src/import/import_v2.h +++ b/src/import/import_v2.h @@ -17,6 +17,7 @@ #include "core/lightning_graph.h" #include "core/type_convert.h" #include "import/column_parser.h" +#include "import/jsonlines_parser.h" #include "import/import_config_parser.h" #include "import/import_data_file.h" #include "import/import_planner.h" diff --git a/src/import/import_v3.cpp b/src/import/import_v3.cpp index 37db2add4c..d2e200cf42 100644 --- a/src/import/import_v3.cpp +++ b/src/import/import_v3.cpp @@ -20,6 +20,7 @@ #include "import/import_config_parser.h" #include "import/blob_writer.h" #include "import/import_utils.h" +#include "import/graphar_config.h" #include "db/galaxy.h" namespace lgraph { @@ -40,7 +41,7 @@ void Importer::OnErrorOffline(const std::string& msg) { LOG_WARN() << msg; if (!config_.continue_on_error) { LOG_WARN() << "If you wish to ignore the errors, use " - "--continue_on_error true"; + "--continue_on_error true"; if (!config_.import_online) { exit(-1); } else { @@ -60,9 +61,13 @@ void Importer::DoImportOffline() { Galaxy galaxy(Galaxy::Config{config_.db_dir, false, true, "fma.ai"}, true, gc); auto db = OpenGraph(galaxy, empty_db); db_ = &db; - std::ifstream ifs(config_.config_file); nlohmann::json conf; - ifs >> conf; + if (config_.is_graphar) { + ParserGraphArConf(conf, config_.config_file); + } else { + std::ifstream ifs(config_.config_file); + ifs >> conf; + } schemaDesc_ = import_v2::ImportConfParser::ParseSchema(conf); data_files_ = import_v2::ImportConfParser::ParseFiles(conf); @@ -72,10 +77,10 @@ void Importer::DoImportOffline() { .MeetEdgeConstraints(file.edge_src.label, file.edge_dst.label)) { throw std::runtime_error(FMA_FMT("{} not meet the edge constraints", file.path)); } - file.edge_src.id = schemaDesc_.FindVertexLabel( - file.edge_src.label).GetPrimaryField().name; - file.edge_dst.id = schemaDesc_.FindVertexLabel( - file.edge_dst.label).GetPrimaryField().name; + file.edge_src.id = + schemaDesc_.FindVertexLabel(file.edge_src.label).GetPrimaryField().name; + file.edge_dst.id = + schemaDesc_.FindVertexLabel(file.edge_dst.label).GetPrimaryField().name; } import_v2::ImportConfParser::CheckConsistent(schemaDesc_, file); } @@ -104,15 +109,14 @@ void Importer::DoImportOffline() { bool ok = db_->AddLabel(v.is_vertex, v.name, fds, *options); if (ok) { if (!config_.import_online) { - LOG_INFO() << FMA_FMT("Add {} label:{}", v.is_vertex ? "vertex" : "edge", - v.name); + LOG_INFO() << FMA_FMT("Add {} label:{}", v.is_vertex ? "vertex" : "edge", v.name); } else { - online_full_import_oss << FMA_FMT("Add {} label:{}\n", - v.is_vertex ? "vertex" : "edge", v.name); + online_full_import_oss + << FMA_FMT("Add {} label:{}\n", v.is_vertex ? "vertex" : "edge", v.name); } } else { - THROW_CODE(InputError, - "{} label:{} already exists", v.is_vertex ? "Vertex" : "Edge", v.name); + THROW_CODE(InputError, "{} label:{} already exists", v.is_vertex ? "Vertex" : "Edge", + v.name); } auto lid = db_->CreateReadTxn().GetLabelId(v.is_vertex, v.name); if (v.is_vertex) { @@ -147,64 +151,69 @@ void Importer::DoImportOffline() { // create index, ID column has creadted if (db_->AddVertexIndex(v.name, spec.name, spec.idxType)) { if (!config_.import_online) { - LOG_INFO() << FMA_FMT("Add vertex index [label:{}, field:{}, type:{}]", - v.name, spec.name, static_cast(spec.idxType)); + LOG_INFO() + << FMA_FMT("Add vertex index [label:{}, field:{}, type:{}]", v.name, + spec.name, static_cast(spec.idxType)); } else { - online_full_import_oss << FMA_FMT("Add vertex index [label:{}, " - "field:{}, type:{}]\n", v.name, spec.name, - static_cast(spec.idxType)); + online_full_import_oss << FMA_FMT( + "Add vertex index [label:{}, " + "field:{}, type:{}]\n", + v.name, spec.name, static_cast(spec.idxType)); } - } else { - THROW_CODE(InputError, - "Vertex index [label:{}, field:{}] already exists", - v.name, spec.name); + THROW_CODE(InputError, "Vertex index [label:{}, field:{}] already exists", + v.name, spec.name); } } else if (v.is_vertex && spec.index && !spec.primary && spec.idxType != lgraph::IndexType::NonuniqueIndex) { THROW_CODE(InputError, - "offline import does not support to create a unique " - "index [label:{}, field:{}]. You should create an index for " - "an attribute column after the import is complete", - v.name, spec.name); + "offline import does not support to create a unique " + "index [label:{}, field:{}]. You should create an index for " + "an attribute column after the import is complete", + v.name, spec.name); } else if (!v.is_vertex && spec.index && (spec.idxType == lgraph::IndexType::NonuniqueIndex || - spec.idxType == lgraph::IndexType::PairUniqueIndex)) { + spec.idxType == lgraph::IndexType::PairUniqueIndex)) { if (db_->AddEdgeIndex(v.name, spec.name, spec.idxType)) { if (!config_.import_online) { - LOG_INFO() << FMA_FMT("Add edge index [label:{}, field:{}, type:{}]", - v.name, spec.name, static_cast(spec.idxType)); + LOG_INFO() + << FMA_FMT("Add edge index [label:{}, field:{}, type:{}]", v.name, + spec.name, static_cast(spec.idxType)); } else { - online_full_import_oss << FMA_FMT("Add edge index [label:{}, field:{}," - " type:{}]\n", v.name, spec.name, static_cast(spec.idxType)); + online_full_import_oss << FMA_FMT( + "Add edge index [label:{}, field:{}," + " type:{}]\n", + v.name, spec.name, static_cast(spec.idxType)); } } else { - THROW_CODE(InputError, - "Edge index [label:{}, field:{}] already exists", - v.name, spec.name); + THROW_CODE(InputError, "Edge index [label:{}, field:{}] already exists", + v.name, spec.name); } } else if (!v.is_vertex && spec.index && spec.idxType == lgraph::IndexType::GlobalUniqueIndex) { THROW_CODE(InputError, - "offline import does not support to create an unique " - "index [label:{}, field:{}]. You should create an index for " - "an attribute column after the import is complete", - v.name, spec.name); + "offline import does not support to create an unique " + "index [label:{}, field:{}]. You should create an index for " + "an attribute column after the import is complete", + v.name, spec.name); } if (spec.fulltext) { bool ok = db_->AddFullTextIndex(v.is_vertex, v.name, spec.name); if (ok) { if (!config_.import_online) { - LOG_INFO() << FMA_FMT("Add fulltext index [{} label:{}, field:{}]", - v.is_vertex ? "vertex" : "edge", v.name, spec.name); + LOG_INFO() + << FMA_FMT("Add fulltext index [{} label:{}, field:{}]", + v.is_vertex ? "vertex" : "edge", v.name, spec.name); } else { - online_full_import_oss << FMA_FMT("Add fulltext index [{} label:{}, " - "field:{}]\n", v.is_vertex ? "vertex" : "edge", v.name, spec.name); + online_full_import_oss << FMA_FMT( + "Add fulltext index [{} label:{}, " + "field:{}]\n", + v.is_vertex ? "vertex" : "edge", v.name, spec.name); } } else { THROW_CODE(InputError, - "Fulltext index [{} label:{}, field:{}] already exists", - v.is_vertex ? "vertex" : "edge", v.name, spec.name); + "Fulltext index [{} label:{}, field:{}] already exists", + v.is_vertex ? "vertex" : "edge", v.name, spec.name); } } } @@ -234,16 +243,14 @@ void Importer::VertexDataToSST() { rocksdb::DB* db; auto s = rocksdb::DB::Open(options, vid_path_, &db); if (!s.ok()) { - throw std::runtime_error( - FMA_FMT("Opening DB failed, error: {}", s.ToString().c_str())); + throw std::runtime_error(FMA_FMT("Opening DB failed, error: {}", s.ToString().c_str())); } rocksdb_vids_.reset(db); } - parse_file_threads_ = std::make_unique( - config_.parse_file_threads); - generate_sst_threads_ = std::make_unique( - config_.generate_sst_threads); + parse_file_threads_ = std::make_unique(config_.parse_file_threads); + generate_sst_threads_ = + std::make_unique(config_.generate_sst_threads); struct VertexDataBlock { VertexId start_vid = 0; uint16_t key_col_id = 0; @@ -263,7 +270,7 @@ void Importer::VertexDataToSST() { if (!file.is_vertex_file) { continue; } - boost::asio::post(*parse_file_threads_, [this, &blob_writer, &pending_tasks, &file](){ + boost::asio::post(*parse_file_threads_, [this, &blob_writer, &pending_tasks, &file]() { try { std::vector fts; { @@ -288,7 +295,9 @@ void Importer::VertexDataToSST() { uint16_t key_col_id = file.FindIdxExcludeSkip( schemaDesc_.FindVertexLabel(file.label).GetPrimaryField().name); std::unique_ptr parser; - if (file.data_format == "CSV") { + if (file.data_format == "GraphAr") { + parser.reset(new import_v2::GraphArParser(file)); + } else if (file.data_format == "CSV") { parser.reset(new import_v2::ColumnParser( file.path, fts, config_.parse_block_size, config_.parse_block_threads, file.n_header_line, config_.continue_on_error, config_.delimiter, @@ -329,10 +338,10 @@ void Importer::VertexDataToSST() { std::vector vec_kvs; VertexId start_vid = dataBlock->start_vid; std::unique_ptr vertex_sst_writer( - new rocksdb::SstFileWriter(rocksdb::EnvOptions(), - {}, nullptr, false)); - std::string sst_path = sst_files_path_ + "/vertex_" + - std::to_string(start_vid); + new rocksdb::SstFileWriter(rocksdb::EnvOptions(), {}, nullptr, + false)); + std::string sst_path = + sst_files_path_ + "/vertex_" + std::to_string(start_vid); auto s = vertex_sst_writer->Open(sst_path); if (!s.ok()) { throw std::runtime_error( @@ -395,7 +404,7 @@ void Importer::VertexDataToSST() { }); } s = vertex_sst_writer->Put({(const char*)&vid, sizeof(vid)}, - {value.Data(), value.Size()}); + {value.Data(), value.Size()}); if (!s.ok()) { throw std::runtime_error( FMA_FMT("vertex_sst_writer.Put error, {}", s.ToString())); @@ -416,10 +425,9 @@ void Importer::VertexDataToSST() { if (!config_.keep_vid_in_memory && !vec_kvs.empty()) { rocksdb::SstFileWriter vid_sst_writer(rocksdb::EnvOptions(), {}, - nullptr, false); - s = vid_sst_writer.Open( - sst_files_path_ + "/vid_" + - std::to_string(dataBlock->start_vid)); + nullptr, false); + s = vid_sst_writer.Open(sst_files_path_ + "/vid_" + + std::to_string(dataBlock->start_vid)); if (!s.ok()) { throw std::runtime_error( FMA_FMT("Failed to open vid_sst_writer")); @@ -470,7 +478,7 @@ void Importer::VertexDataToSST() { if (!config_.keep_vid_in_memory) { auto begin = fma_common::GetTime(); std::vector ingest_files; - for (const auto & entry : std::filesystem::directory_iterator(sst_files_path_)) { + for (const auto& entry : std::filesystem::directory_iterator(sst_files_path_)) { const auto& path = entry.path().string(); if (path.find("vid_") != std::string::npos) { ingest_files.push_back(path); @@ -502,8 +510,9 @@ void Importer::VertexDataToSST() { if (!config_.import_online) { LOG_INFO() << "vids CompactRange, time: " << fma_common::GetTime() - begin << "s"; } else { - online_full_import_oss << "vids CompactRange, time: " + - std::to_string(fma_common::GetTime() - begin) + "s\n"; + online_full_import_oss + << "vids CompactRange, time: " + std::to_string(fma_common::GetTime() - begin) + + "s\n"; } } @@ -518,10 +527,9 @@ void Importer::VertexDataToSST() { void Importer::EdgeDataToSST() { auto t1 = fma_common::GetTime(); - parse_file_threads_ = std::make_unique( - config_.parse_file_threads); - generate_sst_threads_ = std::make_unique( - config_.generate_sst_threads); + parse_file_threads_ = std::make_unique(config_.parse_file_threads); + generate_sst_threads_ = + std::make_unique(config_.generate_sst_threads); struct EdgeDataBlock { std::vector> block; uint64_t start_eid = 0; @@ -539,7 +547,7 @@ void Importer::EdgeDataToSST() { struct KV { std::string key; Value value; - KV(std::string k, Value v): key(std::move(k)), value(std::move(v)) {} + KV(std::string k, Value v) : key(std::move(k)), value(std::move(v)) {} }; BufferedBlobWriter blob_writer(db_->GetLightningGraph()); std::atomic pending_tasks(0); @@ -550,9 +558,8 @@ void Importer::EdgeDataToSST() { if (file.is_vertex_file) { continue; } - boost::asio::post(*parse_file_threads_, - [this, &file, &blob_writer, &pending_tasks, - &sst_file_id, &unique_index_keys](){ + boost::asio::post(*parse_file_threads_, [this, &file, &blob_writer, &pending_tasks, + &sst_file_id, &unique_index_keys]() { try { std::vector fts; { @@ -594,7 +601,9 @@ void Importer::EdgeDataToSST() { } } std::unique_ptr parser; - if (file.data_format == "CSV") { + if (file.data_format == "GraphAr") { + parser.reset(new import_v2::GraphArParser(file)); + } else if (file.data_format == "CSV") { parser.reset(new import_v2::ColumnParser( file.path, fts, config_.parse_block_size, config_.parse_block_threads, file.n_header_line, config_.continue_on_error, config_.delimiter, @@ -650,10 +659,9 @@ void Importer::EdgeDataToSST() { pending_tasks--; uint64_t num = ++sst_file_id; std::unique_ptr sst_file_writer( - new rocksdb::SstFileWriter(rocksdb::EnvOptions(), - {}, nullptr, false)); - std::string sst_path = sst_files_path_ + "/edge_" + - std::to_string(num); + new rocksdb::SstFileWriter(rocksdb::EnvOptions(), {}, nullptr, + false)); + std::string sst_path = sst_files_path_ + "/edge_" + std::to_string(num); auto s = sst_file_writer->Open(sst_path); if (!s.ok()) { throw std::runtime_error(FMA_FMT("failed to open sst_file_writer")); @@ -709,8 +717,8 @@ void Importer::EdgeDataToSST() { continue; } auto slice_k = vid_iter->key(); - auto offset = slice_k.data() + - (slice_k.size() - sizeof(VertexId)); + auto offset = + slice_k.data() + (slice_k.size() - sizeof(VertexId)); src_vid = *(VertexId*)offset; slice_k.remove_suffix(sizeof(VertexId)); if (slice_k.compare(k) != 0) { @@ -746,8 +754,8 @@ void Importer::EdgeDataToSST() { continue; } auto slice_k = vid_iter->key(); - auto offset = slice_k.data() + - (slice_k.size() - sizeof(VertexId)); + auto offset = + slice_k.data() + (slice_k.size() - sizeof(VertexId)); dst_vid = *(VertexId*)offset; slice_k.remove_suffix(sizeof(VertexId)); if (slice_k.compare(k) != 0) { @@ -770,8 +778,8 @@ void Importer::EdgeDataToSST() { if (unique_index_col.IsString() && unique_index_col.string().size() > lgraph::_detail::MAX_KEY_SIZE) { - OnErrorOffline("Unique index string key is too long: " - + unique_index_col.string().substr(0, 1024)); + OnErrorOffline("Unique index string key is too long: " + + unique_index_col.string().substr(0, 1024)); continue; } std::string unique_key; @@ -849,7 +857,7 @@ void Importer::EdgeDataToSST() { [](const KV& a, const KV& b) { return a.key < b.key; }); for (auto& pair : vec_kvs) { sst_file_writer->Put(pair.key, - {pair.value.Data(), pair.value.Size()}); + {pair.value.Data(), pair.value.Size()}); } std::vector().swap(vec_kvs); sst_file_writer->Finish(); @@ -906,7 +914,7 @@ void Importer::VertexPrimaryIndexToLmdb() { LabelId preLabelId = std::numeric_limits::max(); auto txn = db_->CreateWriteTxn(); VertexIndex* vertexIndex = nullptr; - auto write_index = [&](const std::string& key, VertexId vid){ + auto write_index = [&](const std::string& key, VertexId vid) { FMA_DBG_CHECK(key.size() > sizeof(LabelId)); LabelId labelId = *((LabelId*)key.data()); if (labelId != preLabelId) { @@ -1038,8 +1046,7 @@ void Importer::VertexPrimaryIndexToLmdb() { } rocksdb_vids_.reset(nullptr); } -typedef std::vector>::iterator IT; +typedef std::vector>::iterator IT; void Importer::RocksdbToLmdb() { auto t1 = fma_common::GetTime(); std::unique_ptr rocksdb; @@ -1060,7 +1067,7 @@ void Importer::RocksdbToLmdb() { rocksdb.reset(db); } std::vector ingest_files; - for (const auto & entry : std::filesystem::directory_iterator(sst_files_path_)) { + for (const auto& entry : std::filesystem::directory_iterator(sst_files_path_)) { ingest_files.push_back(entry.path().generic_string()); } if (ingest_files.empty()) { @@ -1069,7 +1076,8 @@ void Importer::RocksdbToLmdb() { if (!config_.import_online) { exit(-1); } else { - throw std::runtime_error("no sst files are created, " + throw std::runtime_error( + "no sst files are created, " "please check if the input vertex and edge files are valid"); } } @@ -1092,8 +1100,8 @@ void Importer::RocksdbToLmdb() { if (!config_.import_online) { LOG_INFO() << "CompactRange, time: " << fma_common::GetTime() - begin << "s"; } else { - online_full_import_oss << "CompactRange, time: " + - std::to_string(fma_common::GetTime() - begin) + "s\n"; + online_full_import_oss + << "CompactRange, time: " + std::to_string(fma_common::GetTime() - begin) + "s\n"; } } if (!config_.keep_vid_in_memory) { @@ -1125,16 +1133,15 @@ void Importer::RocksdbToLmdb() { std::atomic pending_tasks(0); std::atomic stage(0); - std::unique_ptr lmdb_writer( - new boost::asio::thread_pool(1)); + std::unique_ptr lmdb_writer(new boost::asio::thread_pool(1)); std::unique_ptr rocksdb_readers( new boost::asio::thread_pool(config_.read_rocksdb_threads)); for (uint16_t i = 0; i < config_.read_rocksdb_threads; i++) { - boost::asio::post(*rocksdb_readers, [this, i, &pending_tasks, - &rocksdb, &lmdb_writer, &stage]() { + boost::asio::post(*rocksdb_readers, [this, i, &pending_tasks, &rocksdb, &lmdb_writer, + &stage]() { uint64_t start_vid = i * config_.vid_num_per_reading; uint64_t bigend_start_vid = boost::endian::native_to_big(start_vid); - uint64_t end_vid = (i+1) * config_.vid_num_per_reading; + uint64_t end_vid = (i + 1) * config_.vid_num_per_reading; uint64_t bigend_end_vid = boost::endian::native_to_big(end_vid); rocksdb::ReadOptions options; options.ignore_range_deletions = true; @@ -1157,52 +1164,51 @@ void Importer::RocksdbToLmdb() { VertexId pre_vid = InvalidVid; EdgeUid last_uid(-1, -1, 0, -1, -1); - auto throw_kvs_to_lmdb = [&lmdb_writer, &pending_tasks, this, &stage, i] - (std::vector> kvs, - std::vector> v_property, - std::vector> e_property){ - while (stage != i || pending_tasks > 1) { - fma_common::SleepUs(1000); - } - if (kvs.empty()) { - return; - } - pending_tasks++; - boost::asio::post(*lmdb_writer, [this, &pending_tasks, - kvs = std::move(kvs), - v_property = std::move(v_property), - e_property = std::move(e_property)]() { - Transaction txn = db_->CreateWriteTxn(); - for (auto& kv : kvs) { - txn.ImportAppendDataRaw(kv.first, kv.second); - } - txn.RefreshNextVid(); - for (auto& pro : v_property) { - auto s = (Schema*)(txn.GetSchema(std::get<0>(pro), true)); - s->AddDetachedVertexProperty( - txn.GetTxn(), std::get<1>(pro), std::get<2>(pro)); + auto throw_kvs_to_lmdb = + [&lmdb_writer, &pending_tasks, this, &stage, i]( + std::vector> kvs, + std::vector> v_property, + std::vector> e_property) { + while (stage != i || pending_tasks > 1) { + fma_common::SleepUs(1000); } - for (auto& pro : e_property) { - auto s = (Schema*)(txn.GetSchema(std::get<0>(pro), false)); - s->AddDetachedEdgeProperty( - txn.GetTxn(), std::get<1>(pro), std::get<2>(pro)); + if (kvs.empty()) { + return; } - txn.Commit(); - pending_tasks--; - }); - }; + pending_tasks++; + boost::asio::post(*lmdb_writer, [this, &pending_tasks, kvs = std::move(kvs), + v_property = std::move(v_property), + e_property = std::move(e_property)]() { + Transaction txn = db_->CreateWriteTxn(); + for (auto& kv : kvs) { + txn.ImportAppendDataRaw(kv.first, kv.second); + } + txn.RefreshNextVid(); + for (auto& pro : v_property) { + auto s = (Schema*)(txn.GetSchema(std::get<0>(pro), true)); + s->AddDetachedVertexProperty(txn.GetTxn(), std::get<1>(pro), + std::get<2>(pro)); + } + for (auto& pro : e_property) { + auto s = (Schema*)(txn.GetSchema(std::get<0>(pro), false)); + s->AddDetachedEdgeProperty(txn.GetTxn(), std::get<1>(pro), + std::get<2>(pro)); + } + txn.Commit(); + pending_tasks--; + }); + }; auto make_kvs = [&]() { if (!split) { lgraph::graph::VertexValue vov(GetConstRef(vdata)); IT next_beg; lgraph::graph::EdgeValue oev(outs.begin(), outs.end(), out_last_lid, - out_last_tid, out_last_dst, out_last_eid, - next_beg, true); + out_last_tid, out_last_dst, out_last_eid, next_beg, + true); FMA_DBG_ASSERT(next_beg == outs.end()); outs.clear(); - lgraph::graph::EdgeValue iev(ins.begin(), ins.end(), in_last_lid, - in_last_tid, in_last_dst, in_last_eid, - next_beg, true); + lgraph::graph::EdgeValue iev(ins.begin(), ins.end(), in_last_lid, in_last_tid, + in_last_dst, in_last_eid, next_beg, true); FMA_DBG_ASSERT(next_beg == ins.end()); ins.clear(); Value data; @@ -1217,8 +1223,7 @@ void Importer::RocksdbToLmdb() { out_last_tid, out_last_dst, out_last_eid, next_start, true); FMA_DBG_ASSERT(next_start == outs.end()); - kvs.emplace_back(oev.CreateOutEdgeKey(pre_vid), - std::move(oev.GetBuf())); + kvs.emplace_back(oev.CreateOutEdgeKey(pre_vid), std::move(oev.GetBuf())); all_kv_size += kvs.back().first.Size() + kvs.back().second.Size(); outs.clear(); } @@ -1228,8 +1233,7 @@ void Importer::RocksdbToLmdb() { in_last_tid, in_last_dst, in_last_eid, next_start, true); FMA_DBG_ASSERT(next_start == ins.end()); - kvs.emplace_back(iev.CreateInEdgeKey(pre_vid), - std::move(iev.GetBuf())); + kvs.emplace_back(iev.CreateInEdgeKey(pre_vid), std::move(iev.GetBuf())); all_kv_size += kvs.back().first.Size() + kvs.back().second.Size(); ins.clear(); } @@ -1250,8 +1254,7 @@ void Importer::RocksdbToLmdb() { while (true) { pre_vid = InvalidVid; for (iter->Seek({(const char*)&bigend_start_vid, sizeof(bigend_start_vid)}); - iter->Valid(); - iter->Next()) { + iter->Valid(); iter->Next()) { auto key = iter->key(); if (key.compare({(const char*)&bigend_end_vid, sizeof(bigend_end_vid)}) >= 0) { if (pre_vid != InvalidVid) { @@ -1275,8 +1278,7 @@ void Importer::RocksdbToLmdb() { if (pre_vid != InvalidVid) { make_kvs(); if (all_kv_size > config_.max_size_per_reading) { - throw_kvs_to_lmdb(std::move(kvs), - std::move(vertex_property), + throw_kvs_to_lmdb(std::move(kvs), std::move(vertex_property), std::move(edge_property)); all_kv_size = 0; } @@ -1285,8 +1287,8 @@ void Importer::RocksdbToLmdb() { } if (vlid_detach_.at(lid)) { // detach property - vertex_property.emplace_back( - lid, vid, Value::MakeCopy(val.data(), val.size())); + vertex_property.emplace_back(lid, vid, + Value::MakeCopy(val.data(), val.size())); vdata = import_v2::DenseString((const char*)(&lid), sizeof(LabelId)); } else { vdata = import_v2::DenseString(val.data(), val.size()); @@ -1320,17 +1322,15 @@ void Importer::RocksdbToLmdb() { uid.lid = labelId; uid.dst = vertexId; uid.tid = tid; - if (last_uid.src == uid.src && - last_uid.lid == uid.lid && - last_uid.dst == uid.dst && - last_uid.tid == uid.tid) { + if (last_uid.src == uid.src && last_uid.lid == uid.lid && + last_uid.dst == uid.dst && last_uid.tid == uid.tid) { uid.eid = last_uid.eid + 1; } else { uid.eid = 0; } last_uid = uid; - edge_property.emplace_back( - labelId, uid, Value::MakeCopy(val.data(), val.size())); + edge_property.emplace_back(labelId, uid, + Value::MakeCopy(val.data(), val.size())); outs.emplace_back(labelId, tid, vertexId, import_v2::DenseString()); } else { outs.emplace_back(labelId, tid, vertexId, @@ -1352,10 +1352,9 @@ void Importer::RocksdbToLmdb() { } if (!outs.empty()) { IT next_start; - lgraph::graph::EdgeValue oev(outs.begin(), outs.end(), - out_last_lid, out_last_tid, - out_last_dst, out_last_eid, - next_start, true); + lgraph::graph::EdgeValue oev(outs.begin(), outs.end(), out_last_lid, + out_last_tid, out_last_dst, + out_last_eid, next_start, true); FMA_DBG_ASSERT(next_start == outs.end()); kvs.emplace_back(oev.CreateOutEdgeKey(pre_vid), std::move(oev.GetBuf())); @@ -1375,8 +1374,7 @@ void Importer::RocksdbToLmdb() { } if (all_kv_size > config_.max_size_per_reading) { - throw_kvs_to_lmdb(std::move(kvs), - std::move(vertex_property), + throw_kvs_to_lmdb(std::move(kvs), std::move(vertex_property), std::move(edge_property)); all_kv_size = 0; } @@ -1392,8 +1390,7 @@ void Importer::RocksdbToLmdb() { } else { if (pre_vid != InvalidVid) { make_kvs(); - throw_kvs_to_lmdb(std::move(kvs), - std::move(vertex_property), + throw_kvs_to_lmdb(std::move(kvs), std::move(vertex_property), std::move(edge_property)); all_kv_size = 0; } @@ -1409,8 +1406,8 @@ void Importer::RocksdbToLmdb() { if (!config_.import_online) { LOG_INFO() << "Dump rocksdb into lmdb, time: " << t2 - t1 << "s"; } else { - online_full_import_oss << "Dump rocksdb into lmdb, time: " + - std::to_string(t2 - t1) + "s\n"; + online_full_import_oss << "Dump rocksdb into lmdb, time: " + std::to_string(t2 - t1) + + "s\n"; } } @@ -1460,9 +1457,7 @@ AccessControlledDB Importer::OpenGraph(Galaxy& galaxy, bool empty_db) { return galaxy.OpenGraph(config_.user, config_.graph); } -std::string Importer::OnlineFullImportLog() { - return online_full_import_oss.str(); -} +std::string Importer::OnlineFullImportLog() { return online_full_import_oss.str(); } } // namespace import_v3 } // namespace lgraph diff --git a/src/import/import_v3.h b/src/import/import_v3.h index 283859edd2..96898f3f9c 100644 --- a/src/import/import_v3.h +++ b/src/import/import_v3.h @@ -21,6 +21,8 @@ #include "core/lightning_graph.h" #include "core/type_convert.h" #include "import/column_parser.h" +#include "import/jsonlines_parser.h" +#include "import/graphar_parser.h" #include "import/import_config_parser.h" #include "import/dense_string.h" @@ -45,6 +47,7 @@ class Importer { std::string db_dir = "./lgraph_db"; // db data dir to use std::string user = "admin"; std::string password = "73@TuGraph"; + bool is_graphar = false; // import Graphar file, config file must be absolute path std::string graph = "default"; // graph name bool delete_if_exists = false; // force import, delete data if already exists bool continue_on_error = false; // whether to continue when there are data errors diff --git a/src/import/jsonlines_parser.h b/src/import/jsonlines_parser.h new file mode 100644 index 0000000000..f71f25d15b --- /dev/null +++ b/src/import/jsonlines_parser.h @@ -0,0 +1,258 @@ +/** + * Copyright 2022 AntGroup CO., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + */ + +#pragma once + +#include +#include + +#include "core/data_type.h" +#include "core/field_data_helper.h" +#include "import/block_parser.h" +#include "import/import_config_parser.h" +#include "restful/server/json_convert.h" +#include "tools/json.hpp" + +namespace lgraph { +namespace import_v2 { + +// Parse a jsonline into a vector of FieldData +class JsonLinesParser : public BlockParser { + public: + typedef std::function(const char*, const char*, + std::vector&)> + ParseFunc; + JsonLinesParser(std::unique_ptr stream, + const std::vector& field_specs, size_t block_size, size_t n_threads, + size_t n_header_lines, bool forgiving, int64_t max_err_msgs = 100) + : stream_(std::move(stream)), + field_specs_(field_specs), + forgiving_(forgiving), + max_errors_(max_err_msgs) { + init(block_size, n_threads, n_header_lines); + } + JsonLinesParser(const std::string& path, const std::vector& field_specs, + size_t block_size, size_t n_threads, size_t n_header_lines, bool forgiving, + int64_t max_err_msgs = 100) + : stream_(new fma_common::InputFmaStream(path)), + field_specs_(field_specs), + forgiving_(forgiving), + max_errors_(max_err_msgs) { + if (!stream_->Good()) { + LOG_INFO() << "Failed to open input file " << path; + throw std::runtime_error("failed to open input file [" + path + "]"); + } + init(block_size, n_threads, n_header_lines); + } + + ~JsonLinesParser() { parser_->Stop(); } + + bool ReadBlock(std::vector>& buf) { return parser_->ReadBlock(buf); } + + private: + void init(size_t block_size, size_t n_threads, size_t n_header_lines) { + parser_.reset(new fma_common::TextParser, ParseFunc>( + *stream_, + [this](const char* start, const char* end, std::vector& fds) { + return parse_jsonline(start, end, fds); + }, + block_size, n_threads, n_header_lines)); + } + + std::tuple parse_jsonline(const char* start, const char* end, + std::vector& fds) { + using namespace web; + using namespace boost; + size_t trim_count = 0; + const char* original_starting = start; + while (start < end && fma_common::TextParserUtils::IsTrimable(*start)) { + start++; + trim_count++; + } + if (start == end) { + return std::tuple(trim_count, false); + } + +#define SKIP_OR_THROW(except) \ + if (forgiving_) { \ + if (errors_++ < max_errors_) LOG_INFO() << except.what(); \ + while (start < end && !fma_common::TextParserUtils::IsNewLine(*start)) start++; \ + while (start < end && fma_common::TextParserUtils::IsNewLine(*start)) start++; \ + return std::tuple(start - original_starting, false); \ + } else { \ + std::throw_with_nested(except); \ + } + + // use stream parse to avoid memory copy + iostreams::stream istr(start, end - start); + std::error_code err_code; + json::value json_obj = json::value::parse(istr, err_code); + switch (err_code.value()) { + case 0: + break; + case 1: + { + istr.unget(); // hack + break; + } + default: + { + SKIP_OR_THROW(ParseJsonException(start, end, err_code.message())); + } + } + using namespace lgraph::field_data_helper; + try { + for (size_t column = 0; column < field_specs_.size(); column++) { + FieldSpec& field_spec = field_specs_[column]; + if (field_spec.name.empty()) { + continue; + } + if (json_obj.at(column).is_null() && field_spec.optional) { + fds.emplace_back(); + continue; + } + FieldData fd; + switch (field_spec.type) { + case FieldType::NUL: + FMA_ASSERT(false); + case FieldType::BOOL: + { + const auto& val = json_obj.at(column); + if (val.is_string()) { + const auto& str = ToStdString(val.as_string()); + ParseStringIntoFieldData(str.data(), + str.data() + str.size(), fd); + } else { + fd = FieldData::Bool(val.as_bool()); + } + break; + } + case FieldType::INT8: + { + const auto& val = json_obj.at(column); + if (val.is_string()) { + const auto& str = ToStdString(val.as_string()); + ParseStringIntoFieldData(str.data(), + str.data() + str.size(), fd); + } else { + fd = FieldData::Int8(val.as_number().to_int32()); + } + break; + } + case FieldType::INT16: + { + const auto& val = json_obj.at(column); + if (val.is_string()) { + const auto& str = ToStdString(val.as_string()); + ParseStringIntoFieldData(str.data(), + str.data() + str.size(), fd); + } else { + fd = FieldData::Int16(val.as_number().to_int32()); + } + break; + } + case FieldType::INT32: + { + const auto& val = json_obj.at(column); + if (val.is_string()) { + const auto& str = ToStdString(val.as_string()); + ParseStringIntoFieldData(str.data(), + str.data() + str.size(), fd); + } else { + fd = FieldData::Int32(val.as_number().to_int32()); + } + break; + } + case FieldType::INT64: + { + const auto& val = json_obj.at(column); + if (val.is_string()) { + const auto& str = ToStdString(val.as_string()); + ParseStringIntoFieldData(str.data(), + str.data() + str.size(), fd); + } else { + fd = FieldData::Int64(val.as_number().to_int64()); + } + break; + } + case FieldType::FLOAT: + { + const auto& val = json_obj.at(column); + if (val.is_string()) { + const auto& str = ToStdString(val.as_string()); + ParseStringIntoFieldData(str.data(), + str.data() + str.size(), fd); + } else { + fd = FieldData::Float(static_cast(val.as_double())); + } + break; + } + case FieldType::DOUBLE: + { + const auto& val = json_obj.at(column); + if (val.is_string()) { + const auto& str = ToStdString(val.as_string()); + ParseStringIntoFieldData( + str.data(), str.data() + str.size(), fd); + } else { + fd = FieldData::Double(val.as_double()); + } + break; + } + case FieldType::DATE: + fd = FieldData::Date(ToStdString(json_obj.at(column).as_string())); + break; + case FieldType::DATETIME: + fd = FieldData::DateTime(ToStdString(json_obj.at(column).as_string())); + break; + case FieldType::STRING: + fd = FieldData::String(ToStdString(json_obj.at(column).as_string())); + break; + case FieldType::BLOB: + fd = FieldData::Blob(ToStdString(json_obj.at(column).as_string())); + break; + case FieldType::POINT: + // TODO(shw): Support import for point type; + case FieldType::LINESTRING: + // TODO(shw): support import for linestring type; + case FieldType::POLYGON: + // TODO(shw): support import for polygon type; + case FieldType::SPATIAL: + // TODO(shw): support import for spatial type; + throw std::runtime_error("do not support spatial type now!"); + } + if (fd.is_null()) { + throw std::bad_cast(); + } + fds.emplace_back(std::move(fd)); + } + } catch (std::exception& e) { + SKIP_OR_THROW(JsonReadException(start, end, e.what())); + } catch (...) { + SKIP_OR_THROW(JsonReadException(start, end, "Unknown exception")); + } + return std::tuple(static_cast(istr.tellg()) + trim_count, true); + } + + std::unique_ptr stream_; + std::vector field_specs_; + std::unique_ptr, ParseFunc>> parser_; + bool forgiving_ = false; + int64_t errors_ = 0; + int64_t max_errors_ = 100; +#undef SKIP_OR_THROW +}; + +} // namespace import_v2 +} // namespace lgraph diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 64e380bd2f..0d80acb8d8 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -58,6 +58,7 @@ add_executable(unit_test test_import_planner.cpp test_import_v2.cpp test_import_v3.cpp + test_import_gar.cpp test_type_convert.cpp test_json_convert.cpp test_lgraph.cpp @@ -143,7 +144,8 @@ target_link_libraries(unit_test lgraph_server_lib geax_isogql bolt - librocksdb.a) + librocksdb.a + gar) target_link_libraries(unit_test ${GTEST_MAIN_LIB} diff --git a/test/integration/test_import_gar.py b/test/integration/test_import_gar.py new file mode 100644 index 0000000000..871a0c374a --- /dev/null +++ b/test/integration/test_import_gar.py @@ -0,0 +1,50 @@ +import pytest +import logging +from pathlib import Path + +log = logging.getLogger(__name__) + +class TestImportGar: + config_path = Path.cwd().parent.parent / "test/resource/data/gar_test/ldbc_parquet/ldbc_sample.graph.yml" + + IMPORTOPT = {"cmd":f"./lgraph_import -c {config_path} --gar true --overwrite true --d gar_db", + "cleanup_dir":["./gar_db"]} + + SERVEROPT = {"cmd":"./lgraph_server -c lgraph_standalone.json --directory ./gar_db --port 27070 --rpc_port 27071 --log_dir '' ", + "cleanup_dir":["./gar_db"]} + + CLIENTOPT = {"host":"http://127.0.0.1:27071/LGraphHttpService/Query/", "user":"admin", "password":"73@TuGraph"} + + @pytest.mark.parametrize("importor", [IMPORTOPT], indirect=True) + @pytest.mark.parametrize("server", [SERVEROPT], indirect=True) + @pytest.mark.parametrize("rest_client", [CLIENTOPT], indirect=True) + def test_import_gar(self, importor, server, rest_client): + # test vertex label + vertex_label_res = rest_client.call_cypher("default", "CALL db.vertexLabels()") + assert len(vertex_label_res) == 1 + assert vertex_label_res[0]['label'] == 'person' + + # test edge label + edge_label_res = rest_client.call_cypher("default", "CALL db.edgeLabels()") + assert len(edge_label_res) == 1 + assert edge_label_res[0]['label'] == 'knows' + + # test vertex count + vertex_count = rest_client.call_cypher("default", "MATCH (p:person) RETURN count(p)") + assert vertex_count[0]['count(p)'] == 903 + + # text edge count + edge_count = rest_client.call_cypher("default", "MATCH ()-[r:knows]-() RETURN count(r)") + assert edge_count[0]['count(r)'] == 6626 * 2 + + # text vertex keys + vertex_keys = rest_client.call_cypher("default", "MATCH (p:person) RETURN keys(p) LIMIT 1") + assert "id" in vertex_keys[0]['keys(p)'] + assert "firstName" in vertex_keys[0]['keys(p)'] + assert "lastName" in vertex_keys[0]['keys(p)'] + assert "gender" in vertex_keys[0]['keys(p)'] + assert len(vertex_keys[0]['keys(p)']) == 30 + + # test edge has 'creationDate' key + edge_has_key = rest_client.call_cypher("default", "MATCH ()-[r]-() RETURN exists(r.creationDate) LIMIT 1") + assert edge_has_key[0]['{EXISTS(r.creationDate)}'] == True diff --git a/test/resource/data/gar_test/edge_test/actor.vertex.yml b/test/resource/data/gar_test/edge_test/actor.vertex.yml new file mode 100644 index 0000000000..f30562352a --- /dev/null +++ b/test/resource/data/gar_test/edge_test/actor.vertex.yml @@ -0,0 +1,10 @@ +label: actor +chunk_size: 4096 +prefix: vertex/actor/ +property_groups: + - file_type: parquet + properties: + - name: id + data_type: int64 + is_primary: true +version: gar/v1 diff --git a/test/resource/data/gar_test/edge_test/actor_comment_movie.edge.yml b/test/resource/data/gar_test/edge_test/actor_comment_movie.edge.yml new file mode 100644 index 0000000000..cf23cd7c34 --- /dev/null +++ b/test/resource/data/gar_test/edge_test/actor_comment_movie.edge.yml @@ -0,0 +1,19 @@ +src_label: actor +edge_label: comment +dst_label: movie +chunk_size: 1024 +src_chunk_size: 100 +dst_chunk_size: 100 +directed: false +prefix: edge/actor_comment_movie/ +adj_lists: + - ordered: true + aligned_by: src + file_type: parquet +property_groups: + - file_type: parquet + properties: + - name: diffculty + data_type: string + is_primary: false +version: gar/v1 diff --git a/test/resource/data/gar_test/edge_test/movie.graph.yml b/test/resource/data/gar_test/edge_test/movie.graph.yml new file mode 100644 index 0000000000..e63ad58342 --- /dev/null +++ b/test/resource/data/gar_test/edge_test/movie.graph.yml @@ -0,0 +1,9 @@ +name: movie +vertices: + - viewer.vertex.yml + - actor.vertex.yml + - movie.vertex.yml +edges: + - viewer_comment_movie.edge.yml + - actor_comment_movie.edge.yml +version: gar/v1 diff --git a/test/resource/data/gar_test/edge_test/movie.vertex.yml b/test/resource/data/gar_test/edge_test/movie.vertex.yml new file mode 100644 index 0000000000..0512ea8ad0 --- /dev/null +++ b/test/resource/data/gar_test/edge_test/movie.vertex.yml @@ -0,0 +1,10 @@ +label: movie +chunk_size: 4096 +prefix: vertex/movie/ +property_groups: + - file_type: parquet + properties: + - name: id + data_type: string + is_primary: true +version: gar/v1 \ No newline at end of file diff --git a/test/resource/data/gar_test/edge_test/viewer.vertex.yml b/test/resource/data/gar_test/edge_test/viewer.vertex.yml new file mode 100644 index 0000000000..3ebc44d900 --- /dev/null +++ b/test/resource/data/gar_test/edge_test/viewer.vertex.yml @@ -0,0 +1,10 @@ +label: viewer +chunk_size: 4096 +prefix: vertex/viewer/ +property_groups: + - file_type: parquet + properties: + - name: id + data_type: int64 + is_primary: true +version: gar/v1 diff --git a/test/resource/data/gar_test/edge_test/viewer_comment_movie.edge.yml b/test/resource/data/gar_test/edge_test/viewer_comment_movie.edge.yml new file mode 100644 index 0000000000..a16ed6ecde --- /dev/null +++ b/test/resource/data/gar_test/edge_test/viewer_comment_movie.edge.yml @@ -0,0 +1,19 @@ +src_label: viewer +edge_label: comment +dst_label: movie +chunk_size: 1024 +src_chunk_size: 100 +dst_chunk_size: 100 +directed: false +prefix: edge/viewer_comment_movie/ +adj_lists: + - ordered: true + aligned_by: src + file_type: parquet +property_groups: + - file_type: parquet + properties: + - name: rate + data_type: string + is_primary: false +version: gar/v1 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part0/chunk0 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part0/chunk0 new file mode 100644 index 0000000000000000000000000000000000000000..2d1153951b274627266e05dc7b9004b97efba4a5 GIT binary patch literal 2491 zcmcgud010P5`Vc!!VyB?WfBM^kPrd}#0VP29TLD0LX<-;@k%&WU{=L|!i?x9Tmb?a zIUGPa)PR5|D>67bYY-4IC=o;$!~=v;)Img1bd=eL>wMqt>OcF>^y}|+ch#$URozv; z>Og+*A`l7cvEVzH7%Yc@00974=N5jD#K9^M06foF$io&RAU62$S|@nMi&T<-i&jj;FN76sVi*ubv}F{=g|mw8#4|; zXpXiptO>3UaVp7!B-XopuN#-0m$=%H5M^R!QCEzck0rqh1OmWgADNK_MiGVD00g7ih644c;nseL+=uIh@h;ULbE zA!dI9&7HBtZ7GVoe)X}wiJcxc`v#uAO{08`xOD&dyc2Fb6#wwNZ&_YS3vaB?ybG!G z|BB(v+iD>~=*A1XkN|)JLj4OfYXj_QR#t5c6PO7z6GH)!WOqDZKqlcgZI($Bm&wF6CLOFXF2dCb2Kb5n+;g)SfHL_(r=XQYA z!N~Fi{qc4c`(00bF~j@P^PfzmKs5AxYj?KrN#_r^QT(KKQ+Hcfm_EHBIP^)N3OOwh z5zcP@Fk!OQEsFS>Q*`&ILSaSQY+?Kri@ak|yRV<r0oxVfN_L>ay+y-4B5c3E`Aq zpBO(sxnUxXYWR)D(tY8p$PT=x>U>?%Z>q%=j}7WDj>kuw0?N`4PL{URXZ0Wd8YGrl z$vSmEpL%G%u?cCqA-e3MbARvojpJi4Jl?m9jy2V_&B<7bXTJ~(h6ZXa&qnP*??^k; zXB_5Iqcf}8RepMQupz{(ta?j)+P#dR?~psX*4`LBNzqlcSzoQ0L~ts%G-#I8mvEOQ zkwGy#j2MvO&?9XN9rn@AG`y*d+?{o1s@UJLTk_g}^=s4;+Z2sY!tH+ugr};kpDslU zKv=;5MRVNKSqG9$|Q16NS#~cfbFKB?7~-#s#(AaJT39<@T>Ajc2LdjGfbG51Z^LwQ*|OPT&1E;yyS4%>ehB|&Gg6;W6P`A9>ptniC2(vG z;BiaM0UaiP$sTHwe>(2Kg9P!(iizJ-avY%udT#`(jsFW2vgXqpY9!33$wyH5oCVohpmyz6TCn>LfRmm%Uht^F~E39A)zlY!o3 zVJmYrDx&G}SeNb?F5m=9BIO&_1s)OXcN(YZ5$2BKmCJoHI_ima0)2f^UT#C^i4{$< z84+L;(HNuPY9xIpNTE@=hi9Vwlt{5yE)3Fz<)R!zhA-E|gt=_EkUDc2t{phdHIx@% z!d4Et5>DlSx~T5l1J0d47V~Q*YdBV1qVh>J#z^G~29^nh#y?S<` z^>ijq_Mv$;*RbT2{ax6NvTH!j{X+h}a+`Xwc@PMC4zvic(HDy_G4hjgt^ZmXGG*iIM_Y|~?%qG^snM>6xa+v5rmDHCQ6OxjPDiK=t zk?&kRYRuVd{g>&6(Q$e)$>!c7*vC|1-lKj2?0u4w{{!qR7ZKBm%o_yeFcw1l&(mqX z@_tSQzJ&JV7487ZASpU7c8e55Lhx@7|GdQf5BU#c0I2YgDP;DaS)cyY?IBL_AQzb! z;+(YwgizE(scid>*ktGE#6)MQOtvkBwlh|i6u)gNZJCR!iz}H;0RX52;m}bALf5u` E0Y4pA`~Uy| literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part1/chunk0 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part1/chunk0 new file mode 100644 index 0000000000000000000000000000000000000000..5f140146ead400586be3c630b026972f5b876efd GIT binary patch literal 2455 zcmcguc~nzZ8o&455Rwoe1YS%+2nkDouozYm0YgMVgc{id6w4NkC>TPpxX=I z?aCt}B2Fq5d*j&!Gqd>}{8tIrHK9p)#-hE5X(`(}S}$zNrx{y#E9(UZwY=;Q8aZHDXXyn8YJaG>wT)ux8Js{Iu^^0sP7A>kN6 zL`wJ-68w`v(Ar4*$P+&$pNly;BUU=?>3+1i zB~BzMfX+-8^yho)J@)k`i#@34O%1lS4XH0oM~rDMJxD!&|7oVrp=Yn&y!(@?yA+rHXOV%Ku6qVs&R}9=4E8nU%c|S zmwM1t?D~1u?juh;u=xub@BK_cj^M3643lAc-v9#`6^pqe8Mr&ag>E};2(cyi^^qqa z!%A=+|XvL);`krlrMK!11LTuF!V+CkEU?CeI z!fa6(;FUPLg|FJU9gb9&BWm=+>0AAMlr;1{|)zPhP>5I~O4^3}=tI}e?0WFlSXF?-k4iDNns&Kne#d_eNipVt3&4FOemv>VYGM zm@#h-8A*~hdx4mdzx%??Tx@-J1VXR^B)}#GmJ5*4G?<8?^*m-&zjoNB2JS zpYBFWLg|>%YKzr1dsyj_#qOT`+`X3?lUI4<$X!e;!maNt+wjoaAR{#0s&-SU)VA!D zSodn#yhbbcdu8YQ9Iw-Cf_5C7x==l8K1I}ycj)2$djA3ag5SQ(rcmFf0H&e;v6XPn zKz{^sW_^G@^(%l;*wVw&^kc9CT~1c+-pVq1#WihvsMZgQ=r!lta=S@{qv)aH$YQ8wi8kMA=6y zi`nkShdRl-0zw1}%k#GNSOrCjqg&O~FplF2m)AWFamFE9haFQ@yjqDA~_; zS>hr);X>(OcxKU9(pc3P5dmE4VtOYZ{!)peqBU2`-HY$!#JKLfD^uI! zPSzJRPlp#CUal2ix&F2sIo!<=v=(rLk#%7@X1x_by_`{3CqCb!ro==*IEY_cwYROj;clVTUWZNX#qgjm%*V9=J%MG?Ur~=^a|;9KGuVu4Jnb} zhykBt3WT1-ewP>uNE2n(x0N{+d-+fHS~v4NeJPU0sPW;BrQGWog7(RRi?njG($w|z z(Q6T}xm!sbm*UP8>L}fG?S!Cft#!!89%wnxCABq6lgqx91uYie^IN(2so@g7`3iCR zYc=;q1xX%78w6#048Ben7G^(|<$>tZ&W4`Vk98v4jE-_iG!E9*O4)Wj4`PznD27&HF^NuT0xj<-8tlhYHGij;VqL=d_)_HonrFY||F z0MSY~JdVR3*>V2R-@|HLK$Iw=u)a4lA!x{46|YXqP-q+zRVv4LwR*!Bf{hAw`q~Yt Xg1Jr-Cke-a2LLg_atMH&xRU)FdyD*q literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part2/chunk0 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part2/chunk0 new file mode 100644 index 0000000000000000000000000000000000000000..d0309a82bf823b303209d1d797b328dd7e72a5de GIT binary patch literal 3029 zcmcguX;f3!7Cz_P5CVyigd`*wAq<9q5W*A?6_ZGrQ3}XhBr+pP44~El17Vaw5VTRz zA|QiPD=H5aEdmNCP+Js1!G&60MG>nOwHDhKd9UjY_Rss%z3w{uo_+4QYwxr6`M%Fz z9AHbw(Z{vu!^oFj1?hka0Pmd5`)C=YYXCb>BkSnNM4I>!{(IiX0aPJ3|8 z&i6BS<_0I4Wr?SFAuGqMVAl2b?(n97#)>94gF;F5?uO2hL_1Z{QOSN!ld}9rzm7H9 znqDhnEDEUN*_w3a>&&-{Y!n!GDDgxpn2A=Z5J{r&zWNFBt>f13j_7}U?j-&|Z>*RMn zkU2Bif(4l2?(Rn~wzyguX>rH|ns%;4z01s?#J%prw!Pj*_w>fv?e`^f4a~_rtSM;j zcV?FIMKmjpHI+}b!30bzMn!)-)t>6WbEFB)oP3=ni)k(z7spDwpU!N(6!q1er@w3` zyULbps#7MA@JjI!bs2Lhc$zVa+}+t8n5P+azc05U*2~TtyD=f}jTIhb`*CXsY&wqR zNCtQole{KDE|n#U<$>}TuMM$rTj(T)g3Kt@WgH-IvoS8=|2b=xmAcUY9Rc+~RyzRH z^D+l|pSCZ(1OM;FBakL&Ajjk(XoBEZ9%c@Lvd5qQ^yata@Dsm)9hHL*brDx6O3m8e z^7Aaj@DVBL5Ri2B7Fr7zyGHHEsyowiweR*Yf?5kK7kefo$~RZ+Yxs8P=?oE(^q6d8 zFTZe^JiVl}{Lt}J!w+AvFt*Dw@z%_oylWr}8i4t35lvrrkN)`D0=fn(tNI*~IIf}f zV%O;XALB7Lm_mk_6L6LUZpWkLC^FSQWGX4$$8k0_XL95@9H&?Rqd9t4<7 z40ql69i0RGK^{7OEiEh!oF(TjZW%fN4-J7L|F1FGO-zHo08S}zCNXfW^e4z%wr3z#Gnlzubz zzy(GZs%l#}$bNCIHfCl0=?*fSNI~&1{lX6P@7E26zu)@H_z{ z*@7V)bd)3$5dX{iG^`TLT!aU}%6E&P;OwIiRI?6a0ORe-U8ip9LSyUHv>*QdA_7SZ zi{2PuF5vRpBse~aG_h-lh#^1``}aTQLWk0$PhKxXi3MLYo@gGQd5VH8_-UrxF8hS^^ zL$B227U>Jt_Nc_Qc%(s08Er3L;h|ixbnDx<(5#@$*lib+BExx67y76iHonARmArs@ z|E9GQ+WV}+TV#_DCx}e4w5!;71z5qdHyfz-s*Rs_P`KfKd!cE9&LNjg1%%cZxau%3 z_~)qygWca6iHt-z15@4rN3v0y<&wiIulc0dVDVO*1y$Fpg15Rky%*IJ_dBdN=xVAk z$4H#*E@)R_u79T6IjD%H=@OYIri@o#@2D2mXI4p$TC6tLMEIr)XSK^sf{WSb2@D84P4GSq4(y-N(%H)g)$Q+*cUfV%bT`^z|Qkx^KnYSk0yuO@H&}&wINpuD=laG zMlR-mTT~Evi9fMU&%-Eh$82^_^UD<=Pso4Q^y-c7_-=&~rxQDf7ojK|(O{`cQz}6k ztroM=cqs)km_i!mc_^~S*Z!h~t0v&lqVJuzCr0<9f(Iu2O5QliE8IzQtUMD!$+=pT zBydfUa%!(Rz7$@M4pzo^fN{>tSFN2_JPenMb`dS)bqk=G&0dGX$!tB6d2Ny);km9i z-(vN{SItzMk9aiPRbDu6wTcF zr6JOPr7#U9cA55=FJntCj4*mXHRY)gz;TlM1;?C zimrZTK7P_u$ukVaq*s%Dor0t0H>Z~E%ZPiO5`cejv;MvDWXMXB9s9gQV={hO+}RUHAB_@7LsL&$?At}A|w{+J^<)SaV@7Sr8L)^lh{}lS z>4;{D3ILU}$w+X(6i9FYm4ks8g9a8+pcL3-zCs2DCLkw^k;#jJdFmmLxU$*P*7fxo6;JlI+Zie8}#(nQH85eJFol#8$D10HagBAhD>hG_^!G pxu8Hdv8X7&T%jzrs5mn}Pr*{pK+ix@M}~m`h!}!^xh?>hi2>EXzCHi| literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part3/chunk0 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part3/chunk0 new file mode 100644 index 0000000000000000000000000000000000000000..946ee956358c673f1998cc680f68f745df8a0f1c GIT binary patch literal 2583 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 RmjM9i11v@FKN9q|_9wiPSB3xp literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part5/chunk0 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part5/chunk0 new file mode 100644 index 0000000000000000000000000000000000000000..dbc7776644cbeb5e12149b46885f68c8103bb42f GIT binary patch literal 2639 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 Srn=Gr0B%4O0sz9{pVF_CRtH4@ literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part7/chunk0 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part7/chunk0 new file mode 100644 index 0000000000000000000000000000000000000000..2dc13a3b8d768079a254c5318b381b38a22ea8ed GIT binary patch literal 2525 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 literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part9/chunk0 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/adj_list/part9/chunk0 new file mode 100644 index 0000000000000000000000000000000000000000..ffa93f4d9caebd438cb6fc68b60e23dcc2b915db GIT binary patch literal 809 zcmchWy-EW?5Xb*}dxljkj*waI;J_<%vAD!2q);r3*aRZPD7JFM!&sP{m-x{N3OtqEmv>_PdLcK7TOs8ZauW@tSY~e22qe z`d*IIPfi_@h%M5{0q3w+2PK?STPdf(pP(KlMu2W~y5FFECf}L5F;$Oi)ZxT`lpBTW ztd?MBI*n#{6p*Re=ZxXk{pC)3ffSDG_~V<*IG;w|aw(LMeV)@}nu&t=_$2J+8&Q-G e;<$b0orZDeu-)>O3&ldw@m)YK)EQ9IpX38BLwbJz literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part0/chunk0 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part0/chunk0 new file mode 100644 index 0000000000000000000000000000000000000000..3ec532a671e3d39e311ec05ed7cc22224db5f0d8 GIT binary patch literal 7662 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 literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part1/chunk0 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part1/chunk0 new file mode 100644 index 0000000000000000000000000000000000000000..05e5e10a85edab8e72a801d20e16265fbf6f5aff GIT binary patch literal 7444 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 literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part2/chunk0 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part2/chunk0 new file mode 100644 index 0000000000000000000000000000000000000000..1b221d21e18f9d98a91c443b7c33041fdde48962 GIT binary patch literal 11418 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 literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part2/chunk1 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part2/chunk1 new file mode 100644 index 0000000000000000000000000000000000000000..89141ff11634804a446d0f38d8af1dc10b7b3be2 GIT binary patch literal 1088 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 W)HK_V+K*C!{Re*bZ+HD$iSa++CaO*V literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part4/chunk0 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part4/chunk0 new file mode 100644 index 0000000000000000000000000000000000000000..8d8aafa0194329c741047e14243ec230bd287434 GIT binary patch literal 7333 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 Nna}TTm)!y7{{UO6Ah7@d literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part5/chunk0 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part5/chunk0 new file mode 100644 index 0000000000000000000000000000000000000000..4cdff177104e5d66eace0595a4978c5666067ec8 GIT binary patch literal 8983 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 DDSb?1 literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part6/chunk0 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/creationDate/part6/chunk0 new file mode 100644 index 0000000000000000000000000000000000000000..0e8c74b9e66e242c6d10a6d0c9bc90eb7782c1b8 GIT binary patch literal 7081 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 literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count0 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count0 new file mode 100644 index 0000000000000000000000000000000000000000..fd12e09195e123323b2495aa2e39f93c367db9f8 GIT binary patch literal 8 LcmbQu!~g~W1nvNy literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count1 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count1 new file mode 100644 index 0000000000000000000000000000000000000000..a384772a7e911b1c27bb85568eae1bfbf2d1ab78 GIT binary patch literal 8 LcmZo+VgLgG1U3MN literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count2 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count2 new file mode 100644 index 0000000000000000000000000000000000000000..255c67ef16acaa78348c24d38406bbaf8bf0b09a GIT binary patch literal 8 LcmXqIVE_XF0n7k8 literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count3 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count3 new file mode 100644 index 0000000000000000000000000000000000000000..a6f3cd580accb96cadd1cf7a29d50304cec2a00f GIT binary patch literal 8 Lcmeys!~g~W2bKWy literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count4 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/edge_count4 new file mode 100644 index 0000000000000000000000000000000000000000..0aa991b93cdb44e6f7c266b297e30f712a04e04c GIT binary patch literal 8 Lcmb!##%g4Br?e85xw+GAY}KYMTlb#3aPip>Atn(~NohF+1CyZO#GJh1ipI8%X)|XtF@S;Z3V{`T z55xtS-Y_dDxtx$uRB~zwYiDO|Qs4liE7O3^6g|NxdW%s<^c170fGC?Nn~VepOuqyN z#2f|&F$N7RqCi=Y4;4}rnSq{TU^vCd$S&Q`;9#I2!o%+3v@ya!s*jz8snbJE#Or9$ z!2~18vu&4OR@lrx&n_a=>#=mw$rPiRek-PA9nIPqr!S$SHv3|R>22QWmtU4x$DRMq z%+`8Xabt#!+(gf(lWwvwFsPkil@Vo;G!_xayMMjxMUX1ARwT$ zYNKPxwZnT;+MF~ZWSE`*IVBfgk&M>%xzGNe-*L82uY(XrmIlwVmW{`Eig4VyEFItGTq->Ute49J6+8-s^rD_dDhw6Vr~{DA8mix z^1SE=qu&aF3H%Sl1(@D5GYBy3Vq#!n5SS3*xW6|?tM72uBI6G|Lb9R^q9+(dZ!zkK zo?;Xg5M>i(lab(PVPXIS2@VL&z#zt;fkhN33-YEyiXt-uGmvwNk&#`xp~1mGL4d1` zS!rT`js)*<)<)=ro&MT%Fv)0U zj@#m^Ip#5b+aG_e+IOE{f`_a9NYcd$7qzLURX4w6VPH_Z#401oB55kXz$Pid7oT2~ zSdigZ=uw@Rr|rD#zBfVBz1t%#~{kY03-x}6axd$79CRt3AWK#EFK2)_0GLDpY%H;7 literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk2 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk2 new file mode 100644 index 0000000000000000000000000000000000000000..6e5006e58bb5fac52001a2269938458a1d143418 GIT binary patch literal 667 zcmWG=3^EjD5uLy#x{b+4bP=N{gAfCQ##a5m2_1~REDTTB7#LU>lo@gu@)!yjrZCK4 zn8~n>;Sj@FhVu;98E!G$Vfed0l=l{%^ z90Q}0(=swkYA4QKd-=;hMrLLnF~8vOn52}n&gru+zIyjTl|{ppg#io#RtOy6dmt{r z^pg3KIz!#+C?$ngVSVW?N?`EFkWG|9^aP{mEk+&DQ;eblqHLmUG7=mx-4YxSQy3V; z7&Nem0%bv7Q%F%{W?%+#PBAjFOEWk)7$^vEupVZd7@#A;d;BqDr-$0)lPy6TV+B*UW0gl;7R&_+oaNg4V% z3*^63jA|S}Pl^D;UcMl)sIWA(L^rvhKsT|dD8F2xEVZaOGe1wkQqMroKvG5q=$A7< I8~{v~0GUvqB>(^b literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk3 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk3 new file mode 100644 index 0000000000000000000000000000000000000000..726a0f5d12bbe81b7e120f912484756c9a9fe8a5 GIT binary patch literal 678 zcmWG=3^EjD5uLy#dWOkIbP=N{gAfCQ##a5m2_1}2Sr|Uo!tco_H?gc+n6G#IoP z{22Th;uw+{S{b?-`WR+0%w|}^u#901!)}I~4EGrxGCX2<%9H4U9@<~@|9~hZr=Og>Fc-eKQJ+X zLBI-u6?_lG1(@D2D=4|R9JwqY7`W+#jfMb=BLtoE6lD-S!6mHeD>R zQ4s7*aatLnH>1aG^TQGwc>xU(p-wlIppzv|OG8$Ru6|l|Flm$I+O*vdi+0`3JO27- z-GK!G7Aj)B?kPb#V~l3|F8|EQ%D|v@fmKG7MbcD&flX3^FFw5}u^_{-$UiNuIJHES zN9+`%*e@Qj6Rc|AnAA8(@rI-hF!mTknHYeC0FYu}0NSEs${@j3oSc!Gn+TF&QDs86 zk^yL=q>Q8t{hS5z-zi2l4xlGRfMG9RkXTe$np&cpTu`8!SX7i>u27a*RGgWgr(mgP Spl2W{BLnoy86XY-rceNZCZ=Wp literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk4 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk4 new file mode 100644 index 0000000000000000000000000000000000000000..04b0b64ac63c342b137b18fad94623892a2bfc3f GIT binary patch literal 682 zcmWG=3^EjD5uLy#dWFeHbP=N{gAfCQ##a5m2_1~AtPD&ZavBMeT=PHoFf?;jJ^S_j z&hne)%$oks8?`S-O>UB7T$izQ=JbNIq3`PX|LZ#jaeR51VzA9gI#{n{hjgx5^WK;`&Z|?1~w>KU?S`*&B+OPN5mX{aH&(AT>-gaHxyYJ5p z!$*hP*tywi0#*og$UP7jVEVu;7#dm-8XCHE)vBP|2Yz3@x_{TN@ag|T4NOHDL{Bh^ z-eS}dJ;f+0Aj&4nCL_U7$HV{z5*!ekfkBKx1B)n77UWZf6h&qRW+3MjBO|+XLqmdt zh6GJV{qnUmyLcF#nZH!nu?e*8D zqe+`2*QV`$SY&lKZ~Nn~HTDSs7Aj)h$CQO;hUiT{v+Oe`D+7bt4OSUZ7D-b91~y3v zzWDT_#DWaRBLB3s;?xpR9l}Sr~*o&hOSw;v`tj>iofyEFR$M$?mM)%^7%5~s*;R?^K&iZ|80wj zGe^CTGIpsRb5I|L>WX+FpAz{ z)Db4hkYX z?aWLQJv2nRSr=Cq^&Xf z5k6*%ujXu%)?0r2W7Xby@7a0SS`R-g@X(R!_ecra$-=;(c7;_<t21fPqa?f-gS3 zD6t^JvB*CytvIzrlt=6oqu44Qu`{e{znIiGNb!cG4lw>0M41?XgaD9YU;x^pW6B`G zR-BxXnwtocVNqp5w~_&9qojx1^4}>&H4dOBMSx*1UyxW-Seja*n_N(!n^;to fU#?J=T2!2wpQm7{XP{>wDI){)%NZaJ0H#p@0kpLM literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk6 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk6 new file mode 100644 index 0000000000000000000000000000000000000000..0e3b49994ae01092be90e5fa79a031619033cd18 GIT binary patch literal 673 zcmWG=3^EjD5#7KkdWgwKbQ+^5gAfCQ##a5m2@#BYSr{g@%V;#5=2WPVa8lrLVrpMPd-bXp|1GR10PfacV!qggxSHq6K|TYNRg zJjQSN<(Fl9;?_U^&DiX;u)sq{s@Gk`XeA2+gW54x8BrEVQvn7xNeRCA^rFOq496n> zw6x;X5>XzpQ;cG>c*ORxs=Z-S;~>Qwk~+YMV-RIx01^T~ih%)Wi;gLS1Y2=(Mrv*% zNQOm~3EfHtppB9;k}~vj7RZ067}Yp{o)iIwy?jApQDJFniEeU1fo@_^QGU5XS!z*n YW`3T6rJjMFfuxKK&@X3zH~^S90jB7#3jhEB literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk7 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk7 new file mode 100644 index 0000000000000000000000000000000000000000..b140d83c99e16e31c3fc3ea66a022eb8f5665473 GIT binary patch literal 678 zcmWG=3^EjD5k0^udWOkIbOxg+gAfCQ##a5m2?>l(Sr|Uo!tI2m{tcp3N^1Q|pa z#2KU+=_&xTp8RMJQ+e6QW!EA@)-&l${E@jIv8d!Y-BjjaD(9%!###a3{M#N z7#RdaM8##4^bJiTqpGTF>Kj*XJaF*Pi8JRfU%7hY)}6Z#e*R}-Vw131wDH(eCI&F@ zULi1n|ADvw(|cxy2`mg83<3-e4q+eim1lQ7-Z1M0kBw@SD1+z;M$uc0I-;i-MFm9J zMA>8{IAHoEI3VUQFo-c|U=an%f_$lvqR7m^4CI_*WMr3aXh?9-klP4!U^@md2j)Zn5r@X4N1y&hR7D-b91~y3vzWDT_#DWaRBLB3s z;?xpR9POz$dV^ZTF#T$}3z}RCDWnusl0zis^0ceYkDT4%CadJj#ZX!sA zMU@HNN(P{fk}{Gq^m7)-f2SDLIDnoM0fxPNL1Iy1X=;gXazTM^Vo_0kxk6cLQE_H| Wo`R*Gfu4b+j115(XMi{Wm_h-Kj-G1( literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk8 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk8 new file mode 100644 index 0000000000000000000000000000000000000000..f52149cd4049b3a5106112e80bc4c49c2496f8a9 GIT binary patch literal 677 zcmWG=3^EjD5#7KkdWy+MbQ+^5gAfCQ##a5m2@#BUSr}5-8Gr&}4AKl*3_1*Y42BHG z3?>W~4Au;e3@!{A4806}4E+p~7-lleW!S-Ris3ZF8HO7Sw;Ap+JYsmu@Q&d}xrnY5kw(i=q_wkdbl1y?6dNy8u3CSs`WtBZs7p~v2a~Bf>786{nVn z@`#;c6r05(c8pc+3zHfLDc+FO0Y)B!C=&ya5CBpP3_x3SOc^BDijy-^a}z-_EUHZC zRx$u>l$4Q_p`Wur{yW8}#sT!C2r%sB3lfV8OH)g9lM4!T6N`%S%N5E}i;6Sz^As%g T4D<{nWn_SUIRnH2zyt~aSoWH+ literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk9 b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/offset/chunk9 new file mode 100644 index 0000000000000000000000000000000000000000..52e6c0a2b0f34e4ff6d082e68d4e7861dd617941 GIT binary patch literal 439 zcmWG=3^EjD5j7CC@)2bdWe{Ru(AcW~S3zPa149A>12Y2)0|YQJBs^eDU=(E#6%kd_ z5#G$Skl=u-WDsM}z#3pB8V4y>N$LQ-#30JV03-x}6axd$4joel z3AWAVjPk(k}~vi6Uc8IY8*iSi2%b!z96xvur#$qH@TodH?gQF fzg(d#wWv5VKTp9@&p^*WQbq>oj}t%~0E{vKeTF_E literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/vertex_count b/test/resource/data/gar_test/ldbc_parquet/edge/person_knows_person/ordered_by_source/vertex_count new file mode 100644 index 0000000000000000000000000000000000000000..9830fbeab854ffcc5bfc947f408dbe87b642289c GIT binary patch literal 8 LcmZo?W&i^K1XTcw literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/ldbc_sample.graph.yml b/test/resource/data/gar_test/ldbc_parquet/ldbc_sample.graph.yml new file mode 100644 index 0000000000..aeb8691f60 --- /dev/null +++ b/test/resource/data/gar_test/ldbc_parquet/ldbc_sample.graph.yml @@ -0,0 +1,6 @@ +name: ldbc_sample +vertices: + - person.vertex.yml +edges: + - person_knows_person.edge.yml +version: gar/v1 diff --git a/test/resource/data/gar_test/ldbc_parquet/person.vertex.yml b/test/resource/data/gar_test/ldbc_parquet/person.vertex.yml new file mode 100644 index 0000000000..4c4a277fff --- /dev/null +++ b/test/resource/data/gar_test/ldbc_parquet/person.vertex.yml @@ -0,0 +1,21 @@ +label: person +chunk_size: 100 +prefix: vertex/person/ +property_groups: + - properties: + - name: id + data_type: int64 + is_primary: true + file_type: parquet + - properties: + - name: firstName + data_type: string + is_primary: false + - name: lastName + data_type: string + is_primary: false + - name: gender + data_type: string + is_primary: false + file_type: parquet +version: gar/v1 diff --git a/test/resource/data/gar_test/ldbc_parquet/person_knows_person.edge.yml b/test/resource/data/gar_test/ldbc_parquet/person_knows_person.edge.yml new file mode 100644 index 0000000000..d7b81ea12d --- /dev/null +++ b/test/resource/data/gar_test/ldbc_parquet/person_knows_person.edge.yml @@ -0,0 +1,19 @@ +src_label: person +edge_label: knows +dst_label: person +chunk_size: 1024 +src_chunk_size: 100 +dst_chunk_size: 100 +directed: false +prefix: edge/person_knows_person/ +adj_lists: + - ordered: true + aligned_by: src + file_type: parquet +property_groups: + - file_type: parquet + properties: + - name: creationDate + data_type: string + is_primary: false +version: gar/v1 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk0 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk0 new file mode 100644 index 0000000000000000000000000000000000000000..985e3fadd1179ab89213b142669201da172d9944 GIT binary patch literal 2113 zcmWG=3^EjD5$)g;eZ=7-x{XnkL5P7tW2^q(gcc@SL56KAX(|jCmof7Aev^qT;t>l> zdr|W+<=0bdDdkK5xnH>d-*5Ltpy|ZlFoqb0ScVA2);S!@uU~k;zvE8y4`tD$DUtJY zCpXPHsGli$%3yy>)!B#rYx2ajr*qmb4Ql7!f265X=aT--Q6w5iOe5 zyV+|V9Xf44Q$*y{g4^q+O6=-$5;@fOg*||Or)z8$Vpg6MnHib;bykGfzvD}% zK3R73PR_sM`?%YG-(0R4adplQ#cA#TH%`op()=_*Sl7!X%#N2otFF;?`I*V$Tur-v zR?eLNh;yNz`!D5r9j#OL@h|-luGP{pJ&ZOYs9l^w$Q`+Ew8gq@I`Sk zS|}JeHAtM64&ZT~-0gZJPXXLYU3y32;y*L_tEhkD8T zgNApFTGDntzxLbAn~BSgxxT}+d_sjyxX$*)(I1Y@JhkP6`)lXy_+nK~r^d34K35d( zF&*w)^lX)puJ`oTmi#R@Ji0z@yZ37P=XGtlk3@E@%PQiJb2|HRx}}jQgXjrH(OZl< zAWA@#O_WW>j6s7nDkC*7U4qq7Pr+G_0g|i~QWTjPn1P%VjEwBk4Gjqn8WMaRElCG6 zEaWC|I2tVs(GmA)TX3_$Y97Caiqu4}Wx`rZqc%pZ6W39jU7FE0>ukZ{rzO^L=f5+v zwK^vmCfO)W7I`{pW`@;#-;5BerD1EsbHccR=BsVumJ#KVG!#*Kx`GaS`Vih2c|nEb%6PSL6nIBNC*Ha1_mI11&`h^sVJG7r_a27!py|T$#8R>oYL)8@<9y23_%P(%@TJ{ zjBEbX`DrWDZC|5PhAA8V+AO(IrZZVV?cfHUnEA6rHtIU8JhDysl=F?c7qU6lH&%t^ zn0qbV)sf3SH~F>D#=lE~PKUYWFsH22kG__0n^WvIV`W#-qCG8dk5^f34bQQ^@$Qb| zYthT1Ip&{)LoFG)5~W^TKD}Y;`BaW=iod&^t~9<~-Wd35)ASp8aV>A#q;BLr(2{y0 zDigI%Ia&PO#^s%A2MlRSCB5xKaQ-3n_DoxC(} z-K*Oz>r&3y&dM~Hb$&wy+k!7f=O_L6);c3i-*>*j^SGmYy1?|GJms*QyvW|iK8vKj zJ54+9C!UuQ&(-biU|!V{?c=uj@6yk%KVLA{{xeed+L;#}c+va*3?JiJ8gKhFZtY`D za``E>yVlfmNA-LcXZcMwPs>AY*gOwxoOZT5?RVP@UH7{RujZtd9LtEbQxs4)pQhn~ zJ(;saWhCZHa5^TXB>LFfRleXGPPJhVS zeKKuJ`;xQ`cMB}<_APsGm2dCugOCKjF;zykSUJULVT{r2b5|#`fKqy!I3lHUdr(#X)DxzjSpgaJr2^54TGBAKF%1z8kWdqV_sUQ|GFmy!i zP;)#BNJ4@Qq5u{SVjCG?Ii68^TJi7Iue|rE?e9%r%A)p565(>T^whkR)FMa*-NGn# zgHi2^gxVqru)9&r#pY;9A5#Viw&LUrpxZ>*7({tgnUHe5Dua&<&^cgHcnBd2LM?|1 z0gDJp8A%%|79rG)BdUd)*fj;9U)4Co4v32Y%V+t5#G=B|)Dqp~f&$&dqN4nAg|gJ5 d;>`R!1xq~xJp)M_U?@TmLop)*LjbVx005B!0Ez$r literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk1 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk1 new file mode 100644 index 0000000000000000000000000000000000000000..03a74e36ec3fb181aa1e83fad60a4bb3e7940be2 GIT binary patch literal 2093 zcmWG=3^EjD5#7cs`iR3vbPb~@gAfCQ##a5m3DHcpf(&MA+4>3TQ&|4%i2why`d!A7 zxsu6Vlf?c`d7*l7_Nl!a9m|w2C3U_mWvnXgu&4;RImPTp1Vao%0)tfJPsxJ&lVX(Z z_J~RTbGdxS-1YzFTMKp?dHfZ_yvg?;!f%#7DW8@mzhAi6vhKNR2>awqpR|om zExMoRwe>}~Meni$?`0g0Psx%reBj=YxAM8jCu61yu8&TgULO$t%x`UTdxE_NnrCsYpqH<&6U^g~=)Gp;T@Xsr>`Mhnl2>lY;Q$=$F>G}PUY z`lNitG`70*ufE)3vfs;8eNLS}G0jIIQ*B_E(5)g_nP>G8+cbWPa$YRjeEw5R@s-PLS4x_q+#G%h9C%wi#qPv; z0fnFZbDphyqWAys0!O=0FE_Q-2HNpUv;y4hnOu|tYX5XMrxY?LMlV&C-oH3FCd4xI zxObI)9x~<-EVe*f;EsJMW^D+DWl3_5I`c1W1#p2tgjiOnP zmpomjd4_9BXidkz)-@4Hv!bQ-6%3pjcnswyh)mlb<#fza(&^xD-`NK>uV)(Vk9@DF z;jF335WS$eR`%qot(T1Ml`Y>rQ{Et)G z2Qw_>CUm3}EeO#O_i@|YSztAfUqeM|qLR9xbh zn42ofBX)vO>@y(C(86j)s{#l<6GTc3F;(w+ZuK$c*wq5*q-*Q?n=l{8Gr@Mqc z{f~_4|L^HqV^POo*(OUh+-Xl-hav`rOt1js1iCSxJ;ZnCjgv@=X{oAG|`6&Cthfj!^ag3iXM6nYiT-@$u?A?3rr zDdOe^e|8)X-?;N_q+;KP2;s1W&OG1S)_xU;R$`vE&#h6h?416rbqyB#1kDUuw)wEd zsXU*&!{Gib{STbEZ&M!0U7DtWJvp;QmF8upCrYq8CZ(k2{HB)SS%%l8|77D1?QB z*hU6eu4a^;rBpM0id@*@#X8?(_|#5GB3#avo|>1ES_H|2TNuS|FsdDqQ2QhfayP2E z*c>hCW6B`GR-BvxbfYL6gD8(G6H?ArW$=*!ItMHY49wa{vGU literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk2 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk2 new file mode 100644 index 0000000000000000000000000000000000000000..45d40c58ea35e555005aa97fa88fc97379996bb1 GIT binary patch literal 2078 zcmWG=3^EjD5&g#_x`D$-bQz;4gAfCQ##a5m3HD5-0t{_W(^Le`nlU9PY+qyCIZypj zCtt^(y*XR>_gFD7uq;qu5YJ4oeUu^}#Sq01$FNhOJ~^?(Q0UyDK-(V+d-Zm_zO-;j z{l*?K)p=j+H#|Lbeu2!9{WHpzswM>{T>Yd!FX&%u^Vw7>gOx2m<}VkGd3NJTcmID+ ztzD{}TPEx5da3l6B|nSP{L~VA1o2{!tfw}#EGTj2w&x1_n={is35EvTcFy=I^ly3YR=x|qy5_Sx zCpbQ3Kk&x+hvbEg(Z6L}6F^+}s_!Y?0}KX5WjRYocG*B$3AQ|v;2aL@Akcl2oHH{W$Zn(3E9gazv| zyt+<_s_$3UUK+t~eVPN#Q8rOF88ZeAj_~}fn51y-ErpC?#0I57w& zJYksVwMf%sN|m_-ToC-1+a!=b8>Z?2a&zo9Ov;(#;Y(*9$93 z7=h-iHE_#_@<^HrFtABVaHeGz6_@xW=BA4Bh@D^*+rlsQgG=oehZ+Z_J0*31$(})! zi2+Cm04W9rAise}^c}m8=p3YMz`&Ht&yc2+pcjxX!}8((@xTA;mAKNDeaX0gTDW-P zGp7PBQBD@YthDqjH@+Uj^Tlp!wrJkm&K|%J$PmsTEYLFLe&7_P`ryDy*%?yJfA~E7 z<)@Z-o;rVF&zkNRp36VjcTTNe*t?RG{7!js3~953~N5>w0X`!}=S6Gt7R@ z_ddCQ$E>K=7gXw%-#Y17ZR(k>lGS6OL(5`W>lQ~g1@%a%Q7)DABySt#@{J>k&$ z1qDi%Hvi#GnfvasN}ntXmxh9Y6Z5e(w)&lwN4%#Me&H`txqoJ&tMPv0%`aU_`+G0U zo|Mos^WxjUFVQz-T^6duZ58BbyzW-h)so!v_P+a>E6v}`KZ?sfcqTS=$Kl_LZm@k7 zQYzF+?io$Vo&_t-nF=dcoD^AV; zx=oagL6k?82`Rg)GWf^h($ literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk3 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk3 new file mode 100644 index 0000000000000000000000000000000000000000..fe70911fe00416e77c073f2fdaed41c2f0c683bc GIT binary patch literal 2090 zcmWG=3^EjD5xvGEx{1R_bOEC%gAfCQ##a5m3EE7x0t{`7Qw;(#r5Qf_|NmcKcaNw+ zF#ET?fA0Mg`uTogQ$*Lgjccpfg0}>ofBJnvD$C+tos*}}R)sJ`F+?!@I(Fb&(u5mv z4;XKAZ_A%L!!B#&N8n4Rb! z-1s)s@Tt{}xN}d_j+6zv20G>Fw_Uv5yx}d&Y=LczFP1(#@S>0FQq7ILc~1=HKCa?$ zUB~^d%WmV@755IC9e%64ZRYoOb4P|CF7<8F0!mAs_CJr+;gfW`A$H)>LGBxIvkw$V zo21WrE3j?ukxuuQ=e|r~InN}rzDPAk-D1g>!jRoZz9khHTvl=wZp=NVzW0l}-!IQg z*At=>gQF(YHRiGf)o3|QVZ6<^L}Q}wt|ygS^QW!{TJfv4`G#DE5_YsI6*vnKg=Pf_3LYQOPr!aL=V+!yjryKhZzQku7Y z`^m#{nkHORFCPzI6NZL_I zQDkOd269d?GO|lIG$c4^Nbq&EBpuAKkekqv;eSYAP(rBtn6lB%0KJ)0mVM>~ zny>bUOGcDO(o}$fO;Un0EwiYj;7Rg_2U1fy6Rzt|TpwL2VY9B7V|)B&b=22myk zARz#x7#M*3Gd!YmfH`0hQVvjKQWaoOOG(u$*v`rH=l}cFuTJ(&tNXS6?C+Y)|3_-n zTHS>`IXyE@t`KAuW)NXic&(dRy!9e;FfjGUFmQa7_sNWWqxi>HD}AB(#)zLEv`dzD zrbL|hpl_nNpJ{n&|F$WA`Z8sm>e5tWdD;K9Hi-n){1BHg4Vg0kVo=bzq93y}MVB+# zJDW#MnIBlfCtT-N|M;YbZQZlAtY078K7N1A5=q_TvRiU`mrmwUuU|ZgcX4;~dDTB$ z+b1a{=Py#II~tX~F+6he{!GnGA&=8l20>Gg^DlUM_}-KB2S>zI9o+u4EfWeT6t2vi z%0D45_Z+}?w7V-_R2YYe!--eZETyiPi6fn{ZuD8VxGEeo!h~tOzpRxOwvDj^?nMi zS;qYDSaFP3PIJ=)Lw9eFiMH*FCjH^wJ|Vu)Gd5`VljgAMYY)p8C^bFTbn7o&74|Sc zOiyRIqSKMv9MgplZ+$VTV#@xBOV~44Z@jhc#CeG=AsozF3Ip0A+vbNQHu9_*DpC`@mI-qnRaoMtb=K=}*3y_(@iPLG z&t`0GI$Ln~X^AyB;kPbP+?Zh?(SKser41>1v(26hbAb~6J26DU=g3J!PWKJ`Vvo4g zPKl`X@PHCNiZih$eHBqNA5e~fmi!7r6B!uTfR?1C<|gK(vH)2i8W;#VqIRe`p9Lf# z!3I$X3j?u@46w}4C_T+6am5S!yOF~0_jfR;-I7GOnk_vwFD11Il2^AdirrvTyCR|1 zBmr_Ws=3%4E$L&*Ai-9goB?#BC>w()k17*V0iep@BLj2}SQH*Q$bwMIp+dmYLQ+Q3 zhFYZw^&*FA0VcLf9_UFm4zYFOBET|Qz96xvur#$qH@TodH?gQFzg(d#wWv5VKTp9@ X&p^*W(gqlO5X6wf$iNT)Y$X5ys8#b! literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk4 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk4 new file mode 100644 index 0000000000000000000000000000000000000000..ba0d8617593aed9c8b97b6249467c1cb67f6b102 GIT binary patch literal 2050 zcmb`IeN@;hUPKYnF|Cp zbjWLE3XGSOa)Jt)60+rFTFw`I!^U_~%T6LvFb;Ufg;$nX&jMeZH;aY?{u~qcTD6^r`y>n3Mu|abNE~`z0Nv)=yLZ8tHyBgt=9-rbMN!R0g z4RqO3(57_mq%r$$jE=sZ6jJFnIXIdzh^~%J3eW!Ju9DfWp$)FDH8)=|2*;S*+A-9f zcF8zO?MH?0)q8^3jb-L_>Ge2A z_WTyx%9HE`rb$@?c7ewuf77>BGsV}gMOtZh88?QyCl$f>_4tVk44rvjDqP(C_{TQV z(&U!pEBcRRsSRGw4QJfvqVQZ3mbt91{@=P`TSu)7(e8C+>r`1YJoI^&11UG%c zTdnC{WWw$C_f0X&RVQ(zproDX{3F&FJN7WVbB6aDc^}+lE{uBQ*+d*VYpITM96R|q zPYS7d{3u$j>*axHrNvdvJzp5r61HwX`#^eM{Xyr#HFRePKn4_a2NgUO+#n2u@rne2 z7=c)_NwR@##|j0{34+DG_P`#Q7*HrjszQ+-8%W0QQf0WOM|cqu{NZXYqXI{-yPdP} zAR*9UbXR=6ItVO0%!7BX*RSsoh9z<$>u#`5QbQZ>K8bBO_}J0Kxky*5-Lh;{-4jq| z;w&Vr4Af(h_368CUXTlAz8k<$$WGFA^37XTh&Dq(JmbR^?%T(!H@@jhs_ZEL_$hPV_6~pM(=Chk`Py8E)B|aK zOCHLdQvH)p;X1p&SK5r8TvO$N`?fb3HV{hc?v%w(C{8hgLINgfXDAm(!uJ`A3z9-t z^KG2dIOt2!Y2&$CW8;+a7k+oPo>% z9brW58BnSz;j)Vg;Km&*x(QbVjIf}4GZJzRub5%=PBaxa@9EW9o#bjQejro0a#pEy z$YwM)YF4**9ZNjAtXaQfz|U4%62EKFiT!DSp^4@MROR;bJ{1_Q{hDma_B1x2t@H9& z^*CYp}25>G62rcZd#Yh0#Sp04txEc-)|oGHX#baeQ&{QzK)J*1M2BALVi zxtfYd34)=;|2DJ3)D1G``GbFzfT#t3*%?J0Ro})Xe5fAdi!NQj(@QA-h{j|}Hi;$j z=k9Am5pSXBDl+{zX-e|H*L|623THkbV>YkNLNr1c0J#L%O|x_W;CLZ&{>=VeoaxCI zo4-gQ{-=0RVqRH)cx4~wl@*M5egAfCQ##a5m3FS;*1sT-R^Gy=cMOgm-VP0SV_v`h= ztcA;`^uPK4Gxx9hYyTEu)w~r_H%yJTT-vrk(25~IT)kkuXHrUxZ45&kLn4ErqTp8D z|-fmjPG&W(4tWnjt>8)nUz`u}8w>eG6YP3nKo8@)_tkzTvh?32CKtEi_9 zzZZO65>xJ5_aau*FilO7`yboX*LVE>Ob9Dj6uPeZ$9(O(S1)aveZ)ma^vlYp`A?3O zScTfO{+Pe~tkc@l{JPmzd*^7#%=sbj{gcr_OZ#Hf)F=KI>K`|~Ne?Ml&T;i&ea7S; zl0KF{BVH<`m|qf+y_yy0#Hw=I>%zquhO+;To$mEpe^PMj-jW4=zl6;qb)%R5;d#As zx5EDBqdBv-{+ZC&;keC9$d+RzW1w#DkNMo$$;{6`nXj6=rlRs(#Gy7K?Uf$Dp;off4ncv_xwEj9IEtj^_oZi`;pHV7zw(zZ#R z6eqbc@XY;)xj!T?M|Ujcz16z6CQy2lr_0j6s7rCBIaH$x)91lF$@V6qy;A zft(YJjO@}44G9h!5_}ykNe445IQTtWj24FIi2FQSaI?T_9>0c))I=}t%bZh#1jAUu zPJg|1AZe52+O*vdi+0JbfBu`XnfKv@2ot%9o==M&Cz;Ll&zPbxH)!=WZ8L75`D)j= zWkh)-O$8X(Bqcc0GK-2!{1S6hMR~+dFpA9*5Ie`Mwu@7Z1I3AwI>5}qAj-r5Bm{sI z0|StMj7PMG!$))xQf5(RddknRZAr3rEbsR_Iic6w{5m_tBU<(p4Y;2 z`_OYsF75vg$E*aGy#8bz%hvh+qMf{KW6Z{YH28A5f6x!e1Z+FV=3aeM0 z`u$axm#k>G`qe-oLo%9s|7Qa|<7m~xUf~bhb)3@#D<#k7dVH8RB`-=>GJ2|M?mTtn zI(L_~E0gpO#a!DtZCdQEDQ37gZ;Jx%bpIb|RpXC$_{mK{}Bz||Bpl(wa6ZWLe8kLclmoCBPn3j{6lTSFo%T4H5 zVhB#~Zkshh3I2qjQit1;NiSQxR)#466Z|4jg3n#F>So@KIp?-K{#wJ^wfZA7oAe>Y ziHE#Jd)-qeEr>Ca^?feP1xoNc#1RReBPS6#z5nAAyT+w9K~(J#4=BN-ITUNMR}nSy z0p$j01)(4`k%55?XiZvbZemU<3y=k(fdQc-YKNNRSwIpJY!HR8P!QY50L%7_(gjzp z3VOfq*E`Nux`RV)g%rZwZ0V_aDXB$}T)Kr(>;|LSB1yFi5+GNjnv2cRl0K#k5^TlE z89+CRvN4GAs4^jCeN_e@8K85(qVVuR7KB<36#|wMk}{Gu)G0@(897u7FtIZVKu@Z1 zi2V^40hZ441&Kw4rKu&l$prE@8D3rntX7=yh z06OgXkITD>Wl!}YKosDBI}5xU>b7-i=(Jl!iIME87bPo&9xYl~(e?=eA{QMrw=mS5 zywUg%zkctdE2e5?Oh*P|z%D0wfmWtgye03byF4tUgSN)e>bT{Yv%Hc}r`5)#fvmPML+QeDt?Yj0{j!YVSC1IZtCR)d zHzJ!+0V}iT>GVTF3EcUjsQDdF+1+VEyw*jB>kSe$7m}=Mbr$@|&$^vc&xm%v5y^8! zs9;OK?cFo^FMknR94H|^TsRc#{8*EMFOIX2@gnfrvMo!?G*2q4Rg{~#b~-&xAa1ya ztt1GZZV4T3m=?~)E*!LT4JPNkoV_SHG9st1y|JkcFHlZcTgZ$!1TzcbIUcQ0N0o*> z;1IeObD0-I>Ys~`@leh1oB{W^XV$gV>T(R7&yI7yxhoKV)~~X<{f#Hf+b46MU*~LD>pw_cP-r@d;4KUi%!^e=61y2Tn)DfEJNb%Cp$02{;BVz7-9k}G)?f1Ky^D*K z6xzR&mQ($^aZlY79BNPTp5V&!UYSi>bzqZ7e?o(RT8MFrP2Ic=1p~MVf;%AkNWj5p z7;WPY91Ru;_zAH@l&=f;fD(mgrw85QuW@1i>KZsdlyk0ZANWJ^;qPy zUGiJzwGPVt4`w@6m>~1h3QTQa49N`#&?KVqvN*9s8q5{(VGN-OB0MlBC{1Z^jc7*y z5lNyW1^_S$AU7Nm06@miOyMVnL2$trhUkaF%)wUG(utf{YyDwep6tC_bH^ixLBYMt ziSH)1FuJi;7ko>zvX-bTv+h5C{iN!lAV9pj7YYXR0UKbZ?}Fp?hc2p>`?Our@qHel z&rAkLEg6d4kps5aLIYE8ODD;VbDf+DY)D?NtvGI8Q}SoHeNHTXRTW;v|A zaZkpPwX6#>ky#~m6QfNHI zwH_m}rKi(s^rA7%jqmhtdCX&;p_1!d&5oVuV#XgZv23cms;s}Fy`ZSFsBPW(s$=WE z(-T~>TIEsl^2Pgktz)4p`&Y|;yRJruj7w(qRpvP4QnC*9)JAKRzR3%9dm3M7>h1b} zxVZ@2M!wNJzC_3seH(EfA6E(QBxkCPIn$n!&lyNx3qCb4_sSbpb;FHxM>uhh*#(N4W##q%CXhdr#eO8W+qnbGq%V^X-0&i(RidQ+a__vD^~KQ&M`?z&RnrLaW!QXUo44B ZOrT72admMec_AhIaDgNU02cC_@HdC%>vjMD literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk7 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk7 new file mode 100644 index 0000000000000000000000000000000000000000..e96c25412261bcf15f0ca7682c0381ccd13e1d93 GIT binary patch literal 2034 zcmWG=3^EjD5xv7LdV$?XbRMH9gAfCQ##a5m3GW!c@-b{nj8PGoe3&6W>WR^>Bkr5m z+D`fy`~E(c!dVlB2IdAPh8705B@Qo`{Tciif*G!Q2Kb3jzsJtEKrVfiQXS{iIWOv$ z9i8%H;Z+mux{ifYCi2&}EcOik;yg=E`(e9Tl{D`)oqwJjQ&)d*zOtxo<13Ya>V?zY z>Qg39t`a$F&$&ZNr)g)wZME`;)7QMY^R!)R>xxX_{Vc+txif;gr@D0fzxl#b!v2b5 zd;EgHkRzp1|J;j1-$>-e)G^)3IlLg{r~J0*Kj*j0J1lMcIX{`P-XXeb*NPAR%W`s7 z6-`gcy?kL$XZ<44AIvRW%|OH6H*N!-1`sAd!}VyB2wicQty(# zIP#}_%vHnF@}4CJWF92ec_z=;_+4O@@ZtX+vKFplMN2vkd6tRPADmLnBNDcjX*)j~D97?4`)^@SD?d^0oTDVO{C;83KvW$0L20`b!s#v^NyqmJQ z{Ki#-R6(ZuMUS^9a~kuDGKijF6urf$1EK^(*+ki7%osFSqcRfn(j}N2^%x*YK_Nwv znSmL|Il;)tF5S?O;GiMF*U^$xm|!Bq@8M#!FhplMr`qD11y=L;HB_V~dM!K7IaO+9 z*qUjtzcd|9F^)Q0cKB(DHRJm5&wm>nCv7lO5wkp|ye{1N)1*^R7hg^^o4e-NGB%+3 zYO}axM0q4l1sK>QB{sd@?R!Yu#)Ot1eN`b=q3{(sMs{q{%gcb;As zpTnsYu}0$NthZlpTfJ&qG;xaNq&0G(3=s^G3|$BIcZf(cZ_AO4T%M&^$F90frQSJe zx@5`^$&SnwD)pOh9ooNR!%`i;z%@te7bwIEt#RpV=d53>n(TkzzQ(HK=L1@%86vEc$cS^>XG>zklw* zpY*wws5Q_?Je9fCZ2737RD~S<+ej$Ztii3YaLgP%zneRIm;6=uwz`k0WP(D!fLCyLFpXB zsaR9Hil~_nC=)=-ZUv!<3=E(Qm6n>Dn3Ku^WPxa4U>Jxxp=Nd#kc0#qL?KWesOVRa zILH9Y?~KCFsu!p1c`iNUsSpGE;xuNpM-m9Pv!$ozrKA=?GUyIQu{(@vH^kN2#6d1c zH5r?;C4Ed8B-o0RGk~rXWn&QKQDs8P^{Na$GC&7`Md4wDEC{t6Dg-PdBxNLRs8xhe zH;SkhXkt%ffgV-k5L+iE0*oyAg2bZ2($o^&*#-%&QyBht)&Kn(uGhHD zbJ=y3TFIUDm;Skw9J)JC@PO0}r|mE2PCdZi%_qUQWzr-T`B(-J-?Zh>Z04@jt+C_U%*k z>|2Aw3NN|*m!6T+_Mfk2o$;nMrJHiXEgMZlq`EhX1>D@UR73iPTl@cBwynaC{$JMF zC3a@@AN3PQH%!Tj`gy)!*4al9x5ULm1^>$)v;26!P)jxC$A5#k&W}$2gtvt0Y5$ks zK0Ak_q%vUtHJ+&-l1`SUMRj6W{8FH=X;rSq-H|5?|j z8`ieu-tusJE-QUe(dbNYl1yguhrI4b?%)kufoM2>Rmu_fCaL|z8>u5u@j79 zTlmEmaI1B3s&SyYQBnt(4H!h37=VNTkYZo}@(*!~ZejNkoraVx9x}G_F_g)Nt0?rY zV04}mVL9bUVd{}h$FyZv6$&)$pBKg24+I|KrF06_4waf?n)zQk=Bb$ZGCt zx&P87f8s4_g!4)+xp8ej_WxMomw=+w#ZTw`@8*`>{6d|A#tOn{&fCZr`HMn)BmAseka0ti|MzV<^PzsCmAF>;+~nz(xHPiUxSV+Z3wKX8bCQx4*56$0Wt)?rtKi_Y z_`pKuSurLYf2LkmSnsh`bLo`QsCR0yYJ0iSKH!hV1S+E&YtQQ?2`Q(RcovHkN5(P-9fc{ zYD**$?q*9*%}Yrwf@VENu^WtP^CZ;Hh=cPUin-VvE$L&*Ai-9goB?#3C>w()k17*V zepY4hkpVgfED8@FWI?FqP$6LEmz0sTp;F;M&Dfz@h>1Ot1Nu^pL+qQF2r!=H3lfV8 uOH)g9lM4!T6N`%S%N5E}i;6Sz^As%g4D<{nZGhniK@7Q!3=9Flwg3R$$l{~` literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk9 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/firstName_lastName_gender/chunk9 new file mode 100644 index 0000000000000000000000000000000000000000..d08125d3a6b8187b1b05063453c0b3cf0e64e7f7 GIT binary patch literal 948 zcmcIj%SyvQ6upzC(^M*y(isw{*hL*(XswGD6gL(@g!udd2c6nL+SG}U@6eSimwtin z{19>F)}4sBQ@n|-wh(s;N#@R(xi{yWJF~sAyTDAg#9WtA1_gkb+xhqM#1lXo09L#( z3^EvO1Z~+-2NBlPC*6PnD>5;QIeC0(sR1*Y{vJCWXW`Dc)YuMyffGuMR0YH%DY2YW z&jWSrY|GQ(@g^2#IZpWv;rB%Jgq2jynMInw48Ttw2LPOJvb_=7(~ATsF0Co;b>uik zP1P;0w!N10ec84U*z&zo5PGs9s2-+hQvr{paE z;mHvH(VD+9k6)Xd3X5N)i+HXkdr}{rsN=c)UT;on9h{X Ki~wxoef`3(OVyUa>$ZCCSmawSzKL_6uFbTy2hSdpbGtiJsmfw9 z_q@4vataqr2^GcE|3+cU1dJ?o(JrihZ}>6>K}yVBIJ zY}i)yuXci?scpCE3$>epmvwS3S1(N4XuWy<|HZSP|LU1B@51_lWZ zM<4?P#27TNhyo=*F{6;8$jkuJa)ObOUAmzm!9hcUucIaDV1|XPASojQbn_M<4glsD0BQCP AZU6uP literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk1 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk1 new file mode 100644 index 0000000000000000000000000000000000000000..da7ed507bdfa3986c59212ecdf3730e4b3b06ec4 GIT binary patch literal 838 zcmWG=3^EjD5k0^odWF?T^aP_QgAfCQ##a5m2?|WC+zi_S%&iU9iUly#A9~8uWpVga ztj3C2XA}$D9S=CX=?=UpoXS@DQ19wJYsWMD9~`MGS^v=9t@5Jn-Om^2UElZJR*FH1 zL7QRL?UUbwKR#c5H169ENxtI``q(QUhZf(vXVYO>Cm_bAy-_G|UCqa(o7~uHBX@k> zYBkr#^GVP8{tiRC!;G_y=d!&LyW_>w`GP~SP2!B!+!y<0q;F<6WkxJv_D$qp`LWTu^(WSNCj#5|hVnMggWzjI-a};(29guFSl^{OT6vyInhE-Hv=I z@1FdtWsk?MKYH4a{F+}RwoTby`_}jTu5kI2wmTMW35~k??~08_3e&8D=p&5Rd0x1^ zdvNz_sQcxA5ykNht6yH+TohQw8@xFp#Ld^N(ER+qwHiV7yVaaTMHxV0ev45DLLvchh`gbWw0nSLv#WF5`g8Mk3Zj@#;+c{}Fh9e@3^?!bZq z4;`ug6HAIt=2*?Yu%g6kZPfZ3YsyZ)t=j)!Lj@1ee6<@KGNLS!rUDFXk`hdrDWW`L zCm6+6@rzyHQ2WQK#zBhHC3S$QjzN@(0Z0e{DFz0h$vUPC5^TlE8L7F6AQ=`_CXh7@ zKwBhbBxPu8J;)y?7}Yp{o)H0tt9(IXQDJFniEeU1fo@_^QGU5XS!z*nW`3T6rJjMF QfuxKK(9K(bH~^S~0E?g!;s5{u literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk2 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk2 new file mode 100644 index 0000000000000000000000000000000000000000..e5955d126a9180ca8553148e3c38f63f85d33455 GIT binary patch literal 836 zcmWG=3^EjD5k0^odV$qP^aP_QgAfCQ##a5m2?|VKxft9gn3@`-i>vS?AMFuNZeyL* z%TcRf*|}$D5mUq312)D#nKaXd4qTQoY2bHP;*j!TlvCk0@BH`QPLe^9!H^-JNBvLs zi_6|JAKP|)UB2;^ZCUw74!1a4k8&%ob=T`^r}5RdqTog z^iA_>Ikv|~9_=bJWW1NjepGg=Fn3G(C5^Z>X_GFvd$6DP(2CS_y~Du7chtclc*ASP z;1z-gawo4Yy}($&v_NAnvjEe3=Gi_olHXYHm>ruaasK|M4c^DMez%6#dQ8&&l$Z};%=Qi+hV-tL(Z{`*!623)Yx2Fy7KYM%p2E>UQ6c9aTZRv zdeVB2g7K|=u4)^5@5z*ieT!=5xTN-eTW0yfWBv8Zj(tCAz$(fB3h`TvIv`3wlueXP zMuOutBLf420t15t$2%Yc1jHCLu!sUBK=GuIqR7m^4CI_(WMr3aXh?9-kl^cRNjjKe zAvd8T#c5@P-i)5K!!IlB7EH)+(VFSEVoKK0tetTiX5_f7zL~dUPTuj?KkE)GDDcpc z>OZlh=wy!7{0l2eyw*mozpnZr0L@ps!XYEdB55kXz$Pidl$j#RBX)vO zY!$!Q84k5ytZE#jI9*Z)nC2KnnHYeC0FYu}0Gh00${@j3oSc!Gn+TF&QDp*I!vM5J zQbtmSw$_9Eae`5e1LzqMV7ST`Bo-Bxrk3a?7Zm6w78T`}E0m=c6=&w>DOl literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk3 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk3 new file mode 100644 index 0000000000000000000000000000000000000000..e9c5630f0d503de731fc94629f811c3fd186e0e2 GIT binary patch literal 840 zcmWG=3^EjD5k0^odV|$R^aP_QgAfCQ##a5m2?|W2+zitK%&iq(iv=)va4uh*HJSO_ z1MmCmw4zOy9J!+Ma=x(@@}>QCX0h}N(GocGXB0YVMmpH)ai_AS0>3yH7HuDOf%vV ze;RFGEVD1XsEq5|Pce(xxn{r5?pW`zduLdfiOadn)$7v^W*=K3yt8K2z#lldG+zS>c@ob?@CdTa)4vE^Yt&?BubTSr-IfY<;eqU@FQ03iVrzIv`3w zlueXPMuJ10iGcwabPN(4aX&p!Pn7} zbTGq0ZbCGewj~ z>;$9ODt@sm9BNH$Y8<3ET~Y^_?ifUw7=VNTkYZo}nyh2WAi-9goRONF2$Eq@Wdd2l z0JKF?MpA~h)`R?Uf>DhF=ot}UxXKqK78RDJmgpuI6zC=v73G&Jl%*CGXXfWASn3(* R8A!^=0NuO=hy#Fm2mtwb1+D-9 literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk4 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk4 new file mode 100644 index 0000000000000000000000000000000000000000..bfa0b97293994722e0aa54586a346815b3d2f9dd GIT binary patch literal 842 zcmWG=3^EjD5k0^odWY3V^aP_QgAfCQ##a5m2?|WA+zf1j7S;-$;sFdFBK#PBeyP&? zt@d#9tAj}!gOp3P96oM(#(m?Nhe0?0p@a+v?X7F(&AivU(`3%Jpit$bU%&5Xmt|06 z&|=UnpVKL{WvcqUvU?W6Yd=cu`|&d7*JO8lPWwL*j6RDjJq|39ZLqkK>B~R0P2rW> zxgV^tg=U8ej?BKW$XGnYx;CAa$#;9wS{~g4#~RX754yy0T!}j4qP2kc@5kcM1nCeT zwa_cAMTXWjr&|9o_Wyf!aPJ((uzsdzpASVA$mALXEtxc(nYqz4!T619;)L+ItkaZF zURIlO?u$ATLzkIC&-w=fha3G>Wj6kxi-`O-q^bB)=SQq)A>vHM`~}HB!0-vXoA)I zF2l_m!efQ(C1>31c`-Xf=Jc+qv(G+PNp#I=$S*p&?q5N>>8e}YbIv*Z6lDN~`z=Nt z5G5eWCdwuw!QspR1PTlc5**x&ASMHY7=s2DQJ@4UwiHqnnHiXYoD+t)G2Qw_>CUm4Yt&Gr{(UW%gWrf{>2^lV0GyPUf$vT>~Gj79-9Jkds^LEV1JO27- z-GK!K9y(I}CzceQ%(0q(VMU48+Nkw6)|8!oTebheh6)~_`Dzb1WJFmcO$8X(Bqf+K zQ$%^hPB4nC;upKYq1MKx#zBhHC3S!)k3p1)0Z0e{DFz0h$vUPC5^TlE8L7F6AQ=`_ zCXh7@KwBhbBxPu8J;)y?7}Yp{o)H0tt9(IXQDJFniEeU1fo@_^QGU5XS!z*nW`3T6 UrJjMFfuxKK(9K(bH~^T70NU{i%K!iX literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk5 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk5 new file mode 100644 index 0000000000000000000000000000000000000000..d047db53a8106eb369194cce13b657cf45836d46 GIT binary patch literal 826 zcmWG=3^EjD5k0^ox`)+A^aP_QgAfCQ##a5m2?|V0xfs*}ObiW5Ss9`x{8=#R%%p#U zlKh7+C~s+-wD!fd*_rE?@lT$rc(8)it?H#2SJafID9wOh@2lk)lo<3G>XYmLAGJAD z-}3k1{l4(O?aWs?%zv!>ykfqP|A+ayOY3iGPp@kIFKoq8`|9~I=0CEl&L7zPZ&JjU z#L&s&KlCetx703vaA3!*`C+Z6vlcGwSZ=A3uVd*ZDRF9V#T_9<2^Y!4s4&k3uN%^Q z?#y~R!7l$-{#_aZ|6lOxjT#!Wyzd za6|2h#JiIiCNM2X@Zl9;`p9@esZ28Fu+B{fs{^aH9nr~Nd6`H1(J_%N@k`6(4wUT9 zn7LuC!BrKuTPf9kRbSn77SCUxDskFf`cBdX7BwAq3m4~<2YPM+vu9oQY0%V54iLZl zr|q?j`f|tS|LQ-}EB>{;sX2K&Me3|G!=2h%Q3g;r-(u7OQ39fDqHHn}99tNGK!Jfl zf}_0PHk3kp1Rr20=RDLR>BHUGkj z60fyU>u;q5|AP$`JV5i+4sghbvPhZ=FtABVFlDBQ@`#;a6kEkFwu3|M8LJux zDNdKv0j4wtQ6>f;ApoQp7=R}0m@-JP6(?t;<|cwEwV C84P3q literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk6 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk6 new file mode 100644 index 0000000000000000000000000000000000000000..8f7deba277a07ddff90f8ffcb0ea81625a21eb4f GIT binary patch literal 819 zcmWG=3^EjD5k0^ox{lRH^aP_QgAfCQ##a5m2?|WPTntA1MkWTq3=DsKRc9Oxk2X6I zXf(faK5GEaneP|s;zW(d|_u{tQ#h2yx%Kz8R*%@SC$#uvr zN_)jYEib;BEMcCMJX7^;>c(O*XS$xJJIF22x!Uo}Y{{Au#q#qtY-<)IYR|ZL z=U?}u0Ii_OX57;k&pDs_bLD4dQ3g-|-(u7OQ39fDqHHn}974T9k~+X7 z#vsbX03-x}6axd$WF1om3AWRzk}|Zl9^{V`jA|S}&xioS wRlXpxsIWA(L^rvhKsT|dD8F2xEVZaOGe1wkQqMroKvG5q=;kdz901HN0Q0y8P5=M^ literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk7 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk7 new file mode 100644 index 0000000000000000000000000000000000000000..be91fdc4179f4ca13fbf6533ee70fd6c0362e124 GIT binary patch literal 837 zcmWG=3^EjD5k0^odWqFX^aP_QgAfCQ##a5m2?|Vqxfsd>%uF3ZwYds@tth;BR;$`; zZvX1~n%>4;msOig4Db0Qw~H$$Jly{~-hWTP{5P9gr~Hnqe!utse>+JA1qLIA@O@iO zb{|kMKl@FU`^V(gIhFG4JGM%EE*9+m^DHfckL{(;oKFjcKR#`{`H5i>!^i6!2LmOZ zhOOdcEMHiXu|v_RUvQykp8c9*q82k+P8G7hV|!^Z<7FJrilCm)0#4q6@+m1R{2wj| zoX7W8B)V=U+foOSLuTI=SjmWnpL3G){bG2oi)Goah8%aphzYH|)`bC!czU{8o^!Qi zEh$zCS;3eiJ?-WT4X%boLI+kd3P^ooT>X0Xk~?|3CHp?UQMvv7$Xndr z;n(USo~<>S70cT_>wZh_ogET7v)6=eezr)9d8aGem++*!x_j6~89+gPi%|ze35c?Z zvdKtrY-eI%V31>Akl;uFGC)9#K?92@Py!TD3Mq=r49q~z2}VYC>4t^`2Mr0nj+Uf@ z85VLAI#QfgM(EAxNjvU4Lek-PA9nIPqw_!$(+v=NnJLcpafBm!Wz=8q~ z9jX2kONvhBSk1q%qQq-$)cPB1%1*zn+W%lf1rN}CwQC$QqAZf80t{@D5=@yXqC8?J z7{ylci=E?8`@^cnL5kBQb%2SEL6nIBNC*Ha1_q$XI;IQ~Y{khLskwK#E&0Byt0GNRQrMnVa literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk8 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk8 new file mode 100644 index 0000000000000000000000000000000000000000..d679fafd657af534223107780612c5c7f6933763 GIT binary patch literal 833 zcmWG=3^EjD5k0^odWzLY^aP_QgAfCQ##a5m2?|VixfrGem|Gj177Jk5zu7%^f@b#X zJU3=z-yNKhrpwN}Iep|%$Ct$S4FA82-&g+n{C}djwA>yOPWhAqZ;v(8^lSfDOEV}k z7&4UaV>&9ee~#h3V+TdkO}zhfzP1k5{k4+EN}Kh5)cWEV?WZn=@tE}M?mH-G@yIvr zykxst)^V7w~-5#?P+ea`lepft@KE*uB@;$Y?W^T@LAW zWX(C`n9-3Kyh3n6Wu(YijR}jIHW~{sePZmEp7?qG##^bLvL0tXiFt|TZDRWu^>%?2 z@8l@M*(Y|(6+bpjd?b@6aMtCBz~d+FN6I9HKHrvNSF?z_EVtq4jR5!UQzjNLueVd% z`6}-7hf|k&&x!1F-m_cd{1ip=pFe6Q|51Cn#479a41Q4tP;lR3)B#ZfqHLmUG7=n_ zObiSR3JeSq9Mgad5D;U~z#h1`UW z6sMIDdNX>`4!^9hTQDKRMQf(tiYZw~vv$U9n33bQ`expaIeEul|ExQ(puj^%s{h22 zqLVpR^DnF@@md?T{>GZJ({HQxKiE*g12kXl9EXf3i=?Rl1Dm7-Q)Y@NkJt%Du~qzH z$2io!u&Qy8;&e$JV1i>1Wnusl0zis^0cf(0DT4%CadJj#ZX!sAMU@F;4Fk{?Nf}8Q z+FB3t#|cI?4xnd5fZ-}%kXTe$np&cpTu`8!SX7i>u27a*RGgWgr(mgPpl2W{BLj5v K79b7)W*z{D{s>?I literal 0 HcmV?d00001 diff --git a/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk9 b/test/resource/data/gar_test/ldbc_parquet/vertex/person/id/chunk9 new file mode 100644 index 0000000000000000000000000000000000000000..36ba2d71c5c3b683d58725f6bca595813ce81cef GIT binary patch literal 407 zcmWG=3^EjD5j7BX@)2bdWe{Ru(AcW~S3%++1H*G>1_lNx1_mZ3AT7thU;^R;X;B7I z5m7ZApmG5qW|NWNfXPU3!1RbQXkZZq>Ia+76$msH$YEn-Vpd^LYh#iTWsx)$U|^G! zV9HDpk5Mg6je`{9C3S#aVGv~kIZ*&e0o}?Xsbk6@!B(7{k(!$bl3`J0 z0$IW!#wIBvDML%UL4IIU;{f_Y1n6)1g2bZ2($o^& +#include "fma-common/configuration.h" +#include "fma-common/string_formatter.h" + +#include "import/import_v3.h" +#include "import/graphar_config.h" + +#include "gtest/gtest.h" +#include "./test_tools.h" + +using namespace fma_common; +using namespace lgraph; +using namespace import_v3; + +class TestImportGar : public TuGraphTest {}; + +// The path "/test/resource/data/gar_test/edge_test" is for TestEdgeLabel +// The path "/test/resource/data/gar_test/ldbc_parquet" is for TestGarData + +TEST_F(TestImportGar, TestEdgeLabel) { + // reject the same edge label with different properties + Importer::Config config; + std::string tugraph_path = std::filesystem::current_path().parent_path().parent_path(); + UT_LOG() << tugraph_path; + config.config_file = tugraph_path + "/test/resource/data/gar_test/edge_test/movie.graph.yml"; + config.is_graphar = true; + config.delete_if_exists = true; + + nlohmann::json conf; + UT_EXPECT_ANY_THROW(ParserGraphArConf(conf, config.config_file)); +} + +TEST_F(TestImportGar, TestGarData) { + UT_LOG() << "Read gar data"; + Importer::Config config; + std::string tugraph_path = std::filesystem::current_path().parent_path().parent_path(); + UT_LOG() << tugraph_path; + config.config_file = + tugraph_path + "/test/resource/data/gar_test/ldbc_parquet/ldbc_sample.graph.yml"; + config.is_graphar = true; + config.delete_if_exists = true; + + nlohmann::json conf; + ParserGraphArConf(conf, config.config_file); + + // test the first vertex data in gar config + std::vector data_files = import_v2::ImportConfParser::ParseFiles(conf); + import_v2::GraphArParser parser = import_v2::GraphArParser(data_files.front()); + std::vector> block; + UT_EXPECT_NO_THROW(parser.ReadBlock(block)); + UT_EXPECT_EQ(block.size(), 903); + UT_EXPECT_EQ(block[0][0].ToString(), "933"); + UT_EXPECT_EQ(block[0][1].ToString(), "Mahinda"); +} diff --git a/toolkits/CMakeLists.txt b/toolkits/CMakeLists.txt index 780ed97cf7..969285f092 100644 --- a/toolkits/CMakeLists.txt +++ b/toolkits/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.13) +cmake_minimum_required(VERSION 3.16) project(TuGraph C CXX) ############### lgraph_import ###################### @@ -9,14 +9,16 @@ add_executable(${TARGET_LGRAPH_IMPORT} lgraph_import.cpp ${LGRAPH_ROOT_DIR}/src/client/cpp/rpc/lgraph_rpc_client.cpp ${LGRAPH_ROOT_DIR}/src/client/cpp/restful/rest_client.cpp - ${LGRAPH_ROOT_DIR}/src/import/import_client.cpp) + ${LGRAPH_ROOT_DIR}/src/import/import_client.cpp + ${LGRAPH_ROOT_DIR}/src/import/graphar_parser.cpp) # TODO: break circular dependency between cypher and state machine target_link_libraries(${TARGET_LGRAPH_IMPORT} lgraph_server_lib lgraph_cypher_lib lgraph_server_lib - librocksdb.a) + librocksdb.a + gar) if (NOT ENABLE_ASAN) target_link_libraries(${TARGET_LGRAPH_IMPORT} libjemalloc.a) diff --git a/toolkits/lgraph_import.cpp b/toolkits/lgraph_import.cpp index abc6372cf7..deda0cdadf 100644 --- a/toolkits/lgraph_import.cpp +++ b/toolkits/lgraph_import.cpp @@ -180,10 +180,10 @@ int main(int argc, char** argv) { config.Add(import_config.delimiter, "delimiter", true) .Comment("Delimiter used in the CSV files"); config.Add(import_config.enable_fulltext_index, "enable_fulltext_index", true) - .Comment("Whether to enable fulltext index"); + .Comment("Whether to enable fulltext index"); config.Add(import_config.fulltext_index_analyzer, "fulltext_index_analyzer", true) - .SetPossibleValues({"SmartChineseAnalyzer", "StandardAnalyzer"}) - .Comment("fulltext index analyzer"); + .SetPossibleValues({"SmartChineseAnalyzer", "StandardAnalyzer"}) + .Comment("fulltext index analyzer"); config.ExitAfterHelp(true); try { config.ParseAndFinalize(argc, argv); @@ -199,6 +199,8 @@ int main(int argc, char** argv) { config.Add(import_config_v3.config_file, "c,config_file", false) .Comment("Config file path"); config.Add(import_config_v3.continue_on_error, "i,continue_on_error", true); + config.Add(import_config_v3.is_graphar, "gar", true) + .Comment("Whether the config file is GraphAr file"); config.Add(import_config_v3.db_dir, "d,dir", true).Comment("The DB data directory"); config.Add(import_config_v3.user, "u,user", true).Comment("DB username."); config.Add(import_config_v3.password, "p,password", true).Comment("DB password.");