evennia/docs/latest/_modules/django/db/models/expressions.html
Evennia docbuilder action 4544902e08 Updated HTML docs.
2026-02-15 17:42:43 +00:00

2355 lines
No EOL
333 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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 &#8212; 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> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" accesskey="U">Module code</a> &#187;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;DecimalField&quot;</span><span class="p">:</span>
<span class="n">sql</span> <span class="o">=</span> <span class="s2">&quot;(CAST(</span><span class="si">%s</span><span class="s2"> AS NUMERIC))&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Provide the ability to combine one or two objects with</span>
<span class="sd"> some connector. For example F(&#39;foo&#39;) + F(&#39;bar&#39;).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Arithmetic connectors</span>
<span class="n">ADD</span> <span class="o">=</span> <span class="s2">&quot;+&quot;</span>
<span class="n">SUB</span> <span class="o">=</span> <span class="s2">&quot;-&quot;</span>
<span class="n">MUL</span> <span class="o">=</span> <span class="s2">&quot;*&quot;</span>
<span class="n">DIV</span> <span class="o">=</span> <span class="s2">&quot;/&quot;</span>
<span class="n">POW</span> <span class="o">=</span> <span class="s2">&quot;^&quot;</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">&quot;</span><span class="si">%%</span><span class="s2">&quot;</span>
<span class="c1"># Bitwise operators - note that these are generated by .bitand()</span>
<span class="c1"># and .bitor(), the &#39;&amp;&#39; and &#39;|&#39; are reserved for boolean operator</span>
<span class="c1"># usage.</span>
<span class="n">BITAND</span> <span class="o">=</span> <span class="s2">&quot;&amp;&quot;</span>
<span class="n">BITOR</span> <span class="o">=</span> <span class="s2">&quot;|&quot;</span>
<span class="n">BITLEFTSHIFT</span> <span class="o">=</span> <span class="s2">&quot;&lt;&lt;&quot;</span>
<span class="n">BITRIGHTSHIFT</span> <span class="o">=</span> <span class="s2">&quot;&gt;&gt;&quot;</span>
<span class="n">BITXOR</span> <span class="o">=</span> <span class="s2">&quot;#&quot;</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">&quot;resolve_expression&quot;</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">&quot;conditional&quot;</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">&quot;conditional&quot;</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">&amp;</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">&quot;Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations.&quot;</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">&quot;conditional&quot;</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">&quot;conditional&quot;</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">&quot;Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations.&quot;</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">&quot;conditional&quot;</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">&quot;conditional&quot;</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">&quot;Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations.&quot;</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">&quot;Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations.&quot;</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">&quot;Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations.&quot;</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">&quot;Use .bitand(), .bitor(), and .bitxor() for bitwise logical operations.&quot;</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">&quot;&quot;&quot;Base class for all query expressions.&quot;&quot;&quot;</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">&quot;convert_value&quot;</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">&quot;resolve_expression&quot;</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">&quot;&quot;&quot;</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, &#39;as_&#39; + 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"> &quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">&quot;Subclasses must implement as_sql()&quot;</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">&quot;subquery&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;</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 &quot;</span>
<span class="s2">&quot;composite primary keys.&quot;</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">&quot;&quot;&quot;Return the output type of this expressions.&quot;&quot;&quot;</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">&quot;Cannot resolve expression type, unknown output_field&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Return the output field of this expression, or None if</span>
<span class="sd"> _resolve_output_field() didn&#39;t return an output type.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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&#39;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"> &quot;&quot;&quot;</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&#39;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">&quot;Expression contains mixed types: </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">. You must &quot;</span>
<span class="s2">&quot;set output_field.&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;FloatField&quot;</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">&quot;IntegerField&quot;</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">&quot;DecimalField&quot;</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">&quot;</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">&quot;</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">&quot;&quot;&quot;Return the underlying field types used by this aggregate.&quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Recursively yield this expression and all subexpressions, in</span>
<span class="sd"> depth-first order.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;flatten&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;select_format&quot;</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">&quot;constraint_validation_compatible&quot;</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">&quot;Expressions with constraint_validation_compatible set to False &quot;</span>
<span class="s2">&quot;must have only one source expression.&quot;</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">&quot;&quot;&quot;An expression that can be combined with other expressions.&quot;&quot;&quot;</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 &lt;op&gt; 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">&quot;&quot;&quot;</span>
<span class="sd"> Register combinable types:</span>
<span class="sd"> lhs &lt;connector&gt; rhs -&gt; 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"> &quot;&quot;&quot;</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">&quot;&lt;</span><span class="si">{}</span><span class="s2">: </span><span class="si">{}</span><span class="s2">&gt;&quot;</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">&quot;</span><span class="si">{}</span><span class="s2"> </span><span class="si">{}</span><span class="s2"> </span><span class="si">{}</span><span class="s2">&quot;</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">&quot;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 &quot;</span>
<span class="sa">f</span><span class="s2">&quot;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">, &quot;</span>
<span class="sa">f</span><span class="s2">&quot;</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 &quot;</span>
<span class="sa">f</span><span class="s2">&quot;output_field.&quot;</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">&quot;(</span><span class="si">%s</span><span class="s2">)&quot;</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">&quot;DurationField&quot;</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">&quot;DateField&quot;</span><span class="p">,</span> <span class="s2">&quot;DateTimeField&quot;</span><span class="p">,</span> <span class="s2">&quot;TimeField&quot;</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">&quot;DurationField&quot;</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">&quot;(</span><span class="si">%s</span><span class="s2">)&quot;</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">&quot;DecimalField&quot;</span><span class="p">,</span>
<span class="s2">&quot;DurationField&quot;</span><span class="p">,</span>
<span class="s2">&quot;FloatField&quot;</span><span class="p">,</span>
<span class="s2">&quot;IntegerField&quot;</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">&quot;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">.&quot;</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">&quot;django.db.models.F&quot;</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">&quot;&quot;&quot;An object capable of resolving references to existing query objects.&quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Arguments:</span>
<span class="sd"> * name: the name of the field this expression references</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;</span><span class="si">{}</span><span class="s2">(</span><span class="si">{}</span><span class="s2">)&quot;</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">&quot;argument of type &#39;</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">&#39; is not iterable&quot;</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&#39;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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;This queryset contains a reference to an outer query and may &quot;</span>
<span class="s2">&quot;only be used in a subquery.&quot;</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">&quot;Referencing outer query window expression is not supported: &quot;</span>
<span class="sa">f</span><span class="s2">&quot;</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">.&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&lt;</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">&quot;Negative indexing is not supported.&quot;</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">&lt;</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">&lt;</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">&quot;Negative indexing is not supported.&quot;</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">&quot;Step argument is not supported.&quot;</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">&lt;</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">&quot;Slice stop must be greater than slice start.&quot;</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">&quot;Argument to slice must be either int or slice instance.&quot;</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">&quot;</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">)&quot;</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">&quot;django.db.models.Func&quot;</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">&quot;&quot;&quot;An SQL function call.&quot;&quot;&quot;</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">&quot;</span><span class="si">%(function)s</span><span class="s2">(</span><span class="si">%(expressions)s</span><span class="s2">)&quot;</span>
<span class="n">arg_joiner</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</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">&quot;&#39;</span><span class="si">%s</span><span class="s2">&#39; 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)&quot;</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">&quot;argument&quot;</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">&quot;arguments&quot;</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">&quot;, &quot;</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">&quot;=&quot;</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">&quot;</span><span class="si">{}</span><span class="s2">(</span><span class="si">{}</span><span class="s2">, </span><span class="si">{}</span><span class="s2">)&quot;</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">&quot;</span><span class="si">{}</span><span class="s2">(</span><span class="si">{}</span><span class="s2">)&quot;</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">&quot;&quot;&quot;Return a dict of extra __init__() options to include in the repr.&quot;&quot;&quot;</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">&quot;empty_result_set_value&quot;</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__()&#39;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">&quot;function&quot;</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">&quot;function&quot;</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">&quot;template&quot;</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">&quot;arg_joiner&quot;</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">&quot;expressions&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;field&quot;</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">&quot;django.db.models.Value&quot;</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">&quot;&quot;&quot;Represent a wrapped value as a node within an expression.&quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;</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">)&quot;</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">&quot;get_placeholder&quot;</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">&quot;NULL&quot;</span><span class="p">,</span> <span class="p">[]</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">&quot;</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">&quot;</span><span class="si">{}</span><span class="s2">(</span><span class="si">{}</span><span class="s2">, </span><span class="si">{}</span><span class="s2">)&quot;</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">&quot;(</span><span class="si">%s</span><span class="s2">)&quot;</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">&quot;&#39;*&#39;&quot;</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">&quot;*&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Expression to use DEFAULT keyword during insert otherwise the underlying</span>
<span class="sd"> expression.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;DEFAULT&quot;</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">&quot;</span><span class="si">{}</span><span class="s2">(</span><span class="si">{}</span><span class="s2">)&quot;</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">&quot;, &quot;</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">&quot;.&quot;</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">&quot;</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">, &quot;</span>
<span class="sa">f</span><span class="s2">&quot;</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">)&quot;</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">&quot;, &quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Reference to column alias of the query. For example, Ref(&#39;sum_cost&#39;) in</span>
<span class="sd"> qs.annotate(sum_cost=Sum(&#39;cost&#39;)) query.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;</span><span class="si">{}</span><span class="s2">(</span><span class="si">{}</span><span class="s2">, </span><span class="si">{}</span><span class="s2">)&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</span>
<span class="n">template</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%(expressions)s</span><span class="s2">&quot;</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">&quot;&quot;</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">&quot;ORDER BY </span><span class="si">%(expressions)s</span><span class="s2">&quot;</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">&quot;-&quot;</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">&quot;resolve_expression&quot;</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">&quot;</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 &quot;</span>
<span class="sa">f</span><span class="s2">&quot;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">.&quot;</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">&quot;django.db.models.ExpressionWrapper&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;</span><span class="si">{}</span><span class="s2">(</span><span class="si">{}</span><span class="s2">)&quot;</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">&quot;&quot;&quot;The logical negation of a conditional expression.&quot;&quot;&quot;</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">&quot;1=1&quot;</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&#39;t allow EXISTS() and filters</span>
<span class="c1"># to be compared to another expression unless they&#39;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">&quot;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&quot;</span><span class="p">,</span> <span class="n">params</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;NOT </span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s2">&quot;</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">&quot;conditional&quot;</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">&quot;Cannot negate non-conditional expressions.&quot;</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&#39;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">&quot;CASE WHEN </span><span class="si">{}</span><span class="s2"> THEN 1 ELSE 0 END&quot;</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">&quot;django.db.models.When&quot;</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">&quot;WHEN </span><span class="si">%(condition)s</span><span class="s2"> THEN </span><span class="si">%(result)s</span><span class="s2">&quot;</span>
<span class="c1"># This isn&#39;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">&quot;conditional&quot;</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">&quot;conditional&quot;</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">&quot;When() supports a Q object, a boolean expression, or lookups &quot;</span>
<span class="s2">&quot;as a condition.&quot;</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">&quot;An empty Q() can&#39;t be used as a When() condition.&quot;</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">&quot;WHEN </span><span class="si">%r</span><span class="s2"> THEN </span><span class="si">%r</span><span class="s2">&quot;</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">&quot;&lt;</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&gt;&quot;</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&#39;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&#39;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">&quot;condition&quot;</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">&quot;result&quot;</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">&quot;django.db.models.Case&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> An SQL searched CASE expression:</span>
<span class="sd"> CASE</span>
<span class="sd"> WHEN n &gt; 0</span>
<span class="sd"> THEN &#39;positive&#39;</span>
<span class="sd"> WHEN n &lt; 0</span>
<span class="sd"> THEN &#39;negative&#39;</span>
<span class="sd"> ELSE &#39;zero&#39;</span>
<span class="sd"> END</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">template</span> <span class="o">=</span> <span class="s2">&quot;CASE </span><span class="si">%(cases)s</span><span class="s2"> ELSE </span><span class="si">%(default)s</span><span class="s2"> END&quot;</span>
<span class="n">case_joiner</span> <span class="o">=</span> <span class="s2">&quot; &quot;</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">&quot;Positional arguments must all be When objects.&quot;</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">&quot;CASE </span><span class="si">%s</span><span class="s2">, ELSE </span><span class="si">%r</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="s2">&quot;, &quot;</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">&quot;&lt;</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&gt;&quot;</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">&quot;cases&quot;</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">&quot;default&quot;</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">&quot;template&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</span>
<span class="n">template</span> <span class="o">=</span> <span class="s2">&quot;(</span><span class="si">%(subquery)s</span><span class="s2">)&quot;</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">&quot;query&quot;</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">&quot;template&quot;</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&#39;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">&quot;subquery&quot;</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">&quot;template&quot;</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">&quot;EXISTS(</span><span class="si">%(subquery)s</span><span class="s2">)&quot;</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&#39;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">&quot;CASE WHEN </span><span class="si">{}</span><span class="s2"> THEN 1 ELSE 0 END&quot;</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">&quot;1=0&quot;</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">&quot;django.db.models.OrderBy&quot;</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">&quot;</span><span class="si">%(expression)s</span><span class="s2"> </span><span class="si">%(ordering)s</span><span class="s2">&quot;</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">&quot;nulls_first and nulls_last are mutually exclusive&quot;</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">&quot;nulls_first and nulls_last values must be True or None.&quot;</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">&quot;resolve_expression&quot;</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;expression must be an expression type&quot;</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">&quot;</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">)&quot;</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">&quot;, &quot;</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">&quot;</span><span class="si">%s</span><span class="s2"> NULLS LAST&quot;</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">&quot;</span><span class="si">%s</span><span class="s2"> NULLS FIRST&quot;</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">&quot;</span><span class="si">%%</span><span class="s2">(expression)s IS NULL, </span><span class="si">%s</span><span class="s2">&quot;</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">&quot;</span><span class="si">%%</span><span class="s2">(expression)s IS NOT NULL, </span><span class="si">%s</span><span class="s2">&quot;</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">&quot;expression&quot;</span><span class="p">:</span> <span class="n">expression_sql</span><span class="p">,</span>
<span class="s2">&quot;ordering&quot;</span><span class="p">:</span> <span class="s2">&quot;DESC&quot;</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">&quot;ASC&quot;</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">&quot;</span><span class="si">%(expression)s</span><span class="s2">&quot;</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 &lt; 23c doesn&#39;t allow ORDER BY EXISTS() or filters unless it&#39;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">&quot;</span><span class="si">%(expression)s</span><span class="s2"> OVER (</span><span class="si">%(window)s</span><span class="s2">)&quot;</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">&quot;window_compatible&quot;</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">&quot;Expression &#39;</span><span class="si">%s</span><span class="s2">&#39; isn&#39;t compatible with OVER clauses.&quot;</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">&quot;Window.order_by&quot;</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">&quot;This backend does not support window expressions.&quot;</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">&quot;PARTITION BY </span><span class="si">%(expressions)s</span><span class="s2">&quot;</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">&quot;expression&quot;</span><span class="p">:</span> <span class="n">expr_sql</span><span class="p">,</span> <span class="s2">&quot;window&quot;</span><span class="p">:</span> <span class="s2">&quot; &quot;</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">&quot;</span><span class="si">{}</span><span class="s2"> OVER (</span><span class="si">{}{}{}</span><span class="s2">)&quot;</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">&quot;PARTITION BY &quot;</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">&quot;&quot;</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">&quot;&quot;</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">&quot;&quot;</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">&quot;&lt;</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&gt;&quot;</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">&quot;CURRENT ROW&quot;</span>
<span class="n">GROUP</span> <span class="o">=</span> <span class="s2">&quot;GROUP&quot;</span>
<span class="n">TIES</span> <span class="o">=</span> <span class="s2">&quot;TIES&quot;</span>
<span class="n">NO_OTHERS</span> <span class="o">=</span> <span class="s2">&quot;NO OTHERS&quot;</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">&quot;</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">&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</span>
<span class="n">template</span> <span class="o">=</span> <span class="s2">&quot;</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">&quot;</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">&quot;</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 &quot;</span>
<span class="s2">&quot;WindowFrameExclusion instance.&quot;</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">&quot;&quot;</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot; 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">&quot;</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">&quot;This backend does not support window frame exclusions.&quot;</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">&quot;frame_type&quot;</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">&quot;start&quot;</span><span class="p">:</span> <span class="n">start</span><span class="p">,</span>
<span class="s2">&quot;end&quot;</span><span class="p">:</span> <span class="n">end</span><span class="p">,</span>
<span class="s2">&quot;exclude&quot;</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">&quot;&lt;</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&gt;&quot;</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">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">start</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="s2">&quot;</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">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">start</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="s2">&quot;</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">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">end</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="s2">&quot;</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">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">end</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="s2">&quot;</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">&quot;frame_type&quot;</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">&quot;start&quot;</span><span class="p">:</span> <span class="n">start</span><span class="p">,</span>
<span class="s2">&quot;end&quot;</span><span class="p">:</span> <span class="n">end</span><span class="p">,</span>
<span class="s2">&quot;exclude&quot;</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">&quot;Subclasses must implement window_frame_start_end().&quot;</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">&quot;ROWS&quot;</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">&quot;RANGE&quot;</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> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">django.db.models.expressions</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2024, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
</div>
</body>
</html>