
    +'&h/                         d 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 Zd Zd Zd Zd Zd Zd ZdS )z>This module defines specific functions for Postgresql dialect.    )Index)text)func)select)_check_spatial_type)_format_select_args)_spatial_idx_name)setup_create_drop)	Geography)Geometryc                 2    t          | j        dd          du S )z&Check if the column should be managed.
use_typmodNF)getattrtype)columns    `/var/www/html/reinick/venv/lib/python3.11/site-packages/geoalchemy2/admin/dialects/postgresql.pycheck_managementr      s    6;d33u<<    c                     |j         j        r
|j        di}ni }t          t	          |j        |j                  |d|d          }|                    |            dS )z)Create spatial index on the given column.gist_geometry_ops_ndgistT)postgresql_usingpostgresql_ops_column_flagbindN)r   use_N_D_indexnamer   r	   create)r   tablecolr   idxs        r   create_spatial_indexr#      sp    
x ($:;
%*ch//%  C JJDJr   c                 N   t          |                    d          t                    sdS |d         }|j        }|j        }|                    d          rd}n|d         dv rd}|j        d                    |j                  }nd	}d
                    |j        |d         |          }| j	        
                    t          |                                                    }||d         _        ||d         _        t          |          |d         _        d|d         _        dS )z:Reflect a column of type Geometry with Postgresql dialect.r   NZM   )ZM   z AND nspname = '{}' a  SELECT (indexrelid IS NOT NULL) AS has_index
        FROM (
            SELECT
                    n.nspname,
                    c.relname,
                    c.oid AS relid,
                    a.attname,
                    a.attnum
            FROM pg_attribute a
            INNER JOIN pg_class c ON (a.attrelid=c.oid)
            INNER JOIN pg_type t ON (a.atttypid=t.oid)
            INNER JOIN pg_namespace n ON (c.relnamespace=n.oid)
            WHERE t.typname='geometry'
                    AND c.relkind='r'
        ) g
        LEFT JOIN pg_index i ON (g.relid = i.indrelid AND g.attnum = ANY(i.indkey))
        WHERE relname = '{}' AND attname = '{}'{};
    r   T)
isinstancegetr   geometry_type	dimensionendswithschemaformatr   r   executer   scalarboolspatial_index_spatial_index_reflected)		inspectorr    column_infogeo_typer.   coord_dimensionschema_parthas_index_queryr6   s	            r   reflect_geometry_columnr>   %   s1   koof--x88 6"H*M(Od## 	r	j	(	( |+225<@@" 	
K'	 	# ( N**4+@+@AAHHJJM )6K%$3K!(,](;(;K% 48K000r   c                    t          | |t                    \  }}}g | j        d<   t          | j                  }|D ]}| j        d         D ]}t          |j        t          |          rt          |          r||j        	                                v rs| j        
                    |           |j        t          | j        |j                  k    st          |j        dd          s | j        d                             |           dS )z6Handle spatial indexes during the before_create event._after_create_indexes_saved_columnsr6   FN)r
   r   infosetindexesr   r   r   columnsvaluesremover   r	   r   append)	r    r   kwdialectgis_colsregular_colscurrent_indexesr"   r!   s	            r   before_createrN   V   s"   &7tEU&V&V#GX|
 +-EJ&'%-((O 	D 	D:./ 	D 	DC#CHh@@DEUVYEZEZD++----$$S)))80SXFFFFgHouO OF J67>>sCCC	D	D 	Dr   c                    |j         }| j                            d          | _        | j        D ]]t	          j        t          |          rt                    r͉j        j        }| j	        r| j	        gng }|
                    | j        j        j        j        j        j        |g           j        j        |                    j        j                   t!          t#          t%          j        |            }|                    d          }|                    |           t	          j        t          t,          f|          rAj        j        du r3fd| j        D             s t                    rt3          ||            _| j                            d          D ]2}| j                            |           |                    |           3dS )z5Handle spatial indexes during the after_create event.rA   NT
autocommitc                 J    g | ]}|j                                         v | S  )rE   rF   ).0ir!   s     r   
<listcomp>z after_create.<locals>.<listcomp>   s1    JJJ!qy7G7G7I7I0I0IA0I0I0Ir   r@   r   )rJ   rB   poprE   r   r   r   r   r/   r1   extendr   sridr.   r   rH   r   r   r   AddGeometryColumnexecution_optionsr3   r   r6   rD   r#   addr   )	r    r   rI   rJ   r/   argsstmtr"   r!   s	           @r   after_creater_   k   s    lGJNN#344EM} 7 7sx7;; 		@PQT@U@U 		*I%*\9EL>>rDKKSXsx}ch>TV_`aaax".CH/000.t/Et/LMMND))T)::DLL  8Y*?II	7&$.. KJJJu}JJJ 7O_P P 7 %T5#666z~~566  #


 r   c                 B   t          | |t                    \  }}}|D ]}| j        r| j        gng }|                    | j        |j        g           t          t          t          j        |            }|	                    d          }|
                    |           dS )z4Handle spatial indexes during the before_drop event.TrP   N)r
   r   r1   rX   r   r   r   r   DropGeometryColumnr[   r3   )	r    r   rI   rJ   rK   rL   r!   r]   r^   s	            r   before_droprb      s    &7tEU&V&V#GX|   !&5~~2UZ*+++*4+BD+IJJK%%%66T r   c                 R    | j                             dd          }|	|| _        dS dS )z3Handle spatial indexes during the after_drop event.rA   N)rB   rW   rE   )r    r   rI   
saved_colss       r   
after_dropre      s3      0$77J" r   N)__doc__
sqlalchemyr   r   sqlalchemy.sqlr   r   !geoalchemy2.admin.dialects.commonr   r   r	   r
   geoalchemy2.typesr   r   r   r#   r>   rN   r_   rb   re   rS   r   r   <module>rk      s7   D D                   ! ! ! ! ! ! A A A A A A A A A A A A ? ? ? ? ? ? ? ? ? ? ? ? ' ' ' ' ' ' & & & & & &= = =
   .8 .8 .8bD D D*! ! !H  # # # # #r   