Sophie

Sophie

distrib > Mageia > 7 > armv7hl > media > core-release > by-pkgid > f1af5ac4c8d0f3f6ef0bca84cf516f3e > files > 717

python3-sqlobject-3.7.0-1.mga7.noarch.rpm



<!doctype html>

<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>sqlobject.sqlbuilder &#8212; SQLObject 3.7.0 documentation</title>
    <link rel="stylesheet" href="../../_static/bizstyle.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
    <script type="text/javascript" src="../../_static/documentation_options.js"></script>
    <script type="text/javascript" src="../../_static/jquery.js"></script>
    <script type="text/javascript" src="../../_static/underscore.js"></script>
    <script type="text/javascript" src="../../_static/doctools.js"></script>
    <script type="text/javascript" src="../../_static/bizstyle.js"></script>
    <link rel="index" title="Index" href="../../genindex.html" />
    <link rel="search" title="Search" href="../../search.html" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <!--[if lt IE 9]>
    <script type="text/javascript" src="_static/css3-mediaqueries.js"></script>
    <![endif]-->
  </head><body>
    <div class="related" role="navigation" aria-label="related navigation">
      <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">SQLObject 3.7.0 documentation</a> &#187;</li>
          <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li> 
      </ul>
    </div>
      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
        <div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none" role="search">
  <h3>Quick search</h3>
    <div class="searchformwrapper">
    <form class="search" action="../../search.html" method="get">
      <input type="text" name="q" />
      <input type="submit" value="Go" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body" role="main">
            
  <h1>Source code for sqlobject.sqlbuilder</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">sqlobject.sqlbuilder</span>
<span class="sd">--------------------</span>

<span class="sd">:author: Ian Bicking &lt;ianb@colorstudy.com&gt;</span>

<span class="sd">Builds SQL expressions from normal Python expressions.</span>

<span class="sd">Disclaimer</span>
<span class="sd">----------</span>

<span class="sd">This program is free software; you can redistribute it and/or modify</span>
<span class="sd">it under the terms of the GNU Lesser General Public License as</span>
<span class="sd">published by the Free Software Foundation; either version 2.1 of the</span>
<span class="sd">License, or (at your option any later version.</span>

<span class="sd">This program is distributed in the hope that it will be useful,</span>
<span class="sd">but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span class="sd">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<span class="sd">GNU General Public License for more details.</span>

<span class="sd">You should have received a copy of the GNU Lesser General Public</span>
<span class="sd">License along with this program; if not, write to the Free Software</span>
<span class="sd">Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,</span>
<span class="sd">USA.</span>

<span class="sd">Instructions</span>
<span class="sd">------------</span>

<span class="sd">To begin a SQL expression, you must use some sort of SQL object -- a</span>
<span class="sd">field, table, or SQL statement (``SELECT``, ``INSERT``, etc.)  You can</span>
<span class="sd">then use normal operators, with the exception of: `and`, `or`, `not`,</span>
<span class="sd">and `in`.  You can use the `AND`, `OR`, `NOT`, and `IN` functions</span>
<span class="sd">instead, or you can also use `&amp;`, `|`, and `~` for `and`, `or`, and</span>
<span class="sd">`not` respectively (however -- the precidence for these operators</span>
<span class="sd">doesn&#39;t work as you would want, so you must use many parenthesis).</span>

<span class="sd">To create a sql field, table, or constant/function, use the namespaces</span>
<span class="sd">`table`, `const`, and `func`.  For instance, ``table.address`` refers</span>
<span class="sd">to the ``address`` table, and ``table.address.state`` refers to the</span>
<span class="sd">``state`` field in the address table.  ``const.NULL`` is the ``NULL``</span>
<span class="sd">SQL constant, and ``func.NOW()`` is the ``NOW()`` function call</span>
<span class="sd">(`const` and `func` are actually identicle, but the two names are</span>
<span class="sd">provided for clarity).  Once you create this object, expressions</span>
<span class="sd">formed with it will produce SQL statements.</span>

<span class="sd">The ``sqlrepr(obj)`` function gets the SQL representation of these</span>
<span class="sd">objects, as well as the proper SQL representation of basic Python</span>
<span class="sd">types (None==NULL).</span>

<span class="sd">There are a number of DB-specific SQL features that this does not</span>
<span class="sd">implement.  There are a bunch of normal ANSI features also not present.</span>

<span class="sd">See the bottom of this module for some examples, and run it (i.e.</span>
<span class="sd">``python sql.py``) to see the results of those examples.</span>

<span class="sd">&quot;&quot;&quot;</span>

<span class="c1">########################################</span>
<span class="c1"># Constants</span>
<span class="c1">########################################</span>

<span class="kn">import</span> <span class="nn">fnmatch</span>
<span class="kn">import</span> <span class="nn">operator</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="kn">import</span> <span class="nn">types</span>
<span class="kn">import</span> <span class="nn">weakref</span>

<span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">classregistry</span>
<span class="kn">from</span> <span class="nn">.converters</span> <span class="k">import</span> <span class="n">registerConverter</span><span class="p">,</span> <span class="n">sqlrepr</span><span class="p">,</span> <span class="n">quote_str</span><span class="p">,</span> <span class="n">unquote_str</span>
<span class="kn">from</span> <span class="nn">.compat</span> <span class="k">import</span> <span class="n">PY2</span><span class="p">,</span> <span class="n">string_type</span>


<div class="viewcode-block" id="VersionError"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.VersionError">[docs]</a><span class="k">class</span> <span class="nc">VersionError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
    <span class="k">pass</span>
</div>

<div class="viewcode-block" id="NoDefault"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.NoDefault">[docs]</a><span class="k">class</span> <span class="nc">NoDefault</span><span class="p">:</span>
    <span class="k">pass</span>
</div>

<div class="viewcode-block" id="SQLObjectState"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLObjectState">[docs]</a><span class="k">class</span> <span class="nc">SQLObjectState</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">soObject</span><span class="p">,</span> <span class="n">connection</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">soObject</span> <span class="o">=</span> <span class="n">weakref</span><span class="o">.</span><span class="n">proxy</span><span class="p">(</span><span class="n">soObject</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">connection</span> <span class="o">=</span> <span class="n">connection</span>
</div>

<span class="n">safeSQLRE</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;^[a-zA-Z_][a-zA-Z0-9_\.]*$&#39;</span><span class="p">)</span>


<div class="viewcode-block" id="sqlIdentifier"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.sqlIdentifier">[docs]</a><span class="k">def</span> <span class="nf">sqlIdentifier</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
    <span class="c1"># some db drivers return unicode column names</span>
    <span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">string_type</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">bool</span><span class="p">(</span><span class="n">safeSQLRE</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">strip</span><span class="p">()))</span>
</div>

<div class="viewcode-block" id="execute"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.execute">[docs]</a><span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">executor</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="s1">&#39;execute&#39;</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">expr</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">executor</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">expr</span>
</div>

<span class="k">def</span> <span class="nf">_str_or_sqlrepr</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">db</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">string_type</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">expr</span>
    <span class="k">return</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>


<span class="c1">########################################</span>
<span class="c1"># Expression generation</span>
<span class="c1">########################################</span>


<div class="viewcode-block" id="SQLExpression"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLExpression">[docs]</a><span class="k">class</span> <span class="nc">SQLExpression</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__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="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;+&quot;</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">def</span> <span class="nf">__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="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">,</span> <span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__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="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;-&quot;</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">def</span> <span class="nf">__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="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">,</span> <span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__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="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;*&quot;</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">def</span> <span class="nf">__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="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">,</span> <span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__div__</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="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;/&quot;</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">def</span> <span class="nf">__rdiv__</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="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__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="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;/&quot;</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">def</span> <span class="nf">__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="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__floordiv__</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="n">SQLConstant</span><span class="p">(</span><span class="s2">&quot;FLOOR&quot;</span><span class="p">)(</span><span class="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;/&quot;</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">def</span> <span class="nf">__rfloordiv__</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="n">SQLConstant</span><span class="p">(</span><span class="s2">&quot;FLOOR&quot;</span><span class="p">)(</span><span class="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="p">))</span>

    <span class="k">def</span> <span class="nf">__pos__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">SQLPrefix</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__neg__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">SQLPrefix</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__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="n">SQLConstant</span><span class="p">(</span><span class="s2">&quot;POW&quot;</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">def</span> <span class="nf">__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="n">SQLConstant</span><span class="p">(</span><span class="s2">&quot;POW&quot;</span><span class="p">)(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__abs__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">SQLConstant</span><span class="p">(</span><span class="s2">&quot;ABS&quot;</span><span class="p">)(</span><span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__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="n">SQLModulo</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">def</span> <span class="nf">__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="n">SQLConstant</span><span class="p">(</span><span class="s2">&quot;MOD&quot;</span><span class="p">)(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__lt__</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="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;&lt;&quot;</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">def</span> <span class="nf">__le__</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="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;&lt;=&quot;</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">def</span> <span class="nf">__gt__</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="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;&gt;&quot;</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">def</span> <span class="nf">__ge__</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="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;&gt;=&quot;</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">def</span> <span class="nf">__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="n">other</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">ISNULL</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;=&quot;</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">def</span> <span class="nf">__ne__</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="n">other</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">ISNOTNULL</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;&lt;&gt;&quot;</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">def</span> <span class="nf">__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">return</span> <span class="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;AND&quot;</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">def</span> <span class="nf">__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">return</span> <span class="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;AND&quot;</span><span class="p">,</span> <span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__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">return</span> <span class="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;OR&quot;</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">def</span> <span class="nf">__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">return</span> <span class="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;OR&quot;</span><span class="p">,</span> <span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__invert__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">SQLPrefix</span><span class="p">(</span><span class="s2">&quot;NOT&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__call__</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="k">return</span> <span class="n">SQLCall</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="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</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">__sqlrepr__</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
        <span class="k">except</span> <span class="ne">AssertionError</span><span class="p">:</span>
            <span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1">&gt;&#39;</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="nb">hex</span><span class="p">(</span><span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">))[</span><span class="mi">2</span><span class="p">:])</span>

    <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__cmp__</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="n">VersionError</span><span class="p">(</span><span class="s2">&quot;Python 2.1+ required&quot;</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__rcmp__</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="n">VersionError</span><span class="p">(</span><span class="s2">&quot;Python 2.1+ required&quot;</span><span class="p">)</span>

<div class="viewcode-block" id="SQLExpression.startswith"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLExpression.startswith">[docs]</a>    <span class="k">def</span> <span class="nf">startswith</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">STARTSWITH</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="SQLExpression.endswith"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLExpression.endswith">[docs]</a>    <span class="k">def</span> <span class="nf">endswith</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">ENDSWITH</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="SQLExpression.contains"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLExpression.contains">[docs]</a>    <span class="k">def</span> <span class="nf">contains</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">CONTAINSSTRING</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="SQLExpression.components"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLExpression.components">[docs]</a>    <span class="k">def</span> <span class="nf">components</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="p">[]</span>
</div>
<div class="viewcode-block" id="SQLExpression.tablesUsed"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLExpression.tablesUsed">[docs]</a>    <span class="k">def</span> <span class="nf">tablesUsed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">tablesUsedSet</span><span class="p">(</span><span class="n">db</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="SQLExpression.tablesUsedSet"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLExpression.tablesUsedSet">[docs]</a>    <span class="k">def</span> <span class="nf">tablesUsedSet</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="n">tables</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
        <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tablesUsedImmediate</span><span class="p">():</span>
            <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">table</span><span class="p">,</span> <span class="s1">&#39;__sqlrepr__&#39;</span><span class="p">):</span>
                <span class="n">table</span> <span class="o">=</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="n">table</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
            <span class="n">tables</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">table</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">component</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">components</span><span class="p">():</span>
            <span class="n">tables</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">tablesUsedSet</span><span class="p">(</span><span class="n">component</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span>
        <span class="k">return</span> <span class="n">tables</span>
</div>
<div class="viewcode-block" id="SQLExpression.tablesUsedImmediate"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLExpression.tablesUsedImmediate">[docs]</a>    <span class="k">def</span> <span class="nf">tablesUsedImmediate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="p">[]</span>
</div></div>

<span class="c1">#######################################</span>
<span class="c1"># Converter for SQLExpression instances</span>
<span class="c1">#######################################</span>


<div class="viewcode-block" id="SQLExprConverter"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLExprConverter">[docs]</a><span class="k">def</span> <span class="nf">SQLExprConverter</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">value</span><span class="o">.</span><span class="n">__sqlrepr__</span><span class="p">()</span>
</div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>


<div class="viewcode-block" id="tablesUsedSet"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.tablesUsedSet">[docs]</a><span class="k">def</span> <span class="nf">tablesUsedSet</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
    <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;tablesUsedSet&quot;</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">obj</span><span class="o">.</span><span class="n">tablesUsedSet</span><span class="p">(</span><span class="n">db</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="p">{}</span>
</div>

<span class="k">if</span> <span class="n">PY2</span><span class="p">:</span>
    <span class="n">div</span> <span class="o">=</span> <span class="n">operator</span><span class="o">.</span><span class="n">div</span>
<span class="k">else</span><span class="p">:</span>
    <span class="n">div</span> <span class="o">=</span> <span class="n">operator</span><span class="o">.</span><span class="n">truediv</span>


<span class="n">operatorMap</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s2">&quot;+&quot;</span><span class="p">:</span> <span class="n">operator</span><span class="o">.</span><span class="n">add</span><span class="p">,</span>
    <span class="s2">&quot;/&quot;</span><span class="p">:</span> <span class="n">div</span><span class="p">,</span>
    <span class="s2">&quot;-&quot;</span><span class="p">:</span> <span class="n">operator</span><span class="o">.</span><span class="n">sub</span><span class="p">,</span>
    <span class="s2">&quot;*&quot;</span><span class="p">:</span> <span class="n">operator</span><span class="o">.</span><span class="n">mul</span><span class="p">,</span>
    <span class="s2">&quot;&lt;&quot;</span><span class="p">:</span> <span class="n">operator</span><span class="o">.</span><span class="n">lt</span><span class="p">,</span>
    <span class="s2">&quot;&lt;=&quot;</span><span class="p">:</span> <span class="n">operator</span><span class="o">.</span><span class="n">le</span><span class="p">,</span>
    <span class="s2">&quot;=&quot;</span><span class="p">:</span> <span class="n">operator</span><span class="o">.</span><span class="n">eq</span><span class="p">,</span>
    <span class="s2">&quot;!=&quot;</span><span class="p">:</span> <span class="n">operator</span><span class="o">.</span><span class="n">ne</span><span class="p">,</span>
    <span class="s2">&quot;&gt;=&quot;</span><span class="p">:</span> <span class="n">operator</span><span class="o">.</span><span class="n">ge</span><span class="p">,</span>
    <span class="s2">&quot;&gt;&quot;</span><span class="p">:</span> <span class="n">operator</span><span class="o">.</span><span class="n">gt</span><span class="p">,</span>
    <span class="s2">&quot;IN&quot;</span><span class="p">:</span> <span class="n">operator</span><span class="o">.</span><span class="n">contains</span><span class="p">,</span>
    <span class="s2">&quot;IS&quot;</span><span class="p">:</span> <span class="n">operator</span><span class="o">.</span><span class="n">eq</span><span class="p">,</span>
<span class="p">}</span>


<div class="viewcode-block" id="SQLOp"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLOp">[docs]</a><span class="k">class</span> <span class="nc">SQLOp</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span> <span class="n">expr1</span><span class="p">,</span> <span class="n">expr2</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">op</span> <span class="o">=</span> <span class="n">op</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">expr1</span> <span class="o">=</span> <span class="n">expr1</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">expr2</span> <span class="o">=</span> <span class="n">expr2</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="n">s1</span> <span class="o">=</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr1</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
        <span class="n">s2</span> <span class="o">=</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr2</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">s1</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;(&#39;</span> <span class="ow">and</span> <span class="n">s1</span> <span class="o">!=</span> <span class="s1">&#39;NULL&#39;</span><span class="p">:</span>
            <span class="n">s1</span> <span class="o">=</span> <span class="s1">&#39;(&#39;</span> <span class="o">+</span> <span class="n">s1</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span>
        <span class="k">if</span> <span class="n">s2</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;(&#39;</span> <span class="ow">and</span> <span class="n">s2</span> <span class="o">!=</span> <span class="s1">&#39;NULL&#39;</span><span class="p">:</span>
            <span class="n">s2</span> <span class="o">=</span> <span class="s1">&#39;(&#39;</span> <span class="o">+</span> <span class="n">s2</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span>
        <span class="k">return</span> <span class="s2">&quot;(</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">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">s1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">op</span><span class="p">,</span> <span class="n">s2</span><span class="p">)</span>

<div class="viewcode-block" id="SQLOp.components"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLOp.components">[docs]</a>    <span class="k">def</span> <span class="nf">components</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">expr1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">expr2</span><span class="p">]</span>
</div>
<div class="viewcode-block" id="SQLOp.execute"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLOp.execute">[docs]</a>    <span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">executor</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">op</span> <span class="o">==</span> <span class="s2">&quot;AND&quot;</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">execute</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr1</span><span class="p">,</span> <span class="n">executor</span><span class="p">)</span> \
                <span class="ow">and</span> <span class="n">execute</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr2</span><span class="p">,</span> <span class="n">executor</span><span class="p">)</span>
        <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">op</span> <span class="o">==</span> <span class="s2">&quot;OR&quot;</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">execute</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr1</span><span class="p">,</span> <span class="n">executor</span><span class="p">)</span> \
                <span class="ow">or</span> <span class="n">execute</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr2</span><span class="p">,</span> <span class="n">executor</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">operatorMap</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">upper</span><span class="p">()](</span><span class="n">execute</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr1</span><span class="p">,</span> <span class="n">executor</span><span class="p">),</span>
                                                <span class="n">execute</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr2</span><span class="p">,</span> <span class="n">executor</span><span class="p">))</span>
</div></div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">SQLOp</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>


<div class="viewcode-block" id="SQLModulo"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLModulo">[docs]</a><span class="k">class</span> <span class="nc">SQLModulo</span><span class="p">(</span><span class="n">SQLOp</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr1</span><span class="p">,</span> <span class="n">expr2</span><span class="p">):</span>
        <span class="n">SQLOp</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;%&#39;</span><span class="p">,</span> <span class="n">expr1</span><span class="p">,</span> <span class="n">expr2</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">db</span> <span class="o">==</span> <span class="s1">&#39;sqlite&#39;</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">SQLOp</span><span class="o">.</span><span class="n">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
        <span class="n">s1</span> <span class="o">=</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr1</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
        <span class="n">s2</span> <span class="o">=</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr2</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
        <span class="k">return</span> <span class="s2">&quot;MOD(</span><span class="si">%s</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="n">s1</span><span class="p">,</span> <span class="n">s2</span><span class="p">)</span>
</div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">SQLModulo</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>


<div class="viewcode-block" id="SQLCall"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLCall">[docs]</a><span class="k">class</span> <span class="nc">SQLCall</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">expr</span> <span class="o">=</span> <span class="n">expr</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="n">args</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr</span><span class="p">,</span> <span class="n">db</span><span class="p">),</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span>

<div class="viewcode-block" id="SQLCall.components"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLCall.components">[docs]</a>    <span class="k">def</span> <span class="nf">components</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">expr</span><span class="p">]</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="SQLCall.execute"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLCall.execute">[docs]</a>    <span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">executor</span><span class="p">):</span>
        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;I don&#39;t yet know how to locally execute functions&quot;</span><span class="p">)</span>
</div></div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">SQLCall</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>


<div class="viewcode-block" id="SQLPrefix"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLPrefix">[docs]</a><span class="k">class</span> <span class="nc">SQLPrefix</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</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">expr</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">prefix</span> <span class="o">=</span> <span class="n">prefix</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">expr</span> <span class="o">=</span> <span class="n">expr</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</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">prefix</span><span class="p">,</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span>

<div class="viewcode-block" id="SQLPrefix.components"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLPrefix.components">[docs]</a>    <span class="k">def</span> <span class="nf">components</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">expr</span><span class="p">]</span>
</div>
<div class="viewcode-block" id="SQLPrefix.execute"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLPrefix.execute">[docs]</a>    <span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">executor</span><span class="p">):</span>
        <span class="n">prefix</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefix</span>
        <span class="n">expr</span> <span class="o">=</span> <span class="n">execute</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr</span><span class="p">,</span> <span class="n">executor</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">prefix</span> <span class="o">==</span> <span class="s2">&quot;+&quot;</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">expr</span>
        <span class="k">elif</span> <span class="n">prefix</span> <span class="o">==</span> <span class="s2">&quot;-&quot;</span><span class="p">:</span>
            <span class="k">return</span> <span class="o">-</span><span class="n">expr</span>
        <span class="k">elif</span> <span class="n">prefix</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="s2">&quot;NOT&quot;</span><span class="p">:</span>
            <span class="k">return</span> <span class="ow">not</span> <span class="n">expr</span>
</div></div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">SQLPrefix</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>


<div class="viewcode-block" id="SQLConstant"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLConstant">[docs]</a><span class="k">class</span> <span class="nc">SQLConstant</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">const</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">const</span> <span class="o">=</span> <span class="n">const</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">const</span>

<div class="viewcode-block" id="SQLConstant.execute"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLConstant.execute">[docs]</a>    <span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">executor</span><span class="p">):</span>
        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;I don&#39;t yet know how to execute SQL constants&quot;</span><span class="p">)</span>
</div></div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">SQLConstant</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>


<div class="viewcode-block" id="SQLTrueClauseClass"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLTrueClauseClass">[docs]</a><span class="k">class</span> <span class="nc">SQLTrueClauseClass</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">return</span> <span class="s2">&quot;1 = 1&quot;</span>

<div class="viewcode-block" id="SQLTrueClauseClass.execute"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLTrueClauseClass.execute">[docs]</a>    <span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">executor</span><span class="p">):</span>
        <span class="k">return</span> <span class="mi">1</span>
</div></div>
<span class="n">SQLTrueClause</span> <span class="o">=</span> <span class="n">SQLTrueClauseClass</span><span class="p">()</span>

<span class="n">registerConverter</span><span class="p">(</span><span class="n">SQLTrueClauseClass</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>

<span class="c1">########################################</span>
<span class="c1"># Namespaces</span>
<span class="c1">########################################</span>


<div class="viewcode-block" id="Field"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Field">[docs]</a><span class="k">class</span> <span class="nc">Field</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tableName</span><span class="p">,</span> <span class="n">fieldName</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">tableName</span> <span class="o">=</span> <span class="n">tableName</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">fieldName</span> <span class="o">=</span> <span class="n">fieldName</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">tableName</span> <span class="o">+</span> <span class="s2">&quot;.&quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">fieldName</span>

<div class="viewcode-block" id="Field.tablesUsedImmediate"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Field.tablesUsedImmediate">[docs]</a>    <span class="k">def</span> <span class="nf">tablesUsedImmediate</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">tableName</span><span class="p">]</span>
</div>
<div class="viewcode-block" id="Field.execute"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Field.execute">[docs]</a>    <span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">executor</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">executor</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">tableName</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">fieldName</span><span class="p">)</span>
</div></div>

<div class="viewcode-block" id="SQLObjectField"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLObjectField">[docs]</a><span class="k">class</span> <span class="nc">SQLObjectField</span><span class="p">(</span><span class="n">Field</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tableName</span><span class="p">,</span> <span class="n">fieldName</span><span class="p">,</span> <span class="n">original</span><span class="p">,</span> <span class="n">soClass</span><span class="p">,</span> <span class="n">column</span><span class="p">):</span>
        <span class="n">Field</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tableName</span><span class="p">,</span> <span class="n">fieldName</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">original</span> <span class="o">=</span> <span class="n">original</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">soClass</span> <span class="o">=</span> <span class="n">soClass</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">column</span> <span class="o">=</span> <span class="n">column</span>

    <span class="k">def</span> <span class="nf">_from_python</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">column</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">column</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">SQLExpression</span><span class="p">)</span> <span class="ow">and</span> \
                <span class="n">column</span> <span class="ow">and</span> <span class="n">column</span><span class="o">.</span><span class="n">from_python</span><span class="p">:</span>
            <span class="n">value</span> <span class="o">=</span> <span class="n">column</span><span class="o">.</span><span class="n">from_python</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">SQLObjectState</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">soClass</span><span class="p">))</span>
        <span class="k">return</span> <span class="n">value</span>

    <span class="k">def</span> <span class="nf">__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="n">other</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">ISNULL</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="n">other</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_from_python</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">SQLOp</span><span class="p">(</span><span class="s1">&#39;=&#39;</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">def</span> <span class="nf">__ne__</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="n">other</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">ISNOTNULL</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="n">other</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_from_python</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">SQLOp</span><span class="p">(</span><span class="s1">&#39;&lt;&gt;&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">)</span>

<div class="viewcode-block" id="SQLObjectField.startswith"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLObjectField.startswith">[docs]</a>    <span class="k">def</span> <span class="nf">startswith</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">):</span>
        <span class="n">s</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_from_python</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">STARTSWITH</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="SQLObjectField.endswith"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLObjectField.endswith">[docs]</a>    <span class="k">def</span> <span class="nf">endswith</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">):</span>
        <span class="n">s</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_from_python</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">ENDSWITH</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="SQLObjectField.contains"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLObjectField.contains">[docs]</a>    <span class="k">def</span> <span class="nf">contains</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">):</span>
        <span class="n">s</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_from_python</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">CONTAINSSTRING</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
</div></div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">SQLObjectField</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>


<div class="viewcode-block" id="Table"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Table">[docs]</a><span class="k">class</span> <span class="nc">Table</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="n">FieldClass</span> <span class="o">=</span> <span class="n">Field</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tableName</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">tableName</span> <span class="o">=</span> <span class="n">tableName</span>

    <span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">attr</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;__&#39;</span><span class="p">):</span>
            <span class="k">raise</span> <span class="ne">AttributeError</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">FieldClass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tableName</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">_str_or_sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tableName</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>

<div class="viewcode-block" id="Table.execute"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Table.execute">[docs]</a>    <span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">executor</span><span class="p">):</span>
        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Tables don&#39;t have values&quot;</span><span class="p">)</span>
</div></div>

<div class="viewcode-block" id="SQLObjectTable"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLObjectTable">[docs]</a><span class="k">class</span> <span class="nc">SQLObjectTable</span><span class="p">(</span><span class="n">Table</span><span class="p">):</span>
    <span class="n">FieldClass</span> <span class="o">=</span> <span class="n">SQLObjectField</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">soClass</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">soClass</span> <span class="o">=</span> <span class="n">soClass</span>
        <span class="k">assert</span> <span class="n">soClass</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">table</span><span class="p">,</span> <span class="p">(</span>
            <span class="s2">&quot;Bad table name in class </span><span class="si">%r</span><span class="s2">: </span><span class="si">%r</span><span class="s2">&quot;</span>
            <span class="o">%</span> <span class="p">(</span><span class="n">soClass</span><span class="p">,</span> <span class="n">soClass</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">table</span><span class="p">))</span>
        <span class="n">Table</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">soClass</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">table</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">attr</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;__&#39;</span><span class="p">):</span>
            <span class="k">raise</span> <span class="ne">AttributeError</span>
        <span class="k">if</span> <span class="n">attr</span> <span class="o">==</span> <span class="s1">&#39;id&#39;</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getattrFromID</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
        <span class="k">elif</span> <span class="n">attr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">soClass</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">columns</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">soClass</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">columns</span><span class="p">[</span><span class="n">attr</span><span class="p">]</span>
            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getattrFromColumn</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
        <span class="k">elif</span> <span class="n">attr</span> <span class="o">+</span> <span class="s1">&#39;ID&#39;</span> <span class="ow">in</span> \
            <span class="p">[</span><span class="n">k</span> <span class="k">for</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">soClass</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">columns</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
                <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">foreignKey</span><span class="p">]:</span>
            <span class="n">attr</span> <span class="o">+=</span> <span class="s1">&#39;ID&#39;</span>
            <span class="n">column</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">soClass</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">columns</span><span class="p">[</span><span class="n">attr</span><span class="p">]</span>
            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getattrFromColumn</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span>
                <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> instance has no attribute &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">soClass</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
                                                       <span class="n">attr</span><span class="p">))</span>

    <span class="k">def</span> <span class="nf">_getattrFromID</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">FieldClass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tableName</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">soClass</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">idName</span><span class="p">,</span>
                               <span class="n">attr</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">soClass</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_getattrFromColumn</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">FieldClass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tableName</span><span class="p">,</span> <span class="n">column</span><span class="o">.</span><span class="n">dbName</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span>
                               <span class="bp">self</span><span class="o">.</span><span class="n">soClass</span><span class="p">,</span> <span class="n">column</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="SQLObjectTableWithJoins"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLObjectTableWithJoins">[docs]</a><span class="k">class</span> <span class="nc">SQLObjectTableWithJoins</span><span class="p">(</span><span class="n">SQLObjectTable</span><span class="p">):</span>

    <span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">attr</span> <span class="o">+</span> <span class="s1">&#39;ID&#39;</span> <span class="ow">in</span> \
            <span class="p">[</span><span class="n">k</span> <span class="k">for</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">soClass</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">columns</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
                <span class="k">if</span> <span class="n">v</span><span class="o">.</span><span class="n">foreignKey</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">soClass</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">columns</span><span class="p">[</span><span class="n">attr</span> <span class="o">+</span> <span class="s1">&#39;ID&#39;</span><span class="p">]</span>
            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getattrFromForeignKey</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
        <span class="k">elif</span> <span class="n">attr</span> <span class="ow">in</span> <span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">joinMethodName</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">soClass</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">joins</span><span class="p">]:</span>
            <span class="n">join</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">soClass</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">joins</span>
                    <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">joinMethodName</span> <span class="o">==</span> <span class="n">attr</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getattrFromJoin</span><span class="p">(</span><span class="n">join</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">SQLObjectTable</span><span class="o">.</span><span class="fm">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_getattrFromForeignKey</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
        <span class="n">ret</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">column</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="o">==</span> \
            <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">soClass</span><span class="p">,</span> <span class="s1">&#39;_SO_class_&#39;</span> <span class="o">+</span> <span class="n">column</span><span class="o">.</span><span class="n">foreignKey</span><span class="p">)</span><span class="o">.</span><span class="n">q</span><span class="o">.</span><span class="n">id</span>
        <span class="k">return</span> <span class="n">ret</span>

    <span class="k">def</span> <span class="nf">_getattrFromJoin</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">join</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">join</span><span class="p">,</span> <span class="s1">&#39;otherColumn&#39;</span><span class="p">):</span>
            <span class="k">return</span> <span class="n">AND</span><span class="p">(</span>
                <span class="n">join</span><span class="o">.</span><span class="n">otherClass</span><span class="o">.</span><span class="n">q</span><span class="o">.</span><span class="n">id</span> <span class="o">==</span> <span class="n">Field</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">intermediateTable</span><span class="p">,</span>
                                              <span class="n">join</span><span class="o">.</span><span class="n">otherColumn</span><span class="p">),</span>
                <span class="n">Field</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">intermediateTable</span><span class="p">,</span>
                      <span class="n">join</span><span class="o">.</span><span class="n">joinColumn</span><span class="p">)</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">soClass</span><span class="o">.</span><span class="n">q</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">otherClass</span><span class="o">.</span><span class="n">q</span><span class="p">,</span> <span class="n">join</span><span class="o">.</span><span class="n">joinColumn</span><span class="p">)</span> <span class="o">==</span> \
                <span class="bp">self</span><span class="o">.</span><span class="n">soClass</span><span class="o">.</span><span class="n">q</span><span class="o">.</span><span class="n">id</span>
</div>

<div class="viewcode-block" id="TableSpace"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.TableSpace">[docs]</a><span class="k">class</span> <span class="nc">TableSpace</span><span class="p">:</span>
    <span class="n">TableClass</span> <span class="o">=</span> <span class="n">Table</span>

    <span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">attr</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;__&#39;</span><span class="p">):</span>
            <span class="k">raise</span> <span class="ne">AttributeError</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">TableClass</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="ConstantSpace"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.ConstantSpace">[docs]</a><span class="k">class</span> <span class="nc">ConstantSpace</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">attr</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;__&#39;</span><span class="p">):</span>
            <span class="k">raise</span> <span class="ne">AttributeError</span>
        <span class="k">return</span> <span class="n">SQLConstant</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
</div>

<span class="c1">########################################</span>
<span class="c1"># Table aliases</span>
<span class="c1">########################################</span>

<div class="viewcode-block" id="AliasField"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.AliasField">[docs]</a><span class="k">class</span> <span class="nc">AliasField</span><span class="p">(</span><span class="n">Field</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tableName</span><span class="p">,</span> <span class="n">fieldName</span><span class="p">,</span> <span class="n">alias</span><span class="p">,</span> <span class="n">aliasTable</span><span class="p">):</span>
        <span class="n">Field</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tableName</span><span class="p">,</span> <span class="n">fieldName</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">aliasTable</span> <span class="o">=</span> <span class="n">aliasTable</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="n">fieldName</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fieldName</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">fieldName</span><span class="p">,</span> <span class="n">SQLExpression</span><span class="p">):</span>
            <span class="n">fieldName</span> <span class="o">=</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="n">fieldName</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">alias</span> <span class="o">+</span> <span class="s2">&quot;.&quot;</span> <span class="o">+</span> <span class="n">fieldName</span>

<div class="viewcode-block" id="AliasField.tablesUsedImmediate"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.AliasField.tablesUsedImmediate">[docs]</a>    <span class="k">def</span> <span class="nf">tablesUsedImmediate</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">aliasTable</span><span class="p">]</span>
</div></div>

<div class="viewcode-block" id="AliasTable"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.AliasTable">[docs]</a><span class="k">class</span> <span class="nc">AliasTable</span><span class="p">(</span><span class="n">Table</span><span class="p">):</span>
    <span class="n">as_string</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>  <span class="c1"># set it to &quot;AS&quot; if your database requires it</span>
    <span class="n">FieldClass</span> <span class="o">=</span> <span class="n">AliasField</span>

    <span class="n">_alias_lock</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
    <span class="n">_alias_counter</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">,</span> <span class="n">alias</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">table</span><span class="p">,</span> <span class="s2">&quot;sqlmeta&quot;</span><span class="p">):</span>
            <span class="n">tableName</span> <span class="o">=</span> <span class="n">SQLConstant</span><span class="p">(</span><span class="n">table</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">table</span><span class="p">)</span>
        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">table</span><span class="p">,</span> <span class="p">(</span><span class="n">Select</span><span class="p">,</span> <span class="n">Union</span><span class="p">)):</span>
            <span class="k">assert</span> <span class="n">alias</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">,</span> \
                <span class="s2">&quot;Alias name cannot be constructed from Select instances, &quot;</span> \
                <span class="s2">&quot;please provide an &#39;alias&#39; keyword.&quot;</span>
            <span class="n">tableName</span> <span class="o">=</span> <span class="n">Subquery</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">table</span><span class="p">)</span>
            <span class="n">table</span> <span class="o">=</span> <span class="kc">None</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">tableName</span> <span class="o">=</span> <span class="n">SQLConstant</span><span class="p">(</span><span class="n">table</span><span class="p">)</span>
            <span class="n">table</span> <span class="o">=</span> <span class="kc">None</span>
        <span class="n">Table</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tableName</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">table</span> <span class="o">=</span> <span class="n">table</span>
        <span class="k">if</span> <span class="n">alias</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">_alias_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="n">AliasTable</span><span class="o">.</span><span class="n">_alias_counter</span> <span class="o">+=</span> <span class="mi">1</span>
                <span class="n">alias</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">_alias</span><span class="si">%d</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">tableName</span><span class="p">,</span> <span class="n">AliasTable</span><span class="o">.</span><span class="n">_alias_counter</span><span class="p">)</span>
            <span class="k">finally</span><span class="p">:</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">_alias_lock</span><span class="o">.</span><span class="n">release</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="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">attr</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;__&#39;</span><span class="p">):</span>
            <span class="k">raise</span> <span class="ne">AttributeError</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="p">:</span>
            <span class="n">attr</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">q</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span><span class="o">.</span><span class="n">fieldName</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">FieldClass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tableName</span><span class="p">,</span> <span class="n">attr</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="p">)</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">return</span> <span class="s2">&quot;</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">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tableName</span><span class="p">,</span> <span class="n">db</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">as_string</span><span class="p">,</span>
                             <span class="bp">self</span><span class="o">.</span><span class="n">alias</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="Alias"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Alias">[docs]</a><span class="k">class</span> <span class="nc">Alias</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">,</span> <span class="n">alias</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">q</span> <span class="o">=</span> <span class="n">AliasTable</span><span class="p">(</span><span class="n">table</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">q</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>

<div class="viewcode-block" id="Alias.components"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Alias.components">[docs]</a>    <span class="k">def</span> <span class="nf">components</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">q</span><span class="p">]</span>
</div></div>

<div class="viewcode-block" id="Union"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Union">[docs]</a><span class="k">class</span> <span class="nc">Union</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">tables</span><span class="p">):</span>
        <span class="n">tabs</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">tables</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">t</span><span class="p">,</span> <span class="n">SQLExpression</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="s1">&#39;sqlmeta&#39;</span><span class="p">):</span>
                <span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">table</span>
                <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">Alias</span><span class="p">):</span>
                    <span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">q</span>
                <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">Table</span><span class="p">):</span>
                    <span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">tableName</span>
                <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">SQLExpression</span><span class="p">):</span>
                    <span class="n">t</span> <span class="o">=</span> <span class="n">SQLConstant</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
            <span class="n">tabs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">tables</span> <span class="o">=</span> <span class="n">tabs</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">return</span> <span class="s2">&quot; UNION &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">sqlrepr</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="p">])</span>
</div>
<span class="c1">########################################</span>
<span class="c1"># SQL Statements</span>
<span class="c1">########################################</span>


<div class="viewcode-block" id="Select"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Select">[docs]</a><span class="k">class</span> <span class="nc">Select</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">items</span><span class="o">=</span><span class="n">NoDefault</span><span class="p">,</span> <span class="n">where</span><span class="o">=</span><span class="n">NoDefault</span><span class="p">,</span> <span class="n">groupBy</span><span class="o">=</span><span class="n">NoDefault</span><span class="p">,</span>
                 <span class="n">having</span><span class="o">=</span><span class="n">NoDefault</span><span class="p">,</span> <span class="n">orderBy</span><span class="o">=</span><span class="n">NoDefault</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="n">NoDefault</span><span class="p">,</span>
                 <span class="n">join</span><span class="o">=</span><span class="n">NoDefault</span><span class="p">,</span> <span class="n">lazyColumns</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">distinct</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
                 <span class="n">start</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="kc">None</span><span class="p">,</span> <span class="nb">reversed</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">forUpdate</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
                 <span class="n">clause</span><span class="o">=</span><span class="n">NoDefault</span><span class="p">,</span> <span class="n">staticTables</span><span class="o">=</span><span class="n">NoDefault</span><span class="p">,</span>
                 <span class="n">distinctOn</span><span class="o">=</span><span class="n">NoDefault</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span> <span class="o">=</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">items</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="n">types</span><span class="o">.</span><span class="n">GeneratorType</span><span class="p">)):</span>
            <span class="n">items</span> <span class="o">=</span> <span class="p">[</span><span class="n">items</span><span class="p">]</span>
        <span class="k">if</span> <span class="n">clause</span> <span class="ow">is</span> <span class="n">NoDefault</span> <span class="ow">and</span> <span class="n">where</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NoDefault</span><span class="p">:</span>
            <span class="n">clause</span> <span class="o">=</span> <span class="n">where</span>
        <span class="k">if</span> <span class="n">staticTables</span> <span class="ow">is</span> <span class="n">NoDefault</span><span class="p">:</span>
            <span class="n">staticTables</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;items&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">items</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;clause&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">clause</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;groupBy&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">groupBy</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;having&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">having</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;orderBy&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">orderBy</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;limit&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">limit</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;join&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">join</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;lazyColumns&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">lazyColumns</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;distinct&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">distinct</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;distinctOn&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">distinctOn</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;start&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">start</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;end&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">end</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;reversed&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">reversed</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;forUpdate&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">forUpdate</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;staticTables&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">staticTables</span>

<div class="viewcode-block" id="Select.clone"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Select.clone">[docs]</a>    <span class="k">def</span> <span class="nf">clone</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">newOps</span><span class="p">):</span>
        <span class="n">ops</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
        <span class="n">ops</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">newOps</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="o">**</span><span class="n">ops</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="Select.newItems"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Select.newItems">[docs]</a>    <span class="k">def</span> <span class="nf">newItems</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">items</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">clone</span><span class="p">(</span><span class="n">items</span><span class="o">=</span><span class="n">items</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="Select.newClause"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Select.newClause">[docs]</a>    <span class="k">def</span> <span class="nf">newClause</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">new_clause</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">clone</span><span class="p">(</span><span class="n">clause</span><span class="o">=</span><span class="n">new_clause</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="Select.orderBy"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Select.orderBy">[docs]</a>    <span class="k">def</span> <span class="nf">orderBy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">orderBy</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">clone</span><span class="p">(</span><span class="n">orderBy</span><span class="o">=</span><span class="n">orderBy</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="Select.unlimited"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Select.unlimited">[docs]</a>    <span class="k">def</span> <span class="nf">unlimited</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">clone</span><span class="p">(</span><span class="n">limit</span><span class="o">=</span><span class="n">NoDefault</span><span class="p">,</span> <span class="n">start</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="kc">None</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="Select.limit"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Select.limit">[docs]</a>    <span class="k">def</span> <span class="nf">limit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">limit</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">clone</span><span class="p">(</span><span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="Select.lazyColumns"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Select.lazyColumns">[docs]</a>    <span class="k">def</span> <span class="nf">lazyColumns</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">clone</span><span class="p">(</span><span class="n">lazyColumns</span><span class="o">=</span><span class="n">value</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="Select.reversed"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Select.reversed">[docs]</a>    <span class="k">def</span> <span class="nf">reversed</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">clone</span><span class="p">(</span><span class="nb">reversed</span><span class="o">=</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;reversed&#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">))</span>
</div>
<div class="viewcode-block" id="Select.distinct"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Select.distinct">[docs]</a>    <span class="k">def</span> <span class="nf">distinct</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">clone</span><span class="p">(</span><span class="n">distinct</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="Select.filter"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Select.filter">[docs]</a>    <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filter_clause</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">filter_clause</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="c1"># None doesn&#39;t filter anything, it&#39;s just a no-op:</span>
            <span class="k">return</span> <span class="bp">self</span>
        <span class="n">clause</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;clause&#39;</span><span class="p">]</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">clause</span><span class="p">,</span> <span class="n">string_type</span><span class="p">):</span>
            <span class="n">clause</span> <span class="o">=</span> <span class="n">SQLConstant</span><span class="p">(</span><span class="s1">&#39;(</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="n">clause</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">newClause</span><span class="p">(</span><span class="n">AND</span><span class="p">(</span><span class="n">clause</span><span class="p">,</span> <span class="n">filter_clause</span><span class="p">))</span>
</div>
    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>

        <span class="n">select</span> <span class="o">=</span> <span class="s2">&quot;SELECT&quot;</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;distinct&#39;</span><span class="p">]:</span>
            <span class="n">select</span> <span class="o">+=</span> <span class="s2">&quot; DISTINCT&quot;</span>
            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;distinctOn&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NoDefault</span><span class="p">:</span>
                <span class="n">select</span> <span class="o">+=</span> <span class="s2">&quot; ON(</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="n">_str_or_sqlrepr</span><span class="p">(</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;distinctOn&#39;</span><span class="p">],</span> <span class="n">db</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">ops</span><span class="p">[</span><span class="s1">&#39;lazyColumns&#39;</span><span class="p">]:</span>
            <span class="n">select</span> <span class="o">+=</span> <span class="s2">&quot; </span><span class="si">%s</span><span class="s2">&quot;</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="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">_str_or_sqlrepr</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;items&#39;</span><span class="p">]])</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">select</span> <span class="o">+=</span> <span class="s2">&quot; </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">_str_or_sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;items&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="n">db</span><span class="p">)</span>

        <span class="n">join</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">join_str</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;join&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NoDefault</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;join&#39;</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="n">_join</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;join&#39;</span><span class="p">]</span>
            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">_join</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
                <span class="n">join_str</span> <span class="o">=</span> <span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">_join</span>
            <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">_join</span><span class="p">,</span> <span class="n">SQLJoin</span><span class="p">):</span>
                <span class="n">join</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_join</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">join</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">_join</span><span class="p">)</span>
        <span class="n">tables</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
        <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;staticTables&#39;</span><span class="p">]:</span>
            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">SQLExpression</span><span class="p">):</span>
                <span class="n">x</span> <span class="o">=</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
            <span class="n">tables</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
        <span class="n">things</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;items&#39;</span><span class="p">])</span> <span class="o">+</span> <span class="n">join</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;clause&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NoDefault</span><span class="p">:</span>
            <span class="n">things</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;clause&#39;</span><span class="p">])</span>
        <span class="k">for</span> <span class="n">thing</span> <span class="ow">in</span> <span class="n">things</span><span class="p">:</span>
            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">thing</span><span class="p">,</span> <span class="n">SQLExpression</span><span class="p">):</span>
                <span class="n">tables</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">tablesUsedSet</span><span class="p">(</span><span class="n">thing</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span>
        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">join</span><span class="p">:</span>
            <span class="n">t1</span> <span class="o">=</span> <span class="n">_str_or_sqlrepr</span><span class="p">(</span><span class="n">j</span><span class="o">.</span><span class="n">table1</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">t1</span> <span class="ow">in</span> <span class="n">tables</span><span class="p">:</span>
                <span class="n">tables</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">t1</span><span class="p">)</span>
            <span class="n">t2</span> <span class="o">=</span> <span class="n">_str_or_sqlrepr</span><span class="p">(</span><span class="n">j</span><span class="o">.</span><span class="n">table2</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">t2</span> <span class="ow">in</span> <span class="n">tables</span><span class="p">:</span>
                <span class="n">tables</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">t2</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">tables</span><span class="p">:</span>
            <span class="n">select</span> <span class="o">+=</span> <span class="s2">&quot; FROM </span><span class="si">%s</span><span class="s2">&quot;</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">sorted</span><span class="p">(</span><span class="n">tables</span><span class="p">))</span>
        <span class="k">elif</span> <span class="n">join</span><span class="p">:</span>
            <span class="n">select</span> <span class="o">+=</span> <span class="s2">&quot; FROM&quot;</span>
        <span class="n">tablesYet</span> <span class="o">=</span> <span class="n">tables</span>
        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">join</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">tablesYet</span> <span class="ow">and</span> <span class="n">j</span><span class="o">.</span><span class="n">table1</span><span class="p">:</span>
                <span class="n">sep</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">sep</span> <span class="o">=</span> <span class="s2">&quot; &quot;</span>
            <span class="n">select</span> <span class="o">+=</span> <span class="n">sep</span> <span class="o">+</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="n">j</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
            <span class="n">tablesYet</span> <span class="o">=</span> <span class="kc">True</span>

        <span class="k">if</span> <span class="n">join_str</span><span class="p">:</span>
            <span class="n">select</span> <span class="o">+=</span> <span class="n">join_str</span>

        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;clause&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NoDefault</span><span class="p">:</span>
            <span class="n">select</span> <span class="o">+=</span> <span class="s2">&quot; WHERE </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">_str_or_sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;clause&#39;</span><span class="p">],</span> <span class="n">db</span><span class="p">)</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;groupBy&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NoDefault</span><span class="p">:</span>
            <span class="n">groupBy</span> <span class="o">=</span> <span class="n">_str_or_sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;groupBy&#39;</span><span class="p">],</span> <span class="n">db</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">ops</span><span class="p">[</span><span class="s1">&#39;groupBy&#39;</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="n">groupBy</span> <span class="o">=</span> <span class="n">groupBy</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="c1"># Remove parens</span>
            <span class="n">select</span> <span class="o">+=</span> <span class="s2">&quot; GROUP BY </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">groupBy</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;having&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NoDefault</span><span class="p">:</span>
            <span class="n">select</span> <span class="o">+=</span> <span class="s2">&quot; HAVING </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">_str_or_sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;having&#39;</span><span class="p">],</span> <span class="n">db</span><span class="p">)</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;orderBy&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NoDefault</span> <span class="ow">and</span> \
           <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;orderBy&#39;</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="n">orderBy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;orderBy&#39;</span><span class="p">]</span>
            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;reversed&#39;</span><span class="p">]:</span>
                <span class="n">reverser</span> <span class="o">=</span> <span class="n">DESC</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="k">def</span> <span class="nf">reverser</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
                    <span class="k">return</span> <span class="n">x</span>
            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">orderBy</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="n">select</span> <span class="o">+=</span> <span class="s2">&quot; ORDER BY </span><span class="si">%s</span><span class="s2">&quot;</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="p">[</span><span class="n">_str_or_sqlrepr</span><span class="p">(</span><span class="n">reverser</span><span class="p">(</span><span class="n">_x</span><span class="p">),</span> <span class="n">db</span><span class="p">)</span> <span class="k">for</span> <span class="n">_x</span> <span class="ow">in</span> <span class="n">orderBy</span><span class="p">])</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">select</span> <span class="o">+=</span> <span class="s2">&quot; ORDER BY </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">_str_or_sqlrepr</span><span class="p">(</span>
                    <span class="n">reverser</span><span class="p">(</span><span class="n">orderBy</span><span class="p">),</span> <span class="n">db</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">ops</span><span class="p">[</span><span class="s1">&#39;start&#39;</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;end&#39;</span><span class="p">]</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;limit&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NoDefault</span><span class="p">:</span>
            <span class="n">end</span> <span class="o">=</span> <span class="n">start</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;limit&#39;</span><span class="p">]</span>
        <span class="k">if</span> <span class="n">start</span> <span class="ow">or</span> <span class="n">end</span><span class="p">:</span>
            <span class="kn">from</span> <span class="nn">.dbconnection</span> <span class="k">import</span> <span class="n">dbConnectionForScheme</span>
            <span class="n">select</span> <span class="o">=</span> <span class="n">dbConnectionForScheme</span><span class="p">(</span><span class="n">db</span><span class="p">)</span><span class="o">.</span><span class="n">_queryAddLimitOffset</span><span class="p">(</span><span class="n">select</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">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;forUpdate&#39;</span><span class="p">]:</span>
            <span class="n">select</span> <span class="o">+=</span> <span class="s2">&quot; FOR UPDATE&quot;</span>
        <span class="k">return</span> <span class="n">select</span>
</div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">Select</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>


<div class="viewcode-block" id="Insert"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Insert">[docs]</a><span class="k">class</span> <span class="nc">Insert</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">,</span> <span class="n">valueList</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">values</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="n">NoDefault</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="n">template</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">table</span> <span class="o">=</span> <span class="n">table</span>
        <span class="k">if</span> <span class="n">valueList</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">values</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;You may only give valueList *or* values&quot;</span><span class="p">)</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">valueList</span> <span class="o">=</span> <span class="n">valueList</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">valueList</span> <span class="o">=</span> <span class="p">[</span><span class="n">values</span><span class="p">]</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</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">valueList</span><span class="p">:</span>
            <span class="k">return</span> <span class="s1">&#39;&#39;</span>
        <span class="n">insert</span> <span class="o">=</span> <span class="s2">&quot;INSERT INTO </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">table</span>
        <span class="n">allowNonDict</span> <span class="o">=</span> <span class="kc">True</span>
        <span class="n">template</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">template</span> <span class="ow">is</span> <span class="n">NoDefault</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">valueList</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nb">dict</span><span class="p">):</span>
            <span class="n">template</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">valueList</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">keys</span><span class="p">()))</span>
            <span class="n">allowNonDict</span> <span class="o">=</span> <span class="kc">False</span>
        <span class="k">if</span> <span class="n">template</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NoDefault</span><span class="p">:</span>
            <span class="n">insert</span> <span class="o">+=</span> <span class="s2">&quot; (</span><span class="si">%s</span><span class="s2">)&quot;</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="n">template</span><span class="p">)</span>
        <span class="n">insert</span> <span class="o">+=</span> <span class="s2">&quot; VALUES &quot;</span>
        <span class="n">listToJoin</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">listToJoin_app</span> <span class="o">=</span> <span class="n">listToJoin</span><span class="o">.</span><span class="n">append</span>
        <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">valueList</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">if</span> <span class="n">template</span> <span class="ow">is</span> <span class="n">NoDefault</span><span class="p">:</span>
                    <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
                        <span class="s2">&quot;You can&#39;t mix non-dictionaries with dictionaries &quot;</span>
                        <span class="s2">&quot;in an INSERT if you don&#39;t provide a template (</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span>
                        <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
                <span class="n">value</span> <span class="o">=</span> <span class="n">dictToList</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
            <span class="k">elif</span> <span class="ow">not</span> <span class="n">allowNonDict</span><span class="p">:</span>
                <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
                    <span class="s2">&quot;You can&#39;t mix non-dictionaries with dictionaries &quot;</span>
                    <span class="s2">&quot;in an INSERT if you don&#39;t provide a template (</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span>
                    <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
            <span class="n">listToJoin_app</span><span class="p">(</span><span class="s2">&quot;(</span><span class="si">%s</span><span class="s2">)&quot;</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="n">sqlrepr</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">value</span><span class="p">]))</span>
        <span class="n">insert</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">insert</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">listToJoin</span><span class="p">))</span>
        <span class="k">return</span> <span class="n">insert</span>
</div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">Insert</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>


<div class="viewcode-block" id="dictToList"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.dictToList">[docs]</a><span class="k">def</span> <span class="nf">dictToList</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
    <span class="nb">list</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">template</span><span class="p">:</span>
        <span class="nb">list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">dict</span><span class="p">[</span><span class="n">key</span><span class="p">])</span>
    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nb">dict</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> <span class="o">&gt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">template</span><span class="p">):</span>
        <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
            <span class="s2">&quot;Extra entries in dictionary that aren&#39;t asked for in template &quot;</span>
            <span class="s2">&quot;(template=</span><span class="si">%s</span><span class="s2">, dict=</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">template</span><span class="p">),</span> <span class="nb">repr</span><span class="p">(</span><span class="nb">dict</span><span class="p">)))</span>
    <span class="k">return</span> <span class="nb">list</span>
</div>

<div class="viewcode-block" id="Update"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Update">[docs]</a><span class="k">class</span> <span class="nc">Update</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="n">template</span><span class="o">=</span><span class="n">NoDefault</span><span class="p">,</span> <span class="n">where</span><span class="o">=</span><span class="n">NoDefault</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">table</span> <span class="o">=</span> <span class="n">table</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="n">values</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">template</span> <span class="o">=</span> <span class="n">template</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">whereClause</span> <span class="o">=</span> <span class="n">where</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="n">update</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</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">sqlName</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="p">)</span>
        <span class="n">update</span> <span class="o">+=</span> <span class="s2">&quot; SET&quot;</span>
        <span class="n">first</span> <span class="o">=</span> <span class="kc">True</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">template</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NoDefault</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</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="k">if</span> <span class="n">first</span><span class="p">:</span>
                    <span class="n">first</span> <span class="o">=</span> <span class="kc">False</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="n">update</span> <span class="o">+=</span> <span class="s2">&quot;,&quot;</span>
                <span class="n">update</span> <span class="o">+=</span> <span class="s2">&quot; </span><span class="si">%s</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">template</span><span class="p">[</span><span class="n">i</span><span class="p">],</span>
                                      <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">db</span><span class="p">))</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
                <span class="k">if</span> <span class="n">first</span><span class="p">:</span>
                    <span class="n">first</span> <span class="o">=</span> <span class="kc">False</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="n">update</span> <span class="o">+=</span> <span class="s2">&quot;,&quot;</span>
                <span class="n">update</span> <span class="o">+=</span> <span class="s2">&quot; </span><span class="si">%s</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="n">key</span><span class="p">,</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">whereClause</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NoDefault</span><span class="p">:</span>
            <span class="n">update</span> <span class="o">+=</span> <span class="s2">&quot; WHERE </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">_str_or_sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">whereClause</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">update</span>

<div class="viewcode-block" id="Update.sqlName"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Update.sqlName">[docs]</a>    <span class="k">def</span> <span class="nf">sqlName</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="s2">&quot;UPDATE&quot;</span>
</div></div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">Update</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>


<div class="viewcode-block" id="Delete"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Delete">[docs]</a><span class="k">class</span> <span class="nc">Delete</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;To be safe, this will signal an error if there is no where clause,</span>
<span class="sd">    unless you pass in where=None to the constructor.&quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">,</span> <span class="n">where</span><span class="o">=</span><span class="n">NoDefault</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">table</span> <span class="o">=</span> <span class="n">table</span>
        <span class="k">if</span> <span class="n">where</span> <span class="ow">is</span> <span class="n">NoDefault</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
                <span class="s2">&quot;You must give a where clause or pass in None &quot;</span>
                <span class="s2">&quot;to indicate no where clause&quot;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">whereClause</span> <span class="o">=</span> <span class="n">where</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="n">whereClause</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">whereClause</span>
        <span class="k">if</span> <span class="n">whereClause</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="s2">&quot;DELETE FROM </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">table</span>
        <span class="n">whereClause</span> <span class="o">=</span> <span class="n">_str_or_sqlrepr</span><span class="p">(</span><span class="n">whereClause</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
        <span class="k">return</span> <span class="s2">&quot;DELETE FROM </span><span class="si">%s</span><span class="s2"> WHERE </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">table</span><span class="p">,</span> <span class="n">whereClause</span><span class="p">)</span>
</div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">Delete</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>


<div class="viewcode-block" id="Replace"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Replace">[docs]</a><span class="k">class</span> <span class="nc">Replace</span><span class="p">(</span><span class="n">Update</span><span class="p">):</span>
<div class="viewcode-block" id="Replace.sqlName"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Replace.sqlName">[docs]</a>    <span class="k">def</span> <span class="nf">sqlName</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="s2">&quot;REPLACE&quot;</span>
</div></div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">Replace</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>

<span class="c1">########################################</span>
<span class="c1"># SQL Builtins</span>
<span class="c1">########################################</span>


<div class="viewcode-block" id="DESC"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.DESC">[docs]</a><span class="k">class</span> <span class="nc">DESC</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</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">expr</span> <span class="o">=</span> <span class="n">expr</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</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">expr</span><span class="p">,</span> <span class="n">DESC</span><span class="p">):</span>
            <span class="k">return</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr</span><span class="o">.</span><span class="n">expr</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
        <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> DESC&#39;</span> <span class="o">%</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="AND"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.AND">[docs]</a><span class="k">def</span> <span class="nf">AND</span><span class="p">(</span><span class="o">*</span><span class="n">ops</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">ops</span><span class="p">:</span>
        <span class="k">return</span> <span class="kc">None</span>
    <span class="n">op1</span> <span class="o">=</span> <span class="n">ops</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
    <span class="n">ops</span> <span class="o">=</span> <span class="n">ops</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
    <span class="k">if</span> <span class="n">ops</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;AND&quot;</span><span class="p">,</span> <span class="n">op1</span><span class="p">,</span> <span class="n">AND</span><span class="p">(</span><span class="o">*</span><span class="n">ops</span><span class="p">))</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">op1</span>
</div>

<div class="viewcode-block" id="OR"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.OR">[docs]</a><span class="k">def</span> <span class="nf">OR</span><span class="p">(</span><span class="o">*</span><span class="n">ops</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">ops</span><span class="p">:</span>
        <span class="k">return</span> <span class="kc">None</span>
    <span class="n">op1</span> <span class="o">=</span> <span class="n">ops</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
    <span class="n">ops</span> <span class="o">=</span> <span class="n">ops</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
    <span class="k">if</span> <span class="n">ops</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;OR&quot;</span><span class="p">,</span> <span class="n">op1</span><span class="p">,</span> <span class="n">OR</span><span class="p">(</span><span class="o">*</span><span class="n">ops</span><span class="p">))</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">op1</span>
</div>

<div class="viewcode-block" id="NOT"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.NOT">[docs]</a><span class="k">def</span> <span class="nf">NOT</span><span class="p">(</span><span class="n">op</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLPrefix</span><span class="p">(</span><span class="s2">&quot;NOT&quot;</span><span class="p">,</span> <span class="n">op</span><span class="p">)</span>
</div>

<span class="k">def</span> <span class="nf">_IN</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;IN&quot;</span><span class="p">,</span> <span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span>


<div class="viewcode-block" id="IN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.IN">[docs]</a><span class="k">def</span> <span class="nf">IN</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
    <span class="kn">from</span> <span class="nn">.sresults</span> <span class="k">import</span> <span class="n">SelectResults</span>  <span class="c1"># Import here to avoid circular import</span>
    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="n">SelectResults</span><span class="p">):</span>
        <span class="n">query</span> <span class="o">=</span> <span class="nb">list</span><span class="o">.</span><span class="n">queryForSelect</span><span class="p">()</span>
        <span class="n">query</span><span class="o">.</span><span class="n">ops</span><span class="p">[</span><span class="s1">&#39;items&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nb">list</span><span class="o">.</span><span class="n">sourceClass</span><span class="o">.</span><span class="n">q</span><span class="o">.</span><span class="n">id</span><span class="p">]</span>
        <span class="nb">list</span> <span class="o">=</span> <span class="n">query</span>
    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="n">Select</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">INSubquery</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">_IN</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="NOTIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.NOTIN">[docs]</a><span class="k">def</span> <span class="nf">NOTIN</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="n">Select</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">NOTINSubquery</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">NOT</span><span class="p">(</span><span class="n">_IN</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">))</span>
</div>

<div class="viewcode-block" id="STARTSWITH"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.STARTSWITH">[docs]</a><span class="k">def</span> <span class="nf">STARTSWITH</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">pattern</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">LIKE</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">_LikeQuoted</span><span class="p">(</span><span class="n">pattern</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;%&#39;</span><span class="p">,</span> <span class="n">escape</span><span class="o">=</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="ENDSWITH"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.ENDSWITH">[docs]</a><span class="k">def</span> <span class="nf">ENDSWITH</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">pattern</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">LIKE</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="s1">&#39;%&#39;</span> <span class="o">+</span> <span class="n">_LikeQuoted</span><span class="p">(</span><span class="n">pattern</span><span class="p">),</span> <span class="n">escape</span><span class="o">=</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="CONTAINSSTRING"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.CONTAINSSTRING">[docs]</a><span class="k">def</span> <span class="nf">CONTAINSSTRING</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">pattern</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">LIKE</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="s1">&#39;%&#39;</span> <span class="o">+</span> <span class="n">_LikeQuoted</span><span class="p">(</span><span class="n">pattern</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;%&#39;</span><span class="p">,</span> <span class="n">escape</span><span class="o">=</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="ISNULL"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.ISNULL">[docs]</a><span class="k">def</span> <span class="nf">ISNULL</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;IS&quot;</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="ISNOTNULL"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.ISNOTNULL">[docs]</a><span class="k">def</span> <span class="nf">ISNOTNULL</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLOp</span><span class="p">(</span><span class="s2">&quot;IS NOT&quot;</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="ColumnAS"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.ColumnAS">[docs]</a><span class="k">class</span> <span class="nc">ColumnAS</span><span class="p">(</span><span class="n">SQLOp</span><span class="p">):</span>
    <span class="sd">&#39;&#39;&#39; Just like SQLOp(&#39;AS&#39;, expr, name) except without the parentheses &#39;&#39;&#39;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">string_type</span><span class="p">):</span>
            <span class="n">name</span> <span class="o">=</span> <span class="n">SQLConstant</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
        <span class="n">SQLOp</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;AS&#39;</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">return</span> <span class="s2">&quot;</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">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr1</span><span class="p">,</span> <span class="n">db</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">op</span><span class="p">,</span>
                             <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr2</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span>
</div>

<span class="k">class</span> <span class="nc">_LikeQuoted</span><span class="p">:</span>
    <span class="c1"># It assumes prefix and postfix are strings; usually just a percent sign.</span>

    <span class="c1"># @@: I&#39;m not sure what the quoting rules really are for all the</span>
    <span class="c1"># databases</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</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">expr</span> <span class="o">=</span> <span class="n">expr</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">prefix</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">postfix</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>

    <span class="k">def</span> <span class="nf">__radd__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">prefix</span> <span class="o">=</span> <span class="n">s</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefix</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">__add__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">postfix</span> <span class="o">+=</span> <span class="n">s</span>
        <span class="k">return</span> <span class="bp">self</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="n">s</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expr</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">SQLExpression</span><span class="p">):</span>
            <span class="n">values</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">prefix</span><span class="p">:</span>
                <span class="n">values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">quote_str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prefix</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span>
            <span class="n">s</span> <span class="o">=</span> <span class="n">_quote_like_special</span><span class="p">(</span><span class="n">sqlrepr</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">db</span><span class="p">),</span> <span class="n">db</span><span class="p">)</span>
            <span class="n">values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">postfix</span><span class="p">:</span>
                <span class="n">values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">quote_str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">postfix</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span>
            <span class="k">if</span> <span class="n">db</span> <span class="o">==</span> <span class="s2">&quot;mysql&quot;</span><span class="p">:</span>
                <span class="k">return</span> <span class="s2">&quot;CONCAT(</span><span class="si">%s</span><span class="s2">)&quot;</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="n">values</span><span class="p">)</span>
            <span class="k">elif</span> <span class="n">db</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;mssql&quot;</span><span class="p">,</span> <span class="s2">&quot;sybase&quot;</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">values</span><span class="p">)</span>
            <span class="k">else</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">values</span><span class="p">)</span>
        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">string_type</span><span class="p">):</span>
            <span class="n">s</span> <span class="o">=</span> <span class="n">_quote_like_special</span><span class="p">(</span><span class="n">unquote_str</span><span class="p">(</span><span class="n">sqlrepr</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">db</span><span class="p">)),</span> <span class="n">db</span><span class="p">)</span>
            <span class="k">return</span> <span class="n">quote_str</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s%s%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">prefix</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">postfix</span><span class="p">),</span> <span class="n">db</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;expected str, unicode or SQLExpression, got </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">type</span><span class="p">(</span><span class="n">s</span><span class="p">))</span>


<span class="k">def</span> <span class="nf">_quote_like_special</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">db</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;postgres&#39;</span><span class="p">,</span> <span class="s1">&#39;rdbhost&#39;</span><span class="p">):</span>
        <span class="n">escape</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">escape</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span>
    <span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span><span class="o">.</span>\
        <span class="n">replace</span><span class="p">(</span><span class="s1">&#39;%&#39;</span><span class="p">,</span> <span class="n">escape</span> <span class="o">+</span> <span class="s1">&#39;%&#39;</span><span class="p">)</span><span class="o">.</span>\
        <span class="n">replace</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">,</span> <span class="n">escape</span> <span class="o">+</span> <span class="s1">&#39;_&#39;</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">s</span>


<div class="viewcode-block" id="CONCAT"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.CONCAT">[docs]</a><span class="k">class</span> <span class="nc">CONCAT</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__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="bp">self</span><span class="o">.</span><span class="n">expressions</span> <span class="o">=</span> <span class="n">expressions</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="n">sqlrepr</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">db</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">expressions</span><span class="p">]</span>
        <span class="k">if</span> <span class="n">db</span> <span class="o">==</span> <span class="s2">&quot;mysql&quot;</span><span class="p">:</span>
            <span class="k">return</span> <span class="s2">&quot;CONCAT(</span><span class="si">%s</span><span class="s2">)&quot;</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="n">values</span><span class="p">)</span>
        <span class="k">elif</span> <span class="n">db</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;mssql&quot;</span><span class="p">,</span> <span class="s2">&quot;sybase&quot;</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">values</span><span class="p">)</span>
        <span class="k">else</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">values</span><span class="p">)</span>
</div>
<span class="c1">########################################</span>
<span class="c1"># SQL JOINs</span>
<span class="c1">########################################</span>


<div class="viewcode-block" id="SQLJoin"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLJoin">[docs]</a><span class="k">class</span> <span class="nc">SQLJoin</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">op</span><span class="o">=</span><span class="s1">&#39;,&#39;</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="s1">&#39;sqlmeta&#39;</span><span class="p">):</span>
            <span class="n">table1</span> <span class="o">=</span> <span class="n">table1</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">table</span>
        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">table2</span><span class="p">,</span> <span class="s1">&#39;sqlmeta&#39;</span><span class="p">):</span>
            <span class="n">table2</span> <span class="o">=</span> <span class="n">table2</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">table</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
            <span class="n">table1</span> <span class="o">=</span> <span class="n">SQLConstant</span><span class="p">(</span><span class="n">table1</span><span class="p">)</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">table2</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
            <span class="n">table2</span> <span class="o">=</span> <span class="n">SQLConstant</span><span class="p">(</span><span class="n">table2</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">table1</span> <span class="o">=</span> <span class="n">table1</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">table2</span> <span class="o">=</span> <span class="n">table2</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">op</span> <span class="o">=</span> <span class="n">op</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">table1</span><span class="p">:</span>
            <span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s%s</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="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">table1</span><span class="p">,</span> <span class="n">db</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">op</span><span class="p">,</span>
                                <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">table2</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</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">op</span><span class="p">,</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">table2</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span>
</div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">SQLJoin</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>


<div class="viewcode-block" id="JOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.JOIN">[docs]</a><span class="k">def</span> <span class="nf">JOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="INNERJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.INNERJOIN">[docs]</a><span class="k">def</span> <span class="nf">INNERJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; INNER JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="CROSSJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.CROSSJOIN">[docs]</a><span class="k">def</span> <span class="nf">CROSSJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; CROSS JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="STRAIGHTJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.STRAIGHTJOIN">[docs]</a><span class="k">def</span> <span class="nf">STRAIGHTJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; STRAIGHT JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="LEFTJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.LEFTJOIN">[docs]</a><span class="k">def</span> <span class="nf">LEFTJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; LEFT JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="LEFTOUTERJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.LEFTOUTERJOIN">[docs]</a><span class="k">def</span> <span class="nf">LEFTOUTERJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; LEFT OUTER JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="NATURALJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.NATURALJOIN">[docs]</a><span class="k">def</span> <span class="nf">NATURALJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; NATURAL JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="NATURALLEFTJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.NATURALLEFTJOIN">[docs]</a><span class="k">def</span> <span class="nf">NATURALLEFTJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; NATURAL LEFT JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="NATURALLEFTOUTERJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.NATURALLEFTOUTERJOIN">[docs]</a><span class="k">def</span> <span class="nf">NATURALLEFTOUTERJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; NATURAL LEFT OUTER JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="RIGHTJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.RIGHTJOIN">[docs]</a><span class="k">def</span> <span class="nf">RIGHTJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; RIGHT JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="RIGHTOUTERJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.RIGHTOUTERJOIN">[docs]</a><span class="k">def</span> <span class="nf">RIGHTOUTERJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; RIGHT OUTER JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="NATURALRIGHTJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.NATURALRIGHTJOIN">[docs]</a><span class="k">def</span> <span class="nf">NATURALRIGHTJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; NATURAL RIGHT JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="NATURALRIGHTOUTERJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.NATURALRIGHTOUTERJOIN">[docs]</a><span class="k">def</span> <span class="nf">NATURALRIGHTOUTERJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; NATURAL RIGHT OUTER JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="FULLJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.FULLJOIN">[docs]</a><span class="k">def</span> <span class="nf">FULLJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; FULL JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="FULLOUTERJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.FULLOUTERJOIN">[docs]</a><span class="k">def</span> <span class="nf">FULLOUTERJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; FULL OUTER JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="NATURALFULLJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.NATURALFULLJOIN">[docs]</a><span class="k">def</span> <span class="nf">NATURALFULLJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; NATURAL FULL JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="NATURALFULLOUTERJOIN"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.NATURALFULLOUTERJOIN">[docs]</a><span class="k">def</span> <span class="nf">NATURALFULLOUTERJOIN</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoin</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot; NATURAL FULL OUTER JOIN&quot;</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="SQLJoinConditional"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLJoinConditional">[docs]</a><span class="k">class</span> <span class="nc">SQLJoinConditional</span><span class="p">(</span><span class="n">SQLJoin</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;Conditional JOIN&quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span>
                 <span class="n">on_condition</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">using_columns</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;For condition you must give on_condition or using_columns</span>
<span class="sd">        but not both</span>

<span class="sd">        on_condition can be a string or SQLExpression, for example</span>
<span class="sd">            Table1.q.col1 == Table2.q.col2</span>
<span class="sd">        using_columns can be a string or a list of columns, e.g.</span>
<span class="sd">            (Table1.q.col1, Table2.q.col2)</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">on_condition</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">using_columns</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;You must give ON condition or USING columns&quot;</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">on_condition</span> <span class="ow">and</span> <span class="n">using_columns</span><span class="p">:</span>
            <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
                <span class="s2">&quot;You must give ON condition or USING columns but not both&quot;</span><span class="p">)</span>
        <span class="n">SQLJoin</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">op</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">on_condition</span> <span class="o">=</span> <span class="n">on_condition</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">using_columns</span> <span class="o">=</span> <span class="n">using_columns</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_condition</span><span class="p">:</span>
            <span class="n">on_condition</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_condition</span>
            <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">on_condition</span><span class="p">,</span> <span class="s2">&quot;__sqlrepr__&quot;</span><span class="p">):</span>
                <span class="n">on_condition</span> <span class="o">=</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="n">on_condition</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
            <span class="n">join</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> </span><span class="si">%s</span><span class="s2"> ON </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">op</span><span class="p">,</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">table2</span><span class="p">,</span> <span class="n">db</span><span class="p">),</span>
                                    <span class="n">on_condition</span><span class="p">)</span>
            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">table1</span><span class="p">:</span>
                <span class="n">join</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</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="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">table1</span><span class="p">,</span> <span class="n">db</span><span class="p">),</span> <span class="n">join</span><span class="p">)</span>
            <span class="k">return</span> <span class="n">join</span>
        <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">using_columns</span><span class="p">:</span>
            <span class="n">using_columns</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">using_columns</span><span class="p">:</span>
                <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">col</span><span class="p">,</span> <span class="s2">&quot;__sqlrepr__&quot;</span><span class="p">):</span>
                    <span class="n">col</span> <span class="o">=</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="n">col</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
                <span class="n">using_columns</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">col</span><span class="p">)</span>
            <span class="n">using_columns</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="n">using_columns</span><span class="p">)</span>
            <span class="n">join</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> </span><span class="si">%s</span><span class="s2"> USING (</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">op</span><span class="p">,</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">table2</span><span class="p">,</span> <span class="n">db</span><span class="p">),</span>
                                         <span class="n">using_columns</span><span class="p">)</span>
            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">table1</span><span class="p">:</span>
                <span class="n">join</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</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="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">table1</span><span class="p">,</span> <span class="n">db</span><span class="p">),</span> <span class="n">join</span><span class="p">)</span>
            <span class="k">return</span> <span class="n">join</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="ne">RuntimeError</span><span class="p">,</span> <span class="s2">&quot;Impossible error&quot;</span>
</div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">SQLJoinConditional</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>


<div class="viewcode-block" id="INNERJOINConditional"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.INNERJOINConditional">[docs]</a><span class="k">def</span> <span class="nf">INNERJOINConditional</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span>
                         <span class="n">on_condition</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">using_columns</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinConditional</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;INNER JOIN&quot;</span><span class="p">,</span>
                              <span class="n">on_condition</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="LEFTJOINConditional"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.LEFTJOINConditional">[docs]</a><span class="k">def</span> <span class="nf">LEFTJOINConditional</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">on_condition</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">using_columns</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinConditional</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;LEFT JOIN&quot;</span><span class="p">,</span>
                              <span class="n">on_condition</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="LEFTOUTERJOINConditional"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.LEFTOUTERJOINConditional">[docs]</a><span class="k">def</span> <span class="nf">LEFTOUTERJOINConditional</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span>
                             <span class="n">on_condition</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">using_columns</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinConditional</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;LEFT OUTER JOIN&quot;</span><span class="p">,</span>
                              <span class="n">on_condition</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="RIGHTJOINConditional"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.RIGHTJOINConditional">[docs]</a><span class="k">def</span> <span class="nf">RIGHTJOINConditional</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span>
                         <span class="n">on_condition</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">using_columns</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinConditional</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;RIGHT JOIN&quot;</span><span class="p">,</span>
                              <span class="n">on_condition</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="RIGHTOUTERJOINConditional"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.RIGHTOUTERJOINConditional">[docs]</a><span class="k">def</span> <span class="nf">RIGHTOUTERJOINConditional</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span>
                              <span class="n">on_condition</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">using_columns</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinConditional</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;RIGHT OUTER JOIN&quot;</span><span class="p">,</span>
                              <span class="n">on_condition</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="FULLJOINConditional"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.FULLJOINConditional">[docs]</a><span class="k">def</span> <span class="nf">FULLJOINConditional</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">on_condition</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">using_columns</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinConditional</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;FULL JOIN&quot;</span><span class="p">,</span>
                              <span class="n">on_condition</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="FULLOUTERJOINConditional"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.FULLOUTERJOINConditional">[docs]</a><span class="k">def</span> <span class="nf">FULLOUTERJOINConditional</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span>
                             <span class="n">on_condition</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">using_columns</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinConditional</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;FULL OUTER JOIN&quot;</span><span class="p">,</span>
                              <span class="n">on_condition</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="SQLJoinOn"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLJoinOn">[docs]</a><span class="k">class</span> <span class="nc">SQLJoinOn</span><span class="p">(</span><span class="n">SQLJoinConditional</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;Conditional JOIN ON&quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">):</span>
        <span class="n">SQLJoinConditional</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">)</span>
</div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">SQLJoinOn</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>


<div class="viewcode-block" id="SQLJoinUsing"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SQLJoinUsing">[docs]</a><span class="k">class</span> <span class="nc">SQLJoinUsing</span><span class="p">(</span><span class="n">SQLJoinConditional</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;Conditional JOIN USING&quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">):</span>
        <span class="n">SQLJoinConditional</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span>
                                    <span class="n">op</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">)</span>
</div>
<span class="n">registerConverter</span><span class="p">(</span><span class="n">SQLJoinUsing</span><span class="p">,</span> <span class="n">SQLExprConverter</span><span class="p">)</span>


<div class="viewcode-block" id="INNERJOINOn"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.INNERJOINOn">[docs]</a><span class="k">def</span> <span class="nf">INNERJOINOn</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinOn</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;INNER JOIN&quot;</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="LEFTJOINOn"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.LEFTJOINOn">[docs]</a><span class="k">def</span> <span class="nf">LEFTJOINOn</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinOn</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;LEFT JOIN&quot;</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="LEFTOUTERJOINOn"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.LEFTOUTERJOINOn">[docs]</a><span class="k">def</span> <span class="nf">LEFTOUTERJOINOn</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinOn</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;LEFT OUTER JOIN&quot;</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="RIGHTJOINOn"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.RIGHTJOINOn">[docs]</a><span class="k">def</span> <span class="nf">RIGHTJOINOn</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinOn</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;RIGHT JOIN&quot;</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="RIGHTOUTERJOINOn"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.RIGHTOUTERJOINOn">[docs]</a><span class="k">def</span> <span class="nf">RIGHTOUTERJOINOn</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinOn</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;RIGHT OUTER JOIN&quot;</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="FULLJOINOn"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.FULLJOINOn">[docs]</a><span class="k">def</span> <span class="nf">FULLJOINOn</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinOn</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;FULL JOIN&quot;</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="FULLOUTERJOINOn"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.FULLOUTERJOINOn">[docs]</a><span class="k">def</span> <span class="nf">FULLOUTERJOINOn</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinOn</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;FULL OUTER JOIN&quot;</span><span class="p">,</span> <span class="n">on_condition</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="INNERJOINUsing"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.INNERJOINUsing">[docs]</a><span class="k">def</span> <span class="nf">INNERJOINUsing</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinUsing</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;INNER JOIN&quot;</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="LEFTJOINUsing"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.LEFTJOINUsing">[docs]</a><span class="k">def</span> <span class="nf">LEFTJOINUsing</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinUsing</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;LEFT JOIN&quot;</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="LEFTOUTERJOINUsing"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.LEFTOUTERJOINUsing">[docs]</a><span class="k">def</span> <span class="nf">LEFTOUTERJOINUsing</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinUsing</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;LEFT OUTER JOIN&quot;</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="RIGHTJOINUsing"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.RIGHTJOINUsing">[docs]</a><span class="k">def</span> <span class="nf">RIGHTJOINUsing</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinUsing</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;RIGHT JOIN&quot;</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="RIGHTOUTERJOINUsing"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.RIGHTOUTERJOINUsing">[docs]</a><span class="k">def</span> <span class="nf">RIGHTOUTERJOINUsing</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinUsing</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;RIGHT OUTER JOIN&quot;</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="FULLJOINUsing"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.FULLJOINUsing">[docs]</a><span class="k">def</span> <span class="nf">FULLJOINUsing</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinUsing</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;FULL JOIN&quot;</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="FULLOUTERJOINUsing"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.FULLOUTERJOINUsing">[docs]</a><span class="k">def</span> <span class="nf">FULLOUTERJOINUsing</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">SQLJoinUsing</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table2</span><span class="p">,</span> <span class="s2">&quot;FULL OUTER JOIN&quot;</span><span class="p">,</span> <span class="n">using_columns</span><span class="p">)</span>
</div>

<span class="c1">########################################</span>
<span class="c1"># Subqueries (subselects)</span>
<span class="c1">########################################</span>

<div class="viewcode-block" id="OuterField"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.OuterField">[docs]</a><span class="k">class</span> <span class="nc">OuterField</span><span class="p">(</span><span class="n">SQLObjectField</span><span class="p">):</span>
<div class="viewcode-block" id="OuterField.tablesUsedImmediate"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.OuterField.tablesUsedImmediate">[docs]</a>    <span class="k">def</span> <span class="nf">tablesUsedImmediate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="p">[]</span>
</div></div>

<div class="viewcode-block" id="OuterTable"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.OuterTable">[docs]</a><span class="k">class</span> <span class="nc">OuterTable</span><span class="p">(</span><span class="n">SQLObjectTable</span><span class="p">):</span>
    <span class="n">FieldClass</span> <span class="o">=</span> <span class="n">OuterField</span>
</div>

<div class="viewcode-block" id="Outer"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Outer">[docs]</a><span class="k">class</span> <span class="nc">Outer</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">q</span> <span class="o">=</span> <span class="n">OuterTable</span><span class="p">(</span><span class="n">table</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="LIKE"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.LIKE">[docs]</a><span class="k">class</span> <span class="nc">LIKE</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="n">op</span> <span class="o">=</span> <span class="s2">&quot;LIKE&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="n">string</span><span class="p">,</span> <span class="n">escape</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">expr</span> <span class="o">=</span> <span class="n">expr</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">string</span> <span class="o">=</span> <span class="n">string</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">escape</span> <span class="o">=</span> <span class="n">escape</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="n">escape</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">escape</span>
        <span class="n">like</span> <span class="o">=</span> <span class="s2">&quot;</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">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr</span><span class="p">,</span> <span class="n">db</span><span class="p">),</span>
                               <span class="bp">self</span><span class="o">.</span><span class="n">op</span><span class="p">,</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">string</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span>
        <span class="k">if</span> <span class="n">escape</span> <span class="ow">is</span> <span class="kc">None</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="n">like</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="s2">&quot;(</span><span class="si">%s</span><span class="s2"> ESCAPE </span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">like</span><span class="p">,</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="n">escape</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span>

<div class="viewcode-block" id="LIKE.components"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.LIKE.components">[docs]</a>    <span class="k">def</span> <span class="nf">components</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">expr</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">string</span><span class="p">]</span>
</div>
<div class="viewcode-block" id="LIKE.execute"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.LIKE.execute">[docs]</a>    <span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">executor</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="bp">self</span><span class="p">,</span> <span class="s1">&#39;_regex&#39;</span><span class="p">):</span>
            <span class="c1"># @@: Crude, not entirely accurate</span>
            <span class="n">dest</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">string</span>
            <span class="n">dest</span> <span class="o">=</span> <span class="n">dest</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%%</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\001</span><span class="s2">&quot;</span><span class="p">)</span>
            <span class="n">dest</span> <span class="o">=</span> <span class="n">dest</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\002</span><span class="s2">&quot;</span><span class="p">)</span>
            <span class="n">dest</span> <span class="o">=</span> <span class="n">dest</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;%&quot;</span><span class="p">,</span> <span class="s2">&quot;*&quot;</span><span class="p">)</span>
            <span class="n">dest</span> <span class="o">=</span> <span class="n">dest</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\001</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;%&quot;</span><span class="p">)</span>
            <span class="n">dest</span> <span class="o">=</span> <span class="n">dest</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\002</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;[*]&quot;</span><span class="p">)</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">_regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">fnmatch</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="n">dest</span><span class="p">),</span> <span class="n">re</span><span class="o">.</span><span class="n">I</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_regex</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">execute</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr</span><span class="p">,</span> <span class="n">executor</span><span class="p">))</span>
</div></div>

<div class="viewcode-block" id="RLIKE"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.RLIKE">[docs]</a><span class="k">class</span> <span class="nc">RLIKE</span><span class="p">(</span><span class="n">LIKE</span><span class="p">):</span>
    <span class="n">op</span> <span class="o">=</span> <span class="s2">&quot;RLIKE&quot;</span>

    <span class="n">op_db</span> <span class="o">=</span> <span class="p">{</span>
        <span class="s1">&#39;firebird&#39;</span><span class="p">:</span> <span class="s1">&#39;RLIKE&#39;</span><span class="p">,</span>
        <span class="s1">&#39;maxdb&#39;</span><span class="p">:</span> <span class="s1">&#39;RLIKE&#39;</span><span class="p">,</span>
        <span class="s1">&#39;mysql&#39;</span><span class="p">:</span> <span class="s1">&#39;RLIKE&#39;</span><span class="p">,</span>
        <span class="s1">&#39;postgres&#39;</span><span class="p">:</span> <span class="s1">&#39;~&#39;</span><span class="p">,</span>
        <span class="s1">&#39;rdbhost&#39;</span><span class="p">:</span> <span class="s1">&#39;~&#39;</span><span class="p">,</span>
        <span class="s1">&#39;sqlite&#39;</span><span class="p">:</span> <span class="s1">&#39;REGEXP&#39;</span>
    <span class="p">}</span>

    <span class="k">def</span> <span class="nf">_get_op</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">op_db</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">db</span><span class="p">,</span> <span class="s1">&#39;LIKE&#39;</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">return</span> <span class="s2">&quot;(</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">))&quot;</span> <span class="o">%</span> <span class="p">(</span>
            <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expr</span><span class="p">,</span> <span class="n">db</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_op</span><span class="p">(</span><span class="n">db</span><span class="p">),</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">string</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
        <span class="p">)</span>

<div class="viewcode-block" id="RLIKE.execute"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.RLIKE.execute">[docs]</a>    <span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">executor</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">op</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_op</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">LIKE</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">executor</span><span class="p">)</span>
</div></div>

<div class="viewcode-block" id="INSubquery"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.INSubquery">[docs]</a><span class="k">class</span> <span class="nc">INSubquery</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="n">op</span> <span class="o">=</span> <span class="s2">&quot;IN&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">,</span> <span class="n">subquery</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">item</span> <span class="o">=</span> <span class="n">item</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">subquery</span> <span class="o">=</span> <span class="n">subquery</span>

<div class="viewcode-block" id="INSubquery.components"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.INSubquery.components">[docs]</a>    <span class="k">def</span> <span class="nf">components</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">item</span><span class="p">]</span>
</div>
    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">return</span> <span class="s2">&quot;</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">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">item</span><span class="p">,</span> <span class="n">db</span><span class="p">),</span>
                               <span class="bp">self</span><span class="o">.</span><span class="n">op</span><span class="p">,</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">subquery</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span>
</div>

<div class="viewcode-block" id="NOTINSubquery"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.NOTINSubquery">[docs]</a><span class="k">class</span> <span class="nc">NOTINSubquery</span><span class="p">(</span><span class="n">INSubquery</span><span class="p">):</span>
    <span class="n">op</span> <span class="o">=</span> <span class="s2">&quot;NOT IN&quot;</span>
</div>

<div class="viewcode-block" id="Subquery"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.Subquery">[docs]</a><span class="k">class</span> <span class="nc">Subquery</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span> <span class="n">subquery</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">op</span> <span class="o">=</span> <span class="n">op</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">subquery</span> <span class="o">=</span> <span class="n">subquery</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</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">op</span><span class="p">,</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">subquery</span><span class="p">,</span> <span class="n">db</span><span class="p">))</span>
</div>

<div class="viewcode-block" id="EXISTS"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.EXISTS">[docs]</a><span class="k">def</span> <span class="nf">EXISTS</span><span class="p">(</span><span class="n">subquery</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">Subquery</span><span class="p">(</span><span class="s2">&quot;EXISTS&quot;</span><span class="p">,</span> <span class="n">subquery</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="NOTEXISTS"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.NOTEXISTS">[docs]</a><span class="k">def</span> <span class="nf">NOTEXISTS</span><span class="p">(</span><span class="n">subquery</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">Subquery</span><span class="p">(</span><span class="s2">&quot;NOT EXISTS&quot;</span><span class="p">,</span> <span class="n">subquery</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="SOME"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.SOME">[docs]</a><span class="k">def</span> <span class="nf">SOME</span><span class="p">(</span><span class="n">subquery</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">Subquery</span><span class="p">(</span><span class="s2">&quot;SOME&quot;</span><span class="p">,</span> <span class="n">subquery</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="ANY"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.ANY">[docs]</a><span class="k">def</span> <span class="nf">ANY</span><span class="p">(</span><span class="n">subquery</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">Subquery</span><span class="p">(</span><span class="s2">&quot;ANY&quot;</span><span class="p">,</span> <span class="n">subquery</span><span class="p">)</span>
</div>

<div class="viewcode-block" id="ALL"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.ALL">[docs]</a><span class="k">def</span> <span class="nf">ALL</span><span class="p">(</span><span class="n">subquery</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">Subquery</span><span class="p">(</span><span class="s2">&quot;ALL&quot;</span><span class="p">,</span> <span class="n">subquery</span><span class="p">)</span>
</div>

<span class="c1">####</span>


<div class="viewcode-block" id="ImportProxyField"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.ImportProxyField">[docs]</a><span class="k">class</span> <span class="nc">ImportProxyField</span><span class="p">(</span><span class="n">SQLObjectField</span><span class="p">):</span>
<div class="viewcode-block" id="ImportProxyField.tablesUsedImmediate"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.ImportProxyField.tablesUsedImmediate">[docs]</a>    <span class="k">def</span> <span class="nf">tablesUsedImmediate</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="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tableName</span><span class="p">)]</span>
</div></div>

<div class="viewcode-block" id="ImportProxy"><a class="viewcode-back" href="../../api/sqlobject.sqlbuilder.html#sqlobject.include.tests.test_hashcol.ImportProxy">[docs]</a><span class="k">class</span> <span class="nc">ImportProxy</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="sd">&#39;&#39;&#39;Class to be used in column definitions that rely on other tables that might</span>
<span class="sd">        not yet be in a classregistry.</span>
<span class="sd">    &#39;&#39;&#39;</span>
    <span class="n">FieldClass</span> <span class="o">=</span> <span class="n">ImportProxyField</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">clsName</span><span class="p">,</span> <span class="n">registry</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">tableName</span> <span class="o">=</span> <span class="n">_DelayClass</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">clsName</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">sqlmeta</span> <span class="o">=</span> <span class="n">_Delay_proxy</span><span class="p">(</span><span class="n">table</span><span class="o">=</span><span class="n">_DelayClass</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">clsName</span><span class="p">))</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">q</span> <span class="o">=</span> <span class="bp">self</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">soClass</span> <span class="o">=</span> <span class="kc">None</span>
        <span class="n">classregistry</span><span class="o">.</span><span class="n">registry</span><span class="p">(</span><span class="n">registry</span><span class="p">)</span><span class="o">.</span><span class="n">addClassCallback</span><span class="p">(</span>
            <span class="n">clsName</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">foreign</span><span class="p">,</span> <span class="n">me</span><span class="p">:</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">me</span><span class="p">,</span> <span class="s1">&#39;soClass&#39;</span><span class="p">,</span> <span class="n">foreign</span><span class="p">),</span> <span class="bp">self</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__nonzero__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="kc">True</span>
    <span class="fm">__bool__</span> <span class="o">=</span> <span class="n">__nonzero__</span>

    <span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">soClass</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">_Delay</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
        <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">soClass</span><span class="o">.</span><span class="n">q</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
</div>

<span class="k">class</span> <span class="nc">_Delay</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">proxy</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">attr</span> <span class="o">=</span> <span class="n">attr</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">proxy</span> <span class="o">=</span> <span class="n">proxy</span>

    <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="o">.</span><span class="n">soClass</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="s1">&#39;_DELAYED_&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">attr</span>
        <span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_resolve</span><span class="p">()</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">SQLExpression</span><span class="p">):</span>
            <span class="n">val</span> <span class="o">=</span> <span class="n">sqlrepr</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">val</span>

    <span class="k">def</span> <span class="nf">tablesUsedImmediate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_resolve</span><span class="p">(),</span> <span class="s1">&#39;tablesUsedImmediate&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="p">[])()</span>

    <span class="k">def</span> <span class="nf">components</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_resolve</span><span class="p">(),</span> <span class="s1">&#39;components&#39;</span><span class="p">,</span> <span class="k">lambda</span><span class="p">:</span> <span class="p">[])()</span>

    <span class="k">def</span> <span class="nf">_resolve</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attr</span><span class="p">)</span>

    <span class="c1"># For AliasTable etc</span>
    <span class="k">def</span> <span class="nf">fieldName</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">class</span> <span class="nc">_aliasFieldName</span><span class="p">(</span><span class="n">SQLExpression</span><span class="p">):</span>
            <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">proxy</span><span class="p">):</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">proxy</span> <span class="o">=</span> <span class="n">proxy</span>

            <span class="k">def</span> <span class="nf">__sqlrepr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">):</span>
                <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="o">.</span><span class="n">_resolve</span><span class="p">()</span><span class="o">.</span><span class="n">fieldName</span>
        <span class="k">return</span> <span class="n">_aliasFieldName</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
    <span class="n">fieldName</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">fieldName</span><span class="p">)</span>


<span class="k">class</span> <span class="nc">_DelayClass</span><span class="p">(</span><span class="n">_Delay</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">_resolve</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">proxy</span><span class="o">.</span><span class="n">soClass</span><span class="o">.</span><span class="n">sqlmeta</span><span class="o">.</span><span class="n">table</span>


<span class="k">class</span> <span class="nc">_Delay_proxy</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kw</span><span class="p">)</span>

<span class="c1">######</span>


<span class="c1">########################################</span>
<span class="c1"># Global initializations</span>
<span class="c1">########################################</span>

<span class="n">table</span> <span class="o">=</span> <span class="n">TableSpace</span><span class="p">()</span>
<span class="n">const</span> <span class="o">=</span> <span class="n">ConstantSpace</span><span class="p">()</span>
<span class="n">func</span> <span class="o">=</span> <span class="n">const</span>

<span class="c1">########################################</span>
<span class="c1"># Testing</span>
<span class="c1">########################################</span>

<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
    <span class="n">tests</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">&gt;&gt;&gt; AND(table.address.name == &quot;Ian Bicking&quot;, table.address.zip &gt; 30000)</span>
<span class="s2">&gt;&gt;&gt; table.address.name</span>
<span class="s2">&gt;&gt;&gt; AND(LIKE(table.address.name, &quot;this&quot;), IN(table.address.zip, [100, 200, 300]))</span>
<span class="s2">&gt;&gt;&gt; Select([table.address.name, table.address.state], where=LIKE(table.address.name, &quot;</span><span class="si">%i</span><span class="s2">an%&quot;))</span>
<span class="s2">&gt;&gt;&gt; Select([table.user.name], where=AND(table.user.state == table.states.abbrev))</span>
<span class="s2">&gt;&gt;&gt; Insert(table.address, [{&quot;name&quot;: &quot;BOB&quot;, &quot;address&quot;: &quot;3049 N. 18th St.&quot;}, {&quot;name&quot;: &quot;TIM&quot;, &quot;address&quot;: &quot;409 S. 10th St.&quot;}])</span>
<span class="s2">&gt;&gt;&gt; Insert(table.address, [(&quot;BOB&quot;, &quot;3049 N. 18th St.&quot;), (&quot;TIM&quot;, &quot;409 S. 10th St.&quot;)], template=(&#39;name&#39;, &#39;address&#39;))</span>
<span class="s2">&gt;&gt;&gt; Delete(table.address, where=&quot;BOB&quot;==table.address.name)</span>
<span class="s2">&gt;&gt;&gt; Update(table.address, {&quot;lastModified&quot;: const.NOW()})</span>
<span class="s2">&gt;&gt;&gt; Replace(table.address, [(&quot;BOB&quot;, &quot;3049 N. 18th St.&quot;), (&quot;TIM&quot;, &quot;409 S. 10th St.&quot;)], template=(&#39;name&#39;, &#39;address&#39;))</span>
<span class="s2">&quot;&quot;&quot;</span>  <span class="c1"># noqa: allow long (&gt; 79) lines</span>
    <span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="n">tests</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">):</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">expr</span><span class="o">.</span><span class="n">strip</span><span class="p">():</span>
            <span class="k">continue</span>
        <span class="k">if</span> <span class="n">expr</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;&gt;&gt;&gt; &#39;</span><span class="p">):</span>
            <span class="n">expr</span> <span class="o">=</span> <span class="n">expr</span><span class="p">[</span><span class="mi">4</span><span class="p">:]</span>
</pre></div>

          </div>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related" role="navigation" aria-label="related navigation">
      <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">SQLObject 3.7.0 documentation</a> &#187;</li>
          <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &#187;</li> 
      </ul>
    </div>
    <div class="footer" role="contentinfo">
        &#169; Copyright 2004-2018, Ian Bicking and contributors.
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.7.4.
    </div>
  </body>
</html>