
    z<iID                    l   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 ddlmZ e	r0d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
de       Z( G d! d"ejB                  e(         Z) G d# d$e      Z*d% Z+ G d& d'ejX                  e(         Z- G d( d)e-      Z. G d* d+e-      Z/ G d, d-e-      Z0 G d. d/e-      Z1 G d0 d1e-      Z2 G d2 d3e-      Z3y4)5    )annotations)Any)Iterable)List)Optional)overload)Tuple)TYPE_CHECKING)TypeVar   )types)ARRAY   )	coercions)elements)
expression)	functions)roles)schema)ColumnCollectionConstraint)TEXT)InternalTraversal)_ColumnExpressionArgument)_DDLColumnArgument)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      g/home/www/utuvibe.miabetepe.com/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/ext.py__init__zaggregate_order_by.__init__Z       
     c                     y r+   r,   r-   s      r/   r0   zaggregate_order_by.__init__a   r1   r2   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/   r0   zaggregate_order_by.__init__h   s    
 &/%5%5''&
 KK$$	8}19GHHQY%,,++Xa[DM %//161L1LDMr2   Nc                    | S r+   r,   )r.   againsts     r/   
self_groupzaggregate_order_by.self_group   s	     r2   c                2    | j                   | j                  fS r+   r&   r(   )r.   kwargss     r/   get_childrenzaggregate_order_by.get_children   s    {{DMM))r2   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r2   c                \    | j                   j                  | j                  j                  z   S r+   )r&   _from_objectsr(   )r.   s    r/   rH   z aggregate_order_by._from_objects   s!    {{((4==+F+FFFr2   )r&   zColumnElement[_T]r(   _ColumnExpressionArgument[Any])r&   z_ColumnExpressionArgument[_T]r(   rI   r+   )r=   zOptional[OperatorType]returnr   )rA   r   rJ   zIterable[ClauseElement])rD   r   rE   r   rJ   None)rJ   zList[FromClause])__name__
__module____qualname____doc____visit_name__stringify_dialectr   dp_clauseelementdp_typer)   __annotations__r   r0   r>   rB   r   _clonerF   propertyrH   r,   r2   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r2   r$   c                  |     e Zd ZdZdZdZdZdZ ej                  d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)r\   r]   r^   usinggistrZ   ops)	operatorszipr    expect_col_expression_collectionr   DDLConstraintColumnRoleappendr\   _render_exprsr   r0   getr_   r6   StatementOptionRolerZ   ra   )r.   r   rE   columnsrender_exprsexpressionsrb   exprcolumnstrnameadd_elementoperatorr\   rZ   s                 r/   r0   zExcludeConstraint.__init__   sQ   B !$hY>A66--{ 	?
 	8:0T67K( &{+"("46;;'D'/t$tX 67	8" *"++	
	
 vvl+ff[)	
 VVGV,
w"))%*C*CUKDJ66%$r2   c           	         t         |   |       | j                  D cg c]*  \  }}}t        |t              s|n|j
                  |   ||f, c}}}| _        y c c}}}w r+   )super_set_parentrg   
isinstancestrc)r.   tablerE   rm   r\   rq   	__class__s         r/   rt   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)r\   r]   r^   rZ   r_   )rg   r   _copy_expressionparentry   r\   r]   r^   rZ   r_   dispatch_update)r.   target_tablerE   rm   _rq   r   rw   s           r/   _copyzExcludeConstraint._copy7  s     &*%7%7
 

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


4==)!
s   .B2)r   zTuple[_DDLColumnArgument, str]rE   r   rJ   rK   r+   )rL   rM   rN   rO   rP   rZ   inherit_cachecreate_drop_stringify_dialectr   _document_text_coercionr0   rt   r   __classcell__ry   s   @r/   rX   rX      so     *NEM$0!%X%%%.
A%7A%?BA%	A%
A%F

r2   rX   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)argrE   s     r/   r   r   K  s)     !&B>>##S/B//r2   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   r\   )r\   apply_propagate_attrstype_r\   r   )listr8   r   r6   r   r7   popgetattrr   	REGCONFIGrs   r0   )r.   argsrA   initial_argrw   
addtl_argsry   s         r/   r0   z_regconfig_fn.__init__Y  s    Dzt9q=#**++T640&*ooK '-KK 
  ++T640&*	

 
 	;3??
s   59C)rL   rM   rN   r   r0   r   r   s   @r/   r   r   V  s    M@ @r2   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)rL   rM   rN   rO   r   r   TSVECTORr'   r,   r2   r/   r   r   s  s    " M>>Dr2   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rL   rM   rN   rO   r   r   TSQUERYr'   r,   r2   r/   r   r         " M==Dr2   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,   r2   r/   r   r     r   r2   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,   r2   r/   r   r     r   r2   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,   r2   r/   r   r     r   r2   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   r\   )r   r\   r   r   )r   r8   ru   r   r   r'   _type_affinityr   r   r   r6   r   r7   r   r   r   rs   r0   )r.   r   rA   has_regconfigr   rw   r   ry   s          r/   r0   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)	rL   rM   rN   rO   r   r   r'   r0   r   r   s   @r/   r   r     s     " MD&@ &@r2   r   N)4
__future__r   typingr   r   r   r   r   r	   r
   r    r   arrayr   sqlr   r   r   r   r   r   
sql.schemar   sql.sqltypesr   sql.visitorsr   sql._typingr   r   sql.elementsr   r   sql.operatorsr   sql.selectabler   r   r    r!   r$   rX   r   GenericFunctionr   r   r   r   r   r   r   r,   r2   r/   <module>r      s    #                  4   -81---,26TcG11"5 cGLv2 vr0@I--b1 @:- , ,m ,} ,= ,;@- ;@r2   