blob: cc1bde00ce93f8b9c75a6e0e60de3ff55247b803 [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: fe/src/main/java/com/cloudera/impala/planner/SingleNodePlanner.java 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('SingleNodePlanner_8java_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">SingleNodePlanner.java</div> </div>
</div><!--header-->
<div class="contents">
<a href="SingleNodePlanner_8java.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="keyword">package </span>com.cloudera.impala.planner;</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="keyword">import</span> java.util.ArrayList;</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="keyword">import</span> java.util.Collections;</div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="keyword">import</span> java.util.Comparator;</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="keyword">import</span> java.util.Iterator;</div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="keyword">import</span> java.util.List;</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="keyword">import</span> java.util.ListIterator;</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="keyword">import</span> java.util.Set;</div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="keyword">import</span> org.slf4j.Logger;</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="keyword">import</span> org.slf4j.LoggerFactory;</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1AggregateInfo.html">com.cloudera.impala.analysis.AggregateInfo</a>;</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1AnalyticInfo.html">com.cloudera.impala.analysis.AnalyticInfo</a>;</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">com.cloudera.impala.analysis.Analyzer</a>;</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BaseTableRef.html">com.cloudera.impala.analysis.BaseTableRef</a>;</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html">com.cloudera.impala.analysis.BinaryPredicate</a>;</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1CollectionTableRef.html">com.cloudera.impala.analysis.CollectionTableRef</a>;</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr.html">com.cloudera.impala.analysis.Expr</a>;</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1ExprId.html">com.cloudera.impala.analysis.ExprId</a>;</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1ExprSubstitutionMap.html">com.cloudera.impala.analysis.ExprSubstitutionMap</a>;</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1InlineViewRef.html">com.cloudera.impala.analysis.InlineViewRef</a>;</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="keyword">import</span> <a class="code" href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator.html">com.cloudera.impala.analysis.JoinOperator</a>;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1QueryStmt.html">com.cloudera.impala.analysis.QueryStmt</a>;</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SelectStmt.html">com.cloudera.impala.analysis.SelectStmt</a>;</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotDescriptor.html">com.cloudera.impala.analysis.SlotDescriptor</a>;</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="keyword">import</span> <a class="code" href="namespaceimpala.html#a4e802b9fa9086eb686d8688df634a2b2">com.cloudera.impala.analysis.SlotId</a>;</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotRef.html">com.cloudera.impala.analysis.SlotRef</a>;</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html">com.cloudera.impala.analysis.TableRef</a>;</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TupleDescriptor.html">com.cloudera.impala.analysis.TupleDescriptor</a>;</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="keyword">import</span> <a class="code" href="namespaceimpala.html#ae794620bedabff2a726194c228af75ce">com.cloudera.impala.analysis.TupleId</a>;</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TupleIsNullPredicate.html">com.cloudera.impala.analysis.TupleIsNullPredicate</a>;</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1UnionStmt.html">com.cloudera.impala.analysis.UnionStmt</a>;</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1UnionStmt_1_1UnionOperand.html">com.cloudera.impala.analysis.UnionStmt.UnionOperand</a>;</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1ColumnStats.html">com.cloudera.impala.catalog.ColumnStats</a>;</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1DataSourceTable.html">com.cloudera.impala.catalog.DataSourceTable</a>;</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1HBaseTable.html">com.cloudera.impala.catalog.HBaseTable</a>;</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1HdfsTable.html">com.cloudera.impala.catalog.HdfsTable</a>;</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1Type.html">com.cloudera.impala.catalog.Type</a>;</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1ImpalaException.html">com.cloudera.impala.common.ImpalaException</a>;</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1InternalException.html">com.cloudera.impala.common.InternalException</a>;</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="keyword">import</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1NotImplementedException.html">com.cloudera.impala.common.NotImplementedException</a>;</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="keyword">import</span> com.cloudera.impala.common.Pair;</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;<span class="keyword">import</span> com.google.common.base.Preconditions;</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;<span class="keyword">import</span> com.google.common.base.Predicate;</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="keyword">import</span> com.google.common.collect.Iterables;</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="keyword">import</span> com.google.common.collect.Lists;</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="keyword">import</span> com.google.common.collect.Sets;</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;</div>
<div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html"> 71</a></span>&#160;<span class="keyword">public</span> <span class="keyword">class </span><a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html">SingleNodePlanner</a> {</div>
<div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a6b4c6cc1288dc908e3f53a149785e9ef"> 72</a></span>&#160; <span class="keyword">private</span> <span class="keyword">final</span> <span class="keyword">static</span> Logger <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a6b4c6cc1288dc908e3f53a149785e9ef">LOG</a> = LoggerFactory.getLogger(SingleNodePlanner.class);</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;</div>
<div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd"> 74</a></span>&#160; <span class="keyword">private</span> <span class="keyword">final</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html">PlannerContext</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>;</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;</div>
<div class="line"><a name="l00076"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#aa100619f614504a3413e4b6d036a15c1"> 76</a></span>&#160; <span class="keyword">public</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#aa100619f614504a3413e4b6d036a15c1">SingleNodePlanner</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html">PlannerContext</a> ctx) {</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a> = ctx;</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; }</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;</div>
<div class="line"><a name="l00096"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a6fee878dab41ba13ed022e82ac8b7a0b"> 96</a></span>&#160; <span class="keyword">public</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a6fee878dab41ba13ed022e82ac8b7a0b">createSingleNodePlan</a>() throws <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1ImpalaException.html">ImpalaException</a> {</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1QueryStmt.html">QueryStmt</a> queryStmt = ctx_.getQueryStmt();</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="comment">// Use the stmt&#39;s analyzer which is not necessarily the root analyzer</span></div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="comment">// to detect empty result sets.</span></div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer = queryStmt.getAnalyzer();</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; analyzer.computeEquivClasses();</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; analyzer.getTimeline().markEvent(<span class="stringliteral">&quot;Equivalence classes computed&quot;</span>);</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160;</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="comment">// Mark slots referenced by output exprs as materialized, prior to generating the</span></div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="comment">// plan tree.</span></div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="comment">// We need to mark the result exprs of the topmost select block as materialized, so</span></div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="comment">// that PlanNode.init() can compute the final mem layout of materialized tuples</span></div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="comment">// (the byte size of tuples is needed for cost computations).</span></div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="comment">// TODO: instead of materializing everything produced by the plan root, derive</span></div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="comment">// referenced slots from destination fragment and add a materialization node</span></div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="comment">// if not all output is needed by destination fragment</span></div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="comment">// TODO 2: should the materialization decision be cost-based?</span></div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <span class="keywordflow">if</span> (queryStmt.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1QueryStmt.html#a7c908f1af1138273315d67a13bfaaf4e">getBaseTblResultExprs</a>() != null) {</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; analyzer.materializeSlots(queryStmt.getBaseTblResultExprs());</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; }</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; LOG.trace(<span class="stringliteral">&quot;desctbl: &quot;</span> + analyzer.getDescTbl().debugString());</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> singleNodePlan = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a617178c5646f3f77f7d559c8f01018ba">createQueryPlan</a>(queryStmt, analyzer,</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#acd1181b50a5664a771b10f81be9fe865">getQueryOptions</a>().isDisable_outermost_topn());</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; Preconditions.checkNotNull(singleNodePlan);</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keywordflow">return</span> singleNodePlan;</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; }</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;</div>
<div class="line"><a name="l00127"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8dbf5c3ae2fd5655dfc1e61a63bf4ce3"> 127</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8dbf5c3ae2fd5655dfc1e61a63bf4ce3">createEmptyNode</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1QueryStmt.html">QueryStmt</a> stmt, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer)</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordflow">throws</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1InternalException.html">InternalException</a> {</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; ArrayList&lt;TupleId&gt; tupleIds = Lists.newArrayList();</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; stmt.getMaterializedTupleIds(tupleIds);</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1EmptySetNode.html">EmptySetNode</a> node = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1EmptySetNode.html">EmptySetNode</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#af60cf05e54d6c00065ff1036cdddd62b">getNextNodeId</a>(), tupleIds);</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; node.init(analyzer);</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="comment">// Set the output smap to resolve exprs referencing inline views within stmt.</span></div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="comment">// Not needed for a UnionStmt because it materializes its input operands.</span></div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="keywordflow">if</span> (stmt instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SelectStmt.html">SelectStmt</a>) {</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; node.setOutputSmap(((SelectStmt) stmt).getBaseTblSmap());</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; <span class="keywordflow">return</span> node;</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;</div>
<div class="line"><a name="l00145"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a617178c5646f3f77f7d559c8f01018ba"> 145</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a617178c5646f3f77f7d559c8f01018ba">createQueryPlan</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1QueryStmt.html">QueryStmt</a> stmt, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer, <span class="keywordtype">boolean</span> disableTopN)</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordflow">throws</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1ImpalaException.html">ImpalaException</a> {</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="keywordflow">if</span> (analyzer.hasEmptyResultSet()) <span class="keywordflow">return</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8dbf5c3ae2fd5655dfc1e61a63bf4ce3">createEmptyNode</a>(stmt, analyzer);</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> root;</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keywordflow">if</span> (stmt instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SelectStmt.html">SelectStmt</a>) {</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; SelectStmt selectStmt = (SelectStmt) stmt;</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; root = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#ac79d4bce3405c53140a7bce76e71508a">createSelectPlan</a>(selectStmt, analyzer);</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; <span class="comment">// insert possible AnalyticEvalNode before SortNode</span></div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <span class="keywordflow">if</span> (((SelectStmt) stmt).getAnalyticInfo() != null) {</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1AnalyticInfo.html">AnalyticInfo</a> analyticInfo = selectStmt.getAnalyticInfo();</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; ArrayList&lt;TupleId&gt; stmtTupleIds = Lists.newArrayList();</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; stmt.getMaterializedTupleIds(stmtTupleIds);</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1AnalyticPlanner.html">AnalyticPlanner</a> analyticPlanner =</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1AnalyticPlanner.html">AnalyticPlanner</a>(stmtTupleIds, analyticInfo, analyzer, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>);</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; List&lt;Expr&gt; inputPartitionExprs = Lists.newArrayList();</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1AggregateInfo.html">AggregateInfo</a> aggInfo = selectStmt.getAggInfo();</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; root = analyticPlanner.createSingleNodePlan(root,</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; aggInfo != null ? aggInfo.getGroupingExprs() : null, inputPartitionExprs);</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keywordflow">if</span> (aggInfo != null &amp;&amp; !inputPartitionExprs.isEmpty()) {</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <span class="comment">// analytic computation will benefit from a partition on inputPartitionExprs</span></div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; aggInfo.setPartitionExprs(inputPartitionExprs);</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; }</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; Preconditions.checkState(stmt instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1UnionStmt.html">UnionStmt</a>);</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; root = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a9fa62dadaf353730ba9fa528f84abda2">createUnionPlan</a>((<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1UnionStmt.html">UnionStmt</a>) stmt, analyzer);</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; }</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="comment">// Avoid adding a sort node if the sort tuple has no materialized slots.</span></div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; <span class="keywordtype">boolean</span> sortHasMaterializedSlots = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keywordflow">if</span> (stmt.evaluateOrderBy()) {</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotDescriptor.html">SlotDescriptor</a> sortSlotDesc:</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; stmt.getSortInfo().getSortTupleDescriptor().getSlots()) {</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="keywordflow">if</span> (sortSlotDesc.isMaterialized()) {</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; sortHasMaterializedSlots = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; }</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; }</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; }</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="keywordflow">if</span> (stmt.evaluateOrderBy() &amp;&amp; sortHasMaterializedSlots) {</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keywordtype">long</span> limit = stmt.getLimit();</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="comment">// TODO: External sort could be used for very large limits</span></div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="comment">// not just unlimited order-by</span></div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="keywordtype">boolean</span> useTopN = stmt.hasLimit() &amp;&amp; !disableTopN;</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; root = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SortNode.html">SortNode</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#af60cf05e54d6c00065ff1036cdddd62b">getNextNodeId</a>(), root, stmt.getSortInfo(),</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; useTopN, stmt.getOffset());</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; Preconditions.checkState(root.hasValidStats());</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; root.setLimit(limit);</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; root.init(analyzer);</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; root.setLimit(stmt.getLimit());</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; root.computeStats(analyzer);</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; }</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160;</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keywordflow">return</span> root;</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; }</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160;</div>
<div class="line"><a name="l00212"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#ac408e6059606469bb147e0823f87c50d"> 212</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#ac408e6059606469bb147e0823f87c50d">addUnassignedConjuncts</a>(</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer, List&lt;TupleId&gt; tupleIds, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> root)</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <span class="keywordflow">throws</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1InternalException.html">InternalException</a> {</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <span class="comment">// No point in adding SelectNode on top of an EmptyNode.</span></div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <span class="keywordflow">if</span> (root instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1EmptySetNode.html">EmptySetNode</a>) <span class="keywordflow">return</span> root;</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; Preconditions.checkNotNull(root);</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="comment">// Gather unassigned conjuncts and generate predicates to enfore</span></div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <span class="comment">// slot equivalences for each tuple id.</span></div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; List&lt;Expr&gt; conjuncts = analyzer.getUnassignedConjuncts(root);</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TupleId.html">TupleId</a> tid: tupleIds) {</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; analyzer.createEquivConjuncts(tid, conjuncts);</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; }</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">if</span> (conjuncts.isEmpty()) <span class="keywordflow">return</span> root;</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="comment">// evaluate conjuncts in SelectNode</span></div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SelectNode.html">SelectNode</a> selectNode = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SelectNode.html">SelectNode</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#af60cf05e54d6c00065ff1036cdddd62b">getNextNodeId</a>(), root, conjuncts);</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; <span class="comment">// init() marks conjuncts as assigned</span></div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; selectNode.init(analyzer);</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; Preconditions.checkState(selectNode.hasValidStats());</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">return</span> selectNode;</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; }</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160;</div>
<div class="line"><a name="l00246"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a36a0e82b73a0fb2bd7084906f7fd5bd8"> 246</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a36a0e82b73a0fb2bd7084906f7fd5bd8">createCheapestJoinPlan</a>(</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer, List&lt;Pair&lt;TableRef, PlanNode&gt;&gt; refPlans)</div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; throws <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1ImpalaException.html">ImpalaException</a> {</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; LOG.trace(<span class="stringliteral">&quot;createCheapestJoinPlan&quot;</span>);</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="keywordflow">if</span> (refPlans.size() == 1) <span class="keywordflow">return</span> refPlans.get(0).second;</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160;</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="comment">// collect eligible candidates for the leftmost input; list contains</span></div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="comment">// (plan, materialized size)</span></div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; ArrayList&lt;Pair&lt;TableRef, Long&gt;&gt; candidates = Lists.newArrayList();</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <span class="keywordflow">for</span> (Pair&lt;TableRef, PlanNode&gt; entry: refPlans) {</div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html">TableRef</a> ref = entry.first;</div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; <a class="code" href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator.html">JoinOperator</a> joinOp = ref.getJoinOp();</div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160;</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="comment">// The rhs table of an outer/semi join can appear as the left-most input if we</span></div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <span class="comment">// invert the lhs/rhs and the join op. However, we may only consider this inversion</span></div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="comment">// for the very first join in refPlans, otherwise we could reorder tables/joins</span></div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="comment">// across outer/semi joins which is generally incorrect. The null-aware</span></div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="comment">// left anti-join operator is never considered for inversion because we can&#39;t</span></div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="comment">// execute the null-aware right anti-join efficiently.</span></div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <span class="comment">// TODO: Allow the rhs of any cross join as the leftmost table. This needs careful</span></div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="comment">// consideration of the joinOps that result from such a re-ordering (IMPALA-1281).</span></div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="keywordflow">if</span> (((joinOp.<a class="code" href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator.html#aca01cfbe719b33f494d4dc4e6994d535">isOuterJoin</a>() || joinOp.isSemiJoin() || joinOp.<a class="code" href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator.html#ae3f7eabc77a4c80e898040c1ed8b85e5">isCrossJoin</a>()) &amp;&amp;</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; ref != refPlans.get(1).first) || joinOp.<a class="code" href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator.html#ab27bc5bd92110c66199a089baaf52dd9">isNullAwareLeftAntiJoin</a>()) {</div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="comment">// ref cannot appear as the leftmost input</span></div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; }</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160;</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> plan = entry.second;</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <span class="keywordflow">if</span> (plan.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html#a8ce8aa221e9653a7651681aa479ddb14">getCardinality</a>() == -1) {</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="comment">// use 0 for the size to avoid it becoming the leftmost input</span></div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; <span class="comment">// TODO: Consider raw size of scanned partitions in the absence of stats.</span></div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; candidates.add(<span class="keyword">new</span> Pair(ref, <span class="keyword">new</span> Long(0)));</div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; LOG.trace(<span class="stringliteral">&quot;candidate &quot;</span> + ref.getUniqueAlias() + <span class="stringliteral">&quot;: 0&quot;</span>);</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; }</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; Preconditions.checkNotNull(ref.getDesc());</div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <span class="keywordtype">long</span> materializedSize =</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; (long) Math.ceil(plan.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html#ad7b43aa5e8503f843359720f674dab3e">getAvgRowSize</a>() * (double) plan.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html#a8ce8aa221e9653a7651681aa479ddb14">getCardinality</a>());</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; candidates.add(<span class="keyword">new</span> Pair(ref, <span class="keyword">new</span> Long(materializedSize)));</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; LOG.trace(<span class="stringliteral">&quot;candidate &quot;</span> + ref.getUniqueAlias() + <span class="stringliteral">&quot;: &quot;</span> + Long.toString(materializedSize));</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; }</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <span class="keywordflow">if</span> (candidates.isEmpty()) <span class="keywordflow">return</span> null;</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160;</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="comment">// order candidates by descending materialized size; we want to minimize the memory</span></div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; <span class="comment">// consumption of the materialized hash tables required for the join sequence</span></div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; Collections.sort(candidates,</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="keyword">new</span> Comparator&lt;Pair&lt;TableRef, Long&gt;&gt;() {</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; <span class="keyword">public</span> <span class="keywordtype">int</span> compare(Pair&lt;TableRef, Long&gt; a, Pair&lt;TableRef, Long&gt; b) {</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="keywordtype">long</span> diff = b.second - a.second;</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="keywordflow">return</span> (diff &lt; 0 ? -1 : (diff &gt; 0 ? 1 : 0));</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; }</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; });</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160;</div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; <span class="keywordflow">for</span> (Pair&lt;TableRef, Long&gt; candidate: candidates) {</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> result = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a6fa853944317f1c9064f1bdf1859d3b7">createJoinPlan</a>(analyzer, candidate.first, refPlans);</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; <span class="keywordflow">if</span> (result != null) <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; }</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; <span class="keywordflow">return</span> null;</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; }</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160;</div>
<div class="line"><a name="l00311"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a6fa853944317f1c9064f1bdf1859d3b7"> 311</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a6fa853944317f1c9064f1bdf1859d3b7">createJoinPlan</a>(</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html">TableRef</a> leftmostRef, List&lt;Pair&lt;TableRef, PlanNode&gt;&gt; refPlans)</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; throws <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1ImpalaException.html">ImpalaException</a> {</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160;</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; LOG.trace(<span class="stringliteral">&quot;createJoinPlan: &quot;</span> + leftmostRef.getUniqueAlias());</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="comment">// the refs that have yet to be joined</span></div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; List&lt;Pair&lt;TableRef, PlanNode&gt;&gt; remainingRefs = Lists.newArrayList();</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> root = null; <span class="comment">// root of accumulated join plan</span></div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; <span class="keywordflow">for</span> (Pair&lt;TableRef, PlanNode&gt; entry: refPlans) {</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; <span class="keywordflow">if</span> (entry.first == leftmostRef) {</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; root = entry.second;</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; remainingRefs.add(entry);</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; }</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; }</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; Preconditions.checkNotNull(root);</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <span class="comment">// refs that have been joined. The union of joinedRefs and the refs in remainingRefs</span></div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <span class="comment">// are the set of all table refs.</span></div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; Set&lt;TableRef&gt; joinedRefs = Sets.newHashSet();</div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; joinedRefs.add(leftmostRef);</div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160;</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="comment">// If the leftmostTblRef is an outer/semi/cross join, we must invert it.</span></div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="keywordtype">boolean</span> planHasInvertedJoin = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="keywordflow">if</span> (leftmostRef.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html#a23722bebd2a724caf714b3f967f55aa3">getJoinOp</a>().isOuterJoin()</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; || leftmostRef.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html#a23722bebd2a724caf714b3f967f55aa3">getJoinOp</a>().isSemiJoin()</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; || leftmostRef.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html#a23722bebd2a724caf714b3f967f55aa3">getJoinOp</a>().isCrossJoin()) {</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <span class="comment">// TODO: Revisit the interaction of join inversion here and the analysis state</span></div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <span class="comment">// that is changed in analyzer.invertOuterJoin(). Changing the analysis state</span></div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <span class="comment">// should not be necessary because the semantics of an inverted outer join do</span></div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <span class="comment">// not change.</span></div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; leftmostRef.invertJoin(refPlans, analyzer);</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; planHasInvertedJoin = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; }</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160;</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keywordtype">long</span> numOps = 0;</div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="keywordtype">int</span> i = 0;</div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <span class="keywordflow">while</span> (!remainingRefs.isEmpty()) {</div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="comment">// we minimize the resulting cardinality at each step in the join chain,</span></div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="comment">// which minimizes the total number of hash table lookups</span></div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> newRoot = null;</div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; Pair&lt;TableRef, PlanNode&gt; minEntry = null;</div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="keywordflow">for</span> (Pair&lt;TableRef, PlanNode&gt; entry: remainingRefs) {</div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html">TableRef</a> ref = entry.first;</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; LOG.trace(Integer.toString(i) + <span class="stringliteral">&quot; considering ref &quot;</span> + ref.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html#a436e1b236e0f03b40a5c2daf5da07cb8">getUniqueAlias</a>());</div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160;</div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="comment">// Determine whether we can or must consider this join at this point in the plan.</span></div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="comment">// Place outer/semi joins at a fixed position in the plan tree (IMPALA-860),</span></div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <span class="comment">// s.t. all the tables appearing to the left/right of an outer/semi join in</span></div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="comment">// the original query still remain to the left/right after join ordering. This</span></div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <span class="comment">// prevents join re-ordering across outer/semi joins which is generally wrong.</span></div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="comment">// The checks below relies on remainingRefs being in the order as they originally</span></div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="comment">// appeared in the query.</span></div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <a class="code" href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator.html">JoinOperator</a> joinOp = ref.getJoinOp();</div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <span class="keywordflow">if</span> (joinOp.isOuterJoin() || joinOp.isSemiJoin()) {</div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; List&lt;TupleId&gt; currentTids = Lists.newArrayList(root.getTblRefIds());</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; currentTids.add(ref.getId());</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <span class="comment">// Place outer/semi joins at a fixed position in the plan tree. We know that</span></div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="comment">// the join resulting from &#39;ref&#39; must become the new root if the current</span></div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="comment">// root materializes exactly those tuple ids corresponding to TableRefs</span></div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="comment">// appearing to the left of &#39;ref&#39; in the original query.</span></div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; List&lt;TupleId&gt; tableRefTupleIds = ref.getAllTupleIds();</div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; <span class="keywordflow">if</span> (!currentTids.containsAll(tableRefTupleIds) ||</div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; !tableRefTupleIds.containsAll(currentTids)) {</div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; <span class="comment">// Do not consider the remaining table refs to prevent incorrect re-ordering</span></div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <span class="comment">// of tables across outer/semi/anti joins.</span></div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; }</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ref.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html#a23722bebd2a724caf714b3f967f55aa3">getJoinOp</a>().isCrossJoin()) {</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="keywordflow">if</span> (!joinedRefs.contains(ref.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html#aee1caa4453247d7983760079b7f55c9e">getLeftTblRef</a>())) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; }</div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160;</div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> rhsPlan = entry.second;</div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; analyzer.setAssignedConjuncts(root.getAssignedConjuncts());</div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160;</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="keywordtype">boolean</span> invertJoin = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <span class="keywordflow">if</span> (joinOp.isOuterJoin() || joinOp.isSemiJoin() || joinOp.isCrossJoin()) {</div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <span class="comment">// Invert the join if doing so reduces the size of build-side hash table</span></div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; <span class="comment">// (may also reduce network costs depending on the join strategy).</span></div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; <span class="comment">// Only consider this optimization if both the lhs/rhs cardinalities are known.</span></div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <span class="comment">// The null-aware left anti-join operator is never considered for inversion</span></div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <span class="comment">// because we can&#39;t execute the null-aware right anti-join efficiently.</span></div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; <span class="keywordtype">long</span> lhsCard = root.getCardinality();</div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="keywordtype">long</span> rhsCard = rhsPlan.getCardinality();</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="keywordflow">if</span> (lhsCard != -1 &amp;&amp; rhsCard != -1 &amp;&amp;</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; lhsCard * root.getAvgRowSize() &lt; rhsCard * rhsPlan.getAvgRowSize() &amp;&amp;</div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; !joinOp.isNullAwareLeftAntiJoin()) {</div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; invertJoin = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; }</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; }</div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> candidate = null;</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <span class="keywordflow">if</span> (invertJoin) {</div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; ref.setJoinOp(ref.getJoinOp().invert());</div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; candidate = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a4d03d4b05a3fad0be154a7b610466217">createJoinNode</a>(analyzer, rhsPlan, root, ref, null);</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; planHasInvertedJoin = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; candidate = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a4d03d4b05a3fad0be154a7b610466217">createJoinNode</a>(analyzer, root, rhsPlan, null, ref);</div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; }</div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="keywordflow">if</span> (candidate == null) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; LOG.trace(<span class="stringliteral">&quot;cardinality=&quot;</span> + Long.toString(candidate.getCardinality()));</div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160;</div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; <span class="comment">// Use &#39;candidate&#39; as the new root; don&#39;t consider any other table refs at this</span></div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; <span class="comment">// position in the plan.</span></div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <span class="keywordflow">if</span> (joinOp.isOuterJoin() || joinOp.isSemiJoin()) {</div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; newRoot = candidate;</div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; minEntry = entry;</div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; }</div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160;</div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; <span class="comment">// Always prefer Hash Join over Cross Join due to limited costing infrastructure</span></div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="keywordflow">if</span> (newRoot == null</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; || (candidate.getClass().equals(newRoot.getClass())</div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; &amp;&amp; candidate.getCardinality() &lt; newRoot.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html#a8ce8aa221e9653a7651681aa479ddb14">getCardinality</a>())</div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; || (candidate instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1HashJoinNode.html">HashJoinNode</a> &amp;&amp; newRoot instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1CrossJoinNode.html">CrossJoinNode</a>)) {</div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; newRoot = candidate;</div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; minEntry = entry;</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; }</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; }</div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="keywordflow">if</span> (newRoot == null) {</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; <span class="comment">// Currently, it should not be possible to invert a join for a plan that turns</span></div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="comment">// out to be non-executable because (1) the joins we consider for inversion are</span></div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; <span class="comment">// barriers in the join order, and (2) the caller of this function only considers</span></div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <span class="comment">// other leftmost table refs if a plan turns out to be non-executable.</span></div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="comment">// TODO: This preconditions check will need to be changed to undo the in-place</span></div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; <span class="comment">// modifications made to table refs for join inversion, if the caller decides to</span></div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="comment">// explore more leftmost table refs.</span></div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; Preconditions.checkState(!planHasInvertedJoin);</div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; <span class="keywordflow">return</span> null;</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; }</div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160;</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="comment">// we need to insert every rhs row into the hash table and then look up</span></div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <span class="comment">// every lhs row</span></div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="keywordtype">long</span> lhsCardinality = root.getCardinality();</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="keywordtype">long</span> rhsCardinality = minEntry.second.getCardinality();</div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; numOps += lhsCardinality + rhsCardinality;</div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; LOG.debug(Integer.toString(i) + <span class="stringliteral">&quot; chose &quot;</span> + minEntry.first.getUniqueAlias()</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; + <span class="stringliteral">&quot; #lhs=&quot;</span> + Long.toString(lhsCardinality)</div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; + <span class="stringliteral">&quot; #rhs=&quot;</span> + Long.toString(rhsCardinality)</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; + <span class="stringliteral">&quot; #ops=&quot;</span> + Long.toString(numOps));</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; remainingRefs.remove(minEntry);</div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; joinedRefs.add(minEntry.first);</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; root = newRoot;</div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <span class="comment">// assign id_ after running through the possible choices in order to end up</span></div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; <span class="comment">// with a dense sequence of node ids</span></div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; root.setId(ctx_.getNextNodeId());</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; analyzer.setAssignedConjuncts(root.getAssignedConjuncts());</div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; ++i;</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; }</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160;</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="keywordflow">return</span> root;</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; }</div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160;</div>
<div class="line"><a name="l00465"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#abaa4ecccd3ca73c2923eaf27c77c620b"> 465</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#abaa4ecccd3ca73c2923eaf27c77c620b">createFromClauseJoinPlan</a>(</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer, List&lt;Pair&lt;TableRef, PlanNode&gt;&gt; refPlans)</div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; throws <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1ImpalaException.html">ImpalaException</a> {</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <span class="comment">// create left-deep sequence of binary hash joins; assign node ids as we go along</span></div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; Preconditions.checkState(!refPlans.isEmpty());</div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> root = refPlans.get(0).second;</div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i &lt; refPlans.size(); ++i) {</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html">TableRef</a> innerRef = refPlans.get(i).first;</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> innerPlan = refPlans.get(i).second;</div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; root = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a4d03d4b05a3fad0be154a7b610466217">createJoinNode</a>(analyzer, root, innerPlan, null, innerRef);</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; root.setId(ctx_.getNextNodeId());</div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; }</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="keywordflow">return</span> root;</div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; }</div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160;</div>
<div class="line"><a name="l00484"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#ac79d4bce3405c53140a7bce76e71508a"> 484</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#ac79d4bce3405c53140a7bce76e71508a">createSelectPlan</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SelectStmt.html">SelectStmt</a> selectStmt, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer)</div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keywordflow">throws</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1ImpalaException.html">ImpalaException</a> {</div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; <span class="comment">// no from clause -&gt; materialize the select&#39;s exprs with a UnionNode</span></div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <span class="keywordflow">if</span> (selectStmt.getTableRefs().isEmpty()) {</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#af23ff536f7622d5885788844555e074b">createConstantSelectPlan</a>(selectStmt, analyzer);</div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; }</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160;</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; <span class="comment">// Slot materialization:</span></div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; <span class="comment">// We need to mark all slots as materialized that are needed during the execution</span></div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; <span class="comment">// of selectStmt, and we need to do that prior to creating plans for the TableRefs</span></div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; <span class="comment">// (because createTableRefNode() might end up calling computeMemLayout() on one or</span></div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; <span class="comment">// more TupleDescriptors, at which point all referenced slots need to be marked).</span></div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; <span class="comment">// For non-join predicates, slots are marked as follows:</span></div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; <span class="comment">// - for base table scan predicates, this is done directly by ScanNode.init(), which</span></div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="comment">// can do a better job because it doesn&#39;t need to materialize slots that are only</span></div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; <span class="comment">// referenced for partition pruning, for instance</span></div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; <span class="comment">// - for inline views, non-join predicates are pushed down, at which point the</span></div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <span class="comment">// process repeats itself.</span></div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; selectStmt.materializeRequiredSlots(analyzer);</div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160;</div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; ArrayList&lt;TupleId&gt; rowTuples = Lists.newArrayList();</div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <span class="comment">// collect output tuples of subtrees</span></div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html">TableRef</a> tblRef: selectStmt.getTableRefs()) {</div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; rowTuples.addAll(tblRef.getMaterializedTupleIds());</div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; }</div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160;</div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="comment">// If the selectStmt&#39;s select-project-join portion returns an empty result set</span></div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; <span class="comment">// create a plan that feeds the aggregation of selectStmt with an empty set.</span></div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; <span class="comment">// Make sure the slots of the aggregation exprs and the tuples that they reference</span></div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; <span class="comment">// are materialized (see IMPALA-1960).</span></div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; <span class="keywordflow">if</span> (analyzer.hasEmptySpjResultSet()) {</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> emptySetNode = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1EmptySetNode.html">EmptySetNode</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#af60cf05e54d6c00065ff1036cdddd62b">getNextNodeId</a>(), rowTuples);</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; emptySetNode.init(analyzer);</div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; emptySetNode.setOutputSmap(selectStmt.getBaseTblSmap());</div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a05572e608b36bc61d82b5f5f57476882">createAggregationPlan</a>(selectStmt, analyzer, emptySetNode);</div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; }</div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160;</div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <span class="comment">// create plans for our table refs; use a list here instead of a map to</span></div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; <span class="comment">// maintain a deterministic order of traversing the TableRefs during join</span></div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; <span class="comment">// plan generation (helps with tests)</span></div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; List&lt;Pair&lt;TableRef, PlanNode&gt;&gt; refPlans = Lists.newArrayList();</div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html">TableRef</a> ref: selectStmt.getTableRefs()) {</div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> plan = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#afc674d235914984520d56b24163e6b69">createTableRefNode</a>(analyzer, ref);</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; Preconditions.checkState(plan != null);</div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; refPlans.add(<span class="keyword">new</span> Pair(ref, plan));</div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; }</div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <span class="comment">// save state of conjunct assignment; needed for join plan generation</span></div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; <span class="keywordflow">for</span> (Pair&lt;TableRef, PlanNode&gt; entry: refPlans) {</div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; entry.second.setAssignedConjuncts(analyzer.getAssignedConjuncts());</div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; }</div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160;</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> root = null;</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <span class="keywordflow">if</span> (!selectStmt.getSelectList().isStraightJoin()) {</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; Set&lt;ExprId&gt; assignedConjuncts = analyzer.getAssignedConjuncts();</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; root = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a36a0e82b73a0fb2bd7084906f7fd5bd8">createCheapestJoinPlan</a>(analyzer, refPlans);</div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <span class="keywordflow">if</span> (root == null) analyzer.setAssignedConjuncts(assignedConjuncts);</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; }</div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <span class="keywordflow">if</span> (selectStmt.getSelectList().isStraightJoin() || root == null) {</div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <span class="comment">// we didn&#39;t have enough stats to do a cost-based join plan, or the STRAIGHT_JOIN</span></div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <span class="comment">// keyword was in the select list: use the FROM clause order instead</span></div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; root = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#abaa4ecccd3ca73c2923eaf27c77c620b">createFromClauseJoinPlan</a>(analyzer, refPlans);</div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; Preconditions.checkNotNull(root);</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; }</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160;</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="comment">// add aggregation, if any</span></div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; <span class="keywordflow">if</span> (selectStmt.getAggInfo() != null) {</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; root = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a05572e608b36bc61d82b5f5f57476882">createAggregationPlan</a>(selectStmt, analyzer, root);</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; }</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160;</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; <span class="comment">// All the conjuncts_ should be assigned at this point.</span></div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="comment">// TODO: Re-enable this check here and/or elswehere.</span></div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="comment">//Preconditions.checkState(!analyzer.hasUnassignedConjuncts());</span></div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; <span class="keywordflow">return</span> root;</div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; }</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160;</div>
<div class="line"><a name="l00564"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a05572e608b36bc61d82b5f5f57476882"> 564</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a05572e608b36bc61d82b5f5f57476882">createAggregationPlan</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SelectStmt.html">SelectStmt</a> selectStmt, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer,</div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> root) <span class="keywordflow">throws</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1InternalException.html">InternalException</a> {</div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; Preconditions.checkState(selectStmt.getAggInfo() != null);</div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <span class="comment">// add aggregation, if required</span></div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1AggregateInfo.html">AggregateInfo</a> aggInfo = selectStmt.getAggInfo();</div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; root = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1AggregationNode.html">AggregationNode</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#af60cf05e54d6c00065ff1036cdddd62b">getNextNodeId</a>(), root, aggInfo);</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; root.init(analyzer);</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; Preconditions.checkState(root.hasValidStats());</div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; <span class="comment">// if we&#39;re computing DISTINCT agg fns, the analyzer already created the</span></div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; <span class="comment">// 2nd phase agginfo</span></div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; <span class="keywordflow">if</span> (aggInfo.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1AggregateInfo.html#a6bbbe454d78f9df442f29176b7817d23">isDistinctAgg</a>()) {</div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; ((<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1AggregationNode.html">AggregationNode</a>)root).unsetNeedsFinalize();</div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <span class="comment">// The output of the 1st phase agg is the 1st phase intermediate.</span></div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; ((<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1AggregationNode.html">AggregationNode</a>)root).setIntermediateTuple();</div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; root = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1AggregationNode.html">AggregationNode</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#af60cf05e54d6c00065ff1036cdddd62b">getNextNodeId</a>(), root,</div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; aggInfo.getSecondPhaseDistinctAggInfo());</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; root.init(analyzer);</div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; Preconditions.checkState(root.hasValidStats());</div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; }</div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <span class="comment">// add Having clause</span></div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; root.assignConjuncts(analyzer);</div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <span class="keywordflow">return</span> root;</div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; }</div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160;</div>
<div class="line"><a name="l00592"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#af23ff536f7622d5885788844555e074b"> 592</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#af23ff536f7622d5885788844555e074b">createConstantSelectPlan</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SelectStmt.html">SelectStmt</a> selectStmt, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer)</div>
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; <span class="keywordflow">throws</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1InternalException.html">InternalException</a> {</div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; Preconditions.checkState(selectStmt.getTableRefs().isEmpty());</div>
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; ArrayList&lt;Expr&gt; resultExprs = selectStmt.getResultExprs();</div>
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; ArrayList&lt;String&gt; colLabels = selectStmt.getColLabels();</div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; <span class="comment">// Create tuple descriptor for materialized tuple.</span></div>
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TupleDescriptor.html">TupleDescriptor</a> tupleDesc = analyzer.getDescTbl().createTupleDescriptor(<span class="stringliteral">&quot;union&quot;</span>);</div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; tupleDesc.setIsMaterialized(<span class="keyword">true</span>);</div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1UnionNode.html">UnionNode</a> unionNode = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1UnionNode.html">UnionNode</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#af60cf05e54d6c00065ff1036cdddd62b">getNextNodeId</a>(), tupleDesc.getId());</div>
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160;</div>
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; <span class="comment">// Analysis guarantees that selects without a FROM clause only have constant exprs.</span></div>
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; unionNode.addConstExprList(Lists.newArrayList(resultExprs));</div>
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160;</div>
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; <span class="comment">// Replace the select stmt&#39;s resultExprs with SlotRefs into tupleDesc.</span></div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; resultExprs.size(); ++i) {</div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotDescriptor.html">SlotDescriptor</a> slotDesc = analyzer.addSlotDescriptor(tupleDesc);</div>
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; slotDesc.setLabel(colLabels.get(i));</div>
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; slotDesc.setSourceExpr(resultExprs.get(i));</div>
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; slotDesc.setType(resultExprs.get(i).getType());</div>
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; slotDesc.setStats(ColumnStats.fromExpr(resultExprs.get(i)));</div>
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; slotDesc.setIsMaterialized(<span class="keyword">true</span>);</div>
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotRef.html">SlotRef</a> slotRef = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotRef.html">SlotRef</a>(slotDesc);</div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; resultExprs.set(i, slotRef);</div>
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; }</div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; tupleDesc.computeMemLayout();</div>
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; <span class="comment">// UnionNode.init() needs tupleDesc to have been initialized</span></div>
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; unionNode.init(analyzer);</div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; <span class="keywordflow">return</span> unionNode;</div>
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; }</div>
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160;</div>
<div class="line"><a name="l00632"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#aecaee173fbdf28d95320d2770237862f"> 632</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1ValueRange.html">ValueRange</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#aecaee173fbdf28d95320d2770237862f">createHBaseValueRange</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotDescriptor.html">SlotDescriptor</a> d, List&lt;Expr&gt; conjuncts) {</div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; ListIterator&lt;Expr&gt; i = conjuncts.listIterator();</div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1ValueRange.html">ValueRange</a> result = null;</div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; <span class="keywordflow">while</span> (i.hasNext()) {</div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr.html">Expr</a> e = i.next();</div>
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; <span class="keywordflow">if</span> (!(e instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html">BinaryPredicate</a>)) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; BinaryPredicate comp = (BinaryPredicate) e;</div>
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; <span class="keywordflow">if</span> (comp.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html#a773c89d3973d81bf8102162f06e08dc6">getOp</a>() == BinaryPredicate.Operator.NE) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr.html">Expr</a> slotBinding = comp.getSlotBinding(d.getId());</div>
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; <span class="keywordflow">if</span> (slotBinding == null || !slotBinding.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr.html#a06da750e05bfbaa64f54b056479f64a7">isConstant</a>() ||</div>
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; !slotBinding.getType().equals(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1Type.html">Type</a>.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1Type.html#a20128254897643f1f2a8bf575ffd8c41">STRING</a>)) {</div>
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; }</div>
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160;</div>
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; <span class="keywordflow">if</span> (comp.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html#a773c89d3973d81bf8102162f06e08dc6">getOp</a>() == BinaryPredicate.Operator.EQ) {</div>
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; i.remove();</div>
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; <span class="keywordflow">return</span> ValueRange.createEqRange(slotBinding);</div>
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; }</div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160;</div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; <span class="keywordflow">if</span> (result == null) result = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1ValueRange.html">ValueRange</a>();</div>
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160;</div>
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <span class="comment">// TODO: do we need copies here?</span></div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; <span class="keywordflow">if</span> (comp.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html#a773c89d3973d81bf8102162f06e08dc6">getOp</a>() == BinaryPredicate.Operator.GT</div>
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; || comp.getOp() == BinaryPredicate.<a class="code" href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate_1_1Operator.html#ab63d78248ffdc1a68add620ae6a02da5">Operator</a>.GE) {</div>
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; <span class="keywordflow">if</span> (result.getLowerBound() == null) {</div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; result.setLowerBound(slotBinding);</div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; result.setLowerBoundInclusive(comp.getOp() == BinaryPredicate.Operator.GE);</div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; i.remove();</div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; }</div>
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; <span class="keywordflow">if</span> (result.getUpperBound() == null) {</div>
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; result.setUpperBound(slotBinding);</div>
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; result.setUpperBoundInclusive(comp.getOp() == BinaryPredicate.Operator.LE);</div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; i.remove();</div>
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; }</div>
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; }</div>
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; }</div>
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; }</div>
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160;</div>
<div class="line"><a name="l00684"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b6e48363db1fc3145fab2b33d71fd21"> 684</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b6e48363db1fc3145fab2b33d71fd21">createInlineViewPlan</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1InlineViewRef.html">InlineViewRef</a> inlineViewRef)</div>
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; <span class="keywordflow">throws</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1ImpalaException.html">ImpalaException</a> {</div>
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; <span class="comment">// If possible, &quot;push down&quot; view predicates; this is needed in order to ensure</span></div>
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; <span class="comment">// that predicates such as &quot;x + y = 10&quot; are evaluated in the view&#39;s plan tree</span></div>
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; <span class="comment">// rather than a SelectNode grafted on top of that plan tree.</span></div>
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160; <span class="comment">// This doesn&#39;t prevent predicate propagation, because predicates like</span></div>
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; <span class="comment">// &quot;x = 10&quot; that get pushed down are still connected to equivalent slots</span></div>
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160; <span class="comment">// via the equality predicates created for the view&#39;s select list.</span></div>
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; <span class="comment">// Include outer join conjuncts here as well because predicates from the</span></div>
<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; <span class="comment">// On-clause of an outer join may be pushed into the inline view as well.</span></div>
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a0a5153cf7d9be339358005c248c3cc56">migrateConjunctsToInlineView</a>(analyzer, inlineViewRef);</div>
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160;</div>
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; <span class="comment">// Turn a constant select into a UnionNode that materializes the exprs.</span></div>
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; <span class="comment">// TODO: unify this with createConstantSelectPlan(), this is basically the</span></div>
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; <span class="comment">// same thing</span></div>
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1QueryStmt.html">QueryStmt</a> viewStmt = inlineViewRef.getViewStmt();</div>
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; <span class="keywordflow">if</span> (viewStmt instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SelectStmt.html">SelectStmt</a>) {</div>
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; SelectStmt selectStmt = (SelectStmt) viewStmt;</div>
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; <span class="keywordflow">if</span> (selectStmt.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SelectStmt.html#aad11980b9b5fb4d27733b97b82291fb7">getTableRefs</a>().isEmpty()) {</div>
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; <span class="keywordflow">if</span> (inlineViewRef.getAnalyzer().hasEmptyResultSet()) {</div>
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8dbf5c3ae2fd5655dfc1e61a63bf4ce3">createEmptyNode</a>(viewStmt, inlineViewRef.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1QueryStmt.html#a50326a4d89333ffebe34b7f11181a67a">getAnalyzer</a>());</div>
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; }</div>
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; <span class="comment">// Analysis should have generated a tuple id_ into which to materialize the exprs.</span></div>
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; Preconditions.checkState(inlineViewRef.getMaterializedTupleIds().size() == 1);</div>
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160; <span class="comment">// we need to materialize all slots of our inline view tuple</span></div>
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; analyzer.getTupleDesc(inlineViewRef.getId()).materializeSlots();</div>
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1UnionNode.html">UnionNode</a> unionNode = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1UnionNode.html">UnionNode</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#af60cf05e54d6c00065ff1036cdddd62b">getNextNodeId</a>(),</div>
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; inlineViewRef.getMaterializedTupleIds().<span class="keyword">get</span>(0));</div>
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; <span class="keywordflow">if</span> (analyzer.hasEmptyResultSet()) <span class="keywordflow">return</span> unionNode;</div>
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; unionNode.setTblRefIds(Lists.newArrayList(inlineViewRef.getId()));</div>
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; unionNode.addConstExprList(selectStmt.getBaseTblResultExprs());</div>
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; unionNode.init(analyzer);</div>
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160; <span class="keywordflow">return</span> unionNode;</div>
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; }</div>
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; }</div>
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160;</div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> rootNode =</div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a617178c5646f3f77f7d559c8f01018ba">createQueryPlan</a>(inlineViewRef.getViewStmt(), inlineViewRef.getAnalyzer(), <span class="keyword">false</span>);</div>
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; <span class="comment">// TODO: we should compute the &quot;physical layout&quot; of the view&#39;s descriptor, so that</span></div>
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; <span class="comment">// the avg row size is availble during optimization; however, that means we need to</span></div>
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; <span class="comment">// select references to its resultExprs from the enclosing scope(s)</span></div>
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; rootNode.setTblRefIds(Lists.newArrayList(inlineViewRef.getId()));</div>
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160;</div>
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1ExprSubstitutionMap.html">ExprSubstitutionMap</a> inlineViewSmap = inlineViewRef.getSmap();</div>
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; <span class="keywordflow">if</span> (analyzer.isOuterJoined(inlineViewRef.getId())) {</div>
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; <span class="comment">// Exprs against non-matched rows of an outer join should always return NULL.</span></div>
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; <span class="comment">// Make the rhs exprs of the inline view&#39;s smap nullable, if necessary.</span></div>
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160; List&lt;Expr&gt; nullableRhs = TupleIsNullPredicate.wrapExprs(</div>
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160; inlineViewSmap.getRhs(), rootNode.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html#ac7d0db4439c91a8935884d153887b088">getTupleIds</a>(), analyzer);</div>
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; inlineViewSmap = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1ExprSubstitutionMap.html">ExprSubstitutionMap</a>(inlineViewSmap.getLhs(), nullableRhs);</div>
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; }</div>
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; <span class="comment">// Set output smap of rootNode *before* creating a SelectNode for proper resolution.</span></div>
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; <span class="comment">// The output smap is the composition of the inline view&#39;s smap and the output smap</span></div>
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; <span class="comment">// of the inline view&#39;s plan root. This ensures that all downstream exprs referencing</span></div>
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160; <span class="comment">// the inline view are replaced with exprs referencing the physical output of</span></div>
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; <span class="comment">// the inline view&#39;s plan.</span></div>
<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1ExprSubstitutionMap.html">ExprSubstitutionMap</a> composedSmap = ExprSubstitutionMap.compose(inlineViewSmap,</div>
<div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; rootNode.getOutputSmap(), analyzer);</div>
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; rootNode.setOutputSmap(composedSmap);</div>
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160;</div>
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; <span class="comment">// If the inline view has a LIMIT/OFFSET or unassigned conjuncts due to analytic</span></div>
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; <span class="comment">// functions, we may have conjuncts that need to be assigned to a SELECT node on</span></div>
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160; <span class="comment">// top of the current plan root node.</span></div>
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160; <span class="comment">// TODO: This check is also repeated in migrateConjunctsToInlineView() because we</span></div>
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160; <span class="comment">// need to make sure that equivalences are not enforced multiple times. Consolidate</span></div>
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160; <span class="comment">// the assignment of conjuncts and the enforcement of equivalences into a single</span></div>
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; <span class="comment">// place.</span></div>
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a20fae76e565c9fe6e4bead3433560f60">canMigrateConjuncts</a>(inlineViewRef)) {</div>
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160; rootNode = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#ac408e6059606469bb147e0823f87c50d">addUnassignedConjuncts</a>(</div>
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; analyzer, inlineViewRef.getDesc().getId().asList(), rootNode);</div>
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; }</div>
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160; <span class="keywordflow">return</span> rootNode;</div>
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; }</div>
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160;</div>
<div class="line"><a name="l00769"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a0a5153cf7d9be339358005c248c3cc56"> 769</a></span>&#160; <span class="keyword">public</span> <span class="keywordtype">void</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a0a5153cf7d9be339358005c248c3cc56">migrateConjunctsToInlineView</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer,</div>
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1InlineViewRef.html">InlineViewRef</a> inlineViewRef) {</div>
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; List&lt;Expr&gt; unassignedConjuncts =</div>
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160; analyzer.getUnassignedConjuncts(inlineViewRef.getId().asList(), <span class="keyword">true</span>);</div>
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a20fae76e565c9fe6e4bead3433560f60">canMigrateConjuncts</a>(inlineViewRef)) {</div>
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160; <span class="comment">// mark (fully resolve) slots referenced by unassigned conjuncts as</span></div>
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160; <span class="comment">// materialized</span></div>
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>&#160; List&lt;Expr&gt; substUnassigned = Expr.substituteList(unassignedConjuncts,</div>
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>&#160; inlineViewRef.getBaseTblSmap(), analyzer, <span class="keyword">false</span>);</div>
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160; analyzer.materializeSlots(substUnassigned);</div>
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160; }</div>
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160;</div>
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; List&lt;Expr&gt; preds = Lists.newArrayList();</div>
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr.html">Expr</a> e: unassignedConjuncts) {</div>
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160; <span class="keywordflow">if</span> (analyzer.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html#a629d43ac7188a079d1eabd3fb768419e">canEvalPredicate</a>(inlineViewRef.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html#a24a3ac3e0fea9784c98322b9c22c451f">getId</a>().asList(), e)) {</div>
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; preds.add(e);</div>
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; }</div>
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160; }</div>
<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160; unassignedConjuncts.removeAll(preds);</div>
<div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160; <span class="comment">// Generate predicates to enforce equivalences among slots of the inline view</span></div>
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; <span class="comment">// tuple. These predicates are also migrated into the inline view.</span></div>
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160; analyzer.createEquivConjuncts(inlineViewRef.getId(), preds);</div>
<div class="line"><a name="l00792"></a><span class="lineno"> 792</span>&#160;</div>
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160; <span class="comment">// create new predicates against the inline view&#39;s unresolved result exprs, not</span></div>
<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>&#160; <span class="comment">// the resolved result exprs, in order to avoid skipping scopes (and ignoring</span></div>
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160; <span class="comment">// limit clauses on the way)</span></div>
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160; List&lt;Expr&gt; viewPredicates =</div>
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; Expr.substituteList(preds, inlineViewRef.getSmap(), analyzer, <span class="keyword">false</span>);</div>
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160;</div>
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; <span class="comment">// Remove unregistered predicates that reference the same slot on</span></div>
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160; <span class="comment">// both sides (e.g. a = a). Such predicates have been generated from slot</span></div>
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; <span class="comment">// equivalences and may incorrectly reject rows with nulls (IMPALA-1412).</span></div>
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Predicate.html">Predicate&lt;Expr&gt;</a> isIdentityPredicate = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Predicate.html">Predicate&lt;Expr&gt;</a>() {</div>
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160; @Override</div>
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; <span class="keyword">public</span> <span class="keywordtype">boolean</span> apply(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr.html">Expr</a> expr) {</div>
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160; <span class="keywordflow">if</span> (!(expr instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html">BinaryPredicate</a>)</div>
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; || ((BinaryPredicate) expr).getOp() != BinaryPredicate.Operator.EQ) {</div>
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160; }</div>
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; <span class="keywordflow">if</span> (!expr.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr.html#a41866855badf86dc04eaf584860ea244">isRegisteredPredicate</a>()</div>
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160; &amp;&amp; expr.getChild(0) instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotRef.html">SlotRef</a></div>
<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160; &amp;&amp; expr.getChild(1) instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotRef.html">SlotRef</a></div>
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160; &amp;&amp; (((<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotRef.html">SlotRef</a>) expr.getChild(0)).getSlotId() ==</div>
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160; ((<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotRef.html">SlotRef</a>) expr.getChild(1)).getSlotId())) {</div>
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160; }</div>
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160; }</div>
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; };</div>
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160; Iterables.removeIf(viewPredicates, isIdentityPredicate);</div>
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160;</div>
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; <span class="comment">// &quot;migrate&quot; conjuncts_ by marking them as assigned and re-registering them with</span></div>
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; <span class="comment">// new ids.</span></div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; <span class="comment">// Mark pre-substitution conjuncts as assigned, since the ids of the new exprs may</span></div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; <span class="comment">// have changed.</span></div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; analyzer.markConjunctsAssigned(preds);</div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; inlineViewRef.getAnalyzer().registerConjuncts(viewPredicates);</div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160;</div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; <span class="comment">// mark (fully resolve) slots referenced by remaining unassigned conjuncts as</span></div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; <span class="comment">// materialized</span></div>
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; List&lt;Expr&gt; substUnassigned = Expr.substituteList(unassignedConjuncts,</div>
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; inlineViewRef.getBaseTblSmap(), analyzer, <span class="keyword">false</span>);</div>
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; analyzer.materializeSlots(substUnassigned);</div>
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160; }</div>
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160;</div>
<div class="line"><a name="l00838"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a20fae76e565c9fe6e4bead3433560f60"> 838</a></span>&#160; <span class="keyword">private</span> <span class="keywordtype">boolean</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a20fae76e565c9fe6e4bead3433560f60">canMigrateConjuncts</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1InlineViewRef.html">InlineViewRef</a> inlineViewRef) {</div>
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160; <span class="keywordflow">return</span> !inlineViewRef.getViewStmt().hasLimit()</div>
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; &amp;&amp; !inlineViewRef.getViewStmt().hasOffset()</div>
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; &amp;&amp; (!(inlineViewRef.getViewStmt() instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SelectStmt.html">SelectStmt</a>)</div>
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160; || !((SelectStmt) inlineViewRef.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1InlineViewRef.html#a08184b94fb53e004b591ff55aa4383af">getViewStmt</a>()).hasAnalyticInfo());</div>
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; }</div>
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160;</div>
<div class="line"><a name="l00848"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a629ee595712364e1afe54f23b676fb20"> 848</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a629ee595712364e1afe54f23b676fb20">createScanNode</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html">TableRef</a> tblRef)</div>
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; <span class="keywordflow">throws</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1InternalException.html">InternalException</a> {</div>
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1ScanNode.html">ScanNode</a> scanNode = null;</div>
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; <span class="keywordflow">if</span> (tblRef.getTable() instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1HdfsTable.html">HdfsTable</a>) {</div>
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; scanNode = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1HdfsScanNode.html">HdfsScanNode</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#af60cf05e54d6c00065ff1036cdddd62b">getNextNodeId</a>(), tblRef.getDesc(),</div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; (<a class="code" href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1HdfsTable.html">HdfsTable</a>)tblRef.getTable());</div>
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; scanNode.init(analyzer);</div>
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; <span class="keywordflow">return</span> scanNode;</div>
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tblRef.getTable() instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1DataSourceTable.html">DataSourceTable</a>) {</div>
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; scanNode = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1DataSourceScanNode.html">DataSourceScanNode</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#af60cf05e54d6c00065ff1036cdddd62b">getNextNodeId</a>(), tblRef.getDesc());</div>
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; scanNode.init(analyzer);</div>
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; <span class="keywordflow">return</span> scanNode;</div>
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tblRef.getTable() instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1HBaseTable.html">HBaseTable</a>) {</div>
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; <span class="comment">// HBase table</span></div>
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; scanNode = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1HBaseScanNode.html">HBaseScanNode</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#af60cf05e54d6c00065ff1036cdddd62b">getNextNodeId</a>(), tblRef.getDesc());</div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1InternalException.html">InternalException</a>(<span class="stringliteral">&quot;Invalid table ref class: &quot;</span> + tblRef.getClass());</div>
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160; }</div>
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; <span class="comment">// TODO: move this to HBaseScanNode.init();</span></div>
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; Preconditions.checkState(scanNode instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1HBaseScanNode.html">HBaseScanNode</a>);</div>
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160;</div>
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; List&lt;Expr&gt; conjuncts = analyzer.getUnassignedConjuncts(scanNode);</div>
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; <span class="comment">// mark conjuncts_ assigned here; they will either end up inside a</span></div>
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; <span class="comment">// ValueRange or will be evaluated directly by the node</span></div>
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160; analyzer.markConjunctsAssigned(conjuncts);</div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; List&lt;ValueRange&gt; keyRanges = Lists.newArrayList();</div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; <span class="comment">// determine scan predicates for clustering cols</span></div>
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; tblRef.getTable().getNumClusteringCols(); ++i) {</div>
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotDescriptor.html">SlotDescriptor</a> slotDesc = analyzer.getColumnSlot(</div>
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160; tblRef.getDesc(), tblRef.getTable().getColumns().<span class="keyword">get</span>(i));</div>
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160; <span class="keywordflow">if</span> (slotDesc == null || !slotDesc.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotDescriptor.html#aca35e58acdc44b0d898f67189ff76469">getType</a>().isStringType()) {</div>
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; <span class="comment">// the hbase row key is mapped to a non-string type</span></div>
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; <span class="comment">// (since it&#39;s stored in ascii it will be lexicographically ordered,</span></div>
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; <span class="comment">// and non-string comparisons won&#39;t work)</span></div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160; keyRanges.add(null);</div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; <span class="comment">// create ValueRange from conjuncts_ for slot; also removes conjuncts_ that were</span></div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; <span class="comment">// used as input for filter</span></div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; keyRanges.add(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#aecaee173fbdf28d95320d2770237862f">createHBaseValueRange</a>(slotDesc, conjuncts));</div>
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; }</div>
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; }</div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160;</div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160; ((<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1HBaseScanNode.html">HBaseScanNode</a>)scanNode).setKeyRanges(keyRanges);</div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160; scanNode.addConjuncts(conjuncts);</div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; scanNode.init(analyzer);</div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160;</div>
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>&#160; <span class="keywordflow">return</span> scanNode;</div>
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160; }</div>
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160;</div>
<div class="line"><a name="l00912"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a2fb47326f28781e675e96cbb4b787afc"> 912</a></span>&#160; <span class="keyword">private</span> <span class="keywordtype">void</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a2fb47326f28781e675e96cbb4b787afc">getHashLookupJoinConjuncts</a>(</div>
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer, List&lt;TupleId&gt; planIds, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html">TableRef</a> joinedTblRef,</div>
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; List&lt;BinaryPredicate&gt; joinConjuncts, List&lt;Expr&gt; joinPredicates) {</div>
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; joinConjuncts.clear();</div>
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160; joinPredicates.clear();</div>
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TupleId.html">TupleId</a> tblRefId = joinedTblRef.getId();</div>
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; List&lt;TupleId&gt; tblRefIds = tblRefId.asList();</div>
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; List&lt;Expr&gt; candidates = analyzer.getEqJoinConjuncts(planIds, joinedTblRef);</div>
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160; <span class="keywordflow">if</span> (candidates == null) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160;</div>
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; List&lt;TupleId&gt; joinTupleIds = Lists.newArrayList();</div>
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; joinTupleIds.addAll(planIds);</div>
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160; joinTupleIds.add(tblRefId);</div>
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr.html">Expr</a> e: candidates) {</div>
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160; <span class="comment">// Ignore predicate if one of its children is a constant.</span></div>
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; <span class="keywordflow">if</span> (e.getChild(0).isConstant() || e.getChild(1).isConstant()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>&#160;</div>
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr.html">Expr</a> rhsExpr = null;</div>
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>&#160; <span class="keywordflow">if</span> (e.getChild(0).isBoundByTupleIds(tblRefIds)) {</div>
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; rhsExpr = e.getChild(0);</div>
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>&#160; Preconditions.checkState(e.getChild(1).isBoundByTupleIds(tblRefIds));</div>
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>&#160; rhsExpr = e.getChild(1);</div>
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>&#160; }</div>
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>&#160;</div>
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr.html">Expr</a> lhsExpr = null;</div>
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>&#160; <span class="keywordflow">if</span> (e.getChild(1).isBoundByTupleIds(planIds)) {</div>
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160; lhsExpr = e.getChild(1);</div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (e.getChild(0).isBoundByTupleIds(planIds)) {</div>
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; lhsExpr = e.getChild(0);</div>
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160; <span class="comment">// not an equi-join condition between lhsIds and rhsId</span></div>
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; }</div>
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160;</div>
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; Preconditions.checkState(lhsExpr != rhsExpr);</div>
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; joinPredicates.add(e);</div>
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html">BinaryPredicate</a> joinConjunct =</div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160; <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html">BinaryPredicate</a>(((<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html">BinaryPredicate</a>)e).getOp(), lhsExpr, rhsExpr);</div>
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160; joinConjunct.analyzeNoThrow(analyzer);</div>
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160; joinConjuncts.add(joinConjunct);</div>
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160; }</div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160; <span class="keywordflow">if</span> (!joinPredicates.isEmpty()) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160; Preconditions.checkState(joinConjuncts.isEmpty());</div>
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160;</div>
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160; <span class="comment">// construct joinConjunct entries derived from equivalence class membership</span></div>
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160; List&lt;SlotId&gt; lhsSlotIds = Lists.newArrayList();</div>
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotDescriptor.html">SlotDescriptor</a> slotDesc: joinedTblRef.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html#adb7fea99804944555a4904d14b5a8c01">getDesc</a>().getSlots()) {</div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; analyzer.getEquivSlots(slotDesc.getId(), planIds, lhsSlotIds);</div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; <span class="keywordflow">if</span> (!lhsSlotIds.isEmpty()) {</div>
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160; <span class="comment">// construct a BinaryPredicates in order to get correct casting;</span></div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>&#160; <span class="comment">// we only do this for one of the equivalent slots, all the other implied</span></div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; <span class="comment">// equalities are redundant</span></div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html">BinaryPredicate</a> pred =</div>
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; analyzer.createEqPredicate(lhsSlotIds.get(0), slotDesc.getId());</div>
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160; joinConjuncts.add(pred);</div>
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; }</div>
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; }</div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; }</div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160;</div>
<div class="line"><a name="l00977"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a4d03d4b05a3fad0be154a7b610466217"> 977</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a4d03d4b05a3fad0be154a7b610466217">createJoinNode</a>(</div>
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> outer, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> inner, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html">TableRef</a> outerRef,</div>
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html">TableRef</a> innerRef) <span class="keywordflow">throws</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1ImpalaException.html">ImpalaException</a> {</div>
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160; Preconditions.checkState(innerRef != null ^ outerRef != null);</div>
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html">TableRef</a> tblRef = (innerRef != null) ? innerRef : outerRef;</div>
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160;</div>
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160; List&lt;BinaryPredicate&gt; eqJoinConjuncts = Lists.newArrayList();</div>
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160; List&lt;Expr&gt; eqJoinPredicates = Lists.newArrayList();</div>
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160; <span class="comment">// get eq join predicates for the TableRefs&#39; ids (not the PlanNodes&#39; ids, which</span></div>
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160; <span class="comment">// are materialized)</span></div>
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>&#160; <span class="keywordflow">if</span> (innerRef != null) {</div>
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a2fb47326f28781e675e96cbb4b787afc">getHashLookupJoinConjuncts</a>(</div>
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160; analyzer, outer.getTblRefIds(), innerRef, eqJoinConjuncts, eqJoinPredicates);</div>
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160; <span class="comment">// Outer joins should only use On-clause predicates as eqJoinConjuncts.</span></div>
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160; <span class="keywordflow">if</span> (!innerRef.getJoinOp().isOuterJoin()) {</div>
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; analyzer.createEquivConjuncts(outer.getTblRefIds(), innerRef.getId(),</div>
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>&#160; eqJoinConjuncts);</div>
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>&#160; }</div>
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a2fb47326f28781e675e96cbb4b787afc">getHashLookupJoinConjuncts</a>(</div>
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span>&#160; analyzer, inner.getTblRefIds(), outerRef, eqJoinConjuncts, eqJoinPredicates);</div>
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span>&#160; <span class="comment">// Outer joins should only use On-clause predicates as eqJoinConjuncts.</span></div>
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160; <span class="keywordflow">if</span> (!outerRef.getJoinOp().isOuterJoin()) {</div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160; analyzer.createEquivConjuncts(inner.getTblRefIds(), outerRef.getId(),</div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160; eqJoinConjuncts);</div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160; }</div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160; <span class="comment">// Reverse the lhs/rhs of the join conjuncts.</span></div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html">BinaryPredicate</a> eqJoinConjunct: eqJoinConjuncts) {</div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr.html">Expr</a> swapTmp = eqJoinConjunct.getChild(0);</div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160; eqJoinConjunct.setChild(0, eqJoinConjunct.getChild(1));</div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; eqJoinConjunct.setChild(1, swapTmp);</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160; }</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; }</div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160;</div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160; <span class="comment">// Handle implicit cross joins</span></div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; <span class="keywordflow">if</span> (eqJoinConjuncts.isEmpty()) {</div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; <span class="comment">// Since our only implementation of semi and outer joins is hash-based, and we do</span></div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; <span class="comment">// not re-order semi and outer joins, we must have eqJoinConjuncts here to execute</span></div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; <span class="comment">// this query.</span></div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; <span class="comment">// TODO Revisit when we add more semi/join implementations.</span></div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; <span class="keywordflow">if</span> (tblRef.getJoinOp().isOuterJoin() ||</div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; tblRef.getJoinOp().isSemiJoin()) {</div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1NotImplementedException.html">NotImplementedException</a>(</div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; String.format(<span class="stringliteral">&quot;%s join with &#39;%s&#39; without equi-join &quot;</span> +</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160; <span class="stringliteral">&quot;conjuncts is not supported.&quot;</span>,</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; tblRef.getJoinOp().isOuterJoin() ? <span class="stringliteral">&quot;Outer&quot;</span> : <span class="stringliteral">&quot;Semi&quot;</span>,</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; innerRef.getUniqueAlias()));</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; }</div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1CrossJoinNode.html">CrossJoinNode</a> result = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1CrossJoinNode.html">CrossJoinNode</a>(outer, inner);</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; result.init(analyzer);</div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160; }</div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160;</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160; <span class="comment">// Handle explicit cross joins with equi join conditions</span></div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160; <span class="keywordflow">if</span> (tblRef.getJoinOp() == <a class="code" href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator.html#aed20a5f291c6ea19e43d77a08328150d">JoinOperator.CROSS_JOIN</a>) {</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; tblRef.setJoinOp(<a class="code" href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator.html#aa57923aef27d004862f2b3cb5e0cdd01">JoinOperator.INNER_JOIN</a>);</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160; }</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160;</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160; analyzer.markConjunctsAssigned(eqJoinPredicates);</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;</div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160; List&lt;Expr&gt; otherJoinConjuncts = Lists.newArrayList();</div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160; <span class="keywordflow">if</span> (tblRef.getJoinOp().isOuterJoin()) {</div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160; <span class="comment">// Also assign conjuncts from On clause. All remaining unassigned conjuncts</span></div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; <span class="comment">// that can be evaluated by this join are assigned in createSelectPlan().</span></div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160; otherJoinConjuncts = analyzer.getUnassignedOjConjuncts(tblRef);</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tblRef.getJoinOp().isSemiJoin()) {</div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160; <span class="comment">// Unassigned conjuncts bound by the invisible tuple id of a semi join must have</span></div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160; <span class="comment">// come from the join&#39;s On-clause, and therefore, must be added to the other join</span></div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160; <span class="comment">// conjuncts to produce correct results.</span></div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160; otherJoinConjuncts =</div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160; analyzer.getUnassignedConjuncts(tblRef.getAllTupleIds(), <span class="keyword">false</span>);</div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160; <span class="keywordflow">if</span> (tblRef.getJoinOp().isNullAwareLeftAntiJoin()) {</div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160; <span class="keywordtype">boolean</span> hasNullMatchingEqOperator = <span class="keyword">false</span>;</div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160; <span class="comment">// Keep only the null-matching eq conjunct in the eqJoinConjuncts and move</span></div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160; <span class="comment">// all the others in otherJoinConjuncts. The BE relies on this</span></div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160; <span class="comment">// separation for correct execution of the null-aware left anti join.</span></div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160; Iterator&lt;BinaryPredicate&gt; it = eqJoinConjuncts.iterator();</div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160; <span class="keywordflow">while</span> (it.hasNext()) {</div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html">BinaryPredicate</a> conjunct = it.next();</div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; <span class="keywordflow">if</span> (!conjunct.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html#aa6636fb87ccee8501f4749d357027847">isNullMatchingEq</a>()) {</div>
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160; otherJoinConjuncts.add(conjunct);</div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; it.remove();</div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160; <span class="comment">// Only one null-matching eq conjunct is allowed</span></div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160; Preconditions.checkState(!hasNullMatchingEqOperator);</div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160; hasNullMatchingEqOperator = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160; }</div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160; }</div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160; Preconditions.checkState(hasNullMatchingEqOperator);</div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160; }</div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160; }</div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160; analyzer.markConjunctsAssigned(otherJoinConjuncts);</div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;</div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1HashJoinNode.html">HashJoinNode</a> result =</div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160; <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1HashJoinNode.html">HashJoinNode</a>(outer, inner, tblRef, eqJoinConjuncts, otherJoinConjuncts);</div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160; result.init(analyzer);</div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160; }</div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;</div>
<div class="line"><a name="l01080"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#afc674d235914984520d56b24163e6b69"> 1080</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#afc674d235914984520d56b24163e6b69">createTableRefNode</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html">TableRef</a> tblRef)</div>
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160; <span class="keywordflow">throws</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1ImpalaException.html">ImpalaException</a> {</div>
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160; <span class="keywordflow">if</span> (tblRef instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BaseTableRef.html">BaseTableRef</a> || tblRef instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1CollectionTableRef.html">CollectionTableRef</a>) {</div>
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a629ee595712364e1afe54f23b676fb20">createScanNode</a>(analyzer, tblRef);</div>
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tblRef instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1InlineViewRef.html">InlineViewRef</a>) {</div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b6e48363db1fc3145fab2b33d71fd21">createInlineViewPlan</a>(analyzer, (InlineViewRef) tblRef);</div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160; }</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160; <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1InternalException.html">InternalException</a>(</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160; <span class="stringliteral">&quot;Unknown TableRef node: &quot;</span> + tblRef.getClass().getSimpleName());</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160; }</div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;</div>
<div class="line"><a name="l01098"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a9fa62dadaf353730ba9fa528f84abda2"> 1098</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1UnionNode.html">UnionNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a9fa62dadaf353730ba9fa528f84abda2">createUnionPlan</a>(</div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1UnionStmt.html">UnionStmt</a> unionStmt, List&lt;UnionOperand&gt; unionOperands,</div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> unionDistinctPlan)</div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; <span class="keywordflow">throws</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1ImpalaException.html">ImpalaException</a> {</div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1UnionNode.html">UnionNode</a> unionNode =</div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160; <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1UnionNode.html">UnionNode</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#af60cf05e54d6c00065ff1036cdddd62b">getNextNodeId</a>(), unionStmt.getTupleId());</div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1UnionStmt_1_1UnionOperand.html">UnionOperand</a> op: unionOperands) {</div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1QueryStmt.html">QueryStmt</a> queryStmt = op.getQueryStmt();</div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160; <span class="keywordflow">if</span> (op.isDropped()) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160; <span class="keywordflow">if</span> (queryStmt instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SelectStmt.html">SelectStmt</a>) {</div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; SelectStmt selectStmt = (SelectStmt) queryStmt;</div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160; <span class="keywordflow">if</span> (selectStmt.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SelectStmt.html#aad11980b9b5fb4d27733b97b82291fb7">getTableRefs</a>().isEmpty()) {</div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160; unionNode.addConstExprList(selectStmt.getBaseTblResultExprs());</div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160; }</div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160; }</div>
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> opPlan = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a617178c5646f3f77f7d559c8f01018ba">createQueryPlan</a>(queryStmt, analyzer, <span class="keyword">false</span>);</div>
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160; <span class="keywordflow">if</span> (opPlan instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1EmptySetNode.html">EmptySetNode</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160; unionNode.addChild(opPlan, op.getQueryStmt().getBaseTblResultExprs());</div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160; }</div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160; <span class="keywordflow">if</span> (unionDistinctPlan != null) {</div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160; Preconditions.checkState(unionStmt.hasDistinctOps());</div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160; Preconditions.checkState(unionDistinctPlan instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1AggregationNode.html">AggregationNode</a>);</div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160; unionNode.addChild(unionDistinctPlan,</div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160; unionStmt.getDistinctAggInfo().getGroupingExprs());</div>
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160; }</div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160; unionNode.init(analyzer);</div>
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160; <span class="keywordflow">return</span> unionNode;</div>
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160; }</div>
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;</div>
<div class="line"><a name="l01141"></a><span class="lineno"><a class="line" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a034630dd5dc339232ed7da898b07b484"> 1141</a></span>&#160; <span class="keyword">private</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a034630dd5dc339232ed7da898b07b484">createUnionPlan</a>(<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1UnionStmt.html">UnionStmt</a> unionStmt, <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer)</div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160; <span class="keywordflow">throws</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1common_1_1ImpalaException.html">ImpalaException</a> {</div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160; List&lt;Expr&gt; conjuncts =</div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160; analyzer.getUnassignedConjuncts(unionStmt.getTupleId().asList(), <span class="keyword">false</span>);</div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160; <span class="keywordflow">if</span> (!unionStmt.hasAnalyticExprs()) {</div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160; <span class="comment">// Turn unassigned predicates for unionStmt&#39;s tupleId_ into predicates for</span></div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160; <span class="comment">// the individual operands.</span></div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160; <span class="comment">// Do this prior to creating the operands&#39; plan trees so they get a chance to</span></div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160; <span class="comment">// pick up propagated predicates.</span></div>
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1UnionStmt_1_1UnionOperand.html">UnionOperand</a> op: unionStmt.getOperands()) {</div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160; List&lt;Expr&gt; opConjuncts =</div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160; Expr.substituteList(conjuncts, op.getSmap(), analyzer, <span class="keyword">false</span>);</div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160; op.getAnalyzer().registerConjuncts(opConjuncts);</div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160; <span class="comment">// Some of the opConjuncts have become constant and eval&#39;d to false, or an</span></div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160; <span class="comment">// ancestor block is already guaranteed to return empty results.</span></div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160; <span class="keywordflow">if</span> (op.getAnalyzer().hasEmptyResultSet()) op.drop();</div>
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160; }</div>
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160; analyzer.markConjunctsAssigned(conjuncts);</div>
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160; <span class="comment">// mark slots referenced by the yet-unassigned conjuncts</span></div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160; analyzer.materializeSlots(conjuncts);</div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160; }</div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160; <span class="comment">// mark slots after predicate propagation but prior to plan tree generation</span></div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160; unionStmt.materializeRequiredSlots(analyzer);</div>
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;</div>
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">PlanNode</a> result = null;</div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160; <span class="comment">// create DISTINCT tree</span></div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160; <span class="keywordflow">if</span> (unionStmt.hasDistinctOps()) {</div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160; result = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a9fa62dadaf353730ba9fa528f84abda2">createUnionPlan</a>(</div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160; analyzer, unionStmt, unionStmt.getDistinctOperands(), null);</div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160; result = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1AggregationNode.html">AggregationNode</a>(</div>
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160; <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">ctx_</a>.<a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#af60cf05e54d6c00065ff1036cdddd62b">getNextNodeId</a>(), result, unionStmt.getDistinctAggInfo());</div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160; result.init(analyzer);</div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160; }</div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160; <span class="comment">// create ALL tree</span></div>
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160; <span class="keywordflow">if</span> (unionStmt.hasAllOps()) {</div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160; result = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a9fa62dadaf353730ba9fa528f84abda2">createUnionPlan</a>(analyzer, unionStmt, unionStmt.getAllOperands(), result);</div>
<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160; }</div>
<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;</div>
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160; <span class="keywordflow">if</span> (unionStmt.hasAnalyticExprs()) {</div>
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160; result = <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#ac408e6059606469bb147e0823f87c50d">addUnassignedConjuncts</a>(</div>
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160; analyzer, unionStmt.getTupleId().asList(), result);</div>
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160; }</div>
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160; }</div>
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;}</div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SelectStmt_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SelectStmt.html">com.cloudera.impala.analysis.SelectStmt</a></div><div class="ttdef"><b>Definition:</b> <a href="SelectStmt_8java_source.html#l00045">SelectStmt.java:45</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BaseTableRef_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BaseTableRef.html">com.cloudera.impala.analysis.BaseTableRef</a></div><div class="ttdef"><b>Definition:</b> <a href="BaseTableRef_8java_source.html#l00025">BaseTableRef.java:25</a></div></div>
<div class="ttc" id="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator_html_ab27bc5bd92110c66199a089baaf52dd9"><div class="ttname"><a href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator.html#ab27bc5bd92110c66199a089baaf52dd9">com.cloudera.impala.analysis.JoinOperator.isNullAwareLeftAntiJoin</a></div><div class="ttdeci">boolean isNullAwareLeftAntiJoin()</div><div class="ttdef"><b>Definition:</b> <a href="JoinOperator_8java_source.html#l00085">JoinOperator.java:85</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1ScanNode_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1ScanNode.html">com.cloudera.impala.planner.ScanNode</a></div><div class="ttdef"><b>Definition:</b> <a href="ScanNode_8java_source.html#l00032">ScanNode.java:32</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a6fa853944317f1c9064f1bdf1859d3b7"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a6fa853944317f1c9064f1bdf1859d3b7">com.cloudera.impala.planner.SingleNodePlanner.createJoinPlan</a></div><div class="ttdeci">PlanNode createJoinPlan(Analyzer analyzer, TableRef leftmostRef, List&lt; Pair&lt; TableRef, PlanNode &gt;&gt; refPlans)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00311">SingleNodePlanner.java:311</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TupleDescriptor_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TupleDescriptor.html">com.cloudera.impala.analysis.TupleDescriptor</a></div><div class="ttdef"><b>Definition:</b> <a href="TupleDescriptor_8java_source.html#l00054">TupleDescriptor.java:54</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1QueryStmt_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1QueryStmt.html">com.cloudera.impala.analysis.QueryStmt</a></div><div class="ttdef"><b>Definition:</b> <a href="QueryStmt_8java_source.html#l00041">QueryStmt.java:41</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_aa100619f614504a3413e4b6d036a15c1"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#aa100619f614504a3413e4b6d036a15c1">com.cloudera.impala.planner.SingleNodePlanner.SingleNodePlanner</a></div><div class="ttdeci">SingleNodePlanner(PlannerContext ctx)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00076">SingleNodePlanner.java:76</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a034630dd5dc339232ed7da898b07b484"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a034630dd5dc339232ed7da898b07b484">com.cloudera.impala.planner.SingleNodePlanner.createUnionPlan</a></div><div class="ttdeci">PlanNode createUnionPlan(UnionStmt unionStmt, Analyzer analyzer)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l01141">SingleNodePlanner.java:1141</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SelectStmt_html_aad11980b9b5fb4d27733b97b82291fb7"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SelectStmt.html#aad11980b9b5fb4d27733b97b82291fb7">com.cloudera.impala.analysis.SelectStmt.getTableRefs</a></div><div class="ttdeci">List&lt; TableRef &gt; getTableRefs()</div><div class="ttdef"><b>Definition:</b> <a href="SelectStmt_8java_source.html#l00107">SelectStmt.java:107</a></div></div>
<div class="ttc" id="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator_html_aca01cfbe719b33f494d4dc4e6994d535"><div class="ttname"><a href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator.html#aca01cfbe719b33f494d4dc4e6994d535">com.cloudera.impala.analysis.JoinOperator.isOuterJoin</a></div><div class="ttdeci">boolean isOuterJoin()</div><div class="ttdef"><b>Definition:</b> <a href="JoinOperator_8java_source.html#l00056">JoinOperator.java:56</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1ExprId_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1ExprId.html">com.cloudera.impala.analysis.ExprId</a></div><div class="ttdef"><b>Definition:</b> <a href="ExprId_8java_source.html#l00020">ExprId.java:20</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1HashJoinNode_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1HashJoinNode.html">com.cloudera.impala.planner.HashJoinNode</a></div><div class="ttdef"><b>Definition:</b> <a href="HashJoinNode_8java_source.html#l00050">HashJoinNode.java:50</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html">com.cloudera.impala.analysis.BinaryPredicate</a></div><div class="ttdef"><b>Definition:</b> <a href="BinaryPredicate_8java_source.html#l00042">BinaryPredicate.java:42</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef_html_a23722bebd2a724caf714b3f967f55aa3"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html#a23722bebd2a724caf714b3f967f55aa3">com.cloudera.impala.analysis.TableRef.getJoinOp</a></div><div class="ttdeci">JoinOperator getJoinOp()</div><div class="ttdef"><b>Definition:</b> <a href="TableRef_8java_source.html#l00188">TableRef.java:188</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1CrossJoinNode_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1CrossJoinNode.html">com.cloudera.impala.planner.CrossJoinNode</a></div><div class="ttdef"><b>Definition:</b> <a href="CrossJoinNode_8java_source.html#l00032">CrossJoinNode.java:32</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1catalog_1_1Type_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1Type.html">com.cloudera.impala.catalog.Type</a></div><div class="ttdef"><b>Definition:</b> <a href="Type_8java_source.html#l00042">Type.java:42</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef_html_a436e1b236e0f03b40a5c2daf5da07cb8"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html#a436e1b236e0f03b40a5c2daf5da07cb8">com.cloudera.impala.analysis.TableRef.getUniqueAlias</a></div><div class="ttdeci">String getUniqueAlias()</div><div class="ttdef"><b>Definition:</b> <a href="TableRef_8java_source.html#l00212">TableRef.java:212</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1UnionStmt_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1UnionStmt.html">com.cloudera.impala.analysis.UnionStmt</a></div><div class="ttdef"><b>Definition:</b> <a href="UnionStmt_8java_source.html#l00037">UnionStmt.java:37</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_af23ff536f7622d5885788844555e074b"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#af23ff536f7622d5885788844555e074b">com.cloudera.impala.planner.SingleNodePlanner.createConstantSelectPlan</a></div><div class="ttdeci">PlanNode createConstantSelectPlan(SelectStmt selectStmt, Analyzer analyzer)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00592">SingleNodePlanner.java:592</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode_html_a8ce8aa221e9653a7651681aa479ddb14"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html#a8ce8aa221e9653a7651681aa479ddb14">com.cloudera.impala.planner.PlanNode.getCardinality</a></div><div class="ttdeci">long getCardinality()</div><div class="ttdef"><b>Definition:</b> <a href="PlanNode_8java_source.html#l00172">PlanNode.java:172</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1catalog_1_1DataSourceTable_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1DataSourceTable.html">com.cloudera.impala.catalog.DataSourceTable</a></div><div class="ttdef"><b>Definition:</b> <a href="DataSourceTable_8java_source.html#l00046">DataSourceTable.java:46</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1CollectionTableRef_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1CollectionTableRef.html">com.cloudera.impala.analysis.CollectionTableRef</a></div><div class="ttdef"><b>Definition:</b> <a href="CollectionTableRef_8java_source.html#l00024">CollectionTableRef.java:24</a></div></div>
<div class="ttc" id="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator_html_ae3f7eabc77a4c80e898040c1ed8b85e5"><div class="ttname"><a href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator.html#ae3f7eabc77a4c80e898040c1ed8b85e5">com.cloudera.impala.analysis.JoinOperator.isCrossJoin</a></div><div class="ttdeci">boolean isCrossJoin()</div><div class="ttdef"><b>Definition:</b> <a href="JoinOperator_8java_source.html#l00077">JoinOperator.java:77</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1UnionStmt_1_1UnionOperand_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1UnionStmt_1_1UnionOperand.html">com.cloudera.impala.analysis.UnionStmt.UnionOperand</a></div><div class="ttdef"><b>Definition:</b> <a href="UnionStmt_8java_source.html#l00050">UnionStmt.java:50</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1common_1_1NotImplementedException_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1common_1_1NotImplementedException.html">com.cloudera.impala.common.NotImplementedException</a></div><div class="ttdef"><b>Definition:</b> <a href="NotImplementedException_8java_source.html#l00021">NotImplementedException.java:21</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1catalog_1_1Type_html_a20128254897643f1f2a8bf575ffd8c41"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1Type.html#a20128254897643f1f2a8bf575ffd8c41">com.cloudera.impala.catalog.Type.STRING</a></div><div class="ttdeci">static final ScalarType STRING</div><div class="ttdef"><b>Definition:</b> <a href="Type_8java_source.html#l00053">Type.java:53</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SelectNode_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SelectNode.html">com.cloudera.impala.planner.SelectNode</a></div><div class="ttdef"><b>Definition:</b> <a href="SelectNode_8java_source.html#l00033">SelectNode.java:33</a></div></div>
<div class="ttc" id="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator_html_aa57923aef27d004862f2b3cb5e0cdd01"><div class="ttname"><a href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator.html#aa57923aef27d004862f2b3cb5e0cdd01">com.cloudera.impala.analysis.JoinOperator.INNER_JOIN</a></div><div class="ttdeci">INNER_JOIN</div><div class="ttdef"><b>Definition:</b> <a href="JoinOperator_8java_source.html#l00020">JoinOperator.java:20</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr_html_a06da750e05bfbaa64f54b056479f64a7"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr.html#a06da750e05bfbaa64f54b056479f64a7">com.cloudera.impala.analysis.Expr.isConstant</a></div><div class="ttdeci">boolean isConstant()</div><div class="ttdef"><b>Definition:</b> <a href="Expr_8java_source.html#l00917">Expr.java:917</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html">com.cloudera.impala.planner.PlanNode</a></div><div class="ttdef"><b>Definition:</b> <a href="PlanNode_8java_source.html#l00059">PlanNode.java:59</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1DataSourceScanNode_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1DataSourceScanNode.html">com.cloudera.impala.planner.DataSourceScanNode</a></div><div class="ttdef"><b>Definition:</b> <a href="DataSourceScanNode_8java_source.html#l00064">DataSourceScanNode.java:64</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer_html_a629d43ac7188a079d1eabd3fb768419e"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html#a629d43ac7188a079d1eabd3fb768419e">com.cloudera.impala.analysis.Analyzer.canEvalPredicate</a></div><div class="ttdeci">boolean canEvalPredicate(List&lt; TupleId &gt; tupleIds, Expr e)</div><div class="ttdef"><b>Definition:</b> <a href="Analyzer_8java_source.html#l01169">Analyzer.java:1169</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a2fb47326f28781e675e96cbb4b787afc"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a2fb47326f28781e675e96cbb4b787afc">com.cloudera.impala.planner.SingleNodePlanner.getHashLookupJoinConjuncts</a></div><div class="ttdeci">void getHashLookupJoinConjuncts(Analyzer analyzer, List&lt; TupleId &gt; planIds, TableRef joinedTblRef, List&lt; BinaryPredicate &gt; joinConjuncts, List&lt; Expr &gt; joinPredicates)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00912">SingleNodePlanner.java:912</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a629ee595712364e1afe54f23b676fb20"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a629ee595712364e1afe54f23b676fb20">com.cloudera.impala.planner.SingleNodePlanner.createScanNode</a></div><div class="ttdeci">PlanNode createScanNode(Analyzer analyzer, TableRef tblRef)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00848">SingleNodePlanner.java:848</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1EmptySetNode_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1EmptySetNode.html">com.cloudera.impala.planner.EmptySetNode</a></div><div class="ttdef"><b>Definition:</b> <a href="EmptySetNode_8java_source.html#l00030">EmptySetNode.java:30</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotDescriptor_html_aca35e58acdc44b0d898f67189ff76469"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotDescriptor.html#aca35e58acdc44b0d898f67189ff76469">com.cloudera.impala.analysis.SlotDescriptor.getType</a></div><div class="ttdeci">Type getType()</div><div class="ttdef"><b>Definition:</b> <a href="SlotDescriptor_8java_source.html#l00094">SlotDescriptor.java:94</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotRef_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotRef.html">com.cloudera.impala.analysis.SlotRef</a></div><div class="ttdef"><b>Definition:</b> <a href="SlotRef_8java_source.html#l00035">SlotRef.java:35</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a617178c5646f3f77f7d559c8f01018ba"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a617178c5646f3f77f7d559c8f01018ba">com.cloudera.impala.planner.SingleNodePlanner.createQueryPlan</a></div><div class="ttdeci">PlanNode createQueryPlan(QueryStmt stmt, Analyzer analyzer, boolean disableTopN)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00145">SingleNodePlanner.java:145</a></div></div>
<div class="ttc" id="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate_1_1Operator_html_ab63d78248ffdc1a68add620ae6a02da5"><div class="ttname"><a href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate_1_1Operator.html#ab63d78248ffdc1a68add620ae6a02da5">com.cloudera.impala.analysis.BinaryPredicate.Operator.Operator</a></div><div class="ttdeci">Operator(String description, String name, TComparisonOp thriftOp)</div><div class="ttdef"><b>Definition:</b> <a href="BinaryPredicate_8java_source.html#l00061">BinaryPredicate.java:61</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1AggregateInfo_html_a6bbbe454d78f9df442f29176b7817d23"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1AggregateInfo.html#a6bbbe454d78f9df442f29176b7817d23">com.cloudera.impala.analysis.AggregateInfo.isDistinctAgg</a></div><div class="ttdeci">boolean isDistinctAgg()</div><div class="ttdef"><b>Definition:</b> <a href="AggregateInfo_8java_source.html#l00231">AggregateInfo.java:231</a></div></div>
<div class="ttc" id="namespaceimpala_html_ae794620bedabff2a726194c228af75ce"><div class="ttname"><a href="namespaceimpala.html#ae794620bedabff2a726194c228af75ce">impala::TupleId</a></div><div class="ttdeci">int TupleId</div><div class="ttdef"><b>Definition:</b> <a href="global-types_8h_source.html#l00023">global-types.h:23</a></div></div>
<div class="ttc" id="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator_html"><div class="ttname"><a href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator.html">com.cloudera.impala.analysis.JoinOperator</a></div><div class="ttdef"><b>Definition:</b> <a href="JoinOperator_8java_source.html#l00019">JoinOperator.java:19</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1AnalyticInfo_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1AnalyticInfo.html">com.cloudera.impala.analysis.AnalyticInfo</a></div><div class="ttdef"><b>Definition:</b> <a href="AnalyticInfo_8java_source.html#l00032">AnalyticInfo.java:32</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a6b4c6cc1288dc908e3f53a149785e9ef"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a6b4c6cc1288dc908e3f53a149785e9ef">com.cloudera.impala.planner.SingleNodePlanner.LOG</a></div><div class="ttdeci">static final Logger LOG</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00072">SingleNodePlanner.java:72</a></div></div>
<div class="ttc" id="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator_html_aed20a5f291c6ea19e43d77a08328150d"><div class="ttname"><a href="enumcom_1_1cloudera_1_1impala_1_1analysis_1_1JoinOperator.html#aed20a5f291c6ea19e43d77a08328150d">com.cloudera.impala.analysis.JoinOperator.CROSS_JOIN</a></div><div class="ttdeci">CROSS_JOIN</div><div class="ttdef"><b>Definition:</b> <a href="JoinOperator_8java_source.html#l00028">JoinOperator.java:28</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Predicate_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Predicate.html">com.cloudera.impala.analysis.Predicate</a></div><div class="ttdef"><b>Definition:</b> <a href="Predicate_8java_source.html#l00029">Predicate.java:29</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a8dbf5c3ae2fd5655dfc1e61a63bf4ce3"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8dbf5c3ae2fd5655dfc1e61a63bf4ce3">com.cloudera.impala.planner.SingleNodePlanner.createEmptyNode</a></div><div class="ttdeci">PlanNode createEmptyNode(QueryStmt stmt, Analyzer analyzer)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00127">SingleNodePlanner.java:127</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a20fae76e565c9fe6e4bead3433560f60"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a20fae76e565c9fe6e4bead3433560f60">com.cloudera.impala.planner.SingleNodePlanner.canMigrateConjuncts</a></div><div class="ttdeci">boolean canMigrateConjuncts(InlineViewRef inlineViewRef)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00838">SingleNodePlanner.java:838</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef_html_a24a3ac3e0fea9784c98322b9c22c451f"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html#a24a3ac3e0fea9784c98322b9c22c451f">com.cloudera.impala.analysis.TableRef.getId</a></div><div class="ttdeci">TupleId getId()</div><div class="ttdef"><b>Definition:</b> <a href="TableRef_8java_source.html#l00260">TableRef.java:260</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html">com.cloudera.impala.analysis.TableRef</a></div><div class="ttdef"><b>Definition:</b> <a href="TableRef_8java_source.html#l00045">TableRef.java:45</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode_html_ac7d0db4439c91a8935884d153887b088"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html#ac7d0db4439c91a8935884d153887b088">com.cloudera.impala.planner.PlanNode.getTupleIds</a></div><div class="ttdeci">ArrayList&lt; TupleId &gt; getTupleIds()</div><div class="ttdef"><b>Definition:</b> <a href="PlanNode_8java_source.html#l00196">PlanNode.java:196</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1ValueRange_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1ValueRange.html">com.cloudera.impala.planner.ValueRange</a></div><div class="ttdef"><b>Definition:</b> <a href="ValueRange_8java_source.html#l00035">ValueRange.java:35</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_aecaee173fbdf28d95320d2770237862f"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#aecaee173fbdf28d95320d2770237862f">com.cloudera.impala.planner.SingleNodePlanner.createHBaseValueRange</a></div><div class="ttdeci">ValueRange createHBaseValueRange(SlotDescriptor d, List&lt; Expr &gt; conjuncts)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00632">SingleNodePlanner.java:632</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr.html">com.cloudera.impala.analysis.Expr</a></div><div class="ttdef"><b>Definition:</b> <a href="Expr_8java_source.html#l00048">Expr.java:48</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1UnionNode_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1UnionNode.html">com.cloudera.impala.planner.UnionNode</a></div><div class="ttdef"><b>Definition:</b> <a href="UnionNode_8java_source.html#l00043">UnionNode.java:43</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext_html_acd1181b50a5664a771b10f81be9fe865"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#acd1181b50a5664a771b10f81be9fe865">com.cloudera.impala.planner.PlannerContext.getQueryOptions</a></div><div class="ttdeci">TQueryOptions getQueryOptions()</div><div class="ttdef"><b>Definition:</b> <a href="PlannerContext_8java_source.html#l00057">PlannerContext.java:57</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a05572e608b36bc61d82b5f5f57476882"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a05572e608b36bc61d82b5f5f57476882">com.cloudera.impala.planner.SingleNodePlanner.createAggregationPlan</a></div><div class="ttdeci">PlanNode createAggregationPlan(SelectStmt selectStmt, Analyzer analyzer, PlanNode root)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00564">SingleNodePlanner.java:564</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotDescriptor_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1SlotDescriptor.html">com.cloudera.impala.analysis.SlotDescriptor</a></div><div class="ttdef"><b>Definition:</b> <a href="SlotDescriptor_8java_source.html#l00029">SlotDescriptor.java:29</a></div></div>
<div class="ttc" id="namespaceimpala_html_a4e802b9fa9086eb686d8688df634a2b2"><div class="ttname"><a href="namespaceimpala.html#a4e802b9fa9086eb686d8688df634a2b2">impala::SlotId</a></div><div class="ttdeci">int SlotId</div><div class="ttdef"><b>Definition:</b> <a href="global-types_8h_source.html#l00024">global-types.h:24</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_ac79d4bce3405c53140a7bce76e71508a"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#ac79d4bce3405c53140a7bce76e71508a">com.cloudera.impala.planner.SingleNodePlanner.createSelectPlan</a></div><div class="ttdeci">PlanNode createSelectPlan(SelectStmt selectStmt, Analyzer analyzer)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00484">SingleNodePlanner.java:484</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1AggregateInfo_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1AggregateInfo.html">com.cloudera.impala.analysis.AggregateInfo</a></div><div class="ttdef"><b>Definition:</b> <a href="AggregateInfo_8java_source.html#l00066">AggregateInfo.java:66</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_abaa4ecccd3ca73c2923eaf27c77c620b"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#abaa4ecccd3ca73c2923eaf27c77c620b">com.cloudera.impala.planner.SingleNodePlanner.createFromClauseJoinPlan</a></div><div class="ttdeci">PlanNode createFromClauseJoinPlan(Analyzer analyzer, List&lt; Pair&lt; TableRef, PlanNode &gt;&gt; refPlans)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00465">SingleNodePlanner.java:465</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a9fa62dadaf353730ba9fa528f84abda2"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a9fa62dadaf353730ba9fa528f84abda2">com.cloudera.impala.planner.SingleNodePlanner.createUnionPlan</a></div><div class="ttdeci">UnionNode createUnionPlan(Analyzer analyzer, UnionStmt unionStmt, List&lt; UnionOperand &gt; unionOperands, PlanNode unionDistinctPlan)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l01098">SingleNodePlanner.java:1098</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1HdfsScanNode_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1HdfsScanNode.html">com.cloudera.impala.planner.HdfsScanNode</a></div><div class="ttdef"><b>Definition:</b> <a href="HdfsScanNode_8java_source.html#l00072">HdfsScanNode.java:72</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1common_1_1InternalException_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1common_1_1InternalException.html">com.cloudera.impala.common.InternalException</a></div><div class="ttdef"><b>Definition:</b> <a href="InternalException_8java_source.html#l00021">InternalException.java:21</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a6fee878dab41ba13ed022e82ac8b7a0b"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a6fee878dab41ba13ed022e82ac8b7a0b">com.cloudera.impala.planner.SingleNodePlanner.createSingleNodePlan</a></div><div class="ttdeci">PlanNode createSingleNodePlan()</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00096">SingleNodePlanner.java:96</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1HBaseScanNode_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1HBaseScanNode.html">com.cloudera.impala.planner.HBaseScanNode</a></div><div class="ttdef"><b>Definition:</b> <a href="HBaseScanNode_8java_source.html#l00068">HBaseScanNode.java:68</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1catalog_1_1HdfsTable_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1HdfsTable.html">com.cloudera.impala.catalog.HdfsTable</a></div><div class="ttdef"><b>Definition:</b> <a href="HdfsTable_8java_source.html#l00104">HdfsTable.java:104</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1QueryStmt_html_a7c908f1af1138273315d67a13bfaaf4e"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1QueryStmt.html#a7c908f1af1138273315d67a13bfaaf4e">com.cloudera.impala.analysis.QueryStmt.getBaseTblResultExprs</a></div><div class="ttdeci">ArrayList&lt; Expr &gt; getBaseTblResultExprs()</div><div class="ttdef"><b>Definition:</b> <a href="QueryStmt_8java_source.html#l00280">QueryStmt.java:280</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1QueryStmt_html_a50326a4d89333ffebe34b7f11181a67a"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1QueryStmt.html#a50326a4d89333ffebe34b7f11181a67a">com.cloudera.impala.analysis.QueryStmt.getAnalyzer</a></div><div class="ttdeci">Analyzer getAnalyzer()</div><div class="ttdef"><b>Definition:</b> <a href="QueryStmt_8java_source.html#l00083">QueryStmt.java:83</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a8b6e48363db1fc3145fab2b33d71fd21"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b6e48363db1fc3145fab2b33d71fd21">com.cloudera.impala.planner.SingleNodePlanner.createInlineViewPlan</a></div><div class="ttdeci">PlanNode createInlineViewPlan(Analyzer analyzer, InlineViewRef inlineViewRef)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00684">SingleNodePlanner.java:684</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">com.cloudera.impala.analysis.Analyzer</a></div><div class="ttdef"><b>Definition:</b> <a href="Analyzer_8java_source.html#l00105">Analyzer.java:105</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html">com.cloudera.impala.planner.SingleNodePlanner</a></div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00071">SingleNodePlanner.java:71</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef_html_adb7fea99804944555a4904d14b5a8c01"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html#adb7fea99804944555a4904d14b5a8c01">com.cloudera.impala.analysis.TableRef.getDesc</a></div><div class="ttdeci">TupleDescriptor getDesc()</div><div class="ttdef"><b>Definition:</b> <a href="TableRef_8java_source.html#l00250">TableRef.java:250</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_afc674d235914984520d56b24163e6b69"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#afc674d235914984520d56b24163e6b69">com.cloudera.impala.planner.SingleNodePlanner.createTableRefNode</a></div><div class="ttdeci">PlanNode createTableRefNode(Analyzer analyzer, TableRef tblRef)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l01080">SingleNodePlanner.java:1080</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode_html_ad7b43aa5e8503f843359720f674dab3e"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlanNode.html#ad7b43aa5e8503f843359720f674dab3e">com.cloudera.impala.planner.PlanNode.getAvgRowSize</a></div><div class="ttdeci">float getAvgRowSize()</div><div class="ttdef"><b>Definition:</b> <a href="PlanNode_8java_source.html#l00174">PlanNode.java:174</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_ac408e6059606469bb147e0823f87c50d"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#ac408e6059606469bb147e0823f87c50d">com.cloudera.impala.planner.SingleNodePlanner.addUnassignedConjuncts</a></div><div class="ttdeci">PlanNode addUnassignedConjuncts(Analyzer analyzer, List&lt; TupleId &gt; tupleIds, PlanNode root)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00212">SingleNodePlanner.java:212</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr_html_a41866855badf86dc04eaf584860ea244"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Expr.html#a41866855badf86dc04eaf584860ea244">com.cloudera.impala.analysis.Expr.isRegisteredPredicate</a></div><div class="ttdeci">boolean isRegisteredPredicate()</div><div class="ttdef"><b>Definition:</b> <a href="Expr_8java_source.html#l00195">Expr.java:195</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1InlineViewRef_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1InlineViewRef.html">com.cloudera.impala.analysis.InlineViewRef</a></div><div class="ttdef"><b>Definition:</b> <a href="InlineViewRef_8java_source.html#l00037">InlineViewRef.java:37</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html">com.cloudera.impala.planner.PlannerContext</a></div><div class="ttdef"><b>Definition:</b> <a href="PlannerContext_8java_source.html#l00028">PlannerContext.java:28</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate_html_aa6636fb87ccee8501f4749d357027847"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html#aa6636fb87ccee8501f4749d357027847">com.cloudera.impala.analysis.BinaryPredicate.isNullMatchingEq</a></div><div class="ttdeci">boolean isNullMatchingEq()</div><div class="ttdef"><b>Definition:</b> <a href="BinaryPredicate_8java_source.html#l00124">BinaryPredicate.java:124</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TupleId_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TupleId.html">com.cloudera.impala.analysis.TupleId</a></div><div class="ttdef"><b>Definition:</b> <a href="TupleId_8java_source.html#l00023">TupleId.java:23</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1ExprSubstitutionMap_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1ExprSubstitutionMap.html">com.cloudera.impala.analysis.ExprSubstitutionMap</a></div><div class="ttdef"><b>Definition:</b> <a href="ExprSubstitutionMap_8java_source.html#l00020">ExprSubstitutionMap.java:20</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext_html_af60cf05e54d6c00065ff1036cdddd62b"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1PlannerContext.html#af60cf05e54d6c00065ff1036cdddd62b">com.cloudera.impala.planner.PlannerContext.getNextNodeId</a></div><div class="ttdeci">PlanNodeId getNextNodeId()</div><div class="ttdef"><b>Definition:</b> <a href="PlannerContext_8java_source.html#l00063">PlannerContext.java:63</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1AggregationNode_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1AggregationNode.html">com.cloudera.impala.planner.AggregationNode</a></div><div class="ttdef"><b>Definition:</b> <a href="AggregationNode_8java_source.html#l00045">AggregationNode.java:45</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1AnalyticPlanner_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1AnalyticPlanner.html">com.cloudera.impala.planner.AnalyticPlanner</a></div><div class="ttdef"><b>Definition:</b> <a href="AnalyticPlanner_8java_source.html#l00068">AnalyticPlanner.java:68</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1catalog_1_1HBaseTable_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1HBaseTable.html">com.cloudera.impala.catalog.HBaseTable</a></div><div class="ttdef"><b>Definition:</b> <a href="HBaseTable_8java_source.html#l00076">HBaseTable.java:76</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a4d03d4b05a3fad0be154a7b610466217"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a4d03d4b05a3fad0be154a7b610466217">com.cloudera.impala.planner.SingleNodePlanner.createJoinNode</a></div><div class="ttdeci">PlanNode createJoinNode(Analyzer analyzer, PlanNode outer, PlanNode inner, TableRef outerRef, TableRef innerRef)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00977">SingleNodePlanner.java:977</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1InlineViewRef_html_a08184b94fb53e004b591ff55aa4383af"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1InlineViewRef.html#a08184b94fb53e004b591ff55aa4383af">com.cloudera.impala.analysis.InlineViewRef.getViewStmt</a></div><div class="ttdeci">QueryStmt getViewStmt()</div><div class="ttdef"><b>Definition:</b> <a href="InlineViewRef_8java_source.html#l00259">InlineViewRef.java:259</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TupleIsNullPredicate_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TupleIsNullPredicate.html">com.cloudera.impala.analysis.TupleIsNullPredicate</a></div><div class="ttdef"><b>Definition:</b> <a href="TupleIsNullPredicate_8java_source.html#l00039">TupleIsNullPredicate.java:39</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SortNode_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SortNode.html">com.cloudera.impala.planner.SortNode</a></div><div class="ttdef"><b>Definition:</b> <a href="SortNode_8java_source.html#l00047">SortNode.java:47</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a0a5153cf7d9be339358005c248c3cc56"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a0a5153cf7d9be339358005c248c3cc56">com.cloudera.impala.planner.SingleNodePlanner.migrateConjunctsToInlineView</a></div><div class="ttdeci">void migrateConjunctsToInlineView(Analyzer analyzer, InlineViewRef inlineViewRef)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00769">SingleNodePlanner.java:769</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate_html_a773c89d3973d81bf8102162f06e08dc6"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1BinaryPredicate.html#a773c89d3973d81bf8102162f06e08dc6">com.cloudera.impala.analysis.BinaryPredicate.getOp</a></div><div class="ttdeci">Operator getOp()</div><div class="ttdef"><b>Definition:</b> <a href="BinaryPredicate_8java_source.html#l00107">BinaryPredicate.java:107</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a36a0e82b73a0fb2bd7084906f7fd5bd8"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a36a0e82b73a0fb2bd7084906f7fd5bd8">com.cloudera.impala.planner.SingleNodePlanner.createCheapestJoinPlan</a></div><div class="ttdeci">PlanNode createCheapestJoinPlan(Analyzer analyzer, List&lt; Pair&lt; TableRef, PlanNode &gt;&gt; refPlans)</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00246">SingleNodePlanner.java:246</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef_html_aee1caa4453247d7983760079b7f55c9e"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TableRef.html#aee1caa4453247d7983760079b7f55c9e">com.cloudera.impala.analysis.TableRef.getLeftTblRef</a></div><div class="ttdeci">TableRef getLeftTblRef()</div><div class="ttdef"><b>Definition:</b> <a href="TableRef_8java_source.html#l00239">TableRef.java:239</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1common_1_1ImpalaException_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1common_1_1ImpalaException.html">com.cloudera.impala.common.ImpalaException</a></div><div class="ttdef"><b>Definition:</b> <a href="ImpalaException_8java_source.html#l00022">ImpalaException.java:22</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1catalog_1_1ColumnStats_html"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1catalog_1_1ColumnStats.html">com.cloudera.impala.catalog.ColumnStats</a></div><div class="ttdef"><b>Definition:</b> <a href="ColumnStats_8java_source.html#l00039">ColumnStats.java:39</a></div></div>
<div class="ttc" id="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner_html_a8b2fbdf58ce27d34c32ea35d92d501cd"><div class="ttname"><a href="classcom_1_1cloudera_1_1impala_1_1planner_1_1SingleNodePlanner.html#a8b2fbdf58ce27d34c32ea35d92d501cd">com.cloudera.impala.planner.SingleNodePlanner.ctx_</a></div><div class="ttdeci">final PlannerContext ctx_</div><div class="ttdef"><b>Definition:</b> <a href="SingleNodePlanner_8java_source.html#l00074">SingleNodePlanner.java:74</a></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_ca2797c59c2e868cd2eca72571423f6a.html">fe</a></li><li class="navelem"><a class="el" href="dir_9456c03c9c6e5a96e843b28fc5c6395b.html">src</a></li><li class="navelem"><a class="el" href="dir_31c8d7a6e8855be2d8d6fa4227c487c3.html">main</a></li><li class="navelem"><a class="el" href="dir_d2615d3423c50009d0fa2801d3e0150c.html">java</a></li><li class="navelem"><a class="el" href="dir_df2af9fb37a2f3aedd0dd3e7b116eedc.html">com</a></li><li class="navelem"><a class="el" href="dir_48ee7e70be44cce637301d7ac948c4e1.html">cloudera</a></li><li class="navelem"><a class="el" href="dir_c062777d65f1b5dc463ca31df638b83a.html">impala</a></li><li class="navelem"><a class="el" href="dir_a3fab68f30a0ffb6d333069c8ce7d28d.html">planner</a></li><li class="navelem"><a class="el" href="SingleNodePlanner_8java.html">SingleNodePlanner.java</a></li>
<li class="footer">Generated on Thu May 7 2015 16:10:39 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>