blob: 6b7dea54db63348ba25437685ca1d98c01c5e5c9 [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/vertices_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">vertices_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;graphar/high-level/vertices_builder.h&quot;</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &lt;any&gt;</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &lt;iterator&gt;</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &quot;graphar/convert_to_arrow_type.h&quot;</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &quot;graphar/fwd.h&quot;</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &quot;graphar/graph_info.h&quot;</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &quot;graphar/label.h&quot;</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="preprocessor">#include &quot;graphar/status.h&quot;</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; </div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="keyword">namespace </span>graphar::builder {</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; </div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;Status VerticesBuilder::validate(<span class="keyword">const</span> Vertex&amp; v, IdType index,</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; ValidateLevel validate_level)<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="comment">// use the builder&#39;s validate level</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; <span class="keywordflow">if</span> (validate_level == ValidateLevel::default_validate)</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; validate_level = validate_level_;</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <span class="comment">// no validate</span></div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; <span class="keywordflow">if</span> (validate_level == ValidateLevel::no_validate)</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</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="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">// weak validate</span></div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; <span class="comment">// can not add new vertices after dumping</span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <span class="keywordflow">if</span> (is_saved_) {</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</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="l00045"></a><span class="lineno"> 45</span>&#160; <span class="stringliteral">&quot;The vertices builder has been saved, can not add &quot;</span></div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="stringliteral">&quot;new vertices any more&quot;</span>);</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; }</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <span class="comment">// the start vertex index must be aligned with the chunk size</span></div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keywordflow">if</span> (start_vertex_index_ % vertex_info_-&gt;GetChunkSize() != 0) {</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#a1f9b2120c7a6b3e66f9f2e31021df67f">Status::IndexError</a>(<span class="stringliteral">&quot;The start vertex index &quot;</span>, start_vertex_index_,</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="stringliteral">&quot; is not aligned with the chunk size &quot;</span>,</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; vertex_info_-&gt;GetChunkSize());</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; }</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="comment">// the vertex index must larger than start index</span></div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keywordflow">if</span> (index != -1 &amp;&amp; index &lt; start_vertex_index_) {</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#a1f9b2120c7a6b3e66f9f2e31021df67f">Status::IndexError</a>(<span class="stringliteral">&quot;The vertex index &quot;</span>, index,</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="stringliteral">&quot; is smaller than the start index &quot;</span>,</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; start_vertex_index_);</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; }</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; </div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="comment">// strong validate</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="keywordflow">if</span> (validate_level == ValidateLevel::strong_validate) {</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; property : v.GetProperties()) {</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="comment">// check if the property is contained</span></div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="keywordflow">if</span> (!vertex_info_-&gt;HasProperty(property.first)) {</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</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="l00067"></a><span class="lineno"> 67</span>&#160; <span class="stringliteral">&quot; is not contained in the &quot;</span>,</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; vertex_info_-&gt;GetType(), <span class="stringliteral">&quot; vertex info.&quot;</span>);</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; }</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="comment">// check if the property type is correct</span></div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <span class="keyword">auto</span> type = vertex_info_-&gt;GetPropertyType(property.first).value();</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="keywordtype">bool</span> invalid_type = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keywordflow">switch</span> (type-&gt;id()) {</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keywordflow">case</span> Type::BOOL:</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; GAR_RETURN_NOT_OK(</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; v.ValidatePropertyType&lt;<span class="keyword">typename</span> TypeToArrowType&lt;Type::BOOL&gt;::CType&gt;(</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; property.first,</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; vertex_info_-&gt;GetPropertyCardinality(property.first).value()));</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="keywordflow">case</span> Type::INT32:</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; GAR_RETURN_NOT_OK(v.ValidatePropertyType&lt;</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keyword">typename</span> TypeToArrowType&lt;Type::INT32&gt;::CType&gt;(</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; property.first,</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; vertex_info_-&gt;GetPropertyCardinality(property.first).value()));</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keywordflow">case</span> Type::INT64:</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; GAR_RETURN_NOT_OK(v.ValidatePropertyType&lt;</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="keyword">typename</span> TypeToArrowType&lt;Type::INT64&gt;::CType&gt;(</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; property.first,</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; vertex_info_-&gt;GetPropertyCardinality(property.first).value()));</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">case</span> Type::FLOAT:</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; GAR_RETURN_NOT_OK(v.ValidatePropertyType&lt;</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keyword">typename</span> TypeToArrowType&lt;Type::FLOAT&gt;::CType&gt;(</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; property.first,</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; vertex_info_-&gt;GetPropertyCardinality(property.first).value()));</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="keywordflow">case</span> Type::DOUBLE:</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; GAR_RETURN_NOT_OK(v.ValidatePropertyType&lt;</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="keyword">typename</span> TypeToArrowType&lt;Type::DOUBLE&gt;::CType&gt;(</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; property.first,</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; vertex_info_-&gt;GetPropertyCardinality(property.first).value()));</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keywordflow">case</span> Type::STRING:</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; GAR_RETURN_NOT_OK(v.ValidatePropertyType&lt;</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keyword">typename</span> TypeToArrowType&lt;Type::STRING&gt;::CType&gt;(</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; property.first,</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; vertex_info_-&gt;GetPropertyCardinality(property.first).value()));</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keywordflow">case</span> Type::DATE:</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="comment">// date is stored as int32_t</span></div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; GAR_RETURN_NOT_OK(v.ValidatePropertyType&lt;</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <span class="keyword">typename</span> TypeToArrowType&lt;Type::DATE&gt;::CType::c_type&gt;(</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; property.first,</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; vertex_info_-&gt;GetPropertyCardinality(property.first).value()));</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="keywordflow">case</span> Type::TIMESTAMP:</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="comment">// timestamp is stored as int64_t</span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; GAR_RETURN_NOT_OK(</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; v.ValidatePropertyType&lt;</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keyword">typename</span> TypeToArrowType&lt;Type::TIMESTAMP&gt;::CType::c_type&gt;(</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; property.first,</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; vertex_info_-&gt;GetPropertyCardinality(property.first).value()));</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="keywordflow">default</span>:</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</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="l00127"></a><span class="lineno"> 127</span>&#160; }</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordflow">if</span> (invalid_type &amp;&amp;</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; Cardinality::SINGLE ==</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; vertex_info_-&gt;GetPropertyCardinality(property.first).value()) {</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</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="l00132"></a><span class="lineno"> 132</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="l00133"></a><span class="lineno"> 133</span>&#160; type-&gt;ToTypeName(), <span class="stringliteral">&quot;, but got &quot;</span>, property.second.type().name());</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; }</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; }</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; }</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</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="l00138"></a><span class="lineno"> 138</span>&#160;}</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; </div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;<span class="keyword">template</span> &lt;Type type&gt;</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;Status VerticesBuilder::tryToAppend(</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="keyword">const</span> std::string&amp; property_name,</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; std::shared_ptr&lt;arrow::Array&gt;&amp; array) { <span class="comment">// NOLINT</span></div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="keyword">using</span> CType = <span class="keyword">typename</span> TypeToArrowType&lt;type&gt;::CType;</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; arrow::MemoryPool* pool = arrow::default_memory_pool();</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keyword">auto</span> builder =</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; std::make_shared&lt;typename TypeToArrowType&lt;type&gt;::BuilderType&gt;(pool);</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="keyword">auto</span> cardinality =</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; vertex_info_-&gt;GetPropertyCardinality(property_name).value();</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keywordflow">if</span> (cardinality != Cardinality::SINGLE) {</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; arrow::ListBuilder list_builder(pool, builder);</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; v : vertices_) {</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; RETURN_NOT_ARROW_OK(list_builder.Append());</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="keywordflow">if</span> (v.Empty() || !v.ContainProperty(property_name)) {</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; RETURN_NOT_ARROW_OK(builder-&gt;AppendNull());</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keywordflow">if</span> (!v.IsMultiProperty(property_name)) {</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; RETURN_NOT_ARROW_OK(builder-&gt;Append(</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; std::any_cast&lt;CType&gt;(v.GetProperty(property_name))));</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="keyword">auto</span> property_value_list = std::any_cast&lt;std::vector&lt;std::any&gt;&gt;(</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; v.GetProperty(property_name));</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; value : property_value_list) {</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; RETURN_NOT_ARROW_OK(builder-&gt;Append(std::any_cast&lt;CType&gt;(value)));</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; }</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; }</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; }</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; }</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; array = list_builder.Finish().ValueOrDie();</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; v : vertices_) {</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keywordflow">if</span> (v.Empty() || !v.ContainProperty(property_name)) {</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; RETURN_NOT_ARROW_OK(builder-&gt;AppendNull());</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; RETURN_NOT_ARROW_OK(builder-&gt;Append(</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; std::any_cast&lt;CType&gt;(v.GetProperty(property_name))));</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; }</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; }</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; array = builder-&gt;Finish().ValueOrDie();</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; <span class="keywordflow">return</span> <a class="code" href="classgraphar_1_1_status.html#ad92f5c41a661d4f468390e39da90f881">Status::OK</a>();</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160;}</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;<span class="keyword">template</span> &lt;&gt;</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160;Status VerticesBuilder::tryToAppend&lt;Type::TIMESTAMP&gt;(</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; <span class="keyword">const</span> std::string&amp; property_name,</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; std::shared_ptr&lt;arrow::Array&gt;&amp; array) { <span class="comment">// NOLINT</span></div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</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="l00189"></a><span class="lineno"> 189</span>&#160; arrow::MemoryPool* pool = arrow::default_memory_pool();</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="keyword">typename</span> TypeToArrowType&lt;Type::TIMESTAMP&gt;::BuilderType builder(</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; arrow::timestamp(arrow::TimeUnit::MILLI), pool);</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; v : vertices_) {</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="keywordflow">if</span> (v.Empty() || !v.ContainProperty(property_name)) {</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; RETURN_NOT_ARROW_OK(builder.AppendNull());</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; RETURN_NOT_ARROW_OK(</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; builder.Append(std::any_cast&lt;CType&gt;(v.GetProperty(property_name))));</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; }</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; array = builder.Finish().ValueOrDie();</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</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="l00202"></a><span class="lineno"> 202</span>&#160;}</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;<span class="keyword">template</span> &lt;&gt;</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160;Status VerticesBuilder::tryToAppend&lt;Type::DATE&gt;(</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <span class="keyword">const</span> std::string&amp; property_name,</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; std::shared_ptr&lt;arrow::Array&gt;&amp; array) { <span class="comment">// NOLINT</span></div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</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="l00209"></a><span class="lineno"> 209</span>&#160; arrow::MemoryPool* pool = arrow::default_memory_pool();</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keyword">typename</span> TypeToArrowType&lt;Type::DATE&gt;::BuilderType builder(pool);</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; v : vertices_) {</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; <span class="keywordflow">if</span> (v.Empty() || !v.ContainProperty(property_name)) {</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; RETURN_NOT_ARROW_OK(builder.AppendNull());</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; RETURN_NOT_ARROW_OK(</div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; builder.Append(std::any_cast&lt;CType&gt;(v.GetProperty(property_name))));</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; }</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; }</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; array = builder.Finish().ValueOrDie();</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</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="l00221"></a><span class="lineno"> 221</span>&#160;}</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; </div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160;Status VerticesBuilder::appendToArray(</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</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="l00225"></a><span class="lineno"> 225</span>&#160; std::shared_ptr&lt;arrow::Array&gt;&amp; array) { <span class="comment">// NOLINT</span></div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="keywordflow">switch</span> (type-&gt;id()) {</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; <span class="keywordflow">case</span> Type::BOOL:</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::BOOL&gt;(property_name, array);</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keywordflow">case</span> Type::INT32:</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::INT32&gt;(property_name, array);</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keywordflow">case</span> Type::INT64:</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::INT64&gt;(property_name, array);</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordflow">case</span> Type::FLOAT:</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::FLOAT&gt;(property_name, array);</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; <span class="keywordflow">case</span> Type::DOUBLE:</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::DOUBLE&gt;(property_name, array);</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keywordflow">case</span> Type::STRING:</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::STRING&gt;(property_name, array);</div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <span class="keywordflow">case</span> Type::DATE:</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::DATE&gt;(property_name, array);</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="keywordflow">case</span> Type::TIMESTAMP:</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="keywordflow">return</span> tryToAppend&lt;Type::TIMESTAMP&gt;(property_name, array);</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="keywordflow">default</span>:</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</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="l00245"></a><span class="lineno"> 245</span>&#160; }</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</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="l00247"></a><span class="lineno"> 247</span>&#160;}</div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; </div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160;Result&lt;std::shared_ptr&lt;arrow::Table&gt;&gt; VerticesBuilder::convertToTable() {</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; property_groups = vertex_info_-&gt;GetPropertyGroups();</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; std::vector&lt;std::shared_ptr&lt;arrow::Array&gt;&gt; arrays;</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; std::vector&lt;std::shared_ptr&lt;arrow::Field&gt;&gt; schema_vector;</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; property_group : property_groups) {</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; property : property_group-&gt;GetProperties()) {</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <span class="comment">// add a column to schema</span></div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <span class="keywordflow">if</span> (vertex_info_-&gt;GetPropertyCardinality(property.name).value() !=</div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; Cardinality::SINGLE) {</div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; schema_vector.push_back(arrow::field(</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; property.name,</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; arrow::list(DataType::DataTypeToArrowDataType(property.type))));</div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; schema_vector.push_back(arrow::field(</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; property.name, DataType::DataTypeToArrowDataType(property.type)));</div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; }</div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <span class="comment">// add a column to data</span></div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; std::shared_ptr&lt;arrow::Array&gt; array;</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; GAR_RETURN_NOT_OK(appendToArray(property.type, property.name, array));</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; arrays.push_back(array);</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; }</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; <span class="keyword">auto</span> schema = std::make_shared&lt;arrow::Schema&gt;(schema_vector);</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <span class="keywordflow">return</span> arrow::Table::Make(schema, arrays);</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160;}</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; </div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160;} <span class="comment">// namespace graphar::builder</span></div>
<div class="ttc" id="aclassgraphar_1_1_status_html_a1f9b2120c7a6b3e66f9f2e31021df67f"><div class="ttname"><a href="classgraphar_1_1_status.html#a1f9b2120c7a6b3e66f9f2e31021df67f">graphar::Status::IndexError</a></div><div class="ttdeci">static Status IndexError(Args &amp;&amp;... args)</div><div class="ttdef"><b>Definition:</b> <a href="status_8h_source.html#l00197">status.h:197</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><!-- 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>