
    h8'h                     b   d dl Z d dlZd dlZd dlZd dlZd dl d dlmZ d dlmZ d dlmZ d dlm	Z	 d dlm
Z
 d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ 	 d dlmZmZmZmZmZmZmZmZmZmZmZ dZej>                  d    dk(  re Z!dZ"dZ#eejH                  dd dk\  rdndZ%ndZ%dZ& G d de'      Z( G d de(      Z) G d de'      Z* G d de+      Z, G d d e      Z- G d! d"e-      Z. G d# d$e/      Z0 G d% d&e0      Z1 G d' d(e2      Z3 G d) d*e4      Z5 G d+ d,e6      Z7 G d- d.e7      Z8 G d/ d0e8      Z9d1Z: e;d2       e;e:      z   e;e:jy                               z   e; e=d3      f      z  Z> e;d4  e?d5      D              Z@[:[> ej                  d6      ZB G d7 d8e8      ZC	 	 dRd9ZD G d: d;e7      ZEd<e_F        d= ZG G d> d?eH      ZIer=d ZJd@ZKdAZLdZMdZNdBZOdCZPdDZQdEZRdFZSd ZTd@ZUdAZVdZWdZXdBZYdCZZdDZ[dEZ\dFZ]dGZ^dSdHZ_dTdIZ` G dJ dKeI      ZadL ZbdM ZcdN ZddO ZedP ZfdQ Zgy# e$ r dZY w xY w)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                   .     e Zd ZdZdxZxZZ fdZ xZS )
RowIDFieldTrowidc                     || j                   k7  r$t        t        |       d| j                   d      t        t        |   ||g|  y )Nz must be named "z".)required_name
ValueErrortypesuperr!   bind)selfmodelnameargs	__class__s       P/var/www/html/trade_iq/venv/lib/python3.12/site-packages/playhouse/sqlite_ext.pyr(   zRowIDField.bind8   sH    4%%%"4j$*<*<> ? ?j$$UD848    )	__name__
__module____qualname__auto_incrementcolumn_namer+   r$   r(   __classcell__r-   s   @r.   r!   r!   4   s!    N)00K0$9 9r/   r!   c                       e Zd ZdxZxZZy)
DocIDFielddocidN)r0   r1   r2   r4   r+   r$    r/   r.   r8   r8   ?   s    )00K0$r/   r8   c                        e Zd Z fdZ xZS )AutoIncrementFieldc                 V    t         t        |   |      }t        |t	        d      f      S )NAUTOINCREMENT)r'   r<   ddlr
   SQL)r)   ctx	node_listr-   s      r.   r?   zAutoIncrementField.ddlD   s*    ,d7<	C$89::r/   )r0   r1   r2   r?   r5   r6   s   @r.   r<   r<   C   s    ; ;r/   r<   c                       e Zd ZdZd Zy)TDecimalFieldTEXTc                      y Nr:   r)   s    r.   get_modifierszTDecimalField.get_modifiersK   s    r/   N)r0   r1   r2   
field_typerI   r:   r/   r.   rD   rD   I   s
    J!r/   rD   c                        e Zd Zd fd	Zed        Zd ZddZddZddZ	ddZ
ddZd	 Zd
 Zd Zd Zd Zd Zd Z xZS )JSONPathc                 N    t         t        |           || _        |xs d| _        y Nr:   )r'   rL   __init___field_path)r)   fieldpathr-   s      r.   rO   zJSONPath.__init__O   s"    h&(ZR
r/   c                 P    t        ddj                  | j                        z        S )Nz$%s )ValuejoinrQ   rH   s    r.   rS   zJSONPath.pathT   s    URWWTZZ0011r/   c                     t        |t              s|dk(  rd|z  }nd|z  } t        |       | j                  | j                  |fz         S )N#z[%s]z.%s)
isinstanceintr&   rP   rQ   )r)   idxitems      r.   __getitem__zJSONPath.__getitem__X   sF    c33#:C<D3;DtDz$++tzzTG';<<r/   c                     |st        |t        t        f      r.t        j	                  | j
                  j                  |            }t        j                  | j
                  | d   j                  |      S NrY   )	rZ   listdictfnjsonrP   _json_dumpsjson_setrS   r)   valueas_jsons      r.   appendzJSONPath.append_   sN    jt5GGDKK33E:;E{{4;;S	>>r/   c                     |st        |t        t        f      r.t        j	                  | j
                  j                  |            } || j
                  | j                  |      S rG   )rZ   ra   rb   rc   rd   rP   re   rS   r)   funcrh   ri   s       r.   _json_operationzJSONPath._json_operationd   sF    jt5GGDKK33E:;EDKKE22r/   c                 D    | j                  t        j                  ||      S rG   )rn   rc   json_insertrg   s      r.   insertzJSONPath.inserti   s    ##BNNE7CCr/   c                 D    | j                  t        j                  ||      S rG   )rn   rc   rf   rg   s      r.   setzJSONPath.setl   s    ##BKK@@r/   c                 D    | j                  t        j                  ||      S rG   )rn   rc   json_replacerg   s      r.   replacezJSONPath.replaceo       ##BOOUGDDr/   c                 ~    | j                  t        j                  | | j                  j	                  |                  S rG   )rs   rc   
json_patchrP   re   r)   rh   s     r.   updatezJSONPath.updater   s+    xxdDKK,C,CE,JKLLr/   c                 V    t         j                  | j                  | j                        S rG   )rc   json_removerP   rS   rH   s    r.   removezJSONPath.removeu   s    ~~dkk49955r/   c                 V    t         j                  | j                  | j                        S rG   )rc   	json_typerP   rS   rH   s    r.   r   zJSONPath.json_typex       ||DKK33r/   c                 V    t         j                  | j                  | j                        S rG   )rc   json_array_lengthrP   rS   rH   s    r.   lengthzJSONPath.length{   s    ##DKK;;r/   c                 V    t         j                  | j                  | j                        S rG   )rc   	json_eachrP   rS   rH   s    r.   childrenzJSONPath.children~   r   r/   c                 V    t         j                  | j                  | j                        S rG   )rc   	json_treerP   rS   rH   s    r.   treezJSONPath.tree   r   r/   c                     |j                  | j                  r.t        j                  | j                  | j
                              S | j                        S rG   )sqlrQ   rc   json_extractrP   rS   r)   rA   s     r.   __sql__zJSONPath.__sql__   sC    ww** t{{DII> 7 	7*.++7 	7r/   rG   )r0   r1   r2   rO   propertyrS   r^   rj   rn   rq   rs   rv   r{   r~   r   r   r   r   r   r5   r6   s   @r.   rL   rL   N   sa     
 2 2=?
3
DAEM64<447r/   rL   c                   F    e Zd Zd
dZd
dZd
dZd
dZd
dZd Zd Z	d	 Z
y)	JSONBPathNc                     |st        |t        t        f      r.t        j	                  | j
                  j                  |            }t        j                  | j
                  | d   j                  |      S r`   )	rZ   ra   rb   rc   jsonbrP   re   	jsonb_setrS   rg   s      r.   rj   zJSONBPath.append   sN    jt5HHT[[44U;<E||DKKc??r/   c                     |st        |t        t        f      r.t        j	                  | j
                  j                  |            } || j
                  | j                  |      S rG   )rZ   ra   rb   rc   r   rP   re   rS   rl   s       r.   rn   zJSONBPath._json_operation   sF    jt5HHT[[44U;<EDKKE22r/   c                 D    | j                  t        j                  ||      S rG   )rn   rc   jsonb_insertrg   s      r.   rq   zJSONBPath.insert   rw   r/   c                 D    | j                  t        j                  ||      S rG   )rn   rc   r   rg   s      r.   rs   zJSONBPath.set   s    ##BLL%AAr/   c                 D    | j                  t        j                  ||      S rG   )rn   rc   jsonb_replacerg   s      r.   rv   zJSONBPath.replace   s    ##B$4$4eWEEr/   c                 ~    | j                  t        j                  | | j                  j	                  |                  S rG   )rs   rc   jsonb_patchrP   re   rz   s     r.   r{   zJSONBPath.update   s+    xxtT[[-D-DU-KLMMr/   c                 V    t         j                  | j                  | j                        S rG   )rc   jsonb_removerP   rS   rH   s    r.   r~   zJSONBPath.remove   s    t{{DII66r/   c                     |j                  | j                  r.t        j                  | j                  | j
                              S | j                        S rG   )r   rQ   rc   jsonb_extractrP   rS   r   s     r.   r   zJSONBPath.__sql__   sE    ww** ''TYY? 7 	7*.++7 	7r/   rG   )r0   r1   r2   rj   rn   rq   rs   rv   r{   r~   r   r:   r/   r.   r   r      s/    @
3
EBFN77r/   r   c                       e Zd ZdZdZeZd fd	Zd Zd Z	d Z
 e
ej                        Z e
ej                        Z e
ej                         Z e
ej$                        Z e
ej(                        Z e
ej,                        Zej2                  Zd Zd Zd	 Zd
 ZddZddZddZ ddZ!d Z"d Z#d Z$ddZ%d Z&d Z' xZ(S )	JSONFieldJSONFc                     |xs t         j                  | _        |xs t         j                  | _        t        t        |   di | y rN   )rd   dumpsre   loads_json_loadsr'   r   rO   )r)   
json_dumps
json_loadskwargsr-   s       r.   rO   zJSONField.__init__   s7    %3%3i'1&1r/   c                 Z    |	 | j                  |      S y # t        t        f$ r |cY S w xY wrG   )r   	TypeErrorr%   rz   s     r.   python_valuezJSONField.python_value   s>    ''..  z* s    **c                 t    |6t        |t              s$t        j                  | j	                  |            }|S y rG   )rZ   r	   rc   rd   re   rz   s     r.   db_valuezJSONField.db_value   s5    eT* 0 0 78L r/   c                       fd}|S )Nc                 z    t        |t        t        f      rt        || j                  d      }t        | |      S )NF)	converterunpack)rZ   ra   rb   rV   r   r   )r)   rhsops     r.   innerzJSONField._e.<locals>.inner   s2    #d|,C4==GdB,,r/   r:   )r   r   s   ` r.   _ezJSONField._e   s    	- r/   c                 *    | j                  |       |   S rG   )Path)r)   r]   s     r.   r^   zJSONField.__getitem__   s    yyt$$r/   c                 l    |D cg c]  }t        |d       }}t        j                  | g| S c c}w NFr   )rV   rc   r   r)   pathsps      r.   extractzJSONField.extract   s5    49:qqE*::t,e,, ;   1c                 2    t        | dt        |d            S )Nz->Fr   r   rV   r)   rS   s     r.   extract_jsonzJSONField.extract_json   s    $eDE&BCCr/   c                 2    t        | dt        |d            S )Nz->>Fr   r   r   s     r.   extract_textzJSONField.extract_text   s    $uTU'CDDr/   c                 D    | j                  |       j                  ||      S rG   )r   rj   rg   s      r.   rj   zJSONField.append       yy%%eW55r/   c                 D    | j                  |       j                  ||      S rG   )r   rq   rg   s      r.   rq   zJSONField.insert   r   r/   c                 D    | j                  |       j                  ||      S rG   )r   rs   rg   s      r.   rs   zJSONField.set   s    yy""5'22r/   c                 D    | j                  |       j                  ||      S rG   )r   rv   rg   s      r.   rv   zJSONField.replace   s    yy&&ug66r/   c                 B    | j                  |       j                  |      S rG   )r   r{   )r)   datas     r.   r{   zJSONField.update   s    yy%%d++r/   c                 p    |s| j                  |       j                         S t        j                  | g| S rG   )r   r~   rc   r}   r)   r   s     r.   r~   zJSONField.remove   s0    99T?))++~~d+U++r/   c                 ,    t         j                  |       S rG   )rc   r   rH   s    r.   r   zJSONField.json_type       ||D!!r/   c                 8    |r| |fn| f}t        j                  | S rG   )rc   r   )r)   rS   r,   s      r.   r   zJSONField.length   s"    #d|$##T**r/   c                 ,    t         j                  |       S )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)
        )rc   r   rH   s    r.   r   zJSONField.children   s     ||D!!r/   c                 ,    t         j                  |       S rG   )rc   r   rH   s    r.   r   zJSONField.tree  r   r/   )NNrG   ))r0   r1   r2   rJ   r   rL   r   rO   r   r   r   r   EQ__eq__NE__ne__GT__gt__GTE__ge__LT__lt__LTE__le__Field__hash__r^   r   r   r   rj   rq   rs   rv   r{   r~   r   r   r   r   r5   r6   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                   ,    e Zd ZdZeZd Zd Zd Zd Z	y)
JSONBFieldJSONBc                 t    |6t        |t              s$t        j                  | j	                  |            }|S y rG   )rZ   r	   rc   r   re   rz   s     r.   r   zJSONBField.db_value  s5    eT*!1!1%!89L r/   c                 ,    t         j                  |       S rG   )rc   rd   rH   s    r.   rd   zJSONBField.json  s    wwt}r/   c                 l    |D cg c]  }t        |d       }}t        j                  | g| S c c}w r   )rV   rc   r   r   s      r.   r   zJSONBField.extract  s7    49:qqE*::-u-- ;r   c                 p    |s| j                  |       j                         S t        j                  | g| S rG   )r   r~   rc   r   r   s     r.   r~   zJSONBField.remove  s0    99T?))++t,e,,r/   N)
r0   r1   r2   rJ   r   r   r   rd   r   r~   r:   r/   r.   r   r     s     JD.-r/   r   c                   D     e Zd Zd fd	Zd Zed        Zd ZddZ xZ	S )SearchFieldc                 d    |rt        dt        |      z        t        t        |   ||d       y )Nz8SearchField does not accept these keyword arguments: %s.T)	unindexedr4   null)r%   sortedr'   r   rO   )r)   r   r4   kr-   s       r.   rO   zSearchField.__init__  s@     .06q	: ; ;k4)I6A 	* 	Nr/   c                     t        | |      S rG   )match)r)   terms     r.   r   zSearchField.match&  s    T4  r/   c                 
   t        | d      sg| j                  j                  j                  D cg c]  }t	        |t
              r|j                    }}|j                  | j                        | _        | j                  S c c}w )N_fts_column_index)	hasattrr*   _metasorted_fieldsrZ   r   r+   indexr   )r)   fsearch_fieldss      r.   fts_column_indexzSearchField.fts_column_index)  so    t01-1ZZ-=-=-K-K < *1k : VV <M <%2%8%8%CD"%%%<s   #B c                     | j                   }t        j                  | j                  j                  j
                  |||      S rG   )r   rc   	highlightr*   r   entity)r)   leftright
column_idxs       r.   r   zSearchField.highlight1  s2    **
||DJJ,,33ZuMMr/   c                     d|cxk  rdk  st        d       t        d      | j                  }t        j                  | j                  j
                  j                  |||||      S )Nr   A   z/max_tokens must be between 1 and 64 (inclusive))r%   r   rc   snippetr*   r   r  )r)   r  r  over_length
max_tokensr  s         r.   r  zSearchField.snippet5  se    J##NOO $NOO**
zz$****11:tU%z3 	3r/   )FN)z...   )
r0   r1   r2   rO   r   r   r   r   r  r5   r6   s   @r.   r   r     s-    N! & &N3r/   r   c                   (     e Zd ZddZd fd	Z xZS )VirtualTableSchemaManagerc                    | j                   j                  t        | j                   j                  j                  |            }| j                         }|j                  d       |r|j                  d       |j                  | j                         j                  d       | j                   j                  j                  }t        |t              r|j                  |      S |j                  t        |            j                  d       g }| j                   j                  }|j                  r2|j                  |j                  D cg c]  }t        |       c}       |j                  D ]u  }t        |t              s|j                   r t#        |j$                        g}	|j&                  r|	j)                  t        d             |j)                  t+        |	             w |j,                  r2|j                  |j,                  D cg c]  }t        |       c}       |r |j                  | j/                  |             |j                  t1        |            S c c}w c c}w )NzCREATE VIRTUAL TABLE zIF NOT EXISTS z USING  	UNINDEXED)r*   clean_optionsr   r   options_create_contextliteralr   extension_modulerZ   r	   r@   prefix_argumentsextendr   r!   _hiddenr   r4   r   rj   r
   	arguments_create_table_option_sqlr   )
r)   safer  rA   
ext_moduler  metaarR   	field_defs
             r.   _create_virtual_tablez/VirtualTableSchemaManager._create_virtual_table>  s   ****tzz''//9; ""$+,KK()	
#djj/
')
ZZ%%66
j$'77:&&J ((-	zz  d.C.CDc!fDE '' 	2E%*.%-- 1 123I  [!12Xi01	2 >>dnn=c!f=>T::7CDww'	233! E >s   	I I%c                     t        | j                  t              r | j                  |fi |S t	        t
        |   |fi |S rG   )
issubclassr*   VirtualModelr  r'   r  _create_table)r)   r  r  r-   s      r.   r#  z'VirtualTableSchemaManager._create_tablei  sI    djj,/-4--d>g>>.C 	r/   T)r0   r1   r2   r  r#  r5   r6   s   @r.   r  r  =  s    )4V r/   r  c                   0    e Zd Z G d d      Zed        Zy)r"  c                        e Zd ZdZdZdZdZeZy)VirtualModel.MetaNF)	r0   r1   r2   r  r  r  primary_keyr  schema_manager_classr:   r/   r.   Metar'  r  s    	8r/   r*  c                     |S rG   r:   )clsr  s     r.   r  zVirtualModel.clean_optionsy  s    r/   N)r0   r1   r2   r*  classmethodr  r:   r/   r.   r"  r"  q  s     9 9  r/   r"  c                       e Zd Zed        Zy)BaseFTSModelc                 J   |j                  d      }|j                  d      }|j                  d      }t        |t              r|dk(  rd|d<   nGt        |t              r7t	        |j
                  j                  j                  |j                        |d<   |rUt        |t        t        f      r(dj                  |D cg c]  }t        |       c}      }d|j                  d      z  |d<   |r/| j                  j                  j                         d	k(  rd
|z  |d<   |S c c}w )NcontentprefixtokenizerU   z'',z'%s'z' fts5"%s")getrZ   
basestringr   r   r*   r   
table_namer4   ra   tuplerW   strstripr  lower)r,  r  r1  r2  r3  is         r.   r  zBaseFTSModel.clean_options  s    ++i(X&;;z*gz*w"}!%GI'!'(;(;(F(F(/(;(;"=GI &4-06":a3q6":; &d); ;GH		2288:fD #)8"3GJ #;s   =D N)r0   r1   r2   r-  r  r:   r/   r.   r/  r/  ~  s     r/   r/  c                   N   e Zd ZdZ e       Z G d d      Zed        Zed        Z	ed        Z
ed        Zedd       Zedd	       Zed
        Zed        Zed        Zed        Zed        Zed        Ze	 	 dd       Ze	 	 dd       Ze	 	 dd       Ze	 	 dd       Zy)FTSModelz
    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                       e Zd Zdez  Zy)FTSModel.MetazFTS%sN)r0   r1   r2   FTS_VERSIONr  r:   r/   r.   r*  rB    s    "[0r/   r*  c           	          | j                   j                  }| j                   j                  j                  d|d|d|d      }|j	                         S )NzINSERT INTO (z
) VALUES('z');)r   r9  databaseexecute_sqlfetchone)r,  cmdtblress       r.   _fts_cmdzFTSModel._fts_cmd  sB    ii""ii  ,,25sC@B||~r/   c                 $    | j                  d      S NoptimizerL  r,  s    r.   rO  zFTSModel.optimize      ||J''r/   c                 $    | j                  d      S NrebuildrP  rQ  s    r.   rU  zFTSModel.rebuild      ||I&&r/   c                 $    | j                  d      S )Nintegrity-checkrP  rQ  s    r.   integrity_checkzFTSModel.integrity_check  s    ||-..r/   c                 0    | j                  d|d|      S )Nzmerge=r4  rP  )r,  blockssegmentss      r.   mergezFTSModel.merge  s    ||VX>??r/   c                 :    | j                  d|xr dxs dz        S )Nzautomerge=%s10rP  )r,  states     r.   	automergezFTSModel.automerge  s    ||Nem.BsCDDr/   c                 B    t        | j                  j                  |      S zU
        Generate a `MATCH` expression appropriate for searching this table.
        r   r   r  r,  r   s     r.   r   zFTSModel.match      
 SYY%%t,,r/   c                     t         j                  | j                  j                  t              }t        j
                  |g| S rG   )rc   	matchinfor   r  FTS3_MATCHINFOfts_rank)r,  weightsri  s      r.   rankzFTSModel.rank  s0    LL!1!1>B	{{9/w//r/   c                     t         j                  | j                  j                  t              }t        j
                  |g| S rG   )rc   ri  r   r  FTS4_MATCHINFOfts_bm25r,  rl  
match_infos      r.   bm25zFTSModel.bm25  s0    \\#))"2"2NC
{{:000r/   c                     t         j                  | j                  j                  t              }t        j
                  |g| S rG   )rc   ri  r   r  ro  	fts_bm25frq  s      r.   bm25fzFTSModel.bm25f  s0    \\#))"2"2NC
||J111r/   c                     t         j                  | j                  j                  t              }t        j
                  |g| S rG   )rc   ri  r   r  ro  
fts_lucenerq  s      r.   lucenezFTSModel.lucene  s0    \\#))"2"2NC
}}Z2'22r/   c                    |s |       }nut        |t              r`g }| j                  j                  D ]?  }	|j	                  |	|j	                  |	j
                  d            }
|j                  |
       A  || }n || }d}|}|r| |j                  |      f}|r|st        |      } | j                  | j                  | j                  |            j                  |      S )N      ?r:   )rZ   rb   r   r   r7  r+   rj   aliasr@   selectwherer   order_by)r,  r   rl  
with_scorescore_aliasscore_fnexplicit_orderingrm  weight_argsrR   field_weight	selectionr  s                r.   _searchzFTSModel._search  s     :D&K00 1  '{{5'++ejj#2NO""<0	1
 [)DW%D	djj56I/;'H$syy'(#	%r/   Nc                 B    | j                  ||||| j                  |      S 'Full-text search using selected `term`.)r  rm  r,  r   rl  r  r  r  s         r.   searchzFTSModel.search  +     {{HH 	r/   c                 B    | j                  ||||| j                  |      S z:Full-text search for selected `term` using BM25 algorithm.)r  rs  r  s         r.   search_bm25zFTSModel.search_bm25  r  r/   c                 B    | j                  ||||| j                  |      S r  )r  rv  r  s         r.   search_bm25fzFTSModel.search_bm25f  s+     {{II 	r/   c                 B    | j                  ||||| j                  |      S r  )r  ry  r  s         r.   search_lucenezFTSModel.search_lucene  s+     {{JJ 	r/   )      r$  NFscoreF)r0   r1   r2   __doc__r8   r9   r*  r-  rL  rO  rU  rY  r]  rb  r   rm  rs  rv  ry  r  r  r  r  r  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              #   V   K   | ]!  }t        |      t        vst        |       # y wrG   )chr	_alphanum).0r   s     r.   	<genexpr>r  .  s     K3q63JSVKs   ))   z(?:[^\s"]|"(?:\\.|[^"])*")+c                      e Zd ZdZ e       Z G d d      ZddddZed        Z	ed	        Z
ed
        Ze ed      fd       Zed        Zed        Zed        Ze	 	 dd       Ze	 	 dd       Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zedd       Zed d       Zy)!	FTS5Modelan  
    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                       e Zd ZdZy)FTS5Model.Metar5  Nr0   r1   r2   r  r:   r/   r.   r*  r  n  s    !r/   r*  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)rJ   r   pkc                    | j                   j                  j                  dk7  rt        | j                  d         | j                   j
                  j                         D ]0  }t        |t        t        f      rt        | j                  d          | j                   j                  rt        | j                  d         y )Nr"   r  rJ   r   )r   r(  r+   ImproperlyConfigured_error_messagesfieldsvaluesrZ   r   r!   indexes)r,  rR   s     r.   validate_modelzFTS5Model.validate_modelx  s     99  %%0&s':':4'@AAYY%%,,. 	NEek:%>?*3+>+>|+LMM	N 99&s':':7'CDD r/   c                    t         j                  d d t        k  ryt        j                  d      }	 |j	                  d       |j                          y#  	 |j                  d       |j                  d       | j                  j                  j                  d       n#  Y Y |j                          yxY wY vxY w# |j                          w xY w)Nr   Fz:memory:z0CREATE VIRTUAL TABLE fts5test USING fts5 (data);Tr5  )
r   sqlite_version_infoFTS5_MIN_SQLITE_VERSIONconnectexecuteenable_load_extensionload_extensionr   rF  close)r,  tmp_dbs     r.   fts5_installedzFTS5Model.fts5_installed  s    &&r*-DD ,	NNMN LLN	::,,T2%%f- 		""11&9 LLN :LLNs;   A B9"B9&B9B4!B9"B< 4B97B< <Cc                     t         j                  |       }|D ]9  }|j                  d      r|j                  d      r&t	        |      t
        z  s9 y y)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endswithrs   _invalid_ascii)querytokenstokens      r.   validate_queryzFTS5Model.validate_query  sS     ""5) 	E$)<5zN*		
 r/   r  c                 X   g }d}t         j                  |       }|D ]x  }|j                  d      r#|j                  d      r|j	                  |       7t        |      }|t        z  }|rd}|D ]  }|j                  ||      } |j	                  |       z |rdj                  |      S | S )z2
        Clean a query of invalid tokens.
        Fr  Tr  )	r  r  r  r  rj   rs   r  rv   rW   )	r  rv   accumany_invalidr  r  	token_setinvalid_for_tokencs	            r.   clean_queryzFTS5Model.clean_query  s    
 ""5) 
	 E$)<U#E
I )N : "* 6A!MM!W5E6LL
	  88E?"r/   c                 B    t        | j                  j                  |      S rd  re  rf  s     r.   r   zFTS5Model.match  rg  r/   c                 :    |r | j                   | S t        d      S )Nrm  )rs  r@   )r,  r,   s     r.   rm  zFTS5Model.rank  s    "&xsxx7CK7r/   c                 V    t        j                  | j                  j                  g| S rG   )rc   rs  r   r  )r,  rl  s     r.   rs  zFTS5Model.bm25  s     wwsyy''2'22r/   Nc                 R    | j                  t        j                  |      ||||      S r  )r  r  r  r  s         r.   r  zFTS5Model.search  s/     !!$' 	r/   c           
         |st        d      }nt        |t              rg }| j                  j                  D ][  }t        |t
              s|j                  r!|j                  |j                  ||j                  |j                  d                   ] t        j                  | j                  j                  g| }n*t        j                  | j                  j                  g| }d}	|}
|r| |j                  |      f}	|r|st        |      }
 | j                  |	 j                  | j!                  t"        j%                  |                  j'                  |
      S )r  rm  r{  r:   )r@   rZ   rb   r   r   r   r   rj   r7  r+   rc   rs  r  r|  r}  r~  r   r  r  r  )r,  r   rl  r  r  r  rm  r  rR   r  r  s              r.   r  zFTS5Model.search_bm25  s"    v;D&K00 Je[1%//&&E7;;uzz3+GHJJ 77399++:k:D77399++6g6D	djj56I/;'H$syy!6!6t!<=>(#	%r/   c           	      P   | j                   j                  }|g}|g}|j                         D ]0  \  }}|j                  t	        |             |j                  |       2 t        t        d      | j                   j                  t        |      t        d      t        |      f      S )NzINSERT INTOVALUES)r   r  itemsrj   r   r
   r@   r   )r,  rI  extra_paramsrJ  columnsr  keyrh   s           r.   _fts_cmd_sqlzFTS5Model._fts_cmd_sql  s    ii%&,,. 	!JCNN6#;'MM% 	! IIW%MV$& ' 	'r/   c                 r     | j                   |fi |}| j                  j                  j                  |      S rG   )r  r   rF  r  )r,  rI  r  r  s       r.   rL  zFTS5Model._fts_cmd  s4       55yy!!))%00r/   c                 l    d|cxk  rdk  st        d       t        d      | j                  d|      S )Nr   r
  zlevel must be between 0 and 16rb  rm  )r%   rL  )r,  levels     r.   rb  zFTS5Model.automerge  s?    U b =>> !=>>||Ke|44r/   c                 (    | j                  d|      S )Nr]  r  rP  )r,  npagess     r.   r]  zFTS5Model.merge  s    ||G&|11r/   c                 $    | j                  d      S rN  rP  rQ  s    r.   rO  zFTS5Model.optimize  rR  r/   c                 $    | j                  d      S rT  rP  rQ  s    r.   rU  zFTS5Model.rebuild  rV  r/   c                 (    | j                  d|      S )Npgszr  rP  )r,  r  s     r.   set_pgszzFTS5Model.set_pgsz  s    ||F|..r/   c                 (    | j                  d|      S )Nrm  r  rP  )r,  rank_expressions     r.   set_rankzFTS5Model.set_rank!  s    ||F|99r/   c                 $    | j                  d      S )Nz
delete-allrP  rQ  s    r.   
delete_allzFTS5Model.delete_all%  s    ||L))r/   c                 (    | j                  d|      S )NrX  r  rP  )r,  rm  s     r.   rY  zFTS5Model.integrity_check)  s    ||-D|99r/   c           	          dvrt        d      dz  }t         |      s G  fdd      }t        t              t	               t	               t               |d}dk(  rt        t              |d<   ndk(  rt        t              |d	<   d
 j                  z  }t         |t        |t        f|             t         |      S )N)rowcolinstancez5table_type must be either "row", "col" or "instance".z_vocab_model_%sc                       e Zd ZW  j                  j                  ZW xs W  j                  j
                  dz   Zej                  W  j                  j                   e	W             Z
y)"FTS5Model.VocabModel.<locals>.Meta_vN)r0   r1   r2   r   rF  r9  rc   	fts5vocabr  r@   r  )r,  table
table_types   r.   r*  r  6  sN    99--"Acii&:&:T&A
#%<<II$$
O$% r/   r*  )r   doccntr"   r*  r  r  offsetz%sVocab)r%   r   r   	TextFieldIntegerFieldr!   r0   setattrr&   r"  getattr)r,  r  r  attrr*  attrs
class_names   ```    r.   
VocabModelzFTS5Model.VocabModel-  s    77 + , , !:-sD!% % %Y/#~#~#E U"+I6ez)".|"<h"S\\1JCtJGHsD!!r/   r  )r   )r  N)r0   r1   r2   r  r!   r"   r*  r  r-  r  r  staticmethodr  r  r  r   rm  rs  r  r  r  rL  rb  r]  rO  rU  r  r  r  rY  r  r:   r/   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 ( ( ' ' / / : : * * : : " "r/   r  c                 @     8 j                   j                  D ]  }|j                   u s| n t        d       j                   j                   G  fddt
              } G fdd      }d j                  z  }t        ||fd|i      S )z3Model factory for the transitive closure extension.z,Unable to find self-referential foreign key.c                       e Zd Z ee      Z ee      Z ee      Z ee      Z	 ee      Z
 ee      Z G d d      Zedfd	       Zedfd	       Zed fd	       Zy)	&ClosureTable.<locals>.BaseClosureTablec                       e Zd ZdZy)+ClosureTable.<locals>.BaseClosureTable.Metatransitive_closureNr  r:   r/   r.   r*  r  i  s    3r/   r*  Nc                 r   j                  | j                  j                  d            j                  | | j                  k(        j                  | j                  |k(        j                         }| |j                  | j                  |k(        }|S |s|j                  | j                  dkD        }|S Ndepthonr   )r}  r  r|  rW   idr~  rootobjectsr,  noder  include_noder  model_class
source_keys        r.   descendantsz2ClosureTable.<locals>.BaseClosureTable.descendantsl  s     f[#))//'*BCd3J#&&$8d:eCHH,-gi	 
  CII$67 L "CIIM2Lr/   c                 r   j                  | j                  j                  d            j                  | | j                  k(        j                  | j                  |k(        j                         }|r |j                  | j                  |k(        }|S |s|j                  | j                  dkD        }|S r  )r}  r  r|  rW   r
  r~  r	  r  r  s        r.   	ancestorsz0ClosureTable.<locals>.BaseClosureTable.ancestorsy  s     f[#))//'*BCd3J#(($:d<eCFFdN+gi	 
 CII$67 L "CIIM2Lr/   c                    u rH|j                   j                  j                        }j                         j	                  |k(        }nj                  	      j                  | | j                  k(        j	                  | j                  |k(  | j                  dk(  z        }j                         j	                  
|z        j                         }|s|j	                  
|k7        }|S )Nr     )
__data__r7  r+   r}  r~  rW   r
  r	  r  r  )r,  r  r  fk_valuer  siblingsforeign_keyr  referencing_classreferencing_keyr  s         r.   r  z/ClosureTable.<locals>.BaseClosureTable.siblings  s     K/==,,[-=-=>#**,22;(3JK .#VO4!T#;#((+BTD"UCFFdNsyyA~#FG  % &(%
h 67!') 
  J$$67Lr/   NFF)r0   r1   r2   r   r  r  r	  r  idcolumnparentcolumnr
  	tablenamer*  r-  r  r  r  )r  r  r  r  r  s   r.   BaseClosureTabler   a  s    \*,'	*#I.L) +		4 	4 

	 

	 

	 

	 
	 	 
	r/   r!  c                       e Zd ZW j                  j                  ZW j                  j
                  W j                  W  j                  dZdZy)ClosureTable.<locals>.Meta)r   r  r  FN)	r0   r1   r2   r   rF  r9  r4   r  r(  )r  r  r  s   r.   r*  r#    sC    $**33*00;;'33'335 r/   r*  z	%sClosure)r   refs	rel_modelr%   r(  r"  r0   r&   )	r  r  r  r  	field_objr!  r*  r+   r  s	   ````    @r.   ClosureTabler'  O  s      '$**// 	MI""k1'	M
 KLL""..J$; ;< ;z  ---D')FD>::r/   c                       e Zd Z G d d      Zed        Zedd       Zed        Zed        Z	ed        Z
ed        Zed	        Zy
)LSMTablec                       e Zd ZdZdZy)LSMTable.Metalsm1N)r0   r1   r2   r  filenamer:   r/   r.   r*  r+    s    !r/   r*  c                    | j                   j                  }|st        d      t        |      dk\  r|d   dk7  rd|z  }| j                   j                  st        d      | j                   j                  }t        |t              rt        d      t        |t        t        t        f      st        d      d	|_
        t        |t              rd
}nt        |t              rd}nd}|d|j                  z  |g| j                   _        t        | j                   j                        dk(  r*| j                   j                  d   | j                   _        |S d | j                   _        |S )NzILSM1 extension requires that you specify a filename for the LSM database.   r   r  r6  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BLOBrE   r  )r   r-  r%   lenr(  rZ   	AutoFieldr  	BlobFieldr  r  r+   r  r   _value_field)r,  r  r-  r  	data_types        r.   r  zLSMTable.clean_options  sD   99%% > ? ? 8}!hqkS&8!H,yy$$LMMii##c9% * + +#	9lCD - . .c<(IY'II&.0A9%M		" syy&&'1,%(YY%<%<Q%?CII"  &*CII"r/   c                 N    | j                   j                  j                  |       y rG   )r   rF  r  )r,  rS   s     r.   r  zLSMTable.load_extension  s    		))$/r/   c                     |j                   2|j                  &| j                  |j                   |j                        S |j                   | |j                   k\  S |j                  | |j                  k  S y rG   )startstopbetween)r  r\   s     r.   slice_to_exprzLSMTable.slice_to_expr  sd    99 SXX%9;;syy#((33YY"#))##XX!#((?" "r/   c                     t        |t              r-t        j                  ||      }|| j	                  |      } | dfS t        |t
              r| j	                  |      dfS | j	                  ||k(        dfS NFT)rZ   slicer)  r<  r~  r   )r  r  lookupexprs       r.   _apply_lookup_to_queryzLSMTable._apply_lookup_to_query  sr    fe$))#v6DD)%<
+;;v&--;;sf}-t33r/   c                     | j                  | j                         j                         | j                  j                  |      \  }}|r-|j                         }| j                  j                  |d   S |S |S Nr  )rB  r}  namedtuplesr   r(  r7  r5  )r,  r  r  	is_singler  s        r.   	get_by_idzLSMTable.get_by_id  sl    55JJL$$&II!!y
 ))+C YY33?3q6HSHLr/   c                    | j                   j                  | j                   j                  |i}nnt        |t              r3i }t	        | j                   j
                  dd  |      D ]
  \  }}|||<    n+t        |t              r|}nt        ||       r|j                  }|| j                   j                  <   | j                  |      j                          y rD  )r   r5  rZ   r:  zipr   rb   __dict__r(  rv   r  )r,  r  rh   r   rR   fvals         r.   	set_by_idzLSMTable.set_by_id  s    99!!-II**E2Du%D"399#:#:12#>F #t"U#t$Ds#>>D&)SYY""#D!!#r/   c                     | j                  | j                         | j                  j                  |      \  }}|j	                         S rG   )rB  deleter   r(  r  )r,  r  r  rF  s       r.   delete_by_idzLSMTable.delete_by_id  s>    55JJLII!!y }}r/   N)zlsm.so)r0   r1   r2   r*  r-  r  r  r  r<  rB  rG  rL  rO  r:   r/   r.   r)  r)    s      ! !F 0 0 # # 	4 	4 
 
 $ $  r/   r)  MATCHc                 2    t        j                  | |      d uS rG   )rer  )regexrh   s     r.   _sqlite_regexprT    s    99UE"$..r/   c                   6     e Zd Z	 	 	 d fd	Z fdZd Z xZS )SqliteExtDatabasec                 (   t        t        | 
  |g|i |	 d | _        |rt        st        d      t        xr |du}
|rf|
rt        |        nX| j                  t        d       | j                  t        d       | j                  t        d       | j                  t        d       |r|
st        d      t        |        |r| j                  t        dd	       |r|
st        d
      t        |        |r| j                  t        d       |
| _        y )NzRSqliteExtDatabase initialized with C extensions, but shared library was not found!Frp  rk  ru  rx  z0C extension required to register hash functions.regexpr/  z(C extension required to use bloomfilter.json_contains)r'   rV  rO   _row_factoryCYTHON_SQLITE_EXTENSIONSr  r   register_functionrs  rm  r%   r   rT  r   _json_contains_c_extensions)r)   rF  c_extensionsrank_functionshash_functionsregexp_functionbloomfilterrY  r,   r   prefer_cr-   s              r.   rO   zSqliteExtDatabase.__init__  s    	/J4J6J  8& (4 5 5 ,KU1J'-&&tZ8&&tZ8&&t[9&&t\:  ". / /#D)"">8Q? !KLL &"">?C%r/   c                 h    t         t        |   |       | j                  r| j                  |_        y y rG   )r'   rV  _add_conn_hooksrZ  row_factoryr)   connr-   s     r.   rf  z!SqliteExtDatabase._add_conn_hooks;  s/    6t<#00D r/   c                     || _         y rG   )rZ  r)   rc   s     r.   rg  zSqliteExtDatabase.row_factory@  s
    r/   )NTFFFF)r0   r1   r2   rO   rf  rg  r5   r6   s   @r.   rV  rV    s    CG7<27!&F1
r/   rV  r  r/        r   r  r   
   c                 (      fd}t        |      S )zt
        Expose a sqlite3_status() call for a particular flag as a property of
        the Database object.
        c                 ,    t              }r|d   S |S rD  )r   )r)   resultflagreturn_highwaters     r.   getterz__status__.<locals>.gettera  s    &t,F 06!9<f<r/   r   )rr  rs  rt  s   `` r.   
__status__rv  \  s    
	= r/   c                 ,      fd}t        |      S )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                     | j                   j                  t        d      t        | j                   j                        }r|d   S r|d   S |S )Nzdatabase connection not opened.r   r  )_stateri  r  r   )r)   rq  rr  return_currentrs  s     r.   rt  z__dbstatus__.<locals>.getterl  sS    {{'*+LMM)$++*:*:DAFay  06!9<f<r/   ru  )rr  rs  rz  rt  s   ``` r.   __dbstatus__r{  f  s    	= r/   c                       e Zd Z fdZd fd	Z fdZ fdZd Zd Zd Z	d	 Z
ed
        Zed        ZddZ	 	 ddZddZ ee      Z eed      Z ee      Z ee      Z ee      Z eed      Z ee      Z ee       Z! ee"d      Z# e$e%      Z& e$e'd      Z( e$e)d      Z* e$e+d      Z, e$e-dd      Z. e$e/dd      Z0 e$e1dd      Z2 e$e3dd      Z4 e$e5dd      Z6 e$e7dd      Z8 xZ9S )CSqliteExtDatabasec                 r    d | _         d x| _        x| _        | _        d| _        t        t        |   |i | y r  )_conn_helper_commit_hook_rollback_hook_update_hook_replace_busy_handlerr'   r}  rO   )r)   r,   r   r-   s      r.   rO   zCSqliteExtDatabase.__init__v  s@     $DJNNDN 3d6G).D&$d4dEfEr/   Fc                 <    t        t        | 
  |fi | || _        y rG   )r'   r}  initr  )r)   rF  replace_busy_handlerr   r-   s       r.   r  zCSqliteExtDatabase.init|  s     $d0DVD)=D&r/   c                    | j                   r| j                  j                  d        | j                  r| j                  j	                  d        | j
                  r| j                  j                  d        t        t        | '  |      S rG   )
r  r  set_commit_hookr  set_rollback_hookr  set_update_hookr'   r}  _closerh  s     r.   r  zCSqliteExtDatabase._close  sm      !!11$7""!!33D9  !!11$7+T9$??r/   c                    t         t        |   |       t        |      | _        | j
                  %| j                  j                  | j
                         | j                  %| j                  j                  | j                         | j                  %| j                  j                  | j                         | j                  r/| j                  xs d}| j                  j                  |dz         y y )Nrl  i  )r'   r}  rf  r   r  r  r  r  r  r  r  r  _timeoutset_busy_handler)r)   ri  timeoutr-   s      r.   rf  z"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 *r/   c                 j    || _         | j                         s| j                  j                  |       |S rG   )r  	is_closedr  r  rk  s     r.   	on_commitzCSqliteExtDatabase.on_commit  -     "D>>#!!11"5Ir/   c                 j    || _         | j                         s| j                  j                  |       |S rG   )r  r  r  r  rk  s     r.   on_rollbackzCSqliteExtDatabase.on_rollback  s-    "$D>>#!!33B7Ir/   c                 j    || _         | j                         s| j                  j                  |       |S rG   )r  r  r  r  rk  s     r.   	on_updatezCSqliteExtDatabase.on_update  r  r/   c                 6    | j                   j                         S rG   )r  changesrH   s    r.   r  zCSqliteExtDatabase.changes  s    $$,,..r/   c                 6    | j                   j                         S rG   )r  last_insert_rowidrH   s    r.   r  z$CSqliteExtDatabase.last_insert_rowid  s    $$6688r/   c                 6    | j                   j                         S rG   )r  
autocommitrH   s    r.   r  zCSqliteExtDatabase.autocommit  s    $$//11r/   c                 Z    t        | j                         |j                         |||      S N)pagesr+   progress)r   
connection)r)   destinationr  r+   r  s        r.   r   zCSqliteExtDatabase.backup  s,    $//+[-C-C-E %D8E Er/   c                 >    t        | j                         ||||      S r  )r   r  )r)   r-  r  r+   r  s        r.   r   z!CSqliteExtDatabase.backup_to_file  s#    !$//"3XU'+h@ @r/   c                      t        | ||||      S rG   )r   )r)   r  columnr"   	read_onlys        r.   	blob_openzCSqliteExtDatabase.blob_open  s    eVUI>>r/   Tr  NNN):r0   r1   r2   rO   r  r  rf  r  r  r  r  r   r  r  r   r   r  rv  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_writer5   r6   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r/   r}  c                 8    t        | t        j                  |      S rG   )r   r   rP  )lhsr   s     r.   r   r     s    c288S))r/   c           
          t        |       }t        d|d      D cg c]!  }t        j                  d| ||dz          d   # c}S c c}w )Nr   r   z@I)r2  rangestructr   )bufbufsizer>  s      r.   _parse_match_infor    sB    #hG8=a!8LM1FMM$Aac
+A.MMMs   &Ac                 R    |sdg| z  S dg| z  }t        |      D ]
  \  }}|||<    |S )Nr  r   )	enumerate)ncolraw_weightsrl  r>  weights        r.   get_weightsr    sB    sTz#*";/ 	 IAvGAJ	 Nr/   c                    t        |       }d}|d d \  }}t        ||      }t        |      D ]T  }d||z  dz  z   }t        |      D ]9  }	||	   }
|
s||	dz  z   }||   }||dz      }|dkD  s&||
t        |      |z  z  z  }; V | S )N        r/  r   r  r   )r  r  r  float)raw_match_infor  rr  r  r   r  rl  
phrase_numphrase_info_idxcol_numr  col_idxrow_hitsall_rows_hitss                 r.   rm  rm    s     #>2JEbq>DAq![)G Ah D
zA~12Qx 	DGW%F%15G "'*H&w{3M!|5?]#BCC	DD$ 6Mr/   c                 @   t        |       }d}d}d}t        d      \  }}}}	||   }
||   }||   }|	|z   }||z   }t        ||      }t        |
      D ]  }t        |      D ]  }||   }|dk(  r|d|||z  z   z  z   }t        ||         }t        ||dz            }t	        j
                  ||z
  dz   |dz   z        }|dk  rd	}t        |||z            }t        ||	|z            xs d
}||z  }||d
z   z  }d
|z
  ||z  z   }|||z  z   }|||z  z  }|||z  z  }  | S )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      ?r  r   r   r   r/  g      ?gư>r{  )r  r  r  r  mathlog)r  r,   rr  KBr  P_OC_ON_OA_O
term_count	col_count
total_docsL_OX_Orl  r>  jr  xterm_frequencydocs_with_termidf
doc_length
avg_lengthrationumb_partdenompc_scores                                 r.   rs  rs    s    #>2JAAEqCc3CJ3ICJ
	/C
	/C: )T*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 6Mr/   c                    g }	 |j                  t        j                  |      t        j                  |       f       |r|j                         \  }}t	        |t
              rZt	        |t
              r'|D ]!  }||vr y|j                  ||   ||   f       # nt	        |t              r|D ]  }||vs y nu||vrqyt	        |t              rZt	        |t
              ryt	        |t              r4	 t        t        |            D ]  }|j                  ||   ||   f        n||vry||k7  ry|ry#  Y yxY w# t        $ r Y yw xY wr>  )
rj   rd   r   poprZ   rb   ra   r  r2  
IndexError)src_jsonobj_jsonstackobjsrcr  r]   r>  s           r.   r]  r]  b  sM   Edjj*DJJx,@AB
 99;Sc4 #t$ 7C#~$LL#c(CH!567 C& %D3$% CT"#t$C&!"3s8_ 7c!fc!f%567 CCZ5 6 ?. " ! !s   9D0 .2D7 0D47	EEr  r  )FF)hrd   r  rR  r  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;  r8  rj  ro  r  rC  r  r3  r!   r8   r<   DecimalFieldrD   rL   r   r  r   r   r   r   SchemaManagerr  Modelr"  r/  r@  	_alphabetrs   upperr  r  r  r  compiler  r  r'  r)  rP  rT  SqliteDatabaserV  r  r  r  r  r  r  SQLITE_STATUS_PARSER_STACKr  r  r  r  r  r  r  r  r  r  r  r  r  SQLITE_DBSTATUS_DEFERRED_FKSrv  r{  r}  r   r  r  rm  rs  r]  r:   r/   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BJJ56	X" X"v CG!%X;vd| dN /* *Z  !#$ '($!"%&" !!"#$ !"!"%&"!""# !$%!*+'*+' !!""##%   cM. cML*N
!HNb#A*  %$%s   H# #H.-H.