
    h.                        S SK Jr  S SKJr  S SKJr  S SKJrJrJ	r	  S SK
Jr  S SKJr   " S S\	5      r " S	 S
\5      r\R                    " S S\5      5       r\R                    " S S\5      5       r\R                    " S S\5      5       r\R                    " S S\5      5       r\R                    " S S\5      5       r\R                    " S S\5      5       r\R                    " S S\5      5       r\R                    " S S\5      5       r\R                    " S S\5      5       r\R                   " \S5        \R                    " S S\5      5       r\R                    " S  S!\5      5       r\R                    " S" S#\5      5       r\R                    " S$ S%\5      5       r\R                    " S& S'\5      5       r\R                    " S( S)\5      5       r\R                    " S* S+\5      5       r \R                    " S, S-\5      5       r!\R                    " S. S/\5      5       r"\R                    " S0 S1\5      5       r#\R                    " S2 S3\5      5       r$\R                    " S4 S5\5      5       r%\R                    " S6 S7\5      5       r&\R                    " S8 S9\5      5       r'\R                    " S: S;\5      5       r( " S< S=\5      r)\R                    " S> S?\)5      5       r* " S@ SA\)5      r+\R                    " SB SC\+5      5       r,\R                    " SD SE\+5      5       r-\R                    " SF SG\+5      5       r.\R                    " SH SI\+5      5       r/gJ)K    )BaseSpatialField)Distance)NotSupportedError)
ExpressionLookup	Transform)Query)_lazy_re_compilec                       \ rS rSrS rSrg)RasterBandTransform	   c                 8    UR                  U R                  5      $ N)compilelhs)selfcompiler
connections      V/var/www/html/env/lib/python3.13/site-packages/django/contrib/gis/db/models/lookups.pyas_sqlRasterBandTransform.as_sql
   s    ))     N__name__
__module____qualname____firstlineno__r   __static_attributes__r   r   r   r   r   	   s    *r   r   c                   j   ^  \ rS rSrSrSrSrSrSrU 4S jr	S r
SS jrS rU 4S jrS	 rS
 rSrU =r$ )	GISLookup   NFc                    > [        U[        [        45      (       a  UOU/to l        [        TU ]  X5        0 U l        U R                  5         g r   )
isinstancelisttuple
rhs_paramssuper__init__template_paramsprocess_rhs_params)r   r   rhs	__class__s      r   r)   GISLookup.__init__   sB    '1#e}'E'EC5o"!!r   c                 `   U R                   (       an  [        U R                   5      U R                  S:X  a  SOS:X  a  U R                  5         g [        U R                   5      S:  a  [	        SU R                  -  5      eg [        U R                  [        5      (       a  U R                  SS9  g g )Nrelate      zTuple too long for lookup %s.T)only_lhs)r'   lenlookup_nameprocess_band_indices
ValueErrorr$   r   r   r   s    r   r+   GISLookup.process_rhs_params   s    ??4??#T-=-=-IqQ))+T__%) !@4CSCS!STT *"566%%t%4 7r   c                    U(       a&  SU l         U R                  R                  S-   U l        g[	        U R                  [
        5      (       a  U R                  R                  S-   U l        OSU l        U R                  tU l         U l        g)zg
Extract the lhs band index from the band transform class and the rhs
band index from the input tuple.
r2   N)band_rhsr   
band_indexband_lhsr$   r   r'   )r   r3   s     r   r6   GISLookup.process_band_indices%   sh     DM HH//!3DMdhh 344 HH//!3DMDM*.//'r   c                 >    SUR                   R                  U5      /4$ )N%s)opsAdapter)r   valuer   s      r   get_db_prep_lookupGISLookup.get_db_prep_lookup8   s    z~~--e4566r   c                   > [        U R                  [        5      (       a  [        TU ]  X5      $ [        U R                  [
        5      (       a*  U R                  R                  UR                  5      U l        [        TU ]  X5      u  p4UR                  R                  U R                  R                  U R                  U5      nXS-  U4$ r   )r$   r,   r	   r(   process_rhsr   resolve_expressionqueryrA   get_geom_placeholderr   output_field)r   r   r   r,   r'   placeholderr-   s         r   rG   GISLookup.process_rhs<   s    dhh&&7&x<<dhh
++xx228>>BDH'-hC nn99HH!!488X
  *,,r   c                 H    UR                   R                  U R                     $ r   )rA   gis_operatorsr5   )r   r   r,   s      r   
get_rhs_opGISLookup.get_rhs_opH   s     ~~++D,<,<==r   c                     U R                  X5      u  p4U R                  X5      u  pV/ UQUQ7nUUSS.U R                  EnU R                  X%5      n	U	R	                  X X5      $ )Nr@   )r   r,   rC   )process_lhsrG   r*   rP   r   )
r   r   r   lhs_sql
lhs_paramsrhs_sqlr'   
sql_paramsr*   rhs_ops
             r   r   GISLookup.as_sqlN   sz    "..xD"..xD/z/J/
 
 ""	
 5}}ZKKr   )r=   r;   r,   r'   r*   )F)r   r   r   r   sql_templatetransform_funcdistancer;   r=   r)   r+   r6   rD   rG   rP   r   r   __classcell__r-   s   @r   r!   r!      sF    LNHHH"5:&7
->L Lr   r!   c                       \ rS rSrSrSrSrg)OverlapsLeftLookupb   zm
The overlaps_left operator returns true if A's bounding box overlaps or is to the
left of B's bounding box.
overlaps_leftr   Nr   r   r   r   __doc__r5   r   r   r   r   r`   r`   b   s    
 "Kr   r`   c                       \ rS rSrSrSrSrg)OverlapsRightLookupl   zq
The 'overlaps_right' operator returns true if A's bounding box overlaps or is to the
right of B's bounding box.
overlaps_rightr   Nrc   r   r   r   rf   rf   l       
 #Kr   rf   c                       \ rS rSrSrSrSrg)OverlapsBelowLookupv   zg
The 'overlaps_below' operator returns true if A's bounding box overlaps or is below
B's bounding box.
overlaps_belowr   Nrc   r   r   r   rk   rk   v   ri   r   rk   c                       \ rS rSrSrSrSrg)OverlapsAboveLookup   zg
The 'overlaps_above' operator returns true if A's bounding box overlaps or is above
B's bounding box.
overlaps_abover   Nrc   r   r   r   ro   ro      ri   r   ro   c                       \ rS rSrSrSrSrg)
LeftLookup   zc
The 'left' operator returns true if A's bounding box is strictly to the left
of B's bounding box.
leftr   Nrc   r   r   r   rs   rs      s    
 Kr   rs   c                       \ rS rSrSrSrSrg)RightLookup   ze
The 'right' operator returns true if A's bounding box is strictly to the right
of B's bounding box.
rightr   Nrc   r   r   r   rw   rw      s    
 Kr   rw   c                       \ rS rSrSrSrSrg)StrictlyBelowLookup   zd
The 'strictly_below' operator returns true if A's bounding box is strictly below B's
bounding box.
strictly_belowr   Nrc   r   r   r   r{   r{      ri   r   r{   c                       \ rS rSrSrSrSrg)StrictlyAboveLookup   zd
The 'strictly_above' operator returns true if A's bounding box is strictly above B's
bounding box.
strictly_abover   Nrc   r   r   r   r   r      ri   r   r   c                       \ rS rSrSrSrSrg)SameAsLookup   z
The "~=" operator is the "same as" operator. It tests actual geometric
equality of two features. So if A and B are the same feature,
vertex-by-vertex, the operator returns true.
same_asr   Nrc   r   r   r   r   r      s     Kr   r   exactc                       \ rS rSrSrSrSrg)BBContainsLookup   ze
The 'bbcontains' operator returns true if A's bounding box completely contains
by B's bounding box.

bbcontainsr   Nrc   r   r   r   r   r          
 Kr   r   c                       \ rS rSrSrSrSrg)BBOverlapsLookup   zW
The 'bboverlaps' operator returns true if A's bounding box overlaps B's
bounding box.

bboverlapsr   Nrc   r   r   r   r   r      r   r   r   c                       \ rS rSrSrSrSrg)ContainedLookup   zh
The 'contained' operator returns true if A's bounding box is completely contained
by B's bounding box.
	containedr   Nrc   r   r   r   r   r      s    
 Kr   r   c                       \ rS rSrSrSrg)ContainsLookup   containsr   Nr   r   r   r   r5   r   r   r   r   r   r          Kr   r   c                       \ rS rSrSrSrg)ContainsProperlyLookup   contains_properlyr   Nr   r   r   r   r   r      s    %Kr   r   c                       \ rS rSrSrSrg)CoveredByLookup   	coveredbyr   Nr   r   r   r   r   r      s    Kr   r   c                       \ rS rSrSrSrg)CoversLookup   coversr   Nr   r   r   r   r   r          Kr   r   c                       \ rS rSrSrSrg)CrossesLookup   crossesr   Nr   r   r   r   r   r          Kr   r   c                       \ rS rSrSrSrg)DisjointLookup   disjointr   Nr   r   r   r   r   r      r   r   r   c                       \ rS rSrSrSrg)EqualsLookupi  equalsr   Nr   r   r   r   r   r     r   r   r   c                       \ rS rSrSrSrg)IntersectsLookupi  
intersectsr   Nr   r   r   r   r   r     s    Kr   r   c                       \ rS rSrSrSrg)OverlapsLookupi  overlapsr   Nr   r   r   r   r   r     r   r   r   c                   @   ^  \ rS rSrSrSr\" S5      rU 4S jrSr	U =r
$ )RelateLookupi  r0   z%(func)s(%(lhs)s, %(rhs)s, %%s)z^[012TF*]{9}$c                 d  > U R                   S   nUR                  R                  U R                     n[	        US5      (       a  UR                  U5        OC[        U[        5      (       a   U R                  R                  U5      (       d  [        SU-  5      e[        TU ]1  X5      u  pVXVU/-   4$ )Nr   check_relate_argumentz)Invalid intersection matrix pattern "%s".)r'   rA   rO   r5   hasattrr   r$   strpattern_regexmatchr7   r(   rG   )r   r   r   pattern
backend_opsqlparamsr-   s          r   rG   RelateLookup.process_rhs  s    //!$^^11$2B2BC
:677,,W5GS))1C1C1I1I'1R1RH7RSSg)(?gY&&&r   r   )r   r   r   r   r5   rZ   r
   r   rG   r   r]   r^   s   @r   r   r     s"    K4L$%56M	' 	'r   r   c                       \ rS rSrSrSrg)TouchesLookupi"  touchesr   Nr   r   r   r   r   r   "  r   r   r   c                       \ rS rSrSrSrg)WithinLookupi'  withinr   Nr   r   r   r   r   r   '  r   r   r   c                   (    \ rS rSrSrSrS rS rSrg)DistanceLookupBasei,  Tz+%(func)s(%(lhs)s, %(rhs)s) %(op)s %(value)sc                 b   S[        U R                  5      s=::  a  S::  d  O  [        SU R                  -  5      e[        U R                  5      S:X  a  U R                  S   S:w  a  [        S5      e[        U R                  5      S:  a%  U R                  S   S:w  a  U R	                  5         g g g )Nr2      z22, 3, or 4-element tuple required for '%s' lookup.r1   spheroidzHFor 4-element tuples the last argument must be the 'spheroid' directive.)r4   r'   r7   r5   r6   r8   s    r   r+   %DistanceLookupBase.process_rhs_params0  s    C(-A-DtGWGWW  !Q&4??1+=+K  t!#(:j(H%%' )I#r   c                 $   U R                   S   n[        US5      (       a*  UR                  UR                  UR                  5      5      $ SUR
                  R                  U R                  R                  U R                   U R                  5      4$ )Nr   rH   r@   )
r'   r   r   rH   rI   rA   get_distancer   rK   r5   )r   r   r   
dist_params       r   process_distance#DistanceLookupBase.process_distance?  s    __Q'
 z#788 Z::8>>JK		
 ++HH))4??D<L<L		
r   r   N)	r   r   r   r   r\   rZ   r+   r   r   r   r   r   r   r   ,  s    H@L(
r   r   c                   <   ^  \ rS rSrSrSrU 4S jrU 4S jrSrU =r	$ )DWithinLookupiM  dwithinz%%(func)s(%(lhs)s, %(rhs)s, %(value)s)c                    > U R                   S   nUR                  R                  (       d1  [        US5      (       a   [	        U[
        5      (       d  [        S5      e[        TU ]!  X5      $ )Nr   rH   zXThis backend does not support expressions for specifying distance in the dwithin lookup.)	r'   featuressupports_dwithin_distance_exprr   r$   r   r   r(   r   )r   r   r   r   r-   s       r   r   DWithinLookup.process_distanceR  s_    __Q'
##BB
$899z844#2  w'==r   c                 t   > U R                  X5      u  p4X0R                  S'   [        TU ]  X5      u  pVXVU-   4$ )NrC   )r   r*   r(   rG   )r   r   r   dist_sqldist_paramsrV   r   r-   s          r   rG   DWithinLookup.process_rhs_  sC     $ 5 5h K(0W%'-hC,,,r   r   )
r   r   r   r   r5   rZ   r   rG   r   r]   r^   s   @r   r   r   M  s    K:L>- -r   r   c                       \ rS rSrS rSrg)DistanceLookupFromFunctionif  c                 ~   [        U R                  5      S:H  =(       a    U R                  S   S:H  =(       d    S nUR                  R                  U R                  U R
                  US9nUR                  UR                  UR                  5      5      u  pVU R                  X5      u  pxSXPR                  US.-  Xh-   4$ )Nr1   r   )r   z%(func)s %(op)s %(dist)s)funcopdist)r4   r'   rA   distance_expr_for_lookupr   r,   r   rH   rI   r   r   )	r   r   r   r   distance_exprr   r   r   r   s	            r   r   !DistanceLookupFromFunction.as_sqlg  s     A%K$//"*=*K 	 #??HHdhh @ 
 &&}'G'G'WX $ 5 5h K&#WWh)WW 
 	
r   r   Nr   r   r   r   r   r   f  s    
r   r   c                       \ rS rSrSrSrSrg)DistanceGTLookupiv  distance_gt>r   Nr   r   r   r   r5   r   r   r   r   r   r   r   v      K	Br   r   c                       \ rS rSrSrSrSrg)DistanceGTELookupi|  distance_gtez>=r   Nr   r   r   r   r   r   |       K	Br   r   c                       \ rS rSrSrSrSrg)DistanceLTLookupi  distance_lt<r   Nr   r   r   r   r   r     r   r   r   c                       \ rS rSrSrSrSrg)DistanceLTELookupi  distance_ltez<=r   Nr   r   r   r   r   r     r   r   r   N)0#django.contrib.gis.db.models.fieldsr   django.contrib.gis.measurer   	django.dbr   django.db.modelsr   r   r   django.db.models.sql.queryr	   django.utils.regex_helperr
   r   r!   register_lookupr`   rf   rk   ro   rs   rw   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r     s%   @ / ' : : , 6*) *
LL LLh !!" " "" !!#) # "# !!#) # "# !!#) # "# !!  " !!)  " !!#) # "# !!#) # "# !!9  "     w 7 !!y  " !!y  " !!i  " !!Y  " !!&Y & "& !!i  " !!9  " !!I  " !!Y  " !!9  " !!y  " !!Y  " !!'9 ' "'" !!I  " !!9  "
 
B !!-& - "-0
!3 
  !!1  "
 !!2  "
 !!1  "
 !!2  "r   