
    Vi                     z   S SK r 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JrJrJrJrJrJrJrJrJrJr  Sr\R>                  S    S:X  a  \ r!Sr"Sr#\b  \RH                  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      r0 " S% S&\05      r1 " S' S(\25      r3 " S) S*\45      r5 " S+ S,\65      r7 " S- S.\75      r8 " S/ S0\85      r9S1r:\;" S25      \;" \:5      -  \;" \:Ry                  5       5      -  \;" \=" S35      45      -  r>\;" S4 \?" S55       5       5      r@C:C>\R                  " S65      rB " S7 S8\85      rC  SRS9 jrD " S: S;\75      rES<\lF        S= rG " S> S?\H5      rI\(       a?  S rJS@rKSArLSrMSrNSBrOSCrPSDrQSErRSFrSS rTS@rUSArVSrWSrXSBrYSCrZSDr[SEr\SFr]SGr^SSSH jr_STSI jr` " SJ SK\I5      raSL rbSM rcSN rdSO reSP rfSQ rgg! \ a    Sr GNf = f)U    N)*)
ColumnBase)EnclosedNodeList)Entity)
Expression)Insert)Node)NodeList)OP)VirtualField)
merge_dict)sqlite3)backupbackup_to_fileBlobConnectionHelperregister_bloomfilterregister_hash_functionsregister_rank_functionssqlite_get_db_statussqlite_get_statusTableFunctionZeroBlobTF   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
$ )
RowIDField4   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       g/home/james-whalen/.local/share/pipx/venvs/semgrep/lib/python3.13/site-packages/playhouse/sqlite_ext.pyr)   RowIDField.bind8   sD    %%%"4j$*<*<> ? ?j$$U848     )__name__
__module____qualname____firstlineno__auto_incrementcolumn_namer,   r%   r)   __static_attributes____classcell__r.   s   @r/   r!   r!   4   s!    N)00K0$9 9r1   r!   c                        \ rS rSrS=r=rrSrg)
DocIDField?   docidr2   N)r3   r4   r5   r6   r8   r,   r%   r9   r2   r1   r/   r=   r=   ?   s    )00K0$r1   r=   c                   (   ^  \ rS rSrU 4S jrSrU =r$ )AutoIncrementFieldC   c                 V   > [         [        U ]  U5      n[        U[	        S5      45      $ )NAUTOINCREMENT)r(   rA   ddlr
   SQL)r*   ctx	node_listr.   s      r/   rE   AutoIncrementField.ddlD   s*    ,d7<	C$89::r1   r2   )r3   r4   r5   r6   rE   r9   r:   r;   s   @r/   rA   rA   C   s    ; ;r1   rA   c                       \ rS rSrSrS rSrg)TDecimalFieldI   TEXTc                     g Nr2   r*   s    r/   get_modifiersTDecimalField.get_modifiersK   s    Tr1   r2   N)r3   r4   r5   r6   
field_typerQ   r9   r2   r1   r/   rK   rK   I   s
    J!r1   rK   c                      ^  \ rS rSrSU 4S jj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$ )JSONPathN   c                 V   > [         [        U ]  5         Xl        U=(       d    SU l        g Nr2   )r(   rU   __init___field_path)r*   fieldpathr.   s      r/   rY   JSONPath.__init__O   s     h&(ZR
r1   c                 P    [        SSR                  U R                  5      -  5      $ )Nz$%s )Valuejoinr[   rP   s    r/   r]   JSONPath.pathT   s    URWWTZZ0011r1   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'   rZ   r[   )r*   idxitems      r/   __getitem__JSONPath.__getitem__X   sG    c33#:C<D3;DDz$++tzzTG';<<r1   c                     U(       d  [        U[        [        45      (       a.  [        R	                  U R
                  R                  U5      5      n[        R                  U R
                  U S   R                  U5      $ Nre   )	rf   listdictfnjsonrZ   _json_dumpsjson_setr]   r*   valueas_jsons      r/   appendJSONPath.append_   sQ    jt55GGDKK33E:;E{{4;;S	>>r1   c                     U(       d  [        U[        [        45      (       a.  [        R	                  U R
                  R                  U5      5      nU" U R
                  U R                  U5      $ rO   )rf   rn   ro   rp   rq   rZ   rr   r]   r*   funcru   rv   s       r/   _json_operationJSONPath._json_operationd   sI    jt55GGDKK33E:;EDKKE22r1   c                 B    U R                  [        R                  X5      $ rO   )r|   rp   json_insertrt   s      r/   insertJSONPath.inserti   s    ##BNNECCr1   c                 B    U R                  [        R                  X5      $ rO   )r|   rp   rs   rt   s      r/   setJSONPath.setl   s    ##BKK@@r1   c                 B    U R                  [        R                  X5      $ rO   )r|   rp   json_replacert   s      r/   replaceJSONPath.replaceo       ##BOOUDDr1   c                 |    U R                  [        R                  X R                  R	                  U5      5      5      $ rO   )r   rp   
json_patchrZ   rr   r*   ru   s     r/   updateJSONPath.updater   s)    xxdKK,C,CE,JKLLr1   c                 V    [         R                  U R                  U R                  5      $ rO   )rp   json_removerZ   r]   rP   s    r/   removeJSONPath.removeu   s    ~~dkk49955r1   c                 V    [         R                  U R                  U R                  5      $ rO   )rp   	json_typerZ   r]   rP   s    r/   r   JSONPath.json_typex       ||DKK33r1   c                 V    [         R                  U R                  U R                  5      $ rO   )rp   json_array_lengthrZ   r]   rP   s    r/   lengthJSONPath.length{   s    ##DKK;;r1   c                 V    [         R                  U R                  U R                  5      $ rO   )rp   	json_eachrZ   r]   rP   s    r/   childrenJSONPath.children~   r   r1   c                 V    [         R                  U R                  U R                  5      $ rO   )rp   	json_treerZ   r]   rP   s    r/   treeJSONPath.tree   r   r1   c                     UR                  U R                  (       a.  [        R                  U R                  U R
                  5      5      $ U R                  5      $ rO   )sqlr[   rp   json_extractrZ   r]   r*   rG   s     r/   __sql__JSONPath.__sql__   sC    ww** t{{DII> 7 	7*.++7 	7r1   )rZ   r[   rO   )r3   r4   r5   r6   rY   propertyr]   rj   rw   r|   r   r   r   r   r   r   r   r   r   r   r9   r:   r;   s   @r/   rU   rU   N   sf     
 2 2=?
3
DAEM64<447 7r1   rU   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      $ rm   )	rf   rn   ro   rp   jsonbrZ   rr   	jsonb_setr]   rt   s      r/   rw   JSONBPath.append   sQ    jt55HHT[[44U;<E||DKKc??r1   c                     U(       d  [        U[        [        45      (       a.  [        R	                  U R
                  R                  U5      5      nU" U R
                  U R                  U5      $ rO   )rf   rn   ro   rp   r   rZ   rr   r]   rz   s       r/   r|   JSONBPath._json_operation   sI    jt55HHT[[44U;<EDKKE22r1   c                 B    U R                  [        R                  X5      $ rO   )r|   rp   jsonb_insertrt   s      r/   r   JSONBPath.insert   r   r1   c                 B    U R                  [        R                  X5      $ rO   )r|   rp   r   rt   s      r/   r   JSONBPath.set   s    ##BLL%AAr1   c                 B    U R                  [        R                  X5      $ rO   )r|   rp   jsonb_replacert   s      r/   r   JSONBPath.replace   s    ##B$4$4eEEr1   c                 |    U R                  [        R                  X R                  R	                  U5      5      5      $ rO   )r   rp   jsonb_patchrZ   rr   r   s     r/   r   JSONBPath.update   s)    xxt[[-D-DU-KLMMr1   c                 V    [         R                  U R                  U R                  5      $ rO   )rp   jsonb_removerZ   r]   rP   s    r/   r   JSONBPath.remove   s    t{{DII66r1   c                     UR                  U R                  (       a.  [        R                  U R                  U R
                  5      5      $ U R                  5      $ rO   )r   r[   rp   jsonb_extractrZ   r]   r   s     r/   r   JSONBPath.__sql__   sE    ww** ''TYY? 7 	7*.++7 	7r1   r2   rO   )r3   r4   r5   r6   rw   r|   r   r   r   r   r   r   r9   r2   r1   r/   r   r      s/    @
3
EBFN77r1   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   JSONFc                    > U=(       d    [         R                  U l        U=(       d    [         R                  U l        [
        [        U ]  " S0 UD6  g rX   )rq   dumpsrr   loads_json_loadsr(   r   rY   )r*   
json_dumps
json_loadskwargsr.   s       r/   rY   JSONField.__init__   s7    %3%3i'1&1r1   c                 ^    Ub   U R                  U5      $ g ! [        [        4 a    Us $ f = frO   )r   	TypeErrorr&   r   s     r/   python_valueJSONField.python_value   s>    ''..  z* s    ,,c                     Ub;  [        U[        5      (       d$  [        R                  U R	                  U5      5      nU$ g rO   )rf   r	   rp   rq   rr   r   s     r/   db_valueJSONField.db_value   s8    eT** 0 0 78L r1   c                    ^  U 4S jnU$ )Nc                 |   > [        U[        [        45      (       a  [        XR                  SS9n[        U TU5      $ )NF)	converterunpack)rf   rn   ro   ra   r   r   )r*   rhsops     r/   innerJSONField._e.<locals>.inner   s3    #d|,,C==GdB,,r1   r2   )r   r   s   ` r/   _eJSONField._e   s    	- r1   c                 *    U R                  U 5      U   $ rO   )Path)r*   ri   s     r/   rj   JSONField.__getitem__   s    yyt$$r1   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r   )ra   rp   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   ra   r*   r]   s     r/   extract_jsonJSONField.extract_json   s    $eDE&BCCr1   c           	      ,    [        U S[        USS95      $ )Nz->>Fr   r   r   s     r/   extract_textJSONField.extract_text   s    $uTU'CDDr1   c                 B    U R                  U 5      R                  X5      $ rO   )r   rw   rt   s      r/   rw   JSONField.append       yy%%e55r1   c                 B    U R                  U 5      R                  X5      $ rO   )r   r   rt   s      r/   r   JSONField.insert   r   r1   c                 B    U R                  U 5      R                  X5      $ rO   )r   r   rt   s      r/   r   JSONField.set   s    yy""522r1   c                 B    U R                  U 5      R                  X5      $ rO   )r   r   rt   s      r/   r   JSONField.replace   s    yy&&u66r1   c                 B    U R                  U 5      R                  U5      $ rO   )r   r   )r*   datas     r/   r   JSONField.update   s    yy%%d++r1   c                 |    U(       d  U R                  U 5      R                  5       $ [        R                  " U /UQ76 $ rO   )r   r   rp   r   r*   r   s     r/   r   JSONField.remove   s0    99T?))++~~d+U++r1   c                 ,    [         R                  U 5      $ rO   )rp   r   rP   s    r/   r   JSONField.json_type       ||D!!r1   c                 B    U(       a  X4OU 4n[         R                  " U6 $ rO   )rp   r   )r*   r]   r-   s      r/   r   JSONField.length   s     #|$##T**r1   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)
)rp   r   rP   s    r/   r   JSONField.children   s     ||D!!r1   c                 ,    [         R                  U 5      $ rO   )rp   r   rP   s    r/   r   JSONField.tree  r  r1   )rr   r   )NNrO   )+r3   r4   r5   r6   rS   r   rU   r   rY   r   r   r   r   EQ__eq__NE__ne__GT__gt__GTE__ge__LT__lt__LTE__le__Field__hash__rj   r   r   r   rw   r   r   r   r   r   r   r   r   r   r9   r:   r;   s   @r/   r   r      s    JFD2
 YFYFYFZFYFZF~~H%-DE6637,,
"+""" "r1   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 rO   )rf   r	   rp   r   rr   r   s     r/   r   JSONBField.db_value  s8    eT**!1!1%!89L r1   c                 ,    [         R                  U 5      $ rO   )rp   rq   rP   s    r/   rq   JSONBField.json  s    wwt}r1   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   )ra   rp   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 $ rO   )r   r   rp   r   r  s     r/   r   JSONBField.remove  s0    99T?))++t,e,,r1   r2   N)r3   r4   r5   r6   rS   r   r   r   rq   r   r   r9   r2   r1   r/   r  r    s     JD.-r1   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)	unindexedr8   null)r&   sortedr(   r'  rY   )r*   r)  r8   kr.   s       r/   rY   SearchField.__init__  s@     .06q	: ; ;k4)I6A 	* 	Nr1   c                     [        X5      $ rO   )match)r*   terms     r/   r/  SearchField.match&  s    T  r1   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_fieldsrf   r'  r,   indexr3  )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      $ rO   )r:  rp   	highlightr+   r5  entity)r*   leftright
column_idxs       r/   r=  SearchField.highlight1  s0    **
||DJJ,,33ZuMMr1   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:  rp   snippetr+   r5  r>  )r*   r?  r@  over_length
max_tokensrA  s         r/   rE  SearchField.snippet5  sP    J##NOO**
zz$****11:U%3 	3r1   )r3  )FN)z...   )r3   r4   r5   r6   rY   r/  r   r:  r=  rE  r9   r:   r;   s   @r/   r'  r'    s2    N! & &N3 3r1   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   r5  options_create_contextliteralr   extension_modulerf   r	   rF   prefix_argumentsextendr6  r!   _hiddenr   r8   r)  rw   r
   	arguments_create_table_option_sqlr   )
r*   saferP  rG   
ext_modulerW  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$ rO   )
issubclassr+   VirtualModelr^  r(   rK  _create_table)r*   rY  rP  r.   s      r/   rc  'VirtualTableSchemaManager._create_tablei  sJ    djj,//--d>g>>.C 	r1   r2   T)r3   r4   r5   r6   r^  rc  r9   r:   r;   s   @r/   rK  rK  =  s    )4V r1   rK  c                   8    \ rS rSr " S S5      r\S 5       rSrg)rb  iq  c                   (    \ rS rSrSrSrSrSr\r	Sr
g)VirtualModel.Metair  NFr2   )r3   r4   r5   r6   rW  rS  rT  primary_keyrK  schema_manager_classr9   r2   r1   r/   Metarh  r  s    	8r1   rk  c                     U$ rO   r2   )clsrP  s     r/   rO  VirtualModel.clean_optionsy  s    r1   r2   N)r3   r4   r5   r6   rk  classmethodrO  r9   r2   r1   r/   rb  rb  q  s     9 9  r1   rb  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[        5      (       a  US:X  a  SUS'   OL[        U[        5      (       a7  [	        UR
                  R                  R                  UR                  5      US'   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tokenizer`   z'',z'%s'z' fts5"%s")getrf   
basestringr  r   r+   r5  
table_namer8   rn   tuplerb   strstriprS  lower)rm  rP  rs  rt  ru  is         r/   rO  BaseFTSModel.clean_options  s   ++i(X&;;z*gz**w"}!%GI''!'(;(;(F(F(/(;(;"=GI &4-006":6a3q66":; &d); ;GH		2288:fD #)8"3GJ #;s   D>r2   N)r3   r4   r5   r6   ro  rO  r9   r2   r1   r/   rq  rq  ~  s     r1   rq  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%sr2   N)r3   r4   r5   r6   FTS_VERSIONrS  r9   r2   r1   r/   rk  r    s    "[0r1   rk  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');)r5  r{  databaseexecute_sqlfetchone)rm  cmdtblress       r/   _fts_cmdFTSModel._fts_cmd  sB    ii""ii  ,,25sC@B||~r1   c                 $    U R                  S5      $ Noptimizer  rm  s    r/   r  FTSModel.optimize      ||J''r1   c                 $    U R                  S5      $ Nrebuildr  r  s    r/   r  FTSModel.rebuild      ||I&&r1   c                 $    U R                  S5      $ )Nintegrity-checkr  r  s    r/   integrity_checkFTSModel.integrity_check  s    ||-..r1   c                 4    U R                  SU< SU< 35      $ )Nzmerge=rv  r  )rm  blockssegmentss      r/   mergeFTSModel.merge  s    ||VX>??r1   c                 N    U R                  SU=(       a    S=(       d    S-  5      $ )Nzautomerge=%s10r  )rm  states     r/   	automergeFTSModel.automerge  s    ||Nem.BsCDDr1   c                 B    [        U R                  R                  U5      $ zE
Generate a `MATCH` expression appropriate for searching this table.
r/  r5  r>  rm  r0  s     r/   r/  FTSModel.match      
 SYY%%t,,r1   c                     [         R                  U R                  R                  [        5      n[         R
                  " U/UQ76 $ rO   )rp   	matchinfor5  r>  FTS3_MATCHINFOfts_rank)rm  weightsr  s      r/   rankFTSModel.rank  s0    LL!1!1>B	{{9/w//r1   c                     [         R                  U R                  R                  [        5      n[         R
                  " U/UQ76 $ rO   )rp   r  r5  r>  FTS4_MATCHINFOfts_bm25rm  r  
match_infos      r/   bm25FTSModel.bm25  s0    \\#))"2"2NC
{{:000r1   c                     [         R                  U R                  R                  [        5      n[         R
                  " U/UQ76 $ rO   )rp   r  r5  r>  r  	fts_bm25fr  s      r/   bm25fFTSModel.bm25f  s0    \\#))"2"2NC
||J111r1   c                     [         R                  U R                  R                  [        5      n[         R
                  " U/UQ76 $ rO   )rp   r  r5  r>  r  
fts_lucener  s      r/   luceneFTSModel.lucene  s0    \\#))"2"2NC
}}Z2'22r1   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      ?r2   )rf   ro   r5  r6  ry  r,   rw   aliasrF   selectwherer/  order_by)rm  r0  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'(#	%r1   Nc                 B    U R                  UUUUU R                  U5      $ 'Full-text search using selected `term`.)r  r  rm  r0  r  r  r  r  s         r/   searchFTSModel.search  +     {{HH 	r1   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  r1   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 	r1   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 	r1   r2   )      re  NFscoreF)r3   r4   r5   r6   __doc__r=   r?   rk  ro  r  r  r  r  r  r  r/  r  r  r  r  r  r  r  r  r  r9   r2   r1   r/   r  r    sv    LE1 1   ( ( ' ' / / @ @ E E - - 0 0 1 1 2 2 3 3 % %6 FM!&	 	 8=;@	 	 9><A	 	 :?=B	 	r1   r  abcdefghijklmnopqrstuvwxyzz	 ,"(){}*:_+0123456789   c              #   b   #    U  H%  n[        U5      [        ;  d  M  [        U5      v   M'     g 7frO   )chr	_alphanum).0r   s     r/   	<genexpr>r  .  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)#	FTS5Modeli4  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.Metain  rw  r2   Nr3   r4   r5   r6   rS  r9   r2   r1   r/   rk  r  n  s    !r1   rk  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)rS   r7  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  rS   r7  )r5  ri  r,   ImproperlyConfigured_error_messagesfieldsvaluesrf   r'  r!   indexes)rm  r\   s     r/   validate_modelFTS5Model.validate_modelx  s     99  %%0&s':':4'@AAYY%%,,.Eek:%>??*3+>+>|+LMM / 99&s':':7'CDD r1   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);Trw  )
r   sqlite_version_infoFTS5_MIN_SQLITE_VERSIONconnectexecuteenable_load_extensionload_extensionr5  r  close)rm  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**	 
 r1   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  TrM  )	r  r  r  r  rw   r   r  r   rb   )	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?"r1   c                 B    [        U R                  R                  U5      $ r  r  r  s     r/   r/  FTS5Model.match  r  r1   c                 D    U(       a  U R                   " U6 $ [        S5      $ )Nr  )r  rF   )rm  r-   s     r/   r  FTS5Model.rank  s    "&sxx7CK7r1   c                 X    [         R                  " U R                  R                  /UQ76 $ rO   )rp   r  r5  r>  )rm  r  s     r/   r  FTS5Model.bm25  s     wwsyy''2'22r1   Nc                 R    U R                  [        R                  U5      UUUU5      $ r  )r  r  r   r  s         r/   r  FTS5Model.search  s/     !!$' 	r1   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  r2   )rF   rf   ro   r5  r6  r'  r)  rw   ry  r,   rp   r  r>  r  r  r  r/  r  r   r  )rm  r0  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!<=>(#	%r1   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)r5  r>  itemsrw   r   r
   rF   r   )rm  r  extra_paramsr  columnsr  keyru   s           r/   _fts_cmd_sqlFTS5Model._fts_cmd_sql  s    ii%&,,.JCNN6#;'MM%  / IIW%MV$& ' 	'r1   c                 r    U R                   " U40 UD6nU R                  R                  R                  U5      $ rO   )r2  r5  r  r  )rm  r  r/  r  s       r/   r  FTS5Model._fts_cmd  s2      55yy!!))%00r1   c                 V    SUs=::  a  S::  d  O  [        S5      eU R                  SUS9$ )Nr   rI  zlevel must be between 0 and 16r  r  )r&   r  )rm  levels     r/   r  FTS5Model.automerge  s.    U b =>>||Ke|44r1   c                 "    U R                  SUS9$ )Nr  r7  r  )rm  npagess     r/   r  FTS5Model.merge  s    ||G&|11r1   c                 $    U R                  S5      $ r  r  r  s    r/   r  FTS5Model.optimize  r  r1   c                 $    U R                  S5      $ r  r  r  s    r/   r  FTS5Model.rebuild  r  r1   c                 "    U R                  SUS9$ )Npgszr7  r  )rm  rB  s     r/   set_pgszFTS5Model.set_pgsz  s    ||F|..r1   c                 "    U R                  SUS9$ )Nr  r7  r  )rm  rank_expressions     r/   set_rankFTS5Model.set_rank!  s    ||F|99r1   c                 $    U R                  S5      $ )Nz
delete-allr  r  s    r/   
delete_allFTS5Model.delete_all%  s    ||L))r1   c                 "    U R                  SUS9$ )Nr  r7  r  )rm  r  s     r/   r  FTS5Model.integrity_check)  s    ||-D|99r1   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>.Metai6  _vr2   N)r3   r4   r5   r6   r5  r  r{  rp   	fts5vocabr>  rF   rS  r9   )rm  table
table_types   r/   rk  rS  6  sN    99--"Acii&:&:T&A
#%<<II$$
O$% r1   rk  )r0  doccntr#   rk  rP  rQ  offsetz%sVocab)r&   r4  r   	TextFieldIntegerFieldr!   r3   setattrr'   rb  getattr)rm  rW  rV  attrrk  attrs
class_names   ```    r/   
VocabModelFTS5Model.VocabModel-  s    77 + , , !:-sD!!% % %Y/#~#~#E U"+I6ez)".|"<h"S\\1JCtJGHsD!!r1   r2   r  )r   )rO  N)!r3   r4   r5   r6   r  r!   r#   rk  r  ro  r  r  staticmethodr  r  r   r/  r  r  r  r  r2  r  r  r  r  r  rC  rG  rJ  r  rb  r9   r2   r1   r/   r  r  4  s   4n LE" "5FD	O E E  *   #&r7  . - - 8 8 3 3 FM!&  8=;@% %6 ' ' 1 1 5 5
 2 2 ( ( ' ' / / : : * * : : " "r1   r  c                 N  ^ ^^^^ Tc  T mTc;  T R                   R                   H  nUR                  T L d  M  Um  O   [        S5      eT R                   R                  mTc  Tm " UU UUU4S jS[
        5      n " UUU4S jS5      nST R                  -  n[        Xu4SU05      $ )z3Model factory for the transitive closure extension.z,Unable to find self-referential foreign key.c                      > \ rS rSr\" \5      r\" \5      r\" \5      r	\" \5      r
\" \5      r\" \5      r " S S5      r\S	UU4S jj5       r\S	UU4S jj5       r\S
U UUUU4S jj5       rSrg)&ClosureTable.<locals>.BaseClosureTableia  c                       \ rS rSrSrSrg)+ClosureTable.<locals>.BaseClosureTable.Metaii  transitive_closurer2   Nr  r2   r1   r/   rk  ri  i  s    3r1   rk  Nc                 x  > TR                  TU R                  R                  S5      5      R                  U TU R                  :H  S9R                  U R                  U:H  5      R                  5       nUb   UR                  U R                  U:H  5      nU$ U(       d  UR                  U R                  S:  5      nU$ Ndepthonr   )r  rm  r  rb   idr  rootobjectsrm  noderm  include_noder  model_class
source_keys        r/   descendants2ClosureTable.<locals>.BaseClosureTable.descendantsl  s     f[#))//'*BCd3J#&&$8d:eCHH,-gi	 
  CII$67 L "CIIM2Lr1   c                   > TR                  TU R                  R                  S5      5      R                  U TU R                  :H  S9R                  U R                  U:H  5      R                  5       nU(       a   UR                  U R                  U:H  5      nU$ U(       d  UR                  U R                  S:  5      nU$ rl  )r  rm  r  rb   rq  r  rp  rr  rs  s        r/   	ancestors0ClosureTable.<locals>.BaseClosureTable.ancestorsy  s     f[#))//'*BCd3J#(($:d<eCFFdN+gi	 
 CII$67 L "CIIM2Lr1   c                   > TTL aH  UR                   R                  TR                  5      nTR                  5       R	                  TU:H  5      nOTR                  T	5      R                  U TU R                  :H  S9R	                  U R                  U:H  U R                  S:H  -  5      nTR                  5       R	                  T
U-  5      R                  5       nU(       d  UR	                  T
U:g  5      nU$ )Nrn     )
__data__ry  r,   r  r  rb   rq  rp  rm  rr  )rm  rt  ru  fk_valuer  siblingsforeign_keyrv  referencing_classreferencing_keyrw  s         r/   r  /ClosureTable.<locals>.BaseClosureTable.siblings  s     K/==,,[-=-=>#**,22;(3JK .#VO4!T#;#((+BTD"UCFFdNsyyA~#FG  % &(%
h 67!') 
  J$$67Lr1   r2   NFF)r3   r4   r5   r6   r   r\  rm  rp  r[  idcolumnparentcolumnrq  	tablenamerk  ro  rx  r{  r  r9   )r  rv  r  r  rw  s   r/   BaseClosureTablerg  a  s    \*,'	*#I.L) +		4 	4 

	 

	 

	 

	 
	 	 
	r1   r  c                      > \ rS rSr YR                  R
                  r YR                  R                   YR                   Y R                  S.rSr	Sr
g)ClosureTable.<locals>.Metai  )r  r  r  Fr2   N)r3   r4   r5   r6   r5  r  r{  r8   rP  ri  r9   )r  r  r  s   r/   rk  r    sC    $**33*00;;'33'335 r1   rk  z	%sClosure)r5  refs	rel_modelr&   ri  rb  r3   r'   )	rv  r  r  r  	field_objr  rk  r,   rw  s	   ````    @r/   ClosureTabler  O  s      '$**//I""k1' 0
 KLL""..J$; ;< ;z  ---D)FD>::r1   c                       \ rS rSr " S S5      r\S 5       r\SS j5       r\S 5       r	\S 5       r
\S 5       r\S	 5       r\S
 5       rSrg)LSMTablei  c                       \ rS rSrSrSrSrg)LSMTable.Metai  lsm1Nr2   )r3   r4   r5   r6   rS  filenamer9   r2   r1   r/   rk  r    s    !r1   rk  c                    U R                   R                  nU(       d  [        S5      e[        U5      S:  a  US   S:w  a  SU-  nU R                   R                  (       d  [        S5      eU R                   R                  n[        U[        5      (       a  [        S5      e[        U[        [        [        45      (       d  [        S5      eS	Ul
        [        U[        5      (       a  S
nO[        U[        5      (       a  SnOSnUSUR                  -  U/U R                   l        [        U R                   R                  5      S:X  a*  U R                   R                  S   U R                   l        U$ S U R                   l        U$ )NzILSM1 extension requires that you specify a filename for the LSM database.   r   r  rx  z-LSM1 models must specify a primary-key field.z8LSM1 models must explicitly declare a primary key field.z9LSM1 key must be a TextField, BlobField, or IntegerField.TUINTBLOBrM   r~  )r5  r  r&   lenri  rf   	AutoFieldr[  	BlobFieldr\  rV  r,   rT  r6  _value_field)rm  rP  r  r1  	data_types        r/   rO  LSMTable.clean_options  sP   99%% > ? ? 8}!hqkS&8!H,yy$$LMMii##c9%% * + +#	9lCDD - . .c<((IY''II&.0A9%M		" syy&&'1,%(YY%<%<Q%?CII"  &*CII"r1   c                 N    U R                   R                  R                  U5        g rO   )r5  r  r	  )rm  r]   s     r/   r	  LSMTable.load_extension  s    		))$/r1   c                     UR                   b3  UR                  b&  U R                  UR                   UR                  5      $ UR                   b  XR                   :  $ UR                  b  XR                  :*  $ g rO   )startstopbetween)r1  rh   s     r/   slice_to_exprLSMTable.slice_to_expr  s`    99 SXX%9;;syy#((33YY"))##XX!((?" "r1   c                     [        U[        5      (       a-  [        R                  X5      nUb  U R	                  U5      n U S4$ [        U[
        5      (       a  U R	                  U5      S4$ U R	                  X:H  5      S4$ NFT)rf   slicer  r  r  r   )r  r1  lookupexprs       r/   _apply_lookup_to_queryLSMTable._apply_lookup_to_query  st    fe$$))#6DD)%<
++;;v&--;;s}-t33r1   c                     U R                  U R                  5       R                  5       U R                  R                  U5      u  p#U(       a.  UR                  5       nU R                  R                  b  US   $ U$ U$ Nr~  )r  r  namedtuplesr5  ri  ry  r  )rm  r  r  	is_singlerO  s        r/   	get_by_idLSMTable.get_by_id  sj    55JJL$$&II!!
 ))+C YY33?3q6HSHLr1   c                    U R                   R                  b  U R                   R                  U0nO|[        U[        5      (       a3  0 n[	        U R                   R
                  SS  U5       H	  u  pEXSU'   M     O4[        U[        5      (       a  UnO[        X 5      (       a  UR                  nUWU R                   R                  '   U R                  U5      R                  5         g r  )r5  r  rf   r|  zipr6  ro   __dict__ri  r   r  )rm  r1  ru   r   r\   fvals         r/   	set_by_idLSMTable.set_by_id  s    99!!-II**E2Du%%D"399#:#:12#>F"U  Gt$$D##>>D&)SYY""#D!!#r1   c                     U R                  U R                  5       U R                  R                  U5      u  p#UR	                  5       $ rO   )r  deleter5  ri  r  )rm  r  r  r  s       r/   delete_by_idLSMTable.delete_by_id  s<    55JJLII!! }}r1   r2   N)zlsm.so)r3   r4   r5   r6   rk  ro  rO  r	  rd  r  r  r  r  r  r9   r2   r1   r/   r  r    s      ! !F 0 0 # # 	4 	4 
 
 $ $  r1   r  MATCHc                 2    [         R                  " X5      S L$ rO   )rer  )regexru   s     r/   _sqlite_regexpr    s    99U"$..r1   c                   D   ^  \ rS rSr   SU 4S jjrU 4S jrS rSrU =r$ )SqliteExtDatabasei  c                   > [         [        U ]
  " U/UQ70 U	D6  S U l        U(       a  [        (       d  [        S5      e[        =(       a    USLn
U(       ak  U
(       a  [        U 5        OXU R                  [        S5        U R                  [        S5        U R                  [        S5        U R                  [        S5        U(       a  U
(       d  [        S5      e[        U 5        U(       a  U R                  [        SS	5        U(       a  U
(       d  [        S
5      e[        U 5        U(       a  U R                  [        S5        Xl        g )NzRSqliteExtDatabase initialized with C extensions, but shared library was not found!Fr  r  r  r  z0C extension required to register hash functions.regexpr  z(C extension required to use bloomfilter.json_contains)r(   r  rY   _row_factoryCYTHON_SQLITE_EXTENSIONSr  r   register_functionr  r  r&   r   r  r   _json_contains_c_extensions)r*   r  c_extensionsrank_functionshash_functionsregexp_functionbloomfilterr  r-   r   prefer_cr.   s              r/   rY   SqliteExtDatabase.__init__  s	    	/J4J6J  8 8& (4 5 5 ,KU1J'-&&tZ8&&tZ8&&t[9&&t\:  ". / /#D)"">8Q? !KLL &"">?C%r1   c                 r   > [         [        U ]  U5        U R                  (       a  U R                  Ul        g g rO   )r(   r  _add_conn_hooksr  row_factoryr*   connr.   s     r/   r  !SqliteExtDatabase._add_conn_hooks;  s/    6t<#00D r1   c                     Xl         g rO   )r  r*   rp   s     r/   r  SqliteExtDatabase.row_factory@  s    r1   )r  r  )NTFFFF)	r3   r4   r5   r6   rY   r  r  r9   r:   r;   s   @r/   r  r    s!    CG7<27!&F1
 r1   r  r~  r        r   r  r   
   c                 *   ^ ^ U U4S jn[        U5      $ )z\
Expose a sqlite3_status() call for a particular flag as a property of
the Database object.
c                 6   > [        T5      nT(       a  US   $ U$ r  )r   )r*   resultflagreturn_highwaters     r/   getter__status__.<locals>.gettera  s    &t,F 06!9<f<r1   r   )r  r  r  s   `` r/   
__status__r  \  s    
	= r1   c                 .   ^ ^^ U UU4S jn[        U5      $ )z
Expose a sqlite3_dbstatus() call for a particular flag as a property of
the Database instance. Unlike sqlite3_status(), the dbstatus properties
pertain to the current connection.
c                    > U R                   R                  c  [        S5      e[        U R                   R                  T5      nT(       a  US   $ T(       a  US   $ U$ )Nzdatabase connection not opened.r   r~  )_stater  r  r   )r*   r  r  return_currentr  s     r/   r  __dbstatus__.<locals>.getterl  sS    {{'*+LMM)$++*:*:DAFay  06!9<f<r1   r  )r  r  r  r  s   ``` r/   __dbstatus__r  f  s    	= r1   c                     ^  \ rS rSrU 4S jrSU 4S jjrU 4S jrU 4S jrS rS r	S	 r
S
 r\S 5       r\S 5       rSS jr  SS jrSS jr\" \5      r\" \S5      r\" \5      r\" \5      r\" \5      r\" \S5      r\" \5      r \" \!5      r"\" \#S5      r$\%" \&5      r'\%" \(S5      r)\%" \*S5      r+\%" \,S5      r-\%" \.SS5      r/\%" \0SS5      r1\%" \2SS5      r3\%" \4SS5      r5\%" \6SS5      r7\%" \8SS5      r9Sr:U =r;$ )CSqliteExtDatabaseiu  c                 t   > S U l         S =U l        =U l        U l        SU l        [
        [        U ]  " U0 UD6  g r  )_conn_helper_commit_hook_rollback_hook_update_hook_replace_busy_handlerr(   r  rY   )r*   r-   r   r.   s      r/   rY   CSqliteExtDatabase.__init__v  s@     $DJNNDN 3d6G).D&$d4dEfEr1   Fc                 <   > [         [        U ]
  " U40 UD6  X l        g rO   )r(   r  initr  )r*   r  replace_busy_handlerr   r.   s       r/   r  CSqliteExtDatabase.init|  s    $d0DVD)=&r1   c                 2  > U R                   (       a  U R                  R                  S 5        U R                  (       a  U R                  R	                  S 5        U R
                  (       a  U R                  R                  S 5        [        [        U ]'  U5      $ rO   )
r  r  set_commit_hookr  set_rollback_hookr  set_update_hookr(   r  _closer  s     r/   r  CSqliteExtDatabase._close  sm      !!11$7""!!33D9  !!11$7+T9$??r1   c                   > [         [        U ]  U5        [        U5      U l        U R
                  b%  U R                  R                  U R
                  5        U R                  b%  U R                  R                  U R                  5        U R                  b%  U R                  R                  U R                  5        U R                  (       a4  U R                  =(       d    SnU R                  R                  US-  5        g g )Nr  i  )r(   r  r  r   r  r  r   r  r  r  r  r  _timeoutset_busy_handler)r*   r  timeoutr.   s      r/   r  "CSqliteExtDatabase._add_conn_hooks  s    $d;DA 0 6D  ,!!11$2C2CD"".!!33D4G4GH  ,!!11$2C2CD))--,1!!227T>B *r1   c                 r    Xl         U R                  5       (       d  U R                  R                  U5        U$ rO   )r  	is_closedr  r   r  s     r/   	on_commitCSqliteExtDatabase.on_commit  .     ">>##!!11"5Ir1   c                 r    Xl         U R                  5       (       d  U R                  R                  U5        U$ rO   )r  r  r  r  r  s     r/   on_rollbackCSqliteExtDatabase.on_rollback  s.    "$>>##!!33B7Ir1   c                 r    Xl         U R                  5       (       d  U R                  R                  U5        U$ rO   )r  r  r  r  r  s     r/   	on_updateCSqliteExtDatabase.on_update  r  r1   c                 6    U R                   R                  5       $ rO   )r  changesrP   s    r/   r  CSqliteExtDatabase.changes  s    $$,,..r1   c                 6    U R                   R                  5       $ rO   )r  last_insert_rowidrP   s    r/   r  $CSqliteExtDatabase.last_insert_rowid  s    $$6688r1   c                 6    U R                   R                  5       $ rO   )r  
autocommitrP   s    r/   r  CSqliteExtDatabase.autocommit  s    $$//11r1   c                 R    [        U R                  5       UR                  5       X#US9$ N)pagesr,   progress)r   
connection)r*   destinationr   r,   r!  s        r/   r   CSqliteExtDatabase.backup  s*    $//+[-C-C-E %8E Er1   c                 4    [        U R                  5       XX4S9$ r  )r   r"  )r*   r  r   r,   r!  s        r/   r   !CSqliteExtDatabase.backup_to_file  s    !$//"3X'+@ @r1   c                     [        XX#U5      $ rO   )r   )r*   rV  columnr#   	read_onlys        r/   	blob_openCSqliteExtDatabase.blob_open  s    VI>>r1   T)r  r  r  r  r  r  NNN)<r3   r4   r5   r6   rY   r  r  r  r  r  r  r  r   r  r  r   r   r*  r  SQLITE_STATUS_MEMORY_USEDmemory_usedSQLITE_STATUS_MALLOC_SIZEmalloc_sizeSQLITE_STATUS_MALLOC_COUNTmalloc_countSQLITE_STATUS_PAGECACHE_USEDpagecache_used SQLITE_STATUS_PAGECACHE_OVERFLOWpagecache_overflowSQLITE_STATUS_PAGECACHE_SIZEpagecache_sizeSQLITE_STATUS_SCRATCH_USEDscratch_usedSQLITE_STATUS_SCRATCH_OVERFLOWscratch_overflowSQLITE_STATUS_SCRATCH_SIZEscratch_sizer  SQLITE_DBSTATUS_LOOKASIDE_USEDlookaside_usedSQLITE_DBSTATUS_LOOKASIDE_HITlookaside_hit#SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZElookaside_miss#SQLITE_DBSTATUS_LOOKASIDE_MISS_FULLlookaside_miss_fullSQLITE_DBSTATUS_CACHE_USED
cache_usedSQLITE_DBSTATUS_SCHEMA_USEDschema_usedSQLITE_DBSTATUS_STMT_USEDstatement_usedSQLITE_DBSTATUS_CACHE_HIT	cache_hitSQLITE_DBSTATUS_CACHE_MISS
cache_missSQLITE_DBSTATUS_CACHE_WRITEcache_writer9   r:   r;   s   @r/   r  r  u  st   	F	>	@	C				/ 
	9 
	9 
	2 
	2	E =A$(	@
	? !!:; !:DA!"<=#$@A'(HI#$@$G!"<=%&DE!"<dC &&DE$%BDI%&I&*,*+N+/1!"<eTJ
 ##>tL%&?M !:E4H	!"<eTJ
"#>tLr1   r  c                 8    [        U [        R                  U5      $ rO   )r   r   r  )lhsr   s     r/   r/  r/    s    c288S))r1   c           
          [        U 5      n[        SUS5       Vs/ s H"  n[        R                  " SXUS-    5      S   PM$     sn$ s  snf )Nr   r   z@I)r  rangestructr   )bufbufsizer  s      r/   _parse_match_inforZ    sF    #hG8=a!8LM8L1FMM$ac
+A.8LMMMs   )Ac                 \    U(       d  S/U -  $ S/U -  n[        U5       H	  u  p4XBU'   M     U$ )Nr~  r   )	enumerate)ncolraw_weightsr  r  weights        r/   get_weightsr`    s9    sTz#*";/IAAJ 0Nr1   c                    [        U 5      nSnUS S u  pE[        XQ5      n[        U5       HY  nSXu-  S-  -   n[        U5       H=  n	Xi   n
U
(       d  M  XS-  -   nX+   nX+S-      nUS:  d  M*  X:[        U5      U-  -  -  nM?     M[     U* $ )N        r  r   r~  r   )rZ  r`  rV  float)raw_match_infor^  r  r  r   r  r  
phrase_numphrase_info_idxcol_numr_  col_idxrow_hitsall_rows_hitss                 r/   r  r    s     #>2JEbq>DA!)G Ah
z~12QxG%F%15G "*H&{3M!|5?]#BCC   $ 6Mr1   c                 F   [        U 5      nSnSnSn[        S5      u  pgpX&   n
X'   nX(   nX-   nX-   n[        X5      n[        U
5       H  n[        U5       H  nUU   nUS:X  a  M  USUUU-  -   -  -   n[        UU   5      n[        UUS-      5      n[        R
                  " UU-
  S-   US-   -  5      nUS::  a  S	n[        X-U-      5      n[        X)U-      5      =(       d    S
nUU-  nUUS
-   -  nS
U-
  UU-  -   nUUU-  -   nUUU-  -  nUUU-  -  nM     M     U* $ )z
Usage:

    # Format string *must* be pcnalx
    # Second parameter to bm25 specifies the index of the column, on
    # the table being queries.
    bm25(matchinfo(document_tbl, 'pcnalx'), 1) AS rank
g333333?g      ?rb  r   r   r   r  g      ?gư>r  )rZ  rV  r`  rc  mathlog)rd  r-   r  KBr  P_OC_ON_OA_O
term_count	col_count
total_docsL_OX_Or  r  jr_  xterm_frequencydocs_with_termidf
doc_length
avg_lengthrationumb_partdenompc_scores                                 r/   r  r    s    #>2JAAEqCcJIJ
/C
/C: )*G:y!AQZF{qAI-./A":a=1N":a!e#45N ((.036#c)+,C czz'23Jz'239rJ+E AG,C1WE	*F"a&j1EcEk*Hh'(E3 " 8 6Mr1   c                    / n UR                  [        R                  " U5      [        R                  " U 5      45        U(       Ga  UR                  5       u  p4[	        U[
        5      (       aj  [	        U[
        5      (       a(  U H!  nXT;  a    gUR                  X5   XE   45        M#     O[	        U[        5      (       a  U H
  nXd;  d  M
    g   OX4;  a  gO[	        U[        5      (       af  [	        U[
        5      (       a  g[	        U[        5      (       a4   [        [        U5      5       H  nUR                  X7   XG   45        M     OX4;  a  gOX4:w  a  gU(       a  GM  g!    g= f! [         a     gf = fr  )
rw   rq   r   poprf   ro   rn   rV  r  
IndexError)src_jsonobj_jsonstackobjsrcr1  ri   r  s           r/   r  r  b  sH   Edjj*DJJx,@AB
 99;c4  #t$$C~$LL#(CH!56  C&&D$     T""#t$$C&&!"3s8_cfcf%56 -   Z5 %6 ?. " ! !s   ;E$ 2E+ $E(+
E87E8r,  r  )FF)hrq   rl  r  rW  syspeeweer   r   r   r   r   r	   r
   r   r   r   r   playhouse._sqlite_extr   r   r   r   r   r   r   r   r   r   r   r  ImportErrorversion_infor}  rz  r  r  r  r  r  r  r!   r=   rA   DecimalFieldrK   rU   r   r[  r   r  r  r'  SchemaManagerrK  Modelrb  rq  r  	_alphabetr   upperr  r  rV  r  compiler  r  r  r  r  r  SqliteDatabaser  r-  r3  r5  r9  r;  r/  SQLITE_STATUS_PARSER_STACKr7  r=  r1  r?  rG  rI  rK  rA  rC  rE  rM  rO  rQ  SQLITE_DBSTATUS_DEFERRED_FKSr  r  r  r/  rZ  r`  r  r  r  r2   r1   r/   <module>r     s     	  
   #         %     $
 A!J 
222A6)C!KK# 9 91 1; ;"L "
87z 87t7 7>]"	 ]"@- -.3% 3>1 1h
5 
< 8L| L^ )	*+^"#$ #b'_	 KU3ZKKJJ:;	X" X"v CG!%X;vd| dN /* *Z  !#$ '($!"%&" !!"#$ !"!"%&"!""# !$%!*+'*+' !!""##%   cM. cML*N
!HNb#A*  %$%s   H. .H:9H: