blob: 6adfa02701e040a2da24f4695b7fe22a868c3d62 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://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.8.6"/>
<title>Impala: be/src/exec/partitioned-aggregation-node-ir.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="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</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 style="padding-left: 0.5em;">
<div id="projectname">Impala
</div>
<div id="projectbrief">Impalaistheopensource,nativeanalyticdatabaseforApacheHadoop.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.6 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>File&#160;Members</span></a></li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('partitioned-aggregation-node-ir_8cc_source.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark">&#160;</span>Friends</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark">&#160;</span>Macros</a></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 class="header">
<div class="headertitle">
<div class="title">partitioned-aggregation-node-ir.cc</div> </div>
</div><!--header-->
<div class="contents">
<a href="partitioned-aggregation-node-ir_8cc.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">// Copyright 2012 Cloudera Inc.</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">// you may not use this file except in compliance with the License.</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">// You may obtain a copy of the License at</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// Unless required by applicable law or agreed to in writing, software</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment">// See the License for the specific language governing permissions and</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment">// limitations under the License.</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;</div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="partitioned-aggregation-node_8h.html">exec/partitioned-aggregation-node.h</a>&quot;</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;</div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="hash-table_8inline_8h.html">exec/hash-table.inline.h</a>&quot;</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="buffered-tuple-stream_8inline_8h.html">runtime/buffered-tuple-stream.inline.h</a>&quot;</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="row-batch_8h.html">runtime/row-batch.h</a>&quot;</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="tuple-row_8h.html">runtime/tuple-row.h</a>&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="keyword">using namespace </span>impala;</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;</div>
<div class="line"><a name="l00024"></a><span class="lineno"><a class="line" href="classimpala_1_1PartitionedAggregationNode.html#a2db05c41fcf4abdfc055b681c49e7681"> 24</a></span>&#160;<a class="code" href="classimpala_1_1Status.html">Status</a> <a class="code" href="classimpala_1_1PartitionedAggregationNode.html#a2db05c41fcf4abdfc055b681c49e7681">PartitionedAggregationNode::ProcessBatchNoGrouping</a>(</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; <a class="code" href="classimpala_1_1RowBatch.html">RowBatch</a>* batch, <a class="code" href="classimpala_1_1HashTableCtx.html">HashTableCtx</a>* ht_ctx) {</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; batch-&gt;<a class="code" href="classimpala_1_1RowBatch.html#ac695df3b85ee416b3d99844813ae813d">num_rows</a>(); ++i) {</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <a class="code" href="classimpala_1_1PartitionedAggregationNode.html#a7ac3e25ed19dea651e1c14df96cd41c0">UpdateTuple</a>(&amp;<a class="code" href="classimpala_1_1PartitionedAggregationNode.html#ae3864673f6382e259fff631b7117ccce">agg_fn_ctxs_</a>[0], <a class="code" href="classimpala_1_1PartitionedAggregationNode.html#a1be76038a408e755fbf1a97c1162ef70">singleton_output_tuple_</a>, batch-&gt;<a class="code" href="classimpala_1_1RowBatch.html#a9320ed986b0717ef26d73d871f3b3a42">GetRow</a>(i));</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"> 29</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classimpala_1_1Status.html#a580565665ea944eb64f3f495b1bee1e0">Status::OK</a>;</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;}</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;<span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> AGGREGATED_ROWS&gt;</div>
<div class="line"><a name="l00033"></a><span class="lineno"><a class="line" href="classimpala_1_1PartitionedAggregationNode.html#a5f9cb7712aea1ff0071e721d9c73bac4"> 33</a></span>&#160;<a class="code" href="classimpala_1_1Status.html">Status</a> <a class="code" href="classimpala_1_1PartitionedAggregationNode.html#aae2da81f25785959647a0344dfd2007d">PartitionedAggregationNode::ProcessBatch</a>(<a class="code" href="classimpala_1_1RowBatch.html">RowBatch</a>* batch, <a class="code" href="classimpala_1_1HashTableCtx.html">HashTableCtx</a>* ht_ctx) {</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; DCHECK(!<a class="code" href="classimpala_1_1PartitionedAggregationNode.html#a0d63bbb39792bbc25d590cdb9fedb24f">hash_partitions_</a>.empty());</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; <span class="comment">// Make sure that no resizes will happen when inserting individual rows to the hash</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <span class="comment">// table of each partition by pessimistically assuming that all the rows in each batch</span></div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; <span class="comment">// will end up to the same partition.</span></div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; <span class="comment">// TODO: Once we have a histogram with the number of rows per partition, we will have</span></div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="comment">// accurate resize calls.</span></div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keywordtype">int</span> num_rows = batch-&gt;<a class="code" href="classimpala_1_1RowBatch.html#ac695df3b85ee416b3d99844813ae813d">num_rows</a>();</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> partition_idx = 0; partition_idx &lt; <a class="code" href="classimpala_1_1PartitionedAggregationNode.html#acb1104e2b77e54fe2929bc9b16542a65">PARTITION_FANOUT</a>; ++partition_idx) {</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html">Partition</a>* dst_partition = <a class="code" href="classimpala_1_1PartitionedAggregationNode.html#a0d63bbb39792bbc25d590cdb9fedb24f">hash_partitions_</a>[partition_idx];</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="keywordflow">while</span> (!dst_partition-&gt;<a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a9a5ccd17ccd74c816c636881532ea948">is_spilled</a>()) {</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; {</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <a class="code" href="runtime-profile_8h.html#aaa9a2971c6368e3ddd3f5140a0295eb7">SCOPED_TIMER</a>(<a class="code" href="classimpala_1_1PartitionedAggregationNode.html#afefaf067bf5fb3e10ea70326150bff25">ht_resize_timer_</a>);</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="keywordflow">if</span> (dst_partition-&gt;<a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a1f3cd48377bd279a79a719d202857691">hash_tbl</a>-&gt;CheckAndResize(num_rows, ht_ctx)) <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; }</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="comment">// There was not enough memory for the resize. Spill a partition and retry.</span></div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <a class="code" href="status_8h.html#a85f7d0e774e15eb35b74f53264305e16">RETURN_IF_ERROR</a>(<a class="code" href="classimpala_1_1PartitionedAggregationNode.html#ac4a11c3a397c2bd5bae862dde1c56c69">SpillPartition</a>());</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; }</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; }</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="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; num_rows; ++i) {</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <a class="code" href="classimpala_1_1TupleRow.html">TupleRow</a>* row = batch-&gt;<a class="code" href="classimpala_1_1RowBatch.html#a9320ed986b0717ef26d73d871f3b3a42">GetRow</a>(i);</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; uint32_t <a class="code" href="namespaceimpala.html#a50b59c9628eedf49aa82643ce601967d">hash</a> = 0;</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keywordflow">if</span> (AGGREGATED_ROWS) {</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keywordflow">if</span> (!ht_ctx-&gt;<a class="code" href="classimpala_1_1HashTableCtx.html#aa1c1b818cb5c0004d01f6ad7487a3394">EvalAndHashBuild</a>(row, &amp;hash)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="keywordflow">if</span> (!ht_ctx-&gt;<a class="code" href="classimpala_1_1HashTableCtx.html#a5f92cb6aa106a9fb60fb42debfe14979">EvalAndHashProbe</a>(row, &amp;hash)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; }</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="comment">// To process this row, we first see if it can be aggregated or inserted into this</span></div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="comment">// partition&#39;s hash table. If we need to insert it and that fails, due to OOM, we</span></div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="comment">// spill the partition. The partition to spill is not necessarily dst_partition,</span></div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="comment">// so we can try again to insert the row.</span></div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html">Partition</a>* dst_partition = <a class="code" href="classimpala_1_1PartitionedAggregationNode.html#a0d63bbb39792bbc25d590cdb9fedb24f">hash_partitions_</a>[hash &gt;&gt; (32 - <a class="code" href="classimpala_1_1PartitionedAggregationNode.html#ac06916f3c846bd1b6240135309c90f57">NUM_PARTITIONING_BITS</a>)];</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="keywordflow">if</span> (!dst_partition-&gt;<a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a9a5ccd17ccd74c816c636881532ea948">is_spilled</a>()) {</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; DCHECK_NOTNULL(dst_partition-&gt;<a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a1f3cd48377bd279a79a719d202857691">hash_tbl</a>.get());</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; DCHECK(dst_partition-&gt;<a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a7ea9def2ce9bb40d8a4476d432279258">aggregated_row_stream</a>-&gt;is_pinned());</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; <a class="code" href="classimpala_1_1HashTable.html">HashTable</a>* ht = dst_partition-&gt;<a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a1f3cd48377bd279a79a719d202857691">hash_tbl</a>.get();</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keywordflow">if</span> (!AGGREGATED_ROWS) {</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="comment">// If the row is already an aggregate row, it cannot match anything in the</span></div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="comment">// hash table since we process the aggregate rows first. These rows should</span></div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="comment">// have been aggregated in the initial pass.</span></div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="comment">// TODO: change HT interface to use a FindOrInsert() call</span></div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <a class="code" href="classimpala_1_1HashTable_1_1Iterator.html">HashTable::Iterator</a> it = ht-&gt;Find(ht_ctx, hash);</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="keywordflow">if</span> (!it.<a class="code" href="classimpala_1_1HashTable_1_1Iterator.html#aea6a675fd49a49907fe7734b94e15a61">AtEnd</a>()) {</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="comment">// Row is already in hash table. Do the aggregation and we&#39;re done.</span></div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <a class="code" href="classimpala_1_1PartitionedAggregationNode.html#a7ac3e25ed19dea651e1c14df96cd41c0">UpdateTuple</a>(&amp;dst_partition-&gt;<a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a7030cbd1f2cf22fc5b5de07460d45d2f">agg_fn_ctxs</a>[0], it.<a class="code" href="classimpala_1_1HashTable_1_1Iterator.html#a0116ff819c2e1f30e3c572f4295ac127">GetTuple</a>(), row);</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; }</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; DCHECK(ht-&gt;Find(ht_ctx, hash).AtEnd()) &lt;&lt; ht-&gt;size();</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; }</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <a class="code" href="classimpala_1_1Tuple.html">Tuple</a>* intermediate_tuple = NULL;</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;allocate_tuple:</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;<span class="preprocessor">#if 0</span></div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160;<span class="preprocessor"></span> <span class="comment">// TODO: this optimization doesn&#39;t work. Why?</span></div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="comment">// First construct the intermediate tuple in the dst partition&#39;s stream.</span></div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="comment">// TODO: needs_serialize can be removed with codegen.</span></div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keywordflow">if</span> (AGGREGATED_ROWS &amp;&amp; !<a class="code" href="classimpala_1_1PartitionedAggregationNode.html#ae61abd47cef04eaa56fd8c1bd8c5eaff">needs_serialize_</a>) {</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <span class="comment">// We can just copy the row into the stream.</span></div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keywordflow">if</span> (!dst_partition-&gt;<a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a7ea9def2ce9bb40d8a4476d432279258">aggregated_row_stream</a>-&gt;AddRow(</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; row, reinterpret_cast&lt;uint8_t**&gt;(&amp;intermediate_tuple))) {</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; intermediate_tuple = NULL;</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; }</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; }</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;<span class="preprocessor"></span> <span class="comment">// If this aggregate function requires serialize, or we are seeing this</span></div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="comment">// result row the first time, we need to construct the result row and</span></div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="comment">// initialize it.</span></div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; intermediate_tuple = <a class="code" href="classimpala_1_1PartitionedAggregationNode.html#ac215a08b278ae7e37d71ffa8d4b03e1b">ConstructIntermediateTuple</a>(dst_partition-&gt;<a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a7030cbd1f2cf22fc5b5de07460d45d2f">agg_fn_ctxs</a>,</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; NULL, dst_partition-&gt;<a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a7ea9def2ce9bb40d8a4476d432279258">aggregated_row_stream</a>.get());</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordflow">if</span> (intermediate_tuple != NULL) {</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <a class="code" href="classimpala_1_1PartitionedAggregationNode.html#a7ac3e25ed19dea651e1c14df96cd41c0">UpdateTuple</a>(&amp;dst_partition-&gt;<a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a7030cbd1f2cf22fc5b5de07460d45d2f">agg_fn_ctxs</a>[0],</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; intermediate_tuple, row, AGGREGATED_ROWS);</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; }</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="comment">// After copying and initialize it, try to insert the tuple into the hash table.</span></div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <span class="comment">// If it inserts, we are done.</span></div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keywordflow">if</span> (intermediate_tuple != NULL &amp;&amp; ht-&gt;Insert(ht_ctx, intermediate_tuple, hash)) {</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; }</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">// In this case, we either did not have enough memory to add the intermediate_tuple</span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="comment">// to the stream or we did not have enough memory to insert it into the hash table.</span></div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <span class="comment">// We need to spill until there is enough memory to insert this tuple or</span></div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="comment">// dst_partition is spilled.</span></div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keywordflow">while</span> (<span class="keyword">true</span>) {</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <a class="code" href="status_8h.html#a85f7d0e774e15eb35b74f53264305e16">RETURN_IF_ERROR</a>(<a class="code" href="classimpala_1_1PartitionedAggregationNode.html#ac4a11c3a397c2bd5bae862dde1c56c69">SpillPartition</a>(dst_partition, intermediate_tuple));</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keywordflow">if</span> (!dst_partition-&gt;<a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a9a5ccd17ccd74c816c636881532ea948">is_spilled</a>()) {</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; DCHECK(dst_partition-&gt;<a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a7ea9def2ce9bb40d8a4476d432279258">aggregated_row_stream</a>-&gt;is_pinned());</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="comment">// We spilled a different partition, try to insert this tuple.</span></div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="keywordflow">if</span> (intermediate_tuple == NULL) <span class="keywordflow">goto</span> allocate_tuple;</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordflow">if</span> (ht-&gt;Insert(ht_ctx, intermediate_tuple, hash)) <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; }</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;</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="comment">// In this case, we were able to add the tuple to the stream but not enough</span></div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="comment">// to put it in the hash table. Nothing left to do, the tuple is spilled.</span></div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="keywordflow">if</span> (intermediate_tuple != NULL) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; }</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="comment">// This partition is already spilled, just append the row.</span></div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <a class="code" href="classimpala_1_1BufferedTupleStream.html">BufferedTupleStream</a>* dst_stream = AGGREGATED_ROWS ?</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; dst_partition-&gt;<a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a7ea9def2ce9bb40d8a4476d432279258">aggregated_row_stream</a>.get() :</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; dst_partition-&gt;<a class="code" href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a076cd4ef28b8a7bcb0a49ceb73944cae">unaggregated_row_stream</a>.get();</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; DCHECK(dst_stream != NULL);</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; DCHECK(!dst_stream-&gt;<a class="code" href="classimpala_1_1BufferedTupleStream.html#a3b47a81d368ad14edaf0256f2779189a">is_pinned</a>()) &lt;&lt; AGGREGATED_ROWS;</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; DCHECK(dst_stream-&gt;<a class="code" href="classimpala_1_1BufferedTupleStream.html#a35a832736a10de3486abe8661bfbe58d">has_write_block</a>()) &lt;&lt; AGGREGATED_ROWS;</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordflow">if</span> (dst_stream-&gt;<a class="code" href="classimpala_1_1BufferedTupleStream.html#aa9ec745ca549f76bce14872acfbd58c3">AddRow</a>(row)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <a class="code" href="classimpala_1_1Status.html">Status</a> status = dst_stream-&gt;<a class="code" href="classimpala_1_1BufferedTupleStream.html#a1df0eb41c554ed098af8d81637b4f615">status</a>();</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; DCHECK(!status.<a class="code" href="classimpala_1_1Status.html#a95ba859e42fe93445b340533220836ac">ok</a>()) &lt;&lt; AGGREGATED_ROWS;</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="keywordflow">return</span> status;</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;</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classimpala_1_1Status.html#a580565665ea944eb64f3f495b1bee1e0">Status::OK</a>;</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;}</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160;</div>
<div class="line"><a name="l00155"></a><span class="lineno"><a class="line" href="classimpala_1_1PartitionedAggregationNode.html#ad4d8d9f7b3e883fa2b8746f939000f7a"> 155</a></span>&#160;<a class="code" href="classimpala_1_1Status.html">Status</a> <a class="code" href="classimpala_1_1PartitionedAggregationNode.html#ad4d8d9f7b3e883fa2b8746f939000f7a">PartitionedAggregationNode::ProcessBatch_false</a>(</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <a class="code" href="classimpala_1_1RowBatch.html">RowBatch</a>* batch, <a class="code" href="classimpala_1_1HashTableCtx.html">HashTableCtx</a>* ht_ctx) {</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keywordflow">return</span> ProcessBatch&lt;false&gt;(batch, ht_ctx);</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;}</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;</div>
<div class="line"><a name="l00160"></a><span class="lineno"><a class="line" href="classimpala_1_1PartitionedAggregationNode.html#a8f4c79fb36a542a4a3902b85ad7ccaed"> 160</a></span>&#160;<a class="code" href="classimpala_1_1Status.html">Status</a> <a class="code" href="classimpala_1_1PartitionedAggregationNode.html#a8f4c79fb36a542a4a3902b85ad7ccaed">PartitionedAggregationNode::ProcessBatch_true</a>(</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <a class="code" href="classimpala_1_1RowBatch.html">RowBatch</a>* batch, <a class="code" href="classimpala_1_1HashTableCtx.html">HashTableCtx</a>* ht_ctx) {</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="keywordflow">return</span> ProcessBatch&lt;true&gt;(batch, ht_ctx);</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160;}</div>
<div class="ttc" id="classimpala_1_1HashTable_1_1Iterator_html"><div class="ttname"><a href="classimpala_1_1HashTable_1_1Iterator.html">impala::HashTable::Iterator</a></div><div class="ttdoc">stl-like iterator interface. </div><div class="ttdef"><b>Definition:</b> <a href="hash-table_8h_source.html#l00450">hash-table.h:450</a></div></div>
<div class="ttc" id="row-batch_8h_html"><div class="ttname"><a href="row-batch_8h.html">row-batch.h</a></div></div>
<div class="ttc" id="classimpala_1_1BufferedTupleStream_html"><div class="ttname"><a href="classimpala_1_1BufferedTupleStream.html">impala::BufferedTupleStream</a></div><div class="ttdoc">The underlying memory management is done by the BufferedBlockMgr. </div><div class="ttdef"><b>Definition:</b> <a href="buffered-tuple-stream_8h_source.html#l00109">buffered-tuple-stream.h:109</a></div></div>
<div class="ttc" id="classimpala_1_1HashTable_1_1Iterator_html_aea6a675fd49a49907fe7734b94e15a61"><div class="ttname"><a href="classimpala_1_1HashTable_1_1Iterator.html#aea6a675fd49a49907fe7734b94e15a61">impala::HashTable::Iterator::AtEnd</a></div><div class="ttdeci">bool AtEnd() const </div><div class="ttdoc">Returns true if this iterator is at the end, i.e. GetRow() cannot be called. </div><div class="ttdef"><b>Definition:</b> <a href="hash-table_8h_source.html#l00492">hash-table.h:492</a></div></div>
<div class="ttc" id="classimpala_1_1RowBatch_html_ac695df3b85ee416b3d99844813ae813d"><div class="ttname"><a href="classimpala_1_1RowBatch.html#ac695df3b85ee416b3d99844813ae813d">impala::RowBatch::num_rows</a></div><div class="ttdeci">int num_rows() const </div><div class="ttdef"><b>Definition:</b> <a href="row-batch_8h_source.html#l00215">row-batch.h:215</a></div></div>
<div class="ttc" id="classimpala_1_1HashTable_1_1Iterator_html_a0116ff819c2e1f30e3c572f4295ac127"><div class="ttname"><a href="classimpala_1_1HashTable_1_1Iterator.html#a0116ff819c2e1f30e3c572f4295ac127">impala::HashTable::Iterator::GetTuple</a></div><div class="ttdeci">Tuple * GetTuple() const </div><div class="ttdef"><b>Definition:</b> <a href="hash-table_8inline_8h_source.html#l00243">hash-table.inline.h:243</a></div></div>
<div class="ttc" id="classimpala_1_1PartitionedAggregationNode_html_ae61abd47cef04eaa56fd8c1bd8c5eaff"><div class="ttname"><a href="classimpala_1_1PartitionedAggregationNode.html#ae61abd47cef04eaa56fd8c1bd8c5eaff">impala::PartitionedAggregationNode::needs_serialize_</a></div><div class="ttdeci">bool needs_serialize_</div><div class="ttdoc">Contains any evaluators that require the serialize step. </div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8h_source.html#l00151">partitioned-aggregation-node.h:151</a></div></div>
<div class="ttc" id="classimpala_1_1BufferedTupleStream_html_a35a832736a10de3486abe8661bfbe58d"><div class="ttname"><a href="classimpala_1_1BufferedTupleStream.html#a35a832736a10de3486abe8661bfbe58d">impala::BufferedTupleStream::has_write_block</a></div><div class="ttdeci">bool has_write_block() const </div><div class="ttdef"><b>Definition:</b> <a href="buffered-tuple-stream_8h_source.html#l00247">buffered-tuple-stream.h:247</a></div></div>
<div class="ttc" id="classimpala_1_1PartitionedAggregationNode_html_ad4d8d9f7b3e883fa2b8746f939000f7a"><div class="ttname"><a href="classimpala_1_1PartitionedAggregationNode.html#ad4d8d9f7b3e883fa2b8746f939000f7a">impala::PartitionedAggregationNode::ProcessBatch_false</a></div><div class="ttdeci">Status ProcessBatch_false(RowBatch *batch, HashTableCtx *ht_ctx)</div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node-ir_8cc_source.html#l00155">partitioned-aggregation-node-ir.cc:155</a></div></div>
<div class="ttc" id="classimpala_1_1PartitionedAggregationNode_html_ac215a08b278ae7e37d71ffa8d4b03e1b"><div class="ttname"><a href="classimpala_1_1PartitionedAggregationNode.html#ac215a08b278ae7e37d71ffa8d4b03e1b">impala::PartitionedAggregationNode::ConstructIntermediateTuple</a></div><div class="ttdeci">Tuple * ConstructIntermediateTuple(const std::vector&lt; impala_udf::FunctionContext * &gt; &amp;agg_fn_ctxs, MemPool *pool, BufferedTupleStream *stream)</div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8cc_source.html#l00591">partitioned-aggregation-node.cc:591</a></div></div>
<div class="ttc" id="structimpala_1_1PartitionedAggregationNode_1_1Partition_html_a076cd4ef28b8a7bcb0a49ceb73944cae"><div class="ttname"><a href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a076cd4ef28b8a7bcb0a49ceb73944cae">impala::PartitionedAggregationNode::Partition::unaggregated_row_stream</a></div><div class="ttdeci">boost::scoped_ptr&lt; BufferedTupleStream &gt; unaggregated_row_stream</div><div class="ttdoc">Unaggregated rows that are spilled. </div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8h_source.html#l00289">partitioned-aggregation-node.h:289</a></div></div>
<div class="ttc" id="classimpala_1_1Tuple_html"><div class="ttname"><a href="classimpala_1_1Tuple.html">impala::Tuple</a></div><div class="ttdoc">A tuple with 0 materialised slots is represented as NULL. </div><div class="ttdef"><b>Definition:</b> <a href="tuple_8h_source.html#l00048">tuple.h:48</a></div></div>
<div class="ttc" id="namespaceimpala_html_a50b59c9628eedf49aa82643ce601967d"><div class="ttname"><a href="namespaceimpala.html#a50b59c9628eedf49aa82643ce601967d">impala::hash</a></div><div class="ttdeci">const StringSearch UrlParser::hash_search &amp; hash</div><div class="ttdef"><b>Definition:</b> <a href="url-parser_8cc_source.html#l00041">url-parser.cc:41</a></div></div>
<div class="ttc" id="status_8h_html_a85f7d0e774e15eb35b74f53264305e16"><div class="ttname"><a href="status_8h.html#a85f7d0e774e15eb35b74f53264305e16">RETURN_IF_ERROR</a></div><div class="ttdeci">#define RETURN_IF_ERROR(stmt)</div><div class="ttdoc">some generally useful macros </div><div class="ttdef"><b>Definition:</b> <a href="status_8h_source.html#l00242">status.h:242</a></div></div>
<div class="ttc" id="classimpala_1_1RowBatch_html_a9320ed986b0717ef26d73d871f3b3a42"><div class="ttname"><a href="classimpala_1_1RowBatch.html#a9320ed986b0717ef26d73d871f3b3a42">impala::RowBatch::GetRow</a></div><div class="ttdeci">TupleRow * GetRow(int row_idx)</div><div class="ttdef"><b>Definition:</b> <a href="row-batch_8h_source.html#l00140">row-batch.h:140</a></div></div>
<div class="ttc" id="structimpala_1_1PartitionedAggregationNode_1_1Partition_html"><div class="ttname"><a href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html">impala::PartitionedAggregationNode::Partition</a></div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8h_source.html#l00237">partitioned-aggregation-node.h:237</a></div></div>
<div class="ttc" id="structimpala_1_1PartitionedAggregationNode_1_1Partition_html_a9a5ccd17ccd74c816c636881532ea948"><div class="ttname"><a href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a9a5ccd17ccd74c816c636881532ea948">impala::PartitionedAggregationNode::Partition::is_spilled</a></div><div class="ttdeci">bool is_spilled() const </div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8h_source.html#l00261">partitioned-aggregation-node.h:261</a></div></div>
<div class="ttc" id="classimpala_1_1PartitionedAggregationNode_html_ae3864673f6382e259fff631b7117ccce"><div class="ttname"><a href="classimpala_1_1PartitionedAggregationNode.html#ae3864673f6382e259fff631b7117ccce">impala::PartitionedAggregationNode::agg_fn_ctxs_</a></div><div class="ttdeci">std::vector&lt; impala_udf::FunctionContext * &gt; agg_fn_ctxs_</div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8h_source.html#l00161">partitioned-aggregation-node.h:161</a></div></div>
<div class="ttc" id="classimpala_1_1PartitionedAggregationNode_html_acb1104e2b77e54fe2929bc9b16542a65"><div class="ttname"><a href="classimpala_1_1PartitionedAggregationNode.html#acb1104e2b77e54fe2929bc9b16542a65">impala::PartitionedAggregationNode::PARTITION_FANOUT</a></div><div class="ttdeci">static const int PARTITION_FANOUT</div><div class="ttdoc">Number of initial partitions to create. Must be a power of 2. </div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8h_source.html#l00115">partitioned-aggregation-node.h:115</a></div></div>
<div class="ttc" id="buffered-tuple-stream_8inline_8h_html"><div class="ttname"><a href="buffered-tuple-stream_8inline_8h.html">buffered-tuple-stream.inline.h</a></div></div>
<div class="ttc" id="classimpala_1_1TupleRow_html"><div class="ttname"><a href="classimpala_1_1TupleRow.html">impala::TupleRow</a></div><div class="ttdef"><b>Definition:</b> <a href="tuple-row_8h_source.html#l00028">tuple-row.h:28</a></div></div>
<div class="ttc" id="classimpala_1_1PartitionedAggregationNode_html_a1be76038a408e755fbf1a97c1162ef70"><div class="ttname"><a href="classimpala_1_1PartitionedAggregationNode.html#a1be76038a408e755fbf1a97c1162ef70">impala::PartitionedAggregationNode::singleton_output_tuple_</a></div><div class="ttdeci">Tuple * singleton_output_tuple_</div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8h_source.html#l00184">partitioned-aggregation-node.h:184</a></div></div>
<div class="ttc" id="runtime-profile_8h_html_aaa9a2971c6368e3ddd3f5140a0295eb7"><div class="ttname"><a href="runtime-profile_8h.html#aaa9a2971c6368e3ddd3f5140a0295eb7">SCOPED_TIMER</a></div><div class="ttdeci">#define SCOPED_TIMER(c)</div><div class="ttdef"><b>Definition:</b> <a href="runtime-profile_8h_source.html#l00053">runtime-profile.h:53</a></div></div>
<div class="ttc" id="classimpala_1_1PartitionedAggregationNode_html_ac4a11c3a397c2bd5bae862dde1c56c69"><div class="ttname"><a href="classimpala_1_1PartitionedAggregationNode.html#ac4a11c3a397c2bd5bae862dde1c56c69">impala::PartitionedAggregationNode::SpillPartition</a></div><div class="ttdeci">Status SpillPartition(Partition *curr_partition=NULL, Tuple *curr_intermediate_tuple=NULL)</div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8cc_source.html#l00872">partitioned-aggregation-node.cc:872</a></div></div>
<div class="ttc" id="classimpala_1_1Status_html"><div class="ttname"><a href="classimpala_1_1Status.html">impala::Status</a></div><div class="ttdef"><b>Definition:</b> <a href="status_8h_source.html#l00081">status.h:81</a></div></div>
<div class="ttc" id="classimpala_1_1PartitionedAggregationNode_html_a8f4c79fb36a542a4a3902b85ad7ccaed"><div class="ttname"><a href="classimpala_1_1PartitionedAggregationNode.html#a8f4c79fb36a542a4a3902b85ad7ccaed">impala::PartitionedAggregationNode::ProcessBatch_true</a></div><div class="ttdeci">Status ProcessBatch_true(RowBatch *batch, HashTableCtx *ht_ctx)</div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node-ir_8cc_source.html#l00160">partitioned-aggregation-node-ir.cc:160</a></div></div>
<div class="ttc" id="classimpala_1_1PartitionedAggregationNode_html_ac06916f3c846bd1b6240135309c90f57"><div class="ttname"><a href="classimpala_1_1PartitionedAggregationNode.html#ac06916f3c846bd1b6240135309c90f57">impala::PartitionedAggregationNode::NUM_PARTITIONING_BITS</a></div><div class="ttdeci">static const int NUM_PARTITIONING_BITS</div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8h_source.html#l00121">partitioned-aggregation-node.h:121</a></div></div>
<div class="ttc" id="classimpala_1_1HashTable_html"><div class="ttname"><a href="classimpala_1_1HashTable.html">impala::HashTable</a></div><div class="ttdef"><b>Definition:</b> <a href="hash-table_8h_source.html#l00281">hash-table.h:281</a></div></div>
<div class="ttc" id="structimpala_1_1PartitionedAggregationNode_1_1Partition_html_a1f3cd48377bd279a79a719d202857691"><div class="ttname"><a href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a1f3cd48377bd279a79a719d202857691">impala::PartitionedAggregationNode::Partition::hash_tbl</a></div><div class="ttdeci">boost::scoped_ptr&lt; HashTable &gt; hash_tbl</div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8h_source.html#l00276">partitioned-aggregation-node.h:276</a></div></div>
<div class="ttc" id="partitioned-aggregation-node_8h_html"><div class="ttname"><a href="partitioned-aggregation-node_8h.html">partitioned-aggregation-node.h</a></div></div>
<div class="ttc" id="classimpala_1_1PartitionedAggregationNode_html_a0d63bbb39792bbc25d590cdb9fedb24f"><div class="ttname"><a href="classimpala_1_1PartitionedAggregationNode.html#a0d63bbb39792bbc25d590cdb9fedb24f">impala::PartitionedAggregationNode::hash_partitions_</a></div><div class="ttdeci">std::vector&lt; Partition * &gt; hash_partitions_</div><div class="ttdoc">Current partitions we are partitioning into. </div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8h_source.html#l00293">partitioned-aggregation-node.h:293</a></div></div>
<div class="ttc" id="classimpala_1_1RowBatch_html"><div class="ttname"><a href="classimpala_1_1RowBatch.html">impala::RowBatch</a></div><div class="ttdef"><b>Definition:</b> <a href="row-batch_8h_source.html#l00066">row-batch.h:66</a></div></div>
<div class="ttc" id="classimpala_1_1BufferedTupleStream_html_a1df0eb41c554ed098af8d81637b4f615"><div class="ttname"><a href="classimpala_1_1BufferedTupleStream.html#a1df0eb41c554ed098af8d81637b4f615">impala::BufferedTupleStream::status</a></div><div class="ttdeci">Status status() const </div><div class="ttdef"><b>Definition:</b> <a href="buffered-tuple-stream_8h_source.html#l00228">buffered-tuple-stream.h:228</a></div></div>
<div class="ttc" id="classimpala_1_1BufferedTupleStream_html_aa9ec745ca549f76bce14872acfbd58c3"><div class="ttname"><a href="classimpala_1_1BufferedTupleStream.html#aa9ec745ca549f76bce14872acfbd58c3">impala::BufferedTupleStream::AddRow</a></div><div class="ttdeci">bool AddRow(TupleRow *row, uint8_t **dst=NULL)</div><div class="ttdef"><b>Definition:</b> <a href="buffered-tuple-stream_8inline_8h_source.html#l00025">buffered-tuple-stream.inline.h:25</a></div></div>
<div class="ttc" id="structimpala_1_1PartitionedAggregationNode_1_1Partition_html_a7030cbd1f2cf22fc5b5de07460d45d2f"><div class="ttname"><a href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a7030cbd1f2cf22fc5b5de07460d45d2f">impala::PartitionedAggregationNode::Partition::agg_fn_ctxs</a></div><div class="ttdeci">std::vector&lt; impala_udf::FunctionContext * &gt; agg_fn_ctxs</div><div class="ttdoc">Clone of parent&#39;s agg_fn_ctxs_ and backing MemPool. </div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8h_source.html#l00279">partitioned-aggregation-node.h:279</a></div></div>
<div class="ttc" id="classimpala_1_1Status_html_a580565665ea944eb64f3f495b1bee1e0"><div class="ttname"><a href="classimpala_1_1Status.html#a580565665ea944eb64f3f495b1bee1e0">impala::Status::OK</a></div><div class="ttdeci">static const Status OK</div><div class="ttdef"><b>Definition:</b> <a href="status_8h_source.html#l00087">status.h:87</a></div></div>
<div class="ttc" id="hash-table_8inline_8h_html"><div class="ttname"><a href="hash-table_8inline_8h.html">hash-table.inline.h</a></div></div>
<div class="ttc" id="classimpala_1_1BufferedTupleStream_html_a3b47a81d368ad14edaf0256f2779189a"><div class="ttname"><a href="classimpala_1_1BufferedTupleStream.html#a3b47a81d368ad14edaf0256f2779189a">impala::BufferedTupleStream::is_pinned</a></div><div class="ttdeci">bool is_pinned() const </div><div class="ttdef"><b>Definition:</b> <a href="buffered-tuple-stream_8h_source.html#l00243">buffered-tuple-stream.h:243</a></div></div>
<div class="ttc" id="structimpala_1_1PartitionedAggregationNode_1_1Partition_html_a7ea9def2ce9bb40d8a4476d432279258"><div class="ttname"><a href="structimpala_1_1PartitionedAggregationNode_1_1Partition.html#a7ea9def2ce9bb40d8a4476d432279258">impala::PartitionedAggregationNode::Partition::aggregated_row_stream</a></div><div class="ttdeci">boost::scoped_ptr&lt; BufferedTupleStream &gt; aggregated_row_stream</div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8h_source.html#l00286">partitioned-aggregation-node.h:286</a></div></div>
<div class="ttc" id="classimpala_1_1PartitionedAggregationNode_html_a2db05c41fcf4abdfc055b681c49e7681"><div class="ttname"><a href="classimpala_1_1PartitionedAggregationNode.html#a2db05c41fcf4abdfc055b681c49e7681">impala::PartitionedAggregationNode::ProcessBatchNoGrouping</a></div><div class="ttdeci">Status ProcessBatchNoGrouping(RowBatch *batch, HashTableCtx *ht_ctx=NULL)</div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node-ir_8cc_source.html#l00024">partitioned-aggregation-node-ir.cc:24</a></div></div>
<div class="ttc" id="tuple-row_8h_html"><div class="ttname"><a href="tuple-row_8h.html">tuple-row.h</a></div></div>
<div class="ttc" id="classimpala_1_1HashTableCtx_html_aa1c1b818cb5c0004d01f6ad7487a3394"><div class="ttname"><a href="classimpala_1_1HashTableCtx.html#aa1c1b818cb5c0004d01f6ad7487a3394">impala::HashTableCtx::EvalAndHashBuild</a></div><div class="ttdeci">bool IR_ALWAYS_INLINE EvalAndHashBuild(TupleRow *row, uint32_t *hash)</div><div class="ttdef"><b>Definition:</b> <a href="hash-table_8inline_8h_source.html#l00023">hash-table.inline.h:23</a></div></div>
<div class="ttc" id="classimpala_1_1Status_html_a95ba859e42fe93445b340533220836ac"><div class="ttname"><a href="classimpala_1_1Status.html#a95ba859e42fe93445b340533220836ac">impala::Status::ok</a></div><div class="ttdeci">bool ok() const </div><div class="ttdef"><b>Definition:</b> <a href="status_8h_source.html#l00172">status.h:172</a></div></div>
<div class="ttc" id="classimpala_1_1PartitionedAggregationNode_html_a7ac3e25ed19dea651e1c14df96cd41c0"><div class="ttname"><a href="classimpala_1_1PartitionedAggregationNode.html#a7ac3e25ed19dea651e1c14df96cd41c0">impala::PartitionedAggregationNode::UpdateTuple</a></div><div class="ttdeci">void UpdateTuple(impala_udf::FunctionContext **agg_fn_ctxs, Tuple *tuple, TupleRow *row, bool is_merge=false)</div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8cc_source.html#l00676">partitioned-aggregation-node.cc:676</a></div></div>
<div class="ttc" id="classimpala_1_1HashTableCtx_html"><div class="ttname"><a href="classimpala_1_1HashTableCtx.html">impala::HashTableCtx</a></div><div class="ttdef"><b>Definition:</b> <a href="hash-table_8h_source.html#l00104">hash-table.h:104</a></div></div>
<div class="ttc" id="classimpala_1_1HashTableCtx_html_a5f92cb6aa106a9fb60fb42debfe14979"><div class="ttname"><a href="classimpala_1_1HashTableCtx.html#a5f92cb6aa106a9fb60fb42debfe14979">impala::HashTableCtx::EvalAndHashProbe</a></div><div class="ttdeci">bool IR_ALWAYS_INLINE EvalAndHashProbe(TupleRow *row, uint32_t *hash)</div><div class="ttdef"><b>Definition:</b> <a href="hash-table_8inline_8h_source.html#l00030">hash-table.inline.h:30</a></div></div>
<div class="ttc" id="classimpala_1_1PartitionedAggregationNode_html_afefaf067bf5fb3e10ea70326150bff25"><div class="ttname"><a href="classimpala_1_1PartitionedAggregationNode.html#afefaf067bf5fb3e10ea70326150bff25">impala::PartitionedAggregationNode::ht_resize_timer_</a></div><div class="ttdeci">RuntimeProfile::Counter * ht_resize_timer_</div><div class="ttdoc">Total time spent resizing hash tables. </div><div class="ttdef"><b>Definition:</b> <a href="partitioned-aggregation-node_8h_source.html#l00210">partitioned-aggregation-node.h:210</a></div></div>
<div class="ttc" id="classimpala_1_1PartitionedAggregationNode_html_aae2da81f25785959647a0344dfd2007d"><div class="ttname"><a href="classimpala_1_1PartitionedAggregationNode.html#aae2da81f25785959647a0344dfd2007d">impala::PartitionedAggregationNode::ProcessBatch</a></div><div class="ttdeci">Status IR_ALWAYS_INLINE ProcessBatch(RowBatch *batch, HashTableCtx *ht_ctx)</div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_e5d120be6b5e8a44336cbfd013b25604.html">be</a></li><li class="navelem"><a class="el" href="dir_68cf7cafb51a962d5bc4848b83cab0de.html">src</a></li><li class="navelem"><a class="el" href="dir_479336c0a15f2c0737bcafcf969f884c.html">exec</a></li><li class="navelem"><a class="el" href="partitioned-aggregation-node-ir_8cc.html">partitioned-aggregation-node-ir.cc</a></li>
<li class="footer">Generated on Thu May 7 2015 16:10:35 for Impala by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.6 </li>
</ul>
</div>
</body>
</html>