@@ -194,7 +194,7 @@ void MutablePropertyFragment::Open(const std::string& work_dir,
194194 // We will reserve the at least 4096 slots for each vertex label
195195 size_t vertex_capacity =
196196 std::max (lf_indexers_[i].capacity (), (size_t ) 4096 );
197- if (vertex_capacity >= lf_indexers_[i].size ()) {
197+ if (vertex_capacity >= lf_indexers_[i].capacity ()) {
198198 lf_indexers_[i].reserve (vertex_capacity);
199199 }
200200 vertex_data_[i].resize (vertex_capacity);
@@ -389,15 +389,6 @@ const Schema& MutablePropertyFragment::schema() const { return schema_; }
389389
390390Schema& MutablePropertyFragment::mutable_schema () { return schema_; }
391391
392- Table& MutablePropertyFragment::get_vertex_table (label_t vertex_label) {
393- return vertex_data_[vertex_label];
394- }
395-
396- const Table& MutablePropertyFragment::get_vertex_table (
397- label_t vertex_label) const {
398- return vertex_data_[vertex_label];
399- }
400-
401392vid_t MutablePropertyFragment::vertex_num (label_t vertex_label) const {
402393 return static_cast <vid_t >(lf_indexers_[vertex_label].size ());
403394}
@@ -464,69 +455,98 @@ MutablePropertyFragment::get_incoming_edges_mut(label_t label, vid_t u,
464455 return get_ie_csr (label, neighbor_label, edge_label)->edge_iter_mut (u);
465456}
466457
467- CsrBase* MutablePropertyFragment::get_oe_csr (label_t label,
468- label_t neighbor_label,
469- label_t edge_label) {
470- size_t index = label * vertex_label_num_ * edge_label_num_ +
471- neighbor_label * edge_label_num_ + edge_label;
472- return oe_[index];
473- }
474-
475- const CsrBase* MutablePropertyFragment::get_oe_csr (label_t label,
476- label_t neighbor_label,
477- label_t edge_label) const {
478- size_t index = label * vertex_label_num_ * edge_label_num_ +
479- neighbor_label * edge_label_num_ + edge_label;
480- return oe_[index];
481- }
482-
483- CsrBase* MutablePropertyFragment::get_ie_csr (label_t label,
484- label_t neighbor_label,
485- label_t edge_label) {
486- size_t index = neighbor_label * vertex_label_num_ * edge_label_num_ +
487- label * edge_label_num_ + edge_label;
488- return ie_[index];
489- }
490-
491- const CsrBase* MutablePropertyFragment::get_ie_csr (label_t label,
492- label_t neighbor_label,
493- label_t edge_label) const {
494- size_t index = neighbor_label * vertex_label_num_ * edge_label_num_ +
495- label * edge_label_num_ + edge_label;
496- return ie_[index];
497- }
498-
499- std::shared_ptr<ColumnBase> MutablePropertyFragment::get_vertex_property_column (
500- uint8_t label, const std::string& prop) const {
501- return vertex_data_[label].get_column (prop);
502- }
458+ void MutablePropertyFragment::generateStatistics (
459+ const std::string& work_dir) const {
460+ std::string filename = work_dir + " /statistics.json" ;
461+ size_t vertex_count = 0 ;
462+
463+ std::string ss = " \" vertex_type_statistics\" : [\n " ;
464+ size_t vertex_label_num = schema_.vertex_label_num ();
465+ for (size_t idx = 0 ; idx < vertex_label_num; ++idx) {
466+ ss += " {\n\" type_id\" : " + std::to_string (idx) + " , \n " ;
467+ ss += " \" type_name\" : \" " + schema_.get_vertex_label_name (idx) + " \" , \n " ;
468+ size_t count = lf_indexers_[idx].size ();
469+ ss += " \" count\" : " + std::to_string (count) + " \n }" ;
470+ vertex_count += count;
471+ if (idx != vertex_label_num - 1 ) {
472+ ss += " , \n " ;
473+ } else {
474+ ss += " \n " ;
475+ }
476+ }
477+ ss += " ]\n " ;
478+ size_t edge_count = 0 ;
479+
480+ size_t edge_label_num = schema_.edge_label_num ();
481+ std::vector<std::thread> count_threads;
482+ std::vector<size_t > edge_count_list (dual_csr_list_.size (), 0 );
483+ for (size_t src_label = 0 ; src_label < vertex_label_num; ++src_label) {
484+ const auto & src_label_name = schema_.get_vertex_label_name (src_label);
485+ for (size_t dst_label = 0 ; dst_label < vertex_label_num; ++dst_label) {
486+ const auto & dst_label_name = schema_.get_vertex_label_name (dst_label);
487+ for (size_t edge_label = 0 ; edge_label < edge_label_num; ++edge_label) {
488+ const auto & edge_label_name = schema_.get_edge_label_name (edge_label);
489+ if (schema_.exist (src_label_name, dst_label_name, edge_label_name)) {
490+ size_t index = src_label * vertex_label_num * edge_label_num +
491+ dst_label * edge_label_num + edge_label;
492+ if (dual_csr_list_[index] != NULL ) {
493+ count_threads.emplace_back ([&edge_count_list, index, this ] {
494+ edge_count_list[index] = dual_csr_list_[index]->EdgeNum ();
495+ });
496+ }
497+ }
498+ }
499+ }
500+ }
501+ for (auto & t : count_threads) {
502+ t.join ();
503+ }
504+ ss += " ,\n " ;
505+ ss += " \" edge_type_statistics\" : [" ;
506+
507+ for (size_t edge_label = 0 ; edge_label < edge_label_num; ++edge_label) {
508+ const auto & edge_label_name = schema_.get_edge_label_name (edge_label);
509+
510+ ss += " {\n\" type_id\" : " + std::to_string (edge_label) + " , \n " ;
511+ ss += " \" type_name\" : \" " + edge_label_name + " \" , \n " ;
512+ ss += " \" vertex_type_pair_statistics\" : [\n " ;
513+ bool first = true ;
514+ std::string props_content{};
515+ for (size_t src_label = 0 ; src_label < vertex_label_num; ++src_label) {
516+ const auto & src_label_name = schema_.get_vertex_label_name (src_label);
517+ for (size_t dst_label = 0 ; dst_label < vertex_label_num; ++dst_label) {
518+ const auto & dst_label_name = schema_.get_vertex_label_name (dst_label);
519+ size_t index = src_label * vertex_label_num * edge_label_num +
520+ dst_label * edge_label_num + edge_label;
521+ if (schema_.exist (src_label_name, dst_label_name, edge_label_name)) {
522+ if (!first) {
523+ ss += " ,\n " ;
524+ }
525+ first = false ;
526+ ss += " {\n\" source_vertex\" : \" " + src_label_name + " \" , \n " ;
527+ ss += " \" destination_vertex\" : \" " + dst_label_name + " \" , \n " ;
528+ ss += " \" count\" : " + std::to_string (edge_count_list[index]) + " \n " ;
529+ edge_count += edge_count_list[index];
530+ ss += " }" ;
531+ }
532+ }
533+ }
503534
504- std::shared_ptr<RefColumnBase> MutablePropertyFragment::get_vertex_id_column (
505- uint8_t label) const {
506- if (lf_indexers_[label].get_type () == PropertyType::kInt64 ) {
507- return std::make_shared<TypedRefColumn<int64_t >>(
508- dynamic_cast <const TypedColumn<int64_t >&>(
509- lf_indexers_[label].get_keys ()));
510- } else if (lf_indexers_[label].get_type () == PropertyType::kInt32 ) {
511- return std::make_shared<TypedRefColumn<int32_t >>(
512- dynamic_cast <const TypedColumn<int32_t >&>(
513- lf_indexers_[label].get_keys ()));
514- } else if (lf_indexers_[label].get_type () == PropertyType::kUInt64 ) {
515- return std::make_shared<TypedRefColumn<uint64_t >>(
516- dynamic_cast <const TypedColumn<uint64_t >&>(
517- lf_indexers_[label].get_keys ()));
518- } else if (lf_indexers_[label].get_type () == PropertyType::kUInt32 ) {
519- return std::make_shared<TypedRefColumn<uint32_t >>(
520- dynamic_cast <const TypedColumn<uint32_t >&>(
521- lf_indexers_[label].get_keys ()));
522- } else if (lf_indexers_[label].get_type () == PropertyType::kStringView ) {
523- return std::make_shared<TypedRefColumn<std::string_view>>(
524- dynamic_cast <const TypedColumn<std::string_view>&>(
525- lf_indexers_[label].get_keys ()));
526- } else {
527- LOG (ERROR) << " Unsupported vertex id type: "
528- << lf_indexers_[label].get_type ();
529- return nullptr ;
535+ ss += " \n ]\n }" ;
536+ if (edge_label != edge_label_num - 1 ) {
537+ ss += " , \n " ;
538+ } else {
539+ ss += " \n " ;
540+ }
541+ }
542+ ss += " ]\n " ;
543+ {
544+ std::ofstream out (filename);
545+ out << " {\n\" total_vertex_count\" : " << vertex_count << " ,\n " ;
546+ out << " \" total_edge_count\" : " << edge_count << " ,\n " ;
547+ out << ss;
548+ out << " }\n " ;
549+ out.close ();
530550 }
531551}
532552
0 commit comments