Sophie

Sophie

distrib > Mageia > 6 > x86_64 > media > core-release > by-pkgid > 7100f2b58690d0bf43c8eb8cfe1232ce > files > 1212

python-sqlobject-2.1.2-2.mga6.noarch.rpm

<html><head><title>/home/phd/current/SQLObject/SQLObject/sqlobject/joins.py</title>
        <script type="text/javascript"><!--
        
function show_line_range() {
    var href = document.location.href;
    if (href.indexOf('?') == -1) {
        return;
    }
    var qs = href.substring(href.indexOf('?')+1);
    if (qs.indexOf('#') >= 0) {
        qs = qs.substring(0, qs.indexOf('#'));
    }
    var first = qs.match(/f=(\d+)/)[1];
    var last = qs.match(/l=(\d+)/)[1];
    if (! first || ! last) {
        return;
    }
    var anchors = document.getElementsByTagName('A');
    var container = document.createElement('DIV');
    container.className = 'highlighted';
    var children = [];
    var start = null;
    var parent = null;
    var highlight = false;
    for (var i = 0; i < anchors.length; i++) {
        var el = anchors[i];
        if (el.getAttribute('name') == first) {
            start = el.previousSibling;
            parent = el.parentNode;
            highlight = true;
        }
        if (el.getAttribute('name') == last) {
            break;
        }
        if (highlight) {
            children[children.length] = el;
            el = el.nextSibling;
            while (el && el.tagName != 'A') {
                children[children.length] = el;
                el = el.nextSibling;
            }
        }
    }
    for (i=0; i<children.length; i++) {
        container.appendChild(children[i]);
    }
    if (start) {
        start.parentNode.insertBefore(container, start.nextSibling);
    } else {
        parent.insertBefore(container, parent.childNodes[0]);
    }
}

        // --></script>
        <style>
        div.python {
          color: #333
        }
        div.python a.lnum {
          color: #555;
          background-color: #eee;
          border-right: 1px solid #999;
          padding-right: 2px;
          margin-right: 4px;
        }
        div.python span.comment { color: #933 }
        div.python span.keyword { color: #a3e; font-weight: bold  }
        div.python span.op { color: #c96 }
        div.python span.string { color: #6a6 }
        div.python span.name { }
        div.python span.text { color: #333 }
        div.highlighted { background-color: #ff9; border: 1px solid #009 }
        </style></head><body onload="show_line_range()"><div class="python"><code><a class="lnum" href="#1" name="1">0001</a><span class="keyword">from</span>&#0160;<span class="name">itertools</span>&#0160;<span class="keyword">import</span>&#0160;<span class="name">count</span><br />
<a class="lnum" href="#2" name="2">0002</a><span class="keyword">import</span>&#0160;<span class="name">classregistry</span><br />
<a class="lnum" href="#3" name="3">0003</a><span class="keyword">import</span>&#0160;<span class="name">events</span><br />
<a class="lnum" href="#4" name="4">0004</a><span class="keyword">import</span>&#0160;<span class="name">styles</span><br />
<a class="lnum" href="#5" name="5">0005</a><span class="keyword">import</span>&#0160;<span class="name">sqlbuilder</span><br />
<a class="lnum" href="#6" name="6">0006</a><span class="keyword">from</span>&#0160;<span class="name">styles</span>&#0160;<span class="keyword">import</span>&#0160;<span class="name">capword</span><br />
<a class="lnum" href="#7" name="7">0007</a><br />
<a class="lnum" href="#8" name="8">0008</a><span class="name">__all__</span>&#0160;<span class="op">=</span>&#0160;<span class="op">[</span><span class="string">'MultipleJoin'</span><span class="op">,</span>&#0160;<span class="string">'SQLMultipleJoin'</span><span class="op">,</span>&#0160;<span class="string">'RelatedJoin'</span><span class="op">,</span>&#0160;<span class="string">'SQLRelatedJoin'</span><span class="op">,</span><br />
<a class="lnum" href="#9" name="9">0009</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="string">'SingleJoin'</span><span class="op">,</span>&#0160;<span class="string">'ManyToMany'</span><span class="op">,</span>&#0160;<span class="string">'OneToMany'</span><span class="op">]</span><br />
<a class="lnum" href="#10" name="10">0010</a><br />
<a class="lnum" href="#11" name="11">0011</a><span class="name">creationOrder</span>&#0160;<span class="op">=</span>&#0160;<span class="name">count</span><span class="op">(</span><span class="op">)</span><br />
<a class="lnum" href="#12" name="12">0012</a><span class="name">NoDefault</span>&#0160;<span class="op">=</span>&#0160;<span class="name">sqlbuilder</span><span class="op">.</span><span class="name">NoDefault</span><br />
<a class="lnum" href="#13" name="13">0013</a><br />
<a class="lnum" href="#14" name="14">0014</a><span class="keyword">def</span>&#0160;<span class="name">getID</span><span class="op">(</span><span class="name">obj</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#15" name="15">0015</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">try</span><span class="op">:</span><br />
<a class="lnum" href="#16" name="16">0016</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">obj</span><span class="op">.</span><span class="name">id</span><br />
<a class="lnum" href="#17" name="17">0017</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">except</span>&#0160;<span class="name">AttributeError</span><span class="op">:</span><br />
<a class="lnum" href="#18" name="18">0018</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">int</span><span class="op">(</span><span class="name">obj</span><span class="op">)</span><br />
<a class="lnum" href="#19" name="19">0019</a><br />
<a class="lnum" href="#20" name="20">0020</a><span class="keyword">class</span>&#0160;<span class="name">Join</span><span class="op">(</span><span class="name">object</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#21" name="21">0021</a><br />
<a class="lnum" href="#22" name="22">0022</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__init__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">otherClass</span><span class="op">=</span><span class="name">None</span><span class="op">,</span>&#0160;<span class="op">**</span><span class="name">kw</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#23" name="23">0023</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">kw</span><span class="op">[</span><span class="string">'otherClass'</span><span class="op">]</span>&#0160;<span class="op">=</span>&#0160;<span class="name">otherClass</span><br />
<a class="lnum" href="#24" name="24">0024</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">kw</span>&#0160;<span class="op">=</span>&#0160;<span class="name">kw</span><br />
<a class="lnum" href="#25" name="25">0025</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_joinMethodName</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">kw</span><span class="op">.</span><span class="name">pop</span><span class="op">(</span><span class="string">'joinMethodName'</span><span class="op">,</span>&#0160;<span class="name">None</span><span class="op">)</span><br />
<a class="lnum" href="#26" name="26">0026</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">creationOrder</span>&#0160;<span class="op">=</span>&#0160;<span class="name">creationOrder</span><span class="op">.</span><span class="name">next</span><span class="op">(</span><span class="op">)</span><br />
<a class="lnum" href="#27" name="27">0027</a><br />
<a class="lnum" href="#28" name="28">0028</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">_set_joinMethodName</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">value</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#29" name="29">0029</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">assert</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_joinMethodName</span>&#0160;<span class="op">==</span>&#0160;<span class="name">value</span>&#0160;<span class="keyword">or</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_joinMethodName</span>&#0160;<span class="keyword">is</span>&#0160;<span class="name">None</span><span class="op">,</span>&#0160;<span class="string">"You&#0160;have&#0160;already&#0160;given&#0160;an&#0160;explicit&#0160;joinMethodName&#0160;(%s),&#0160;and&#0160;you&#0160;are&#0160;now&#0160;setting&#0160;it&#0160;to&#0160;%s"</span>&#0160;<span class="op">%</span>&#0160;<span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">_joinMethodName</span><span class="op">,</span>&#0160;<span class="name">value</span><span class="op">)</span><br />
<a class="lnum" href="#30" name="30">0030</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_joinMethodName</span>&#0160;<span class="op">=</span>&#0160;<span class="name">value</span><br />
<a class="lnum" href="#31" name="31">0031</a><br />
<a class="lnum" href="#32" name="32">0032</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">_get_joinMethodName</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#33" name="33">0033</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_joinMethodName</span><br />
<a class="lnum" href="#34" name="34">0034</a><br />
<a class="lnum" href="#35" name="35">0035</a>&#0160;&#0160;&#0160;&#0160;<span class="name">joinMethodName</span>&#0160;<span class="op">=</span>&#0160;<span class="name">property</span><span class="op">(</span><span class="name">_get_joinMethodName</span><span class="op">,</span>&#0160;<span class="name">_set_joinMethodName</span><span class="op">)</span><br />
<a class="lnum" href="#36" name="36">0036</a>&#0160;&#0160;&#0160;&#0160;<span class="name">name</span>&#0160;<span class="op">=</span>&#0160;<span class="name">joinMethodName</span><br />
<a class="lnum" href="#37" name="37">0037</a><br />
<a class="lnum" href="#38" name="38">0038</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">withClass</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">soClass</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#39" name="39">0039</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="string">'joinMethodName'</span>&#0160;<span class="keyword">in</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">kw</span><span class="op">:</span><br />
<a class="lnum" href="#40" name="40">0040</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_joinMethodName</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">kw</span><span class="op">[</span><span class="string">'joinMethodName'</span><span class="op">]</span><br />
<a class="lnum" href="#41" name="41">0041</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">del</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">kw</span><span class="op">[</span><span class="string">'joinMethodName'</span><span class="op">]</span><br />
<a class="lnum" href="#42" name="42">0042</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">baseClass</span><span class="op">(</span><span class="name">creationOrder</span><span class="op">=</span><span class="name">self</span><span class="op">.</span><span class="name">creationOrder</span><span class="op">,</span><br />
<a class="lnum" href="#43" name="43">0043</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">soClass</span><span class="op">=</span><span class="name">soClass</span><span class="op">,</span><br />
<a class="lnum" href="#44" name="44">0044</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">joinDef</span><span class="op">=</span><span class="name">self</span><span class="op">,</span><br />
<a class="lnum" href="#45" name="45">0045</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">joinMethodName</span><span class="op">=</span><span class="name">self</span><span class="op">.</span><span class="name">_joinMethodName</span><span class="op">,</span><br />
<a class="lnum" href="#46" name="46">0046</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="op">**</span><span class="name">self</span><span class="op">.</span><span class="name">kw</span><span class="op">)</span><br />
<a class="lnum" href="#47" name="47">0047</a><br />
<a class="lnum" href="#48" name="48">0048</a><span class="comment">#&#0160;A&#0160;join&#0160;is&#0160;separate&#0160;from&#0160;a&#0160;foreign&#0160;key,&#0160;i.e.,&#0160;it&#0160;is</span><br />
<a class="lnum" href="#49" name="49">0049</a><span class="comment">#&#0160;many-to-many,&#0160;or&#0160;one-to-many&#0160;where&#0160;the&#0160;*other*&#0160;class</span><br />
<a class="lnum" href="#50" name="50">0050</a><span class="comment">#&#0160;has&#0160;the&#0160;foreign&#0160;key.</span><br />
<a class="lnum" href="#51" name="51">0051</a><span class="keyword">class</span>&#0160;<span class="name">SOJoin</span><span class="op">(</span><span class="name">object</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#52" name="52">0052</a><br />
<a class="lnum" href="#53" name="53">0053</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__init__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span><br />
<a class="lnum" href="#54" name="54">0054</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">creationOrder</span><span class="op">,</span><br />
<a class="lnum" href="#55" name="55">0055</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">soClass</span><span class="op">=</span><span class="name">None</span><span class="op">,</span><br />
<a class="lnum" href="#56" name="56">0056</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">otherClass</span><span class="op">=</span><span class="name">None</span><span class="op">,</span><br />
<a class="lnum" href="#57" name="57">0057</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">joinColumn</span><span class="op">=</span><span class="name">None</span><span class="op">,</span><br />
<a class="lnum" href="#58" name="58">0058</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">joinMethodName</span><span class="op">=</span><span class="name">None</span><span class="op">,</span><br />
<a class="lnum" href="#59" name="59">0059</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">orderBy</span><span class="op">=</span><span class="name">NoDefault</span><span class="op">,</span><br />
<a class="lnum" href="#60" name="60">0060</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">joinDef</span><span class="op">=</span><span class="name">None</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#61" name="61">0061</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">creationOrder</span>&#0160;<span class="op">=</span>&#0160;<span class="name">creationOrder</span><br />
<a class="lnum" href="#62" name="62">0062</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span>&#0160;<span class="op">=</span>&#0160;<span class="name">soClass</span><br />
<a class="lnum" href="#63" name="63">0063</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinDef</span>&#0160;<span class="op">=</span>&#0160;<span class="name">joinDef</span><br />
<a class="lnum" href="#64" name="64">0064</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClassName</span>&#0160;<span class="op">=</span>&#0160;<span class="name">otherClass</span><br />
<a class="lnum" href="#65" name="65">0065</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">classregistry</span><span class="op">.</span><span class="name">registry</span><span class="op">(</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">registry</span><span class="op">)</span><span class="op">.</span><span class="name">addClassCallback</span><span class="op">(</span><br />
<a class="lnum" href="#66" name="66">0066</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">otherClass</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_setOtherClass</span><span class="op">)</span><br />
<a class="lnum" href="#67" name="67">0067</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">joinColumn</span><br />
<a class="lnum" href="#68" name="68">0068</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinMethodName</span>&#0160;<span class="op">=</span>&#0160;<span class="name">joinMethodName</span><br />
<a class="lnum" href="#69" name="69">0069</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_orderBy</span>&#0160;<span class="op">=</span>&#0160;<span class="name">orderBy</span><br />
<a class="lnum" href="#70" name="70">0070</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="keyword">not</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">:</span><br />
<a class="lnum" href="#71" name="71">0071</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="comment">#&#0160;Here&#0160;we&#0160;set&#0160;up&#0160;the&#0160;basic&#0160;join,&#0160;which&#0160;is</span><br />
<a class="lnum" href="#72" name="72">0072</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="comment">#&#0160;one-to-many,&#0160;where&#0160;the&#0160;other&#0160;class&#0160;points&#0160;to</span><br />
<a class="lnum" href="#73" name="73">0073</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="comment">#&#0160;us.</span><br />
<a class="lnum" href="#74" name="74">0074</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">styles</span><span class="op">.</span><span class="name">getStyle</span><span class="op">(</span><br />
<a class="lnum" href="#75" name="75">0075</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">)</span><span class="op">.</span><span class="name">tableReference</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">)</span><br />
<a class="lnum" href="#76" name="76">0076</a><br />
<a class="lnum" href="#77" name="77">0077</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">orderBy</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#78" name="78">0078</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_orderBy</span>&#0160;<span class="keyword">is</span>&#0160;<span class="name">NoDefault</span><span class="op">:</span><br />
<a class="lnum" href="#79" name="79">0079</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_orderBy</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">defaultOrder</span><br />
<a class="lnum" href="#80" name="80">0080</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_orderBy</span><br />
<a class="lnum" href="#81" name="81">0081</a>&#0160;&#0160;&#0160;&#0160;<span class="name">orderBy</span>&#0160;<span class="op">=</span>&#0160;<span class="name">property</span><span class="op">(</span><span class="name">orderBy</span><span class="op">)</span><br />
<a class="lnum" href="#82" name="82">0082</a><br />
<a class="lnum" href="#83" name="83">0083</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">_setOtherClass</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">cls</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#84" name="84">0084</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span>&#0160;<span class="op">=</span>&#0160;<span class="name">cls</span><br />
<a class="lnum" href="#85" name="85">0085</a><br />
<a class="lnum" href="#86" name="86">0086</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">hasIntermediateTable</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#87" name="87">0087</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">False</span><br />
<a class="lnum" href="#88" name="88">0088</a><br />
<a class="lnum" href="#89" name="89">0089</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">_applyOrderBy</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">results</span><span class="op">,</span>&#0160;<span class="name">defaultSortClass</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#90" name="90">0090</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">orderBy</span>&#0160;<span class="keyword">is</span>&#0160;<span class="keyword">not</span>&#0160;<span class="name">None</span><span class="op">:</span><br />
<a class="lnum" href="#91" name="91">0091</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">results</span><span class="op">.</span><span class="name">sort</span><span class="op">(</span><span class="name">sorter</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">orderBy</span><span class="op">)</span><span class="op">)</span><br />
<a class="lnum" href="#92" name="92">0092</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">results</span><br />
<a class="lnum" href="#93" name="93">0093</a><br />
<a class="lnum" href="#94" name="94">0094</a><span class="keyword">def</span>&#0160;<span class="name">sorter</span><span class="op">(</span><span class="name">orderBy</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#95" name="95">0095</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">isinstance</span><span class="op">(</span><span class="name">orderBy</span><span class="op">,</span>&#0160;<span class="op">(</span><span class="name">tuple</span><span class="op">,</span>&#0160;<span class="name">list</span><span class="op">)</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#96" name="96">0096</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">len</span><span class="op">(</span><span class="name">orderBy</span><span class="op">)</span>&#0160;<span class="op">==</span>&#0160;<span class="number">1</span><span class="op">:</span><br />
<a class="lnum" href="#97" name="97">0097</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">orderBy</span>&#0160;<span class="op">=</span>&#0160;<span class="name">orderBy</span><span class="op">[</span><span class="number">0</span><span class="op">]</span><br />
<a class="lnum" href="#98" name="98">0098</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">else</span><span class="op">:</span><br />
<a class="lnum" href="#99" name="99">0099</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">fhead</span>&#0160;<span class="op">=</span>&#0160;<span class="name">sorter</span><span class="op">(</span><span class="name">orderBy</span><span class="op">[</span><span class="number">0</span><span class="op">]</span><span class="op">)</span><br />
<a class="lnum" href="#100" name="100">0100</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">frest</span>&#0160;<span class="op">=</span>&#0160;<span class="name">sorter</span><span class="op">(</span><span class="name">orderBy</span><span class="op">[</span><span class="number">1</span><span class="op">:</span><span class="op">]</span><span class="op">)</span><br />
<a class="lnum" href="#101" name="101">0101</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="keyword">lambda</span>&#0160;<span class="name">a</span><span class="op">,</span>&#0160;<span class="name">b</span><span class="op">,</span>&#0160;<span class="name">fhead</span><span class="op">=</span><span class="name">fhead</span><span class="op">,</span>&#0160;<span class="name">frest</span><span class="op">=</span><span class="name">frest</span><span class="op">:</span>&#0160;<span class="name">fhead</span><span class="op">(</span><span class="name">a</span><span class="op">,</span>&#0160;<span class="name">b</span><span class="op">)</span>&#0160;<span class="keyword">or</span>&#0160;<span class="name">frest</span><span class="op">(</span><span class="name">a</span><span class="op">,</span>&#0160;<span class="name">b</span><span class="op">)</span><br />
<a class="lnum" href="#102" name="102">0102</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">isinstance</span><span class="op">(</span><span class="name">orderBy</span><span class="op">,</span>&#0160;<span class="name">sqlbuilder</span><span class="op">.</span><span class="name">DESC</span><span class="op">)</span>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">and</span>&#0160;<span class="name">isinstance</span><span class="op">(</span><span class="name">orderBy</span><span class="op">.</span><span class="name">expr</span><span class="op">,</span>&#0160;<span class="name">sqlbuilder</span><span class="op">.</span><span class="name">SQLObjectField</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#104" name="104">0104</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">orderBy</span>&#0160;<span class="op">=</span>&#0160;<span class="string">'-'</span>&#0160;<span class="op">+</span>&#0160;<span class="name">orderBy</span><span class="op">.</span><span class="name">expr</span><span class="op">.</span><span class="name">original</span><br />
<a class="lnum" href="#105" name="105">0105</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">elif</span>&#0160;<span class="name">isinstance</span><span class="op">(</span><span class="name">orderBy</span><span class="op">,</span>&#0160;<span class="name">sqlbuilder</span><span class="op">.</span><span class="name">SQLObjectField</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#106" name="106">0106</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">orderBy</span>&#0160;<span class="op">=</span>&#0160;<span class="name">orderBy</span><span class="op">.</span><span class="name">original</span><br />
<a class="lnum" href="#107" name="107">0107</a>&#0160;&#0160;&#0160;&#0160;<span class="comment">#&#0160;@@:&#0160;but&#0160;we&#0160;don't&#0160;handle&#0160;more&#0160;complex&#0160;expressions&#0160;for&#0160;orderings</span><br />
<a class="lnum" href="#108" name="108">0108</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">orderBy</span><span class="op">.</span><span class="name">startswith</span><span class="op">(</span><span class="string">'-'</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#109" name="109">0109</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">orderBy</span>&#0160;<span class="op">=</span>&#0160;<span class="name">orderBy</span><span class="op">[</span><span class="number">1</span><span class="op">:</span><span class="op">]</span><br />
<a class="lnum" href="#110" name="110">0110</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">reverse</span>&#0160;<span class="op">=</span>&#0160;<span class="name">True</span><br />
<a class="lnum" href="#111" name="111">0111</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">else</span><span class="op">:</span><br />
<a class="lnum" href="#112" name="112">0112</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">reverse</span>&#0160;<span class="op">=</span>&#0160;<span class="name">False</span><br />
<a class="lnum" href="#113" name="113">0113</a><br />
<a class="lnum" href="#114" name="114">0114</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">cmper</span><span class="op">(</span><span class="name">a</span><span class="op">,</span>&#0160;<span class="name">b</span><span class="op">,</span>&#0160;<span class="name">attr</span><span class="op">=</span><span class="name">orderBy</span><span class="op">,</span>&#0160;<span class="name">rev</span><span class="op">=</span><span class="name">reverse</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#115" name="115">0115</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">a</span>&#0160;<span class="op">=</span>&#0160;<span class="name">getattr</span><span class="op">(</span><span class="name">a</span><span class="op">,</span>&#0160;<span class="name">attr</span><span class="op">)</span><br />
<a class="lnum" href="#116" name="116">0116</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">b</span>&#0160;<span class="op">=</span>&#0160;<span class="name">getattr</span><span class="op">(</span><span class="name">b</span><span class="op">,</span>&#0160;<span class="name">attr</span><span class="op">)</span><br />
<a class="lnum" href="#117" name="117">0117</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">rev</span><span class="op">:</span><br />
<a class="lnum" href="#118" name="118">0118</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">a</span><span class="op">,</span>&#0160;<span class="name">b</span>&#0160;<span class="op">=</span>&#0160;<span class="name">b</span><span class="op">,</span>&#0160;<span class="name">a</span><br />
<a class="lnum" href="#119" name="119">0119</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">a</span>&#0160;<span class="keyword">is</span>&#0160;<span class="name">None</span><span class="op">:</span><br />
<a class="lnum" href="#120" name="120">0120</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">b</span>&#0160;<span class="keyword">is</span>&#0160;<span class="name">None</span><span class="op">:</span><br />
<a class="lnum" href="#121" name="121">0121</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="number">0</span><br />
<a class="lnum" href="#122" name="122">0122</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="op">-</span><span class="number">1</span><br />
<a class="lnum" href="#123" name="123">0123</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">b</span>&#0160;<span class="keyword">is</span>&#0160;<span class="name">None</span><span class="op">:</span><br />
<a class="lnum" href="#124" name="124">0124</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="number">1</span><br />
<a class="lnum" href="#125" name="125">0125</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">cmp</span><span class="op">(</span><span class="name">a</span><span class="op">,</span>&#0160;<span class="name">b</span><span class="op">)</span><br />
<a class="lnum" href="#126" name="126">0126</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">cmper</span><br />
<a class="lnum" href="#127" name="127">0127</a><br />
<a class="lnum" href="#128" name="128">0128</a><span class="comment">#&#0160;This&#0160;is&#0160;a&#0160;one-to-many</span><br />
<a class="lnum" href="#129" name="129">0129</a><span class="keyword">class</span>&#0160;<span class="name">SOMultipleJoin</span><span class="op">(</span><span class="name">SOJoin</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#130" name="130">0130</a><br />
<a class="lnum" href="#131" name="131">0131</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__init__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">addRemoveName</span><span class="op">=</span><span class="name">None</span><span class="op">,</span>&#0160;<span class="op">**</span><span class="name">kw</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#132" name="132">0132</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="comment">#&#0160;addRemovePrefix&#0160;is&#0160;something&#0160;like&#0160;@@</span><br />
<a class="lnum" href="#133" name="133">0133</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">SOJoin</span><span class="op">.</span><span class="name">__init__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="op">**</span><span class="name">kw</span><span class="op">)</span><br />
<a class="lnum" href="#134" name="134">0134</a><br />
<a class="lnum" href="#135" name="135">0135</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="comment">#&#0160;Here&#0160;we&#0160;generate&#0160;the&#0160;method&#0160;names</span><br />
<a class="lnum" href="#136" name="136">0136</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="keyword">not</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinMethodName</span><span class="op">:</span><br />
<a class="lnum" href="#137" name="137">0137</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">name</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClassName</span><span class="op">[</span><span class="number">0</span><span class="op">]</span><span class="op">.</span><span class="name">lower</span><span class="op">(</span><span class="op">)</span>&#0160;<span class="op">+</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClassName</span><span class="op">[</span><span class="number">1</span><span class="op">:</span><span class="op">]</span><br />
<a class="lnum" href="#138" name="138">0138</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">name</span><span class="op">.</span><span class="name">endswith</span><span class="op">(</span><span class="string">'s'</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#139" name="139">0139</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">name</span>&#0160;<span class="op">=</span>&#0160;<span class="name">name</span>&#0160;<span class="op">+</span>&#0160;<span class="string">"es"</span><br />
<a class="lnum" href="#140" name="140">0140</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">else</span><span class="op">:</span><br />
<a class="lnum" href="#141" name="141">0141</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">name</span>&#0160;<span class="op">=</span>&#0160;<span class="name">name</span>&#0160;<span class="op">+</span>&#0160;<span class="string">"s"</span><br />
<a class="lnum" href="#142" name="142">0142</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinMethodName</span>&#0160;<span class="op">=</span>&#0160;<span class="name">name</span><br />
<a class="lnum" href="#143" name="143">0143</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">addRemoveName</span><span class="op">:</span><br />
<a class="lnum" href="#144" name="144">0144</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">addRemoveName</span>&#0160;<span class="op">=</span>&#0160;<span class="name">addRemoveName</span><br />
<a class="lnum" href="#145" name="145">0145</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">else</span><span class="op">:</span><br />
<a class="lnum" href="#146" name="146">0146</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">addRemoveName</span>&#0160;<span class="op">=</span>&#0160;<span class="name">capword</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">otherClassName</span><span class="op">)</span><br />
<a class="lnum" href="#147" name="147">0147</a><br />
<a class="lnum" href="#148" name="148">0148</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">performJoin</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">inst</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#149" name="149">0149</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">ids</span>&#0160;<span class="op">=</span>&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">_connection</span><span class="op">.</span><span class="name">_SO_selectJoin</span><span class="op">(</span><br />
<a class="lnum" href="#150" name="150">0150</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">,</span><br />
<a class="lnum" href="#151" name="151">0151</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">,</span><br />
<a class="lnum" href="#152" name="152">0152</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">id</span><span class="op">)</span><br />
<a class="lnum" href="#153" name="153">0153</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">_perConnection</span><span class="op">:</span><br />
<a class="lnum" href="#154" name="154">0154</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">conn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">_connection</span><br />
<a class="lnum" href="#155" name="155">0155</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">else</span><span class="op">:</span><br />
<a class="lnum" href="#156" name="156">0156</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">conn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">None</span><br />
<a class="lnum" href="#157" name="157">0157</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_applyOrderBy</span><span class="op">(</span><span class="op">[</span><span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">get</span><span class="op">(</span><span class="name">id</span><span class="op">,</span>&#0160;<span class="name">conn</span><span class="op">)</span>&#0160;<span class="keyword">for</span>&#0160;<span class="op">(</span><span class="name">id</span><span class="op">,</span><span class="op">)</span>&#0160;<span class="keyword">in</span>&#0160;<span class="name">ids</span>&#0160;<span class="keyword">if</span>&#0160;<span class="name">id</span>&#0160;<span class="keyword">is</span>&#0160;<span class="keyword">not</span>&#0160;<span class="name">None</span><span class="op">]</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">)</span><br />
<a class="lnum" href="#158" name="158">0158</a><br />
<a class="lnum" href="#159" name="159">0159</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">_dbNameToPythonName</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#160" name="160">0160</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">for</span>&#0160;<span class="name">column</span>&#0160;<span class="keyword">in</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">columns</span><span class="op">.</span><span class="name">values</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#161" name="161">0161</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">column</span><span class="op">.</span><span class="name">dbName</span>&#0160;<span class="op">==</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">:</span><br />
<a class="lnum" href="#162" name="162">0162</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">column</span><span class="op">.</span><span class="name">name</span><br />
<a class="lnum" href="#163" name="163">0163</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">style</span><span class="op">.</span><span class="name">dbColumnToPythonAttr</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">)</span><br />
<a class="lnum" href="#164" name="164">0164</a><br />
<a class="lnum" href="#165" name="165">0165</a><span class="keyword">class</span>&#0160;<span class="name">MultipleJoin</span><span class="op">(</span><span class="name">Join</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#166" name="166">0166</a>&#0160;&#0160;&#0160;&#0160;<span class="name">baseClass</span>&#0160;<span class="op">=</span>&#0160;<span class="name">SOMultipleJoin</span><br />
<a class="lnum" href="#167" name="167">0167</a><br />
<a class="lnum" href="#168" name="168">0168</a><span class="keyword">class</span>&#0160;<span class="name">SOSQLMultipleJoin</span><span class="op">(</span><span class="name">SOMultipleJoin</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#169" name="169">0169</a><br />
<a class="lnum" href="#170" name="170">0170</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">performJoin</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">inst</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#171" name="171">0171</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">_perConnection</span><span class="op">:</span><br />
<a class="lnum" href="#172" name="172">0172</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">conn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">_connection</span><br />
<a class="lnum" href="#173" name="173">0173</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">else</span><span class="op">:</span><br />
<a class="lnum" href="#174" name="174">0174</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">conn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">None</span><br />
<a class="lnum" href="#175" name="175">0175</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">pythonColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_dbNameToPythonName</span><span class="op">(</span><span class="op">)</span><br />
<a class="lnum" href="#176" name="176">0176</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">results</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">select</span><span class="op">(</span><span class="name">getattr</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">q</span><span class="op">,</span>&#0160;<span class="name">pythonColumn</span><span class="op">)</span>&#0160;<span class="op">==</span>&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">id</span><span class="op">,</span>&#0160;<span class="name">connection</span><span class="op">=</span><span class="name">conn</span><span class="op">)</span><br />
<a class="lnum" href="#177" name="177">0177</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">results</span><span class="op">.</span><span class="name">orderBy</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">orderBy</span><span class="op">)</span><br />
<a class="lnum" href="#178" name="178">0178</a><br />
<a class="lnum" href="#179" name="179">0179</a><span class="keyword">class</span>&#0160;<span class="name">SQLMultipleJoin</span><span class="op">(</span><span class="name">Join</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#180" name="180">0180</a>&#0160;&#0160;&#0160;&#0160;<span class="name">baseClass</span>&#0160;<span class="op">=</span>&#0160;<span class="name">SOSQLMultipleJoin</span><br />
<a class="lnum" href="#181" name="181">0181</a><br />
<a class="lnum" href="#182" name="182">0182</a><span class="comment">#&#0160;This&#0160;is&#0160;a&#0160;many-to-many&#0160;join,&#0160;with&#0160;an&#0160;intermediary&#0160;table</span><br />
<a class="lnum" href="#183" name="183">0183</a><span class="keyword">class</span>&#0160;<span class="name">SORelatedJoin</span><span class="op">(</span><span class="name">SOMultipleJoin</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#184" name="184">0184</a><br />
<a class="lnum" href="#185" name="185">0185</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__init__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span><br />
<a class="lnum" href="#186" name="186">0186</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">otherColumn</span><span class="op">=</span><span class="name">None</span><span class="op">,</span><br />
<a class="lnum" href="#187" name="187">0187</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">intermediateTable</span><span class="op">=</span><span class="name">None</span><span class="op">,</span><br />
<a class="lnum" href="#188" name="188">0188</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">createRelatedTable</span><span class="op">=</span><span class="name">True</span><span class="op">,</span><br />
<a class="lnum" href="#189" name="189">0189</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="op">**</span><span class="name">kw</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#190" name="190">0190</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span>&#0160;<span class="op">=</span>&#0160;<span class="name">intermediateTable</span><br />
<a class="lnum" href="#191" name="191">0191</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">otherColumn</span><br />
<a class="lnum" href="#192" name="192">0192</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">createRelatedTable</span>&#0160;<span class="op">=</span>&#0160;<span class="name">createRelatedTable</span><br />
<a class="lnum" href="#193" name="193">0193</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">SOMultipleJoin</span><span class="op">.</span><span class="name">__init__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="op">**</span><span class="name">kw</span><span class="op">)</span><br />
<a class="lnum" href="#194" name="194">0194</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">classregistry</span><span class="op">.</span><span class="name">registry</span><span class="op">(</span><br />
<a class="lnum" href="#195" name="195">0195</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">registry</span><span class="op">)</span><span class="op">.</span><span class="name">addClassCallback</span><span class="op">(</span><br />
<a class="lnum" href="#196" name="196">0196</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClassName</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_setOtherRelatedClass</span><span class="op">)</span><br />
<a class="lnum" href="#197" name="197">0197</a><br />
<a class="lnum" href="#198" name="198">0198</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">_setOtherRelatedClass</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">otherClass</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#199" name="199">0199</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="keyword">not</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span><span class="op">:</span><br />
<a class="lnum" href="#200" name="200">0200</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">names</span>&#0160;<span class="op">=</span>&#0160;<span class="op">[</span><span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">,</span><br />
<a class="lnum" href="#201" name="201">0201</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">otherClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">]</span><br />
<a class="lnum" href="#202" name="202">0202</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">names</span><span class="op">.</span><span class="name">sort</span><span class="op">(</span><span class="op">)</span><br />
<a class="lnum" href="#203" name="203">0203</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span>&#0160;<span class="op">=</span>&#0160;<span class="string">'%s_%s'</span>&#0160;<span class="op">%</span>&#0160;<span class="op">(</span><span class="name">names</span><span class="op">[</span><span class="number">0</span><span class="op">]</span><span class="op">,</span>&#0160;<span class="name">names</span><span class="op">[</span><span class="number">1</span><span class="op">]</span><span class="op">)</span><br />
<a class="lnum" href="#204" name="204">0204</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="keyword">not</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherColumn</span><span class="op">:</span><br />
<a class="lnum" href="#205" name="205">0205</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">style</span><span class="op">.</span><span class="name">tableReference</span><span class="op">(</span><br />
<a class="lnum" href="#206" name="206">0206</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">otherClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">)</span><br />
<a class="lnum" href="#207" name="207">0207</a><br />
<a class="lnum" href="#208" name="208">0208</a><br />
<a class="lnum" href="#209" name="209">0209</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">hasIntermediateTable</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#210" name="210">0210</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">True</span><br />
<a class="lnum" href="#211" name="211">0211</a><br />
<a class="lnum" href="#212" name="212">0212</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">performJoin</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">inst</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#213" name="213">0213</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">ids</span>&#0160;<span class="op">=</span>&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">_connection</span><span class="op">.</span><span class="name">_SO_intermediateJoin</span><span class="op">(</span><br />
<a class="lnum" href="#214" name="214">0214</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span><span class="op">,</span><br />
<a class="lnum" href="#215" name="215">0215</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherColumn</span><span class="op">,</span><br />
<a class="lnum" href="#216" name="216">0216</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">,</span><br />
<a class="lnum" href="#217" name="217">0217</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">id</span><span class="op">)</span><br />
<a class="lnum" href="#218" name="218">0218</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">_perConnection</span><span class="op">:</span><br />
<a class="lnum" href="#219" name="219">0219</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">conn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">_connection</span><br />
<a class="lnum" href="#220" name="220">0220</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">else</span><span class="op">:</span><br />
<a class="lnum" href="#221" name="221">0221</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">conn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">None</span><br />
<a class="lnum" href="#222" name="222">0222</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_applyOrderBy</span><span class="op">(</span><span class="op">[</span><span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">get</span><span class="op">(</span><span class="name">id</span><span class="op">,</span>&#0160;<span class="name">conn</span><span class="op">)</span>&#0160;<span class="keyword">for</span>&#0160;<span class="op">(</span><span class="name">id</span><span class="op">,</span><span class="op">)</span>&#0160;<span class="keyword">in</span>&#0160;<span class="name">ids</span>&#0160;<span class="keyword">if</span>&#0160;<span class="name">id</span>&#0160;<span class="keyword">is</span>&#0160;<span class="keyword">not</span>&#0160;<span class="name">None</span><span class="op">]</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">)</span><br />
<a class="lnum" href="#223" name="223">0223</a><br />
<a class="lnum" href="#224" name="224">0224</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">remove</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">inst</span><span class="op">,</span>&#0160;<span class="name">other</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#225" name="225">0225</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">_connection</span><span class="op">.</span><span class="name">_SO_intermediateDelete</span><span class="op">(</span><br />
<a class="lnum" href="#226" name="226">0226</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span><span class="op">,</span><br />
<a class="lnum" href="#227" name="227">0227</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">,</span><br />
<a class="lnum" href="#228" name="228">0228</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">getID</span><span class="op">(</span><span class="name">inst</span><span class="op">)</span><span class="op">,</span><br />
<a class="lnum" href="#229" name="229">0229</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherColumn</span><span class="op">,</span><br />
<a class="lnum" href="#230" name="230">0230</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">getID</span><span class="op">(</span><span class="name">other</span><span class="op">)</span><span class="op">)</span><br />
<a class="lnum" href="#231" name="231">0231</a><br />
<a class="lnum" href="#232" name="232">0232</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">add</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">inst</span><span class="op">,</span>&#0160;<span class="name">other</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#233" name="233">0233</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">_connection</span><span class="op">.</span><span class="name">_SO_intermediateInsert</span><span class="op">(</span><br />
<a class="lnum" href="#234" name="234">0234</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span><span class="op">,</span><br />
<a class="lnum" href="#235" name="235">0235</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">,</span><br />
<a class="lnum" href="#236" name="236">0236</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">getID</span><span class="op">(</span><span class="name">inst</span><span class="op">)</span><span class="op">,</span><br />
<a class="lnum" href="#237" name="237">0237</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherColumn</span><span class="op">,</span><br />
<a class="lnum" href="#238" name="238">0238</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">getID</span><span class="op">(</span><span class="name">other</span><span class="op">)</span><span class="op">)</span><br />
<a class="lnum" href="#239" name="239">0239</a><br />
<a class="lnum" href="#240" name="240">0240</a><span class="keyword">class</span>&#0160;<span class="name">RelatedJoin</span><span class="op">(</span><span class="name">MultipleJoin</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#241" name="241">0241</a>&#0160;&#0160;&#0160;&#0160;<span class="name">baseClass</span>&#0160;<span class="op">=</span>&#0160;<span class="name">SORelatedJoin</span><br />
<a class="lnum" href="#242" name="242">0242</a><br />
<a class="lnum" href="#243" name="243">0243</a><span class="comment">#&#0160;helper&#0160;classes&#0160;to&#0160;SQLRelatedJoin</span><br />
<a class="lnum" href="#244" name="244">0244</a><span class="keyword">class</span>&#0160;<span class="name">OtherTableToJoin</span><span class="op">(</span><span class="name">sqlbuilder</span><span class="op">.</span><span class="name">SQLExpression</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#245" name="245">0245</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__init__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">otherTable</span><span class="op">,</span>&#0160;<span class="name">otherIdName</span><span class="op">,</span>&#0160;<span class="name">interTable</span><span class="op">,</span>&#0160;<span class="name">joinColumn</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#246" name="246">0246</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherTable</span>&#0160;<span class="op">=</span>&#0160;<span class="name">otherTable</span><br />
<a class="lnum" href="#247" name="247">0247</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherIdName</span>&#0160;<span class="op">=</span>&#0160;<span class="name">otherIdName</span><br />
<a class="lnum" href="#248" name="248">0248</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">interTable</span>&#0160;<span class="op">=</span>&#0160;<span class="name">interTable</span><br />
<a class="lnum" href="#249" name="249">0249</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">joinColumn</span><br />
<a class="lnum" href="#250" name="250">0250</a><br />
<a class="lnum" href="#251" name="251">0251</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">tablesUsedImmediate</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#252" name="252">0252</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="op">[</span><span class="name">self</span><span class="op">.</span><span class="name">otherTable</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">interTable</span><span class="op">]</span><br />
<a class="lnum" href="#253" name="253">0253</a><br />
<a class="lnum" href="#254" name="254">0254</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__sqlrepr__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">db</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#255" name="255">0255</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="string">'%s.%s&#0160;=&#0160;%s.%s'</span>&#0160;<span class="op">%</span>&#0160;<span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">otherTable</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherIdName</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">interTable</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">)</span><br />
<a class="lnum" href="#256" name="256">0256</a><br />
<a class="lnum" href="#257" name="257">0257</a><span class="keyword">class</span>&#0160;<span class="name">JoinToTable</span><span class="op">(</span><span class="name">sqlbuilder</span><span class="op">.</span><span class="name">SQLExpression</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#258" name="258">0258</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__init__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">table</span><span class="op">,</span>&#0160;<span class="name">idName</span><span class="op">,</span>&#0160;<span class="name">interTable</span><span class="op">,</span>&#0160;<span class="name">joinColumn</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#259" name="259">0259</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">table</span>&#0160;<span class="op">=</span>&#0160;<span class="name">table</span><br />
<a class="lnum" href="#260" name="260">0260</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">idName</span>&#0160;<span class="op">=</span>&#0160;<span class="name">idName</span><br />
<a class="lnum" href="#261" name="261">0261</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">interTable</span>&#0160;<span class="op">=</span>&#0160;<span class="name">interTable</span><br />
<a class="lnum" href="#262" name="262">0262</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">joinColumn</span><br />
<a class="lnum" href="#263" name="263">0263</a><br />
<a class="lnum" href="#264" name="264">0264</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">tablesUsedImmediate</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#265" name="265">0265</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="op">[</span><span class="name">self</span><span class="op">.</span><span class="name">table</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">interTable</span><span class="op">]</span><br />
<a class="lnum" href="#266" name="266">0266</a><br />
<a class="lnum" href="#267" name="267">0267</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__sqlrepr__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">db</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#268" name="268">0268</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="string">'%s.%s&#0160;=&#0160;%s.%s'</span>&#0160;<span class="op">%</span>&#0160;<span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">interTable</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">table</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">idName</span><span class="op">)</span><br />
<a class="lnum" href="#269" name="269">0269</a><br />
<a class="lnum" href="#270" name="270">0270</a><span class="keyword">class</span>&#0160;<span class="name">TableToId</span><span class="op">(</span><span class="name">sqlbuilder</span><span class="op">.</span><span class="name">SQLExpression</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#271" name="271">0271</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__init__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">table</span><span class="op">,</span>&#0160;<span class="name">idName</span><span class="op">,</span>&#0160;<span class="name">idValue</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#272" name="272">0272</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">table</span>&#0160;<span class="op">=</span>&#0160;<span class="name">table</span><br />
<a class="lnum" href="#273" name="273">0273</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">idName</span>&#0160;<span class="op">=</span>&#0160;<span class="name">idName</span><br />
<a class="lnum" href="#274" name="274">0274</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">idValue</span>&#0160;<span class="op">=</span>&#0160;<span class="name">idValue</span><br />
<a class="lnum" href="#275" name="275">0275</a><br />
<a class="lnum" href="#276" name="276">0276</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">tablesUsedImmediate</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#277" name="277">0277</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="op">[</span><span class="name">self</span><span class="op">.</span><span class="name">table</span><span class="op">]</span><br />
<a class="lnum" href="#278" name="278">0278</a><br />
<a class="lnum" href="#279" name="279">0279</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__sqlrepr__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">db</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#280" name="280">0280</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="string">'%s.%s&#0160;=&#0160;%s'</span>&#0160;<span class="op">%</span>&#0160;<span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">table</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">idName</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">idValue</span><span class="op">)</span><br />
<a class="lnum" href="#281" name="281">0281</a><br />
<a class="lnum" href="#282" name="282">0282</a><span class="keyword">class</span>&#0160;<span class="name">SOSQLRelatedJoin</span><span class="op">(</span><span class="name">SORelatedJoin</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#283" name="283">0283</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">performJoin</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">inst</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#284" name="284">0284</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">_perConnection</span><span class="op">:</span><br />
<a class="lnum" href="#285" name="285">0285</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">conn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">_connection</span><br />
<a class="lnum" href="#286" name="286">0286</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">else</span><span class="op">:</span><br />
<a class="lnum" href="#287" name="287">0287</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">conn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">None</span><br />
<a class="lnum" href="#288" name="288">0288</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">results</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">select</span><span class="op">(</span><span class="name">sqlbuilder</span><span class="op">.</span><span class="name">AND</span><span class="op">(</span><br />
<a class="lnum" href="#289" name="289">0289</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">OtherTableToJoin</span><span class="op">(</span><br />
<a class="lnum" href="#290" name="290">0290</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">idName</span><span class="op">,</span><br />
<a class="lnum" href="#291" name="291">0291</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherColumn</span><br />
<a class="lnum" href="#292" name="292">0292</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="op">)</span><span class="op">,</span><br />
<a class="lnum" href="#293" name="293">0293</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">JoinToTable</span><span class="op">(</span><br />
<a class="lnum" href="#294" name="294">0294</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">idName</span><span class="op">,</span><br />
<a class="lnum" href="#295" name="295">0295</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><br />
<a class="lnum" href="#296" name="296">0296</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="op">)</span><span class="op">,</span><br />
<a class="lnum" href="#297" name="297">0297</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">TableToId</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">idName</span><span class="op">,</span>&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">id</span><span class="op">)</span><span class="op">,</span><br />
<a class="lnum" href="#298" name="298">0298</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="op">)</span><span class="op">,</span>&#0160;<span class="name">clauseTables</span><span class="op">=</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span><span class="op">)</span><span class="op">,</span><br />
<a class="lnum" href="#299" name="299">0299</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">connection</span><span class="op">=</span><span class="name">conn</span><span class="op">)</span><br />
<a class="lnum" href="#300" name="300">0300</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">results</span><span class="op">.</span><span class="name">orderBy</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">orderBy</span><span class="op">)</span><br />
<a class="lnum" href="#301" name="301">0301</a><br />
<a class="lnum" href="#302" name="302">0302</a><span class="keyword">class</span>&#0160;<span class="name">SQLRelatedJoin</span><span class="op">(</span><span class="name">RelatedJoin</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#303" name="303">0303</a>&#0160;&#0160;&#0160;&#0160;<span class="name">baseClass</span>&#0160;<span class="op">=</span>&#0160;<span class="name">SOSQLRelatedJoin</span><br />
<a class="lnum" href="#304" name="304">0304</a><br />
<a class="lnum" href="#305" name="305">0305</a><span class="keyword">class</span>&#0160;<span class="name">SOSingleJoin</span><span class="op">(</span><span class="name">SOMultipleJoin</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#306" name="306">0306</a><br />
<a class="lnum" href="#307" name="307">0307</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__init__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="op">**</span><span class="name">kw</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#308" name="308">0308</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">makeDefault</span>&#0160;<span class="op">=</span>&#0160;<span class="name">kw</span><span class="op">.</span><span class="name">pop</span><span class="op">(</span><span class="string">'makeDefault'</span><span class="op">,</span>&#0160;<span class="name">False</span><span class="op">)</span><br />
<a class="lnum" href="#309" name="309">0309</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">SOMultipleJoin</span><span class="op">.</span><span class="name">__init__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="op">**</span><span class="name">kw</span><span class="op">)</span><br />
<a class="lnum" href="#310" name="310">0310</a><br />
<a class="lnum" href="#311" name="311">0311</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">performJoin</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">inst</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#312" name="312">0312</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">_perConnection</span><span class="op">:</span><br />
<a class="lnum" href="#313" name="313">0313</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">conn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">_connection</span><br />
<a class="lnum" href="#314" name="314">0314</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">else</span><span class="op">:</span><br />
<a class="lnum" href="#315" name="315">0315</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">conn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">None</span><br />
<a class="lnum" href="#316" name="316">0316</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">pythonColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_dbNameToPythonName</span><span class="op">(</span><span class="op">)</span><br />
<a class="lnum" href="#317" name="317">0317</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">results</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">select</span><span class="op">(</span><br />
<a class="lnum" href="#318" name="318">0318</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">getattr</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">q</span><span class="op">,</span>&#0160;<span class="name">pythonColumn</span><span class="op">)</span>&#0160;<span class="op">==</span>&#0160;<span class="name">inst</span><span class="op">.</span><span class="name">id</span><span class="op">,</span><br />
<a class="lnum" href="#319" name="319">0319</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">connection</span><span class="op">=</span><span class="name">conn</span><br />
<a class="lnum" href="#320" name="320">0320</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="op">)</span><br />
<a class="lnum" href="#321" name="321">0321</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">results</span><span class="op">.</span><span class="name">count</span><span class="op">(</span><span class="op">)</span>&#0160;<span class="op">==</span>&#0160;<span class="number">0</span><span class="op">:</span><br />
<a class="lnum" href="#322" name="322">0322</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="keyword">not</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">makeDefault</span><span class="op">:</span><br />
<a class="lnum" href="#323" name="323">0323</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">None</span><br />
<a class="lnum" href="#324" name="324">0324</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">else</span><span class="op">:</span><br />
<a class="lnum" href="#325" name="325">0325</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">kw</span>&#0160;<span class="op">=</span>&#0160;<span class="op">{</span><span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">style</span><span class="op">.</span><span class="name">instanceIDAttrToAttr</span><span class="op">(</span><span class="name">pythonColumn</span><span class="op">)</span><span class="op">:</span>&#0160;<span class="name">inst</span><span class="op">}</span><br />
<a class="lnum" href="#326" name="326">0326</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">(</span><span class="op">**</span><span class="name">kw</span><span class="op">)</span>&#0160;<span class="comment">#&#0160;instanciating&#0160;the&#0160;otherClass&#0160;with&#0160;all</span><br />
<a class="lnum" href="#327" name="327">0327</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">else</span><span class="op">:</span><br />
<a class="lnum" href="#328" name="328">0328</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">results</span><span class="op">[</span><span class="number">0</span><span class="op">]</span><br />
<a class="lnum" href="#329" name="329">0329</a><br />
<a class="lnum" href="#330" name="330">0330</a><span class="keyword">class</span>&#0160;<span class="name">SingleJoin</span><span class="op">(</span><span class="name">Join</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#331" name="331">0331</a>&#0160;&#0160;&#0160;&#0160;<span class="name">baseClass</span>&#0160;<span class="op">=</span>&#0160;<span class="name">SOSingleJoin</span><br />
<a class="lnum" href="#332" name="332">0332</a><br />
<a class="lnum" href="#333" name="333">0333</a><br />
<a class="lnum" href="#334" name="334">0334</a><br />
<a class="lnum" href="#335" name="335">0335</a><span class="keyword">import</span>&#0160;<span class="name">boundattributes</span><br />
<a class="lnum" href="#336" name="336">0336</a><br />
<a class="lnum" href="#337" name="337">0337</a><span class="keyword">class</span>&#0160;<span class="name">SOManyToMany</span><span class="op">(</span><span class="name">object</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#338" name="338">0338</a><br />
<a class="lnum" href="#339" name="339">0339</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__init__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">soClass</span><span class="op">,</span>&#0160;<span class="name">name</span><span class="op">,</span>&#0160;<span class="name">join</span><span class="op">,</span><br />
<a class="lnum" href="#340" name="340">0340</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">intermediateTable</span><span class="op">,</span>&#0160;<span class="name">joinColumn</span><span class="op">,</span>&#0160;<span class="name">otherColumn</span><span class="op">,</span><br />
<a class="lnum" href="#341" name="341">0341</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">createJoinTable</span><span class="op">,</span>&#0160;<span class="op">**</span><span class="name">attrs</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#342" name="342">0342</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">name</span>&#0160;<span class="op">=</span>&#0160;<span class="name">name</span><br />
<a class="lnum" href="#343" name="343">0343</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span>&#0160;<span class="op">=</span>&#0160;<span class="name">intermediateTable</span><br />
<a class="lnum" href="#344" name="344">0344</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">joinColumn</span><br />
<a class="lnum" href="#345" name="345">0345</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">otherColumn</span><br />
<a class="lnum" href="#346" name="346">0346</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">createJoinTable</span>&#0160;<span class="op">=</span>&#0160;<span class="name">createJoinTable</span><br />
<a class="lnum" href="#347" name="347">0347</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span>&#0160;<span class="op">=</span>&#0160;<span class="name">None</span><br />
<a class="lnum" href="#348" name="348">0348</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">for</span>&#0160;<span class="name">name</span><span class="op">,</span>&#0160;<span class="name">value</span>&#0160;<span class="keyword">in</span>&#0160;<span class="name">attrs</span><span class="op">.</span><span class="name">items</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#349" name="349">0349</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">setattr</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">name</span><span class="op">,</span>&#0160;<span class="name">value</span><span class="op">)</span><br />
<a class="lnum" href="#350" name="350">0350</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">classregistry</span><span class="op">.</span><span class="name">registry</span><span class="op">(</span><br />
<a class="lnum" href="#351" name="351">0351</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">registry</span><span class="op">)</span><span class="op">.</span><span class="name">addClassCallback</span><span class="op">(</span><br />
<a class="lnum" href="#352" name="352">0352</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">join</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_setOtherClass</span><span class="op">)</span><br />
<a class="lnum" href="#353" name="353">0353</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">classregistry</span><span class="op">.</span><span class="name">registry</span><span class="op">(</span><br />
<a class="lnum" href="#354" name="354">0354</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">registry</span><span class="op">)</span><span class="op">.</span><span class="name">addClassCallback</span><span class="op">(</span><br />
<a class="lnum" href="#355" name="355">0355</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">soClass</span><span class="op">.</span><span class="name">__name__</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_setThisClass</span><span class="op">)</span><br />
<a class="lnum" href="#356" name="356">0356</a><br />
<a class="lnum" href="#357" name="357">0357</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">_setThisClass</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">soClass</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#358" name="358">0358</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span>&#0160;<span class="op">=</span>&#0160;<span class="name">soClass</span><br />
<a class="lnum" href="#359" name="359">0359</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span>&#0160;<span class="keyword">and</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">:</span><br />
<a class="lnum" href="#360" name="360">0360</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_finishSet</span><span class="op">(</span><span class="op">)</span><br />
<a class="lnum" href="#361" name="361">0361</a><br />
<a class="lnum" href="#362" name="362">0362</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">_setOtherClass</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">otherClass</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#363" name="363">0363</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span>&#0160;<span class="op">=</span>&#0160;<span class="name">otherClass</span><br />
<a class="lnum" href="#364" name="364">0364</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span>&#0160;<span class="keyword">and</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">:</span><br />
<a class="lnum" href="#365" name="365">0365</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_finishSet</span><span class="op">(</span><span class="op">)</span><br />
<a class="lnum" href="#366" name="366">0366</a><br />
<a class="lnum" href="#367" name="367">0367</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">_finishSet</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#368" name="368">0368</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span>&#0160;<span class="keyword">is</span>&#0160;<span class="name">None</span><span class="op">:</span><br />
<a class="lnum" href="#369" name="369">0369</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">names</span>&#0160;<span class="op">=</span>&#0160;<span class="op">[</span><span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">,</span><br />
<a class="lnum" href="#370" name="370">0370</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">]</span><br />
<a class="lnum" href="#371" name="371">0371</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">names</span><span class="op">.</span><span class="name">sort</span><span class="op">(</span><span class="op">)</span><br />
<a class="lnum" href="#372" name="372">0372</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span>&#0160;<span class="op">=</span>&#0160;<span class="string">'%s_%s'</span>&#0160;<span class="op">%</span>&#0160;<span class="op">(</span><span class="name">names</span><span class="op">[</span><span class="number">0</span><span class="op">]</span><span class="op">,</span>&#0160;<span class="name">names</span><span class="op">[</span><span class="number">1</span><span class="op">]</span><span class="op">)</span><br />
<a class="lnum" href="#373" name="373">0373</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="keyword">not</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherColumn</span><span class="op">:</span><br />
<a class="lnum" href="#374" name="374">0374</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">style</span><span class="op">.</span><span class="name">tableReference</span><span class="op">(</span><br />
<a class="lnum" href="#375" name="375">0375</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">)</span><br />
<a class="lnum" href="#376" name="376">0376</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="keyword">not</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">:</span><br />
<a class="lnum" href="#377" name="377">0377</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">styles</span><span class="op">.</span><span class="name">getStyle</span><span class="op">(</span><br />
<a class="lnum" href="#378" name="378">0378</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">)</span><span class="op">.</span><span class="name">tableReference</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">)</span><br />
<a class="lnum" href="#379" name="379">0379</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">events</span><span class="op">.</span><span class="name">listen</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">event_CreateTableSignal</span><span class="op">,</span><br />
<a class="lnum" href="#380" name="380">0380</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">,</span>&#0160;<span class="name">events</span><span class="op">.</span><span class="name">CreateTableSignal</span><span class="op">)</span><br />
<a class="lnum" href="#381" name="381">0381</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">events</span><span class="op">.</span><span class="name">listen</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">event_CreateTableSignal</span><span class="op">,</span><br />
<a class="lnum" href="#382" name="382">0382</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">,</span>&#0160;<span class="name">events</span><span class="op">.</span><span class="name">CreateTableSignal</span><span class="op">)</span><br />
<a class="lnum" href="#383" name="383">0383</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">clause</span>&#0160;<span class="op">=</span>&#0160;<span class="op">(</span><br />
<a class="lnum" href="#384" name="384">0384</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">q</span><span class="op">.</span><span class="name">id</span>&#0160;<span class="op">==</span><br />
<a class="lnum" href="#385" name="385">0385</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">sqlbuilder</span><span class="op">.</span><span class="name">Field</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherColumn</span><span class="op">)</span><span class="op">)</span><br />
<a class="lnum" href="#386" name="386">0386</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="op">&amp;</span>&#0160;<span class="op">(</span><span class="name">sqlbuilder</span><span class="op">.</span><span class="name">Field</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">)</span><br />
<a class="lnum" href="#387" name="387">0387</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="op">==</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">q</span><span class="op">.</span><span class="name">id</span><span class="op">)</span><span class="op">)</span><br />
<a class="lnum" href="#388" name="388">0388</a><br />
<a class="lnum" href="#389" name="389">0389</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__get__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">obj</span><span class="op">,</span>&#0160;<span class="name">type</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#390" name="390">0390</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">obj</span>&#0160;<span class="keyword">is</span>&#0160;<span class="name">None</span><span class="op">:</span><br />
<a class="lnum" href="#391" name="391">0391</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">self</span><br />
<a class="lnum" href="#392" name="392">0392</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">query</span>&#0160;<span class="op">=</span>&#0160;<span class="op">(</span><br />
<a class="lnum" href="#393" name="393">0393</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">q</span><span class="op">.</span><span class="name">id</span>&#0160;<span class="op">==</span><br />
<a class="lnum" href="#394" name="394">0394</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">sqlbuilder</span><span class="op">.</span><span class="name">Field</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherColumn</span><span class="op">)</span><span class="op">)</span><br />
<a class="lnum" href="#395" name="395">0395</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="op">&amp;</span>&#0160;<span class="op">(</span><span class="name">sqlbuilder</span><span class="op">.</span><span class="name">Field</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">)</span><br />
<a class="lnum" href="#396" name="396">0396</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="op">==</span>&#0160;<span class="name">obj</span><span class="op">.</span><span class="name">id</span><span class="op">)</span><span class="op">)</span><br />
<a class="lnum" href="#397" name="397">0397</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">select</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">select</span><span class="op">(</span><span class="name">query</span><span class="op">)</span><br />
<a class="lnum" href="#398" name="398">0398</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">_ManyToManySelectWrapper</span><span class="op">(</span><span class="name">obj</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">,</span>&#0160;<span class="name">select</span><span class="op">)</span><br />
<a class="lnum" href="#399" name="399">0399</a><br />
<a class="lnum" href="#400" name="400">0400</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">event_CreateTableSignal</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">soClass</span><span class="op">,</span>&#0160;<span class="name">connection</span><span class="op">,</span>&#0160;<span class="name">extra_sql</span><span class="op">,</span><br />
<a class="lnum" href="#401" name="401">0401</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">post_funcs</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#402" name="402">0402</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">createJoinTable</span><span class="op">:</span><br />
<a class="lnum" href="#403" name="403">0403</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">post_funcs</span><span class="op">.</span><span class="name">append</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">event_CreateTableSignalPost</span><span class="op">)</span><br />
<a class="lnum" href="#404" name="404">0404</a><br />
<a class="lnum" href="#405" name="405">0405</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">event_CreateTableSignalPost</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">soClass</span><span class="op">,</span>&#0160;<span class="name">connection</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#406" name="406">0406</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">connection</span><span class="op">.</span><span class="name">tableExists</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">intermediateTable</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#407" name="407">0407</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span><br />
<a class="lnum" href="#408" name="408">0408</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">connection</span><span class="op">.</span><span class="name">_SO_createJoinTable</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><br />
<a class="lnum" href="#409" name="409">0409</a><br />
<a class="lnum" href="#410" name="410">0410</a><span class="keyword">class</span>&#0160;<span class="name">ManyToMany</span><span class="op">(</span><span class="name">boundattributes</span><span class="op">.</span><span class="name">BoundFactory</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#411" name="411">0411</a>&#0160;&#0160;&#0160;&#0160;<span class="name">factory_class</span>&#0160;<span class="op">=</span>&#0160;<span class="name">SOManyToMany</span><br />
<a class="lnum" href="#412" name="412">0412</a>&#0160;&#0160;&#0160;&#0160;<span class="name">__restrict_attributes__</span>&#0160;<span class="op">=</span>&#0160;<span class="op">(</span><br />
<a class="lnum" href="#413" name="413">0413</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="string">'join'</span><span class="op">,</span>&#0160;<span class="string">'intermediateTable'</span><span class="op">,</span><br />
<a class="lnum" href="#414" name="414">0414</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="string">'joinColumn'</span><span class="op">,</span>&#0160;<span class="string">'otherColumn'</span><span class="op">,</span>&#0160;<span class="string">'createJoinTable'</span><span class="op">)</span><br />
<a class="lnum" href="#415" name="415">0415</a>&#0160;&#0160;&#0160;&#0160;<span class="name">__unpackargs__</span>&#0160;<span class="op">=</span>&#0160;<span class="op">(</span><span class="string">'join'</span><span class="op">,</span><span class="op">)</span><br />
<a class="lnum" href="#416" name="416">0416</a><br />
<a class="lnum" href="#417" name="417">0417</a>&#0160;&#0160;&#0160;&#0160;<span class="comment">#&#0160;Default&#0160;values:</span><br />
<a class="lnum" href="#418" name="418">0418</a>&#0160;&#0160;&#0160;&#0160;<span class="name">intermediateTable</span>&#0160;<span class="op">=</span>&#0160;<span class="name">None</span><br />
<a class="lnum" href="#419" name="419">0419</a>&#0160;&#0160;&#0160;&#0160;<span class="name">joinColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">None</span><br />
<a class="lnum" href="#420" name="420">0420</a>&#0160;&#0160;&#0160;&#0160;<span class="name">otherColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">None</span><br />
<a class="lnum" href="#421" name="421">0421</a>&#0160;&#0160;&#0160;&#0160;<span class="name">createJoinTable</span>&#0160;<span class="op">=</span>&#0160;<span class="name">True</span><br />
<a class="lnum" href="#422" name="422">0422</a><br />
<a class="lnum" href="#423" name="423">0423</a><span class="keyword">class</span>&#0160;<span class="name">_ManyToManySelectWrapper</span><span class="op">(</span><span class="name">object</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#424" name="424">0424</a><br />
<a class="lnum" href="#425" name="425">0425</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__init__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">forObject</span><span class="op">,</span>&#0160;<span class="name">join</span><span class="op">,</span>&#0160;<span class="name">select</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#426" name="426">0426</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">forObject</span>&#0160;<span class="op">=</span>&#0160;<span class="name">forObject</span><br />
<a class="lnum" href="#427" name="427">0427</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">join</span>&#0160;<span class="op">=</span>&#0160;<span class="name">join</span><br />
<a class="lnum" href="#428" name="428">0428</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">select</span>&#0160;<span class="op">=</span>&#0160;<span class="name">select</span><br />
<a class="lnum" href="#429" name="429">0429</a><br />
<a class="lnum" href="#430" name="430">0430</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__getattr__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">attr</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#431" name="431">0431</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="comment">#&#0160;@@:&#0160;This&#0160;passes&#0160;through&#0160;private&#0160;variable&#0160;access&#0160;too...&#0160;should&#0160;it?</span><br />
<a class="lnum" href="#432" name="432">0432</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="comment">#&#0160;Also&#0160;magic&#0160;methods,&#0160;like&#0160;__str__</span><br />
<a class="lnum" href="#433" name="433">0433</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">getattr</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">select</span><span class="op">,</span>&#0160;<span class="name">attr</span><span class="op">)</span><br />
<a class="lnum" href="#434" name="434">0434</a><br />
<a class="lnum" href="#435" name="435">0435</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__repr__</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#436" name="436">0436</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="string">'&lt;%s&#0160;for:&#0160;%s&gt;'</span>&#0160;<span class="op">%</span>&#0160;<span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">__class__</span><span class="op">.</span><span class="name">__name__</span><span class="op">,</span>&#0160;<span class="name">repr</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">select</span><span class="op">)</span><span class="op">)</span><br />
<a class="lnum" href="#437" name="437">0437</a><br />
<a class="lnum" href="#438" name="438">0438</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__str__</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#439" name="439">0439</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">str</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">select</span><span class="op">)</span><br />
<a class="lnum" href="#440" name="440">0440</a><br />
<a class="lnum" href="#441" name="441">0441</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__iter__</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#442" name="442">0442</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">iter</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">select</span><span class="op">)</span><br />
<a class="lnum" href="#443" name="443">0443</a><br />
<a class="lnum" href="#444" name="444">0444</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__getitem__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">key</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#445" name="445">0445</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">select</span><span class="op">[</span><span class="name">key</span><span class="op">]</span><br />
<a class="lnum" href="#446" name="446">0446</a><br />
<a class="lnum" href="#447" name="447">0447</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">add</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">obj</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#448" name="448">0448</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">obj</span><span class="op">.</span><span class="name">_connection</span><span class="op">.</span><span class="name">_SO_intermediateInsert</span><span class="op">(</span><br />
<a class="lnum" href="#449" name="449">0449</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">join</span><span class="op">.</span><span class="name">intermediateTable</span><span class="op">,</span><br />
<a class="lnum" href="#450" name="450">0450</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">join</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">,</span><br />
<a class="lnum" href="#451" name="451">0451</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">getID</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">forObject</span><span class="op">)</span><span class="op">,</span><br />
<a class="lnum" href="#452" name="452">0452</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">join</span><span class="op">.</span><span class="name">otherColumn</span><span class="op">,</span><br />
<a class="lnum" href="#453" name="453">0453</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">getID</span><span class="op">(</span><span class="name">obj</span><span class="op">)</span><span class="op">)</span><br />
<a class="lnum" href="#454" name="454">0454</a><br />
<a class="lnum" href="#455" name="455">0455</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">remove</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">obj</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#456" name="456">0456</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">obj</span><span class="op">.</span><span class="name">_connection</span><span class="op">.</span><span class="name">_SO_intermediateDelete</span><span class="op">(</span><br />
<a class="lnum" href="#457" name="457">0457</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">join</span><span class="op">.</span><span class="name">intermediateTable</span><span class="op">,</span><br />
<a class="lnum" href="#458" name="458">0458</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">join</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">,</span><br />
<a class="lnum" href="#459" name="459">0459</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">getID</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">forObject</span><span class="op">)</span><span class="op">,</span><br />
<a class="lnum" href="#460" name="460">0460</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">join</span><span class="op">.</span><span class="name">otherColumn</span><span class="op">,</span><br />
<a class="lnum" href="#461" name="461">0461</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">getID</span><span class="op">(</span><span class="name">obj</span><span class="op">)</span><span class="op">)</span><br />
<a class="lnum" href="#462" name="462">0462</a><br />
<a class="lnum" href="#463" name="463">0463</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">create</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="op">**</span><span class="name">kw</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#464" name="464">0464</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">obj</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">join</span><span class="op">.</span><span class="name">otherClass</span><span class="op">(</span><span class="op">**</span><span class="name">kw</span><span class="op">)</span><br />
<a class="lnum" href="#465" name="465">0465</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">add</span><span class="op">(</span><span class="name">obj</span><span class="op">)</span><br />
<a class="lnum" href="#466" name="466">0466</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">obj</span><br />
<a class="lnum" href="#467" name="467">0467</a><br />
<a class="lnum" href="#468" name="468">0468</a><span class="keyword">class</span>&#0160;<span class="name">SOOneToMany</span><span class="op">(</span><span class="name">object</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#469" name="469">0469</a><br />
<a class="lnum" href="#470" name="470">0470</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__init__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">soClass</span><span class="op">,</span>&#0160;<span class="name">name</span><span class="op">,</span>&#0160;<span class="name">join</span><span class="op">,</span>&#0160;<span class="name">joinColumn</span><span class="op">,</span>&#0160;<span class="op">**</span><span class="name">attrs</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#471" name="471">0471</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span>&#0160;<span class="op">=</span>&#0160;<span class="name">soClass</span><br />
<a class="lnum" href="#472" name="472">0472</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">name</span>&#0160;<span class="op">=</span>&#0160;<span class="name">name</span><br />
<a class="lnum" href="#473" name="473">0473</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">joinColumn</span><br />
<a class="lnum" href="#474" name="474">0474</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">for</span>&#0160;<span class="name">name</span><span class="op">,</span>&#0160;<span class="name">value</span>&#0160;<span class="keyword">in</span>&#0160;<span class="name">attrs</span><span class="op">.</span><span class="name">items</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#475" name="475">0475</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">setattr</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">name</span><span class="op">,</span>&#0160;<span class="name">value</span><span class="op">)</span><br />
<a class="lnum" href="#476" name="476">0476</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">classregistry</span><span class="op">.</span><span class="name">registry</span><span class="op">(</span><br />
<a class="lnum" href="#477" name="477">0477</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">registry</span><span class="op">)</span><span class="op">.</span><span class="name">addClassCallback</span><span class="op">(</span><br />
<a class="lnum" href="#478" name="478">0478</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">join</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">_setOtherClass</span><span class="op">)</span><br />
<a class="lnum" href="#479" name="479">0479</a><br />
<a class="lnum" href="#480" name="480">0480</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">_setOtherClass</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">otherClass</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#481" name="481">0481</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span>&#0160;<span class="op">=</span>&#0160;<span class="name">otherClass</span><br />
<a class="lnum" href="#482" name="482">0482</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="keyword">not</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">:</span><br />
<a class="lnum" href="#483" name="483">0483</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">styles</span><span class="op">.</span><span class="name">getStyle</span><span class="op">(</span><br />
<a class="lnum" href="#484" name="484">0484</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">)</span><span class="op">.</span><span class="name">tableReference</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">)</span><br />
<a class="lnum" href="#485" name="485">0485</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">clause</span>&#0160;<span class="op">=</span>&#0160;<span class="op">(</span><br />
<a class="lnum" href="#486" name="486">0486</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">sqlbuilder</span><span class="op">.</span><span class="name">Field</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">)</span><br />
<a class="lnum" href="#487" name="487">0487</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="op">==</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">soClass</span><span class="op">.</span><span class="name">q</span><span class="op">.</span><span class="name">id</span><span class="op">)</span><br />
<a class="lnum" href="#488" name="488">0488</a><br />
<a class="lnum" href="#489" name="489">0489</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__get__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">obj</span><span class="op">,</span>&#0160;<span class="name">type</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#490" name="490">0490</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">if</span>&#0160;<span class="name">obj</span>&#0160;<span class="keyword">is</span>&#0160;<span class="name">None</span><span class="op">:</span><br />
<a class="lnum" href="#491" name="491">0491</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">self</span><br />
<a class="lnum" href="#492" name="492">0492</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">query</span>&#0160;<span class="op">=</span>&#0160;<span class="op">(</span><br />
<a class="lnum" href="#493" name="493">0493</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">sqlbuilder</span><span class="op">.</span><span class="name">Field</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">sqlmeta</span><span class="op">.</span><span class="name">table</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">)</span><br />
<a class="lnum" href="#494" name="494">0494</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="op">==</span>&#0160;<span class="name">obj</span><span class="op">.</span><span class="name">id</span><span class="op">)</span><br />
<a class="lnum" href="#495" name="495">0495</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">select</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">otherClass</span><span class="op">.</span><span class="name">select</span><span class="op">(</span><span class="name">query</span><span class="op">)</span><br />
<a class="lnum" href="#496" name="496">0496</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">_OneToManySelectWrapper</span><span class="op">(</span><span class="name">obj</span><span class="op">,</span>&#0160;<span class="name">self</span><span class="op">,</span>&#0160;<span class="name">select</span><span class="op">)</span><br />
<a class="lnum" href="#497" name="497">0497</a><br />
<a class="lnum" href="#498" name="498">0498</a><span class="keyword">class</span>&#0160;<span class="name">OneToMany</span><span class="op">(</span><span class="name">boundattributes</span><span class="op">.</span><span class="name">BoundFactory</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#499" name="499">0499</a>&#0160;&#0160;&#0160;&#0160;<span class="name">factory_class</span>&#0160;<span class="op">=</span>&#0160;<span class="name">SOOneToMany</span><br />
<a class="lnum" href="#500" name="500">0500</a>&#0160;&#0160;&#0160;&#0160;<span class="name">__restrict_attributes__</span>&#0160;<span class="op">=</span>&#0160;<span class="op">(</span><br />
<a class="lnum" href="#501" name="501">0501</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="string">'join'</span><span class="op">,</span>&#0160;<span class="string">'joinColumn'</span><span class="op">)</span><br />
<a class="lnum" href="#502" name="502">0502</a>&#0160;&#0160;&#0160;&#0160;<span class="name">__unpackargs__</span>&#0160;<span class="op">=</span>&#0160;<span class="op">(</span><span class="string">'join'</span><span class="op">,</span><span class="op">)</span><br />
<a class="lnum" href="#503" name="503">0503</a><br />
<a class="lnum" href="#504" name="504">0504</a>&#0160;&#0160;&#0160;&#0160;<span class="comment">#&#0160;Default&#0160;values:</span><br />
<a class="lnum" href="#505" name="505">0505</a>&#0160;&#0160;&#0160;&#0160;<span class="name">joinColumn</span>&#0160;<span class="op">=</span>&#0160;<span class="name">None</span><br />
<a class="lnum" href="#506" name="506">0506</a><br />
<a class="lnum" href="#507" name="507">0507</a><span class="keyword">class</span>&#0160;<span class="name">_OneToManySelectWrapper</span><span class="op">(</span><span class="name">object</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#508" name="508">0508</a><br />
<a class="lnum" href="#509" name="509">0509</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__init__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">forObject</span><span class="op">,</span>&#0160;<span class="name">join</span><span class="op">,</span>&#0160;<span class="name">select</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#510" name="510">0510</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">forObject</span>&#0160;<span class="op">=</span>&#0160;<span class="name">forObject</span><br />
<a class="lnum" href="#511" name="511">0511</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">join</span>&#0160;<span class="op">=</span>&#0160;<span class="name">join</span><br />
<a class="lnum" href="#512" name="512">0512</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">self</span><span class="op">.</span><span class="name">select</span>&#0160;<span class="op">=</span>&#0160;<span class="name">select</span><br />
<a class="lnum" href="#513" name="513">0513</a><br />
<a class="lnum" href="#514" name="514">0514</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__getattr__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">attr</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#515" name="515">0515</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="comment">#&#0160;@@:&#0160;This&#0160;passes&#0160;through&#0160;private&#0160;variable&#0160;access&#0160;too...&#0160;should&#0160;it?</span><br />
<a class="lnum" href="#516" name="516">0516</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="comment">#&#0160;Also&#0160;magic&#0160;methods,&#0160;like&#0160;__str__</span><br />
<a class="lnum" href="#517" name="517">0517</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">getattr</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">select</span><span class="op">,</span>&#0160;<span class="name">attr</span><span class="op">)</span><br />
<a class="lnum" href="#518" name="518">0518</a><br />
<a class="lnum" href="#519" name="519">0519</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__repr__</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#520" name="520">0520</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="string">'&lt;%s&#0160;for:&#0160;%s&gt;'</span>&#0160;<span class="op">%</span>&#0160;<span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">__class__</span><span class="op">.</span><span class="name">__name__</span><span class="op">,</span>&#0160;<span class="name">repr</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">select</span><span class="op">)</span><span class="op">)</span><br />
<a class="lnum" href="#521" name="521">0521</a><br />
<a class="lnum" href="#522" name="522">0522</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__str__</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#523" name="523">0523</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">str</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">select</span><span class="op">)</span><br />
<a class="lnum" href="#524" name="524">0524</a><br />
<a class="lnum" href="#525" name="525">0525</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__iter__</span><span class="op">(</span><span class="name">self</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#526" name="526">0526</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">iter</span><span class="op">(</span><span class="name">self</span><span class="op">.</span><span class="name">select</span><span class="op">)</span><br />
<a class="lnum" href="#527" name="527">0527</a><br />
<a class="lnum" href="#528" name="528">0528</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">__getitem__</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="name">key</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#529" name="529">0529</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">select</span><span class="op">[</span><span class="name">key</span><span class="op">]</span><br />
<a class="lnum" href="#530" name="530">0530</a><br />
<a class="lnum" href="#531" name="531">0531</a>&#0160;&#0160;&#0160;&#0160;<span class="keyword">def</span>&#0160;<span class="name">create</span><span class="op">(</span><span class="name">self</span><span class="op">,</span>&#0160;<span class="op">**</span><span class="name">kw</span><span class="op">)</span><span class="op">:</span><br />
<a class="lnum" href="#532" name="532">0532</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="name">kw</span><span class="op">[</span><span class="name">self</span><span class="op">.</span><span class="name">join</span><span class="op">.</span><span class="name">joinColumn</span><span class="op">]</span>&#0160;<span class="op">=</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">forObject</span><span class="op">.</span><span class="name">id</span><br />
<a class="lnum" href="#533" name="533">0533</a>&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;&#0160;<span class="keyword">return</span>&#0160;<span class="name">self</span><span class="op">.</span><span class="name">join</span><span class="op">.</span><span class="name">otherClass</span><span class="op">(</span><span class="op">**</span><span class="name">kw</span><span class="op">)</span></code></div></body></html>