ó
H`¾Tc           @   s  d  Z  d d l m Z m Z d d l m Z m Z d d l m Z m Z d d l	 m
 Z
 d d l m Z d d	 l m Z m Z m Z m Z m Z m Z m Z d d
 l m Z m Z m Z m Z d d l m Z e j j e j d ƒ Z d d l  m! Z! m" Z" m# Z# d d l m$ Z$ d d l% m& Z& d „  Z' d „  Z( e) e) e) e) e) d „ Z* d „  Z+ d „  Z, d „  Z- d „  Z. d „  Z/ d „  Z0 d e1 f d „  ƒ  YZ2 d „  Z3 d% d „ Z5 d „  Z6 d% d% e) d „ Z7 d e1 f d  „  ƒ  YZ8 d! e j9 f d" „  ƒ  YZ: d# e: f d$ „  ƒ  YZ; d% S(&   s;   High level utilities which build upon other modules here.

i   (   t   exct   utili   (   t   _from_objectst	   ColumnSet(   t	   operatorst   visitorsiÿÿÿÿ(   t   chain(   t   deque(   t   BindParametert   ColumnClauset   ColumnElementt   Nullt   UnaryExpressiont   literal_columnt   Label(   t   ScalarSelectt   Joint
   FromClauset   FromGrouping(   t   Columns   .sql.util.join_condition(   t   _shallow_annotatet   _deep_annotatet   _deep_deannotate(   t   _find_columns(   t   sort_tablesc         C   sa   t  t | ƒ ƒ } xH t |  ƒ D]6 \ } } x' | D] } | j | ƒ r2 | | f Sq2 Wq Wd Sd S(   s”  Given a list of FROM clauses and a selectable,
    return the first index and element from the list of
    clauses which can be joined against the selectable.  returns
    None, None if no match is found.

    e.g.::

        clause1 = table1.join(table2)
        clause2 = table4.join(table5)

        join_to = table2.join(table3)

        find_join_source([clause1, clause2], join_to) == clause1

    N(   NN(   t   listR   t	   enumeratet   is_derived_fromt   None(   t   clausest   join_tot   selectablest   it   ft   s(    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   find_join_source!   s    c            s/   g  ‰ ‡  ‡ ‡ f d †  ‰  t  ˆ  | ƒ ƒ d S(   sý  Produce a traversal of the given expression, delivering
    column comparisons to the given function.

    The function is of the form::

        def my_fn(binary, left, right)

    For each binary expression located which has a
    comparison operator, the product of "left" and
    "right" will be delivered to that function,
    in terms of that binary.

    Hence an expression like::

        and_(
            (a + b) == q + func.sum(e + f),
            j == r
        )

    would have the traversal::

        a <eq> q
        a <eq> e
        a <eq> f
        b <eq> q
        b <eq> e
        b <eq> f
        j <eq> r

    That is, every combination of "left" and
    "right" that doesn't further contain
    a binary comparison is passed as pairs.

    c         3   s  t  |  t ƒ r |  Vnô |  j d k rÁ t j |  j ƒ rÁ ˆ j d |  ƒ xE ˆ  |  j ƒ D]4 } x+ ˆ  |  j ƒ D] } ˆ ˆ d | | ƒ qn WqX Wˆ j	 d ƒ xk |  j
 ƒ  D] } ˆ  | ƒ qª WnJ t  |  t ƒ rØ |  Vn  x0 |  j
 ƒ  D]" } x ˆ  | ƒ D] } | Vqø Wqå Wd  S(   Nt   binaryi    (   t
   isinstanceR   t   __visit_name__R   t   is_comparisont   operatort   insertt   leftt   rightt   popt   get_childrenR	   (   t   elementt   lt   rt   elemt   e(   t   visitt   stackt   fn(    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyR3   `   s     N(   R   (   R5   t   expr(    (   R3   R4   R5   sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   visit_binary_product;   s    #c            sÏ   g  ‰  i  } | r* ˆ  j  | d <| d <n  | r@ ˆ  j  | d <n  | rV ˆ  j  | d <n  | r‚ ‡  f d †  | d <| d <| d <n  | r¤ ‡  f d	 †  } | | d
 <n  ˆ  j  | d <t j |  i t d 6| ƒ ˆ  S(   s1   locate Table objects within the given expression.t   selectt   compound_selectt   joint   aliasc            s   ˆ  j  |  j ƒ S(   N(   t   appendt   table(   t   ent(   t   tables(    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   <lambda>Š   s    R)   t   updatet   deletec            s   ˆ  j  |  j ƒ d  S(   N(   R<   R=   (   t   column(   R?   (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   visit_column   s    RC   R=   t   column_collections(   R<   R   t   traverset   False(   t   clauset   check_columnst   include_aliasest   include_joinst   include_selectst   include_crudt	   _visitorsRD   (    (   R?   sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   find_tablesw   s     &c         C   sž   t  j ƒ  } t |  g ƒ } x| | r™ | j ƒ  } t | t ƒ rr t | t ƒ sb t j | j	 ƒ rr | j
 | ƒ q x! | j ƒ  D] } | j | ƒ q Wq W| S(   sq   Break up an 'order by' expression into individual column-expressions,
    without DESC/ASC/NULLS FIRST/NULLS LAST(   R   t
   column_setR   t   popleftR%   R
   R   R   t   is_ordering_modifiert   modifiert   addR-   R<   (   RH   t   colsR4   t   tt   c(    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   unwrap_order_by—   s    	c         C   s/   x( t  | ƒ D] } |  | k r t Sq Wt Sd S(   sÐ   Given a target clause and a second to search within, return True
    if the target is plainly present in the search without any
    subqueries or aliases involved.

    Basically descends through Joins.

    N(   t   surface_selectablest   TrueRG   (   RH   t   searchR1   (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   clause_is_present«   s    	c         c   sx   |  g } xh | rs | j  ƒ  } | Vt | t ƒ rN | j | j | j f ƒ q t | t ƒ r | j | j ƒ q q Wd  S(   N(	   R,   R%   R   t   extendR*   R+   R   R<   R.   (   RH   R4   R1   (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyRY   »   s    		c         C   s%   t  t t |  ƒ ƒ j t | ƒ ƒ ƒ S(   s:   Return True if left/right have some overlapping selectable(   t   boolt   setRY   t   intersection(   R*   R+   (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   selectables_overlapÆ   s    c            s3   g  ‰  ‡  f d †  } t  j |  i  i | d 6ƒ ˆ  S(   sÑ   Return an ordered list of "bound" values in the given clause.

    E.g.::

        >>> expr = and_(
        ...    table.c.foo==5, table.c.foo==7
        ... )
        >>> bind_values(expr)
        [5, 7]
    c            s   ˆ  j  |  j ƒ d  S(   N(   R<   t   effective_value(   t   bind(   t   v(    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   visit_bindparamÞ   s    t	   bindparam(   R   RF   (   RH   Re   (    (   Rd   sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   bind_valuesÐ   s    c         C   s:   t  |  t j ƒ r, |  j d d ƒ }  d |  St |  ƒ Sd  S(   Nt   's   ''s   '%s'(   R%   R   t   string_typest   replacet   repr(   R.   (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   _quote_ddl_exprå   s    t   _repr_paramsc           B   s    e  Z d  Z d „  Z d „  Z RS(   sn   A string view of bound parameters, truncating
    display to the given number of 'multi' parameter sets.

    c         C   s   | |  _  | |  _ d  S(   N(   t   paramst   batches(   t   selfRn   Ro   (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   __init__ó   s    	c         C   s¾   t  |  j t t f ƒ r­ t |  j ƒ |  j k r­ t  |  j d t t t f ƒ r­ d } d j t |  j |  j d  ƒ d d !| |  j t |  j ƒ f t |  j d ƒ d f ƒ St |  j ƒ Sd  S(   Ni    s8    ... displaying %i of %i total bound parameter sets ... t    i   iÿÿÿÿiþÿÿÿi   (	   R%   Rn   R   t   tuplet   lenRo   t   dictR:   Rk   (   Rp   t   msg(    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   __repr__÷   s    (   t   __name__t
   __module__t   __doc__Rq   Rw   (    (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyRm   í   s   	c            s)   ‡  f d †  } t  j |  i  i | d 6ƒ S(   sW   given criterion containing bind params, convert selected elements
    to IS NULL.

    c            s¦   t  |  j t ƒ rW |  j j ˆ  k rW |  j |  _ t ƒ  |  _ t j |  _ t j	 |  _
 nK t  |  j t ƒ r¢ |  j j ˆ  k r¢ t ƒ  |  _ t j |  _ t j	 |  _
 n  d  S(   N(   R%   R*   R   t   _identifying_keyR+   R   R   t   is_R(   t   isnott   negate(   R$   (   t   nulls(    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   visit_binary  s    R$   (   R   t   cloned_traverse(   t   critR   R€   (    (   R   sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   adapt_criterion_to_null  s    c         C   sï   |  d  k r | S| d  f g } t |  ƒ } d  } x· | rê | j ƒ  \ } } t | t ƒ r« | | k	 r« | j ƒ  } | j ƒ  | j | j ƒ | _ | j	 | j
 | f ƒ n | j | ƒ } | d  k	 rÒ | | _
 n  | d  k r4 | } q4 q4 W| S(   N(   R   t   ClauseAdapterR,   R%   R   t   _clonet   _reset_exportedRF   t   onclauseR<   R*   (   R*   R+   t   stop_onR4   t   adaptert   rett	   prevright(    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   splice_joins  s$    	
c   
         sœ  | j  d t ƒ } | j  d t ƒ ‰  t j ˆ ƒ ‰ t j ƒ  ‰ xï ˆ D]ç } xÞ t g  | j D] } | j ^ q\ Œ  D]· } x® ˆ D]¦ } | | k r— q n  y | j } WnE t	 j
 k
 rÉ | rÃ q qì ‚  n# t	 j k
 rë | rå q qì ‚  n X| j | ƒ r ˆ  s| j | j k r ˆ j | ƒ Pq q Wqr WqF W| r‰‡  ‡ ‡ f d †  } x: | D]/ }	 |	 d k	 rSt j |	 i  i | d 6ƒ qSqSWn  t ˆ j ˆ ƒ ƒ S(   sC  given a list of columns, return a 'reduced' set based on natural
    equivalents.

    the set is reduced to the smallest list of columns which have no natural
    equivalent present in the list.  A "natural equivalent" means that two
    columns will ultimately represent the same value because they are related
    by a foreign key.

    \*clauses is an optional list of join clauses which will be traversed
    to further identify columns that are "equivalent".

    \**kw may specify 'ignore_nonexistent_tables' to ignore foreign keys
    whose tables are not yet configured, or columns that aren't yet present.

    This function is primarily used to determine the most minimal "primary
    key" from a selectable, by reducing the set of primary key columns present
    in the selectable to just those that are not repeated.

    t   ignore_nonexistent_tablest   only_synonymsc            sÄ   |  j  t j k rÀ t j t g  ˆ j ˆ ƒ D] } | j ^ q+ Œ  ƒ } |  j | k rÀ |  j	 | k rÀ xV t
 ˆ ƒ D]E } | j |  j	 ƒ rq ˆ  s¥ | j |  j j k rq ˆ j | ƒ Pqq qq WqÀ n  d  S(   N(   R(   R   t   eqR   RP   R   t
   differencet	   proxy_setR*   R+   t   reversedt   shares_lineaget   nameRT   (   R$   RW   RU   (   RŽ   t   omitt   columns(    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyR€   k  s    .R$   N(   R,   RG   R   t   ordered_column_setRP   R   R‘   t   foreign_keysRC   R    t   NoReferencedColumnErrort   NoReferencedTableErrorR“   R”   RT   R   R   RF   R   R   (
   R–   R   t   kwR   t   colRW   t   fkt   fk_colR€   RH   (    (   RŽ   R•   R–   sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   reduce_columns5  s<    ,$c            sf   ˆ r ˆ r t  j d ƒ ‚ n  d „  ‰ ‡  ‡ ‡ ‡ ‡ f d †  } g  ‰  t j |  i  i | d 6ƒ ˆ  S(   s9   traverse an expression and locate binary criterion pairs.sS   Can only specify one of 'consider_as_foreign_keys' or 'consider_as_referenced_keys'c         S   s   |  j  | ƒ S(   N(   t   compare(   t   at   b(    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   col_is†  s    c      	      s"  ˆ r |  j  t j k	 r d  St |  j t ƒ sC t |  j t ƒ rG d  Sˆ rî |  j ˆ k rœ ˆ |  j |  j ƒ s€ |  j ˆ k rœ ˆ  j |  j |  j f ƒ q|  j ˆ k rˆ |  j |  j ƒ sÏ |  j ˆ k rˆ  j |  j |  j f ƒ qn0ˆ r•|  j ˆ k rCˆ |  j |  j ƒ s'|  j ˆ k rCˆ  j |  j |  j f ƒ q|  j ˆ k rˆ |  j |  j ƒ sv|  j ˆ k rˆ  j |  j |  j f ƒ qn‰ t |  j t ƒ rt |  j t ƒ r|  j j	 |  j ƒ rêˆ  j |  j |  j f ƒ q|  j j	 |  j ƒ rˆ  j |  j |  j f ƒ qn  d  S(   N(
   R(   R   R   R%   R*   R
   R+   R<   R   t
   references(   R$   (   t   pairsR£   t   any_operatort   consider_as_foreign_keyst   consider_as_referenced_keys(    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyR€   Š  s:    R$   (   R    t   ArgumentErrorR   RF   (   t
   expressionR§   R¨   R¦   R€   (    (   R¥   R£   R¦   R§   R¨   sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   criterion_as_pairs}  s    	 t
   AliasedRowc           B   s;   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   sˆ   Wrap a RowProxy with a translation map.

    This object allows a set of keys to be translated
    to those present in a RowProxy.

    c         C   s4   t  | t ƒ r | j |  _ n	 | |  _ | |  _ d  S(   N(   R%   R¬   t   rowt   map(   Rp   R­   R®   (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyRq   ·  s    	c         C   s   |  j  | |  j k S(   N(   R®   R­   (   Rp   t   key(    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   __contains__À  s    c         C   s
   | |  k S(   N(    (   Rp   R¯   (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   has_keyÃ  s    c         C   s   |  j  |  j | S(   N(   R­   R®   (   Rp   R¯   (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   __getitem__Æ  s    c         C   s   |  j  j ƒ  S(   N(   R­   t   keys(   Rp   (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyR³   É  s    (   Rx   Ry   Rz   Rq   R°   R±   R²   R³   (    (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyR¬   ¯  s   					R„   c           B   sG   e  Z d  Z d d d d d e d „ Z e j d „ Z e Z	 d „  Z
 RS(   s5  Clones and modifies clauses based on column correspondence.

    E.g.::

      table1 = Table('sometable', metadata,
          Column('col1', Integer),
          Column('col2', Integer)
          )
      table2 = Table('someothertable', metadata,
          Column('col1', Integer),
          Column('col2', Integer)
          )

      condition = table1.c.col1 == table2.c.col1

    make an alias of table1::

      s = table1.alias('foo')

    calling ``ClauseAdapter(s).traverse(condition)`` converts
    condition to read::

      s.c.col1 == table2.c.col1

    c            s£   i | g d 6|  _  | |  _ ˆ rD | s/ t ‚ ‡ f d †  |  _ n	 | |  _ ˆ  ru | s` t ‚ ‡  f d †  |  _ n	 | |  _ t j | p i  ƒ |  _ | |  _ d  S(   NRˆ   c            s
   |  ˆ  k S(   N(    (   R2   (   t   include(    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyR@   ð  s    c            s
   |  ˆ  k S(   N(    (   R2   (   t   exclude(    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyR@   õ  s    (	   t   __traverse_options__t
   selectablet   AssertionErrort
   include_fnt
   exclude_fnR   t   column_dictt   equivalentst   adapt_on_names(   Rp   R·   R¼   R´   Rµ   R¹   Rº   R½   (    (   Rµ   R´   sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyRq   è  s    			c      
   C   sÅ   |  j  j | d | ƒ} | d  k r‘ | |  j k r‘ | | k r‘ xO |  j | D]= } |  j | d | d | j | g ƒ ƒ} | d  k	 rM | SqM Wn  |  j rÁ | d  k rÁ |  j  j j | j	 ƒ } n  | S(   Nt   require_embeddedt   _seen(
   R·   t   corresponding_columnR   R¼   t   _corresponding_columnt   unionR½   RW   t   getR”   (   Rp   Rœ   R¾   R¿   t   newcolt   equiv(    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyRÁ   û  s    		'c         C   s’   |  j  r2 t | t ƒ r2 |  j j | ƒ r2 |  j St | t ƒ sE d  S|  j rb |  j | ƒ rb d  S|  j r~ |  j | ƒ r~ d  S|  j	 | t
 ƒ Sd  S(   N(   t
   magic_flagR%   R   R·   R   R
   R   R¹   Rº   RÁ   RZ   (   Rp   Rœ   (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyRj     s    N(   Rx   Ry   Rz   R   RG   Rq   R   t	   EMPTY_SETRÁ   RÆ   Rj   (    (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyR„   Í  s   t   ColumnAdapterc           B   sn   e  Z d  Z d d d d e d „ Z d „  Z e j Z	 e j
 Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(	   sñ   Extends ClauseAdapter with extra utility functions.

    Provides the ability to "wrap" this ClauseAdapter
    around another, a columns dictionary which returns
    adapted elements given an original, and an
    adapted_row() factory.

    c         C   sQ   t  j |  | | | | ƒ | r/ |  j | ƒ n  t j |  j ƒ |  _ | |  _ d  S(   N(   R„   Rq   R   R   t   populate_column_dictt   _locate_colR–   t   adapt_required(   Rp   R·   R¼   t   chain_toR´   Rµ   RË   (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyRq   %  s    
c         C   s‘   |  j  j |  j  ƒ } |  j j ƒ  | _ | j | j | j ƒ | _ | j | j | j ƒ | _ | j | j | j ƒ | _ t j	 | j ƒ | _
 | S(   N(   t	   __class__t   __new__t   __dict__t   copyt   _wrapRÊ   t   adapt_clauset
   adapt_listR   RÉ   R–   (   Rp   R‰   t   ac(    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   wrap/  s    c            s   ‡  ‡ f d †  } | S(   Nc            s   ˆ |  ƒ }  ˆ  |  ƒ S(   N(    (   Rœ   (   t   wrappedt   local(    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   locate<  s    (    (   Rp   R×   RÖ   RØ   (    (   RÖ   R×   sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyRÑ   ;  s    c         C   sn   |  j  | t ƒ } | d  k rQ |  j | ƒ } t | t ƒ rQ | j d  ƒ } qQ n  |  j rj | | k rj d  S| S(   N(   RÁ   RZ   R   RÒ   R%   R   t   labelRË   (   Rp   Rœ   RW   (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyRÊ   A  s    c         C   s   t  | |  j ƒ S(   N(   R¬   R–   (   Rp   R­   (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   adapted_rowT  s    c         C   s   |  j  j ƒ  } | d =| S(   NR–   (   RÏ   RÐ   (   Rp   t   d(    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   __getstate__W  s    c         C   s)   |  j  j | ƒ t j |  j ƒ |  _ d  S(   N(   RÏ   RA   R   t   PopulateDictRÊ   R–   (   Rp   t   state(    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   __setstate__\  s    N(   Rx   Ry   Rz   R   RG   Rq   RÕ   R„   RF   RÒ   t   copy_and_processRÓ   RÑ   RÊ   RÚ   RÜ   Rß   (    (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyRÈ     s   								N(<   Rz   t    R    R   t   baseR   R   R   R   t	   itertoolsR   t   collectionsR   t   elementsR   R	   R
   R   R   R   R   R·   R   R   R   R   t   schemaR   t   langhelperst   public_factoryt   _join_conditiont   join_conditiont
   annotationR   R   R   R   t   ddlR   R#   R7   RG   RO   RX   R\   RY   Ra   Rg   Rl   t   objectRm   Rƒ   R   RŒ   RŸ   R«   R¬   t   ReplacingCloningVisitorR„   RÈ   (    (    (    sY   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/sql/util.pyt   <module>
   sD   4"				<				
				H1N