
    & j@k                     @   S SK r S SKrS SKrS SKrS SK7  S SKJr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S SKJ
r
  S S	KJr  S S
KJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  SrSr\b  \R,                  SS S:  a  SOSrOSrSr " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S \5      r  " S! S"\5      r! " S# S$\!5      r" " S% S&\#5      r$ " S' S(\$5      r% " S) S*\&5      r' " S+ S,\(5      r) " S- S.\*5      r+ " S/ S0\+5      r, " S1 S2\,5      r-S3r.\/" S45      \/" \.5      -  \/" \.Ra                  5       5      -  \/" \1" S55      45      -  r2\/" S6 \3" S75       5       5      r4C.C2\Rj                  " S85      r6 " S9 S:\,5      r7S;\l8        S< r9g)=    N)*)
ColumnBase)EnclosedNodeList)Entity)
Expression)Insert)Node)NodeList)OP)VirtualField)
merge_dict)sqlite3)JSON)RANK)register_udf_groupspcxpcnalx   )r         r   )r   	   r   c                   8   ^  \ rS rSrSrS=r=rrU 4S jrSr	U =r
$ )
RowIDField"   Trowidc                    > X R                   :w  a&  [        [        U 5      < SU R                   < S35      e[        [        U ]  " X/UQ76   g )Nz must be named "z".)required_name
ValueErrortypesuperr   bind)selfmodelnameargs	__class__s       e/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/playhouse/sqlite_ext.pyr!   RowIDField.bind&   sD    %%%"4j$*<*<> ? ?j$$U848     )__name__
__module____qualname____firstlineno__auto_incrementcolumn_namer$   r   r!   __static_attributes____classcell__r&   s   @r'   r   r   "   s!    N)00K0$9 9r)   r   c                        \ rS rSrS=r=rrSrg)
DocIDField-   docidr*   N)r+   r,   r-   r.   r0   r$   r   r1   r*   r)   r'   r5   r5   -   s    )00K0$r)   r5   c                   (   ^  \ rS rSrU 4S jrSrU =r$ )AutoIncrementField1   c                 V   > [         [        U ]  U5      n[        U[	        S5      45      $ )NAUTOINCREMENT)r    r9   ddlr
   SQL)r"   ctx	node_listr&   s      r'   r=   AutoIncrementField.ddl2   s*    ,d7<	C$89::r)   r*   )r+   r,   r-   r.   r=   r1   r2   r3   s   @r'   r9   r9   1   s    ; ;r)   r9   c                       \ rS rSrSrS rSrg)TDecimalField7   TEXTc                     g Nr*   r"   s    r'   get_modifiersTDecimalField.get_modifiers9   s    Tr)   r*   N)r+   r,   r-   r.   
field_typerI   r1   r*   r)   r'   rC   rC   7   s
    J!r)   rC   c                   "    \ rS rSr/ SQrS rSrg)ISODateTimeField<   )z%Y-%m-%dT%H:%M:%S.%f%zz%Y-%m-%dT%H:%M:%S%zz%Y-%m-%dT%H:%M:%S.%fz%Y-%m-%dT%H:%M:%Sz%Y-%m-%dc                 2    U(       a  UR                  5       $ g rG   )	isoformatr"   values     r'   db_valueISODateTimeField.db_valueE   s    ??$$ r)   r*   N)r+   r,   r-   r.   formatsrS   r1   r*   r)   r'   rM   rM   <   s    G%r)   rM   c                      ^  \ rS rSrSU 4S jjrS r\S 5       rS rSS jr	SS jr
SS jrSS	 jrSS
 jrS rS rS rS rS rS rS rSrU =r$ )JSONPathJ   c                 V   > [         [        U ]  5         Xl        U=(       d    SU l        g Nr*   )r    rW   __init___field_path)r"   fieldpathr&   s      r'   r[   JSONPath.__init__K   s     h&(ZR
r)   c                 8    U R                   R                  U5      $ rG   )r\   python_valuerQ   s     r'   
_converterJSONPath._converterP   s    {{''..r)   c                 P    [        SSR                  U R                  5      -  5      $ )Nz$%s )Valuejoinr]   rH   s    r'   r_   JSONPath.pathS   s    URWWTZZ0011r)   c                     [        U[        5      (       d  US:X  a  SU-  nOSU-  n[        U 5      " U R                  U R                  U4-   5      $ )N#z[%s]z.%s)
isinstanceintr   r\   r]   )r"   idxitems      r'   __getitem__JSONPath.__getitem__W   sG    c33#:C<D3;DDz$++tzzTG';<<r)   c                     U(       d  [        U[        [        45      (       a.  [        R	                  U R
                  R                  U5      5      n[        R                  U R
                  U S   R                  U5      $ Nrk   )	rl   listdictfnjsonr\   _json_dumpsjson_setr_   r"   rR   as_jsons      r'   appendJSONPath.append^   sQ    jt55GGDKK33E:;E{{4;;S	>>r)   c                     U(       d  [        U[        [        45      (       a.  [        R	                  U R
                  R                  U5      5      nU" U R
                  U R                  U5      $ rG   )rl   rt   ru   rv   rw   r\   rx   r_   r"   funcrR   r{   s       r'   _json_operationJSONPath._json_operationc   sI    jt55GGDKK33E:;EDKKE22r)   c                 B    U R                  [        R                  X5      $ rG   )r   rv   json_insertrz   s      r'   insertJSONPath.inserth   s    ##BNNECCr)   c                 B    U R                  [        R                  X5      $ rG   )r   rv   ry   rz   s      r'   setJSONPath.setk   s    ##BKK@@r)   c                 B    U R                  [        R                  X5      $ rG   )r   rv   json_replacerz   s      r'   replaceJSONPath.replacen       ##BOOUDDr)   c                 |    U R                  [        R                  X R                  R	                  U5      5      5      $ rG   )r   rv   
json_patchr\   rx   rQ   s     r'   updateJSONPath.updateq   s)    xxdKK,C,CE,JKLLr)   c                 V    [         R                  U R                  U R                  5      $ rG   )rv   json_remover\   r_   rH   s    r'   removeJSONPath.removet   s    ~~dkk49955r)   c                 V    [         R                  U R                  U R                  5      $ rG   )rv   	json_typer\   r_   rH   s    r'   r   JSONPath.json_typew       ||DKK33r)   c                 V    [         R                  U R                  U R                  5      $ rG   )rv   json_array_lengthr\   r_   rH   s    r'   lengthJSONPath.lengthz   s    ##DKK;;r)   c                 V    [         R                  U R                  U R                  5      $ rG   )rv   	json_eachr\   r_   rH   s    r'   childrenJSONPath.children}   r   r)   c                 V    [         R                  U R                  U R                  5      $ rG   )rv   	json_treer\   r_   rH   s    r'   treeJSONPath.tree   r   r)   c                     UR                  U R                  (       a.  [        R                  U R                  U R
                  5      5      $ U R                  5      $ rG   )sqlr]   rv   json_extractr\   r_   r"   r?   s     r'   __sql__JSONPath.__sql__   sC    ww** t{{DII> 7 	7*.++7 	7r)   )r\   r]   rG   )r+   r,   r-   r.   r[   rc   propertyr_   rp   r|   r   r   r   r   r   r   r   r   r   r   r   r1   r2   r3   s   @r'   rW   rW   J   sk     
/ 2 2=?
3
DAEM64<447 7r)   rW   c                   X    \ rS rSrSS jrSS jrSS jrSS jrSS jrS r	S	 r
S
 rSrg)	JSONBPath   Nc                     U(       d  [        U[        [        45      (       a.  [        R	                  U R
                  R                  U5      5      n[        R                  U R
                  U S   R                  U5      $ rs   )	rl   rt   ru   rv   jsonbr\   rx   	jsonb_setr_   rz   s      r'   r|   JSONBPath.append   sQ    jt55HHT[[44U;<E||DKKc??r)   c                     U(       d  [        U[        [        45      (       a.  [        R	                  U R
                  R                  U5      5      nU" U R
                  U R                  U5      $ rG   )rl   rt   ru   rv   r   r\   rx   r_   r   s       r'   r   JSONBPath._json_operation   sI    jt55HHT[[44U;<EDKKE22r)   c                 B    U R                  [        R                  X5      $ rG   )r   rv   jsonb_insertrz   s      r'   r   JSONBPath.insert   r   r)   c                 B    U R                  [        R                  X5      $ rG   )r   rv   r   rz   s      r'   r   JSONBPath.set   s    ##BLL%AAr)   c                 B    U R                  [        R                  X5      $ rG   )r   rv   jsonb_replacerz   s      r'   r   JSONBPath.replace   s    ##B$4$4eEEr)   c                 |    U R                  [        R                  X R                  R	                  U5      5      5      $ rG   )r   rv   jsonb_patchr\   rx   rQ   s     r'   r   JSONBPath.update   s)    xxt[[-D-DU-KLMMr)   c                 V    [         R                  U R                  U R                  5      $ rG   )rv   jsonb_remover\   r_   rH   s    r'   r   JSONBPath.remove   s    t{{DII66r)   c                     UR                  U R                  (       a.  [        R                  U R                  U R
                  5      5      $ U R                  5      $ rG   )r   r]   rv   jsonb_extractr\   r_   r   s     r'   r   JSONBPath.__sql__   sE    ww** ''TYY? 7 	7*.++7 	7r)   r*   rG   )r+   r,   r-   r.   r|   r   r   r   r   r   r   r   r1   r*   r)   r'   r   r      s/    @
3
EBFN77r)   r   c                     ^  \ rS rSrSrSr\rSU 4S jjrS r	S r
S r\" \R                  5      r\" \R                  5      r\" \R"                  5      r\" \R&                  5      r\" \R*                  5      r\" \R.                  5      r\R4                  rS rS	 rS
 rS rSS jrSS jr SS jr!SS jr"S r#S r$S r%SS jr&S r'S r(Sr)U =r*$ )	JSONField   r   Fc                    > U=(       d    [         R                  U l        U=(       d    [         R                  U l        [
        [        U ]  " S0 UD6  g rZ   )rw   dumpsrx   loads_json_loadsr    r   r[   )r"   
json_dumps
json_loadskwargsr&   s       r'   r[   JSONField.__init__   s7    %3%3i'1&1r)   c                 ^    Ub   U R                  U5      $ g ! [        [        4 a    Us $ f = frG   )r   	TypeErrorr   rQ   s     r'   rb   JSONField.python_value   s>    ''..  z* s    ,,c                     Ub;  [        U[        5      (       d$  [        R                  U R	                  U5      5      nU$ g rG   )rl   r	   rv   rw   rx   rQ   s     r'   rS   JSONField.db_value   s8    eT** 0 0 78L r)   c                    ^  U 4S jnU$ )Nc                 ~   > [        U[        [        45      (       a  [        XR                  5      n[        U TU5      $ rG   )rl   rt   ru   AsIsrS   r   )r"   rhsops     r'   innerJSONField._e.<locals>.inner   s1    #d|,,3.dB,,r)   r*   )r   r   s   ` r'   _eJSONField._e   s    	- r)   c                 *    U R                  U 5      U   $ rG   )Path)r"   ro   s     r'   rp   JSONField.__getitem__   s    yyt$$r)   c                 n    U Vs/ s H  n[        USS9PM     nn[        R                  " U /UQ76 $ s  snf NF	converter)rg   rv   r   r"   pathsps      r'   extractJSONField.extract   s6    49:EqqE*E:t,e,, ;   2c           	      ,    [        U S[        USS95      $ )Nz->Fr   r   rg   r"   r_   s     r'   extract_jsonJSONField.extract_json   s    $eDE&BCCr)   c           	      ,    [        U S[        USS95      $ )Nz->>Fr   r   r   s     r'   extract_textJSONField.extract_text   s    $uTU'CDDr)   c                 B    U R                  U 5      R                  X5      $ rG   )r   r|   rz   s      r'   r|   JSONField.append       yy%%e55r)   c                 B    U R                  U 5      R                  X5      $ rG   )r   r   rz   s      r'   r   JSONField.insert   r   r)   c                 B    U R                  U 5      R                  X5      $ rG   )r   r   rz   s      r'   r   JSONField.set   s    yy""522r)   c                 B    U R                  U 5      R                  X5      $ rG   )r   r   rz   s      r'   r   JSONField.replace   s    yy&&u66r)   c                 B    U R                  U 5      R                  U5      $ rG   )r   r   )r"   datas     r'   r   JSONField.update   s    yy%%d++r)   c                 |    U(       d  U R                  U 5      R                  5       $ [        R                  " U /UQ76 $ rG   )r   r   rv   r   r"   r   s     r'   r   JSONField.remove   s0    99T?))++~~d+U++r)   c                 ,    [         R                  U 5      $ rG   )rv   r   rH   s    r'   r   JSONField.json_type       ||D!!r)   c                 B    U(       a  X4OU 4n[         R                  " U6 $ rG   )rv   r   )r"   r_   r%   s      r'   r   JSONField.length   s     #|$##T**r)   c                 ,    [         R                  U 5      $ )a  
Schema of `json_each` and `json_tree`:

key,
value,
type TEXT (object, array, string, etc),
atom (value for primitive/scalar types, NULL for array and object)
id INTEGER (unique identifier for element)
parent INTEGER (unique identifier of parent element or NULL)
fullkey TEXT (full path describing element)
path TEXT (path to the container of the current element)
json JSON hidden (1st input parameter to function)
root TEXT hidden (2nd input parameter, path at which to start)
)rv   r   rH   s    r'   r   JSONField.children   s     ||D!!r)   c                 ,    [         R                  U 5      $ rG   )rv   r   rH   s    r'   r   JSONField.tree  r  r)   )rx   r   )NNrG   )+r+   r,   r-   r.   rK   unpackrW   r   r[   rb   rS   r   r   EQ__eq__NE__ne__GT__gt__GTE__ge__LT__lt__LTE__le__Field__hash__rp   r   r   r   r|   r   r   r   r   r   r   r   r   r   r1   r2   r3   s   @r'   r   r      s    JFD2
 YFYFYFZFYFZF~~H%-DE6637,,
"+""" "r)   r   c                   4    \ rS rSrSr\rS rS rS r	S r
Srg)	
JSONBFieldi  JSONBc                     Ub;  [        U[        5      (       d$  [        R                  U R	                  U5      5      nU$ g rG   )rl   r	   rv   r   rx   rQ   s     r'   rS   JSONBField.db_value
  s8    eT**!1!1%!89L r)   c                 ,    [         R                  U 5      $ rG   )rv   rw   rH   s    r'   rw   JSONBField.json  s    wwt}r)   c                 n    U Vs/ s H  n[        USS9PM     nn[        R                  " U /UQ76 $ s  snf r   )rg   rv   r   r   s      r'   r   JSONBField.extract  s8    49:EqqE*E:-u-- ;r   c                 |    U(       d  U R                  U 5      R                  5       $ [        R                  " U /UQ76 $ rG   )r   r   rv   r   r  s     r'   r   JSONBField.remove  s0    99T?))++t,e,,r)   r*   N)r+   r,   r-   r.   rK   r   r   rS   rw   r   r   r1   r*   r)   r'   r  r    s     JD.-r)   r  c                   R   ^  \ rS rSrSU 4S jjrS r\S 5       rS rS	S jr	Sr
U =r$ )
SearchFieldi  c                 h   > U(       a  [        S[        U5      -  5      e[        [        U ]  UUSS9  g )Nz8SearchField does not accept these keyword arguments: %s.T)	unindexedr0   null)r   sortedr    r)  r[   )r"   r+  r0   kr&   s       r'   r[   SearchField.__init__  s@     .06q	: ; ;k4)I6A 	* 	Nr)   c                     [        X5      $ rG   )match)r"   terms     r'   r1  SearchField.match%  s    T  r)   c                 (   [        U S5      (       dq  U R                  R                  R                   Vs/ s H&  n[	        U[
        5      (       d  M  UR                  PM(     nnUR                  U R                  5      U l        U R                  $ s  snf )N_fts_column_index)	hasattrr#   _metasorted_fieldsrl   r)  r$   indexr5  )r"   fsearch_fieldss      r'   fts_column_indexSearchField.fts_column_index(  su    t011-1ZZ-=-=-K-K <-K *1k : $QVV-KM <%2%8%8%CD"%%%<s   BBc                     U R                   n[        R                  U R                  R                  R
                  X1U5      $ rG   )r<  rv   	highlightr#   r7  entity)r"   leftright
column_idxs       r'   r?  SearchField.highlight0  s0    **
||DJJ,,33ZuMMr)   c                     SUs=:  a  S:  d  O  [        S5      eU R                  n[        R                  U R                  R
                  R                  XQUX45      $ )Nr   A   z/max_tokens must be between 1 and 64 (inclusive))r   r<  rv   snippetr#   r7  r@  )r"   rA  rB  over_length
max_tokensrC  s         r'   rG  SearchField.snippet4  sP    J##NOO**
zz$****11:U%3 	3r)   )r5  )FN)z...   )r+   r,   r-   r.   r[   r1  r   r<  r?  rG  r1   r2   r3   s   @r'   r)  r)    s2    N! & &N3 3r)   r)  c                   6   ^  \ rS rSrSS jrSU 4S jjrSrU =r$ )VirtualTableSchemaManageri<  c                 6   U R                   R                  [        U R                   R                  R                  U5      5      nU R                  5       nUR                  S5        U(       a  UR                  S5        UR                  U R                   5      R                  S5        U R                   R                  R                  n[        U[        5      (       a  UR                  U5      $ UR                  [        U5      5      R                  S5        / nU R                   R                  nUR                  (       a5  UR                  UR                   Vs/ s H  n[        U5      PM     sn5        UR                   H  n[        U[        5      (       d  UR                   (       a  M+  [#        UR$                  5      /n	UR&                  (       a  U	R)                  [        S5      5        UR)                  [+        U	5      5        M     UR,                  (       a5  UR                  UR,                   Vs/ s H  n[        U5      PM     sn5        U(       a   UR                  U R/                  U5      5        UR                  [1        U5      5      $ s  snf s  snf )NzCREATE VIRTUAL TABLE zIF NOT EXISTS z USING  	UNINDEXED)r#   clean_optionsr   r7  options_create_contextliteralr   extension_modulerl   r	   r>   prefix_argumentsextendr8  r   _hiddenr   r0   r+  r|   r
   	arguments_create_table_option_sqlr   )
r"   saferR  r?   
ext_modulerY  metaar^   	field_defs
             r'   _create_virtual_table/VirtualTableSchemaManager._create_virtual_table=  s   ****tzz''//9; ""$+,KK()	
#djj/
')
ZZ%%66
j$''77:&&J ((-	zz  d.C.CD.Cc!f.CDE ''E%*..%-- 1 123I  [!12Xi01 ( >>dnn=nc!fn=>T::7CDww'	233! E >s   J4Jc                    > [        U R                  [        5      (       a  U R                  " U40 UD6$ [        [
        U ]  " U40 UD6$ rG   )
issubclassr#   VirtualModelr`  r    rM  _create_table)r"   r[  rR  r&   s      r'   re  'VirtualTableSchemaManager._create_tableh  sJ    djj,//--d>g>>.C 	r)   r*   T)r+   r,   r-   r.   r`  re  r1   r2   r3   s   @r'   rM  rM  <  s    )4V r)   rM  c                   8    \ rS rSr " S S5      r\S 5       rSrg)rd  ip  c                   (    \ rS rSrSrSrSrSr\r	Sr
g)VirtualModel.Metaiq  NFr*   )r+   r,   r-   r.   rY  rU  rV  primary_keyrM  schema_manager_classr1   r*   r)   r'   Metarj  q  s    	8r)   rm  c                     U$ rG   r*   )clsrR  s     r'   rQ  VirtualModel.clean_optionsx  s    r)   r*   N)r+   r,   r-   r.   rm  classmethodrQ  r1   r*   r)   r'   rd  rd  p  s     9 9  r)   rd  c                   $    \ rS rSr\S 5       rSrg)BaseFTSModeli}  c                    UR                  S5      nUR                  S5      nUR                  S5      nUR                  S5      n[        U[        5      (       a  US:X  a  SUS'   OL[        U[        5      (       a7  [	        UR
                  R                  R                  UR                  5      US'   Ub  XQS'   U(       a]  [        U[        [        45      (       a+  SR                  U Vs/ s H  n[        U5      PM     sn5      nSUR                  S	5      -  US'   U(       a0  U R                  R                  R                  5       S
:X  a  SU-  US'   U$ s  snf )Ncontentprefixtokenizecontent_rowidrf   z'',z'%s'z' fts5z"%s")getrl   strr  r   r#   r7  
table_namer0   rt   tuplerh   striprU  lower)ro  rR  ru  rv  rw  rx  is          r'   rQ  BaseFTSModel.clean_options~  s#   ++i(X&;;z*O4gs##2!%GI''!'(;(;(F(F(/(;(;"=GI $'4O$&4-006":6a3q66":; &d); ;GH		2288:fD #)8"3GJ #;s   *Er*   N)r+   r,   r-   r.   rq  rQ  r1   r*   r)   r'   rs  rs  }  s     r)   rs  c                   b   \ rS rSrSr\" 5       r " S S5      r\S 5       r	\S 5       r
\S 5       r\S 5       r\SS	 j5       r\SS
 j5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\  SS j5       r\  SS j5       r\  SS j5       r\  SS j5       rSrg)FTSModeli  z
VirtualModel class for creating tables that use either the FTS3 or FTS4
search extensions. Peewee automatically determines which version of the
FTS extension is supported and will use FTS4 if possible.
c                       \ rS rSrS\-  rSrg)FTSModel.Metai  zFTS%sr*   N)r+   r,   r-   r.   FTS_VERSIONrU  r1   r*   r)   r'   rm  r    s    "[0r)   rm  c           	          U R                   R                  nU R                   R                  R                  SU< SU< SU< S35      nUR	                  5       $ )NzINSERT INTO (z
) VALUES('z');)r7  r}  databaseexecute_sqlfetchone)ro  cmdtblress       r'   _fts_cmdFTSModel._fts_cmd  sB    ii""ii  ,,25sC@B||~r)   c                 $    U R                  S5      $ Noptimizer  ro  s    r'   r  FTSModel.optimize      ||J''r)   c                 $    U R                  S5      $ Nrebuildr  r  s    r'   r  FTSModel.rebuild      ||I&&r)   c                 $    U R                  S5      $ )Nintegrity-checkr  r  s    r'   integrity_checkFTSModel.integrity_check  s    ||-..r)   c                 4    U R                  SU< SU< 35      $ )Nzmerge=ry  r  )ro  blockssegmentss      r'   mergeFTSModel.merge  s    ||VX>??r)   c                 N    U R                  SU=(       a    S=(       d    S-  5      $ )Nzautomerge=%s10r  )ro  states     r'   	automergeFTSModel.automerge  s    ||Nem.BsCDDr)   c                 B    [        U R                  R                  U5      $ zE
Generate a `MATCH` expression appropriate for searching this table.
r1  r7  r@  ro  r2  s     r'   r1  FTSModel.match      
 SYY%%t,,r)   c                     [         R                  U R                  R                  [        5      n[         R
                  " U/UQ76 $ rG   )rv   	matchinfor7  r@  FTS3_MATCHINFOfts_rank)ro  weightsr  s      r'   rankFTSModel.rank  s0    LL!1!1>B	{{9/w//r)   c                     [         R                  U R                  R                  [        5      n[         R
                  " U/UQ76 $ rG   )rv   r  r7  r@  FTS4_MATCHINFOfts_bm25ro  r  
match_infos      r'   bm25FTSModel.bm25  s0    \\#))"2"2NC
{{:000r)   c                     [         R                  U R                  R                  [        5      n[         R
                  " U/UQ76 $ rG   )rv   r  r7  r@  r  	fts_bm25fr  s      r'   bm25fFTSModel.bm25f  s0    \\#))"2"2NC
||J111r)   c                     [         R                  U R                  R                  [        5      n[         R
                  " U/UQ76 $ rG   )rv   r  r7  r@  r  
fts_lucener  s      r'   luceneFTSModel.lucene  s0    \\#))"2"2NC
}}Z2'22r)   c                    U(       d  U" 5       nO{[        U[        5      (       aa  / nU R                  R                   H?  n	UR	                  XR	                  U	R
                  S5      5      n
UR                  U
5        MA     U" U6 nOU" U6 nSnUnU(       a  XR                  U5      4nU(       a  U(       d  [        U5      nU R                  " U6 R                  U R                  U5      5      R                  U5      $ )N      ?r*   )rl   ru   r7  r8  r{  r$   r|   aliasr>   selectwherer1  order_by)ro  r2  r  
with_scorescore_aliasscore_fnexplicit_orderingr  weight_argsr^   field_weight	selectionr  s                r'   _searchFTSModel._search  s     :D&&K00  '{{5++ejj#2NO""<0	 1
 [)DW%D	jj56I/;'H"$syy'(#	%r)   Nc                 B    U R                  UUUUU R                  U5      $ 'Full-text search using selected `term`.)r  r  ro  r2  r  r  r  r  s         r'   searchFTSModel.search  +     {{HH 	r)   c                 B    U R                  UUUUU R                  U5      $ z:Full-text search for selected `term` using BM25 algorithm.)r  r  r  s         r'   search_bm25FTSModel.search_bm25  r  r)   c                 B    U R                  UUUUU R                  U5      $ r  )r  r  r  s         r'   search_bm25fFTSModel.search_bm25f  s+     {{II 	r)   c                 B    U R                  UUUUU R                  U5      $ r  )r  r  r  s         r'   search_luceneFTSModel.search_lucene  s+     {{JJ 	r)   r*   )      rg  NFscoreF)r+   r,   r-   r.   __doc__r5   r7   rm  rq  r  r  r  r  r  r  r1  r  r  r  r  r  r  r  r  r  r1   r*   r)   r'   r  r    sv    LE1 1   ( ( ' ' / / @ @ E E - - 0 0 1 1 2 2 3 3 % %6 FM!&	 	 8=;@	 	 9><A	 	 :?=B	 	r)   r  abcdefghijklmnopqrstuvwxyzz	 ,"(){}*:_+0123456789   c              #   b   #    U  H%  n[        U5      [        ;  d  M  [        U5      v   M'     g 7frG   )chr	_alphanum).0r   s     r'   	<genexpr>r  1  s#     KZ3q63JVSVVZs   //   z [^\s"]+|"[^"\\]*(?:\\.[^"\\]*)*"c                      \ rS rSrSr\" 5       r " S S5      rSSSS.r\	S	 5       r
\	S
 5       r\S 5       r\\" S5      4S j5       r\	S 5       r\	S 5       r\	S 5       r\	  S S j5       r\	  S S j5       r\	S 5       r\	S 5       r\	S 5       r\	S 5       r\	S 5       r\	S 5       r\	S 5       r\	S 5       r\	S 5       r\	S!S j5       r\	S"S j5       rSr g)#	FTS5Modeli7  a  
Requires SQLite >= 3.9.0.

Table options:

content: table name of external content, or empty string for "contentless"
content_rowid: column name of external content primary key
prefix: integer(s). Ex: '2' or '2 3 4'
tokenize: porter, unicode61, ascii. Ex: 'porter unicode61'

The unicode tokenizer supports the following parameters:

* remove_diacritics (1 or 0, default is 1)
* tokenchars (string of characters, e.g. '-_'
* separators (string of characters)

Parameters are passed as alternating parameter name and value, so:

{'tokenize': "unicode61 remove_diacritics 0 tokenchars '-_'"}

Content-less tables:

If you don't need the full-text content in it's original form, you can
specify a content-less table. Searches and auxiliary functions will work
as usual, but the only values returned when SELECT-ing can be rowid. Also
content-less tables do not support UPDATE or DELETE.

External content tables:

You can set up triggers to sync these, e.g.

-- Create a table. And an external content fts5 table to index it.
CREATE TABLE tbl(a INTEGER PRIMARY KEY, b);
CREATE VIRTUAL TABLE ft USING fts5(b, content='tbl', content_rowid='a');

-- Triggers to keep the FTS index up to date.
CREATE TRIGGER tbl_ai AFTER INSERT ON tbl BEGIN
  INSERT INTO ft(rowid, b) VALUES (new.a, new.b);
END;
CREATE TRIGGER tbl_ad AFTER DELETE ON tbl BEGIN
  INSERT INTO ft(fts_idx, rowid, b) VALUES('delete', old.a, old.b);
END;
CREATE TRIGGER tbl_au AFTER UPDATE ON tbl BEGIN
  INSERT INTO ft(fts_idx, rowid, b) VALUES('delete', old.a, old.b);
  INSERT INTO ft(rowid, b) VALUES (new.a, new.b);
END;

Built-in auxiliary functions:

* bm25(tbl[, weight_0, ... weight_n])
* highlight(tbl, col_idx, prefix, suffix)
* snippet(tbl, col_idx, prefix, suffix, ?, max_tokens)
c                       \ rS rSrSrSrg)FTS5Model.Metaiq  rz  r*   N)r+   r,   r-   r.   rU  r1   r*   r)   r'   rm  r  q  s    !r)   rm  zQBesides the implicit `rowid` column, all columns must be instances of SearchFieldz3Secondary indexes are not supported for FTS5 modelsz4FTS5 models must use the default `rowid` primary key)rK   r9  pkc                    U R                   R                  R                  S:w  a  [        U R                  S   5      eU R                   R
                  R                  5        H6  n[        U[        [        45      (       a  M   [        U R                  S   5      e   U R                   R                  (       a  [        U R                  S   5      eg )Nr   r  rK   r9  )r7  rk  r$   ImproperlyConfigured_error_messagesfieldsvaluesrl   r)  r   indexes)ro  r^   s     r'   validate_modelFTS5Model.validate_model{  s     99  %%0&s':':4'@AAYY%%,,.Eek:%>??*3+>+>|+LMM / 99&s':':7'CDD r)   c                    [         R                  S S [        :  a  g[         R                  " S5      n UR	                  S5        UR                  5         g!    UR                  S5        UR                  S5        U R                  R                  R                  S5         N]!     UR                  5         g= f= f! UR                  5         f = f)Nr   Fz:memory:z0CREATE VIRTUAL TABLE fts5test USING fts5 (data);Trz  )
r   sqlite_version_infoFTS5_MIN_SQLITE_VERSIONconnectexecuteenable_load_extensionload_extensionr7  r  close)ro  tmp_dbs     r'   fts5_installedFTS5Model.fts5_installed  s    &&r*-DD ,	NNMN LLN	::,,T2%%f- 		""11&9 LLNFLLNsA   A B:"B";%B: B= "B7$B:%B= 7B::B= =Cc                     [         R                  U 5      nU HJ  nUR                  S5      (       a  UR                  S5      (       a  M1  [	        U5      [
        -  (       d  MJ    g   g)z
Simple helper function to indicate whether a search query is a
valid FTS5 query. Note: this simply looks at the characters being
used, and is not guaranteed to catch all problematic queries.
"FT)	_quote_refindall
startswithendswithr   _invalid_ascii)querytokenstokens      r'   validate_queryFTS5Model.validate_query  sW     ""5)E$$)<)<5zN**	 
 r)   r  c                    / nSn[         R                  U 5      nU H  nUR                  S5      (       a)  UR                  S5      (       a  UR	                  U5        MB  [        U5      nU[        -  nU(       a  SnU H  nUR                  X5      nM     UR	                  U5        M     U(       a  SR                  U5      $ U $ )z"
Clean a query of invalid tokens.
Fr  TrO  )	r  r  r  r  r|   r   r  r   rh   )	r  r   accumany_invalidr  r  	token_setinvalid_for_tokencs	            r'   clean_queryFTS5Model.clean_query  s    
 ""5)E$$)<)<U#E
I )N : "*A!MM!5E +LL  88E?"r)   c                 B    [        U R                  R                  U5      $ r  r  r  s     r'   r1  FTS5Model.match  r  r)   c                 D    U(       a  U R                   " U6 $ [        S5      $ )Nr  )r  r>   )ro  r%   s     r'   r  FTS5Model.rank  s    "&sxx7CK7r)   c                 X    [         R                  " U R                  R                  /UQ76 $ rG   )rv   r  r7  r@  )ro  r  s     r'   r  FTS5Model.bm25  s     wwsyy''2'22r)   Nc                 R    U R                  [        R                  U5      UUUU5      $ r  )r  r  r   r  s         r'   r  FTS5Model.search  s/     !!$' 	r)   c           
         U(       d  [        S5      nO[        U[        5      (       a  / nU R                  R                   Hg  n[        U[
        5      (       d  M  UR                  (       a  M-  UR                  UR                  XR                  UR                  S5      5      5        Mi     [        R                  " U R                  R                  /UQ76 nO+[        R                  " U R                  R                  /UQ76 nSn	Un
U(       a  XR                  U5      4n	U(       a  U(       d  [        U5      n
U R                  " U	6 R                  U R!                  ["        R%                  U5      5      5      R'                  U
5      $ )r  r  r  r*   )r>   rl   ru   r7  r8  r)  r+  r|   r{  r$   rv   r  r@  r  r  r  r1  r  r   r  )ro  r2  r  r  r  r  r  r  r^   r  r  s              r'   r  FTS5Model.search_bm25  s!    v;D&&K00e[11%///&&E;;uzz3+GHJ 1 77399++:k:D77399++6g6D	jj56I/;'H"$syy!6!6t!<=>(#	%r)   c           	      R   U R                   R                  nU/nU/nUR                  5        H0  u  pgUR                  [	        U5      5        UR                  U5        M2     [        [        S5      U R                   R                  [        U5      [        S5      [        U5      45      $ )NzINSERT INTOVALUES)r7  r@  itemsr|   r   r
   r>   r   )ro  r  extra_paramsr  columnsr  keyrR   s           r'   _fts_cmd_sqlFTS5Model._fts_cmd_sql  s    ii%&,,.JCNN6#;'MM%  / IIW%MV$& ' 	'r)   c                 r    U R                   " U40 UD6nU R                  R                  R                  U5      $ rG   )r2  r7  r  r  )ro  r  r/  r  s       r'   r  FTS5Model._fts_cmd	  s2      55yy!!))%00r)   c                 V    SUs=::  a  S::  d  O  [        S5      eU R                  SUS9$ )Nr   rK  zlevel must be between 0 and 16r  r  )r   r  )ro  levels     r'   r  FTS5Model.automerge  s.    U b =>>||Ke|44r)   c                 "    U R                  SUS9$ )Nr  r7  r  )ro  npagess     r'   r  FTS5Model.merge  s    ||G&|11r)   c                 $    U R                  S5      $ r  r  r  s    r'   r  FTS5Model.optimize  r  r)   c                 $    U R                  S5      $ r  r  r  s    r'   r  FTS5Model.rebuild  r  r)   c                 "    U R                  SUS9$ )Npgszr7  r  )ro  rB  s     r'   set_pgszFTS5Model.set_pgsz   s    ||F|..r)   c                 "    U R                  SUS9$ )Nr  r7  r  )ro  rank_expressions     r'   set_rankFTS5Model.set_rank$  s    ||F|99r)   c                 $    U R                  S5      $ )Nz
delete-allr  r  s    r'   
delete_allFTS5Model.delete_all(  s    ||L))r)   c                 "    U R                  SUS9$ )Nr  r7  r  )ro  r  s     r'   r  FTS5Model.integrity_check,  s    ||-D|99r)   c           	        ^ ^^ TS;  a  [        S5      eST-  n[        T U5      (       d   " U UU4S jS5      n[        [        5      [	        5       [	        5       [        5       US.nTS:X  a  [        [        5      US'   OTS:X  a  [        [        5      US	'   S
T R                  -  n[        T U[        U[        4U5      5        [        T U5      $ )N)rowcolinstancez5table_type must be either "row", "col" or "instance".z_vocab_model_%sc                      > \ rS rSr Y R                  R
                  r Y=(       d     Y R                  R                  S-   r\R                   Y R                  R                  \
"  Y5      5      rSrg)"FTS5Model.VocabModel.<locals>.Metai9  _vr*   N)r+   r,   r-   r.   r7  r  r}  rv   	fts5vocabr@  r>   rU  r1   )ro  table
table_types   r'   rm  rS  9  sN    99--"Acii&:&:T&A
#%<<II$$
O$% r)   rm  )r2  doccntr   rm  rP  rQ  offsetz%sVocab)r   r6  r   	TextFieldIntegerFieldr   r+   setattrr   rd  getattr)ro  rW  rV  attrrm  attrs
class_names   ```    r'   
VocabModelFTS5Model.VocabModel0  s    77 + , , !:-sD!!% % %Y/#~#~#E U"+I6ez)".|"<h"S\\1JCtJGHsD!!r)   r*   r  )r   )rO  N)!r+   r,   r-   r.   r  r   r   rm  r  rq  r  r  staticmethodr  r  r   r1  r  r  r  r  r2  r  r  r  r  r  rC  rG  rJ  r  rb  r1   r*   r)   r'   r  r  7  s   4n LE" "5FD	O E E  *   #&r7  . - - 8 8 3 3 FM!&  8=;@% %6 ' ' 1 1 5 5
 2 2 ( ( ' ' / / : : * * : : " "r)   r  MATCHc                 8    [        U [        R                  U5      $ rG   )r   r   re  )lhsr   s     r'   r1  r1  T  s    c288S))r)   ):rw   resyswarningspeeweer   r   r   r   r   r	   r
   r   r   r   r   playhouse.sqlite_udfr   r   r   r  r  r  r  r  	AutoFieldr   r5   r9   DecimalFieldrC   DateTimeFieldrM   rW   r   r[  r   r  r  r)  SchemaManagerrM  Modelrd  rs  r  	_alphabetr   upperr  r  ranger  compiler  r  re  r1  r*   r)   r'   <module>rv     s    	 
    #          % % 4 
222A6)C!KK# 9 91 1; ;"L "
%} %;7z ;7z7 7>]"	 ]"@- -.3% 3>1 1h
5 
< @L| L^ )	*+^"#$ #b'_	 KU3ZKKJJ:;	X" X"v *r)   