blob: 70e9f703fb080399600a3bff5153d02d69a9748c [file]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Apache GraphAr C++ Library: src/graphar/high-level/edges_builder.cc Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Apache GraphAr C++ Library
</div>
<div id="projectbrief">The C++ Library for Apache GraphAr</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_360ef3ae5e4df5878fa0b8837112e0b7.html">graphar</a></li><li class="navelem"><a class="el" href="dir_37f05c718b2ac0c918080dddfde08e1d.html">high-level</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">edges_builder.cc</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> * Licensed to the Apache Software Foundation (ASF) under one</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> * or more contributor license agreements. See the NOTICE file</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * distributed with this work for additional information</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * regarding copyright ownership. The ASF licenses this file</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> * to you under the Apache License, Version 2.0 (the</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> * &quot;License&quot;); you may not use this file except in compliance</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> * with the License. You may obtain a copy of the License at</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> * http://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> * Unless required by applicable law or agreed to in writing,</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> * software distributed under the License is distributed on an</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment"> * &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment"> * KIND, either express or implied. See the License for the</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"> * specific language governing permissions and limitations</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment"> * under the License.</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; </div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;arrow/api.h&quot;</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; </div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &quot;graphar/convert_to_arrow_type.h&quot;</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &quot;graphar/general_params.h&quot;</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &quot;graphar/high-level/edges_builder.h&quot;</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &quot;graphar/result.h&quot;</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; </div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="keyword">namespace </span>graphar::builder {</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; </div>
<div class="line"><a name="l00029"></a><span class="lineno"><a class="line" href="classgraphar_1_1builder_1_1_edges_builder.html#aa318de80b2b259e9fa4aef65f2ce5593"> 29</a></span>&#160;<a class="code" href="classgraphar_1_1_status.html">Status</a> <a class="code" href="classgraphar_1_1builder_1_1_edges_builder.html#aa318de80b2b259e9fa4aef65f2ce5593">EdgesBuilder::Dump</a>() {</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <span class="comment">// construct the writer</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; <a class="code" href="classgraphar_1_1_edge_chunk_writer.html">EdgeChunkWriter</a> writer(edge_info_, prefix_, adj_list_type_, writer_options_,</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; validate_level_);</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; <span class="comment">// construct empty edge collections for vertex chunks without edges</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; IdType num_vertex_chunks =</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; (num_vertices_ + vertex_chunk_size_ - 1) / vertex_chunk_size_;</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; <span class="keywordflow">for</span> (IdType i = 0; i &lt; num_vertex_chunks; i++)</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <span class="keywordflow">if</span> (edges_.find(i) == edges_.end()) {</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; std::vector&lt;Edge&gt; empty_chunk_edges;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; edges_[i] = empty_chunk_edges;</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; }</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="comment">// dump the offsets</span></div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; <span class="keywordflow">if</span> (adj_list_type_ == AdjListType::ordered_by_source ||</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; adj_list_type_ == AdjListType::ordered_by_dest) {</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; chunk_edges : edges_) {</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; IdType vertex_chunk_index = chunk_edges.first;</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="comment">// sort the edges</span></div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="keywordflow">if</span> (adj_list_type_ == AdjListType::ordered_by_source)</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; sort(chunk_edges.second.begin(), chunk_edges.second.end(), cmp_src);</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keywordflow">if</span> (adj_list_type_ == AdjListType::ordered_by_dest)</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; sort(chunk_edges.second.begin(), chunk_edges.second.end(), cmp_dst);</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="comment">// construct and write offset chunk</span></div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; GAR_ASSIGN_OR_RAISE(</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <span class="keyword">auto</span> offset_table,</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; getOffsetTable(vertex_chunk_index, chunk_edges.second));</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; GAR_RETURN_NOT_OK(</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; writer.<a class="code" href="classgraphar_1_1_edge_chunk_writer.html#a9a9041e72a3d46e9fb8a2f1d2463489c">WriteOffsetChunk</a>(offset_table, vertex_chunk_index));</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; }</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; }</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="comment">// dump the vertex num</span></div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; GAR_RETURN_NOT_OK(writer.<a class="code" href="classgraphar_1_1_edge_chunk_writer.html#af3796d4dd08e7d876281f53d039dad5f">WriteVerticesNum</a>(num_vertices_));</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="comment">// dump the edge nums</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; IdType vertex_chunk_num =</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; (num_vertices_ + vertex_chunk_size_ - 1) / vertex_chunk_size_;</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keywordflow">for</span> (IdType vertex_chunk_index = 0; vertex_chunk_index &lt; vertex_chunk_num;</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; vertex_chunk_index++) {</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="keywordflow">if</span> (edges_.find(vertex_chunk_index) == edges_.end()) {</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; GAR_RETURN_NOT_OK(writer.<a class="code" href="classgraphar_1_1_edge_chunk_writer.html#abfa01f956f732e660eead056ce12f7c1">WriteEdgesNum</a>(vertex_chunk_index, 0));</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; GAR_RETURN_NOT_OK(writer.<a class="code" href="classgraphar_1_1_edge_chunk_writer.html#abfa01f956f732e660eead056ce12f7c1">WriteEdgesNum</a>(</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; vertex_chunk_index, edges_[vertex_chunk_index].size()));</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; }</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; }</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="comment">// dump the edges</span></div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; chunk_edges : edges_) {</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; IdType vertex_chunk_index = chunk_edges.first;</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="comment">// convert to table</span></div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; GAR_ASSIGN_OR_RAISE(<span class="keyword">auto</span> input_table, convertToTable(chunk_edges.second));</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="comment">// write table</span></div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; GAR_RETURN_NOT_OK(writer.<a class="code" href="classgraphar_1_1_edge_chunk_writer.html#adbe1029f7e8f1777da7e905ec0e0b0e4">WriteTable</a>(input_table, vertex_chunk_index, 0));</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; chunk_edges.second.clear();</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; }</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; is_saved_ = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#ad92f5c41a661d4f468390e39da90f881">Status::OK</a>();</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;}</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; </div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;<a class="code" href="classgraphar_1_1_status.html">Status</a> EdgesBuilder::validate(<span class="keyword">const</span> <a class="code" href="classgraphar_1_1builder_1_1_edge.html">Edge</a>&amp; e,</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; ValidateLevel validate_level)<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="comment">// use the builder&#39;s validate level</span></div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keywordflow">if</span> (validate_level == ValidateLevel::default_validate)</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; validate_level = validate_level_;</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="comment">// no validate</span></div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">if</span> (validate_level == ValidateLevel::no_validate)</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#ad92f5c41a661d4f468390e39da90f881">Status::OK</a>();</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; </div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <span class="comment">// weak validate</span></div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="comment">// can not add new edges after dumping</span></div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keywordflow">if</span> (is_saved_) {</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#a9ca4be37aae8dfea7e6ef54920e0073f">Status::Invalid</a>(</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="stringliteral">&quot;The edge builder has been saved, can not add &quot;</span></div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="stringliteral">&quot;new edges any more&quot;</span>);</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; }</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="comment">// adj list type not exits in edge info</span></div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keywordflow">if</span> (!edge_info_-&gt;HasAdjacentListType(adj_list_type_)) {</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#a4ee4924ddadfc2c1effc055572084d71">Status::KeyError</a>(</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="stringliteral">&quot;Adj list type &quot;</span>, AdjListTypeToString(adj_list_type_),</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="stringliteral">&quot; does not exist in the &quot;</span>, edge_info_-&gt;GetEdgeType(), <span class="stringliteral">&quot; edge info.&quot;</span>);</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; }</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; </div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="comment">// strong validate</span></div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keywordflow">if</span> (validate_level == ValidateLevel::strong_validate) {</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; property : e.<a class="code" href="classgraphar_1_1builder_1_1_edge.html#a3bfa90859f5326fdb5c32890045fe30f">GetProperties</a>()) {</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="comment">// check if the property is contained</span></div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <span class="keywordflow">if</span> (!edge_info_-&gt;HasProperty(property.first)) {</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#a4ee4924ddadfc2c1effc055572084d71">Status::KeyError</a>(<span class="stringliteral">&quot;Property with name &quot;</span>, property.first,</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="stringliteral">&quot; is not contained in the &quot;</span>,</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; edge_info_-&gt;GetEdgeType(), <span class="stringliteral">&quot; edge info.&quot;</span>);</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; }</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="comment">// check if the property type is correct</span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="keyword">auto</span> type = edge_info_-&gt;GetPropertyType(property.first).value();</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <span class="keywordtype">bool</span> invalid_type = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keywordflow">switch</span> (type-&gt;id()) {</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keywordflow">case</span> Type::BOOL:</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="keywordflow">if</span> (property.second.type() !=</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keyword">typeid</span>(<span class="keyword">typename</span> TypeToArrowType&lt;Type::BOOL&gt;::CType)) {</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; invalid_type = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; }</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordflow">case</span> Type::INT32:</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keywordflow">if</span> (property.second.type() !=</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="keyword">typeid</span>(<span class="keyword">typename</span> TypeToArrowType&lt;Type::INT32&gt;::CType)) {</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; invalid_type = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; }</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="keywordflow">case</span> Type::INT64:</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="keywordflow">if</span> (property.second.type() !=</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="keyword">typeid</span>(<span class="keyword">typename</span> TypeToArrowType&lt;Type::INT64&gt;::CType)) {</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; invalid_type = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; }</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="keywordflow">case</span> Type::FLOAT:</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <span class="keywordflow">if</span> (property.second.type() !=</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="keyword">typeid</span>(<span class="keyword">typename</span> TypeToArrowType&lt;Type::FLOAT&gt;::CType)) {</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; invalid_type = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; }</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordflow">case</span> Type::DOUBLE:</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="keywordflow">if</span> (property.second.type() !=</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="keyword">typeid</span>(<span class="keyword">typename</span> TypeToArrowType&lt;Type::DOUBLE&gt;::CType)) {</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; invalid_type = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; }</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">case</span> Type::STRING:</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <span class="keywordflow">if</span> (property.second.type() !=</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="keyword">typeid</span>(<span class="keyword">typename</span> TypeToArrowType&lt;Type::STRING&gt;::CType)) {</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; invalid_type = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; }</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keywordflow">case</span> Type::DATE:</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="comment">// date is stored as int32_t</span></div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keywordflow">if</span> (property.second.type() !=</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="keyword">typeid</span>(<span class="keyword">typename</span> TypeToArrowType&lt;Type::DATE&gt;::CType::c_type)) {</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; invalid_type = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; }</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keywordflow">case</span> Type::TIMESTAMP:</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <span class="comment">// timestamp is stored as int64_t</span></div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keywordflow">if</span> (property.second.type() !=</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="keyword">typeid</span>(<span class="keyword">typename</span> TypeToArrowType&lt;Type::TIMESTAMP&gt;::CType::c_type)) {</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; invalid_type = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; }</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keywordflow">default</span>:</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#a3335cf4bf5cd222d5e29b01fe95e919a">Status::TypeError</a>(<span class="stringliteral">&quot;Unsupported property type.&quot;</span>);</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; }</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keywordflow">if</span> (invalid_type) {</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#a3335cf4bf5cd222d5e29b01fe95e919a">Status::TypeError</a>(</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="stringliteral">&quot;Invalid data type for property &quot;</span>, property.first + <span class="stringliteral">&quot;, defined as &quot;</span>,</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; type-&gt;ToTypeName(), <span class="stringliteral">&quot;, but got &quot;</span>, property.second.type().name());</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; }</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; }</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; }</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#ad92f5c41a661d4f468390e39da90f881">Status::OK</a>();</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;}</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; </div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160;<span class="keyword">template</span> &lt;Type type&gt;</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;Status EdgesBuilder::tryToAppend(</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="keyword">const</span> std::string&amp; property_name,</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; std::shared_ptr&lt;arrow::Array&gt;&amp; array, <span class="comment">// NOLINT</span></div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="keyword">const</span> std::vector&lt;Edge&gt;&amp; edges) {</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="keyword">using</span> CType = <span class="keyword">typename</span> TypeToArrowType&lt;type&gt;::CType;</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; arrow::MemoryPool* pool = arrow::default_memory_pool();</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="keyword">typename</span> TypeToArrowType&lt;type&gt;::BuilderType builder(pool);</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; e : edges) {</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keywordflow">if</span> (e.<a class="code" href="classgraphar_1_1builder_1_1_edge.html#a72fb5b2f66654a1c3c43f94b56c64564">Empty</a>() || (!e.<a class="code" href="classgraphar_1_1builder_1_1_edge.html#aba23b764fc6ff8cabbff996e64c8e496">ContainProperty</a>(property_name))) {</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; RETURN_NOT_ARROW_OK(builder.AppendNull());</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; RETURN_NOT_ARROW_OK(</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; builder.Append(std::any_cast&lt;CType&gt;(e.<a class="code" href="classgraphar_1_1builder_1_1_edge.html#a3074b581309a533760c99b66eedaffbd">GetProperty</a>(property_name))));</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; }</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; }</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; array = builder.Finish().ValueOrDie();</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#ad92f5c41a661d4f468390e39da90f881">Status::OK</a>();</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160;}</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; </div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160;<span class="keyword">template</span> &lt;&gt;</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160;Status EdgesBuilder::tryToAppend&lt;Type::TIMESTAMP&gt;(</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="keyword">const</span> std::string&amp; property_name,</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; std::shared_ptr&lt;arrow::Array&gt;&amp; array, <span class="comment">// NOLINT</span></div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="keyword">const</span> std::vector&lt;Edge&gt;&amp; edges) {</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keyword">using</span> CType = <span class="keyword">typename</span> TypeToArrowType&lt;Type::TIMESTAMP&gt;::CType::c_type;</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; arrow::MemoryPool* pool = arrow::default_memory_pool();</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; <span class="keyword">typename</span> TypeToArrowType&lt;Type::TIMESTAMP&gt;::BuilderType builder(</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; arrow::timestamp(arrow::TimeUnit::MILLI), pool);</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; e : edges) {</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <span class="keywordflow">if</span> (e.<a class="code" href="classgraphar_1_1builder_1_1_edge.html#a72fb5b2f66654a1c3c43f94b56c64564">Empty</a>() || (!e.<a class="code" href="classgraphar_1_1builder_1_1_edge.html#aba23b764fc6ff8cabbff996e64c8e496">ContainProperty</a>(property_name))) {</div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; RETURN_NOT_ARROW_OK(builder.AppendNull());</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; RETURN_NOT_ARROW_OK(</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; builder.Append(std::any_cast&lt;CType&gt;(e.<a class="code" href="classgraphar_1_1builder_1_1_edge.html#a3074b581309a533760c99b66eedaffbd">GetProperty</a>(property_name))));</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; }</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; }</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; array = builder.Finish().ValueOrDie();</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#ad92f5c41a661d4f468390e39da90f881">Status::OK</a>();</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160;}</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; </div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160;<span class="keyword">template</span> &lt;&gt;</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160;Status EdgesBuilder::tryToAppend&lt;Type::DATE&gt;(</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keyword">const</span> std::string&amp; property_name,</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; std::shared_ptr&lt;arrow::Array&gt;&amp; array, <span class="comment">// NOLINT</span></div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keyword">const</span> std::vector&lt;Edge&gt;&amp; edges) {</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keyword">using</span> CType = <span class="keyword">typename</span> TypeToArrowType&lt;Type::DATE&gt;::CType::c_type;</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; arrow::MemoryPool* pool = arrow::default_memory_pool();</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keyword">typename</span> TypeToArrowType&lt;Type::DATE&gt;::BuilderType builder(pool);</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; e : edges) {</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; <span class="keywordflow">if</span> (e.<a class="code" href="classgraphar_1_1builder_1_1_edge.html#a72fb5b2f66654a1c3c43f94b56c64564">Empty</a>() || (!e.<a class="code" href="classgraphar_1_1builder_1_1_edge.html#aba23b764fc6ff8cabbff996e64c8e496">ContainProperty</a>(property_name))) {</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; RETURN_NOT_ARROW_OK(builder.AppendNull());</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; RETURN_NOT_ARROW_OK(</div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; builder.Append(std::any_cast&lt;CType&gt;(e.<a class="code" href="classgraphar_1_1builder_1_1_edge.html#a3074b581309a533760c99b66eedaffbd">GetProperty</a>(property_name))));</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; }</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; }</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; array = builder.Finish().ValueOrDie();</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#ad92f5c41a661d4f468390e39da90f881">Status::OK</a>();</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160;}</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; </div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160;Status EdgesBuilder::appendToArray(</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <span class="keyword">const</span> std::shared_ptr&lt;DataType&gt;&amp; type, <span class="keyword">const</span> std::string&amp; property_name,</div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; std::shared_ptr&lt;arrow::Array&gt;&amp; array, <span class="comment">// NOLINT</span></div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; <span class="keyword">const</span> std::vector&lt;Edge&gt;&amp; edges) {</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="keywordflow">switch</span> (type-&gt;id()) {</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keywordflow">case</span> Type::BOOL:</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::BOOL&gt;(property_name, array, edges);</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordflow">case</span> Type::INT32:</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::INT32&gt;(property_name, array, edges);</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <span class="keywordflow">case</span> Type::INT64:</div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::INT64&gt;(property_name, array, edges);</div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; <span class="keywordflow">case</span> Type::FLOAT:</div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::FLOAT&gt;(property_name, array, edges);</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="keywordflow">case</span> Type::DOUBLE:</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::DOUBLE&gt;(property_name, array, edges);</div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="keywordflow">case</span> Type::STRING:</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::STRING&gt;(property_name, array, edges);</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="keywordflow">case</span> Type::DATE:</div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::DATE&gt;(property_name, array, edges);</div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <span class="keywordflow">case</span> Type::TIMESTAMP:</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::TIMESTAMP&gt;(property_name, array, edges);</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="keywordflow">default</span>:</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#a3335cf4bf5cd222d5e29b01fe95e919a">Status::TypeError</a>(<span class="stringliteral">&quot;Unsupported property type.&quot;</span>);</div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; }</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#ad92f5c41a661d4f468390e39da90f881">Status::OK</a>();</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160;}</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; </div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160;Status EdgesBuilder::tryToAppend(</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <span class="keywordtype">int</span> src_or_dest,</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; std::shared_ptr&lt;arrow::Array&gt;&amp; array, <span class="comment">// NOLINT</span></div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; <span class="keyword">const</span> std::vector&lt;Edge&gt;&amp; edges) {</div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; arrow::MemoryPool* pool = arrow::default_memory_pool();</div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="keyword">typename</span> arrow::TypeTraits&lt;arrow::Int64Type&gt;::BuilderType builder(pool);</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; e : edges) {</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; RETURN_NOT_ARROW_OK(builder.Append(std::any_cast&lt;int64_t&gt;(</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; src_or_dest == 1 ? e.<a class="code" href="classgraphar_1_1builder_1_1_edge.html#a4c804187c83dbb379dfbf628e6cf03e5">GetSource</a>() : e.<a class="code" href="classgraphar_1_1builder_1_1_edge.html#a9c54afa261c314e170ecc3cf097843e5">GetDestination</a>())));</div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; }</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; array = builder.Finish().ValueOrDie();</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#ad92f5c41a661d4f468390e39da90f881">Status::OK</a>();</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160;}</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; </div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160;Result&lt;std::shared_ptr&lt;arrow::Table&gt;&gt; EdgesBuilder::convertToTable(</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="keyword">const</span> std::vector&lt;Edge&gt;&amp; edges) {</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; property_groups = edge_info_-&gt;GetPropertyGroups();</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; std::vector&lt;std::shared_ptr&lt;arrow::Array&gt;&gt; arrays;</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; std::vector&lt;std::shared_ptr&lt;arrow::Field&gt;&gt; schema_vector;</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="comment">// add src</span></div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; std::shared_ptr&lt;arrow::Array&gt; array;</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; schema_vector.push_back(arrow::field(</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; GeneralParams::kSrcIndexCol, DataType::DataTypeToArrowDataType(int64())));</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; GAR_RETURN_NOT_OK(tryToAppend(1, array, edges));</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; arrays.push_back(array);</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="comment">// add dst</span></div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; schema_vector.push_back(arrow::field(</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; GeneralParams::kDstIndexCol, DataType::DataTypeToArrowDataType(int64())));</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; GAR_RETURN_NOT_OK(tryToAppend(0, array, edges));</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; arrays.push_back(array);</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; <span class="comment">// add properties</span></div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; property_group : property_groups) {</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; property : property_group-&gt;GetProperties()) {</div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="comment">// add a column to schema</span></div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; schema_vector.push_back(arrow::field(</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; property.name, DataType::DataTypeToArrowDataType(property.type)));</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <span class="comment">// add a column to data</span></div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; std::shared_ptr&lt;arrow::Array&gt; array;</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; GAR_RETURN_NOT_OK(</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; appendToArray(property.type, property.name, array, edges));</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; arrays.push_back(array);</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; }</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; }</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="keyword">auto</span> schema = std::make_shared&lt;arrow::Schema&gt;(schema_vector);</div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="keywordflow">return</span> arrow::Table::Make(schema, arrays);</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160;}</div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; </div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160;Result&lt;std::shared_ptr&lt;arrow::Table&gt;&gt; EdgesBuilder::getOffsetTable(</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; IdType vertex_chunk_index, <span class="keyword">const</span> std::vector&lt;Edge&gt;&amp; edges) {</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; arrow::Int64Builder builder;</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; IdType begin_index = vertex_chunk_index * vertex_chunk_size_,</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; end_index = begin_index + vertex_chunk_size_;</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; RETURN_NOT_ARROW_OK(builder.Append(0));</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; </div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; std::vector&lt;std::shared_ptr&lt;arrow::Array&gt;&gt; arrays;</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; std::vector&lt;std::shared_ptr&lt;arrow::Field&gt;&gt; schema_vector;</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; schema_vector.push_back(arrow::field(</div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; GeneralParams::kOffsetCol, DataType::DataTypeToArrowDataType(int64())));</div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; </div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="keywordtype">size_t</span> index = 0;</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="keywordflow">for</span> (IdType i = begin_index; i &lt; end_index; i++) {</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="keywordflow">while</span> (index &lt; edges.size()) {</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; int64_t x = (adj_list_type_ == AdjListType::ordered_by_source</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; ? edges[index].GetSource()</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; : edges[index].GetDestination());</div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <span class="keywordflow">if</span> (x &lt;= i) {</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; index++;</div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; }</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; }</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; RETURN_NOT_ARROW_OK(builder.Append(index));</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; }</div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; GAR_RETURN_ON_ARROW_ERROR_AND_ASSIGN(<span class="keyword">auto</span> array, builder.Finish());</div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; arrays.push_back(array);</div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="keyword">auto</span> schema = std::make_shared&lt;arrow::Schema&gt;(schema_vector);</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="keywordflow">return</span> arrow::Table::Make(schema, arrays);</div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160;}</div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; </div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160;} <span class="comment">// namespace graphar::builder</span></div>
<div class="ttc" id="aclassgraphar_1_1_edge_chunk_writer_html"><div class="ttname"><a href="classgraphar_1_1_edge_chunk_writer.html">graphar::EdgeChunkWriter</a></div><div class="ttdoc">The writer for edge (adj list, offset and property group) chunks.</div><div class="ttdef"><b>Definition:</b> <a href="chunk__writer_8h_source.html#l00320">chunk_writer.h:320</a></div></div>
<div class="ttc" id="aclassgraphar_1_1_edge_chunk_writer_html_a9a9041e72a3d46e9fb8a2f1d2463489c"><div class="ttname"><a href="classgraphar_1_1_edge_chunk_writer.html#a9a9041e72a3d46e9fb8a2f1d2463489c">graphar::EdgeChunkWriter::WriteOffsetChunk</a></div><div class="ttdeci">Status WriteOffsetChunk(const std::shared_ptr&lt; arrow::Table &gt; &amp;input_table, IdType vertex_chunk_index, ValidateLevel validate_level=ValidateLevel::default_validate) const</div><div class="ttdoc">Validate and write the offset chunk for a vertex chunk.</div><div class="ttdef"><b>Definition:</b> <a href="chunk__writer_8cc_source.html#l00730">chunk_writer.cc:730</a></div></div>
<div class="ttc" id="aclassgraphar_1_1_edge_chunk_writer_html_abfa01f956f732e660eead056ce12f7c1"><div class="ttname"><a href="classgraphar_1_1_edge_chunk_writer.html#abfa01f956f732e660eead056ce12f7c1">graphar::EdgeChunkWriter::WriteEdgesNum</a></div><div class="ttdeci">Status WriteEdgesNum(IdType vertex_chunk_index, const IdType &amp;count, ValidateLevel validate_level=ValidateLevel::default_validate) const</div><div class="ttdoc">Write the number of edges into the file.</div><div class="ttdef"><b>Definition:</b> <a href="chunk__writer_8cc_source.html#l00711">chunk_writer.cc:711</a></div></div>
<div class="ttc" id="aclassgraphar_1_1_edge_chunk_writer_html_adbe1029f7e8f1777da7e905ec0e0b0e4"><div class="ttname"><a href="classgraphar_1_1_edge_chunk_writer.html#adbe1029f7e8f1777da7e905ec0e0b0e4">graphar::EdgeChunkWriter::WriteTable</a></div><div class="ttdeci">Status WriteTable(const std::shared_ptr&lt; arrow::Table &gt; &amp;input_table, IdType vertex_chunk_index, IdType start_chunk_index=0, ValidateLevel validate_level=ValidateLevel::default_validate) const</div><div class="ttdoc">Write chunks of the adj list and all property groups for the edges of a vertex chunk.</div><div class="ttdef"><b>Definition:</b> <a href="chunk__writer_8cc_source.html#l00876">chunk_writer.cc:876</a></div></div>
<div class="ttc" id="aclassgraphar_1_1_edge_chunk_writer_html_af3796d4dd08e7d876281f53d039dad5f"><div class="ttname"><a href="classgraphar_1_1_edge_chunk_writer.html#af3796d4dd08e7d876281f53d039dad5f">graphar::EdgeChunkWriter::WriteVerticesNum</a></div><div class="ttdeci">Status WriteVerticesNum(const IdType &amp;count, ValidateLevel validate_level=ValidateLevel::default_validate) const</div><div class="ttdoc">Write the number of vertices into the file.</div><div class="ttdef"><b>Definition:</b> <a href="chunk__writer_8cc_source.html#l00721">chunk_writer.cc:721</a></div></div>
<div class="ttc" id="aclassgraphar_1_1_status_html"><div class="ttname"><a href="classgraphar_1_1_status.html">graphar::Status</a></div><div class="ttdoc">Status outcome object (success or error)</div><div class="ttdef"><b>Definition:</b> <a href="status_8h_source.html#l00123">status.h:123</a></div></div>
<div class="ttc" id="aclassgraphar_1_1_status_html_a3335cf4bf5cd222d5e29b01fe95e919a"><div class="ttname"><a href="classgraphar_1_1_status.html#a3335cf4bf5cd222d5e29b01fe95e919a">graphar::Status::TypeError</a></div><div class="ttdeci">static Status TypeError(Args &amp;&amp;... args)</div><div class="ttdef"><b>Definition:</b> <a href="status_8h_source.html#l00178">status.h:178</a></div></div>
<div class="ttc" id="aclassgraphar_1_1_status_html_a4ee4924ddadfc2c1effc055572084d71"><div class="ttname"><a href="classgraphar_1_1_status.html#a4ee4924ddadfc2c1effc055572084d71">graphar::Status::KeyError</a></div><div class="ttdeci">static Status KeyError(Args &amp;&amp;... args)</div><div class="ttdef"><b>Definition:</b> <a href="status_8h_source.html#l00172">status.h:172</a></div></div>
<div class="ttc" id="aclassgraphar_1_1_status_html_a9ca4be37aae8dfea7e6ef54920e0073f"><div class="ttname"><a href="classgraphar_1_1_status.html#a9ca4be37aae8dfea7e6ef54920e0073f">graphar::Status::Invalid</a></div><div class="ttdeci">static Status Invalid(Args &amp;&amp;... args)</div><div class="ttdef"><b>Definition:</b> <a href="status_8h_source.html#l00188">status.h:188</a></div></div>
<div class="ttc" id="aclassgraphar_1_1_status_html_ad92f5c41a661d4f468390e39da90f881"><div class="ttname"><a href="classgraphar_1_1_status.html#ad92f5c41a661d4f468390e39da90f881">graphar::Status::OK</a></div><div class="ttdeci">static Status OK()</div><div class="ttdef"><b>Definition:</b> <a href="status_8h_source.html#l00157">status.h:157</a></div></div>
<div class="ttc" id="aclassgraphar_1_1builder_1_1_edge_html"><div class="ttname"><a href="classgraphar_1_1builder_1_1_edge.html">graphar::builder::Edge</a></div><div class="ttdoc">Edge is designed for constructing edges builder.</div><div class="ttdef"><b>Definition:</b> <a href="edges__builder_8h_source.html#l00045">edges_builder.h:45</a></div></div>
<div class="ttc" id="aclassgraphar_1_1builder_1_1_edge_html_a3074b581309a533760c99b66eedaffbd"><div class="ttname"><a href="classgraphar_1_1builder_1_1_edge.html#a3074b581309a533760c99b66eedaffbd">graphar::builder::Edge::GetProperty</a></div><div class="ttdeci">const std::any &amp; GetProperty(const std::string &amp;property) const</div><div class="ttdoc">Get a property of the edge.</div><div class="ttdef"><b>Definition:</b> <a href="edges__builder_8h_source.html#l00095">edges_builder.h:95</a></div></div>
<div class="ttc" id="aclassgraphar_1_1builder_1_1_edge_html_a3bfa90859f5326fdb5c32890045fe30f"><div class="ttname"><a href="classgraphar_1_1builder_1_1_edge.html#a3bfa90859f5326fdb5c32890045fe30f">graphar::builder::Edge::GetProperties</a></div><div class="ttdeci">const std::unordered_map&lt; std::string, std::any &gt; &amp; GetProperties() const</div><div class="ttdoc">Get all properties of the edge.</div><div class="ttdef"><b>Definition:</b> <a href="edges__builder_8h_source.html#l00104">edges_builder.h:104</a></div></div>
<div class="ttc" id="aclassgraphar_1_1builder_1_1_edge_html_a4c804187c83dbb379dfbf628e6cf03e5"><div class="ttname"><a href="classgraphar_1_1builder_1_1_edge.html#a4c804187c83dbb379dfbf628e6cf03e5">graphar::builder::Edge::GetSource</a></div><div class="ttdeci">IdType GetSource() const noexcept</div><div class="ttdoc">Get source id of the edge.</div><div class="ttdef"><b>Definition:</b> <a href="edges__builder_8h_source.html#l00068">edges_builder.h:68</a></div></div>
<div class="ttc" id="aclassgraphar_1_1builder_1_1_edge_html_a72fb5b2f66654a1c3c43f94b56c64564"><div class="ttname"><a href="classgraphar_1_1builder_1_1_edge.html#a72fb5b2f66654a1c3c43f94b56c64564">graphar::builder::Edge::Empty</a></div><div class="ttdeci">bool Empty() const noexcept</div><div class="ttdoc">Check if the edge is empty.</div><div class="ttdef"><b>Definition:</b> <a href="edges__builder_8h_source.html#l00061">edges_builder.h:61</a></div></div>
<div class="ttc" id="aclassgraphar_1_1builder_1_1_edge_html_a9c54afa261c314e170ecc3cf097843e5"><div class="ttname"><a href="classgraphar_1_1builder_1_1_edge.html#a9c54afa261c314e170ecc3cf097843e5">graphar::builder::Edge::GetDestination</a></div><div class="ttdeci">IdType GetDestination() const noexcept</div><div class="ttdoc">Get destination id of the edge.</div><div class="ttdef"><b>Definition:</b> <a href="edges__builder_8h_source.html#l00075">edges_builder.h:75</a></div></div>
<div class="ttc" id="aclassgraphar_1_1builder_1_1_edge_html_aba23b764fc6ff8cabbff996e64c8e496"><div class="ttname"><a href="classgraphar_1_1builder_1_1_edge.html#aba23b764fc6ff8cabbff996e64c8e496">graphar::builder::Edge::ContainProperty</a></div><div class="ttdeci">bool ContainProperty(const std::string &amp;property) const</div><div class="ttdoc">Check if the edge contains a property.</div><div class="ttdef"><b>Definition:</b> <a href="edges__builder_8h_source.html#l00115">edges_builder.h:115</a></div></div>
<div class="ttc" id="aclassgraphar_1_1builder_1_1_edges_builder_html_aa318de80b2b259e9fa4aef65f2ce5593"><div class="ttname"><a href="classgraphar_1_1builder_1_1_edges_builder.html#aa318de80b2b259e9fa4aef65f2ce5593">graphar::builder::EdgesBuilder::Dump</a></div><div class="ttdeci">Status Dump()</div><div class="ttdoc">Dump the collection into files.</div><div class="ttdef"><b>Definition:</b> <a href="edges__builder_8cc_source.html#l00029">edges_builder.cc:29</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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. See the License for the
specific language governing permissions and limitations
under the License.
-->
<!-- disclaimer_footer.html -->
<footer style="text-align: center; font-size: 12px;">
<div>
<p>
Apache GraphAr is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
</p>
<p>
Copyright © 2024 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. <br/>
Apache, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.
</p>
</div>
</footer>