mirror of
https://github.com/evennia/evennia.git
synced 2026-03-16 21:06:30 +01:00
2355 lines
No EOL
333 KiB
HTML
2355 lines
No EOL
333 KiB
HTML
<!DOCTYPE html>
|
||
|
||
<html lang="en" data-content_root="../../../../">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<title>django.db.models.expressions — Evennia latest documentation</title>
|
||
<link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=d75fae25" />
|
||
<link rel="stylesheet" type="text/css" href="../../../../_static/nature.css?v=279e0f84" />
|
||
<link rel="stylesheet" type="text/css" href="../../../../_static/custom.css?v=e4a91a55" />
|
||
<script src="../../../../_static/documentation_options.js?v=c6e86fd7"></script>
|
||
<script src="../../../../_static/doctools.js?v=9bcbadda"></script>
|
||
<script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
|
||
<link rel="icon" href="../../../../_static/favicon.ico"/>
|
||
<link rel="index" title="Index" href="../../../../genindex.html" />
|
||
<link rel="search" title="Search" href="../../../../search.html" />
|
||
</head><body>
|
||
<div class="related" role="navigation" aria-label="Related">
|
||
<h3>Navigation</h3>
|
||
<ul>
|
||
<li class="right" style="margin-right: 10px">
|
||
<a href="../../../../genindex.html" title="General Index"
|
||
accesskey="I">index</a></li>
|
||
<li class="right" >
|
||
<a href="../../../../py-modindex.html" title="Python Module Index"
|
||
>modules</a> |</li>
|
||
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia</a> »</li>
|
||
<li class="nav-item nav-item-1"><a href="../../../index.html" accesskey="U">Module code</a> »</li>
|
||
<li class="nav-item nav-item-this"><a href="">django.db.models.expressions</a></li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="document">
|
||
<div class="documentwrapper">
|
||
<div class="bodywrapper">
|
||
<div class="body" role="main">
|
||
|
||
<h1>Source code for django.db.models.expressions</h1><div class="highlight"><pre>
|
||
<span></span><span class="kn">import</span><span class="w"> </span><span class="nn">copy</span>
|
||
<span class="kn">import</span><span class="w"> </span><span class="nn">datetime</span>
|
||
<span class="kn">import</span><span class="w"> </span><span class="nn">functools</span>
|
||
<span class="kn">import</span><span class="w"> </span><span class="nn">inspect</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">collections</span><span class="w"> </span><span class="kn">import</span> <span class="n">defaultdict</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">decimal</span><span class="w"> </span><span class="kn">import</span> <span class="n">Decimal</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">enum</span><span class="w"> </span><span class="kn">import</span> <span class="n">Enum</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">itertools</span><span class="w"> </span><span class="kn">import</span> <span class="n">chain</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">types</span><span class="w"> </span><span class="kn">import</span> <span class="n">NoneType</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">uuid</span><span class="w"> </span><span class="kn">import</span> <span class="n">UUID</span>
|
||
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.core.exceptions</span><span class="w"> </span><span class="kn">import</span> <span class="n">EmptyResultSet</span><span class="p">,</span> <span class="n">FieldError</span><span class="p">,</span> <span class="n">FullResultSet</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db</span><span class="w"> </span><span class="kn">import</span> <span class="n">DatabaseError</span><span class="p">,</span> <span class="n">NotSupportedError</span><span class="p">,</span> <span class="n">connection</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">fields</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.constants</span><span class="w"> </span><span class="kn">import</span> <span class="n">LOOKUP_SEP</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.query_utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">Q</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.deconstruct</span><span class="w"> </span><span class="kn">import</span> <span class="n">deconstructible</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.functional</span><span class="w"> </span><span class="kn">import</span> <span class="n">cached_property</span><span class="p">,</span> <span class="n">classproperty</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.hashable</span><span class="w"> </span><span class="kn">import</span> <span class="n">make_hashable</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">SQLiteNumericMixin</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Some expressions with output_field=DecimalField() must be cast to</span>
|
||
<span class="sd"> numeric to be properly filtered.</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sqlite</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="o">**</span><span class="n">extra_context</span><span class="p">):</span>
|
||
<span class="n">sql</span><span class="p">,</span> <span class="n">params</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">as_sql</span><span class="p">(</span><span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="o">**</span><span class="n">extra_context</span><span class="p">)</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_field</span><span class="o">.</span><span class="n">get_internal_type</span><span class="p">()</span> <span class="o">==</span> <span class="s2">"DecimalField"</span><span class="p">:</span>
|
||
<span class="n">sql</span> <span class="o">=</span> <span class="s2">"(CAST(</span><span class="si">%s</span><span class="s2"> AS NUMERIC))"</span> <span class="o">%</span> <span class="n">sql</span>
|
||
<span class="k">except</span> <span class="n">FieldError</span><span class="p">:</span>
|
||
<span class="k">pass</span>
|
||
<span class="k">return</span> <span class="n">sql</span><span class="p">,</span> <span class="n">params</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">Combinable</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Provide the ability to combine one or two objects with</span>
|
||
<span class="sd"> some connector. For example F('foo') + F('bar').</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="c1"># Arithmetic connectors</span>
|
||
<span class="n">ADD</span> <span class="o">=</span> <span class="s2">"+"</span>
|
||
<span class="n">SUB</span> <span class="o">=</span> <span class="s2">"-"</span>
|
||
<span class="n">MUL</span> <span class="o">=</span> <span class="s2">"*"</span>
|
||
<span class="n">DIV</span> <span class="o">=</span> <span class="s2">"/"</span>
|
||
<span class="n">POW</span> <span class="o">=</span> <span class="s2">"^"</span>
|
||
<span class="c1"># The following is a quoted % operator - it is quoted because it can be</span>
|
||
<span class="c1"># used in strings that also have parameter substitution.</span>
|
||
<span class="n">MOD</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%%</span><span class="s2">"</span>
|
||
|
||
<span class="c1"># Bitwise operators - note that these are generated by .bitand()</span>
|
||
<span class="c1"># and .bitor(), the '&' and '|' are reserved for boolean operator</span>
|
||
<span class="c1"># usage.</span>
|
||
<span class="n">BITAND</span> <span class="o">=</span> <span class="s2">"&"</span>
|
||
<span class="n">BITOR</span> <span class="o">=</span> <span class="s2">"|"</span>
|
||
<span class="n">BITLEFTSHIFT</span> <span class="o">=</span> <span class="s2">"<<"</span>
|
||
<span class="n">BITRIGHTSHIFT</span> <span class="o">=</span> <span class="s2">">>"</span>
|
||
<span class="n">BITXOR</span> <span class="o">=</span> <span class="s2">"#"</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">_combine</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">,</span> <span class="n">connector</span><span class="p">,</span> <span class="nb">reversed</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="s2">"resolve_expression"</span><span class="p">):</span>
|
||
<span class="c1"># everything must be resolvable to an expression</span>
|
||
<span class="n">other</span> <span class="o">=</span> <span class="n">Value</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
|
||
|
||
<span class="k">if</span> <span class="nb">reversed</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">CombinedExpression</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">connector</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">CombinedExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connector</span><span class="p">,</span> <span class="n">other</span><span class="p">)</span>
|
||
|
||
<span class="c1">#############</span>
|
||
<span class="c1"># OPERATORS #</span>
|
||
<span class="c1">#############</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__neg__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">MUL</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__add__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">ADD</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__sub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">SUB</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">MUL</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__truediv__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">DIV</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__mod__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">MOD</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__pow__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">POW</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__and__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"conditional"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="s2">"conditional"</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">Q</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">&</span> <span class="n">Q</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
|
||
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
||
<span class="s2">"Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations."</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">bitand</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">BITAND</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">bitleftshift</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">BITLEFTSHIFT</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">bitrightshift</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">BITRIGHTSHIFT</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__xor__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"conditional"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="s2">"conditional"</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">Q</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">^</span> <span class="n">Q</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
|
||
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
||
<span class="s2">"Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations."</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">bitxor</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">BITXOR</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__or__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"conditional"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="s2">"conditional"</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">Q</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">|</span> <span class="n">Q</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
|
||
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
||
<span class="s2">"Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations."</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">bitor</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">BITOR</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__radd__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">ADD</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__rsub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">SUB</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__rmul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">MUL</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__rtruediv__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">DIV</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__rmod__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">MOD</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__rpow__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_combine</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">POW</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__rand__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
||
<span class="s2">"Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations."</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__ror__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
||
<span class="s2">"Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations."</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__rxor__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span>
|
||
<span class="s2">"Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations."</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__invert__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">NegatedExpression</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">OutputFieldIsNoneError</span><span class="p">(</span><span class="n">FieldError</span><span class="p">):</span>
|
||
<span class="k">pass</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">BaseExpression</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""Base class for all query expressions."""</span>
|
||
|
||
<span class="n">empty_result_set_value</span> <span class="o">=</span> <span class="bp">NotImplemented</span>
|
||
<span class="c1"># aggregate specific fields</span>
|
||
<span class="n">is_summary</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="c1"># Can the expression be used in a WHERE clause?</span>
|
||
<span class="n">filterable</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="c1"># Can the expression be used as a source expression in Window?</span>
|
||
<span class="n">window_compatible</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="c1"># Can the expression be used as a database default value?</span>
|
||
<span class="n">allowed_default</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="c1"># Can the expression be used during a constraint validation?</span>
|
||
<span class="n">constraint_validation_compatible</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="c1"># Does the expression possibly return more than one row?</span>
|
||
<span class="n">set_returning</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="c1"># Does the expression allow composite expressions?</span>
|
||
<span class="n">allows_composite_expressions</span> <span class="o">=</span> <span class="kc">False</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output_field</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="n">output_field</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">output_field</span> <span class="o">=</span> <span class="n">output_field</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">__getstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="n">state</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||
<span class="n">state</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"convert_value"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">state</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_converters</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">(</span>
|
||
<span class="p">[]</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">convert_value</span> <span class="ow">is</span> <span class="bp">self</span><span class="o">.</span><span class="n">_convert_value_noop</span>
|
||
<span class="k">else</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">convert_value</span><span class="p">]</span>
|
||
<span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_field</span><span class="o">.</span><span class="n">get_db_converters</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">set_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
||
<span class="k">assert</span> <span class="ow">not</span> <span class="n">exprs</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">_parse_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">expressions</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[</span>
|
||
<span class="p">(</span>
|
||
<span class="n">arg</span>
|
||
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="s2">"resolve_expression"</span><span class="p">)</span>
|
||
<span class="k">else</span> <span class="p">(</span><span class="n">F</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="n">Value</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
|
||
<span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">expressions</span>
|
||
<span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Responsible for returning a (sql, [params]) tuple to be included</span>
|
||
<span class="sd"> in the current query.</span>
|
||
|
||
<span class="sd"> Different backends can provide their own implementation, by</span>
|
||
<span class="sd"> providing an `as_{vendor}` method and patching the Expression:</span>
|
||
|
||
<span class="sd"> ```</span>
|
||
<span class="sd"> def override_as_sql(self, compiler, connection):</span>
|
||
<span class="sd"> # custom logic</span>
|
||
<span class="sd"> return super().as_sql(compiler, connection)</span>
|
||
<span class="sd"> setattr(Expression, 'as_' + connection.vendor, override_as_sql)</span>
|
||
<span class="sd"> ```</span>
|
||
|
||
<span class="sd"> Arguments:</span>
|
||
<span class="sd"> * compiler: the query compiler responsible for generating the query.</span>
|
||
<span class="sd"> Must have a compile method, returning a (sql, [params]) tuple.</span>
|
||
<span class="sd"> Calling compiler(value) will return a quoted `value`.</span>
|
||
|
||
<span class="sd"> * connection: the database connection used for the current query.</span>
|
||
|
||
<span class="sd"> Return: (sql, params)</span>
|
||
<span class="sd"> Where `sql` is a string containing ordered sql parameters to be</span>
|
||
<span class="sd"> replaced with the elements of the list `params`.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">"Subclasses must implement as_sql()"</span><span class="p">)</span>
|
||
|
||
<span class="nd">@cached_property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">contains_aggregate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="nb">any</span><span class="p">(</span>
|
||
<span class="n">expr</span> <span class="ow">and</span> <span class="n">expr</span><span class="o">.</span><span class="n">contains_aggregate</span> <span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">()</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="nd">@cached_property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">contains_over_clause</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="nb">any</span><span class="p">(</span>
|
||
<span class="n">expr</span> <span class="ow">and</span> <span class="n">expr</span><span class="o">.</span><span class="n">contains_over_clause</span> <span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">()</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="nd">@cached_property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">contains_column_references</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="nb">any</span><span class="p">(</span>
|
||
<span class="n">expr</span> <span class="ow">and</span> <span class="n">expr</span><span class="o">.</span><span class="n">contains_column_references</span>
|
||
<span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">()</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="nd">@cached_property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">contains_subquery</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="nb">any</span><span class="p">(</span>
|
||
<span class="n">expr</span> <span class="ow">and</span> <span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="s2">"subquery"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">or</span> <span class="n">expr</span><span class="o">.</span><span class="n">contains_subquery</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">()</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">allow_joins</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">reuse</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">summarize</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">for_save</span><span class="o">=</span><span class="kc">False</span>
|
||
<span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Provide the chance to do any preprocessing or validation before being</span>
|
||
<span class="sd"> added to the query.</span>
|
||
|
||
<span class="sd"> Arguments:</span>
|
||
<span class="sd"> * query: the backend query implementation</span>
|
||
<span class="sd"> * allow_joins: boolean allowing or denying use of joins</span>
|
||
<span class="sd"> in this query</span>
|
||
<span class="sd"> * reuse: a set of reusable joins for multijoins</span>
|
||
<span class="sd"> * summarize: a terminal aggregate clause</span>
|
||
<span class="sd"> * for_save: whether this expression about to be used in a save or</span>
|
||
<span class="sd"> update</span>
|
||
|
||
<span class="sd"> Return: an Expression to be added to the query.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">c</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||
<span class="n">c</span><span class="o">.</span><span class="n">is_summary</span> <span class="o">=</span> <span class="n">summarize</span>
|
||
<span class="n">source_expressions</span> <span class="o">=</span> <span class="p">[</span>
|
||
<span class="p">(</span>
|
||
<span class="n">expr</span><span class="o">.</span><span class="n">resolve_expression</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">allow_joins</span><span class="p">,</span> <span class="n">reuse</span><span class="p">,</span> <span class="n">summarize</span><span class="p">,</span> <span class="n">for_save</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">expr</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
|
||
<span class="k">else</span> <span class="kc">None</span>
|
||
<span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="n">c</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">()</span>
|
||
<span class="p">]</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">allows_composite_expressions</span> <span class="ow">and</span> <span class="nb">any</span><span class="p">(</span>
|
||
<span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">ColPairs</span><span class="p">)</span> <span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="n">source_expressions</span>
|
||
<span class="p">):</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
||
<span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> expression does not support "</span>
|
||
<span class="s2">"composite primary keys."</span>
|
||
<span class="p">)</span>
|
||
<span class="n">c</span><span class="o">.</span><span class="n">set_source_expressions</span><span class="p">(</span><span class="n">source_expressions</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">c</span>
|
||
|
||
<span class="nd">@property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">conditional</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">output_field</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">BooleanField</span><span class="p">)</span>
|
||
|
||
<span class="nd">@property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">field</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_field</span>
|
||
|
||
<span class="nd">@cached_property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">output_field</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""Return the output type of this expressions."""</span>
|
||
<span class="n">output_field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_resolve_output_field</span><span class="p">()</span>
|
||
<span class="k">if</span> <span class="n">output_field</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="n">OutputFieldIsNoneError</span><span class="p">(</span>
|
||
<span class="s2">"Cannot resolve expression type, unknown output_field"</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">output_field</span>
|
||
|
||
<span class="nd">@property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">_output_field_or_none</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Return the output field of this expression, or None if</span>
|
||
<span class="sd"> _resolve_output_field() didn't return an output type.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_field</span>
|
||
<span class="k">except</span> <span class="n">OutputFieldIsNoneError</span><span class="p">:</span>
|
||
<span class="k">return</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">_resolve_output_field</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Attempt to infer the output type of the expression.</span>
|
||
|
||
<span class="sd"> As a guess, if the output fields of all source fields match then simply</span>
|
||
<span class="sd"> infer the same type here.</span>
|
||
|
||
<span class="sd"> If a source's output field resolves to None, exclude it from this</span>
|
||
<span class="sd"> check. If all sources are None, then an error is raised higher up the</span>
|
||
<span class="sd"> stack in the output_field property.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="c1"># This guess is mostly a bad idea, but there is quite a lot of code</span>
|
||
<span class="c1"># (especially 3rd party Func subclasses) that depend on it, we'd need a</span>
|
||
<span class="c1"># deprecation path to fix it.</span>
|
||
<span class="n">sources_iter</span> <span class="o">=</span> <span class="p">(</span>
|
||
<span class="n">source</span> <span class="k">for</span> <span class="n">source</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_fields</span><span class="p">()</span> <span class="k">if</span> <span class="n">source</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
|
||
<span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">output_field</span> <span class="ow">in</span> <span class="n">sources_iter</span><span class="p">:</span>
|
||
<span class="k">for</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">sources_iter</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">output_field</span><span class="p">,</span> <span class="n">source</span><span class="o">.</span><span class="vm">__class__</span><span class="p">):</span>
|
||
<span class="k">raise</span> <span class="n">FieldError</span><span class="p">(</span>
|
||
<span class="s2">"Expression contains mixed types: </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">. You must "</span>
|
||
<span class="s2">"set output_field."</span>
|
||
<span class="o">%</span> <span class="p">(</span>
|
||
<span class="n">output_field</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
|
||
<span class="n">source</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">output_field</span>
|
||
|
||
<span class="nd">@staticmethod</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">_convert_value_noop</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">value</span>
|
||
|
||
<span class="nd">@cached_property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">convert_value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Expressions provide their own converters because users have the option</span>
|
||
<span class="sd"> of manually specifying the output_field which may be a different type</span>
|
||
<span class="sd"> from the one the database returns.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_field</span>
|
||
<span class="n">internal_type</span> <span class="o">=</span> <span class="n">field</span><span class="o">.</span><span class="n">get_internal_type</span><span class="p">()</span>
|
||
<span class="k">if</span> <span class="n">internal_type</span> <span class="o">==</span> <span class="s2">"FloatField"</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="k">lambda</span> <span class="n">value</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">connection</span><span class="p">:</span> <span class="p">(</span>
|
||
<span class="kc">None</span> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="nb">float</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
||
<span class="p">)</span>
|
||
<span class="k">elif</span> <span class="n">internal_type</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">"IntegerField"</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="k">lambda</span> <span class="n">value</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">connection</span><span class="p">:</span> <span class="p">(</span>
|
||
<span class="kc">None</span> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
||
<span class="p">)</span>
|
||
<span class="k">elif</span> <span class="n">internal_type</span> <span class="o">==</span> <span class="s2">"DecimalField"</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="k">lambda</span> <span class="n">value</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">connection</span><span class="p">:</span> <span class="p">(</span>
|
||
<span class="kc">None</span> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">Decimal</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_convert_value_noop</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_lookup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lookup</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_field</span><span class="o">.</span><span class="n">get_lookup</span><span class="p">(</span><span class="n">lookup</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_transform</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_field</span><span class="o">.</span><span class="n">get_transform</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">relabeled_clone</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">change_map</span><span class="p">):</span>
|
||
<span class="n">clone</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||
<span class="n">clone</span><span class="o">.</span><span class="n">set_source_expressions</span><span class="p">(</span>
|
||
<span class="p">[</span>
|
||
<span class="n">e</span><span class="o">.</span><span class="n">relabeled_clone</span><span class="p">(</span><span class="n">change_map</span><span class="p">)</span> <span class="k">if</span> <span class="n">e</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="kc">None</span>
|
||
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">()</span>
|
||
<span class="p">]</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">clone</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">replace_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">replacements</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">replacements</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="bp">self</span>
|
||
<span class="k">if</span> <span class="n">replacement</span> <span class="o">:=</span> <span class="n">replacements</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">replacement</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">source_expressions</span> <span class="o">:=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">()):</span>
|
||
<span class="k">return</span> <span class="bp">self</span>
|
||
<span class="n">clone</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||
<span class="n">clone</span><span class="o">.</span><span class="n">set_source_expressions</span><span class="p">(</span>
|
||
<span class="p">[</span>
|
||
<span class="kc">None</span> <span class="k">if</span> <span class="n">expr</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">expr</span><span class="o">.</span><span class="n">replace_expressions</span><span class="p">(</span><span class="n">replacements</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="n">source_expressions</span>
|
||
<span class="p">]</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">clone</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_refs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="n">refs</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
|
||
<span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">():</span>
|
||
<span class="k">if</span> <span class="n">expr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="k">continue</span>
|
||
<span class="n">refs</span> <span class="o">|=</span> <span class="n">expr</span><span class="o">.</span><span class="n">get_refs</span><span class="p">()</span>
|
||
<span class="k">return</span> <span class="n">refs</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">prefix_references</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">prefix</span><span class="p">):</span>
|
||
<span class="n">clone</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||
<span class="n">clone</span><span class="o">.</span><span class="n">set_source_expressions</span><span class="p">(</span>
|
||
<span class="p">[</span>
|
||
<span class="p">(</span>
|
||
<span class="n">F</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">prefix</span><span class="si">}{</span><span class="n">expr</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">F</span><span class="p">)</span>
|
||
<span class="k">else</span> <span class="n">expr</span><span class="o">.</span><span class="n">prefix_references</span><span class="p">(</span><span class="n">prefix</span><span class="p">)</span>
|
||
<span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">()</span>
|
||
<span class="p">]</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">clone</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_group_by_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">contains_aggregate</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="p">]</span>
|
||
<span class="n">cols</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="k">for</span> <span class="n">source</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">():</span>
|
||
<span class="n">cols</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">source</span><span class="o">.</span><span class="n">get_group_by_cols</span><span class="p">())</span>
|
||
<span class="k">return</span> <span class="n">cols</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_source_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""Return the underlying field types used by this aggregate."""</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="n">e</span><span class="o">.</span><span class="n">_output_field_or_none</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">()]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">asc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">OrderBy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">desc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">OrderBy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">descending</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">reverse_ordering</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">flatten</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Recursively yield this expression and all subexpressions, in</span>
|
||
<span class="sd"> depth-first order.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">yield</span> <span class="bp">self</span>
|
||
<span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">():</span>
|
||
<span class="k">if</span> <span class="n">expr</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="s2">"flatten"</span><span class="p">):</span>
|
||
<span class="k">yield from</span> <span class="n">expr</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="k">yield</span> <span class="n">expr</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">select_format</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">sql</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Custom format for select clauses. For example, EXISTS expressions need</span>
|
||
<span class="sd"> to be wrapped in CASE WHEN on Oracle.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">output_field</span><span class="p">,</span> <span class="s2">"select_format"</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_field</span><span class="o">.</span><span class="n">select_format</span><span class="p">(</span><span class="n">compiler</span><span class="p">,</span> <span class="n">sql</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">sql</span><span class="p">,</span> <span class="n">params</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_expression_for_validation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="c1"># Ignore expressions that cannot be used during a constraint</span>
|
||
<span class="c1"># validation.</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"constraint_validation_compatible"</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="p">(</span><span class="n">expression</span><span class="p">,)</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">()</span>
|
||
<span class="k">except</span> <span class="ne">ValueError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
||
<span class="s2">"Expressions with constraint_validation_compatible set to False "</span>
|
||
<span class="s2">"must have only one source expression."</span>
|
||
<span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">expression</span>
|
||
<span class="k">return</span> <span class="bp">self</span>
|
||
|
||
|
||
<span class="nd">@deconstructible</span>
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">Expression</span><span class="p">(</span><span class="n">BaseExpression</span><span class="p">,</span> <span class="n">Combinable</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""An expression that can be combined with other expressions."""</span>
|
||
|
||
<span class="nd">@classproperty</span>
|
||
<span class="nd">@functools</span><span class="o">.</span><span class="n">lru_cache</span><span class="p">(</span><span class="n">maxsize</span><span class="o">=</span><span class="mi">128</span><span class="p">)</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">_constructor_signature</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">inspect</span><span class="o">.</span><span class="n">signature</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="fm">__init__</span><span class="p">)</span>
|
||
|
||
<span class="nd">@classmethod</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">_identity</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">_identity</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="nb">tuple</span><span class="p">((</span><span class="n">key</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_identity</span><span class="p">(</span><span class="n">val</span><span class="p">))</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">value</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">Field</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="n">value</span><span class="o">.</span><span class="n">model</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">value</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label</span><span class="p">,</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span>
|
||
<span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">make_hashable</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
||
|
||
<span class="nd">@cached_property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">identity</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constructor_args</span>
|
||
<span class="n">signature</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_constructor_signature</span><span class="o">.</span><span class="n">bind_partial</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
||
<span class="n">signature</span><span class="o">.</span><span class="n">apply_defaults</span><span class="p">()</span>
|
||
<span class="n">arguments</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">signature</span><span class="o">.</span><span class="n">arguments</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
|
||
<span class="nb">next</span><span class="p">(</span><span class="n">arguments</span><span class="p">)</span>
|
||
<span class="n">identity</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">]</span>
|
||
<span class="k">for</span> <span class="n">arg</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">arguments</span><span class="p">:</span>
|
||
<span class="c1"># If __init__() makes use of *args or **kwargs captures `value`</span>
|
||
<span class="c1"># will respectively be a tuple or a dict that must have its</span>
|
||
<span class="c1"># constituents unpacked (mainly if contain Field instances).</span>
|
||
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_identity</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
||
<span class="n">identity</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">arg</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
|
||
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">identity</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Expression</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">NotImplemented</span>
|
||
<span class="k">return</span> <span class="n">other</span><span class="o">.</span><span class="n">identity</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">identity</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="nb">hash</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">identity</span><span class="p">)</span>
|
||
|
||
|
||
<span class="c1"># Type inference for CombinedExpression.output_field.</span>
|
||
<span class="c1"># Missing items will result in FieldError, by design.</span>
|
||
<span class="c1">#</span>
|
||
<span class="c1"># The current approach for NULL is based on lowest common denominator behavior</span>
|
||
<span class="c1"># i.e. if one of the supported databases is raising an error (rather than</span>
|
||
<span class="c1"># return NULL) for `val <op> NULL`, then Django raises FieldError.</span>
|
||
|
||
<span class="n">_connector_combinations</span> <span class="o">=</span> <span class="p">[</span>
|
||
<span class="c1"># Numeric operations - operands of same type.</span>
|
||
<span class="c1"># PositiveIntegerField should take precedence over IntegerField (except</span>
|
||
<span class="c1"># subtraction).</span>
|
||
<span class="p">{</span>
|
||
<span class="n">connector</span><span class="p">:</span> <span class="p">[</span>
|
||
<span class="p">(</span>
|
||
<span class="n">fields</span><span class="o">.</span><span class="n">PositiveIntegerField</span><span class="p">,</span>
|
||
<span class="n">fields</span><span class="o">.</span><span class="n">PositiveIntegerField</span><span class="p">,</span>
|
||
<span class="n">fields</span><span class="o">.</span><span class="n">PositiveIntegerField</span><span class="p">,</span>
|
||
<span class="p">),</span>
|
||
<span class="p">]</span>
|
||
<span class="k">for</span> <span class="n">connector</span> <span class="ow">in</span> <span class="p">(</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">ADD</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">MUL</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">DIV</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">MOD</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">POW</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
<span class="p">},</span>
|
||
<span class="c1"># Other numeric operands.</span>
|
||
<span class="p">{</span>
|
||
<span class="n">connector</span><span class="p">:</span> <span class="p">[</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">),</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">FloatField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">FloatField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">FloatField</span><span class="p">),</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">DecimalField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DecimalField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DecimalField</span><span class="p">),</span>
|
||
<span class="p">]</span>
|
||
<span class="k">for</span> <span class="n">connector</span> <span class="ow">in</span> <span class="p">(</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">ADD</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">SUB</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">MUL</span><span class="p">,</span>
|
||
<span class="c1"># Behavior for DIV with integer arguments follows Postgres/SQLite,</span>
|
||
<span class="c1"># not MySQL/Oracle.</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">DIV</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">MOD</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">POW</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
<span class="p">},</span>
|
||
<span class="c1"># Numeric operations - operands of different type.</span>
|
||
<span class="p">{</span>
|
||
<span class="n">connector</span><span class="p">:</span> <span class="p">[</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DecimalField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DecimalField</span><span class="p">),</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">DecimalField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DecimalField</span><span class="p">),</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">FloatField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">FloatField</span><span class="p">),</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">FloatField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">FloatField</span><span class="p">),</span>
|
||
<span class="p">]</span>
|
||
<span class="k">for</span> <span class="n">connector</span> <span class="ow">in</span> <span class="p">(</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">ADD</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">SUB</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">MUL</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">DIV</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">MOD</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
<span class="p">},</span>
|
||
<span class="c1"># Bitwise operators.</span>
|
||
<span class="p">{</span>
|
||
<span class="n">connector</span><span class="p">:</span> <span class="p">[</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">),</span>
|
||
<span class="p">]</span>
|
||
<span class="k">for</span> <span class="n">connector</span> <span class="ow">in</span> <span class="p">(</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">BITAND</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">BITOR</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">BITLEFTSHIFT</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">BITRIGHTSHIFT</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">BITXOR</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
<span class="p">},</span>
|
||
<span class="c1"># Numeric with NULL.</span>
|
||
<span class="p">{</span>
|
||
<span class="n">connector</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span>
|
||
<span class="n">chain</span><span class="o">.</span><span class="n">from_iterable</span><span class="p">(</span>
|
||
<span class="p">[(</span><span class="n">field_type</span><span class="p">,</span> <span class="n">NoneType</span><span class="p">,</span> <span class="n">field_type</span><span class="p">),</span> <span class="p">(</span><span class="n">NoneType</span><span class="p">,</span> <span class="n">field_type</span><span class="p">,</span> <span class="n">field_type</span><span class="p">)]</span>
|
||
<span class="k">for</span> <span class="n">field_type</span> <span class="ow">in</span> <span class="p">(</span>
|
||
<span class="n">fields</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">,</span>
|
||
<span class="n">fields</span><span class="o">.</span><span class="n">DecimalField</span><span class="p">,</span>
|
||
<span class="n">fields</span><span class="o">.</span><span class="n">FloatField</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
<span class="p">)</span>
|
||
<span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">connector</span> <span class="ow">in</span> <span class="p">(</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">ADD</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">SUB</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">MUL</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">DIV</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">MOD</span><span class="p">,</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">POW</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
<span class="p">},</span>
|
||
<span class="c1"># Date/DateTimeField/DurationField/TimeField.</span>
|
||
<span class="p">{</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">ADD</span><span class="p">:</span> <span class="p">[</span>
|
||
<span class="c1"># Date/DateTimeField.</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">DateField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">),</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">),</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DateField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">),</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">),</span>
|
||
<span class="c1"># DurationField.</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">),</span>
|
||
<span class="c1"># TimeField.</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">TimeField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">TimeField</span><span class="p">),</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">TimeField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">TimeField</span><span class="p">),</span>
|
||
<span class="p">],</span>
|
||
<span class="p">},</span>
|
||
<span class="p">{</span>
|
||
<span class="n">Combinable</span><span class="o">.</span><span class="n">SUB</span><span class="p">:</span> <span class="p">[</span>
|
||
<span class="c1"># Date/DateTimeField.</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">DateField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">),</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">),</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">DateField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DateField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">),</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">DateField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">),</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DateField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">),</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">),</span>
|
||
<span class="c1"># DurationField.</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">),</span>
|
||
<span class="c1"># TimeField.</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">TimeField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">TimeField</span><span class="p">),</span>
|
||
<span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">TimeField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">TimeField</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">),</span>
|
||
<span class="p">],</span>
|
||
<span class="p">},</span>
|
||
<span class="p">]</span>
|
||
|
||
<span class="n">_connector_combinators</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
|
||
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">register_combinable_fields</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">connector</span><span class="p">,</span> <span class="n">rhs</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Register combinable types:</span>
|
||
<span class="sd"> lhs <connector> rhs -> result</span>
|
||
<span class="sd"> e.g.</span>
|
||
<span class="sd"> register_combinable_fields(</span>
|
||
<span class="sd"> IntegerField, Combinable.ADD, FloatField, FloatField</span>
|
||
<span class="sd"> )</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">_connector_combinators</span><span class="p">[</span><span class="n">connector</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">,</span> <span class="n">result</span><span class="p">))</span>
|
||
|
||
|
||
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">_connector_combinations</span><span class="p">:</span>
|
||
<span class="k">for</span> <span class="n">connector</span><span class="p">,</span> <span class="n">field_types</span> <span class="ow">in</span> <span class="n">d</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||
<span class="k">for</span> <span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">,</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">field_types</span><span class="p">:</span>
|
||
<span class="n">register_combinable_fields</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">connector</span><span class="p">,</span> <span class="n">rhs</span><span class="p">,</span> <span class="n">result</span><span class="p">)</span>
|
||
|
||
|
||
<span class="nd">@functools</span><span class="o">.</span><span class="n">lru_cache</span><span class="p">(</span><span class="n">maxsize</span><span class="o">=</span><span class="mi">128</span><span class="p">)</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">_resolve_combined_type</span><span class="p">(</span><span class="n">connector</span><span class="p">,</span> <span class="n">lhs_type</span><span class="p">,</span> <span class="n">rhs_type</span><span class="p">):</span>
|
||
<span class="n">combinators</span> <span class="o">=</span> <span class="n">_connector_combinators</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">connector</span><span class="p">,</span> <span class="p">())</span>
|
||
<span class="k">for</span> <span class="n">combinator_lhs_type</span><span class="p">,</span> <span class="n">combinator_rhs_type</span><span class="p">,</span> <span class="n">combined_type</span> <span class="ow">in</span> <span class="n">combinators</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">lhs_type</span><span class="p">,</span> <span class="n">combinator_lhs_type</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">issubclass</span><span class="p">(</span>
|
||
<span class="n">rhs_type</span><span class="p">,</span> <span class="n">combinator_rhs_type</span>
|
||
<span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">combined_type</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">CombinedExpression</span><span class="p">(</span><span class="n">SQLiteNumericMixin</span><span class="p">,</span> <span class="n">Expression</span><span class="p">):</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lhs</span><span class="p">,</span> <span class="n">connector</span><span class="p">,</span> <span class="n">rhs</span><span class="p">,</span> <span class="n">output_field</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">output_field</span><span class="o">=</span><span class="n">output_field</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">connector</span> <span class="o">=</span> <span class="n">connector</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">lhs</span> <span class="o">=</span> <span class="n">lhs</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">rhs</span> <span class="o">=</span> <span class="n">rhs</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"<</span><span class="si">{}</span><span class="s2">: </span><span class="si">{}</span><span class="s2">>"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"</span><span class="si">{}</span><span class="s2"> </span><span class="si">{}</span><span class="s2"> </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">connector</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">set_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span> <span class="o">=</span> <span class="n">exprs</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">_resolve_output_field</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="c1"># We avoid using super() here for reasons given in</span>
|
||
<span class="c1"># Expression._resolve_output_field()</span>
|
||
<span class="n">combined_type</span> <span class="o">=</span> <span class="n">_resolve_combined_type</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">connector</span><span class="p">,</span>
|
||
<span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="o">.</span><span class="n">_output_field_or_none</span><span class="p">),</span>
|
||
<span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="o">.</span><span class="n">_output_field_or_none</span><span class="p">),</span>
|
||
<span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">combined_type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="n">FieldError</span><span class="p">(</span>
|
||
<span class="sa">f</span><span class="s2">"Cannot infer type of </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">connector</span><span class="si">!r}</span><span class="s2"> expression involving these "</span>
|
||
<span class="sa">f</span><span class="s2">"types: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="o">.</span><span class="n">output_field</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">, "</span>
|
||
<span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="o">.</span><span class="n">output_field</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">. You must set "</span>
|
||
<span class="sa">f</span><span class="s2">"output_field."</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">combined_type</span><span class="p">()</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="n">expressions</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="n">expression_params</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="n">sql</span><span class="p">,</span> <span class="n">params</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">)</span>
|
||
<span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sql</span><span class="p">)</span>
|
||
<span class="n">expression_params</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
|
||
<span class="n">sql</span><span class="p">,</span> <span class="n">params</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">)</span>
|
||
<span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sql</span><span class="p">)</span>
|
||
<span class="n">expression_params</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
|
||
<span class="c1"># order of precedence</span>
|
||
<span class="n">expression_wrapper</span> <span class="o">=</span> <span class="s2">"(</span><span class="si">%s</span><span class="s2">)"</span>
|
||
<span class="n">sql</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">combine_expression</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connector</span><span class="p">,</span> <span class="n">expressions</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">expression_wrapper</span> <span class="o">%</span> <span class="n">sql</span><span class="p">,</span> <span class="n">expression_params</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">allow_joins</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">reuse</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">summarize</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">for_save</span><span class="o">=</span><span class="kc">False</span>
|
||
<span class="p">):</span>
|
||
<span class="n">resolved</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">resolve_expression</span><span class="p">(</span>
|
||
<span class="n">query</span><span class="p">,</span>
|
||
<span class="n">allow_joins</span><span class="p">,</span>
|
||
<span class="n">reuse</span><span class="p">,</span>
|
||
<span class="n">summarize</span><span class="p">,</span>
|
||
<span class="n">for_save</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">(</span><span class="n">DurationExpression</span><span class="p">,</span> <span class="n">TemporalSubtraction</span><span class="p">)):</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">lhs_type</span> <span class="o">=</span> <span class="n">resolved</span><span class="o">.</span><span class="n">lhs</span><span class="o">.</span><span class="n">output_field</span><span class="o">.</span><span class="n">get_internal_type</span><span class="p">()</span>
|
||
<span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="n">FieldError</span><span class="p">):</span>
|
||
<span class="n">lhs_type</span> <span class="o">=</span> <span class="kc">None</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">rhs_type</span> <span class="o">=</span> <span class="n">resolved</span><span class="o">.</span><span class="n">rhs</span><span class="o">.</span><span class="n">output_field</span><span class="o">.</span><span class="n">get_internal_type</span><span class="p">()</span>
|
||
<span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="n">FieldError</span><span class="p">):</span>
|
||
<span class="n">rhs_type</span> <span class="o">=</span> <span class="kc">None</span>
|
||
<span class="k">if</span> <span class="s2">"DurationField"</span> <span class="ow">in</span> <span class="p">{</span><span class="n">lhs_type</span><span class="p">,</span> <span class="n">rhs_type</span><span class="p">}</span> <span class="ow">and</span> <span class="n">lhs_type</span> <span class="o">!=</span> <span class="n">rhs_type</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">DurationExpression</span><span class="p">(</span>
|
||
<span class="n">resolved</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="n">resolved</span><span class="o">.</span><span class="n">connector</span><span class="p">,</span> <span class="n">resolved</span><span class="o">.</span><span class="n">rhs</span>
|
||
<span class="p">)</span>
|
||
<span class="n">datetime_fields</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"DateField"</span><span class="p">,</span> <span class="s2">"DateTimeField"</span><span class="p">,</span> <span class="s2">"TimeField"</span><span class="p">}</span>
|
||
<span class="k">if</span> <span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">connector</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">SUB</span>
|
||
<span class="ow">and</span> <span class="n">lhs_type</span> <span class="ow">in</span> <span class="n">datetime_fields</span>
|
||
<span class="ow">and</span> <span class="n">lhs_type</span> <span class="o">==</span> <span class="n">rhs_type</span>
|
||
<span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">TemporalSubtraction</span><span class="p">(</span><span class="n">resolved</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="n">resolved</span><span class="o">.</span><span class="n">rhs</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">resolved</span>
|
||
|
||
<span class="nd">@cached_property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">allowed_default</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="o">.</span><span class="n">allowed_default</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="o">.</span><span class="n">allowed_default</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">DurationExpression</span><span class="p">(</span><span class="n">CombinedExpression</span><span class="p">):</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">compile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">side</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">output</span> <span class="o">=</span> <span class="n">side</span><span class="o">.</span><span class="n">output_field</span>
|
||
<span class="k">except</span> <span class="n">FieldError</span><span class="p">:</span>
|
||
<span class="k">pass</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="n">output</span><span class="o">.</span><span class="n">get_internal_type</span><span class="p">()</span> <span class="o">==</span> <span class="s2">"DurationField"</span><span class="p">:</span>
|
||
<span class="n">sql</span><span class="p">,</span> <span class="n">params</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">side</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">format_for_duration_arithmetic</span><span class="p">(</span><span class="n">sql</span><span class="p">),</span> <span class="n">params</span>
|
||
<span class="k">return</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">side</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">has_native_duration_field</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">as_sql</span><span class="p">(</span><span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">)</span>
|
||
<span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">check_expression_support</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
||
<span class="n">expressions</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="n">expression_params</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="n">sql</span><span class="p">,</span> <span class="n">params</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">)</span>
|
||
<span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sql</span><span class="p">)</span>
|
||
<span class="n">expression_params</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
|
||
<span class="n">sql</span><span class="p">,</span> <span class="n">params</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">)</span>
|
||
<span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sql</span><span class="p">)</span>
|
||
<span class="n">expression_params</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
|
||
<span class="c1"># order of precedence</span>
|
||
<span class="n">expression_wrapper</span> <span class="o">=</span> <span class="s2">"(</span><span class="si">%s</span><span class="s2">)"</span>
|
||
<span class="n">sql</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">combine_duration_expression</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connector</span><span class="p">,</span> <span class="n">expressions</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">expression_wrapper</span> <span class="o">%</span> <span class="n">sql</span><span class="p">,</span> <span class="n">expression_params</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sqlite</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="o">**</span><span class="n">extra_context</span><span class="p">):</span>
|
||
<span class="n">sql</span><span class="p">,</span> <span class="n">params</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">as_sql</span><span class="p">(</span><span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="o">**</span><span class="n">extra_context</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">connector</span> <span class="ow">in</span> <span class="p">{</span><span class="n">Combinable</span><span class="o">.</span><span class="n">MUL</span><span class="p">,</span> <span class="n">Combinable</span><span class="o">.</span><span class="n">DIV</span><span class="p">}:</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">lhs_type</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="o">.</span><span class="n">output_field</span><span class="o">.</span><span class="n">get_internal_type</span><span class="p">()</span>
|
||
<span class="n">rhs_type</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="o">.</span><span class="n">output_field</span><span class="o">.</span><span class="n">get_internal_type</span><span class="p">()</span>
|
||
<span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="n">FieldError</span><span class="p">):</span>
|
||
<span class="k">pass</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">allowed_fields</span> <span class="o">=</span> <span class="p">{</span>
|
||
<span class="s2">"DecimalField"</span><span class="p">,</span>
|
||
<span class="s2">"DurationField"</span><span class="p">,</span>
|
||
<span class="s2">"FloatField"</span><span class="p">,</span>
|
||
<span class="s2">"IntegerField"</span><span class="p">,</span>
|
||
<span class="p">}</span>
|
||
<span class="k">if</span> <span class="n">lhs_type</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">allowed_fields</span> <span class="ow">or</span> <span class="n">rhs_type</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">allowed_fields</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="n">DatabaseError</span><span class="p">(</span>
|
||
<span class="sa">f</span><span class="s2">"Invalid arguments for operator </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">connector</span><span class="si">}</span><span class="s2">."</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">sql</span><span class="p">,</span> <span class="n">params</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">TemporalSubtraction</span><span class="p">(</span><span class="n">CombinedExpression</span><span class="p">):</span>
|
||
<span class="n">output_field</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">()</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span><span class="p">):</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">SUB</span><span class="p">,</span> <span class="n">rhs</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">check_expression_support</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
||
<span class="n">lhs</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">)</span>
|
||
<span class="n">rhs</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">subtract_temporals</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="o">.</span><span class="n">output_field</span><span class="o">.</span><span class="n">get_internal_type</span><span class="p">(),</span> <span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span>
|
||
<span class="p">)</span>
|
||
|
||
|
||
<div class="viewcode-block" id="F">
|
||
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.F">[docs]</a>
|
||
<span class="nd">@deconstructible</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="s2">"django.db.models.F"</span><span class="p">)</span>
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">F</span><span class="p">(</span><span class="n">Combinable</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""An object capable of resolving references to existing query objects."""</span>
|
||
|
||
<span class="n">allowed_default</span> <span class="o">=</span> <span class="kc">False</span>
|
||
|
||
<div class="viewcode-block" id="F.__init__">
|
||
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.F.__init__">[docs]</a>
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Arguments:</span>
|
||
<span class="sd"> * name: the name of the field this expression references</span>
|
||
<span class="sd"> """</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span></div>
|
||
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"</span><span class="si">{}</span><span class="s2">(</span><span class="si">{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">subscript</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">Sliced</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">subscript</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="c1"># Disable old-style iteration protocol inherited from implementing</span>
|
||
<span class="c1"># __getitem__() to prevent this method from hanging.</span>
|
||
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"argument of type '</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">' is not iterable"</span><span class="p">)</span>
|
||
|
||
<div class="viewcode-block" id="F.resolve_expression">
|
||
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.F.resolve_expression">[docs]</a>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">allow_joins</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">reuse</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">summarize</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">for_save</span><span class="o">=</span><span class="kc">False</span>
|
||
<span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">resolve_ref</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">allow_joins</span><span class="p">,</span> <span class="n">reuse</span><span class="p">,</span> <span class="n">summarize</span><span class="p">)</span></div>
|
||
|
||
|
||
<div class="viewcode-block" id="F.replace_expressions">
|
||
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.F.replace_expressions">[docs]</a>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">replace_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">replacements</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="p">(</span><span class="n">replacement</span> <span class="o">:=</span> <span class="n">replacements</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">replacement</span>
|
||
<span class="n">field_name</span><span class="p">,</span> <span class="o">*</span><span class="n">transforms</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">LOOKUP_SEP</span><span class="p">)</span>
|
||
<span class="c1"># Avoid unnecessarily looking up replacements with field_name again as</span>
|
||
<span class="c1"># in the vast majority of cases F instances won't be composed of any</span>
|
||
<span class="c1"># lookups.</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">transforms</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="bp">self</span>
|
||
<span class="k">if</span> <span class="p">(</span>
|
||
<span class="n">replacement</span> <span class="o">:=</span> <span class="n">replacements</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">F</span><span class="p">(</span><span class="n">field_name</span><span class="p">))</span>
|
||
<span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">replacement</span><span class="o">.</span><span class="n">_output_field_or_none</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="bp">self</span>
|
||
<span class="k">for</span> <span class="n">transform</span> <span class="ow">in</span> <span class="n">transforms</span><span class="p">:</span>
|
||
<span class="n">transform_class</span> <span class="o">=</span> <span class="n">replacement</span><span class="o">.</span><span class="n">get_transform</span><span class="p">(</span><span class="n">transform</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">transform_class</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="bp">self</span>
|
||
<span class="n">replacement</span> <span class="o">=</span> <span class="n">transform_class</span><span class="p">(</span><span class="n">replacement</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">replacement</span></div>
|
||
|
||
|
||
<div class="viewcode-block" id="F.asc">
|
||
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.F.asc">[docs]</a>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">asc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">OrderBy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
|
||
|
||
|
||
<div class="viewcode-block" id="F.desc">
|
||
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.F.desc">[docs]</a>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">desc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">OrderBy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">descending</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
|
||
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="vm">__class__</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">name</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="nb">hash</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
||
|
||
<div class="viewcode-block" id="F.copy">
|
||
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.F.copy">[docs]</a>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
|
||
</div>
|
||
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">ResolvedOuterRef</span><span class="p">(</span><span class="n">F</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> An object that contains a reference to an outer query.</span>
|
||
|
||
<span class="sd"> In this case, the reference to the outer query has been resolved because</span>
|
||
<span class="sd"> the inner query has been used as a subquery.</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">contains_aggregate</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="n">contains_over_clause</span> <span class="o">=</span> <span class="kc">False</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
||
<span class="s2">"This queryset contains a reference to an outer query and may "</span>
|
||
<span class="s2">"only be used in a subquery."</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||
<span class="n">col</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">resolve_expression</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">col</span><span class="o">.</span><span class="n">contains_over_clause</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="n">NotSupportedError</span><span class="p">(</span>
|
||
<span class="sa">f</span><span class="s2">"Referencing outer query window expression is not supported: "</span>
|
||
<span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">."</span>
|
||
<span class="p">)</span>
|
||
<span class="c1"># FIXME: Rename possibly_multivalued to multivalued and fix detection</span>
|
||
<span class="c1"># for non-multivalued JOINs (e.g. foreign key fields). This should take</span>
|
||
<span class="c1"># into account only many-to-many and one-to-many relationships.</span>
|
||
<span class="n">col</span><span class="o">.</span><span class="n">possibly_multivalued</span> <span class="o">=</span> <span class="n">LOOKUP_SEP</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
|
||
<span class="k">return</span> <span class="n">col</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">relabeled_clone</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">relabels</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_group_by_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[]</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">OuterRef</span><span class="p">(</span><span class="n">F</span><span class="p">):</span>
|
||
<span class="n">contains_aggregate</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="n">contains_over_clause</span> <span class="o">=</span> <span class="kc">False</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
|
||
<span class="k">return</span> <span class="n">ResolvedOuterRef</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">relabeled_clone</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">relabels</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">Sliced</span><span class="p">(</span><span class="n">F</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> An object that contains a slice of an F expression.</span>
|
||
|
||
<span class="sd"> Object resolves the column on which the slicing is applied, and then</span>
|
||
<span class="sd"> applies the slicing if possible.</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">subscript</span><span class="p">):</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="o">=</span> <span class="n">obj</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">subscript</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="n">subscript</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Negative indexing is not supported."</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">start</span> <span class="o">=</span> <span class="n">subscript</span> <span class="o">+</span> <span class="mi">1</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">length</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">subscript</span><span class="p">,</span> <span class="nb">slice</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="p">(</span><span class="n">subscript</span><span class="o">.</span><span class="n">start</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">subscript</span><span class="o">.</span><span class="n">start</span> <span class="o"><</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span>
|
||
<span class="n">subscript</span><span class="o">.</span><span class="n">stop</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">subscript</span><span class="o">.</span><span class="n">stop</span> <span class="o"><</span> <span class="mi">0</span>
|
||
<span class="p">):</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Negative indexing is not supported."</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">subscript</span><span class="o">.</span><span class="n">step</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Step argument is not supported."</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">subscript</span><span class="o">.</span><span class="n">stop</span> <span class="ow">and</span> <span class="n">subscript</span><span class="o">.</span><span class="n">start</span> <span class="ow">and</span> <span class="n">subscript</span><span class="o">.</span><span class="n">stop</span> <span class="o"><</span> <span class="n">subscript</span><span class="o">.</span><span class="n">start</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Slice stop must be greater than slice start."</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">start</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">subscript</span><span class="o">.</span><span class="n">start</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">subscript</span><span class="o">.</span><span class="n">start</span> <span class="o">+</span> <span class="mi">1</span>
|
||
<span class="k">if</span> <span class="n">subscript</span><span class="o">.</span><span class="n">stop</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">length</span> <span class="o">=</span> <span class="kc">None</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">length</span> <span class="o">=</span> <span class="n">subscript</span><span class="o">.</span><span class="n">stop</span> <span class="o">-</span> <span class="p">(</span><span class="n">subscript</span><span class="o">.</span><span class="n">start</span> <span class="ow">or</span> <span class="mi">0</span><span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"Argument to slice must be either int or slice instance."</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="n">start</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">start</span> <span class="o">-</span> <span class="mi">1</span>
|
||
<span class="n">stop</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">length</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">start</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">length</span>
|
||
<span class="n">subscript</span> <span class="o">=</span> <span class="nb">slice</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">stop</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__qualname__</span><span class="si">}</span><span class="s2">(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="si">!r}</span><span class="s2">, </span><span class="si">{</span><span class="n">subscript</span><span class="si">!r}</span><span class="s2">)"</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span>
|
||
<span class="n">query</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
||
<span class="n">allow_joins</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
||
<span class="n">reuse</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
||
<span class="n">summarize</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||
<span class="n">for_save</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||
<span class="p">):</span>
|
||
<span class="n">resolved</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">resolve_ref</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">allow_joins</span><span class="p">,</span> <span class="n">reuse</span><span class="p">,</span> <span class="n">summarize</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="p">,</span> <span class="p">(</span><span class="n">OuterRef</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">)):</span>
|
||
<span class="n">expr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">resolve_expression</span><span class="p">(</span>
|
||
<span class="n">query</span><span class="p">,</span> <span class="n">allow_joins</span><span class="p">,</span> <span class="n">reuse</span><span class="p">,</span> <span class="n">summarize</span><span class="p">,</span> <span class="n">for_save</span>
|
||
<span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">expr</span> <span class="o">=</span> <span class="n">resolved</span>
|
||
<span class="k">return</span> <span class="n">resolved</span><span class="o">.</span><span class="n">output_field</span><span class="o">.</span><span class="n">slice_expression</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">length</span><span class="p">)</span>
|
||
|
||
|
||
<span class="nd">@deconstructible</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="s2">"django.db.models.Func"</span><span class="p">)</span>
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">Func</span><span class="p">(</span><span class="n">SQLiteNumericMixin</span><span class="p">,</span> <span class="n">Expression</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""An SQL function call."""</span>
|
||
|
||
<span class="n">function</span> <span class="o">=</span> <span class="kc">None</span>
|
||
<span class="n">template</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%(function)s</span><span class="s2">(</span><span class="si">%(expressions)s</span><span class="s2">)"</span>
|
||
<span class="n">arg_joiner</span> <span class="o">=</span> <span class="s2">", "</span>
|
||
<span class="n">arity</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># The number of arguments the function accepts.</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">expressions</span><span class="p">,</span> <span class="n">output_field</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">arity</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">arity</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
||
<span class="s2">"'</span><span class="si">%s</span><span class="s2">' takes exactly </span><span class="si">%s</span><span class="s2"> </span><span class="si">%s</span><span class="s2"> (</span><span class="si">%s</span><span class="s2"> given)"</span>
|
||
<span class="o">%</span> <span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">arity</span><span class="p">,</span>
|
||
<span class="s2">"argument"</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">arity</span> <span class="o">==</span> <span class="mi">1</span> <span class="k">else</span> <span class="s2">"arguments"</span><span class="p">,</span>
|
||
<span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">),</span>
|
||
<span class="p">)</span>
|
||
<span class="p">)</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">output_field</span><span class="o">=</span><span class="n">output_field</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">source_expressions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expressions</span><span class="p">(</span><span class="o">*</span><span class="n">expressions</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">extra</span> <span class="o">=</span> <span class="n">extra</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="n">args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">arg_joiner</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_expressions</span><span class="p">)</span>
|
||
<span class="n">extra</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">extra</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_repr_options</span><span class="p">()}</span>
|
||
<span class="k">if</span> <span class="n">extra</span><span class="p">:</span>
|
||
<span class="n">extra</span> <span class="o">=</span> <span class="s2">", "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
||
<span class="nb">str</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"="</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">extra</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="s2">"</span><span class="si">{}</span><span class="s2">(</span><span class="si">{}</span><span class="s2">, </span><span class="si">{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">extra</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="s2">"</span><span class="si">{}</span><span class="s2">(</span><span class="si">{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">_get_repr_options</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""Return a dict of extra __init__() options to include in the repr."""</span>
|
||
<span class="k">return</span> <span class="p">{}</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_expressions</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">set_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">source_expressions</span> <span class="o">=</span> <span class="n">exprs</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span>
|
||
<span class="n">compiler</span><span class="p">,</span>
|
||
<span class="n">connection</span><span class="p">,</span>
|
||
<span class="n">function</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
||
<span class="n">template</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
||
<span class="n">arg_joiner</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
||
<span class="o">**</span><span class="n">extra_context</span><span class="p">,</span>
|
||
<span class="p">):</span>
|
||
<span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">check_expression_support</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
||
<span class="n">sql_parts</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="n">params</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_expressions</span><span class="p">:</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">arg_sql</span><span class="p">,</span> <span class="n">arg_params</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
||
<span class="k">except</span> <span class="n">EmptyResultSet</span><span class="p">:</span>
|
||
<span class="n">empty_result_set_value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span>
|
||
<span class="n">arg</span><span class="p">,</span> <span class="s2">"empty_result_set_value"</span><span class="p">,</span> <span class="bp">NotImplemented</span>
|
||
<span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">empty_result_set_value</span> <span class="ow">is</span> <span class="bp">NotImplemented</span><span class="p">:</span>
|
||
<span class="k">raise</span>
|
||
<span class="n">arg_sql</span><span class="p">,</span> <span class="n">arg_params</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">Value</span><span class="p">(</span><span class="n">empty_result_set_value</span><span class="p">))</span>
|
||
<span class="k">except</span> <span class="n">FullResultSet</span><span class="p">:</span>
|
||
<span class="n">arg_sql</span><span class="p">,</span> <span class="n">arg_params</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">Value</span><span class="p">(</span><span class="kc">True</span><span class="p">))</span>
|
||
<span class="n">sql_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">arg_sql</span><span class="p">)</span>
|
||
<span class="n">params</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">arg_params</span><span class="p">)</span>
|
||
<span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">extra</span><span class="p">,</span> <span class="o">**</span><span class="n">extra_context</span><span class="p">}</span>
|
||
<span class="c1"># Use the first supplied value in this order: the parameter to this</span>
|
||
<span class="c1"># method, a value supplied in __init__()'s **extra (the value in</span>
|
||
<span class="c1"># `data`), or the value defined on the class.</span>
|
||
<span class="k">if</span> <span class="n">function</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="n">data</span><span class="p">[</span><span class="s2">"function"</span><span class="p">]</span> <span class="o">=</span> <span class="n">function</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">data</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">"function"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">function</span><span class="p">)</span>
|
||
<span class="n">template</span> <span class="o">=</span> <span class="n">template</span> <span class="ow">or</span> <span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"template"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="p">)</span>
|
||
<span class="n">arg_joiner</span> <span class="o">=</span> <span class="n">arg_joiner</span> <span class="ow">or</span> <span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"arg_joiner"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">arg_joiner</span><span class="p">)</span>
|
||
<span class="n">data</span><span class="p">[</span><span class="s2">"expressions"</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="s2">"field"</span><span class="p">]</span> <span class="o">=</span> <span class="n">arg_joiner</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">sql_parts</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">template</span> <span class="o">%</span> <span class="n">data</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="n">copy</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||
<span class="n">copy</span><span class="o">.</span><span class="n">source_expressions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_expressions</span><span class="p">[:]</span>
|
||
<span class="n">copy</span><span class="o">.</span><span class="n">extra</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">extra</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||
<span class="k">return</span> <span class="n">copy</span>
|
||
|
||
<span class="nd">@cached_property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">allowed_default</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="nb">all</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">allowed_default</span> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_expressions</span><span class="p">)</span>
|
||
|
||
|
||
<span class="nd">@deconstructible</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="s2">"django.db.models.Value"</span><span class="p">)</span>
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">Value</span><span class="p">(</span><span class="n">SQLiteNumericMixin</span><span class="p">,</span> <span class="n">Expression</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""Represent a wrapped value as a node within an expression."""</span>
|
||
|
||
<span class="c1"># Provide a default value for `for_save` in order to allow unresolved</span>
|
||
<span class="c1"># instances to be compiled until a decision is taken in #25425.</span>
|
||
<span class="n">for_save</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="n">allowed_default</span> <span class="o">=</span> <span class="kc">True</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">output_field</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Arguments:</span>
|
||
<span class="sd"> * value: the value this expression represents. The value will be</span>
|
||
<span class="sd"> added into the sql parameter list and properly quoted.</span>
|
||
|
||
<span class="sd"> * output_field: an instance of the model field type that this</span>
|
||
<span class="sd"> expression will return, such as IntegerField() or CharField().</span>
|
||
<span class="sd"> """</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">output_field</span><span class="o">=</span><span class="n">output_field</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">value</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="si">!r}</span><span class="s2">)"</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">check_expression_support</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
||
<span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span>
|
||
<span class="n">output_field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_output_field_or_none</span>
|
||
<span class="k">if</span> <span class="n">output_field</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">for_save</span><span class="p">:</span>
|
||
<span class="n">val</span> <span class="o">=</span> <span class="n">output_field</span><span class="o">.</span><span class="n">get_db_prep_save</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">connection</span><span class="o">=</span><span class="n">connection</span><span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">val</span> <span class="o">=</span> <span class="n">output_field</span><span class="o">.</span><span class="n">get_db_prep_value</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">connection</span><span class="o">=</span><span class="n">connection</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">output_field</span><span class="p">,</span> <span class="s2">"get_placeholder"</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">output_field</span><span class="o">.</span><span class="n">get_placeholder</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">),</span> <span class="p">[</span><span class="n">val</span><span class="p">]</span>
|
||
<span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="c1"># oracledb does not always convert None to the appropriate</span>
|
||
<span class="c1"># NULL type (like in case expressions using numbers), so we</span>
|
||
<span class="c1"># use a literal SQL NULL</span>
|
||
<span class="k">return</span> <span class="s2">"NULL"</span><span class="p">,</span> <span class="p">[]</span>
|
||
<span class="k">return</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="p">[</span><span class="n">val</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">allow_joins</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">reuse</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">summarize</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">for_save</span><span class="o">=</span><span class="kc">False</span>
|
||
<span class="p">):</span>
|
||
<span class="n">c</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">resolve_expression</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">allow_joins</span><span class="p">,</span> <span class="n">reuse</span><span class="p">,</span> <span class="n">summarize</span><span class="p">,</span> <span class="n">for_save</span><span class="p">)</span>
|
||
<span class="n">c</span><span class="o">.</span><span class="n">for_save</span> <span class="o">=</span> <span class="n">for_save</span>
|
||
<span class="k">return</span> <span class="n">c</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_group_by_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">_resolve_output_field</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">fields</span><span class="o">.</span><span class="n">CharField</span><span class="p">()</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">fields</span><span class="o">.</span><span class="n">BooleanField</span><span class="p">()</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">fields</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">()</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="nb">float</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">fields</span><span class="o">.</span><span class="n">FloatField</span><span class="p">()</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">fields</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">()</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">fields</span><span class="o">.</span><span class="n">DateField</span><span class="p">()</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">time</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">fields</span><span class="o">.</span><span class="n">TimeField</span><span class="p">()</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">fields</span><span class="o">.</span><span class="n">DurationField</span><span class="p">()</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">Decimal</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">fields</span><span class="o">.</span><span class="n">DecimalField</span><span class="p">()</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">fields</span><span class="o">.</span><span class="n">BinaryField</span><span class="p">()</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">UUID</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">fields</span><span class="o">.</span><span class="n">UUIDField</span><span class="p">()</span>
|
||
|
||
<span class="nd">@property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">empty_result_set_value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">RawSQL</span><span class="p">(</span><span class="n">Expression</span><span class="p">):</span>
|
||
<span class="n">allowed_default</span> <span class="o">=</span> <span class="kc">True</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sql</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">output_field</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="n">output_field</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="n">output_field</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">Field</span><span class="p">()</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span> <span class="o">=</span> <span class="n">sql</span><span class="p">,</span> <span class="n">params</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">output_field</span><span class="o">=</span><span class="n">output_field</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"</span><span class="si">{}</span><span class="s2">(</span><span class="si">{}</span><span class="s2">, </span><span class="si">{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"(</span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_group_by_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">allow_joins</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">reuse</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">summarize</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">for_save</span><span class="o">=</span><span class="kc">False</span>
|
||
<span class="p">):</span>
|
||
<span class="c1"># Resolve parents fields used in raw SQL.</span>
|
||
<span class="k">if</span> <span class="n">query</span><span class="o">.</span><span class="n">model</span><span class="p">:</span>
|
||
<span class="k">for</span> <span class="n">parent</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">all_parents</span><span class="p">:</span>
|
||
<span class="k">for</span> <span class="n">parent_field</span> <span class="ow">in</span> <span class="n">parent</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">local_fields</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="n">parent_field</span><span class="o">.</span><span class="n">column</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
|
||
<span class="n">query</span><span class="o">.</span><span class="n">resolve_ref</span><span class="p">(</span>
|
||
<span class="n">parent_field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">allow_joins</span><span class="p">,</span> <span class="n">reuse</span><span class="p">,</span> <span class="n">summarize</span>
|
||
<span class="p">)</span>
|
||
<span class="k">break</span>
|
||
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">resolve_expression</span><span class="p">(</span>
|
||
<span class="n">query</span><span class="p">,</span> <span class="n">allow_joins</span><span class="p">,</span> <span class="n">reuse</span><span class="p">,</span> <span class="n">summarize</span><span class="p">,</span> <span class="n">for_save</span>
|
||
<span class="p">)</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">Star</span><span class="p">(</span><span class="n">Expression</span><span class="p">):</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"'*'"</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"*"</span><span class="p">,</span> <span class="p">[]</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">DatabaseDefault</span><span class="p">(</span><span class="n">Expression</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Expression to use DEFAULT keyword during insert otherwise the underlying</span>
|
||
<span class="sd"> expression.</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">output_field</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">output_field</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">set_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
||
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">,)</span> <span class="o">=</span> <span class="n">exprs</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">allow_joins</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">reuse</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">summarize</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">for_save</span><span class="o">=</span><span class="kc">False</span>
|
||
<span class="p">):</span>
|
||
<span class="n">resolved_expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">resolve_expression</span><span class="p">(</span>
|
||
<span class="n">query</span><span class="o">=</span><span class="n">query</span><span class="p">,</span>
|
||
<span class="n">allow_joins</span><span class="o">=</span><span class="n">allow_joins</span><span class="p">,</span>
|
||
<span class="n">reuse</span><span class="o">=</span><span class="n">reuse</span><span class="p">,</span>
|
||
<span class="n">summarize</span><span class="o">=</span><span class="n">summarize</span><span class="p">,</span>
|
||
<span class="n">for_save</span><span class="o">=</span><span class="n">for_save</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
<span class="c1"># Defaults used outside an INSERT context should resolve to their</span>
|
||
<span class="c1"># underlying expression.</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">for_save</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">resolved_expression</span>
|
||
<span class="k">return</span> <span class="n">DatabaseDefault</span><span class="p">(</span>
|
||
<span class="n">resolved_expression</span><span class="p">,</span> <span class="n">output_field</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_output_field_or_none</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_default_keyword_in_insert</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="s2">"DEFAULT"</span><span class="p">,</span> <span class="p">[]</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">Col</span><span class="p">(</span><span class="n">Expression</span><span class="p">):</span>
|
||
<span class="n">contains_column_references</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="n">possibly_multivalued</span> <span class="o">=</span> <span class="kc">False</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">alias</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">output_field</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="n">output_field</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="n">output_field</span> <span class="o">=</span> <span class="n">target</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">output_field</span><span class="o">=</span><span class="n">output_field</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="n">alias</span><span class="p">,</span> <span class="n">target</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="n">alias</span><span class="p">,</span> <span class="n">target</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span>
|
||
<span class="n">identifiers</span> <span class="o">=</span> <span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">target</span><span class="p">))</span> <span class="k">if</span> <span class="n">alias</span> <span class="k">else</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">target</span><span class="p">),)</span>
|
||
<span class="k">return</span> <span class="s2">"</span><span class="si">{}</span><span class="s2">(</span><span class="si">{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="s2">", "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">identifiers</span><span class="p">))</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="n">alias</span><span class="p">,</span> <span class="n">column</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">column</span>
|
||
<span class="n">identifiers</span> <span class="o">=</span> <span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">column</span><span class="p">)</span> <span class="k">if</span> <span class="n">alias</span> <span class="k">else</span> <span class="p">(</span><span class="n">column</span><span class="p">,)</span>
|
||
<span class="n">sql</span> <span class="o">=</span> <span class="s2">"."</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">compiler</span><span class="o">.</span><span class="n">quote_name_unless_alias</span><span class="p">,</span> <span class="n">identifiers</span><span class="p">))</span>
|
||
<span class="k">return</span> <span class="n">sql</span><span class="p">,</span> <span class="p">()</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">relabeled_clone</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">relabels</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">alias</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="bp">self</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">(</span>
|
||
<span class="n">relabels</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">alias</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_field</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_group_by_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_converters</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_field</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_field</span><span class="o">.</span><span class="n">get_db_converters</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_field</span><span class="o">.</span><span class="n">get_db_converters</span><span class="p">(</span>
|
||
<span class="n">connection</span>
|
||
<span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">get_db_converters</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">ColPairs</span><span class="p">(</span><span class="n">Expression</span><span class="p">):</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">alias</span><span class="p">,</span> <span class="n">targets</span><span class="p">,</span> <span class="n">sources</span><span class="p">,</span> <span class="n">output_field</span><span class="p">):</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">output_field</span><span class="o">=</span><span class="n">output_field</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">alias</span> <span class="o">=</span> <span class="n">alias</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">targets</span> <span class="o">=</span> <span class="n">targets</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">sources</span> <span class="o">=</span> <span class="n">sources</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">targets</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_cols</span><span class="p">())</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">(</span>
|
||
<span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">alias</span><span class="si">!r}</span><span class="s2">, </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">targets</span><span class="si">!r}</span><span class="s2">, "</span>
|
||
<span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="si">!r}</span><span class="s2">, </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">output_field</span><span class="si">!r}</span><span class="s2">)"</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[</span>
|
||
<span class="n">Col</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">source</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">target</span><span class="p">,</span> <span class="n">source</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">targets</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="p">)</span>
|
||
<span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cols</span><span class="p">()</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">set_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
||
<span class="k">assert</span> <span class="nb">all</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">Col</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expr</span><span class="o">.</span><span class="n">alias</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">alias</span> <span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="n">exprs</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">targets</span> <span class="o">=</span> <span class="p">[</span><span class="n">col</span><span class="o">.</span><span class="n">target</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">exprs</span><span class="p">]</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">sources</span> <span class="o">=</span> <span class="p">[</span><span class="n">col</span><span class="o">.</span><span class="n">field</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">exprs</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="n">cols_sql</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="n">cols_params</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="n">cols</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cols</span><span class="p">()</span>
|
||
|
||
<span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">cols</span><span class="p">:</span>
|
||
<span class="n">sql</span><span class="p">,</span> <span class="n">params</span> <span class="o">=</span> <span class="n">col</span><span class="o">.</span><span class="n">as_sql</span><span class="p">(</span><span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">)</span>
|
||
<span class="n">cols_sql</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sql</span><span class="p">)</span>
|
||
<span class="n">cols_params</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
|
||
|
||
<span class="k">return</span> <span class="s2">", "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cols_sql</span><span class="p">),</span> <span class="n">cols_params</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">relabeled_clone</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">relabels</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">(</span>
|
||
<span class="n">relabels</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">alias</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">targets</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">select_format</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">sql</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">sql</span><span class="p">,</span> <span class="n">params</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">Ref</span><span class="p">(</span><span class="n">Expression</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Reference to column alias of the query. For example, Ref('sum_cost') in</span>
|
||
<span class="sd"> qs.annotate(sum_cost=Sum('cost')) query.</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">refs</span><span class="p">,</span> <span class="n">source</span><span class="p">):</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">refs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">source</span> <span class="o">=</span> <span class="n">refs</span><span class="p">,</span> <span class="n">source</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"</span><span class="si">{}</span><span class="s2">(</span><span class="si">{}</span><span class="s2">, </span><span class="si">{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">refs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">source</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">source</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">set_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
||
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">source</span><span class="p">,)</span> <span class="o">=</span> <span class="n">exprs</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">allow_joins</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">reuse</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">summarize</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">for_save</span><span class="o">=</span><span class="kc">False</span>
|
||
<span class="p">):</span>
|
||
<span class="c1"># The sub-expression `source` has already been resolved, as this is</span>
|
||
<span class="c1"># just a reference to the name of `source`.</span>
|
||
<span class="k">return</span> <span class="bp">self</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_refs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">{</span><span class="bp">self</span><span class="o">.</span><span class="n">refs</span><span class="p">}</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">relabeled_clone</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">relabels</span><span class="p">):</span>
|
||
<span class="n">clone</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||
<span class="n">clone</span><span class="o">.</span><span class="n">source</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">relabeled_clone</span><span class="p">(</span><span class="n">relabels</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">clone</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">quote_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">refs</span><span class="p">),</span> <span class="p">[]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_group_by_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="p">]</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">ExpressionList</span><span class="p">(</span><span class="n">Func</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> An expression containing multiple expressions. Can be used to provide a</span>
|
||
<span class="sd"> list of expressions as an argument to another expression, like a partition</span>
|
||
<span class="sd"> clause.</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">template</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%(expressions)s</span><span class="s2">"</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">arg_joiner</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_expressions</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_expressions</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="s2">""</span><span class="p">,</span> <span class="p">()</span>
|
||
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">as_sql</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sqlite</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="o">**</span><span class="n">extra_context</span><span class="p">):</span>
|
||
<span class="c1"># Casting to numeric is unnecessary.</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">as_sql</span><span class="p">(</span><span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="o">**</span><span class="n">extra_context</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_group_by_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="n">group_by_cols</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">():</span>
|
||
<span class="n">group_by_cols</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">get_group_by_cols</span><span class="p">())</span>
|
||
<span class="k">return</span> <span class="n">group_by_cols</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">OrderByList</span><span class="p">(</span><span class="n">ExpressionList</span><span class="p">):</span>
|
||
<span class="n">allowed_default</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="n">template</span> <span class="o">=</span> <span class="s2">"ORDER BY </span><span class="si">%(expressions)s</span><span class="s2">"</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">expressions</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span>
|
||
<span class="n">expressions</span> <span class="o">=</span> <span class="p">(</span>
|
||
<span class="p">(</span>
|
||
<span class="n">OrderBy</span><span class="p">(</span><span class="n">F</span><span class="p">(</span><span class="n">expr</span><span class="p">[</span><span class="mi">1</span><span class="p">:]),</span> <span class="n">descending</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"-"</span>
|
||
<span class="k">else</span> <span class="n">expr</span>
|
||
<span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="n">expressions</span>
|
||
<span class="p">)</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">expressions</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">)</span>
|
||
|
||
<span class="nd">@classmethod</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">from_param</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">param</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="n">param</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="kc">None</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">param</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">param</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="kc">None</span>
|
||
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">*</span><span class="n">param</span><span class="p">)</span>
|
||
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">param</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">param</span><span class="p">,</span> <span class="s2">"resolve_expression"</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">param</span><span class="p">)</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
||
<span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">context</span><span class="si">}</span><span class="s2"> must be either a string reference to a "</span>
|
||
<span class="sa">f</span><span class="s2">"field, an expression, or a list or tuple of them not </span><span class="si">{</span><span class="n">param</span><span class="si">!r}</span><span class="s2">."</span>
|
||
<span class="p">)</span>
|
||
|
||
|
||
<div class="viewcode-block" id="ExpressionWrapper">
|
||
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.ExpressionWrapper">[docs]</a>
|
||
<span class="nd">@deconstructible</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="s2">"django.db.models.ExpressionWrapper"</span><span class="p">)</span>
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">ExpressionWrapper</span><span class="p">(</span><span class="n">SQLiteNumericMixin</span><span class="p">,</span> <span class="n">Expression</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> An expression that can wrap another expression so that it can provide</span>
|
||
<span class="sd"> extra context to the inner expression, such as the output_field.</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<div class="viewcode-block" id="ExpressionWrapper.__init__">
|
||
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.ExpressionWrapper.__init__">[docs]</a>
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">output_field</span><span class="p">):</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">output_field</span><span class="o">=</span><span class="n">output_field</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span></div>
|
||
|
||
|
||
<div class="viewcode-block" id="ExpressionWrapper.set_source_expressions">
|
||
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.ExpressionWrapper.set_source_expressions">[docs]</a>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">set_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">expression</span> <span class="o">=</span> <span class="n">exprs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div>
|
||
|
||
|
||
<div class="viewcode-block" id="ExpressionWrapper.get_source_expressions">
|
||
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.ExpressionWrapper.get_source_expressions">[docs]</a>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">]</span></div>
|
||
|
||
|
||
<div class="viewcode-block" id="ExpressionWrapper.get_group_by_cols">
|
||
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.ExpressionWrapper.get_group_by_cols">[docs]</a>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_group_by_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">Expression</span><span class="p">):</span>
|
||
<span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||
<span class="n">expression</span><span class="o">.</span><span class="n">output_field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_field</span>
|
||
<span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">get_group_by_cols</span><span class="p">()</span>
|
||
<span class="c1"># For non-expressions e.g. an SQL WHERE clause, the entire</span>
|
||
<span class="c1"># `expression` must be included in the GROUP BY clause.</span>
|
||
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_group_by_cols</span><span class="p">()</span></div>
|
||
|
||
|
||
<div class="viewcode-block" id="ExpressionWrapper.as_sql">
|
||
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.ExpressionWrapper.as_sql">[docs]</a>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">)</span></div>
|
||
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"</span><span class="si">{}</span><span class="s2">(</span><span class="si">{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">)</span>
|
||
|
||
<span class="nd">@property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">allowed_default</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">allowed_default</span></div>
|
||
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">NegatedExpression</span><span class="p">(</span><span class="n">ExpressionWrapper</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""The logical negation of a conditional expression."""</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">):</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">output_field</span><span class="o">=</span><span class="n">fields</span><span class="o">.</span><span class="n">BooleanField</span><span class="p">())</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__invert__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">sql</span><span class="p">,</span> <span class="n">params</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">as_sql</span><span class="p">(</span><span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">)</span>
|
||
<span class="k">except</span> <span class="n">EmptyResultSet</span><span class="p">:</span>
|
||
<span class="n">features</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">features</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">features</span><span class="o">.</span><span class="n">supports_boolean_expr_in_select_clause</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="s2">"1=1"</span><span class="p">,</span> <span class="p">()</span>
|
||
<span class="k">return</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">Value</span><span class="p">(</span><span class="kc">True</span><span class="p">))</span>
|
||
<span class="n">ops</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">ops</span>
|
||
<span class="c1"># Some database backends (e.g. Oracle) don't allow EXISTS() and filters</span>
|
||
<span class="c1"># to be compared to another expression unless they're wrapped in a CASE</span>
|
||
<span class="c1"># WHEN.</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">ops</span><span class="o">.</span><span class="n">conditional_expression_supported_in_where_clause</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="sa">f</span><span class="s2">"CASE WHEN </span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s2"> = 0 THEN 1 ELSE 0 END"</span><span class="p">,</span> <span class="n">params</span>
|
||
<span class="k">return</span> <span class="sa">f</span><span class="s2">"NOT </span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span> <span class="n">params</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">allow_joins</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">reuse</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">summarize</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">for_save</span><span class="o">=</span><span class="kc">False</span>
|
||
<span class="p">):</span>
|
||
<span class="n">resolved</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">resolve_expression</span><span class="p">(</span>
|
||
<span class="n">query</span><span class="p">,</span> <span class="n">allow_joins</span><span class="p">,</span> <span class="n">reuse</span><span class="p">,</span> <span class="n">summarize</span><span class="p">,</span> <span class="n">for_save</span>
|
||
<span class="p">)</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">resolved</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="s2">"conditional"</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
|
||
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"Cannot negate non-conditional expressions."</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">resolved</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">select_format</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">sql</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
|
||
<span class="c1"># Wrap boolean expressions with a CASE WHEN expression if a database</span>
|
||
<span class="c1"># backend (e.g. Oracle) doesn't support boolean expression in SELECT or</span>
|
||
<span class="c1"># GROUP BY list.</span>
|
||
<span class="n">expression_supported_in_where_clause</span> <span class="o">=</span> <span class="p">(</span>
|
||
<span class="n">compiler</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">conditional_expression_supported_in_where_clause</span>
|
||
<span class="p">)</span>
|
||
<span class="k">if</span> <span class="p">(</span>
|
||
<span class="ow">not</span> <span class="n">compiler</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_boolean_expr_in_select_clause</span>
|
||
<span class="c1"># Avoid double wrapping.</span>
|
||
<span class="ow">and</span> <span class="n">expression_supported_in_where_clause</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">)</span>
|
||
<span class="p">):</span>
|
||
<span class="n">sql</span> <span class="o">=</span> <span class="s2">"CASE WHEN </span><span class="si">{}</span><span class="s2"> THEN 1 ELSE 0 END"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sql</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">sql</span><span class="p">,</span> <span class="n">params</span>
|
||
|
||
|
||
<span class="nd">@deconstructible</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="s2">"django.db.models.When"</span><span class="p">)</span>
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">When</span><span class="p">(</span><span class="n">Expression</span><span class="p">):</span>
|
||
<span class="n">template</span> <span class="o">=</span> <span class="s2">"WHEN </span><span class="si">%(condition)s</span><span class="s2"> THEN </span><span class="si">%(result)s</span><span class="s2">"</span>
|
||
<span class="c1"># This isn't a complete conditional expression, must be used in Case().</span>
|
||
<span class="n">conditional</span> <span class="o">=</span> <span class="kc">False</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">condition</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">then</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">lookups</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="n">lookups</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="n">condition</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="n">condition</span><span class="p">,</span> <span class="n">lookups</span> <span class="o">=</span> <span class="n">Q</span><span class="p">(</span><span class="o">**</span><span class="n">lookups</span><span class="p">),</span> <span class="kc">None</span>
|
||
<span class="k">elif</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">condition</span><span class="p">,</span> <span class="s2">"conditional"</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
|
||
<span class="n">condition</span><span class="p">,</span> <span class="n">lookups</span> <span class="o">=</span> <span class="n">Q</span><span class="p">(</span><span class="n">condition</span><span class="p">,</span> <span class="o">**</span><span class="n">lookups</span><span class="p">),</span> <span class="kc">None</span>
|
||
<span class="k">if</span> <span class="n">condition</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">condition</span><span class="p">,</span> <span class="s2">"conditional"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">or</span> <span class="n">lookups</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
||
<span class="s2">"When() supports a Q object, a boolean expression, or lookups "</span>
|
||
<span class="s2">"as a condition."</span>
|
||
<span class="p">)</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">condition</span><span class="p">,</span> <span class="n">Q</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">condition</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"An empty Q() can't be used as a When() condition."</span><span class="p">)</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">output_field</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">condition</span> <span class="o">=</span> <span class="n">condition</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expressions</span><span class="p">(</span><span class="n">then</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"WHEN </span><span class="si">%r</span><span class="s2"> THEN </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">condition</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"<</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">>"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">condition</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">set_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">condition</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">result</span> <span class="o">=</span> <span class="n">exprs</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">allow_joins</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">reuse</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">summarize</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">for_save</span><span class="o">=</span><span class="kc">False</span>
|
||
<span class="p">):</span>
|
||
<span class="n">c</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">resolve_expression</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">allow_joins</span><span class="p">,</span> <span class="n">reuse</span><span class="p">,</span> <span class="n">summarize</span><span class="p">,</span> <span class="n">for_save</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">for_save</span> <span class="ow">and</span> <span class="n">c</span><span class="o">.</span><span class="n">condition</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="c1"># Resolve condition with for_save=False, since it's used as a</span>
|
||
<span class="c1"># filter.</span>
|
||
<span class="n">c</span><span class="o">.</span><span class="n">condition</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">condition</span><span class="o">.</span><span class="n">resolve_expression</span><span class="p">(</span>
|
||
<span class="n">query</span><span class="p">,</span> <span class="n">allow_joins</span><span class="p">,</span> <span class="n">reuse</span><span class="p">,</span> <span class="n">summarize</span><span class="p">,</span> <span class="n">for_save</span><span class="o">=</span><span class="kc">False</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">c</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_source_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="c1"># We're only interested in the fields of the result expressions.</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="o">.</span><span class="n">_output_field_or_none</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="n">template</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">extra_context</span><span class="p">):</span>
|
||
<span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">check_expression_support</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
||
<span class="n">template_params</span> <span class="o">=</span> <span class="n">extra_context</span>
|
||
<span class="n">sql_params</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="n">condition_sql</span><span class="p">,</span> <span class="n">condition_params</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">condition</span><span class="p">)</span>
|
||
<span class="n">template_params</span><span class="p">[</span><span class="s2">"condition"</span><span class="p">]</span> <span class="o">=</span> <span class="n">condition_sql</span>
|
||
<span class="n">result_sql</span><span class="p">,</span> <span class="n">result_params</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="p">)</span>
|
||
<span class="n">template_params</span><span class="p">[</span><span class="s2">"result"</span><span class="p">]</span> <span class="o">=</span> <span class="n">result_sql</span>
|
||
<span class="n">template</span> <span class="o">=</span> <span class="n">template</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span>
|
||
<span class="k">return</span> <span class="n">template</span> <span class="o">%</span> <span class="n">template_params</span><span class="p">,</span> <span class="p">(</span>
|
||
<span class="o">*</span><span class="n">sql_params</span><span class="p">,</span>
|
||
<span class="o">*</span><span class="n">condition_params</span><span class="p">,</span>
|
||
<span class="o">*</span><span class="n">result_params</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_group_by_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="c1"># This is not a complete expression and cannot be used in GROUP BY.</span>
|
||
<span class="n">cols</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="k">for</span> <span class="n">source</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">():</span>
|
||
<span class="n">cols</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">source</span><span class="o">.</span><span class="n">get_group_by_cols</span><span class="p">())</span>
|
||
<span class="k">return</span> <span class="n">cols</span>
|
||
|
||
<span class="nd">@cached_property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">allowed_default</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">condition</span><span class="o">.</span><span class="n">allowed_default</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="o">.</span><span class="n">allowed_default</span>
|
||
|
||
|
||
<span class="nd">@deconstructible</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="s2">"django.db.models.Case"</span><span class="p">)</span>
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">Case</span><span class="p">(</span><span class="n">SQLiteNumericMixin</span><span class="p">,</span> <span class="n">Expression</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> An SQL searched CASE expression:</span>
|
||
|
||
<span class="sd"> CASE</span>
|
||
<span class="sd"> WHEN n > 0</span>
|
||
<span class="sd"> THEN 'positive'</span>
|
||
<span class="sd"> WHEN n < 0</span>
|
||
<span class="sd"> THEN 'negative'</span>
|
||
<span class="sd"> ELSE 'zero'</span>
|
||
<span class="sd"> END</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">template</span> <span class="o">=</span> <span class="s2">"CASE </span><span class="si">%(cases)s</span><span class="s2"> ELSE </span><span class="si">%(default)s</span><span class="s2"> END"</span>
|
||
<span class="n">case_joiner</span> <span class="o">=</span> <span class="s2">" "</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">cases</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">output_field</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="nb">all</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">case</span><span class="p">,</span> <span class="n">When</span><span class="p">)</span> <span class="k">for</span> <span class="n">case</span> <span class="ow">in</span> <span class="n">cases</span><span class="p">):</span>
|
||
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"Positional arguments must all be When objects."</span><span class="p">)</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">output_field</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">cases</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">cases</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">default</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expressions</span><span class="p">(</span><span class="n">default</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">extra</span> <span class="o">=</span> <span class="n">extra</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"CASE </span><span class="si">%s</span><span class="s2">, ELSE </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span>
|
||
<span class="s2">", "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">cases</span><span class="p">),</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">default</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"<</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">>"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">cases</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">default</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">set_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
||
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">cases</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">default</span> <span class="o">=</span> <span class="n">exprs</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="n">c</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||
<span class="n">c</span><span class="o">.</span><span class="n">cases</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">cases</span><span class="p">[:]</span>
|
||
<span class="k">return</span> <span class="n">c</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="n">template</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">case_joiner</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">extra_context</span>
|
||
<span class="p">):</span>
|
||
<span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">check_expression_support</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">cases</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">default</span><span class="p">)</span>
|
||
<span class="n">template_params</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">extra</span><span class="p">,</span> <span class="o">**</span><span class="n">extra_context</span><span class="p">}</span>
|
||
<span class="n">case_parts</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="n">sql_params</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="k">for</span> <span class="n">case</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">cases</span><span class="p">:</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">case_sql</span><span class="p">,</span> <span class="n">case_params</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">case</span><span class="p">)</span>
|
||
<span class="k">except</span> <span class="n">EmptyResultSet</span><span class="p">:</span>
|
||
<span class="k">continue</span>
|
||
<span class="k">except</span> <span class="n">FullResultSet</span><span class="p">:</span>
|
||
<span class="n">default</span> <span class="o">=</span> <span class="n">case</span><span class="o">.</span><span class="n">result</span>
|
||
<span class="k">break</span>
|
||
<span class="n">case_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">case_sql</span><span class="p">)</span>
|
||
<span class="n">sql_params</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">case_params</span><span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">default</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">default</span>
|
||
<span class="k">if</span> <span class="n">case_parts</span><span class="p">:</span>
|
||
<span class="n">default_sql</span><span class="p">,</span> <span class="n">default_params</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">default</span><span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="p">(</span>
|
||
<span class="nb">isinstance</span><span class="p">(</span><span class="n">default</span><span class="p">,</span> <span class="n">Value</span><span class="p">)</span>
|
||
<span class="ow">and</span> <span class="p">(</span><span class="n">output_field</span> <span class="o">:=</span> <span class="n">default</span><span class="o">.</span><span class="n">_output_field_or_none</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
|
||
<span class="p">):</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.functions</span><span class="w"> </span><span class="kn">import</span> <span class="n">Cast</span>
|
||
|
||
<span class="n">default</span> <span class="o">=</span> <span class="n">Cast</span><span class="p">(</span><span class="n">default</span><span class="p">,</span> <span class="n">output_field</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">default</span><span class="p">)</span>
|
||
|
||
<span class="n">case_joiner</span> <span class="o">=</span> <span class="n">case_joiner</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">case_joiner</span>
|
||
<span class="n">template_params</span><span class="p">[</span><span class="s2">"cases"</span><span class="p">]</span> <span class="o">=</span> <span class="n">case_joiner</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">case_parts</span><span class="p">)</span>
|
||
<span class="n">template_params</span><span class="p">[</span><span class="s2">"default"</span><span class="p">]</span> <span class="o">=</span> <span class="n">default_sql</span>
|
||
<span class="n">sql_params</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">default_params</span><span class="p">)</span>
|
||
<span class="n">template</span> <span class="o">=</span> <span class="n">template</span> <span class="ow">or</span> <span class="n">template_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"template"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="p">)</span>
|
||
<span class="n">sql</span> <span class="o">=</span> <span class="n">template</span> <span class="o">%</span> <span class="n">template_params</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_output_field_or_none</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="n">sql</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">unification_cast_sql</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">output_field</span><span class="p">)</span> <span class="o">%</span> <span class="n">sql</span>
|
||
<span class="k">return</span> <span class="n">sql</span><span class="p">,</span> <span class="n">sql_params</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_group_by_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">cases</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">default</span><span class="o">.</span><span class="n">get_group_by_cols</span><span class="p">()</span>
|
||
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_group_by_cols</span><span class="p">()</span>
|
||
|
||
<span class="nd">@cached_property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">allowed_default</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">default</span><span class="o">.</span><span class="n">allowed_default</span> <span class="ow">and</span> <span class="nb">all</span><span class="p">(</span>
|
||
<span class="n">case_</span><span class="o">.</span><span class="n">allowed_default</span> <span class="k">for</span> <span class="n">case_</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">cases</span>
|
||
<span class="p">)</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">Subquery</span><span class="p">(</span><span class="n">BaseExpression</span><span class="p">,</span> <span class="n">Combinable</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> An explicit subquery. It may contain OuterRef() references to the outer</span>
|
||
<span class="sd"> query which will be resolved when it is applied to that query.</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">template</span> <span class="o">=</span> <span class="s2">"(</span><span class="si">%(subquery)s</span><span class="s2">)"</span>
|
||
<span class="n">contains_aggregate</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="n">empty_result_set_value</span> <span class="o">=</span> <span class="kc">None</span>
|
||
<span class="n">subquery</span> <span class="o">=</span> <span class="kc">True</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">queryset</span><span class="p">,</span> <span class="n">output_field</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">extra</span><span class="p">):</span>
|
||
<span class="c1"># Allow the usage of both QuerySet and sql.Query objects.</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">query</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">queryset</span><span class="p">,</span> <span class="s2">"query"</span><span class="p">,</span> <span class="n">queryset</span><span class="p">)</span><span class="o">.</span><span class="n">clone</span><span class="p">()</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">subquery</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">template</span> <span class="o">=</span> <span class="n">extra</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"template"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">extra</span> <span class="o">=</span> <span class="n">extra</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">output_field</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">set_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">query</span> <span class="o">=</span> <span class="n">exprs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">_resolve_output_field</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">output_field</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||
<span class="n">resolved</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">resolve_expression</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="ow">is</span> <span class="n">Subquery</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span> <span class="o">==</span> <span class="n">Subquery</span><span class="o">.</span><span class="n">template</span><span class="p">:</span>
|
||
<span class="n">resolved</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">contains_subquery</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="c1"># Subquery is an unnecessary shim for a resolved query as it</span>
|
||
<span class="c1"># complexifies the lookup's right-hand-side introspection.</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">output_field</span>
|
||
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">resolved</span><span class="o">.</span><span class="n">query</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_field</span> <span class="ow">and</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">output_field</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">type</span><span class="p">(</span>
|
||
<span class="n">resolved</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">output_field</span>
|
||
<span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">ExpressionWrapper</span><span class="p">(</span><span class="n">resolved</span><span class="o">.</span><span class="n">query</span><span class="p">,</span> <span class="n">output_field</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">output_field</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">resolved</span><span class="o">.</span><span class="n">query</span>
|
||
<span class="k">return</span> <span class="n">resolved</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="n">clone</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||
<span class="n">clone</span><span class="o">.</span><span class="n">query</span> <span class="o">=</span> <span class="n">clone</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">clone</span><span class="p">()</span>
|
||
<span class="k">return</span> <span class="n">clone</span>
|
||
|
||
<span class="nd">@property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">external_aliases</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">external_aliases</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_external_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">get_external_cols</span><span class="p">()</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="n">template</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">extra_context</span><span class="p">):</span>
|
||
<span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">check_expression_support</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
||
<span class="n">template_params</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">extra</span><span class="p">,</span> <span class="o">**</span><span class="n">extra_context</span><span class="p">}</span>
|
||
<span class="n">subquery_sql</span><span class="p">,</span> <span class="n">sql_params</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">as_sql</span><span class="p">(</span><span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">)</span>
|
||
<span class="n">template_params</span><span class="p">[</span><span class="s2">"subquery"</span><span class="p">]</span> <span class="o">=</span> <span class="n">subquery_sql</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
||
|
||
<span class="n">template</span> <span class="o">=</span> <span class="n">template</span> <span class="ow">or</span> <span class="n">template_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"template"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span><span class="p">)</span>
|
||
<span class="n">sql</span> <span class="o">=</span> <span class="n">template</span> <span class="o">%</span> <span class="n">template_params</span>
|
||
<span class="k">return</span> <span class="n">sql</span><span class="p">,</span> <span class="n">sql_params</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_group_by_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">get_group_by_cols</span><span class="p">(</span><span class="n">wrapper</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">Exists</span><span class="p">(</span><span class="n">Subquery</span><span class="p">):</span>
|
||
<span class="n">template</span> <span class="o">=</span> <span class="s2">"EXISTS(</span><span class="si">%(subquery)s</span><span class="s2">)"</span>
|
||
<span class="n">output_field</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">BooleanField</span><span class="p">()</span>
|
||
<span class="n">empty_result_set_value</span> <span class="o">=</span> <span class="kc">False</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">queryset</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">queryset</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">query</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">select_format</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">sql</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
|
||
<span class="c1"># Wrap EXISTS() with a CASE WHEN expression if a database backend</span>
|
||
<span class="c1"># (e.g. Oracle) doesn't support boolean expression in SELECT or GROUP</span>
|
||
<span class="c1"># BY list.</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">compiler</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_boolean_expr_in_select_clause</span><span class="p">:</span>
|
||
<span class="n">sql</span> <span class="o">=</span> <span class="s2">"CASE WHEN </span><span class="si">{}</span><span class="s2"> THEN 1 ELSE 0 END"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sql</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">sql</span><span class="p">,</span> <span class="n">params</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">as_sql</span><span class="p">(</span><span class="n">compiler</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
||
<span class="k">except</span> <span class="n">EmptyResultSet</span><span class="p">:</span>
|
||
<span class="n">features</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">features</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">features</span><span class="o">.</span><span class="n">supports_boolean_expr_in_select_clause</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="s2">"1=0"</span><span class="p">,</span> <span class="p">()</span>
|
||
<span class="k">return</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">Value</span><span class="p">(</span><span class="kc">False</span><span class="p">))</span>
|
||
|
||
|
||
<span class="nd">@deconstructible</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="s2">"django.db.models.OrderBy"</span><span class="p">)</span>
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">OrderBy</span><span class="p">(</span><span class="n">Expression</span><span class="p">):</span>
|
||
<span class="n">template</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%(expression)s</span><span class="s2"> </span><span class="si">%(ordering)s</span><span class="s2">"</span>
|
||
<span class="n">conditional</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="n">constraint_validation_compatible</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="n">allows_composite_expressions</span> <span class="o">=</span> <span class="kc">True</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">descending</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">nulls_first</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">nulls_last</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="n">nulls_first</span> <span class="ow">and</span> <span class="n">nulls_last</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"nulls_first and nulls_last are mutually exclusive"</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">nulls_first</span> <span class="ow">is</span> <span class="kc">False</span> <span class="ow">or</span> <span class="n">nulls_last</span> <span class="ow">is</span> <span class="kc">False</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"nulls_first and nulls_last values must be True or None."</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">nulls_first</span> <span class="o">=</span> <span class="n">nulls_first</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">nulls_last</span> <span class="o">=</span> <span class="n">nulls_last</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">descending</span> <span class="o">=</span> <span class="n">descending</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">"resolve_expression"</span><span class="p">):</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"expression must be an expression type"</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"</span><span class="si">{}</span><span class="s2">(</span><span class="si">{}</span><span class="s2">, descending=</span><span class="si">{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">descending</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">set_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">expression</span> <span class="o">=</span> <span class="n">exprs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="n">template</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">extra_context</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">ColPairs</span><span class="p">):</span>
|
||
<span class="n">sql_parts</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="n">params</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">get_cols</span><span class="p">():</span>
|
||
<span class="n">copy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||
<span class="n">copy</span><span class="o">.</span><span class="n">set_source_expressions</span><span class="p">([</span><span class="n">col</span><span class="p">])</span>
|
||
<span class="n">sql</span><span class="p">,</span> <span class="n">col_params</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">copy</span><span class="p">)</span>
|
||
<span class="n">sql_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sql</span><span class="p">)</span>
|
||
<span class="n">params</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">col_params</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="s2">", "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">sql_parts</span><span class="p">),</span> <span class="n">params</span>
|
||
<span class="n">template</span> <span class="o">=</span> <span class="n">template</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span>
|
||
<span class="k">if</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_order_by_nulls_modifier</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">nulls_last</span><span class="p">:</span>
|
||
<span class="n">template</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2"> NULLS LAST"</span> <span class="o">%</span> <span class="n">template</span>
|
||
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">nulls_first</span><span class="p">:</span>
|
||
<span class="n">template</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2"> NULLS FIRST"</span> <span class="o">%</span> <span class="n">template</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">nulls_last</span> <span class="ow">and</span> <span class="ow">not</span> <span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">descending</span> <span class="ow">and</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">order_by_nulls_first</span>
|
||
<span class="p">):</span>
|
||
<span class="n">template</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%%</span><span class="s2">(expression)s IS NULL, </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">template</span>
|
||
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">nulls_first</span> <span class="ow">and</span> <span class="ow">not</span> <span class="p">(</span>
|
||
<span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">descending</span> <span class="ow">and</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">order_by_nulls_first</span>
|
||
<span class="p">):</span>
|
||
<span class="n">template</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%%</span><span class="s2">(expression)s IS NOT NULL, </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">template</span>
|
||
<span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">check_expression_support</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
||
<span class="n">expression_sql</span><span class="p">,</span> <span class="n">params</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">)</span>
|
||
<span class="n">placeholders</span> <span class="o">=</span> <span class="p">{</span>
|
||
<span class="s2">"expression"</span><span class="p">:</span> <span class="n">expression_sql</span><span class="p">,</span>
|
||
<span class="s2">"ordering"</span><span class="p">:</span> <span class="s2">"DESC"</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">descending</span> <span class="k">else</span> <span class="s2">"ASC"</span><span class="p">,</span>
|
||
<span class="o">**</span><span class="n">extra_context</span><span class="p">,</span>
|
||
<span class="p">}</span>
|
||
<span class="n">params</span> <span class="o">*=</span> <span class="n">template</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s2">"</span><span class="si">%(expression)s</span><span class="s2">"</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="p">(</span><span class="n">template</span> <span class="o">%</span> <span class="n">placeholders</span><span class="p">)</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(),</span> <span class="n">params</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_oracle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="c1"># Oracle < 23c doesn't allow ORDER BY EXISTS() or filters unless it's</span>
|
||
<span class="c1"># wrapped in a CASE WHEN.</span>
|
||
<span class="k">if</span> <span class="p">(</span>
|
||
<span class="ow">not</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_boolean_expr_in_select_clause</span>
|
||
<span class="ow">and</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">conditional_expression_supported_in_where_clause</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">expression</span>
|
||
<span class="p">)</span>
|
||
<span class="p">):</span>
|
||
<span class="n">copy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||
<span class="n">copy</span><span class="o">.</span><span class="n">expression</span> <span class="o">=</span> <span class="n">Case</span><span class="p">(</span>
|
||
<span class="n">When</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">then</span><span class="o">=</span><span class="kc">True</span><span class="p">),</span>
|
||
<span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">copy</span><span class="o">.</span><span class="n">as_sql</span><span class="p">(</span><span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">as_sql</span><span class="p">(</span><span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_group_by_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="n">cols</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="k">for</span> <span class="n">source</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">():</span>
|
||
<span class="n">cols</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">source</span><span class="o">.</span><span class="n">get_group_by_cols</span><span class="p">())</span>
|
||
<span class="k">return</span> <span class="n">cols</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">reverse_ordering</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">descending</span> <span class="o">=</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">descending</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">nulls_first</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">nulls_last</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">nulls_first</span> <span class="o">=</span> <span class="kc">None</span>
|
||
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">nulls_last</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">nulls_first</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">nulls_last</span> <span class="o">=</span> <span class="kc">None</span>
|
||
<span class="k">return</span> <span class="bp">self</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">asc</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">descending</span> <span class="o">=</span> <span class="kc">False</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">desc</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">descending</span> <span class="o">=</span> <span class="kc">True</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">Window</span><span class="p">(</span><span class="n">SQLiteNumericMixin</span><span class="p">,</span> <span class="n">Expression</span><span class="p">):</span>
|
||
<span class="n">template</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%(expression)s</span><span class="s2"> OVER (</span><span class="si">%(window)s</span><span class="s2">)"</span>
|
||
<span class="c1"># Although the main expression may either be an aggregate or an</span>
|
||
<span class="c1"># expression with an aggregate function, the GROUP BY that will</span>
|
||
<span class="c1"># be introduced in the query as a result is not desired.</span>
|
||
<span class="n">contains_aggregate</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="n">contains_over_clause</span> <span class="o">=</span> <span class="kc">True</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span>
|
||
<span class="n">expression</span><span class="p">,</span>
|
||
<span class="n">partition_by</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
||
<span class="n">order_by</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
||
<span class="n">frame</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
||
<span class="n">output_field</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
||
<span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">partition_by</span> <span class="o">=</span> <span class="n">partition_by</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">order_by</span> <span class="o">=</span> <span class="n">order_by</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">frame</span> <span class="o">=</span> <span class="n">frame</span>
|
||
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">"window_compatible"</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
||
<span class="s2">"Expression '</span><span class="si">%s</span><span class="s2">' isn't compatible with OVER clauses."</span>
|
||
<span class="o">%</span> <span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">partition_by</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">partition_by</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">partition_by</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">partition_by</span><span class="p">,)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">partition_by</span> <span class="o">=</span> <span class="n">ExpressionList</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">partition_by</span><span class="p">)</span>
|
||
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">order_by</span> <span class="o">=</span> <span class="n">OrderByList</span><span class="o">.</span><span class="n">from_param</span><span class="p">(</span><span class="s2">"Window.order_by"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">order_by</span><span class="p">)</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">output_field</span><span class="o">=</span><span class="n">output_field</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">source_expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">_resolve_output_field</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_expression</span><span class="o">.</span><span class="n">output_field</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">source_expression</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">partition_by</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">order_by</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">frame</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">set_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">source_expression</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">partition_by</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">order_by</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">frame</span> <span class="o">=</span> <span class="n">exprs</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="n">template</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||
<span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">check_expression_support</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_over_clause</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="n">NotSupportedError</span><span class="p">(</span><span class="s2">"This backend does not support window expressions."</span><span class="p">)</span>
|
||
<span class="n">expr_sql</span><span class="p">,</span> <span class="n">params</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">source_expression</span><span class="p">)</span>
|
||
<span class="n">window_sql</span><span class="p">,</span> <span class="n">window_params</span> <span class="o">=</span> <span class="p">[],</span> <span class="p">()</span>
|
||
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">partition_by</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="n">sql_expr</span><span class="p">,</span> <span class="n">sql_params</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">partition_by</span><span class="o">.</span><span class="n">as_sql</span><span class="p">(</span>
|
||
<span class="n">compiler</span><span class="o">=</span><span class="n">compiler</span><span class="p">,</span>
|
||
<span class="n">connection</span><span class="o">=</span><span class="n">connection</span><span class="p">,</span>
|
||
<span class="n">template</span><span class="o">=</span><span class="s2">"PARTITION BY </span><span class="si">%(expressions)s</span><span class="s2">"</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
<span class="n">window_sql</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sql_expr</span><span class="p">)</span>
|
||
<span class="n">window_params</span> <span class="o">+=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">sql_params</span><span class="p">)</span>
|
||
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">order_by</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="n">order_sql</span><span class="p">,</span> <span class="n">order_params</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">order_by</span><span class="p">)</span>
|
||
<span class="n">window_sql</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">order_sql</span><span class="p">)</span>
|
||
<span class="n">window_params</span> <span class="o">+=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">order_params</span><span class="p">)</span>
|
||
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">frame</span><span class="p">:</span>
|
||
<span class="n">frame_sql</span><span class="p">,</span> <span class="n">frame_params</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">frame</span><span class="p">)</span>
|
||
<span class="n">window_sql</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">frame_sql</span><span class="p">)</span>
|
||
<span class="n">window_params</span> <span class="o">+=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">frame_params</span><span class="p">)</span>
|
||
|
||
<span class="n">template</span> <span class="o">=</span> <span class="n">template</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span>
|
||
|
||
<span class="k">return</span> <span class="p">(</span>
|
||
<span class="n">template</span> <span class="o">%</span> <span class="p">{</span><span class="s2">"expression"</span><span class="p">:</span> <span class="n">expr_sql</span><span class="p">,</span> <span class="s2">"window"</span><span class="p">:</span> <span class="s2">" "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">window_sql</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()},</span>
|
||
<span class="p">(</span><span class="o">*</span><span class="n">params</span><span class="p">,</span> <span class="o">*</span><span class="n">window_params</span><span class="p">),</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sqlite</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">output_field</span><span class="p">,</span> <span class="n">fields</span><span class="o">.</span><span class="n">DecimalField</span><span class="p">):</span>
|
||
<span class="c1"># Casting to numeric must be outside of the window expression.</span>
|
||
<span class="n">copy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
||
<span class="n">source_expressions</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">()</span>
|
||
<span class="n">source_expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">output_field</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">FloatField</span><span class="p">()</span>
|
||
<span class="n">copy</span><span class="o">.</span><span class="n">set_source_expressions</span><span class="p">(</span><span class="n">source_expressions</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">Window</span><span class="p">,</span> <span class="n">copy</span><span class="p">)</span><span class="o">.</span><span class="n">as_sqlite</span><span class="p">(</span><span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">as_sql</span><span class="p">(</span><span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"</span><span class="si">{}</span><span class="s2"> OVER (</span><span class="si">{}{}{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
||
<span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">source_expression</span><span class="p">),</span>
|
||
<span class="s2">"PARTITION BY "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">partition_by</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">partition_by</span> <span class="k">else</span> <span class="s2">""</span><span class="p">,</span>
|
||
<span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">order_by</span> <span class="ow">or</span> <span class="s2">""</span><span class="p">),</span>
|
||
<span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">frame</span> <span class="ow">or</span> <span class="s2">""</span><span class="p">),</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"<</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">>"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_group_by_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="n">group_by_cols</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">partition_by</span><span class="p">:</span>
|
||
<span class="n">group_by_cols</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">partition_by</span><span class="o">.</span><span class="n">get_group_by_cols</span><span class="p">())</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">order_by</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="n">group_by_cols</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">order_by</span><span class="o">.</span><span class="n">get_group_by_cols</span><span class="p">())</span>
|
||
<span class="k">return</span> <span class="n">group_by_cols</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">WindowFrameExclusion</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="n">CURRENT_ROW</span> <span class="o">=</span> <span class="s2">"CURRENT ROW"</span>
|
||
<span class="n">GROUP</span> <span class="o">=</span> <span class="s2">"GROUP"</span>
|
||
<span class="n">TIES</span> <span class="o">=</span> <span class="s2">"TIES"</span>
|
||
<span class="n">NO_OTHERS</span> <span class="o">=</span> <span class="s2">"NO OTHERS"</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__qualname__</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_name_</span><span class="si">}</span><span class="s2">"</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">WindowFrame</span><span class="p">(</span><span class="n">Expression</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Model the frame clause in window expressions. There are two types of frame</span>
|
||
<span class="sd"> clauses which are subclasses, however, all processing and validation (by no</span>
|
||
<span class="sd"> means intended to be complete) is done here. Thus, providing an end for a</span>
|
||
<span class="sd"> frame is optional (the default is UNBOUNDED FOLLOWING, which is the last</span>
|
||
<span class="sd"> row in the frame).</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">template</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%(frame_type)s</span><span class="s2"> BETWEEN </span><span class="si">%(start)s</span><span class="s2"> AND </span><span class="si">%(end)s%(exclude)s</span><span class="s2">"</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">exclusion</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">start</span> <span class="o">=</span> <span class="n">Value</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">end</span> <span class="o">=</span> <span class="n">Value</span><span class="p">(</span><span class="n">end</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">exclusion</span><span class="p">,</span> <span class="p">(</span><span class="n">NoneType</span><span class="p">,</span> <span class="n">WindowFrameExclusion</span><span class="p">)):</span>
|
||
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
|
||
<span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__qualname__</span><span class="si">}</span><span class="s2">.exclusion must be a "</span>
|
||
<span class="s2">"WindowFrameExclusion instance."</span>
|
||
<span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">exclusion</span> <span class="o">=</span> <span class="n">exclusion</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">set_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exprs</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">end</span> <span class="o">=</span> <span class="n">exprs</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_source_expressions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">end</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_exclusion</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">exclusion</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="s2">""</span>
|
||
<span class="k">return</span> <span class="sa">f</span><span class="s2">" EXCLUDE </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">exclusion</span><span class="o">.</span><span class="n">value</span><span class="si">}</span><span class="s2">"</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
|
||
<span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">check_expression_support</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
||
<span class="n">start</span><span class="p">,</span> <span class="n">end</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">window_frame_start_end</span><span class="p">(</span>
|
||
<span class="n">connection</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">end</span><span class="o">.</span><span class="n">value</span>
|
||
<span class="p">)</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">exclusion</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_frame_exclusion</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="n">NotSupportedError</span><span class="p">(</span>
|
||
<span class="s2">"This backend does not support window frame exclusions."</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">template</span>
|
||
<span class="o">%</span> <span class="p">{</span>
|
||
<span class="s2">"frame_type"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">frame_type</span><span class="p">,</span>
|
||
<span class="s2">"start"</span><span class="p">:</span> <span class="n">start</span><span class="p">,</span>
|
||
<span class="s2">"end"</span><span class="p">:</span> <span class="n">end</span><span class="p">,</span>
|
||
<span class="s2">"exclude"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_exclusion</span><span class="p">(),</span>
|
||
<span class="p">},</span>
|
||
<span class="p">[],</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s2">"<</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">>"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_group_by_cols</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">[]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="o">.</span><span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="o">.</span><span class="n">value</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="n">start</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="o">.</span><span class="n">value</span><span class="p">),</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">PRECEDING</span><span class="p">)</span>
|
||
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="o">.</span><span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="o">.</span><span class="n">value</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="n">start</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">CURRENT_ROW</span>
|
||
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="o">.</span><span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="o">.</span><span class="n">value</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="n">start</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">FOLLOWING</span><span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">start</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">UNBOUNDED_PRECEDING</span>
|
||
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">end</span><span class="o">.</span><span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">end</span><span class="o">.</span><span class="n">value</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="n">end</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">end</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">FOLLOWING</span><span class="p">)</span>
|
||
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">end</span><span class="o">.</span><span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">end</span><span class="o">.</span><span class="n">value</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="n">end</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">CURRENT_ROW</span>
|
||
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">end</span><span class="o">.</span><span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">end</span><span class="o">.</span><span class="n">value</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="n">end</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">end</span><span class="o">.</span><span class="n">value</span><span class="p">),</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">PRECEDING</span><span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">end</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">UNBOUNDED_FOLLOWING</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span> <span class="o">%</span> <span class="p">{</span>
|
||
<span class="s2">"frame_type"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">frame_type</span><span class="p">,</span>
|
||
<span class="s2">"start"</span><span class="p">:</span> <span class="n">start</span><span class="p">,</span>
|
||
<span class="s2">"end"</span><span class="p">:</span> <span class="n">end</span><span class="p">,</span>
|
||
<span class="s2">"exclude"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_exclusion</span><span class="p">(),</span>
|
||
<span class="p">}</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">window_frame_start_end</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span>
|
||
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">"Subclasses must implement window_frame_start_end()."</span><span class="p">)</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">RowRange</span><span class="p">(</span><span class="n">WindowFrame</span><span class="p">):</span>
|
||
<span class="n">frame_type</span> <span class="o">=</span> <span class="s2">"ROWS"</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">window_frame_start_end</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">window_frame_rows_start_end</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">ValueRange</span><span class="p">(</span><span class="n">WindowFrame</span><span class="p">):</span>
|
||
<span class="n">frame_type</span> <span class="o">=</span> <span class="s2">"RANGE"</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">window_frame_start_end</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">window_frame_range_start_end</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span>
|
||
</pre></div>
|
||
|
||
<div class="clearer"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sphinxsidebar" role="navigation" aria-label="Main">
|
||
<div class="sphinxsidebarwrapper">
|
||
<p class="logo"><a href="../../../../index.html">
|
||
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo of Evennia"/>
|
||
</a></p>
|
||
<search id="searchbox" style="display: none" role="search">
|
||
<h3 id="searchlabel">Quick search</h3>
|
||
<div class="searchformwrapper">
|
||
<form class="search" action="../../../../search.html" method="get">
|
||
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
|
||
<input type="submit" value="Go" />
|
||
</form>
|
||
</div>
|
||
</search>
|
||
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Links</h3>
|
||
<ul>
|
||
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
|
||
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
|
||
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
|
||
<li><a href="http://games.evennia.com">Game Index</a> </li>
|
||
<li>
|
||
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
|
||
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
|
||
<a href="https://evennia.blogspot.com/">Blog</a>
|
||
</li>
|
||
</ul>
|
||
<h3>Doc Versions</h3>
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="https://www.evennia.com/docs/latest/index.html">latest (main branch)</a>
|
||
</li>
|
||
|
||
|
||
<li>
|
||
<a href="https://www.evennia.com/docs/5.x/index.html">v5.0.0 branch (outdated)</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://www.evennia.com/docs/4.x/index.html">v4.0.0 branch (outdated)</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://www.evennia.com/docs/3.x/index.html">v3.0.0 branch (outdated)</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://www.evennia.com/docs/2.x/index.html">v2.0.0 branch (outdated)</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://www.evennia.com/docs/1.x/index.html">v1.0.0 branch (outdated)</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://www.evennia.com/docs/0.x/index.html">v0.9.5 branch (outdated)</a>
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
</div>
|
||
<div class="clearer"></div>
|
||
</div>
|
||
<div class="related" role="navigation" aria-label="Related">
|
||
<h3>Navigation</h3>
|
||
<ul>
|
||
<li class="right" style="margin-right: 10px">
|
||
<a href="../../../../genindex.html" title="General Index"
|
||
>index</a></li>
|
||
<li class="right" >
|
||
<a href="../../../../py-modindex.html" title="Python Module Index"
|
||
>modules</a> |</li>
|
||
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia</a> »</li>
|
||
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> »</li>
|
||
<li class="nav-item nav-item-this"><a href="">django.db.models.expressions</a></li>
|
||
</ul>
|
||
</div>
|
||
<div class="footer" role="contentinfo">
|
||
© Copyright 2024, The Evennia developer community.
|
||
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
|
||
</div>
|
||
</body>
|
||
</html> |