
    pXHhC                    T   d dl mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d	d
l
mZ d	dlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ er*ddlmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z# ddlm$Z$ ddlm%Z%  e	de      Z& G d d ej>                  e&         Z' G d! d"e      Z(d# Z) G d$ d%ejT                  e&         Z+ G d& d'e+      Z, G d( d)e+      Z- G d* d+e+      Z. G d, d-e+      Z/ G d. d/e+      Z0 G d0 d1e+      Z1y2)3    )annotations)Any)Iterable)List)Optional)overload)TYPE_CHECKING)TypeVar   )types)ARRAY   )	coercions)elements)
expression)	functions)roles)schema)ColumnCollectionConstraint)TEXT)InternalTraversal)_ColumnExpressionArgument)ClauseElement)ColumnElement)OperatorType)
FromClause)_CloneCallableType)_TraverseInternalsType_T)boundc                     e Zd ZU dZd ZdZdej                  fdej                  fdej                  fgZ	de
d<   e	 	 	 	 dd       Ze	 	 	 	 dd	       Z	 	 	 	 dd
Z	 d	 	 	 ddZddZej                   f	 	 	 	 	 ddZedd       Zy)aggregate_order_bya  Represent a PostgreSQL aggregate order by expression.

    E.g.::

        from sqlalchemy.dialects.postgresql import aggregate_order_by

        expr = func.array_agg(aggregate_order_by(table.c.a, table.c.b.desc()))
        stmt = select(expr)

    would represent the expression:

    .. sourcecode:: sql

        SELECT array_agg(a ORDER BY b DESC) FROM table;

    Similarly::

        expr = func.string_agg(
            table.c.a, aggregate_order_by(literal_column("','"), table.c.a)
        )
        stmt = select(expr)

    Would represent:

    .. sourcecode:: sql

        SELECT string_agg(a, ',' ORDER BY a) FROM table;

    .. versionchanged:: 1.2.13 - the ORDER BY argument may be multiple terms

    .. seealso::

        :class:`_functions.array_agg`

    
postgresqltargettypeorder_byr   _traverse_internalsc                     y N selfr$   r&   s      [/var/www/html/planif/env/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/ext.py__init__zaggregate_order_by.__init__X       
     c                     y r)   r*   r+   s      r-   r.   zaggregate_order_by.__init___   r/   r0   c                z   t        j                  t        j                  |      | _        | j                  j
                  | _        t        |      }|  |dk(  rt        d      |dk(  r-t        j                  t        j                  |d         | _        y t        j                  |dt        j                  i| _        y )Nr   z)at least one ORDER BY element is requiredr   _literal_as_text_role)r   expectr   ExpressionElementRoler$   r%   len	TypeErrorr&   r   
ClauseList)r,   r$   r&   _lobs       r-   r.   zaggregate_order_by.__init__f   s    
 &/%5%5''&
 KK$$	8}19GHHQY%,,++Xa[DM %//161L1LDMr0   Nc                    | S r)   r*   )r,   againsts     r-   
self_groupzaggregate_order_by.self_group}   s	     r0   c                2    | j                   | j                  fS r)   r$   r&   )r,   kwargss     r-   get_childrenzaggregate_order_by.get_children   s    {{DMM))r0   c                d     || j                   fi || _          || j                  fi || _        y r)   r>   )r,   clonekws      r-   _copy_internalsz"aggregate_order_by._copy_internals   s.     DKK.2.dmm2r2r0   c                \    | j                   j                  | j                  j                  z   S r)   )r$   _from_objectsr&   )r,   s    r-   rF   z aggregate_order_by._from_objects   s!    {{((4==+F+FFFr0   )r$   zColumnElement[_T]r&   _ColumnExpressionArgument[Any])r$   z_ColumnExpressionArgument[_T]r&   rG   r)   )r;   zOptional[OperatorType]returnr   )r?   r   rH   zIterable[ClauseElement])rB   r   rC   r   rH   None)rH   zList[FromClause])__name__
__module____qualname____doc____visit_name__stringify_dialectr   dp_clauseelementdp_typer'   __annotations__r   r.   r<   r@   r   _clonerD   propertyrF   r*   r0   r-   r"   r"   *   s   "H *N$	$556	"**+	&7783/  ! 2  - 2 - 20 15-	
* +3//3'3AD3	3 G Gr0   r"   c                  n     e Zd ZdZdZdZdZdZ ej                  ddd      d	        Z
 fd
ZddZ xZS )ExcludeConstraintzA table-level EXCLUDE constraint.

    Defines an EXCLUDE constraint as described in the `PostgreSQL
    documentation`__.

    __ https://www.postgresql.org/docs/current/static/sql-createtable.html#SQL-CREATETABLE-EXCLUDE

    exclude_constraintNFr#   wherez:class:`.ExcludeConstraint`z$:paramref:`.ExcludeConstraint.where`c                   g }g }i | _         t        | \  }}t        t        j                  t        j
                  |      |      D ]R  \  \  }}}	}
}|
|j                  |
       ||j                  n|	}||| j                   |<   |j                  |||f       T || _        t        j                  | g||j                  d      |j                  d      |j                  d      d |j                  dd      | _        |j                  d      }|)t        j                  t        j                  |      | _        |j                  d	i       | _        y)
a  
        Create an :class:`.ExcludeConstraint` object.

        E.g.::

            const = ExcludeConstraint(
                (Column("period"), "&&"),
                (Column("group"), "="),
                where=(Column("group") != "some group"),
                ops={"group": "my_operator_class"},
            )

        The constraint is normally embedded into the :class:`_schema.Table`
        construct
        directly, or added later using :meth:`.append_constraint`::

            some_table = Table(
                "some_table",
                metadata,
                Column("id", Integer, primary_key=True),
                Column("period", TSRANGE()),
                Column("group", String),
            )

            some_table.append_constraint(
                ExcludeConstraint(
                    (some_table.c.period, "&&"),
                    (some_table.c.group, "="),
                    where=some_table.c.group != "some group",
                    name="some_table_excl_const",
                    ops={"group": "my_operator_class"},
                )
            )

        The exclude constraint defined in this example requires the
        ``btree_gist`` extension, that can be created using the
        command ``CREATE EXTENSION btree_gist;``.

        :param \*elements:

          A sequence of two tuples of the form ``(column, operator)`` where
          "column" is either a :class:`_schema.Column` object, or a SQL
          expression element (e.g. ``func.int8range(table.from, table.to)``)
          or the name of a column as string, and "operator" is a string
          containing the operator to use (e.g. `"&&"` or `"="`).

          In order to specify a column name when a :class:`_schema.Column`
          object is not available, while ensuring
          that any necessary quoting rules take effect, an ad-hoc
          :class:`_schema.Column` or :func:`_expression.column`
          object should be used.
          The ``column`` may also be a string SQL expression when
          passed as :func:`_expression.literal_column` or
          :func:`_expression.text`

        :param name:
          Optional, the in-database name of this constraint.

        :param deferrable:
          Optional bool.  If set, emit DEFERRABLE or NOT DEFERRABLE when
          issuing DDL for this constraint.

        :param initially:
          Optional string.  If set, emit INITIALLY <value> when issuing DDL
          for this constraint.

        :param using:
          Optional string.  If set, emit USING <index_method> when issuing DDL
          for this constraint. Defaults to 'gist'.

        :param where:
          Optional SQL expression construct or literal SQL string.
          If set, emit WHERE <predicate> when issuing DDL
          for this constraint.

        :param ops:
          Optional dictionary.  Used to define operator classes for the
          elements; works the same way as that of the
          :ref:`postgresql_ops <postgresql_operator_classes>`
          parameter specified to the :class:`_schema.Index` construct.

          .. versionadded:: 1.3.21

          .. seealso::

            :ref:`postgresql_operator_classes` - general description of how
            PostgreSQL operator classes are specified.

        Nname
deferrable	initially)rZ   r[   r\   usinggistrX   ops)	operatorszipr    expect_col_expression_collectionr   DDLConstraintColumnRoleappendrZ   _render_exprsr   r.   getr]   r4   StatementOptionRolerX   r_   )r,   r   rC   columnsrender_exprsexpressionsr`   exprcolumnstrnameadd_elementoperatorrZ   rX   s                 r-   r.   zExcludeConstraint.__init__   sQ   ~ !$hY>A66--{ 	?
 	8:0T67K( &{+"("46;;'D'/t$tX 67	8" *"++	
	
 vvl+ff[)	
 VVGV,
w"))%*C*CUKDJ66%$r0   c           	         t         |   |       | j                  D cg c]*  \  }}}t        |t              s|n|j
                  |   ||f, c}}}| _        y c c}}}w r)   )super_set_parentre   
isinstancestrc)r,   tablerC   rk   rZ   ro   	__class__s         r-   rr   zExcludeConstraint._set_parent'  sc    E" *.););
 
 %dH	 'tS1uwwt}
 
s   /Ac           
     r   | j                   D cg c])  \  }}}t        j                  || j                  |      |f+ }}}} | j                  || j
                  | j                  | j                  | j                  | j                  d}|j                  j                  | j                         |S c c}}}w )N)rZ   r[   r\   rX   r]   )re   r   _copy_expressionparentrw   rZ   r[   r\   rX   r]   dispatch_update)r,   target_tablerC   rk   _ro   r   ru   s           r-   _copyzExcludeConstraint._copy3  s     &*%7%7
 

 "a ''dkk<H
 
 DNNnn****
 	


4==)!
s   .B2r)   )rJ   rK   rL   rM   rN   rX   inherit_cachecreate_drop_stringify_dialectr   _document_text_coercionr.   rr   r   __classcell__rw   s   @r-   rV   rV      sT     *NEM$0!%X%%%.
%
%B

r0   rV   c                 R    t         |d<   t        j                  j                  | i |S )zPostgreSQL-specific form of :class:`_functions.array_agg`, ensures
    return type is :class:`_postgresql.ARRAY` and not
    the plain :class:`_types.ARRAY`, unless an explicit ``type_``
    is passed.

    _default_array_type)r   r   func	array_agg)argrC   s     r-   r   r   G  s)     !&B>>##S/B//r0   c                  "     e Zd ZdZ fdZ xZS )_regconfig_fnTc                   t        |      }t        |      dkD  rTt        j                  t        j
                  |j                  d      t        | dd       | t        j                        }|g}ng }|D cg c]4  }t        j                  t        j
                  |t        | dd       |       6 }}t        | ,  ||z   i | y c c}w )Nr   r   rZ   )rZ   apply_propagate_attrstype_rZ   r   )listr6   r   r4   r   r5   popgetattrr   	REGCONFIGrq   r.   )r,   argsr?   initial_argru   
addtl_argsrw   s         r-   r.   z_regconfig_fn.__init__U  s    Dzt9q=#**++T640&*ooK '-KK 
  ++T640&*	

 
 	;3??
s   59C)rJ   rK   rL   r   r.   r   r   s   @r-   r   r   R  s    M@ @r0   r   c                  ,    e Zd ZdZdZej                  Zy)to_tsvectora  The PostgreSQL ``to_tsvector`` SQL function.

    This function applies automatic casting of the REGCONFIG argument
    to use the :class:`_postgresql.REGCONFIG` datatype automatically,
    and applies a return type of :class:`_postgresql.TSVECTOR`.

    Assuming the PostgreSQL dialect has been imported, either by invoking
    ``from sqlalchemy.dialects import postgresql``, or by creating a PostgreSQL
    engine using ``create_engine("postgresql...")``,
    :class:`_postgresql.to_tsvector` will be used automatically when invoking
    ``sqlalchemy.func.to_tsvector()``, ensuring the correct argument and return
    type handlers are used at compile and execution time.

    .. versionadded:: 2.0.0rc1

    TN)rJ   rK   rL   rM   r   r   TSVECTORr%   r*   r0   r-   r   r   o  s    " M>>Dr0   r   c                  ,    e Zd ZdZdZej                  Zy)
to_tsquerya  The PostgreSQL ``to_tsquery`` SQL function.

    This function applies automatic casting of the REGCONFIG argument
    to use the :class:`_postgresql.REGCONFIG` datatype automatically,
    and applies a return type of :class:`_postgresql.TSQUERY`.

    Assuming the PostgreSQL dialect has been imported, either by invoking
    ``from sqlalchemy.dialects import postgresql``, or by creating a PostgreSQL
    engine using ``create_engine("postgresql...")``,
    :class:`_postgresql.to_tsquery` will be used automatically when invoking
    ``sqlalchemy.func.to_tsquery()``, ensuring the correct argument and return
    type handlers are used at compile and execution time.

    .. versionadded:: 2.0.0rc1

    TNrJ   rK   rL   rM   r   r   TSQUERYr%   r*   r0   r-   r   r         " M==Dr0   r   c                  ,    e Zd ZdZdZej                  Zy)plainto_tsquerya  The PostgreSQL ``plainto_tsquery`` SQL function.

    This function applies automatic casting of the REGCONFIG argument
    to use the :class:`_postgresql.REGCONFIG` datatype automatically,
    and applies a return type of :class:`_postgresql.TSQUERY`.

    Assuming the PostgreSQL dialect has been imported, either by invoking
    ``from sqlalchemy.dialects import postgresql``, or by creating a PostgreSQL
    engine using ``create_engine("postgresql...")``,
    :class:`_postgresql.plainto_tsquery` will be used automatically when
    invoking ``sqlalchemy.func.plainto_tsquery()``, ensuring the correct
    argument and return type handlers are used at compile and execution time.

    .. versionadded:: 2.0.0rc1

    TNr   r*   r0   r-   r   r     r   r0   r   c                  ,    e Zd ZdZdZej                  Zy)phraseto_tsquerya  The PostgreSQL ``phraseto_tsquery`` SQL function.

    This function applies automatic casting of the REGCONFIG argument
    to use the :class:`_postgresql.REGCONFIG` datatype automatically,
    and applies a return type of :class:`_postgresql.TSQUERY`.

    Assuming the PostgreSQL dialect has been imported, either by invoking
    ``from sqlalchemy.dialects import postgresql``, or by creating a PostgreSQL
    engine using ``create_engine("postgresql...")``,
    :class:`_postgresql.phraseto_tsquery` will be used automatically when
    invoking ``sqlalchemy.func.phraseto_tsquery()``, ensuring the correct
    argument and return type handlers are used at compile and execution time.

    .. versionadded:: 2.0.0rc1

    TNr   r*   r0   r-   r   r     r   r0   r   c                  ,    e Zd ZdZdZej                  Zy)websearch_to_tsquerya  The PostgreSQL ``websearch_to_tsquery`` SQL function.

    This function applies automatic casting of the REGCONFIG argument
    to use the :class:`_postgresql.REGCONFIG` datatype automatically,
    and applies a return type of :class:`_postgresql.TSQUERY`.

    Assuming the PostgreSQL dialect has been imported, either by invoking
    ``from sqlalchemy.dialects import postgresql``, or by creating a PostgreSQL
    engine using ``create_engine("postgresql...")``,
    :class:`_postgresql.websearch_to_tsquery` will be used automatically when
    invoking ``sqlalchemy.func.websearch_to_tsquery()``, ensuring the correct
    argument and return type handlers are used at compile and execution time.

    .. versionadded:: 2.0.0rc1

    TNr   r*   r0   r-   r   r     r   r0   r   c                  *     e Zd ZdZdZeZ fdZ xZS )ts_headlinea  The PostgreSQL ``ts_headline`` SQL function.

    This function applies automatic casting of the REGCONFIG argument
    to use the :class:`_postgresql.REGCONFIG` datatype automatically,
    and applies a return type of :class:`_types.TEXT`.

    Assuming the PostgreSQL dialect has been imported, either by invoking
    ``from sqlalchemy.dialects import postgresql``, or by creating a PostgreSQL
    engine using ``create_engine("postgresql...")``,
    :class:`_postgresql.ts_headline` will be used automatically when invoking
    ``sqlalchemy.func.ts_headline()``, ensuring the correct argument and return
    type handlers are used at compile and execution time.

    .. versionadded:: 2.0.0rc1

    Tc                0   t        |      }t        |      dk  rd}nKt        |d   t        j                        r,|d   j
                  j                  t        j                  u rd}nd}|rTt        j                  t        j                  |j                  d      | t        | dd       t        j                        }|g}ng }|D cg c]4  }t        j                  t        j                  |t        | dd       |       6 }}t!        | D  ||z   i | y c c}w )	N   Fr   Tr   rZ   )r   rZ   r   r   )r   r6   rs   r   r   r%   _type_affinityr   r   r   r4   r   r5   r   r   r   rq   r.   )r,   r   r?   has_regconfigr   ru   r   rw   s          r-   r.   zts_headline.__init__  s   Dz t9q=!MtAw 6 67Q++u}}< "M M#**++&*T640ooK '-KK 
  ++T640&*	

 
 	;3??
s   9D)	rJ   rK   rL   rM   r   r   r%   r.   r   r   s   @r-   r   r     s     " MD&@ &@r0   r   N)2
__future__r   typingr   r   r   r   r   r	   r
    r   arrayr   sqlr   r   r   r   r   r   
sql.schemar   sql.sqltypesr   sql.visitorsr   sql._typingr   sql.elementsr   r   sql.operatorsr   sql.selectabler   r   r   r   r"   rV   r   GenericFunctionr   r   r   r   r   r   r   r*   r0   r-   <module>r      s    #                 4   -8---,26TcG11"5 cGLt2 tn0@I--b1 @:- , ,m ,} ,= ,;@- ;@r0   