Merging upstream version 25.0.3.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
03b67e2ec9
commit
021892b3ff
84 changed files with 33016 additions and 31040 deletions
File diff suppressed because one or more lines are too long
|
@ -586,7 +586,7 @@ queries if it would result in multiple table selects in a single query:</p>
|
|||
<div class="attr variable">
|
||||
<span class="name">UNMERGABLE_ARGS</span> =
|
||||
<input id="UNMERGABLE_ARGS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="UNMERGABLE_ARGS-view-value"></label><span class="default_value">{'offset', 'prewhere', 'match', 'locks', 'qualify', 'windows', 'pivots', 'cluster', 'settings', 'having', 'group', 'options', 'distinct', 'with', 'distribute', 'sample', 'format', 'connect', 'laterals', 'limit', 'sort', 'into', 'kind'}</span>
|
||||
<label class="view-value-button pdoc-button" for="UNMERGABLE_ARGS-view-value"></label><span class="default_value">{'sample', 'prewhere', 'offset', 'group', 'with', 'laterals', 'kind', 'distinct', 'having', 'sort', 'cluster', 'limit', 'format', 'locks', 'distribute', 'settings', 'match', 'connect', 'qualify', 'options', 'windows', 'into', 'pivots'}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
@ -106,7 +106,7 @@
|
|||
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> <span class="n">original</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||||
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a>
|
||||
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a> <span class="n">node</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">rewrite_between</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="n">distance</span> <span class="o">=</span> <span class="n">normalization_distance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">dnf</span><span class="o">=</span><span class="n">dnf</span><span class="p">)</span>
|
||||
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="n">distance</span> <span class="o">=</span> <span class="n">normalization_distance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">dnf</span><span class="o">=</span><span class="n">dnf</span><span class="p">,</span> <span class="n">max_</span><span class="o">=</span><span class="n">max_distance</span><span class="p">)</span>
|
||||
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a>
|
||||
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a> <span class="k">if</span> <span class="n">distance</span> <span class="o">></span> <span class="n">max_distance</span><span class="p">:</span>
|
||||
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
|
||||
|
@ -155,103 +155,119 @@
|
|||
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="p">)</span>
|
||||
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a>
|
||||
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a>
|
||||
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a><span class="k">def</span> <span class="nf">normalization_distance</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span> <span class="n">dnf</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-></span> <span class="nb">int</span><span class="p">:</span>
|
||||
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a><span class="sd"> The difference in the number of predicates between a given expression and its normalized form.</span>
|
||||
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a>
|
||||
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a><span class="sd"> This is used as an estimate of the cost of the conversion which is exponential in complexity.</span>
|
||||
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a><span class="k">def</span> <span class="nf">normalization_distance</span><span class="p">(</span>
|
||||
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span> <span class="n">dnf</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">max_</span><span class="p">:</span> <span class="nb">float</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="s2">"inf"</span><span class="p">)</span>
|
||||
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a><span class="p">)</span> <span class="o">-></span> <span class="nb">int</span><span class="p">:</span>
|
||||
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a><span class="sd"> The difference in the number of predicates between a given expression and its normalized form.</span>
|
||||
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a>
|
||||
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a><span class="sd"> Example:</span>
|
||||
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a><span class="sd"> >>> import sqlglot</span>
|
||||
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a><span class="sd"> >>> expression = sqlglot.parse_one("(a AND b) OR (c AND d)")</span>
|
||||
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a><span class="sd"> >>> normalization_distance(expression)</span>
|
||||
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a><span class="sd"> 4</span>
|
||||
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a>
|
||||
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a><span class="sd"> expression: The expression to compute the normalization distance for.</span>
|
||||
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a><span class="sd"> dnf: Whether to check if the expression is in Disjunctive Normal Form (DNF).</span>
|
||||
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a><span class="sd"> Default: False, i.e. we check if it's in Conjunctive Normal Form (CNF).</span>
|
||||
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a>
|
||||
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a><span class="sd"> Returns:</span>
|
||||
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a><span class="sd"> The normalization distance.</span>
|
||||
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="k">return</span> <span class="nb">sum</span><span class="p">(</span><span class="n">_predicate_lengths</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="p">))</span> <span class="o">-</span> <span class="p">(</span>
|
||||
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="nb">sum</span><span class="p">(</span><span class="mi">1</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">))</span> <span class="o">+</span> <span class="mi">1</span>
|
||||
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="p">)</span>
|
||||
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a>
|
||||
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a><span class="sd"> This is used as an estimate of the cost of the conversion which is exponential in complexity.</span>
|
||||
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a>
|
||||
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a><span class="sd"> Example:</span>
|
||||
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a><span class="sd"> >>> import sqlglot</span>
|
||||
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a><span class="sd"> >>> expression = sqlglot.parse_one("(a AND b) OR (c AND d)")</span>
|
||||
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a><span class="sd"> >>> normalization_distance(expression)</span>
|
||||
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a><span class="sd"> 4</span>
|
||||
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a>
|
||||
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a><span class="sd"> expression: The expression to compute the normalization distance for.</span>
|
||||
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a><span class="sd"> dnf: Whether to check if the expression is in Disjunctive Normal Form (DNF).</span>
|
||||
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a><span class="sd"> Default: False, i.e. we check if it's in Conjunctive Normal Form (CNF).</span>
|
||||
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a><span class="sd"> max_: stop early if count exceeds this.</span>
|
||||
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a>
|
||||
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a><span class="sd"> Returns:</span>
|
||||
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a><span class="sd"> The normalization distance.</span>
|
||||
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="n">total</span> <span class="o">=</span> <span class="o">-</span><span class="p">(</span><span class="nb">sum</span><span class="p">(</span><span class="mi">1</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">))</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
|
||||
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a>
|
||||
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a><span class="k">def</span> <span class="nf">_predicate_lengths</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="p">):</span>
|
||||
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a><span class="sd"> Returns a list of predicate lengths when expanded to normalized form.</span>
|
||||
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a>
|
||||
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a><span class="sd"> (A AND B) OR C -> [2, 2] because len(A OR C), len(B OR C).</span>
|
||||
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">unnest</span><span class="p">()</span>
|
||||
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="k">for</span> <span class="n">length</span> <span class="ow">in</span> <span class="n">_predicate_lengths</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="p">,</span> <span class="n">max_</span><span class="p">):</span>
|
||||
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> <span class="n">total</span> <span class="o">+=</span> <span class="n">length</span>
|
||||
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="k">if</span> <span class="n">total</span> <span class="o">></span> <span class="n">max_</span><span class="p">:</span>
|
||||
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="k">return</span> <span class="n">total</span>
|
||||
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a>
|
||||
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="k">return</span> <span class="n">total</span>
|
||||
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a>
|
||||
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a>
|
||||
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">):</span>
|
||||
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="k">return</span> <span class="p">(</span><span class="mi">1</span><span class="p">,)</span>
|
||||
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a>
|
||||
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="n">left</span><span class="p">,</span> <span class="n">right</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>
|
||||
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a>
|
||||
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span> <span class="k">if</span> <span class="n">dnf</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">):</span>
|
||||
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span>
|
||||
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">_predicate_lengths</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">dnf</span><span class="p">)</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">_predicate_lengths</span><span class="p">(</span><span class="n">right</span><span class="p">,</span> <span class="n">dnf</span><span class="p">)</span>
|
||||
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="p">)</span>
|
||||
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="k">return</span> <span class="n">_predicate_lengths</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">dnf</span><span class="p">)</span> <span class="o">+</span> <span class="n">_predicate_lengths</span><span class="p">(</span><span class="n">right</span><span class="p">,</span> <span class="n">dnf</span><span class="p">)</span>
|
||||
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a>
|
||||
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a><span class="k">def</span> <span class="nf">_predicate_lengths</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="p">,</span> <span class="n">max_</span><span class="o">=</span><span class="nb">float</span><span class="p">(</span><span class="s2">"inf"</span><span class="p">),</span> <span class="n">depth</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
|
||||
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a><span class="sd"> Returns a list of predicate lengths when expanded to normalized form.</span>
|
||||
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a>
|
||||
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a><span class="sd"> (A AND B) OR C -> [2, 2] because len(A OR C), len(B OR C).</span>
|
||||
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="k">if</span> <span class="n">depth</span> <span class="o">></span> <span class="n">max_</span><span class="p">:</span>
|
||||
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="k">yield</span> <span class="n">depth</span>
|
||||
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="k">return</span>
|
||||
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a>
|
||||
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">unnest</span><span class="p">()</span>
|
||||
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a>
|
||||
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a><span class="k">def</span> <span class="nf">distributive_law</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="p">,</span> <span class="n">max_distance</span><span class="p">):</span>
|
||||
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a><span class="sd"> x OR (y AND z) -> (x OR y) AND (x OR z)</span>
|
||||
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a><span class="sd"> (x AND y) OR (y AND z) -> (x OR y) AND (x OR z) AND (y OR y) AND (y OR z)</span>
|
||||
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="k">if</span> <span class="n">normalized</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="o">=</span><span class="n">dnf</span><span class="p">):</span>
|
||||
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a>
|
||||
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="n">distance</span> <span class="o">=</span> <span class="n">normalization_distance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="o">=</span><span class="n">dnf</span><span class="p">)</span>
|
||||
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a>
|
||||
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="k">if</span> <span class="n">distance</span> <span class="o">></span> <span class="n">max_distance</span><span class="p">:</span>
|
||||
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a> <span class="k">raise</span> <span class="n">OptimizeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Normalization distance </span><span class="si">{</span><span class="n">distance</span><span class="si">}</span><span class="s2"> exceeds max </span><span class="si">{</span><span class="n">max_distance</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a>
|
||||
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">replace_children</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">e</span><span class="p">:</span> <span class="n">distributive_law</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">dnf</span><span class="p">,</span> <span class="n">max_distance</span><span class="p">))</span>
|
||||
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a> <span class="n">to_exp</span><span class="p">,</span> <span class="n">from_exp</span> <span class="o">=</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span><span class="p">)</span> <span class="k">if</span> <span class="n">dnf</span> <span class="k">else</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">And</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">)</span>
|
||||
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">):</span>
|
||||
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="k">yield</span> <span class="mi">1</span>
|
||||
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="k">return</span>
|
||||
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a>
|
||||
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="n">depth</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="n">left</span><span class="p">,</span> <span class="n">right</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>
|
||||
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a>
|
||||
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span> <span class="k">if</span> <span class="n">dnf</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">):</span>
|
||||
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">_predicate_lengths</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">dnf</span><span class="p">,</span> <span class="n">max_</span><span class="p">,</span> <span class="n">depth</span><span class="p">):</span>
|
||||
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">_predicate_lengths</span><span class="p">(</span><span class="n">right</span><span class="p">,</span> <span class="n">dnf</span><span class="p">,</span> <span class="n">max_</span><span class="p">,</span> <span class="n">depth</span><span class="p">):</span>
|
||||
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="k">yield</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
|
||||
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a> <span class="k">yield from</span> <span class="n">_predicate_lengths</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">dnf</span><span class="p">,</span> <span class="n">max_</span><span class="p">,</span> <span class="n">depth</span><span class="p">)</span>
|
||||
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a> <span class="k">yield from</span> <span class="n">_predicate_lengths</span><span class="p">(</span><span class="n">right</span><span class="p">,</span> <span class="n">dnf</span><span class="p">,</span> <span class="n">max_</span><span class="p">,</span> <span class="n">depth</span><span class="p">)</span>
|
||||
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a>
|
||||
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a>
|
||||
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">from_exp</span><span class="p">):</span>
|
||||
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">unnest_operands</span><span class="p">()</span>
|
||||
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a>
|
||||
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a> <span class="n">from_func</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">and_</span> <span class="k">if</span> <span class="n">from_exp</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">or_</span>
|
||||
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a> <span class="n">to_func</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">and_</span> <span class="k">if</span> <span class="n">to_exp</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">or_</span>
|
||||
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a>
|
||||
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">):</span>
|
||||
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">)))</span> <span class="o">></span> <span class="nb">len</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">))):</span>
|
||||
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">):</span>
|
||||
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">):</span>
|
||||
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a>
|
||||
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a>
|
||||
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a>
|
||||
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a><span class="k">def</span> <span class="nf">_distribute</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">):</span>
|
||||
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">):</span>
|
||||
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">replace_children</span><span class="p">(</span>
|
||||
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a> <span class="n">a</span><span class="p">,</span>
|
||||
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a> <span class="k">lambda</span> <span class="n">c</span><span class="p">:</span> <span class="n">to_func</span><span class="p">(</span>
|
||||
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a> <span class="n">uniq_sort</span><span class="p">(</span><span class="n">flatten</span><span class="p">(</span><span class="n">from_func</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">left</span><span class="p">))),</span>
|
||||
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a> <span class="n">uniq_sort</span><span class="p">(</span><span class="n">flatten</span><span class="p">(</span><span class="n">from_func</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">right</span><span class="p">))),</span>
|
||||
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a> <span class="p">),</span>
|
||||
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a> <span class="p">)</span>
|
||||
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="n">a</span> <span class="o">=</span> <span class="n">to_func</span><span class="p">(</span>
|
||||
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="n">uniq_sort</span><span class="p">(</span><span class="n">flatten</span><span class="p">(</span><span class="n">from_func</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">left</span><span class="p">))),</span>
|
||||
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a> <span class="n">uniq_sort</span><span class="p">(</span><span class="n">flatten</span><span class="p">(</span><span class="n">from_func</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">right</span><span class="p">))),</span>
|
||||
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a> <span class="p">)</span>
|
||||
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a>
|
||||
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a> <span class="k">return</span> <span class="n">a</span>
|
||||
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a><span class="k">def</span> <span class="nf">distributive_law</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="p">,</span> <span class="n">max_distance</span><span class="p">):</span>
|
||||
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a><span class="sd"> x OR (y AND z) -> (x OR y) AND (x OR z)</span>
|
||||
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a><span class="sd"> (x AND y) OR (y AND z) -> (x OR y) AND (x OR z) AND (y OR y) AND (y OR z)</span>
|
||||
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a> <span class="k">if</span> <span class="n">normalized</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="o">=</span><span class="n">dnf</span><span class="p">):</span>
|
||||
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a>
|
||||
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a> <span class="n">distance</span> <span class="o">=</span> <span class="n">normalization_distance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="o">=</span><span class="n">dnf</span><span class="p">,</span> <span class="n">max_</span><span class="o">=</span><span class="n">max_distance</span><span class="p">)</span>
|
||||
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a>
|
||||
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="k">if</span> <span class="n">distance</span> <span class="o">></span> <span class="n">max_distance</span><span class="p">:</span>
|
||||
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="k">raise</span> <span class="n">OptimizeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Normalization distance </span><span class="si">{</span><span class="n">distance</span><span class="si">}</span><span class="s2"> exceeds max </span><span class="si">{</span><span class="n">max_distance</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a>
|
||||
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">replace_children</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">e</span><span class="p">:</span> <span class="n">distributive_law</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">dnf</span><span class="p">,</span> <span class="n">max_distance</span><span class="p">))</span>
|
||||
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="n">to_exp</span><span class="p">,</span> <span class="n">from_exp</span> <span class="o">=</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span><span class="p">)</span> <span class="k">if</span> <span class="n">dnf</span> <span class="k">else</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">And</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">)</span>
|
||||
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a>
|
||||
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">from_exp</span><span class="p">):</span>
|
||||
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">unnest_operands</span><span class="p">()</span>
|
||||
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a>
|
||||
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="n">from_func</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">and_</span> <span class="k">if</span> <span class="n">from_exp</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">or_</span>
|
||||
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="n">to_func</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">and_</span> <span class="k">if</span> <span class="n">to_exp</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">or_</span>
|
||||
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a>
|
||||
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">):</span>
|
||||
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">)))</span> <span class="o">></span> <span class="nb">len</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">))):</span>
|
||||
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">):</span>
|
||||
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">):</span>
|
||||
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a>
|
||||
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a>
|
||||
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a>
|
||||
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a><span class="k">def</span> <span class="nf">_distribute</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">):</span>
|
||||
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">):</span>
|
||||
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">replace_children</span><span class="p">(</span>
|
||||
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a> <span class="n">a</span><span class="p">,</span>
|
||||
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a> <span class="k">lambda</span> <span class="n">c</span><span class="p">:</span> <span class="n">to_func</span><span class="p">(</span>
|
||||
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a> <span class="n">uniq_sort</span><span class="p">(</span><span class="n">flatten</span><span class="p">(</span><span class="n">from_func</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">left</span><span class="p">))),</span>
|
||||
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a> <span class="n">uniq_sort</span><span class="p">(</span><span class="n">flatten</span><span class="p">(</span><span class="n">from_func</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">right</span><span class="p">))),</span>
|
||||
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a> <span class="p">),</span>
|
||||
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a> <span class="p">)</span>
|
||||
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a> <span class="n">a</span> <span class="o">=</span> <span class="n">to_func</span><span class="p">(</span>
|
||||
</span><span id="L-195"><a href="#L-195"><span class="linenos">195</span></a> <span class="n">uniq_sort</span><span class="p">(</span><span class="n">flatten</span><span class="p">(</span><span class="n">from_func</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">left</span><span class="p">))),</span>
|
||||
</span><span id="L-196"><a href="#L-196"><span class="linenos">196</span></a> <span class="n">uniq_sort</span><span class="p">(</span><span class="n">flatten</span><span class="p">(</span><span class="n">from_func</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">right</span><span class="p">))),</span>
|
||||
</span><span id="L-197"><a href="#L-197"><span class="linenos">197</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-198"><a href="#L-198"><span class="linenos">198</span></a> <span class="p">)</span>
|
||||
</span><span id="L-199"><a href="#L-199"><span class="linenos">199</span></a>
|
||||
</span><span id="L-200"><a href="#L-200"><span class="linenos">200</span></a> <span class="k">return</span> <span class="n">a</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
@ -304,7 +320,7 @@
|
|||
</span><span id="normalize-37"><a href="#normalize-37"><span class="linenos">37</span></a> <span class="n">original</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||||
</span><span id="normalize-38"><a href="#normalize-38"><span class="linenos">38</span></a>
|
||||
</span><span id="normalize-39"><a href="#normalize-39"><span class="linenos">39</span></a> <span class="n">node</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">rewrite_between</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="normalize-40"><a href="#normalize-40"><span class="linenos">40</span></a> <span class="n">distance</span> <span class="o">=</span> <span class="n">normalization_distance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">dnf</span><span class="o">=</span><span class="n">dnf</span><span class="p">)</span>
|
||||
</span><span id="normalize-40"><a href="#normalize-40"><span class="linenos">40</span></a> <span class="n">distance</span> <span class="o">=</span> <span class="n">normalization_distance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">dnf</span><span class="o">=</span><span class="n">dnf</span><span class="p">,</span> <span class="n">max_</span><span class="o">=</span><span class="n">max_distance</span><span class="p">)</span>
|
||||
</span><span id="normalize-41"><a href="#normalize-41"><span class="linenos">41</span></a>
|
||||
</span><span id="normalize-42"><a href="#normalize-42"><span class="linenos">42</span></a> <span class="k">if</span> <span class="n">distance</span> <span class="o">></span> <span class="n">max_distance</span><span class="p">:</span>
|
||||
</span><span id="normalize-43"><a href="#normalize-43"><span class="linenos">43</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
|
||||
|
@ -430,35 +446,43 @@ Default: False, i.e. we check if it's in Conjunctive Normal Form (CNF).</li>
|
|||
<div class="attr function">
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">normalization_distance</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">expression</span><span class="p">:</span> <span class="n"><a href="../expressions.html#Expression">sqlglot.expressions.Expression</a></span>, </span><span class="param"><span class="n">dnf</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span><span class="return-annotation">) -> <span class="nb">int</span>:</span></span>
|
||||
<span class="name">normalization_distance</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="../expressions.html#Expression">sqlglot.expressions.Expression</a></span>,</span><span class="param"> <span class="n">dnf</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param"> <span class="n">max_</span><span class="p">:</span> <span class="nb">float</span> <span class="o">=</span> <span class="n">inf</span></span><span class="return-annotation">) -> <span class="nb">int</span>:</span></span>
|
||||
|
||||
<label class="view-source-button" for="normalization_distance-view-source"><span>View Source</span></label>
|
||||
|
||||
</div>
|
||||
<a class="headerlink" href="#normalization_distance"></a>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="normalization_distance-89"><a href="#normalization_distance-89"><span class="linenos"> 89</span></a><span class="k">def</span> <span class="nf">normalization_distance</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span> <span class="n">dnf</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-></span> <span class="nb">int</span><span class="p">:</span>
|
||||
</span><span id="normalization_distance-90"><a href="#normalization_distance-90"><span class="linenos"> 90</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="normalization_distance-91"><a href="#normalization_distance-91"><span class="linenos"> 91</span></a><span class="sd"> The difference in the number of predicates between a given expression and its normalized form.</span>
|
||||
</span><span id="normalization_distance-92"><a href="#normalization_distance-92"><span class="linenos"> 92</span></a>
|
||||
</span><span id="normalization_distance-93"><a href="#normalization_distance-93"><span class="linenos"> 93</span></a><span class="sd"> This is used as an estimate of the cost of the conversion which is exponential in complexity.</span>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="normalization_distance-89"><a href="#normalization_distance-89"><span class="linenos"> 89</span></a><span class="k">def</span> <span class="nf">normalization_distance</span><span class="p">(</span>
|
||||
</span><span id="normalization_distance-90"><a href="#normalization_distance-90"><span class="linenos"> 90</span></a> <span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span> <span class="n">dnf</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">max_</span><span class="p">:</span> <span class="nb">float</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="s2">"inf"</span><span class="p">)</span>
|
||||
</span><span id="normalization_distance-91"><a href="#normalization_distance-91"><span class="linenos"> 91</span></a><span class="p">)</span> <span class="o">-></span> <span class="nb">int</span><span class="p">:</span>
|
||||
</span><span id="normalization_distance-92"><a href="#normalization_distance-92"><span class="linenos"> 92</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="normalization_distance-93"><a href="#normalization_distance-93"><span class="linenos"> 93</span></a><span class="sd"> The difference in the number of predicates between a given expression and its normalized form.</span>
|
||||
</span><span id="normalization_distance-94"><a href="#normalization_distance-94"><span class="linenos"> 94</span></a>
|
||||
</span><span id="normalization_distance-95"><a href="#normalization_distance-95"><span class="linenos"> 95</span></a><span class="sd"> Example:</span>
|
||||
</span><span id="normalization_distance-96"><a href="#normalization_distance-96"><span class="linenos"> 96</span></a><span class="sd"> >>> import sqlglot</span>
|
||||
</span><span id="normalization_distance-97"><a href="#normalization_distance-97"><span class="linenos"> 97</span></a><span class="sd"> >>> expression = sqlglot.parse_one("(a AND b) OR (c AND d)")</span>
|
||||
</span><span id="normalization_distance-98"><a href="#normalization_distance-98"><span class="linenos"> 98</span></a><span class="sd"> >>> normalization_distance(expression)</span>
|
||||
</span><span id="normalization_distance-99"><a href="#normalization_distance-99"><span class="linenos"> 99</span></a><span class="sd"> 4</span>
|
||||
</span><span id="normalization_distance-100"><a href="#normalization_distance-100"><span class="linenos">100</span></a>
|
||||
</span><span id="normalization_distance-101"><a href="#normalization_distance-101"><span class="linenos">101</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="normalization_distance-102"><a href="#normalization_distance-102"><span class="linenos">102</span></a><span class="sd"> expression: The expression to compute the normalization distance for.</span>
|
||||
</span><span id="normalization_distance-103"><a href="#normalization_distance-103"><span class="linenos">103</span></a><span class="sd"> dnf: Whether to check if the expression is in Disjunctive Normal Form (DNF).</span>
|
||||
</span><span id="normalization_distance-104"><a href="#normalization_distance-104"><span class="linenos">104</span></a><span class="sd"> Default: False, i.e. we check if it's in Conjunctive Normal Form (CNF).</span>
|
||||
</span><span id="normalization_distance-105"><a href="#normalization_distance-105"><span class="linenos">105</span></a>
|
||||
</span><span id="normalization_distance-106"><a href="#normalization_distance-106"><span class="linenos">106</span></a><span class="sd"> Returns:</span>
|
||||
</span><span id="normalization_distance-107"><a href="#normalization_distance-107"><span class="linenos">107</span></a><span class="sd"> The normalization distance.</span>
|
||||
</span><span id="normalization_distance-108"><a href="#normalization_distance-108"><span class="linenos">108</span></a><span class="sd"> """</span>
|
||||
</span><span id="normalization_distance-109"><a href="#normalization_distance-109"><span class="linenos">109</span></a> <span class="k">return</span> <span class="nb">sum</span><span class="p">(</span><span class="n">_predicate_lengths</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="p">))</span> <span class="o">-</span> <span class="p">(</span>
|
||||
</span><span id="normalization_distance-110"><a href="#normalization_distance-110"><span class="linenos">110</span></a> <span class="nb">sum</span><span class="p">(</span><span class="mi">1</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">))</span> <span class="o">+</span> <span class="mi">1</span>
|
||||
</span><span id="normalization_distance-111"><a href="#normalization_distance-111"><span class="linenos">111</span></a> <span class="p">)</span>
|
||||
</span><span id="normalization_distance-95"><a href="#normalization_distance-95"><span class="linenos"> 95</span></a><span class="sd"> This is used as an estimate of the cost of the conversion which is exponential in complexity.</span>
|
||||
</span><span id="normalization_distance-96"><a href="#normalization_distance-96"><span class="linenos"> 96</span></a>
|
||||
</span><span id="normalization_distance-97"><a href="#normalization_distance-97"><span class="linenos"> 97</span></a><span class="sd"> Example:</span>
|
||||
</span><span id="normalization_distance-98"><a href="#normalization_distance-98"><span class="linenos"> 98</span></a><span class="sd"> >>> import sqlglot</span>
|
||||
</span><span id="normalization_distance-99"><a href="#normalization_distance-99"><span class="linenos"> 99</span></a><span class="sd"> >>> expression = sqlglot.parse_one("(a AND b) OR (c AND d)")</span>
|
||||
</span><span id="normalization_distance-100"><a href="#normalization_distance-100"><span class="linenos">100</span></a><span class="sd"> >>> normalization_distance(expression)</span>
|
||||
</span><span id="normalization_distance-101"><a href="#normalization_distance-101"><span class="linenos">101</span></a><span class="sd"> 4</span>
|
||||
</span><span id="normalization_distance-102"><a href="#normalization_distance-102"><span class="linenos">102</span></a>
|
||||
</span><span id="normalization_distance-103"><a href="#normalization_distance-103"><span class="linenos">103</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="normalization_distance-104"><a href="#normalization_distance-104"><span class="linenos">104</span></a><span class="sd"> expression: The expression to compute the normalization distance for.</span>
|
||||
</span><span id="normalization_distance-105"><a href="#normalization_distance-105"><span class="linenos">105</span></a><span class="sd"> dnf: Whether to check if the expression is in Disjunctive Normal Form (DNF).</span>
|
||||
</span><span id="normalization_distance-106"><a href="#normalization_distance-106"><span class="linenos">106</span></a><span class="sd"> Default: False, i.e. we check if it's in Conjunctive Normal Form (CNF).</span>
|
||||
</span><span id="normalization_distance-107"><a href="#normalization_distance-107"><span class="linenos">107</span></a><span class="sd"> max_: stop early if count exceeds this.</span>
|
||||
</span><span id="normalization_distance-108"><a href="#normalization_distance-108"><span class="linenos">108</span></a>
|
||||
</span><span id="normalization_distance-109"><a href="#normalization_distance-109"><span class="linenos">109</span></a><span class="sd"> Returns:</span>
|
||||
</span><span id="normalization_distance-110"><a href="#normalization_distance-110"><span class="linenos">110</span></a><span class="sd"> The normalization distance.</span>
|
||||
</span><span id="normalization_distance-111"><a href="#normalization_distance-111"><span class="linenos">111</span></a><span class="sd"> """</span>
|
||||
</span><span id="normalization_distance-112"><a href="#normalization_distance-112"><span class="linenos">112</span></a> <span class="n">total</span> <span class="o">=</span> <span class="o">-</span><span class="p">(</span><span class="nb">sum</span><span class="p">(</span><span class="mi">1</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">))</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
|
||||
</span><span id="normalization_distance-113"><a href="#normalization_distance-113"><span class="linenos">113</span></a>
|
||||
</span><span id="normalization_distance-114"><a href="#normalization_distance-114"><span class="linenos">114</span></a> <span class="k">for</span> <span class="n">length</span> <span class="ow">in</span> <span class="n">_predicate_lengths</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="p">,</span> <span class="n">max_</span><span class="p">):</span>
|
||||
</span><span id="normalization_distance-115"><a href="#normalization_distance-115"><span class="linenos">115</span></a> <span class="n">total</span> <span class="o">+=</span> <span class="n">length</span>
|
||||
</span><span id="normalization_distance-116"><a href="#normalization_distance-116"><span class="linenos">116</span></a> <span class="k">if</span> <span class="n">total</span> <span class="o">></span> <span class="n">max_</span><span class="p">:</span>
|
||||
</span><span id="normalization_distance-117"><a href="#normalization_distance-117"><span class="linenos">117</span></a> <span class="k">return</span> <span class="n">total</span>
|
||||
</span><span id="normalization_distance-118"><a href="#normalization_distance-118"><span class="linenos">118</span></a>
|
||||
</span><span id="normalization_distance-119"><a href="#normalization_distance-119"><span class="linenos">119</span></a> <span class="k">return</span> <span class="n">total</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
@ -484,6 +508,7 @@ Default: False, i.e. we check if it's in Conjunctive Normal Form (CNF).</li>
|
|||
<li><strong>expression:</strong> The expression to compute the normalization distance for.</li>
|
||||
<li><strong>dnf:</strong> Whether to check if the expression is in Disjunctive Normal Form (DNF).
|
||||
Default: False, i.e. we check if it's in Conjunctive Normal Form (CNF).</li>
|
||||
<li><strong>max_:</strong> stop early if count exceeds this.</li>
|
||||
</ul>
|
||||
|
||||
<h6 id="returns">Returns:</h6>
|
||||
|
@ -506,38 +531,38 @@ Default: False, i.e. we check if it's in Conjunctive Normal Form (CNF).</li>
|
|||
|
||||
</div>
|
||||
<a class="headerlink" href="#distributive_law"></a>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="distributive_law-134"><a href="#distributive_law-134"><span class="linenos">134</span></a><span class="k">def</span> <span class="nf">distributive_law</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="p">,</span> <span class="n">max_distance</span><span class="p">):</span>
|
||||
</span><span id="distributive_law-135"><a href="#distributive_law-135"><span class="linenos">135</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="distributive_law-136"><a href="#distributive_law-136"><span class="linenos">136</span></a><span class="sd"> x OR (y AND z) -> (x OR y) AND (x OR z)</span>
|
||||
</span><span id="distributive_law-137"><a href="#distributive_law-137"><span class="linenos">137</span></a><span class="sd"> (x AND y) OR (y AND z) -> (x OR y) AND (x OR z) AND (y OR y) AND (y OR z)</span>
|
||||
</span><span id="distributive_law-138"><a href="#distributive_law-138"><span class="linenos">138</span></a><span class="sd"> """</span>
|
||||
</span><span id="distributive_law-139"><a href="#distributive_law-139"><span class="linenos">139</span></a> <span class="k">if</span> <span class="n">normalized</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="o">=</span><span class="n">dnf</span><span class="p">):</span>
|
||||
</span><span id="distributive_law-140"><a href="#distributive_law-140"><span class="linenos">140</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span><span id="distributive_law-141"><a href="#distributive_law-141"><span class="linenos">141</span></a>
|
||||
</span><span id="distributive_law-142"><a href="#distributive_law-142"><span class="linenos">142</span></a> <span class="n">distance</span> <span class="o">=</span> <span class="n">normalization_distance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="o">=</span><span class="n">dnf</span><span class="p">)</span>
|
||||
</span><span id="distributive_law-143"><a href="#distributive_law-143"><span class="linenos">143</span></a>
|
||||
</span><span id="distributive_law-144"><a href="#distributive_law-144"><span class="linenos">144</span></a> <span class="k">if</span> <span class="n">distance</span> <span class="o">></span> <span class="n">max_distance</span><span class="p">:</span>
|
||||
</span><span id="distributive_law-145"><a href="#distributive_law-145"><span class="linenos">145</span></a> <span class="k">raise</span> <span class="n">OptimizeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Normalization distance </span><span class="si">{</span><span class="n">distance</span><span class="si">}</span><span class="s2"> exceeds max </span><span class="si">{</span><span class="n">max_distance</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||
</span><span id="distributive_law-146"><a href="#distributive_law-146"><span class="linenos">146</span></a>
|
||||
</span><span id="distributive_law-147"><a href="#distributive_law-147"><span class="linenos">147</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">replace_children</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">e</span><span class="p">:</span> <span class="n">distributive_law</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">dnf</span><span class="p">,</span> <span class="n">max_distance</span><span class="p">))</span>
|
||||
</span><span id="distributive_law-148"><a href="#distributive_law-148"><span class="linenos">148</span></a> <span class="n">to_exp</span><span class="p">,</span> <span class="n">from_exp</span> <span class="o">=</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span><span class="p">)</span> <span class="k">if</span> <span class="n">dnf</span> <span class="k">else</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">And</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">)</span>
|
||||
</span><span id="distributive_law-149"><a href="#distributive_law-149"><span class="linenos">149</span></a>
|
||||
</span><span id="distributive_law-150"><a href="#distributive_law-150"><span class="linenos">150</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">from_exp</span><span class="p">):</span>
|
||||
</span><span id="distributive_law-151"><a href="#distributive_law-151"><span class="linenos">151</span></a> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">unnest_operands</span><span class="p">()</span>
|
||||
</span><span id="distributive_law-152"><a href="#distributive_law-152"><span class="linenos">152</span></a>
|
||||
</span><span id="distributive_law-153"><a href="#distributive_law-153"><span class="linenos">153</span></a> <span class="n">from_func</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">and_</span> <span class="k">if</span> <span class="n">from_exp</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">or_</span>
|
||||
</span><span id="distributive_law-154"><a href="#distributive_law-154"><span class="linenos">154</span></a> <span class="n">to_func</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">and_</span> <span class="k">if</span> <span class="n">to_exp</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">or_</span>
|
||||
</span><span id="distributive_law-155"><a href="#distributive_law-155"><span class="linenos">155</span></a>
|
||||
</span><span id="distributive_law-156"><a href="#distributive_law-156"><span class="linenos">156</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">):</span>
|
||||
</span><span id="distributive_law-157"><a href="#distributive_law-157"><span class="linenos">157</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">)))</span> <span class="o">></span> <span class="nb">len</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">))):</span>
|
||||
</span><span id="distributive_law-158"><a href="#distributive_law-158"><span class="linenos">158</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="distributive_law-159"><a href="#distributive_law-159"><span class="linenos">159</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="distributive_law-160"><a href="#distributive_law-160"><span class="linenos">160</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">):</span>
|
||||
</span><span id="distributive_law-161"><a href="#distributive_law-161"><span class="linenos">161</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="distributive_law-162"><a href="#distributive_law-162"><span class="linenos">162</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">):</span>
|
||||
</span><span id="distributive_law-163"><a href="#distributive_law-163"><span class="linenos">163</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="distributive_law-164"><a href="#distributive_law-164"><span class="linenos">164</span></a>
|
||||
</span><span id="distributive_law-165"><a href="#distributive_law-165"><span class="linenos">165</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="distributive_law-150"><a href="#distributive_law-150"><span class="linenos">150</span></a><span class="k">def</span> <span class="nf">distributive_law</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="p">,</span> <span class="n">max_distance</span><span class="p">):</span>
|
||||
</span><span id="distributive_law-151"><a href="#distributive_law-151"><span class="linenos">151</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="distributive_law-152"><a href="#distributive_law-152"><span class="linenos">152</span></a><span class="sd"> x OR (y AND z) -> (x OR y) AND (x OR z)</span>
|
||||
</span><span id="distributive_law-153"><a href="#distributive_law-153"><span class="linenos">153</span></a><span class="sd"> (x AND y) OR (y AND z) -> (x OR y) AND (x OR z) AND (y OR y) AND (y OR z)</span>
|
||||
</span><span id="distributive_law-154"><a href="#distributive_law-154"><span class="linenos">154</span></a><span class="sd"> """</span>
|
||||
</span><span id="distributive_law-155"><a href="#distributive_law-155"><span class="linenos">155</span></a> <span class="k">if</span> <span class="n">normalized</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="o">=</span><span class="n">dnf</span><span class="p">):</span>
|
||||
</span><span id="distributive_law-156"><a href="#distributive_law-156"><span class="linenos">156</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span><span id="distributive_law-157"><a href="#distributive_law-157"><span class="linenos">157</span></a>
|
||||
</span><span id="distributive_law-158"><a href="#distributive_law-158"><span class="linenos">158</span></a> <span class="n">distance</span> <span class="o">=</span> <span class="n">normalization_distance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dnf</span><span class="o">=</span><span class="n">dnf</span><span class="p">,</span> <span class="n">max_</span><span class="o">=</span><span class="n">max_distance</span><span class="p">)</span>
|
||||
</span><span id="distributive_law-159"><a href="#distributive_law-159"><span class="linenos">159</span></a>
|
||||
</span><span id="distributive_law-160"><a href="#distributive_law-160"><span class="linenos">160</span></a> <span class="k">if</span> <span class="n">distance</span> <span class="o">></span> <span class="n">max_distance</span><span class="p">:</span>
|
||||
</span><span id="distributive_law-161"><a href="#distributive_law-161"><span class="linenos">161</span></a> <span class="k">raise</span> <span class="n">OptimizeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Normalization distance </span><span class="si">{</span><span class="n">distance</span><span class="si">}</span><span class="s2"> exceeds max </span><span class="si">{</span><span class="n">max_distance</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||
</span><span id="distributive_law-162"><a href="#distributive_law-162"><span class="linenos">162</span></a>
|
||||
</span><span id="distributive_law-163"><a href="#distributive_law-163"><span class="linenos">163</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">replace_children</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">e</span><span class="p">:</span> <span class="n">distributive_law</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">dnf</span><span class="p">,</span> <span class="n">max_distance</span><span class="p">))</span>
|
||||
</span><span id="distributive_law-164"><a href="#distributive_law-164"><span class="linenos">164</span></a> <span class="n">to_exp</span><span class="p">,</span> <span class="n">from_exp</span> <span class="o">=</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span><span class="p">)</span> <span class="k">if</span> <span class="n">dnf</span> <span class="k">else</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">And</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">)</span>
|
||||
</span><span id="distributive_law-165"><a href="#distributive_law-165"><span class="linenos">165</span></a>
|
||||
</span><span id="distributive_law-166"><a href="#distributive_law-166"><span class="linenos">166</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">from_exp</span><span class="p">):</span>
|
||||
</span><span id="distributive_law-167"><a href="#distributive_law-167"><span class="linenos">167</span></a> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">unnest_operands</span><span class="p">()</span>
|
||||
</span><span id="distributive_law-168"><a href="#distributive_law-168"><span class="linenos">168</span></a>
|
||||
</span><span id="distributive_law-169"><a href="#distributive_law-169"><span class="linenos">169</span></a> <span class="n">from_func</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">and_</span> <span class="k">if</span> <span class="n">from_exp</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">or_</span>
|
||||
</span><span id="distributive_law-170"><a href="#distributive_law-170"><span class="linenos">170</span></a> <span class="n">to_func</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">and_</span> <span class="k">if</span> <span class="n">to_exp</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">or_</span>
|
||||
</span><span id="distributive_law-171"><a href="#distributive_law-171"><span class="linenos">171</span></a>
|
||||
</span><span id="distributive_law-172"><a href="#distributive_law-172"><span class="linenos">172</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">):</span>
|
||||
</span><span id="distributive_law-173"><a href="#distributive_law-173"><span class="linenos">173</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">)))</span> <span class="o">></span> <span class="nb">len</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Connector</span><span class="p">))):</span>
|
||||
</span><span id="distributive_law-174"><a href="#distributive_law-174"><span class="linenos">174</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="distributive_law-175"><a href="#distributive_law-175"><span class="linenos">175</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="distributive_law-176"><a href="#distributive_law-176"><span class="linenos">176</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">):</span>
|
||||
</span><span id="distributive_law-177"><a href="#distributive_law-177"><span class="linenos">177</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="distributive_law-178"><a href="#distributive_law-178"><span class="linenos">178</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">to_exp</span><span class="p">):</span>
|
||||
</span><span id="distributive_law-179"><a href="#distributive_law-179"><span class="linenos">179</span></a> <span class="k">return</span> <span class="n">_distribute</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">from_func</span><span class="p">,</span> <span class="n">to_func</span><span class="p">)</span>
|
||||
</span><span id="distributive_law-180"><a href="#distributive_law-180"><span class="linenos">180</span></a>
|
||||
</span><span id="distributive_law-181"><a href="#distributive_law-181"><span class="linenos">181</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
|
|
@ -64,96 +64,95 @@
|
|||
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="kn">import</span> <span class="nn">inspect</span>
|
||||
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="kn">import</span> <span class="nn">typing</span> <span class="k">as</span> <span class="nn">t</span>
|
||||
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a>
|
||||
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="kn">import</span> <span class="nn">sqlglot</span>
|
||||
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="kn">from</span> <span class="nn">sqlglot</span> <span class="kn">import</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">exp</span>
|
||||
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="kn">from</span> <span class="nn">sqlglot.dialects.dialect</span> <span class="kn">import</span> <span class="n">DialectType</span>
|
||||
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.annotate_types</span> <span class="kn">import</span> <span class="n">annotate_types</span>
|
||||
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.canonicalize</span> <span class="kn">import</span> <span class="n">canonicalize</span>
|
||||
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.eliminate_ctes</span> <span class="kn">import</span> <span class="n">eliminate_ctes</span>
|
||||
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.eliminate_joins</span> <span class="kn">import</span> <span class="n">eliminate_joins</span>
|
||||
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.eliminate_subqueries</span> <span class="kn">import</span> <span class="n">eliminate_subqueries</span>
|
||||
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.merge_subqueries</span> <span class="kn">import</span> <span class="n">merge_subqueries</span>
|
||||
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.normalize</span> <span class="kn">import</span> <span class="n">normalize</span>
|
||||
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.optimize_joins</span> <span class="kn">import</span> <span class="n">optimize_joins</span>
|
||||
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.pushdown_predicates</span> <span class="kn">import</span> <span class="n">pushdown_predicates</span>
|
||||
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.pushdown_projections</span> <span class="kn">import</span> <span class="n">pushdown_projections</span>
|
||||
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.qualify</span> <span class="kn">import</span> <span class="n">qualify</span>
|
||||
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.qualify_columns</span> <span class="kn">import</span> <span class="n">quote_identifiers</span>
|
||||
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.simplify</span> <span class="kn">import</span> <span class="n">simplify</span>
|
||||
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.unnest_subqueries</span> <span class="kn">import</span> <span class="n">unnest_subqueries</span>
|
||||
</span><span id="L-23"><a href="#L-23"><span class="linenos">23</span></a><span class="kn">from</span> <span class="nn">sqlglot.schema</span> <span class="kn">import</span> <span class="n">ensure_schema</span>
|
||||
</span><span id="L-24"><a href="#L-24"><span class="linenos">24</span></a>
|
||||
</span><span id="L-25"><a href="#L-25"><span class="linenos">25</span></a><span class="n">RULES</span> <span class="o">=</span> <span class="p">(</span>
|
||||
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a> <span class="n">qualify</span><span class="p">,</span>
|
||||
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a> <span class="n">pushdown_projections</span><span class="p">,</span>
|
||||
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a> <span class="n">normalize</span><span class="p">,</span>
|
||||
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a> <span class="n">unnest_subqueries</span><span class="p">,</span>
|
||||
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a> <span class="n">pushdown_predicates</span><span class="p">,</span>
|
||||
</span><span id="L-31"><a href="#L-31"><span class="linenos">31</span></a> <span class="n">optimize_joins</span><span class="p">,</span>
|
||||
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a> <span class="n">eliminate_subqueries</span><span class="p">,</span>
|
||||
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a> <span class="n">merge_subqueries</span><span class="p">,</span>
|
||||
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a> <span class="n">eliminate_joins</span><span class="p">,</span>
|
||||
</span><span id="L-35"><a href="#L-35"><span class="linenos">35</span></a> <span class="n">eliminate_ctes</span><span class="p">,</span>
|
||||
</span><span id="L-36"><a href="#L-36"><span class="linenos">36</span></a> <span class="n">quote_identifiers</span><span class="p">,</span>
|
||||
</span><span id="L-37"><a href="#L-37"><span class="linenos">37</span></a> <span class="n">annotate_types</span><span class="p">,</span>
|
||||
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a> <span class="n">canonicalize</span><span class="p">,</span>
|
||||
</span><span id="L-39"><a href="#L-39"><span class="linenos">39</span></a> <span class="n">simplify</span><span class="p">,</span>
|
||||
</span><span id="L-40"><a href="#L-40"><span class="linenos">40</span></a><span class="p">)</span>
|
||||
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="kn">from</span> <span class="nn">sqlglot</span> <span class="kn">import</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">exp</span>
|
||||
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="kn">from</span> <span class="nn">sqlglot.dialects.dialect</span> <span class="kn">import</span> <span class="n">DialectType</span>
|
||||
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.annotate_types</span> <span class="kn">import</span> <span class="n">annotate_types</span>
|
||||
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.canonicalize</span> <span class="kn">import</span> <span class="n">canonicalize</span>
|
||||
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.eliminate_ctes</span> <span class="kn">import</span> <span class="n">eliminate_ctes</span>
|
||||
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.eliminate_joins</span> <span class="kn">import</span> <span class="n">eliminate_joins</span>
|
||||
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.eliminate_subqueries</span> <span class="kn">import</span> <span class="n">eliminate_subqueries</span>
|
||||
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.merge_subqueries</span> <span class="kn">import</span> <span class="n">merge_subqueries</span>
|
||||
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.normalize</span> <span class="kn">import</span> <span class="n">normalize</span>
|
||||
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.optimize_joins</span> <span class="kn">import</span> <span class="n">optimize_joins</span>
|
||||
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.pushdown_predicates</span> <span class="kn">import</span> <span class="n">pushdown_predicates</span>
|
||||
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.pushdown_projections</span> <span class="kn">import</span> <span class="n">pushdown_projections</span>
|
||||
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.qualify</span> <span class="kn">import</span> <span class="n">qualify</span>
|
||||
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.qualify_columns</span> <span class="kn">import</span> <span class="n">quote_identifiers</span>
|
||||
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.simplify</span> <span class="kn">import</span> <span class="n">simplify</span>
|
||||
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.unnest_subqueries</span> <span class="kn">import</span> <span class="n">unnest_subqueries</span>
|
||||
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a><span class="kn">from</span> <span class="nn">sqlglot.schema</span> <span class="kn">import</span> <span class="n">ensure_schema</span>
|
||||
</span><span id="L-23"><a href="#L-23"><span class="linenos">23</span></a>
|
||||
</span><span id="L-24"><a href="#L-24"><span class="linenos">24</span></a><span class="n">RULES</span> <span class="o">=</span> <span class="p">(</span>
|
||||
</span><span id="L-25"><a href="#L-25"><span class="linenos">25</span></a> <span class="n">qualify</span><span class="p">,</span>
|
||||
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a> <span class="n">pushdown_projections</span><span class="p">,</span>
|
||||
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a> <span class="n">normalize</span><span class="p">,</span>
|
||||
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a> <span class="n">unnest_subqueries</span><span class="p">,</span>
|
||||
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a> <span class="n">pushdown_predicates</span><span class="p">,</span>
|
||||
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a> <span class="n">optimize_joins</span><span class="p">,</span>
|
||||
</span><span id="L-31"><a href="#L-31"><span class="linenos">31</span></a> <span class="n">eliminate_subqueries</span><span class="p">,</span>
|
||||
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a> <span class="n">merge_subqueries</span><span class="p">,</span>
|
||||
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a> <span class="n">eliminate_joins</span><span class="p">,</span>
|
||||
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a> <span class="n">eliminate_ctes</span><span class="p">,</span>
|
||||
</span><span id="L-35"><a href="#L-35"><span class="linenos">35</span></a> <span class="n">quote_identifiers</span><span class="p">,</span>
|
||||
</span><span id="L-36"><a href="#L-36"><span class="linenos">36</span></a> <span class="n">annotate_types</span><span class="p">,</span>
|
||||
</span><span id="L-37"><a href="#L-37"><span class="linenos">37</span></a> <span class="n">canonicalize</span><span class="p">,</span>
|
||||
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a> <span class="n">simplify</span><span class="p">,</span>
|
||||
</span><span id="L-39"><a href="#L-39"><span class="linenos">39</span></a><span class="p">)</span>
|
||||
</span><span id="L-40"><a href="#L-40"><span class="linenos">40</span></a>
|
||||
</span><span id="L-41"><a href="#L-41"><span class="linenos">41</span></a>
|
||||
</span><span id="L-42"><a href="#L-42"><span class="linenos">42</span></a>
|
||||
</span><span id="L-43"><a href="#L-43"><span class="linenos">43</span></a><span class="k">def</span> <span class="nf">optimize</span><span class="p">(</span>
|
||||
</span><span id="L-44"><a href="#L-44"><span class="linenos">44</span></a> <span class="n">expression</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span>
|
||||
</span><span id="L-45"><a href="#L-45"><span class="linenos">45</span></a> <span class="n">schema</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span> <span class="o">|</span> <span class="n">Schema</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="L-46"><a href="#L-46"><span class="linenos">46</span></a> <span class="n">db</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="L-47"><a href="#L-47"><span class="linenos">47</span></a> <span class="n">catalog</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="L-48"><a href="#L-48"><span class="linenos">48</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="L-49"><a href="#L-49"><span class="linenos">49</span></a> <span class="n">rules</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">]</span> <span class="o">=</span> <span class="n">RULES</span><span class="p">,</span>
|
||||
</span><span id="L-50"><a href="#L-50"><span class="linenos">50</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
|
||||
</span><span id="L-51"><a href="#L-51"><span class="linenos">51</span></a><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
||||
</span><span id="L-52"><a href="#L-52"><span class="linenos">52</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-53"><a href="#L-53"><span class="linenos">53</span></a><span class="sd"> Rewrite a sqlglot AST into an optimized form.</span>
|
||||
</span><span id="L-54"><a href="#L-54"><span class="linenos">54</span></a>
|
||||
</span><span id="L-55"><a href="#L-55"><span class="linenos">55</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="L-56"><a href="#L-56"><span class="linenos">56</span></a><span class="sd"> expression: expression to optimize</span>
|
||||
</span><span id="L-57"><a href="#L-57"><span class="linenos">57</span></a><span class="sd"> schema: database schema.</span>
|
||||
</span><span id="L-58"><a href="#L-58"><span class="linenos">58</span></a><span class="sd"> This can either be an instance of `sqlglot.optimizer.Schema` or a mapping in one of</span>
|
||||
</span><span id="L-59"><a href="#L-59"><span class="linenos">59</span></a><span class="sd"> the following forms:</span>
|
||||
</span><span id="L-60"><a href="#L-60"><span class="linenos">60</span></a><span class="sd"> 1. {table: {col: type}}</span>
|
||||
</span><span id="L-61"><a href="#L-61"><span class="linenos">61</span></a><span class="sd"> 2. {db: {table: {col: type}}}</span>
|
||||
</span><span id="L-62"><a href="#L-62"><span class="linenos">62</span></a><span class="sd"> 3. {catalog: {db: {table: {col: type}}}}</span>
|
||||
</span><span id="L-63"><a href="#L-63"><span class="linenos">63</span></a><span class="sd"> If no schema is provided then the default schema defined at `sqlgot.schema` will be used</span>
|
||||
</span><span id="L-64"><a href="#L-64"><span class="linenos">64</span></a><span class="sd"> db: specify the default database, as might be set by a `USE DATABASE db` statement</span>
|
||||
</span><span id="L-65"><a href="#L-65"><span class="linenos">65</span></a><span class="sd"> catalog: specify the default catalog, as might be set by a `USE CATALOG c` statement</span>
|
||||
</span><span id="L-66"><a href="#L-66"><span class="linenos">66</span></a><span class="sd"> dialect: The dialect to parse the sql string.</span>
|
||||
</span><span id="L-67"><a href="#L-67"><span class="linenos">67</span></a><span class="sd"> rules: sequence of optimizer rules to use.</span>
|
||||
</span><span id="L-68"><a href="#L-68"><span class="linenos">68</span></a><span class="sd"> Many of the rules require tables and columns to be qualified.</span>
|
||||
</span><span id="L-69"><a href="#L-69"><span class="linenos">69</span></a><span class="sd"> Do not remove `qualify` from the sequence of rules unless you know what you're doing!</span>
|
||||
</span><span id="L-70"><a href="#L-70"><span class="linenos">70</span></a><span class="sd"> **kwargs: If a rule has a keyword argument with a same name in **kwargs, it will be passed in.</span>
|
||||
</span><span id="L-71"><a href="#L-71"><span class="linenos">71</span></a>
|
||||
</span><span id="L-72"><a href="#L-72"><span class="linenos">72</span></a><span class="sd"> Returns:</span>
|
||||
</span><span id="L-73"><a href="#L-73"><span class="linenos">73</span></a><span class="sd"> The optimized expression.</span>
|
||||
</span><span id="L-74"><a href="#L-74"><span class="linenos">74</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-75"><a href="#L-75"><span class="linenos">75</span></a> <span class="n">schema</span> <span class="o">=</span> <span class="n">ensure_schema</span><span class="p">(</span><span class="n">schema</span> <span class="ow">or</span> <span class="n">sqlglot</span><span class="o">.</span><span class="n">schema</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
|
||||
</span><span id="L-76"><a href="#L-76"><span class="linenos">76</span></a> <span class="n">possible_kwargs</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="L-77"><a href="#L-77"><span class="linenos">77</span></a> <span class="s2">"db"</span><span class="p">:</span> <span class="n">db</span><span class="p">,</span>
|
||||
</span><span id="L-78"><a href="#L-78"><span class="linenos">78</span></a> <span class="s2">"catalog"</span><span class="p">:</span> <span class="n">catalog</span><span class="p">,</span>
|
||||
</span><span id="L-79"><a href="#L-79"><span class="linenos">79</span></a> <span class="s2">"schema"</span><span class="p">:</span> <span class="n">schema</span><span class="p">,</span>
|
||||
</span><span id="L-80"><a href="#L-80"><span class="linenos">80</span></a> <span class="s2">"dialect"</span><span class="p">:</span> <span class="n">dialect</span><span class="p">,</span>
|
||||
</span><span id="L-81"><a href="#L-81"><span class="linenos">81</span></a> <span class="s2">"isolate_tables"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="c1"># needed for other optimizations to perform well</span>
|
||||
</span><span id="L-82"><a href="#L-82"><span class="linenos">82</span></a> <span class="s2">"quote_identifiers"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-83"><a href="#L-83"><span class="linenos">83</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
|
||||
</span><span id="L-84"><a href="#L-84"><span class="linenos">84</span></a> <span class="p">}</span>
|
||||
</span><span id="L-85"><a href="#L-85"><span class="linenos">85</span></a>
|
||||
</span><span id="L-86"><a href="#L-86"><span class="linenos">86</span></a> <span class="n">optimized</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">maybe_parse</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="L-87"><a href="#L-87"><span class="linenos">87</span></a> <span class="k">for</span> <span class="n">rule</span> <span class="ow">in</span> <span class="n">rules</span><span class="p">:</span>
|
||||
</span><span id="L-88"><a href="#L-88"><span class="linenos">88</span></a> <span class="c1"># Find any additional rule parameters, beyond `expression`</span>
|
||||
</span><span id="L-89"><a href="#L-89"><span class="linenos">89</span></a> <span class="n">rule_params</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getfullargspec</span><span class="p">(</span><span class="n">rule</span><span class="p">)</span><span class="o">.</span><span class="n">args</span>
|
||||
</span><span id="L-90"><a href="#L-90"><span class="linenos">90</span></a> <span class="n">rule_kwargs</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="L-91"><a href="#L-91"><span class="linenos">91</span></a> <span class="n">param</span><span class="p">:</span> <span class="n">possible_kwargs</span><span class="p">[</span><span class="n">param</span><span class="p">]</span> <span class="k">for</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">rule_params</span> <span class="k">if</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">possible_kwargs</span>
|
||||
</span><span id="L-92"><a href="#L-92"><span class="linenos">92</span></a> <span class="p">}</span>
|
||||
</span><span id="L-93"><a href="#L-93"><span class="linenos">93</span></a> <span class="n">optimized</span> <span class="o">=</span> <span class="n">rule</span><span class="p">(</span><span class="n">optimized</span><span class="p">,</span> <span class="o">**</span><span class="n">rule_kwargs</span><span class="p">)</span>
|
||||
</span><span id="L-94"><a href="#L-94"><span class="linenos">94</span></a>
|
||||
</span><span id="L-95"><a href="#L-95"><span class="linenos">95</span></a> <span class="k">return</span> <span class="n">optimized</span>
|
||||
</span><span id="L-42"><a href="#L-42"><span class="linenos">42</span></a><span class="k">def</span> <span class="nf">optimize</span><span class="p">(</span>
|
||||
</span><span id="L-43"><a href="#L-43"><span class="linenos">43</span></a> <span class="n">expression</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span>
|
||||
</span><span id="L-44"><a href="#L-44"><span class="linenos">44</span></a> <span class="n">schema</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span> <span class="o">|</span> <span class="n">Schema</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="L-45"><a href="#L-45"><span class="linenos">45</span></a> <span class="n">db</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="L-46"><a href="#L-46"><span class="linenos">46</span></a> <span class="n">catalog</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="L-47"><a href="#L-47"><span class="linenos">47</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="L-48"><a href="#L-48"><span class="linenos">48</span></a> <span class="n">rules</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">]</span> <span class="o">=</span> <span class="n">RULES</span><span class="p">,</span>
|
||||
</span><span id="L-49"><a href="#L-49"><span class="linenos">49</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
|
||||
</span><span id="L-50"><a href="#L-50"><span class="linenos">50</span></a><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
||||
</span><span id="L-51"><a href="#L-51"><span class="linenos">51</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-52"><a href="#L-52"><span class="linenos">52</span></a><span class="sd"> Rewrite a sqlglot AST into an optimized form.</span>
|
||||
</span><span id="L-53"><a href="#L-53"><span class="linenos">53</span></a>
|
||||
</span><span id="L-54"><a href="#L-54"><span class="linenos">54</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="L-55"><a href="#L-55"><span class="linenos">55</span></a><span class="sd"> expression: expression to optimize</span>
|
||||
</span><span id="L-56"><a href="#L-56"><span class="linenos">56</span></a><span class="sd"> schema: database schema.</span>
|
||||
</span><span id="L-57"><a href="#L-57"><span class="linenos">57</span></a><span class="sd"> This can either be an instance of `sqlglot.optimizer.Schema` or a mapping in one of</span>
|
||||
</span><span id="L-58"><a href="#L-58"><span class="linenos">58</span></a><span class="sd"> the following forms:</span>
|
||||
</span><span id="L-59"><a href="#L-59"><span class="linenos">59</span></a><span class="sd"> 1. {table: {col: type}}</span>
|
||||
</span><span id="L-60"><a href="#L-60"><span class="linenos">60</span></a><span class="sd"> 2. {db: {table: {col: type}}}</span>
|
||||
</span><span id="L-61"><a href="#L-61"><span class="linenos">61</span></a><span class="sd"> 3. {catalog: {db: {table: {col: type}}}}</span>
|
||||
</span><span id="L-62"><a href="#L-62"><span class="linenos">62</span></a><span class="sd"> If no schema is provided then the default schema defined at `sqlgot.schema` will be used</span>
|
||||
</span><span id="L-63"><a href="#L-63"><span class="linenos">63</span></a><span class="sd"> db: specify the default database, as might be set by a `USE DATABASE db` statement</span>
|
||||
</span><span id="L-64"><a href="#L-64"><span class="linenos">64</span></a><span class="sd"> catalog: specify the default catalog, as might be set by a `USE CATALOG c` statement</span>
|
||||
</span><span id="L-65"><a href="#L-65"><span class="linenos">65</span></a><span class="sd"> dialect: The dialect to parse the sql string.</span>
|
||||
</span><span id="L-66"><a href="#L-66"><span class="linenos">66</span></a><span class="sd"> rules: sequence of optimizer rules to use.</span>
|
||||
</span><span id="L-67"><a href="#L-67"><span class="linenos">67</span></a><span class="sd"> Many of the rules require tables and columns to be qualified.</span>
|
||||
</span><span id="L-68"><a href="#L-68"><span class="linenos">68</span></a><span class="sd"> Do not remove `qualify` from the sequence of rules unless you know what you're doing!</span>
|
||||
</span><span id="L-69"><a href="#L-69"><span class="linenos">69</span></a><span class="sd"> **kwargs: If a rule has a keyword argument with a same name in **kwargs, it will be passed in.</span>
|
||||
</span><span id="L-70"><a href="#L-70"><span class="linenos">70</span></a>
|
||||
</span><span id="L-71"><a href="#L-71"><span class="linenos">71</span></a><span class="sd"> Returns:</span>
|
||||
</span><span id="L-72"><a href="#L-72"><span class="linenos">72</span></a><span class="sd"> The optimized expression.</span>
|
||||
</span><span id="L-73"><a href="#L-73"><span class="linenos">73</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-74"><a href="#L-74"><span class="linenos">74</span></a> <span class="n">schema</span> <span class="o">=</span> <span class="n">ensure_schema</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
|
||||
</span><span id="L-75"><a href="#L-75"><span class="linenos">75</span></a> <span class="n">possible_kwargs</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="L-76"><a href="#L-76"><span class="linenos">76</span></a> <span class="s2">"db"</span><span class="p">:</span> <span class="n">db</span><span class="p">,</span>
|
||||
</span><span id="L-77"><a href="#L-77"><span class="linenos">77</span></a> <span class="s2">"catalog"</span><span class="p">:</span> <span class="n">catalog</span><span class="p">,</span>
|
||||
</span><span id="L-78"><a href="#L-78"><span class="linenos">78</span></a> <span class="s2">"schema"</span><span class="p">:</span> <span class="n">schema</span><span class="p">,</span>
|
||||
</span><span id="L-79"><a href="#L-79"><span class="linenos">79</span></a> <span class="s2">"dialect"</span><span class="p">:</span> <span class="n">dialect</span><span class="p">,</span>
|
||||
</span><span id="L-80"><a href="#L-80"><span class="linenos">80</span></a> <span class="s2">"isolate_tables"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="c1"># needed for other optimizations to perform well</span>
|
||||
</span><span id="L-81"><a href="#L-81"><span class="linenos">81</span></a> <span class="s2">"quote_identifiers"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-82"><a href="#L-82"><span class="linenos">82</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
|
||||
</span><span id="L-83"><a href="#L-83"><span class="linenos">83</span></a> <span class="p">}</span>
|
||||
</span><span id="L-84"><a href="#L-84"><span class="linenos">84</span></a>
|
||||
</span><span id="L-85"><a href="#L-85"><span class="linenos">85</span></a> <span class="n">optimized</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">maybe_parse</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="L-86"><a href="#L-86"><span class="linenos">86</span></a> <span class="k">for</span> <span class="n">rule</span> <span class="ow">in</span> <span class="n">rules</span><span class="p">:</span>
|
||||
</span><span id="L-87"><a href="#L-87"><span class="linenos">87</span></a> <span class="c1"># Find any additional rule parameters, beyond `expression`</span>
|
||||
</span><span id="L-88"><a href="#L-88"><span class="linenos">88</span></a> <span class="n">rule_params</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getfullargspec</span><span class="p">(</span><span class="n">rule</span><span class="p">)</span><span class="o">.</span><span class="n">args</span>
|
||||
</span><span id="L-89"><a href="#L-89"><span class="linenos">89</span></a> <span class="n">rule_kwargs</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="L-90"><a href="#L-90"><span class="linenos">90</span></a> <span class="n">param</span><span class="p">:</span> <span class="n">possible_kwargs</span><span class="p">[</span><span class="n">param</span><span class="p">]</span> <span class="k">for</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">rule_params</span> <span class="k">if</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">possible_kwargs</span>
|
||||
</span><span id="L-91"><a href="#L-91"><span class="linenos">91</span></a> <span class="p">}</span>
|
||||
</span><span id="L-92"><a href="#L-92"><span class="linenos">92</span></a> <span class="n">optimized</span> <span class="o">=</span> <span class="n">rule</span><span class="p">(</span><span class="n">optimized</span><span class="p">,</span> <span class="o">**</span><span class="n">rule_kwargs</span><span class="p">)</span>
|
||||
</span><span id="L-93"><a href="#L-93"><span class="linenos">93</span></a>
|
||||
</span><span id="L-94"><a href="#L-94"><span class="linenos">94</span></a> <span class="k">return</span> <span class="n">optimized</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
@ -182,59 +181,59 @@
|
|||
|
||||
</div>
|
||||
<a class="headerlink" href="#optimize"></a>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="optimize-44"><a href="#optimize-44"><span class="linenos">44</span></a><span class="k">def</span> <span class="nf">optimize</span><span class="p">(</span>
|
||||
</span><span id="optimize-45"><a href="#optimize-45"><span class="linenos">45</span></a> <span class="n">expression</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span>
|
||||
</span><span id="optimize-46"><a href="#optimize-46"><span class="linenos">46</span></a> <span class="n">schema</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span> <span class="o">|</span> <span class="n">Schema</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="optimize-47"><a href="#optimize-47"><span class="linenos">47</span></a> <span class="n">db</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="optimize-48"><a href="#optimize-48"><span class="linenos">48</span></a> <span class="n">catalog</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="optimize-49"><a href="#optimize-49"><span class="linenos">49</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="optimize-50"><a href="#optimize-50"><span class="linenos">50</span></a> <span class="n">rules</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">]</span> <span class="o">=</span> <span class="n">RULES</span><span class="p">,</span>
|
||||
</span><span id="optimize-51"><a href="#optimize-51"><span class="linenos">51</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
|
||||
</span><span id="optimize-52"><a href="#optimize-52"><span class="linenos">52</span></a><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
||||
</span><span id="optimize-53"><a href="#optimize-53"><span class="linenos">53</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="optimize-54"><a href="#optimize-54"><span class="linenos">54</span></a><span class="sd"> Rewrite a sqlglot AST into an optimized form.</span>
|
||||
</span><span id="optimize-55"><a href="#optimize-55"><span class="linenos">55</span></a>
|
||||
</span><span id="optimize-56"><a href="#optimize-56"><span class="linenos">56</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="optimize-57"><a href="#optimize-57"><span class="linenos">57</span></a><span class="sd"> expression: expression to optimize</span>
|
||||
</span><span id="optimize-58"><a href="#optimize-58"><span class="linenos">58</span></a><span class="sd"> schema: database schema.</span>
|
||||
</span><span id="optimize-59"><a href="#optimize-59"><span class="linenos">59</span></a><span class="sd"> This can either be an instance of `sqlglot.optimizer.Schema` or a mapping in one of</span>
|
||||
</span><span id="optimize-60"><a href="#optimize-60"><span class="linenos">60</span></a><span class="sd"> the following forms:</span>
|
||||
</span><span id="optimize-61"><a href="#optimize-61"><span class="linenos">61</span></a><span class="sd"> 1. {table: {col: type}}</span>
|
||||
</span><span id="optimize-62"><a href="#optimize-62"><span class="linenos">62</span></a><span class="sd"> 2. {db: {table: {col: type}}}</span>
|
||||
</span><span id="optimize-63"><a href="#optimize-63"><span class="linenos">63</span></a><span class="sd"> 3. {catalog: {db: {table: {col: type}}}}</span>
|
||||
</span><span id="optimize-64"><a href="#optimize-64"><span class="linenos">64</span></a><span class="sd"> If no schema is provided then the default schema defined at `sqlgot.schema` will be used</span>
|
||||
</span><span id="optimize-65"><a href="#optimize-65"><span class="linenos">65</span></a><span class="sd"> db: specify the default database, as might be set by a `USE DATABASE db` statement</span>
|
||||
</span><span id="optimize-66"><a href="#optimize-66"><span class="linenos">66</span></a><span class="sd"> catalog: specify the default catalog, as might be set by a `USE CATALOG c` statement</span>
|
||||
</span><span id="optimize-67"><a href="#optimize-67"><span class="linenos">67</span></a><span class="sd"> dialect: The dialect to parse the sql string.</span>
|
||||
</span><span id="optimize-68"><a href="#optimize-68"><span class="linenos">68</span></a><span class="sd"> rules: sequence of optimizer rules to use.</span>
|
||||
</span><span id="optimize-69"><a href="#optimize-69"><span class="linenos">69</span></a><span class="sd"> Many of the rules require tables and columns to be qualified.</span>
|
||||
</span><span id="optimize-70"><a href="#optimize-70"><span class="linenos">70</span></a><span class="sd"> Do not remove `qualify` from the sequence of rules unless you know what you're doing!</span>
|
||||
</span><span id="optimize-71"><a href="#optimize-71"><span class="linenos">71</span></a><span class="sd"> **kwargs: If a rule has a keyword argument with a same name in **kwargs, it will be passed in.</span>
|
||||
</span><span id="optimize-72"><a href="#optimize-72"><span class="linenos">72</span></a>
|
||||
</span><span id="optimize-73"><a href="#optimize-73"><span class="linenos">73</span></a><span class="sd"> Returns:</span>
|
||||
</span><span id="optimize-74"><a href="#optimize-74"><span class="linenos">74</span></a><span class="sd"> The optimized expression.</span>
|
||||
</span><span id="optimize-75"><a href="#optimize-75"><span class="linenos">75</span></a><span class="sd"> """</span>
|
||||
</span><span id="optimize-76"><a href="#optimize-76"><span class="linenos">76</span></a> <span class="n">schema</span> <span class="o">=</span> <span class="n">ensure_schema</span><span class="p">(</span><span class="n">schema</span> <span class="ow">or</span> <span class="n">sqlglot</span><span class="o">.</span><span class="n">schema</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
|
||||
</span><span id="optimize-77"><a href="#optimize-77"><span class="linenos">77</span></a> <span class="n">possible_kwargs</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="optimize-78"><a href="#optimize-78"><span class="linenos">78</span></a> <span class="s2">"db"</span><span class="p">:</span> <span class="n">db</span><span class="p">,</span>
|
||||
</span><span id="optimize-79"><a href="#optimize-79"><span class="linenos">79</span></a> <span class="s2">"catalog"</span><span class="p">:</span> <span class="n">catalog</span><span class="p">,</span>
|
||||
</span><span id="optimize-80"><a href="#optimize-80"><span class="linenos">80</span></a> <span class="s2">"schema"</span><span class="p">:</span> <span class="n">schema</span><span class="p">,</span>
|
||||
</span><span id="optimize-81"><a href="#optimize-81"><span class="linenos">81</span></a> <span class="s2">"dialect"</span><span class="p">:</span> <span class="n">dialect</span><span class="p">,</span>
|
||||
</span><span id="optimize-82"><a href="#optimize-82"><span class="linenos">82</span></a> <span class="s2">"isolate_tables"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="c1"># needed for other optimizations to perform well</span>
|
||||
</span><span id="optimize-83"><a href="#optimize-83"><span class="linenos">83</span></a> <span class="s2">"quote_identifiers"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="optimize-84"><a href="#optimize-84"><span class="linenos">84</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
|
||||
</span><span id="optimize-85"><a href="#optimize-85"><span class="linenos">85</span></a> <span class="p">}</span>
|
||||
</span><span id="optimize-86"><a href="#optimize-86"><span class="linenos">86</span></a>
|
||||
</span><span id="optimize-87"><a href="#optimize-87"><span class="linenos">87</span></a> <span class="n">optimized</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">maybe_parse</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="optimize-88"><a href="#optimize-88"><span class="linenos">88</span></a> <span class="k">for</span> <span class="n">rule</span> <span class="ow">in</span> <span class="n">rules</span><span class="p">:</span>
|
||||
</span><span id="optimize-89"><a href="#optimize-89"><span class="linenos">89</span></a> <span class="c1"># Find any additional rule parameters, beyond `expression`</span>
|
||||
</span><span id="optimize-90"><a href="#optimize-90"><span class="linenos">90</span></a> <span class="n">rule_params</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getfullargspec</span><span class="p">(</span><span class="n">rule</span><span class="p">)</span><span class="o">.</span><span class="n">args</span>
|
||||
</span><span id="optimize-91"><a href="#optimize-91"><span class="linenos">91</span></a> <span class="n">rule_kwargs</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="optimize-92"><a href="#optimize-92"><span class="linenos">92</span></a> <span class="n">param</span><span class="p">:</span> <span class="n">possible_kwargs</span><span class="p">[</span><span class="n">param</span><span class="p">]</span> <span class="k">for</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">rule_params</span> <span class="k">if</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">possible_kwargs</span>
|
||||
</span><span id="optimize-93"><a href="#optimize-93"><span class="linenos">93</span></a> <span class="p">}</span>
|
||||
</span><span id="optimize-94"><a href="#optimize-94"><span class="linenos">94</span></a> <span class="n">optimized</span> <span class="o">=</span> <span class="n">rule</span><span class="p">(</span><span class="n">optimized</span><span class="p">,</span> <span class="o">**</span><span class="n">rule_kwargs</span><span class="p">)</span>
|
||||
</span><span id="optimize-95"><a href="#optimize-95"><span class="linenos">95</span></a>
|
||||
</span><span id="optimize-96"><a href="#optimize-96"><span class="linenos">96</span></a> <span class="k">return</span> <span class="n">optimized</span>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="optimize-43"><a href="#optimize-43"><span class="linenos">43</span></a><span class="k">def</span> <span class="nf">optimize</span><span class="p">(</span>
|
||||
</span><span id="optimize-44"><a href="#optimize-44"><span class="linenos">44</span></a> <span class="n">expression</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span>
|
||||
</span><span id="optimize-45"><a href="#optimize-45"><span class="linenos">45</span></a> <span class="n">schema</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span> <span class="o">|</span> <span class="n">Schema</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="optimize-46"><a href="#optimize-46"><span class="linenos">46</span></a> <span class="n">db</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="optimize-47"><a href="#optimize-47"><span class="linenos">47</span></a> <span class="n">catalog</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="optimize-48"><a href="#optimize-48"><span class="linenos">48</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="optimize-49"><a href="#optimize-49"><span class="linenos">49</span></a> <span class="n">rules</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">]</span> <span class="o">=</span> <span class="n">RULES</span><span class="p">,</span>
|
||||
</span><span id="optimize-50"><a href="#optimize-50"><span class="linenos">50</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
|
||||
</span><span id="optimize-51"><a href="#optimize-51"><span class="linenos">51</span></a><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
||||
</span><span id="optimize-52"><a href="#optimize-52"><span class="linenos">52</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="optimize-53"><a href="#optimize-53"><span class="linenos">53</span></a><span class="sd"> Rewrite a sqlglot AST into an optimized form.</span>
|
||||
</span><span id="optimize-54"><a href="#optimize-54"><span class="linenos">54</span></a>
|
||||
</span><span id="optimize-55"><a href="#optimize-55"><span class="linenos">55</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="optimize-56"><a href="#optimize-56"><span class="linenos">56</span></a><span class="sd"> expression: expression to optimize</span>
|
||||
</span><span id="optimize-57"><a href="#optimize-57"><span class="linenos">57</span></a><span class="sd"> schema: database schema.</span>
|
||||
</span><span id="optimize-58"><a href="#optimize-58"><span class="linenos">58</span></a><span class="sd"> This can either be an instance of `sqlglot.optimizer.Schema` or a mapping in one of</span>
|
||||
</span><span id="optimize-59"><a href="#optimize-59"><span class="linenos">59</span></a><span class="sd"> the following forms:</span>
|
||||
</span><span id="optimize-60"><a href="#optimize-60"><span class="linenos">60</span></a><span class="sd"> 1. {table: {col: type}}</span>
|
||||
</span><span id="optimize-61"><a href="#optimize-61"><span class="linenos">61</span></a><span class="sd"> 2. {db: {table: {col: type}}}</span>
|
||||
</span><span id="optimize-62"><a href="#optimize-62"><span class="linenos">62</span></a><span class="sd"> 3. {catalog: {db: {table: {col: type}}}}</span>
|
||||
</span><span id="optimize-63"><a href="#optimize-63"><span class="linenos">63</span></a><span class="sd"> If no schema is provided then the default schema defined at `sqlgot.schema` will be used</span>
|
||||
</span><span id="optimize-64"><a href="#optimize-64"><span class="linenos">64</span></a><span class="sd"> db: specify the default database, as might be set by a `USE DATABASE db` statement</span>
|
||||
</span><span id="optimize-65"><a href="#optimize-65"><span class="linenos">65</span></a><span class="sd"> catalog: specify the default catalog, as might be set by a `USE CATALOG c` statement</span>
|
||||
</span><span id="optimize-66"><a href="#optimize-66"><span class="linenos">66</span></a><span class="sd"> dialect: The dialect to parse the sql string.</span>
|
||||
</span><span id="optimize-67"><a href="#optimize-67"><span class="linenos">67</span></a><span class="sd"> rules: sequence of optimizer rules to use.</span>
|
||||
</span><span id="optimize-68"><a href="#optimize-68"><span class="linenos">68</span></a><span class="sd"> Many of the rules require tables and columns to be qualified.</span>
|
||||
</span><span id="optimize-69"><a href="#optimize-69"><span class="linenos">69</span></a><span class="sd"> Do not remove `qualify` from the sequence of rules unless you know what you're doing!</span>
|
||||
</span><span id="optimize-70"><a href="#optimize-70"><span class="linenos">70</span></a><span class="sd"> **kwargs: If a rule has a keyword argument with a same name in **kwargs, it will be passed in.</span>
|
||||
</span><span id="optimize-71"><a href="#optimize-71"><span class="linenos">71</span></a>
|
||||
</span><span id="optimize-72"><a href="#optimize-72"><span class="linenos">72</span></a><span class="sd"> Returns:</span>
|
||||
</span><span id="optimize-73"><a href="#optimize-73"><span class="linenos">73</span></a><span class="sd"> The optimized expression.</span>
|
||||
</span><span id="optimize-74"><a href="#optimize-74"><span class="linenos">74</span></a><span class="sd"> """</span>
|
||||
</span><span id="optimize-75"><a href="#optimize-75"><span class="linenos">75</span></a> <span class="n">schema</span> <span class="o">=</span> <span class="n">ensure_schema</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
|
||||
</span><span id="optimize-76"><a href="#optimize-76"><span class="linenos">76</span></a> <span class="n">possible_kwargs</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="optimize-77"><a href="#optimize-77"><span class="linenos">77</span></a> <span class="s2">"db"</span><span class="p">:</span> <span class="n">db</span><span class="p">,</span>
|
||||
</span><span id="optimize-78"><a href="#optimize-78"><span class="linenos">78</span></a> <span class="s2">"catalog"</span><span class="p">:</span> <span class="n">catalog</span><span class="p">,</span>
|
||||
</span><span id="optimize-79"><a href="#optimize-79"><span class="linenos">79</span></a> <span class="s2">"schema"</span><span class="p">:</span> <span class="n">schema</span><span class="p">,</span>
|
||||
</span><span id="optimize-80"><a href="#optimize-80"><span class="linenos">80</span></a> <span class="s2">"dialect"</span><span class="p">:</span> <span class="n">dialect</span><span class="p">,</span>
|
||||
</span><span id="optimize-81"><a href="#optimize-81"><span class="linenos">81</span></a> <span class="s2">"isolate_tables"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="c1"># needed for other optimizations to perform well</span>
|
||||
</span><span id="optimize-82"><a href="#optimize-82"><span class="linenos">82</span></a> <span class="s2">"quote_identifiers"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="optimize-83"><a href="#optimize-83"><span class="linenos">83</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
|
||||
</span><span id="optimize-84"><a href="#optimize-84"><span class="linenos">84</span></a> <span class="p">}</span>
|
||||
</span><span id="optimize-85"><a href="#optimize-85"><span class="linenos">85</span></a>
|
||||
</span><span id="optimize-86"><a href="#optimize-86"><span class="linenos">86</span></a> <span class="n">optimized</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">maybe_parse</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="optimize-87"><a href="#optimize-87"><span class="linenos">87</span></a> <span class="k">for</span> <span class="n">rule</span> <span class="ow">in</span> <span class="n">rules</span><span class="p">:</span>
|
||||
</span><span id="optimize-88"><a href="#optimize-88"><span class="linenos">88</span></a> <span class="c1"># Find any additional rule parameters, beyond `expression`</span>
|
||||
</span><span id="optimize-89"><a href="#optimize-89"><span class="linenos">89</span></a> <span class="n">rule_params</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getfullargspec</span><span class="p">(</span><span class="n">rule</span><span class="p">)</span><span class="o">.</span><span class="n">args</span>
|
||||
</span><span id="optimize-90"><a href="#optimize-90"><span class="linenos">90</span></a> <span class="n">rule_kwargs</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="optimize-91"><a href="#optimize-91"><span class="linenos">91</span></a> <span class="n">param</span><span class="p">:</span> <span class="n">possible_kwargs</span><span class="p">[</span><span class="n">param</span><span class="p">]</span> <span class="k">for</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">rule_params</span> <span class="k">if</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">possible_kwargs</span>
|
||||
</span><span id="optimize-92"><a href="#optimize-92"><span class="linenos">92</span></a> <span class="p">}</span>
|
||||
</span><span id="optimize-93"><a href="#optimize-93"><span class="linenos">93</span></a> <span class="n">optimized</span> <span class="o">=</span> <span class="n">rule</span><span class="p">(</span><span class="n">optimized</span><span class="p">,</span> <span class="o">**</span><span class="n">rule_kwargs</span><span class="p">)</span>
|
||||
</span><span id="optimize-94"><a href="#optimize-94"><span class="linenos">94</span></a>
|
||||
</span><span id="optimize-95"><a href="#optimize-95"><span class="linenos">95</span></a> <span class="k">return</span> <span class="n">optimized</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue