| <!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 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 List</span></a></li> |
| <li><a href="globals.html"><span>File 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"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark"> </span>Friends</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark"> </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> <span class="comment">// Copyright 2012 Cloudera Inc.</span></div> |
| <div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">//</span></div> |
| <div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">// Licensed under the Apache License, Version 2.0 (the "License");</span></div> |
| <div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <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> <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> <span class="comment">//</span></div> |
| <div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <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> <span class="comment">//</span></div> |
| <div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <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> <span class="comment">// distributed under the License is distributed on an "AS IS" BASIS,</span></div> |
| <div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <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> <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> <span class="comment">// limitations under the License.</span></div> |
| <div class="line"><a name="l00014"></a><span class="lineno"> 14</span> </div> |
| <div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="keyword">package </span>com.cloudera.impala.planner;</div> |
| <div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div> |
| <div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="keyword">import</span> java.util.ArrayList;</div> |
| <div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="keyword">import</span> java.util.Collections;</div> |
| <div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="keyword">import</span> java.util.Comparator;</div> |
| <div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="keyword">import</span> java.util.Iterator;</div> |
| <div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="keyword">import</span> java.util.List;</div> |
| <div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="keyword">import</span> java.util.ListIterator;</div> |
| <div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="keyword">import</span> java.util.Set;</div> |
| <div class="line"><a name="l00024"></a><span class="lineno"> 24</span> </div> |
| <div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="keyword">import</span> org.slf4j.Logger;</div> |
| <div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="keyword">import</span> org.slf4j.LoggerFactory;</div> |
| <div class="line"><a name="l00027"></a><span class="lineno"> 27</span> </div> |
| <div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <span class="keyword">import</span> com.cloudera.impala.common.Pair;</div> |
| <div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <span class="keyword">import</span> com.google.common.base.Preconditions;</div> |
| <div class="line"><a name="l00060"></a><span class="lineno"> 60</span> <span class="keyword">import</span> com.google.common.base.Predicate;</div> |
| <div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <span class="keyword">import</span> com.google.common.collect.Iterables;</div> |
| <div class="line"><a name="l00062"></a><span class="lineno"> 62</span> <span class="keyword">import</span> com.google.common.collect.Lists;</div> |
| <div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="keyword">import</span> com.google.common.collect.Sets;</div> |
| <div class="line"><a name="l00064"></a><span class="lineno"> 64</span> </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> <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>  <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> </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>  <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> </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>  <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>  <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>  }</div> |
| <div class="line"><a name="l00079"></a><span class="lineno"> 79</span> </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>  <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>  <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>  <span class="comment">// Use the stmt's analyzer which is not necessarily the root analyzer</span></div> |
| <div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="comment">// to detect empty result sets.</span></div> |
| <div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <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>  analyzer.computeEquivClasses();</div> |
| <div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  analyzer.getTimeline().markEvent(<span class="stringliteral">"Equivalence classes computed"</span>);</div> |
| <div class="line"><a name="l00103"></a><span class="lineno"> 103</span> </div> |
| <div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <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>  <span class="comment">// plan tree.</span></div> |
| <div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <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>  <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>  <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>  <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>  <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>  <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>  <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>  <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>  analyzer.materializeSlots(queryStmt.getBaseTblResultExprs());</div> |
| <div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  }</div> |
| <div class="line"><a name="l00116"></a><span class="lineno"> 116</span> </div> |
| <div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  LOG.trace(<span class="stringliteral">"desctbl: "</span> + analyzer.getDescTbl().debugString());</div> |
| <div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <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>  <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>  Preconditions.checkNotNull(singleNodePlan);</div> |
| <div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordflow">return</span> singleNodePlan;</div> |
| <div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  }</div> |
| <div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </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>  <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>  <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>  ArrayList<TupleId> tupleIds = Lists.newArrayList();</div> |
| <div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  stmt.getMaterializedTupleIds(tupleIds);</div> |
| <div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <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>  node.init(analyzer);</div> |
| <div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <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>  <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>  <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>  node.setOutputSmap(((SelectStmt) stmt).getBaseTblSmap());</div> |
| <div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  }</div> |
| <div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="keywordflow">return</span> node;</div> |
| <div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  }</div> |
| <div class="line"><a name="l00140"></a><span class="lineno"> 140</span> </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>  <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>  <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>  <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> </div> |
| <div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <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>  <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>  SelectStmt selectStmt = (SelectStmt) stmt;</div> |
| <div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  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> </div> |
| <div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  <span class="comment">// insert possible AnalyticEvalNode before SortNode</span></div> |
| <div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <span class="keywordflow">if</span> (((SelectStmt) stmt).getAnalyticInfo() != null) {</div> |
| <div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <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>  ArrayList<TupleId> stmtTupleIds = Lists.newArrayList();</div> |
| <div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  stmt.getMaterializedTupleIds(stmtTupleIds);</div> |
| <div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <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>  <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>  List<Expr> inputPartitionExprs = Lists.newArrayList();</div> |
| <div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <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>  root = analyticPlanner.createSingleNodePlan(root,</div> |
| <div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  aggInfo != null ? aggInfo.getGroupingExprs() : null, inputPartitionExprs);</div> |
| <div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <span class="keywordflow">if</span> (aggInfo != null && !inputPartitionExprs.isEmpty()) {</div> |
| <div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  <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>  aggInfo.setPartitionExprs(inputPartitionExprs);</div> |
| <div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  }</div> |
| <div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  }</div> |
| <div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  } <span class="keywordflow">else</span> {</div> |
| <div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  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>  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>  }</div> |
| <div class="line"><a name="l00174"></a><span class="lineno"> 174</span> </div> |
| <div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <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>  <span class="keywordtype">boolean</span> sortHasMaterializedSlots = <span class="keyword">false</span>;</div> |
| <div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="keywordflow">if</span> (stmt.evaluateOrderBy()) {</div> |
| <div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <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>  stmt.getSortInfo().getSortTupleDescriptor().getSlots()) {</div> |
| <div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <span class="keywordflow">if</span> (sortSlotDesc.isMaterialized()) {</div> |
| <div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  sortHasMaterializedSlots = <span class="keyword">true</span>;</div> |
| <div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <span class="keywordflow">break</span>;</div> |
| <div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  }</div> |
| <div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  }</div> |
| <div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  }</div> |
| <div class="line"><a name="l00186"></a><span class="lineno"> 186</span> </div> |
| <div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordflow">if</span> (stmt.evaluateOrderBy() && sortHasMaterializedSlots) {</div> |
| <div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  <span class="keywordtype">long</span> limit = stmt.getLimit();</div> |
| <div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <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>  <span class="comment">// not just unlimited order-by</span></div> |
| <div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="keywordtype">boolean</span> useTopN = stmt.hasLimit() && !disableTopN;</div> |
| <div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  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>  useTopN, stmt.getOffset());</div> |
| <div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  Preconditions.checkState(root.hasValidStats());</div> |
| <div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  root.setLimit(limit);</div> |
| <div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  root.init(analyzer);</div> |
| <div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  } <span class="keywordflow">else</span> {</div> |
| <div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  root.setLimit(stmt.getLimit());</div> |
| <div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  root.computeStats(analyzer);</div> |
| <div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  }</div> |
| <div class="line"><a name="l00201"></a><span class="lineno"> 201</span> </div> |
| <div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  <span class="keywordflow">return</span> root;</div> |
| <div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  }</div> |
| <div class="line"><a name="l00204"></a><span class="lineno"> 204</span> </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>  <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>  <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer, List<TupleId> 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>  <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>  <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>  <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>  Preconditions.checkNotNull(root);</div> |
| <div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <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>  <span class="comment">// slot equivalences for each tuple id.</span></div> |
| <div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  List<Expr> conjuncts = analyzer.getUnassignedConjuncts(root);</div> |
| <div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <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>  analyzer.createEquivConjuncts(tid, conjuncts);</div> |
| <div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  }</div> |
| <div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <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>  <span class="comment">// evaluate conjuncts in SelectNode</span></div> |
| <div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <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>  <span class="comment">// init() marks conjuncts as assigned</span></div> |
| <div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  selectNode.init(analyzer);</div> |
| <div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  Preconditions.checkState(selectNode.hasValidStats());</div> |
| <div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="keywordflow">return</span> selectNode;</div> |
| <div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  }</div> |
| <div class="line"><a name="l00232"></a><span class="lineno"> 232</span> </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>  <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>  <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer, List<Pair<TableRef, PlanNode>> refPlans)</div> |
| <div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  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>  LOG.trace(<span class="stringliteral">"createCheapestJoinPlan"</span>);</div> |
| <div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <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> </div> |
| <div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <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>  <span class="comment">// (plan, materialized size)</span></div> |
| <div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  ArrayList<Pair<TableRef, Long>> candidates = Lists.newArrayList();</div> |
| <div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  <span class="keywordflow">for</span> (Pair<TableRef, PlanNode> entry: refPlans) {</div> |
| <div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <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>  <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> </div> |
| <div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <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>  <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>  <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>  <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>  <span class="comment">// left anti-join operator is never considered for inversion because we can't</span></div> |
| <div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <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>  <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>  <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>  <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>()) &&</div> |
| <div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  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>  <span class="comment">// ref cannot appear as the leftmost input</span></div> |
| <div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="keywordflow">continue</span>;</div> |
| <div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  }</div> |
| <div class="line"><a name="l00272"></a><span class="lineno"> 272</span> </div> |
| <div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <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>  <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>  <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>  <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>  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>  LOG.trace(<span class="stringliteral">"candidate "</span> + ref.getUniqueAlias() + <span class="stringliteral">": 0"</span>);</div> |
| <div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <span class="keywordflow">continue</span>;</div> |
| <div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  }</div> |
| <div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  Preconditions.checkNotNull(ref.getDesc());</div> |
| <div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="keywordtype">long</span> materializedSize =</div> |
| <div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  (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>  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>  LOG.trace(<span class="stringliteral">"candidate "</span> + ref.getUniqueAlias() + <span class="stringliteral">": "</span> + Long.toString(materializedSize));</div> |
| <div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  }</div> |
| <div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <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> </div> |
| <div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <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>  <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>  Collections.sort(candidates,</div> |
| <div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="keyword">new</span> Comparator<Pair<TableRef, Long>>() {</div> |
| <div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <span class="keyword">public</span> <span class="keywordtype">int</span> compare(Pair<TableRef, Long> a, Pair<TableRef, Long> b) {</div> |
| <div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="keywordtype">long</span> diff = b.second - a.second;</div> |
| <div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <span class="keywordflow">return</span> (diff < 0 ? -1 : (diff > 0 ? 1 : 0));</div> |
| <div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  }</div> |
| <div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  });</div> |
| <div class="line"><a name="l00298"></a><span class="lineno"> 298</span> </div> |
| <div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keywordflow">for</span> (Pair<TableRef, Long> candidate: candidates) {</div> |
| <div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <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>  <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>  }</div> |
| <div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keywordflow">return</span> null;</div> |
| <div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  }</div> |
| <div class="line"><a name="l00305"></a><span class="lineno"> 305</span> </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>  <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>  <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<Pair<TableRef, PlanNode>> refPlans)</div> |
| <div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  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> </div> |
| <div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  LOG.trace(<span class="stringliteral">"createJoinPlan: "</span> + leftmostRef.getUniqueAlias());</div> |
| <div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <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>  List<Pair<TableRef, PlanNode>> remainingRefs = Lists.newArrayList();</div> |
| <div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <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>  <span class="keywordflow">for</span> (Pair<TableRef, PlanNode> entry: refPlans) {</div> |
| <div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <span class="keywordflow">if</span> (entry.first == leftmostRef) {</div> |
| <div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  root = entry.second;</div> |
| <div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  } <span class="keywordflow">else</span> {</div> |
| <div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  remainingRefs.add(entry);</div> |
| <div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  }</div> |
| <div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  }</div> |
| <div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  Preconditions.checkNotNull(root);</div> |
| <div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <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>  <span class="comment">// are the set of all table refs.</span></div> |
| <div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  Set<TableRef> joinedRefs = Sets.newHashSet();</div> |
| <div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  joinedRefs.add(leftmostRef);</div> |
| <div class="line"><a name="l00331"></a><span class="lineno"> 331</span> </div> |
| <div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <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>  <span class="keywordtype">boolean</span> planHasInvertedJoin = <span class="keyword">false</span>;</div> |
| <div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <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>  || 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>  || 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>  <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>  <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>  <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>  <span class="comment">// not change.</span></div> |
| <div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  leftmostRef.invertJoin(refPlans, analyzer);</div> |
| <div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  planHasInvertedJoin = <span class="keyword">true</span>;</div> |
| <div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  }</div> |
| <div class="line"><a name="l00344"></a><span class="lineno"> 344</span> </div> |
| <div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  <span class="keywordtype">long</span> numOps = 0;</div> |
| <div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <span class="keywordtype">int</span> i = 0;</div> |
| <div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordflow">while</span> (!remainingRefs.isEmpty()) {</div> |
| <div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  <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>  <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>  <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>  Pair<TableRef, PlanNode> minEntry = null;</div> |
| <div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  <span class="keywordflow">for</span> (Pair<TableRef, PlanNode> entry: remainingRefs) {</div> |
| <div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <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>  LOG.trace(Integer.toString(i) + <span class="stringliteral">" considering ref "</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> </div> |
| <div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <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>  <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>  <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>  <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>  <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>  <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>  <span class="comment">// appeared in the query.</span></div> |
| <div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <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>  <span class="keywordflow">if</span> (joinOp.isOuterJoin() || joinOp.isSemiJoin()) {</div> |
| <div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  List<TupleId> currentTids = Lists.newArrayList(root.getTblRefIds());</div> |
| <div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  currentTids.add(ref.getId());</div> |
| <div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <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>  <span class="comment">// the join resulting from 'ref' must become the new root if the current</span></div> |
| <div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <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>  <span class="comment">// appearing to the left of 'ref' in the original query.</span></div> |
| <div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  List<TupleId> tableRefTupleIds = ref.getAllTupleIds();</div> |
| <div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  <span class="keywordflow">if</span> (!currentTids.containsAll(tableRefTupleIds) ||</div> |
| <div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  !tableRefTupleIds.containsAll(currentTids)) {</div> |
| <div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <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>  <span class="comment">// of tables across outer/semi/anti joins.</span></div> |
| <div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <span class="keywordflow">break</span>;</div> |
| <div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  }</div> |
| <div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  } <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>  <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>  }</div> |
| <div class="line"><a name="l00381"></a><span class="lineno"> 381</span> </div> |
| <div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  <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>  analyzer.setAssignedConjuncts(root.getAssignedConjuncts());</div> |
| <div class="line"><a name="l00384"></a><span class="lineno"> 384</span> </div> |
| <div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="keywordtype">boolean</span> invertJoin = <span class="keyword">false</span>;</div> |
| <div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="keywordflow">if</span> (joinOp.isOuterJoin() || joinOp.isSemiJoin() || joinOp.isCrossJoin()) {</div> |
| <div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <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>  <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>  <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>  <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>  <span class="comment">// because we can't execute the null-aware right anti-join efficiently.</span></div> |
| <div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <span class="keywordtype">long</span> lhsCard = root.getCardinality();</div> |
| <div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keywordtype">long</span> rhsCard = rhsPlan.getCardinality();</div> |
| <div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="keywordflow">if</span> (lhsCard != -1 && rhsCard != -1 &&</div> |
| <div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  lhsCard * root.getAvgRowSize() < rhsCard * rhsPlan.getAvgRowSize() &&</div> |
| <div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  !joinOp.isNullAwareLeftAntiJoin()) {</div> |
| <div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  invertJoin = <span class="keyword">true</span>;</div> |
| <div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  }</div> |
| <div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  }</div> |
| <div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <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>  <span class="keywordflow">if</span> (invertJoin) {</div> |
| <div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  ref.setJoinOp(ref.getJoinOp().invert());</div> |
| <div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  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>  planHasInvertedJoin = <span class="keyword">true</span>;</div> |
| <div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  } <span class="keywordflow">else</span> {</div> |
| <div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  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>  }</div> |
| <div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <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>  LOG.trace(<span class="stringliteral">"cardinality="</span> + Long.toString(candidate.getCardinality()));</div> |
| <div class="line"><a name="l00410"></a><span class="lineno"> 410</span> </div> |
| <div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <span class="comment">// Use 'candidate' as the new root; don't consider any other table refs at this</span></div> |
| <div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <span class="comment">// position in the plan.</span></div> |
| <div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <span class="keywordflow">if</span> (joinOp.isOuterJoin() || joinOp.isSemiJoin()) {</div> |
| <div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  newRoot = candidate;</div> |
| <div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  minEntry = entry;</div> |
| <div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  <span class="keywordflow">break</span>;</div> |
| <div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  }</div> |
| <div class="line"><a name="l00418"></a><span class="lineno"> 418</span> </div> |
| <div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <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>  <span class="keywordflow">if</span> (newRoot == null</div> |
| <div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  || (candidate.getClass().equals(newRoot.getClass())</div> |
| <div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  && candidate.getCardinality() < 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>  || (candidate instanceof <a class="code" href="classcom_1_1cloudera_1_1impala_1_1planner_1_1HashJoinNode.html">HashJoinNode</a> && 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>  newRoot = candidate;</div> |
| <div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  minEntry = entry;</div> |
| <div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  }</div> |
| <div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  }</div> |
| <div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <span class="keywordflow">if</span> (newRoot == null) {</div> |
| <div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <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>  <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>  <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>  <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>  <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>  <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>  <span class="comment">// explore more leftmost table refs.</span></div> |
| <div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  Preconditions.checkState(!planHasInvertedJoin);</div> |
| <div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  <span class="keywordflow">return</span> null;</div> |
| <div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  }</div> |
| <div class="line"><a name="l00439"></a><span class="lineno"> 439</span> </div> |
| <div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  <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>  <span class="comment">// every lhs row</span></div> |
| <div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="keywordtype">long</span> lhsCardinality = root.getCardinality();</div> |
| <div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="keywordtype">long</span> rhsCardinality = minEntry.second.getCardinality();</div> |
| <div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  numOps += lhsCardinality + rhsCardinality;</div> |
| <div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  LOG.debug(Integer.toString(i) + <span class="stringliteral">" chose "</span> + minEntry.first.getUniqueAlias()</div> |
| <div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  + <span class="stringliteral">" #lhs="</span> + Long.toString(lhsCardinality)</div> |
| <div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  + <span class="stringliteral">" #rhs="</span> + Long.toString(rhsCardinality)</div> |
| <div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  + <span class="stringliteral">" #ops="</span> + Long.toString(numOps));</div> |
| <div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  remainingRefs.remove(minEntry);</div> |
| <div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  joinedRefs.add(minEntry.first);</div> |
| <div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  root = newRoot;</div> |
| <div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  <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>  <span class="comment">// with a dense sequence of node ids</span></div> |
| <div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  root.setId(ctx_.getNextNodeId());</div> |
| <div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  analyzer.setAssignedConjuncts(root.getAssignedConjuncts());</div> |
| <div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  ++i;</div> |
| <div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  }</div> |
| <div class="line"><a name="l00458"></a><span class="lineno"> 458</span> </div> |
| <div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="keywordflow">return</span> root;</div> |
| <div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  }</div> |
| <div class="line"><a name="l00461"></a><span class="lineno"> 461</span> </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>  <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>  <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer, List<Pair<TableRef, PlanNode>> refPlans)</div> |
| <div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  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>  <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>  Preconditions.checkState(!refPlans.isEmpty());</div> |
| <div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  <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>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < refPlans.size(); ++i) {</div> |
| <div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <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>  <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>  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>  root.setId(ctx_.getNextNodeId());</div> |
| <div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  }</div> |
| <div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  <span class="keywordflow">return</span> root;</div> |
| <div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  }</div> |
| <div class="line"><a name="l00479"></a><span class="lineno"> 479</span> </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>  <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>  <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>  <span class="comment">// no from clause -> materialize the select's exprs with a UnionNode</span></div> |
| <div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="keywordflow">if</span> (selectStmt.getTableRefs().isEmpty()) {</div> |
| <div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  <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>  }</div> |
| <div class="line"><a name="l00490"></a><span class="lineno"> 490</span> </div> |
| <div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  <span class="comment">// Slot materialization:</span></div> |
| <div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  <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>  <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>  <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>  <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>  <span class="comment">//</span></div> |
| <div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <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>  <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>  <span class="comment">// can do a better job because it doesn't need to materialize slots that are only</span></div> |
| <div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="comment">// referenced for partition pruning, for instance</span></div> |
| <div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <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>  <span class="comment">// process repeats itself.</span></div> |
| <div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  selectStmt.materializeRequiredSlots(analyzer);</div> |
| <div class="line"><a name="l00504"></a><span class="lineno"> 504</span> </div> |
| <div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  ArrayList<TupleId> rowTuples = Lists.newArrayList();</div> |
| <div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  <span class="comment">// collect output tuples of subtrees</span></div> |
| <div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  <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>  rowTuples.addAll(tblRef.getMaterializedTupleIds());</div> |
| <div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  }</div> |
| <div class="line"><a name="l00510"></a><span class="lineno"> 510</span> </div> |
| <div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <span class="comment">// If the selectStmt's select-project-join portion returns an empty result set</span></div> |
| <div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  <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>  <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>  <span class="comment">// are materialized (see IMPALA-1960).</span></div> |
| <div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <span class="keywordflow">if</span> (analyzer.hasEmptySpjResultSet()) {</div> |
| <div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <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>  emptySetNode.init(analyzer);</div> |
| <div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  emptySetNode.setOutputSmap(selectStmt.getBaseTblSmap());</div> |
| <div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  <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>  }</div> |
| <div class="line"><a name="l00521"></a><span class="lineno"> 521</span> </div> |
| <div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <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>  <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>  <span class="comment">// plan generation (helps with tests)</span></div> |
| <div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  List<Pair<TableRef, PlanNode>> refPlans = Lists.newArrayList();</div> |
| <div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <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>  <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>  Preconditions.checkState(plan != null);</div> |
| <div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  refPlans.add(<span class="keyword">new</span> Pair(ref, plan));</div> |
| <div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  }</div> |
| <div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  <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>  <span class="keywordflow">for</span> (Pair<TableRef, PlanNode> entry: refPlans) {</div> |
| <div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  entry.second.setAssignedConjuncts(analyzer.getAssignedConjuncts());</div> |
| <div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  }</div> |
| <div class="line"><a name="l00535"></a><span class="lineno"> 535</span> </div> |
| <div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <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>  <span class="keywordflow">if</span> (!selectStmt.getSelectList().isStraightJoin()) {</div> |
| <div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  Set<ExprId> assignedConjuncts = analyzer.getAssignedConjuncts();</div> |
| <div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  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>  <span class="keywordflow">if</span> (root == null) analyzer.setAssignedConjuncts(assignedConjuncts);</div> |
| <div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  }</div> |
| <div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keywordflow">if</span> (selectStmt.getSelectList().isStraightJoin() || root == null) {</div> |
| <div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  <span class="comment">// we didn'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>  <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>  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>  Preconditions.checkNotNull(root);</div> |
| <div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  }</div> |
| <div class="line"><a name="l00548"></a><span class="lineno"> 548</span> </div> |
| <div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <span class="comment">// add aggregation, if any</span></div> |
| <div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <span class="keywordflow">if</span> (selectStmt.getAggInfo() != null) {</div> |
| <div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  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>  }</div> |
| <div class="line"><a name="l00553"></a><span class="lineno"> 553</span> </div> |
| <div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <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>  <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>  <span class="comment">//Preconditions.checkState(!analyzer.hasUnassignedConjuncts());</span></div> |
| <div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <span class="keywordflow">return</span> root;</div> |
| <div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  }</div> |
| <div class="line"><a name="l00559"></a><span class="lineno"> 559</span> </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>  <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>  <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>  Preconditions.checkState(selectStmt.getAggInfo() != null);</div> |
| <div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  <span class="comment">// add aggregation, if required</span></div> |
| <div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <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>  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>  root.init(analyzer);</div> |
| <div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  Preconditions.checkState(root.hasValidStats());</div> |
| <div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <span class="comment">// if we're computing DISTINCT agg fns, the analyzer already created the</span></div> |
| <div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  <span class="comment">// 2nd phase agginfo</span></div> |
| <div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  <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>  ((<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>  <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>  ((<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>  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>  aggInfo.getSecondPhaseDistinctAggInfo());</div> |
| <div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  root.init(analyzer);</div> |
| <div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  Preconditions.checkState(root.hasValidStats());</div> |
| <div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  }</div> |
| <div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  <span class="comment">// add Having clause</span></div> |
| <div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  root.assignConjuncts(analyzer);</div> |
| <div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  <span class="keywordflow">return</span> root;</div> |
| <div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  }</div> |
| <div class="line"><a name="l00587"></a><span class="lineno"> 587</span> </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>  <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>  <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>  Preconditions.checkState(selectStmt.getTableRefs().isEmpty());</div> |
| <div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  ArrayList<Expr> resultExprs = selectStmt.getResultExprs();</div> |
| <div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  ArrayList<String> colLabels = selectStmt.getColLabels();</div> |
| <div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  <span class="comment">// Create tuple descriptor for materialized tuple.</span></div> |
| <div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1TupleDescriptor.html">TupleDescriptor</a> tupleDesc = analyzer.getDescTbl().createTupleDescriptor(<span class="stringliteral">"union"</span>);</div> |
| <div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  tupleDesc.setIsMaterialized(<span class="keyword">true</span>);</div> |
| <div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  <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> </div> |
| <div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <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>  unionNode.addConstExprList(Lists.newArrayList(resultExprs));</div> |
| <div class="line"><a name="l00604"></a><span class="lineno"> 604</span> </div> |
| <div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  <span class="comment">// Replace the select stmt's resultExprs with SlotRefs into tupleDesc.</span></div> |
| <div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < resultExprs.size(); ++i) {</div> |
| <div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <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>  slotDesc.setLabel(colLabels.get(i));</div> |
| <div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  slotDesc.setSourceExpr(resultExprs.get(i));</div> |
| <div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  slotDesc.setType(resultExprs.get(i).getType());</div> |
| <div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  slotDesc.setStats(ColumnStats.fromExpr(resultExprs.get(i)));</div> |
| <div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  slotDesc.setIsMaterialized(<span class="keyword">true</span>);</div> |
| <div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  <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>  resultExprs.set(i, slotRef);</div> |
| <div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  }</div> |
| <div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  tupleDesc.computeMemLayout();</div> |
| <div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  <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>  unionNode.init(analyzer);</div> |
| <div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <span class="keywordflow">return</span> unionNode;</div> |
| <div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  }</div> |
| <div class="line"><a name="l00621"></a><span class="lineno"> 621</span> </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>  <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<Expr> conjuncts) {</div> |
| <div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  ListIterator<Expr> i = conjuncts.listIterator();</div> |
| <div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  <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>  <span class="keywordflow">while</span> (i.hasNext()) {</div> |
| <div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  <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>  <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>  BinaryPredicate comp = (BinaryPredicate) e;</div> |
| <div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  <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>  <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>  <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>  !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>  <span class="keywordflow">continue</span>;</div> |
| <div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  }</div> |
| <div class="line"><a name="l00645"></a><span class="lineno"> 645</span> </div> |
| <div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  <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>  i.remove();</div> |
| <div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <span class="keywordflow">return</span> ValueRange.createEqRange(slotBinding);</div> |
| <div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  }</div> |
| <div class="line"><a name="l00650"></a><span class="lineno"> 650</span> </div> |
| <div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  <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> </div> |
| <div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  <span class="comment">// TODO: do we need copies here?</span></div> |
| <div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <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>  || 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>  <span class="keywordflow">if</span> (result.getLowerBound() == null) {</div> |
| <div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  result.setLowerBound(slotBinding);</div> |
| <div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  result.setLowerBoundInclusive(comp.getOp() == BinaryPredicate.Operator.GE);</div> |
| <div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  i.remove();</div> |
| <div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  }</div> |
| <div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  } <span class="keywordflow">else</span> {</div> |
| <div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <span class="keywordflow">if</span> (result.getUpperBound() == null) {</div> |
| <div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  result.setUpperBound(slotBinding);</div> |
| <div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  result.setUpperBoundInclusive(comp.getOp() == BinaryPredicate.Operator.LE);</div> |
| <div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  i.remove();</div> |
| <div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  }</div> |
| <div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  }</div> |
| <div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  }</div> |
| <div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <span class="keywordflow">return</span> result;</div> |
| <div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  }</div> |
| <div class="line"><a name="l00671"></a><span class="lineno"> 671</span> </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>  <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>  <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>  <span class="comment">// If possible, "push down" view predicates; this is needed in order to ensure</span></div> |
| <div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  <span class="comment">// that predicates such as "x + y = 10" are evaluated in the view's plan tree</span></div> |
| <div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  <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>  <span class="comment">// This doesn't prevent predicate propagation, because predicates like</span></div> |
| <div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  <span class="comment">// "x = 10" that get pushed down are still connected to equivalent slots</span></div> |
| <div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  <span class="comment">// via the equality predicates created for the view's select list.</span></div> |
| <div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  <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>  <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>  <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> </div> |
| <div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  <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>  <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>  <span class="comment">// same thing</span></div> |
| <div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  <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>  <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>  SelectStmt selectStmt = (SelectStmt) viewStmt;</div> |
| <div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  <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>  <span class="keywordflow">if</span> (inlineViewRef.getAnalyzer().hasEmptyResultSet()) {</div> |
| <div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  <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>  }</div> |
| <div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  <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>  Preconditions.checkState(inlineViewRef.getMaterializedTupleIds().size() == 1);</div> |
| <div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  <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>  analyzer.getTupleDesc(inlineViewRef.getId()).materializeSlots();</div> |
| <div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  <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>  inlineViewRef.getMaterializedTupleIds().<span class="keyword">get</span>(0));</div> |
| <div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <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>  unionNode.setTblRefIds(Lists.newArrayList(inlineViewRef.getId()));</div> |
| <div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  unionNode.addConstExprList(selectStmt.getBaseTblResultExprs());</div> |
| <div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  unionNode.init(analyzer);</div> |
| <div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  <span class="keywordflow">return</span> unionNode;</div> |
| <div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  }</div> |
| <div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  }</div> |
| <div class="line"><a name="l00719"></a><span class="lineno"> 719</span> </div> |
| <div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  <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>  <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>  <span class="comment">// TODO: we should compute the "physical layout" of the view's descriptor, so that</span></div> |
| <div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  <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>  <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>  rootNode.setTblRefIds(Lists.newArrayList(inlineViewRef.getId()));</div> |
| <div class="line"><a name="l00726"></a><span class="lineno"> 726</span> </div> |
| <div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <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>  <span class="keywordflow">if</span> (analyzer.isOuterJoined(inlineViewRef.getId())) {</div> |
| <div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  <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>  <span class="comment">// Make the rhs exprs of the inline view's smap nullable, if necessary.</span></div> |
| <div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  List<Expr> nullableRhs = TupleIsNullPredicate.wrapExprs(</div> |
| <div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  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>  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>  }</div> |
| <div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  <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>  <span class="comment">// The output smap is the composition of the inline view's smap and the output smap</span></div> |
| <div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  <span class="comment">// of the inline view's plan root. This ensures that all downstream exprs referencing</span></div> |
| <div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  <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>  <span class="comment">// the inline view's plan.</span></div> |
| <div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  <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>  rootNode.getOutputSmap(), analyzer);</div> |
| <div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  rootNode.setOutputSmap(composedSmap);</div> |
| <div class="line"><a name="l00743"></a><span class="lineno"> 743</span> </div> |
| <div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  <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>  <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>  <span class="comment">// top of the current plan root node.</span></div> |
| <div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <span class="comment">//</span></div> |
| <div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  <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>  <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>  <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>  <span class="comment">// place.</span></div> |
| <div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  <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>  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>  analyzer, inlineViewRef.getDesc().getId().asList(), rootNode);</div> |
| <div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  }</div> |
| <div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  <span class="keywordflow">return</span> rootNode;</div> |
| <div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  }</div> |
| <div class="line"><a name="l00758"></a><span class="lineno"> 758</span> </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>  <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>  <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>  List<Expr> unassignedConjuncts =</div> |
| <div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  analyzer.getUnassignedConjuncts(inlineViewRef.getId().asList(), <span class="keyword">true</span>);</div> |
| <div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  <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>  <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>  <span class="comment">// materialized</span></div> |
| <div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  List<Expr> substUnassigned = Expr.substituteList(unassignedConjuncts,</div> |
| <div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  inlineViewRef.getBaseTblSmap(), analyzer, <span class="keyword">false</span>);</div> |
| <div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  analyzer.materializeSlots(substUnassigned);</div> |
| <div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  <span class="keywordflow">return</span>;</div> |
| <div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  }</div> |
| <div class="line"><a name="l00781"></a><span class="lineno"> 781</span> </div> |
| <div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  List<Expr> preds = Lists.newArrayList();</div> |
| <div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  <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>  <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>  preds.add(e);</div> |
| <div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  }</div> |
| <div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  }</div> |
| <div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  unassignedConjuncts.removeAll(preds);</div> |
| <div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  <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>  <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>  analyzer.createEquivConjuncts(inlineViewRef.getId(), preds);</div> |
| <div class="line"><a name="l00792"></a><span class="lineno"> 792</span> </div> |
| <div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  <span class="comment">// create new predicates against the inline view's unresolved result exprs, not</span></div> |
| <div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  <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>  <span class="comment">// limit clauses on the way)</span></div> |
| <div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  List<Expr> viewPredicates =</div> |
| <div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  Expr.substituteList(preds, inlineViewRef.getSmap(), analyzer, <span class="keyword">false</span>);</div> |
| <div class="line"><a name="l00798"></a><span class="lineno"> 798</span> </div> |
| <div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  <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>  <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>  <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>  <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Predicate.html">Predicate<Expr></a> isIdentityPredicate = <span class="keyword">new</span> <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Predicate.html">Predicate<Expr></a>() {</div> |
| <div class="line"><a name="l00803"></a><span class="lineno"> 803</span>  @Override</div> |
| <div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  <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>  <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>  || ((BinaryPredicate) expr).getOp() != BinaryPredicate.Operator.EQ) {</div> |
| <div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> |
| <div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  }</div> |
| <div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  <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>  && 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>  && 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>  && (((<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>  ((<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>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> |
| <div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  }</div> |
| <div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> |
| <div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  }</div> |
| <div class="line"><a name="l00818"></a><span class="lineno"> 818</span>  };</div> |
| <div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  Iterables.removeIf(viewPredicates, isIdentityPredicate);</div> |
| <div class="line"><a name="l00820"></a><span class="lineno"> 820</span> </div> |
| <div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  <span class="comment">// "migrate" 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>  <span class="comment">// new ids.</span></div> |
| <div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  <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>  <span class="comment">// have changed.</span></div> |
| <div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  analyzer.markConjunctsAssigned(preds);</div> |
| <div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  inlineViewRef.getAnalyzer().registerConjuncts(viewPredicates);</div> |
| <div class="line"><a name="l00827"></a><span class="lineno"> 827</span> </div> |
| <div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  <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>  <span class="comment">// materialized</span></div> |
| <div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  List<Expr> substUnassigned = Expr.substituteList(unassignedConjuncts,</div> |
| <div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  inlineViewRef.getBaseTblSmap(), analyzer, <span class="keyword">false</span>);</div> |
| <div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  analyzer.materializeSlots(substUnassigned);</div> |
| <div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  }</div> |
| <div class="line"><a name="l00834"></a><span class="lineno"> 834</span> </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>  <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>  <span class="keywordflow">return</span> !inlineViewRef.getViewStmt().hasLimit()</div> |
| <div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  && !inlineViewRef.getViewStmt().hasOffset()</div> |
| <div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  && (!(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>  || !((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>  }</div> |
| <div class="line"><a name="l00844"></a><span class="lineno"> 844</span> </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>  <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>  <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>  <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>  <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>  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>  (<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>  scanNode.init(analyzer);</div> |
| <div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <span class="keywordflow">return</span> scanNode;</div> |
| <div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  } <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>  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>  scanNode.init(analyzer);</div> |
| <div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <span class="keywordflow">return</span> scanNode;</div> |
| <div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  } <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>  <span class="comment">// HBase table</span></div> |
| <div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  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>  } <span class="keywordflow">else</span> {</div> |
| <div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <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">"Invalid table ref class: "</span> + tblRef.getClass());</div> |
| <div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  }</div> |
| <div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <span class="comment">// TODO: move this to HBaseScanNode.init();</span></div> |
| <div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  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> </div> |
| <div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  List<Expr> conjuncts = analyzer.getUnassignedConjuncts(scanNode);</div> |
| <div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  <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>  <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>  analyzer.markConjunctsAssigned(conjuncts);</div> |
| <div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  List<ValueRange> keyRanges = Lists.newArrayList();</div> |
| <div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  <span class="comment">// determine scan predicates for clustering cols</span></div> |
| <div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < tblRef.getTable().getNumClusteringCols(); ++i) {</div> |
| <div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <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>  tblRef.getDesc(), tblRef.getTable().getColumns().<span class="keyword">get</span>(i));</div> |
| <div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <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>  <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>  <span class="comment">// (since it's stored in ascii it will be lexicographically ordered,</span></div> |
| <div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  <span class="comment">// and non-string comparisons won't work)</span></div> |
| <div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  keyRanges.add(null);</div> |
| <div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  } <span class="keywordflow">else</span> {</div> |
| <div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  <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>  <span class="comment">// used as input for filter</span></div> |
| <div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  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>  }</div> |
| <div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  }</div> |
| <div class="line"><a name="l00889"></a><span class="lineno"> 889</span> </div> |
| <div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  ((<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>  scanNode.addConjuncts(conjuncts);</div> |
| <div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  scanNode.init(analyzer);</div> |
| <div class="line"><a name="l00893"></a><span class="lineno"> 893</span> </div> |
| <div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  <span class="keywordflow">return</span> scanNode;</div> |
| <div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  }</div> |
| <div class="line"><a name="l00896"></a><span class="lineno"> 896</span> </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>  <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>  <a class="code" href="classcom_1_1cloudera_1_1impala_1_1analysis_1_1Analyzer.html">Analyzer</a> analyzer, List<TupleId> 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>  List<BinaryPredicate> joinConjuncts, List<Expr> joinPredicates) {</div> |
| <div class="line"><a name="l00915"></a><span class="lineno"> 915</span>  joinConjuncts.clear();</div> |
| <div class="line"><a name="l00916"></a><span class="lineno"> 916</span>  joinPredicates.clear();</div> |
| <div class="line"><a name="l00917"></a><span class="lineno"> 917</span>  <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>  List<TupleId> tblRefIds = tblRefId.asList();</div> |
| <div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  List<Expr> candidates = analyzer.getEqJoinConjuncts(planIds, joinedTblRef);</div> |
| <div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  <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> </div> |
| <div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  List<TupleId> joinTupleIds = Lists.newArrayList();</div> |
| <div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  joinTupleIds.addAll(planIds);</div> |
| <div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  joinTupleIds.add(tblRefId);</div> |
| <div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  <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>  <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>  <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> </div> |
| <div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  <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>  <span class="keywordflow">if</span> (e.getChild(0).isBoundByTupleIds(tblRefIds)) {</div> |
| <div class="line"><a name="l00931"></a><span class="lineno"> 931</span>  rhsExpr = e.getChild(0);</div> |
| <div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  } <span class="keywordflow">else</span> {</div> |
| <div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  Preconditions.checkState(e.getChild(1).isBoundByTupleIds(tblRefIds));</div> |
| <div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  rhsExpr = e.getChild(1);</div> |
| <div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  }</div> |
| <div class="line"><a name="l00936"></a><span class="lineno"> 936</span> </div> |
| <div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  <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>  <span class="keywordflow">if</span> (e.getChild(1).isBoundByTupleIds(planIds)) {</div> |
| <div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  lhsExpr = e.getChild(1);</div> |
| <div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  } <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>  lhsExpr = e.getChild(0);</div> |
| <div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  } <span class="keywordflow">else</span> {</div> |
| <div class="line"><a name="l00943"></a><span class="lineno"> 943</span>  <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>  <span class="keywordflow">continue</span>;</div> |
| <div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  }</div> |
| <div class="line"><a name="l00946"></a><span class="lineno"> 946</span> </div> |
| <div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  Preconditions.checkState(lhsExpr != rhsExpr);</div> |
| <div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  joinPredicates.add(e);</div> |
| <div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  <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>  <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>  joinConjunct.analyzeNoThrow(analyzer);</div> |
| <div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  joinConjuncts.add(joinConjunct);</div> |
| <div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  }</div> |
| <div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  <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>  Preconditions.checkState(joinConjuncts.isEmpty());</div> |
| <div class="line"><a name="l00956"></a><span class="lineno"> 956</span> </div> |
| <div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  <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>  List<SlotId> lhsSlotIds = Lists.newArrayList();</div> |
| <div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  <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>  analyzer.getEquivSlots(slotDesc.getId(), planIds, lhsSlotIds);</div> |
| <div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  <span class="keywordflow">if</span> (!lhsSlotIds.isEmpty()) {</div> |
| <div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  <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>  <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>  <span class="comment">// equalities are redundant</span></div> |
| <div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  <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>  analyzer.createEqPredicate(lhsSlotIds.get(0), slotDesc.getId());</div> |
| <div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  joinConjuncts.add(pred);</div> |
| <div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  }</div> |
| <div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  }</div> |
| <div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  }</div> |
| <div class="line"><a name="l00971"></a><span class="lineno"> 971</span> </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>  <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>  <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>  <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>  Preconditions.checkState(innerRef != null ^ outerRef != null);</div> |
| <div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  <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> </div> |
| <div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  List<BinaryPredicate> eqJoinConjuncts = Lists.newArrayList();</div> |
| <div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  List<Expr> eqJoinPredicates = Lists.newArrayList();</div> |
| <div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  <span class="comment">// get eq join predicates for the TableRefs' ids (not the PlanNodes' ids, which</span></div> |
| <div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  <span class="comment">// are materialized)</span></div> |
| <div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  <span class="keywordflow">if</span> (innerRef != null) {</div> |
| <div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  <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>  analyzer, outer.getTblRefIds(), innerRef, eqJoinConjuncts, eqJoinPredicates);</div> |
| <div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  <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>  <span class="keywordflow">if</span> (!innerRef.getJoinOp().isOuterJoin()) {</div> |
| <div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  analyzer.createEquivConjuncts(outer.getTblRefIds(), innerRef.getId(),</div> |
| <div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  eqJoinConjuncts);</div> |
| <div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  }</div> |
| <div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  } <span class="keywordflow">else</span> {</div> |
| <div class="line"><a name="l00996"></a><span class="lineno"> 996</span>  <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>  analyzer, inner.getTblRefIds(), outerRef, eqJoinConjuncts, eqJoinPredicates);</div> |
| <div class="line"><a name="l00998"></a><span class="lineno"> 998</span>  <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>  <span class="keywordflow">if</span> (!outerRef.getJoinOp().isOuterJoin()) {</div> |
| <div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  analyzer.createEquivConjuncts(inner.getTblRefIds(), outerRef.getId(),</div> |
| <div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>  eqJoinConjuncts);</div> |
| <div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  }</div> |
| <div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  <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>  <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>  <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>  eqJoinConjunct.setChild(0, eqJoinConjunct.getChild(1));</div> |
| <div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  eqJoinConjunct.setChild(1, swapTmp);</div> |
| <div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  }</div> |
| <div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  }</div> |
| <div class="line"><a name="l01010"></a><span class="lineno"> 1010</span> </div> |
| <div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  <span class="comment">// Handle implicit cross joins</span></div> |
| <div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  <span class="keywordflow">if</span> (eqJoinConjuncts.isEmpty()) {</div> |
| <div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  <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>  <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>  <span class="comment">// this query.</span></div> |
| <div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  <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>  <span class="keywordflow">if</span> (tblRef.getJoinOp().isOuterJoin() ||</div> |
| <div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  tblRef.getJoinOp().isSemiJoin()) {</div> |
| <div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  <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>  String.format(<span class="stringliteral">"%s join with '%s' without equi-join "</span> +</div> |
| <div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  <span class="stringliteral">"conjuncts is not supported."</span>,</div> |
| <div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  tblRef.getJoinOp().isOuterJoin() ? <span class="stringliteral">"Outer"</span> : <span class="stringliteral">"Semi"</span>,</div> |
| <div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  innerRef.getUniqueAlias()));</div> |
| <div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  }</div> |
| <div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  <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>  result.init(analyzer);</div> |
| <div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  <span class="keywordflow">return</span> result;</div> |
| <div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  }</div> |
| <div class="line"><a name="l01029"></a><span class="lineno"> 1029</span> </div> |
| <div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  <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>  <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>  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>  }</div> |
| <div class="line"><a name="l01034"></a><span class="lineno"> 1034</span> </div> |
| <div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  analyzer.markConjunctsAssigned(eqJoinPredicates);</div> |
| <div class="line"><a name="l01036"></a><span class="lineno"> 1036</span> </div> |
| <div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>  List<Expr> otherJoinConjuncts = Lists.newArrayList();</div> |
| <div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  <span class="keywordflow">if</span> (tblRef.getJoinOp().isOuterJoin()) {</div> |
| <div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>  <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>  <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>  otherJoinConjuncts = analyzer.getUnassignedOjConjuncts(tblRef);</div> |
| <div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>  } <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>  <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>  <span class="comment">// come from the join'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>  <span class="comment">// conjuncts to produce correct results.</span></div> |
| <div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  otherJoinConjuncts =</div> |
| <div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  analyzer.getUnassignedConjuncts(tblRef.getAllTupleIds(), <span class="keyword">false</span>);</div> |
| <div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>  <span class="keywordflow">if</span> (tblRef.getJoinOp().isNullAwareLeftAntiJoin()) {</div> |
| <div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  <span class="keywordtype">boolean</span> hasNullMatchingEqOperator = <span class="keyword">false</span>;</div> |
| <div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  <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>  <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>  <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>  Iterator<BinaryPredicate> it = eqJoinConjuncts.iterator();</div> |
| <div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>  <span class="keywordflow">while</span> (it.hasNext()) {</div> |
| <div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  <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>  <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>  otherJoinConjuncts.add(conjunct);</div> |
| <div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  it.remove();</div> |
| <div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  } <span class="keywordflow">else</span> {</div> |
| <div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>  <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>  Preconditions.checkState(!hasNullMatchingEqOperator);</div> |
| <div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  hasNullMatchingEqOperator = <span class="keyword">true</span>;</div> |
| <div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>  }</div> |
| <div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  }</div> |
| <div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>  Preconditions.checkState(hasNullMatchingEqOperator);</div> |
| <div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>  }</div> |
| <div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  }</div> |
| <div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  analyzer.markConjunctsAssigned(otherJoinConjuncts);</div> |
| <div class="line"><a name="l01069"></a><span class="lineno"> 1069</span> </div> |
| <div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  <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>  <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>  result.init(analyzer);</div> |
| <div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>  <span class="keywordflow">return</span> result;</div> |
| <div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>  }</div> |
| <div class="line"><a name="l01075"></a><span class="lineno"> 1075</span> </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>  <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>  <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>  <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>  <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>  } <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>  <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>  }</div> |
| <div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>  <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>  <span class="stringliteral">"Unknown TableRef node: "</span> + tblRef.getClass().getSimpleName());</div> |
| <div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  }</div> |
| <div class="line"><a name="l01090"></a><span class="lineno"> 1090</span> </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>  <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>  <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<UnionOperand> unionOperands,</div> |
| <div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  <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>  <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>  <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>  <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>  <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>  <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>  <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>  <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>  SelectStmt selectStmt = (SelectStmt) queryStmt;</div> |
| <div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  <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>  unionNode.addConstExprList(selectStmt.getBaseTblResultExprs());</div> |
| <div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  <span class="keywordflow">continue</span>;</div> |
| <div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  }</div> |
| <div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>  }</div> |
| <div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  <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>  <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>  unionNode.addChild(opPlan, op.getQueryStmt().getBaseTblResultExprs());</div> |
| <div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>  }</div> |
| <div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  <span class="keywordflow">if</span> (unionDistinctPlan != null) {</div> |
| <div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>  Preconditions.checkState(unionStmt.hasDistinctOps());</div> |
| <div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>  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>  unionNode.addChild(unionDistinctPlan,</div> |
| <div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>  unionStmt.getDistinctAggInfo().getGroupingExprs());</div> |
| <div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>  }</div> |
| <div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>  unionNode.init(analyzer);</div> |
| <div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>  <span class="keywordflow">return</span> unionNode;</div> |
| <div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>  }</div> |
| <div class="line"><a name="l01127"></a><span class="lineno"> 1127</span> </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>  <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>  <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>  List<Expr> conjuncts =</div> |
| <div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>  analyzer.getUnassignedConjuncts(unionStmt.getTupleId().asList(), <span class="keyword">false</span>);</div> |
| <div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  <span class="keywordflow">if</span> (!unionStmt.hasAnalyticExprs()) {</div> |
| <div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  <span class="comment">// Turn unassigned predicates for unionStmt's tupleId_ into predicates for</span></div> |
| <div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  <span class="comment">// the individual operands.</span></div> |
| <div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>  <span class="comment">// Do this prior to creating the operands' plan trees so they get a chance to</span></div> |
| <div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  <span class="comment">// pick up propagated predicates.</span></div> |
| <div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>  <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>  List<Expr> opConjuncts =</div> |
| <div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>  Expr.substituteList(conjuncts, op.getSmap(), analyzer, <span class="keyword">false</span>);</div> |
| <div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>  op.getAnalyzer().registerConjuncts(opConjuncts);</div> |
| <div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>  <span class="comment">// Some of the opConjuncts have become constant and eval'd to false, or an</span></div> |
| <div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>  <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>  <span class="keywordflow">if</span> (op.getAnalyzer().hasEmptyResultSet()) op.drop();</div> |
| <div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>  }</div> |
| <div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>  analyzer.markConjunctsAssigned(conjuncts);</div> |
| <div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  } <span class="keywordflow">else</span> {</div> |
| <div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  <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>  analyzer.materializeSlots(conjuncts);</div> |
| <div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  }</div> |
| <div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  <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>  unionStmt.materializeRequiredSlots(analyzer);</div> |
| <div class="line"><a name="l01165"></a><span class="lineno"> 1165</span> </div> |
| <div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>  <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>  <span class="comment">// create DISTINCT tree</span></div> |
| <div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  <span class="keywordflow">if</span> (unionStmt.hasDistinctOps()) {</div> |
| <div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  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>  analyzer, unionStmt, unionStmt.getDistinctOperands(), null);</div> |
| <div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>  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>  <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>  result.init(analyzer);</div> |
| <div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  }</div> |
| <div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  <span class="comment">// create ALL tree</span></div> |
| <div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>  <span class="keywordflow">if</span> (unionStmt.hasAllOps()) {</div> |
| <div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>  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>  }</div> |
| <div class="line"><a name="l01179"></a><span class="lineno"> 1179</span> </div> |
| <div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  <span class="keywordflow">if</span> (unionStmt.hasAnalyticExprs()) {</div> |
| <div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>  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>  analyzer, unionStmt.getTupleId().asList(), result);</div> |
| <div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>  }</div> |
| <div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  <span class="keywordflow">return</span> result;</div> |
| <div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>  }</div> |
| <div class="line"><a name="l01186"></a><span class="lineno"> 1186</span> }</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< Pair< TableRef, PlanNode >> 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< TableRef > 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< TupleId > 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< TupleId > planIds, TableRef joinedTblRef, List< BinaryPredicate > joinConjuncts, List< Expr > 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< TupleId > 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< Expr > 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< Pair< TableRef, PlanNode >> 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< UnionOperand > 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< Expr > 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< TupleId > 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< Pair< TableRef, PlanNode >> 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> |