
    1yi'                     *   d dl Z d dlmZ d dlmZmZ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 d dlmZmZ d dlmZmZmZ d d	lmZ d
ddddZdedefdZ edd      Zdee   de de dee   fdZ!dededededede"de de dee   fd Z# G d! d"      Z$y)#    N)
namedtuple)ListAnyOptionalUnion)_msgs)extract_args)commandKeyFloatCommandItem)SimpleErrorDatabase)distance
geo_encode
geo_decode)ZSetgMbP?gp\D?gD
)?
@   )kmmiftmunit_argreturnc                     t         j                  | j                         j                               }|t	        t
        j                        |S )zvnumber of meters in a unit.
    :param unit_arg: unit name (km, mi, ft, m)
    :returns: number of meters in unit
    )	UNIT_TO_Mgetdecodelowerr   msgsGEO_UNSUPPORTED_UNIT)r   units     e/var/www/html/content_weaver/venv/lib/python3.12/site-packages/fakeredis/commands_mixins/geo_mixin.pytranslate_meters_to_unitr$      s=    
 ==*0023D|$3344K    	GeoResultzname long lat hash distanceitems	withcoordwithdistc                 ~   g }| D ]  }|j                   g}|r/|j                  t        j                  |j                  d             |rO|j                  t        j                  |j
                  d      t        j                  |j                  d      g       t        |      dk(  r|d   }|j                  |        |S )zParse list of GeoResults to redis response
    :param withcoord: include coordinates in response
    :param withdist: include distance in response
    :returns: Parsed list
    Fr   r   )nameappendr   encoder   longlatlen)r'   r(   r)   resitemnew_items         r#   _parse_resultsr4      s     C II;OOELL>?OOU\\$))U;U\\$((TY=Z[\x=A{H

8 Jr%   zsetr/   r.   radiusconvcount	count_anydescc           
         g }| j                         D ]_  \  }	}
t        |
      \  }}}}t        ||f||f      |z  }||k  s/|j                  t	        |	|||
|             |sPt        |      |k\  s_ n t        |d |      }|r|d| }|S )a  Find items within area (lat,long)+radius
    :param zset: list of items to check
    :param lat: latitude
    :param long: longitude
    :param radius: radius in whatever units
    :param conv: conversion of radius to meters
    :param count: number of results to give
    :param count_any: should we return any results that match? (vs. sorted)
    :param desc: should results be sorted descending order?
    :returns: List of GeoResults
    c                     | j                   S N)r   )xs    r#   <lambda>z_find_near.<locals>.<lambda>M   s
    AJJ r%   )keyreverseN)r'   r   r   r,   r&   r0   sorted)r5   r/   r.   r6   r7   r8   r9   r:   resultsr+   _hashp_latp_long_dists                  r#   
_find_nearrI   0   s    * Gzz| e(/vq!#t5<&=NN9T65%FGS\U2 W"6EG&5/Nr%   c                       e Zd Zdededdf fdZdedee   dede	fd	Z
d
edededededeee   e	f   fdZ ed ee      fef      d
edede	fd       Z ed ee      efef      d
ededeeedf      fd       Z ed ee      efef      d
ededeeee         fd       Z ed ee      eefef      d
ededededee   f
d       Z ed ee      eeefef      d
edededededee   fd       Z ed ee      eeefef      d
edededededeee   e	f   fd       Z ed ee      eefef      d
ed edededee   f
d!       Z ed" ee      eefef      d
ed edededee   f
d#       Z ed$ ee      fef      d
ededee   fd%       Z ed&e ee      fef      d'ed(ededee   fd)       Z xZS )*GeoCommandsMixinargskwargsr   Nc                 0    t        t        | 
  |i | |  y r=   )superrK   __init__)selfrL   rM   	__class__s      r#   rP   zGeoCommandsMixin.__init__T   s    .??r%   	item_namegeo_results	scoredistc                 X   t        || j                  | j                  j                  |      t                     }t               |_        |D ]B  }|r|j
                  n|j                  }|j                  j                  |j                  |       D |j                          t        |      S )N)r2   default)r   _dbr   r   valuer   hashaddr+   	writebackr0   )rQ   rS   rT   rU   db_itemr2   vals          r#   _store_geo_resultsz#GeoCommandsMixin._store_geo_resultsX   s    iY8OY]Y_` 	.D#,$--$))CMMdii-	. 	;r%   r@   r.   r/   r6   c           
      r   t        |ddd      \  \  }}}}	}
}}}}|	xs t        j                  }	t        |      dk\  rt	        |d         nd}t        |j                  |||||	|
|      }|r| j                  ||d       t        |      S |r| j                  ||d       t        |      S t        |||      S )N)r(   r)   withhash+countanyr:   z*storez
*storedistFerror_on_unexpectedleft_from_first_unexpectedr   r   )rU   T)	r	   sysmaxsizer0   r$   rI   rY   r_   r4   )rQ   r@   r.   r/   r6   rL   r(   r)   ra   r8   r9   r:   store	storedist	left_argsr7   rT   s                    r#   
_georadiuszGeoCommandsMixin._georadiusa   s     `lb %',	`
\QHhy$yS\ $47IN'Q0'1#))S$PTV[]fhl'm##E;%#H{####I{d#K{##k9h??r%   GEOADD)r+   fixedrepeatc           	      f   t        |ddd      \  \  }}}}|r|rt        t        j                        t	        |      dk(  st	        |      dz  dk7  rt        t        j
                        |j                  }t	        |      d}	}t        dt	        |      d      D ]q  }
t        j                  ||
dz            t        j                  ||
dz            ||
dz      }}}||v r|r||vsL|rO|j                  |t        ||d	            sm|	dz  }	s |	r|j                          |r|	S t	        |      |z
  S )
N)nxxxchFTrd   r      r      
   )r	   r   r    NX_XX_GT_LT_ERROR_MSGr0   SYNTAX_ERROR_MSGrY   ranger   r   r[   r   updated)rQ   r@   rL   rr   rq   rs   datar5   old_lenchanged_itemsir.   r/   r+   s                 r#   geoaddzGeoCommandsMixin.geoaddv   s/   ) %'+	
Rd "d8899t9>SY]a/d3344yy!$TAq#d)Q' 	'AT!a%[)T!a%[)QU #D
 RT-=b88D*S$";<!Q&M	' KKM  4y7""r%   GEOHASHmembersc                     t        |j                  j                  |      }|D cg c]  }||dz   j                         n| }}|S c c}w )N0)maprY   r   r-   )rQ   r@   r   hashesr>   geohash_lists         r#   geohashzGeoCommandsMixin.geohash   sM    SYY]]G,hn1ocdAG3C3C3E\]3]1o1o 2ps   AGEOPOSc                     d t        |j                  j                  |      D        }|D cg c]  }|
|d   |d   gnd  }}|S c c}w )Nc              3   :   K   | ]  }|t        |      n|  y wr=   )r   ).0r>   s     r#   	<genexpr>z*GeoCommandsMixin.geopos.<locals>.<genexpr>   s     c!
1A=cs   r   r   )r   rY   r   )rQ   r@   r   gospositionsr>   r1   s         r#   geoposzGeoCommandsMixin.geopos   sO    cs399==ZaGbcBNOQ1qt47OO
 Ps   AGEODISTm1m2c                 d   |j                   j                  |      |j                   j                  |      g}t        d |D              ry |D cg c]  }t        |       }}t	        |d   d   |d   d   f|d   d   |d   d   f      }t        |      dk(  rt        |d         nd}	||	z  S c c}w )Nc              3   $   K   | ]  }|d u  
 y wr=    )r   elems     r#   r   z+GeoCommandsMixin.geodist.<locals>.<genexpr>   s     2tt|2s   r   r   )rY   r   rc   r   r   r0   r$   )
rQ   r@   r   r   rL   	geohashesr>   geo_locsr1   r"   s
             r#   geodistzGeoCommandsMixin.geodist   s    YY]]2&		b(9:	2	22+45aJqM55AA7(1+a.(ST+VW.9YZ47IN'Q0Tz 6s   B-GEORADIUS_ROc           
          t        |ddd      \  \  }}}}	}
}}|	xs t        j                  }	t        |      dk\  rt	        |d         nd}t        |j                  |||||	|
|      }t        |||      }|S )N)r(   r)   ra   rb   rc   r:   Frd   r   r   g      ?)r	   rg   rh   r0   r$   rI   rY   r4   )rQ   r@   r.   r/   r6   rL   r(   r)   ra   r8   r9   r:   rk   r7   rT   rets                   r#   georadius_rozGeoCommandsMixin.georadius_ro   s    MYJ %',	N
J?Hhy$ $;>t9>.tAw7s CvtUIW[\[)X>
r%   	GEORADIUSc                 .     | j                   ||||g| S r=   )rl   )rQ   r@   r.   r/   r6   rL   s         r#   	georadiuszGeoCommandsMixin.georadius   s      tsD#v===r%   GEORADIUSBYMEMBERmember_namec                     |j                   j                  |      }t        |      \  }}}} | j                  ||||g| S r=   )rY   r   r   rl   	rQ   r@   r   r6   rL   member_scorer/   r.   rG   s	            r#   georadiusbymemberz"GeoCommandsMixin.georadiusbymember   sB    yy}}[1$\2T1atsD#v===r%   GEORADIUSBYMEMBER_ROc                     |j                   j                  |      }t        |      \  }}}} | j                  ||||g| S r=   )rY   r   r   r   r   s	            r#   georadiusbymember_roz%GeoCommandsMixin.georadiusbymember_ro   sD    yy}}[1$\2T1a t  dC?$??r%   	GEOSEARCHc                    t        |ddd      \  \  }\  }}}}||t        t        j                        ||t        t        j                        |r | j                  |||g| S  | j
                  ||||g| S )N)*frommember..fromlonlat	.byradiusFrd   )r	   r   r    rx   r   r   )rQ   r@   rL   
frommemberr.   r/   r6   rk   s           r#   	geosearchzGeoCommandsMixin.geosearch   s    7C8 %',	8
4)[dC&9 $,d3344!d&6d3344,4,,S*fQyQQ$4$$S$VHiHHr%   GEOSEARCHSTOREdstsrcc                     t        |ddd      \  \  }\  }}}}}	||t        t        j                        ||t        t        j                        |rd|gnd|g}
|r | j                  |||g|	|
 S  | j
                  ||||g|	|
 S )N)r   r   r   rj   Frd   s	   storedists   store)r	   r   r    rx   r   rl   )rQ   r   r   rL   r   r.   r/   r6   rj   rk   
additionals              r#   geosearchstorezGeoCommandsMixin.geosearchstore   s     COE %',	C
?4[dC&)i $,d3344!d&6d3344,5lC(Hc?
)4))#z6[I[PZ[["4??3c6SIS
SSr%   )__name__
__module____qualname__r   rP   bytesr   r&   boolintr_   r   floatr   rl   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)rR   s   @r#   rK   rK   S   s   c S T  E  Y  \`  eh  @@&+@27@AF@OT@	tE{C	 @* (3t9,x@#+ #e # # A#8 )CIu#5uhG; % Dud{AS<T  H
 (3t9e"4eXF+  4e@U;V  G
 )CIue#<eXN; E u U xX]  O .TE5%(HRWQYZ 5 u e \a fjknfo  [ +c$iu%EuhW>>&+>27>AF>OT>	tCy#~	> X>
 %c$i-FPUxX>[ >u >e >\a >fjknfo > Y>
 (TE50ISXRZ[@ @% @QV @_d @imnqir @ \@
 +c$i\5(CI[ I I49 I DI  I
 xT% Tk T% TDQTI TTr%   rK   )%rg   collectionsr   typingr   r   r   r   	fakeredisr   r    fakeredis._command_args_parsingr	   fakeredis._commandsr
   r   r   r   fakeredis._helpersr   r   fakeredis.geor   r   r   fakeredis.modelr   r   r   r   r$   r&   r   r4   r   rI   rK   r   r%   r#   <module>r      s    
 " - - # 8 @ @ 4 : :  7C	u   {$AB	$y/ d d tTWy & 
 	    	 
         
)_ F`T `Tr%   