
    !j@k                        d dl Z d dlZd dlZd dlZd dlT 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 d dlmZ d dlmZ dZdZeej        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!          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/ d0e+          Z, G d1 d2e,          Z-d3Z. e/d4           e/e.          z   e/e.0                                          z   e/ e1d5          f          z  Z2 e/d6  e3d7          D                       Z4[.[2 ej5        d8          Z6 G d9 d:e,          Z7d;e_8        d< Z9dS )=    N)*)
ColumnBase)EnclosedNodeList)Entity)
Expression)Insert)Node)NodeList)OP)VirtualField)
merge_dict)sqlite3)JSON)RANK)register_udf_groupspcxpcnalx   )r         r   )r   	   r   c                   .     e Zd ZdZdxZxZZ fdZ xZS )
RowIDFieldTrowidc                     || j         k    r't          t          |           d| j         d           t          t          |           j        ||g|R   d S )Nz must be named "z".)required_name
ValueErrortypesuperr   bind)selfmodelnameargs	__class__s       P/var/www/html/bolsaweb/venv/lib/python3.11/site-packages/playhouse/sqlite_ext.pyr    zRowIDField.bind&   sm    4%%%"4jjjj$*<*<*<> ? ? ?$j$$UD84888888    )	__name__
__module____qualname__auto_incrementcolumn_namer#   r   r    __classcell__r%   s   @r&   r   r   "   sL        N)00K0$9 9 9 9 9 9 9 9 9r'   r   c                       e Zd ZdxZxZZdS )
DocIDFielddocidN)r(   r)   r*   r,   r#   r    r'   r&   r0   r0   -   s        )00K0$r'   r0   c                        e Zd Z fdZ xZS )AutoIncrementFieldc                     t          t          |                               |          }t          |t	          d          f          S )NAUTOINCREMENT)r   r4   ddlr
   SQL)r!   ctx	node_listr%   s      r&   r7   zAutoIncrementField.ddl2   s<    ,d3377<<	C$8$89:::r'   )r(   r)   r*   r7   r-   r.   s   @r&   r4   r4   1   s8        ; ; ; ; ; ; ; ; ;r'   r4   c                       e Zd ZdZd ZdS )TDecimalFieldTEXTc                     d S Nr2   r!   s    r&   get_modifierszTDecimalField.get_modifiers9   s      r'   N)r(   r)   r*   
field_typerA   r2   r'   r&   r<   r<   7   s        J!!!!!r'   r<   c                       e Zd Zg dZd ZdS )ISODateTimeField)z%Y-%m-%dT%H:%M:%S.%f%zz%Y-%m-%dT%H:%M:%S%zz%Y-%m-%dT%H:%M:%S.%fz%Y-%m-%dT%H:%M:%Sz%Y-%m-%dc                 2    |r|                                 S d S r?   )	isoformatr!   values     r&   db_valuezISODateTimeField.db_valueE   s$     	%??$$$	% 	%r'   N)r(   r)   r*   formatsrI   r2   r'   r&   rD   rD   <   s4          G% % % % %r'   rD   c                        e Zd Zd fd	Z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 )JSONPathNc                 v    t          t          |                                            || _        |pd| _        d S Nr2   )r   rL   __init___field_path)r!   fieldpathr%   s      r&   rO   zJSONPath.__init__K   s5    h&&(((ZR


r'   c                 6    | j                             |          S r?   )rP   python_valuerG   s     r&   
_converterzJSONPath._converterP   s    {''...r'   c                 V    t          dd                    | j                  z            S )Nz$%s )ValuejoinrQ   r@   s    r&   rS   zJSONPath.pathS   s#    URWWTZ0001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__W   sS    c3 	3#::C<DD3;DtDzz$+tzTG';<<<r'   c                     |st          |t          t          f          r2t                              | j                            |                    }t                              | j        | d         j        |          S Nr\   )	r]   listdictfnjsonrP   _json_dumpsjson_setrS   r!   rH   as_jsons      r&   appendzJSONPath.append^   s^     	<jt55 	<GGDK33E::;;E{{4;S	>>>r'   c                     |st          |t          t          f          r2t                              | j                            |                    } || j        | j        |          S r?   )r]   rd   re   rf   rg   rP   rh   rS   r!   funcrH   rk   s       r&   _json_operationzJSONPath._json_operationc   sX     	<jt55 	<GGDK33E::;;EtDKE222r'   c                 D    |                      t          j        ||          S r?   )rp   rf   json_insertrj   s      r&   insertzJSONPath.inserth   s    ##BNE7CCCr'   c                 D    |                      t          j        ||          S r?   )rp   rf   ri   rj   s      r&   setzJSONPath.setk   s    ##BK@@@r'   c                 D    |                      t          j        ||          S r?   )rp   rf   json_replacerj   s      r&   replacezJSONPath.replacen       ##BOUGDDDr'   c                     |                      t                              | | j                            |                              S r?   )ru   rf   
json_patchrP   rh   rG   s     r&   updatezJSONPath.updateq   s2    xxdDK,C,CE,J,JKKLLLr'   c                 L    t                               | j        | j                  S r?   )rf   json_removerP   rS   r@   s    r&   removezJSONPath.removet   s    ~~dk49555r'   c                 L    t                               | j        | j                  S r?   )rf   	json_typerP   rS   r@   s    r&   r   zJSONPath.json_typew       ||DK333r'   c                 L    t                               | j        | j                  S r?   )rf   json_array_lengthrP   rS   r@   s    r&   lengthzJSONPath.lengthz   s    ##DK;;;r'   c                 L    t                               | j        | j                  S r?   )rf   	json_eachrP   rS   r@   s    r&   childrenzJSONPath.children}   r   r'   c                 L    t                               | j        | j                  S r?   )rf   	json_treerP   rS   r@   s    r&   treezJSONPath.tree   r   r'   c                     |                     | j        r%t                              | j        | j                  n| j                  S r?   )sqlrQ   rf   json_extractrP   rS   r!   r9   s     r&   __sql__zJSONPath.__sql__   s>    ww*6rt{DI>>>*.+7 7 	7r'   r?   )r(   r)   r*   rO   rV   propertyrS   ra   rl   rp   rs   ru   rx   r|   r   r   r   r   r   r   r-   r.   s   @r&   rL   rL   J   sR                  
/ / / 2 2 X2= = =? ? ? ?
3 3 3 3
D D D DA A A AE E E EM M M6 6 64 4 4< < <4 4 44 4 47 7 7 7 7 7 7r'   rL   c                   H    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
dS )	JSONBPathNc                     |st          |t          t          f          r2t                              | j                            |                    }t                              | j        | d         j        |          S rc   )	r]   rd   re   rf   jsonbrP   rh   	jsonb_setrS   rj   s      r&   rl   zJSONBPath.append   s^     	=jt55 	=HHT[44U;;<<E||DKc???r'   c                     |st          |t          t          f          r2t                              | j                            |                    } || j        | j        |          S r?   )r]   rd   re   rf   r   rP   rh   rS   rn   s       r&   rp   zJSONBPath._json_operation   sX     	=jt55 	=HHT[44U;;<<EtDKE222r'   c                 D    |                      t          j        ||          S r?   )rp   rf   jsonb_insertrj   s      r&   rs   zJSONBPath.insert   ry   r'   c                 D    |                      t          j        ||          S r?   )rp   rf   r   rj   s      r&   ru   zJSONBPath.set   s    ##BL%AAAr'   c                 D    |                      t          j        ||          S r?   )rp   rf   jsonb_replacerj   s      r&   rx   zJSONBPath.replace   s    ##B$4eWEEEr'   c                     |                      t                              | | j                            |                              S r?   )ru   rf   jsonb_patchrP   rh   rG   s     r&   r|   zJSONBPath.update   s2    xxtT[-D-DU-K-KLLMMMr'   c                 L    t                               | j        | j                  S r?   )rf   jsonb_removerP   rS   r@   s    r&   r   zJSONBPath.remove   s    t{DI666r'   c                     |                     | j        r%t                              | j        | j                  n| j                  S r?   )r   rQ   rf   jsonb_extractrP   rS   r   s     r&   r   zJSONBPath.__sql__   s@    ww*6r''TY???*.+7 7 	7r'   r?   )r(   r)   r*   rl   rp   rs   ru   rx   r|   r   r   r2   r'   r&   r   r      s        @ @ @ @
3 3 3 3
E E E EB B B BF F F FN N N7 7 77 7 7 7 7r'   r   c                   j    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j        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 )	JSONFieldr   FNc                     |pt           j        | _        |pt           j        | _         t          t          |           j        di | d S rN   )rg   dumpsrh   loads_json_loadsr   r   rO   )r!   
json_dumps
json_loadskwargsr%   s       r&   rO   zJSONField.__init__   sJ    %3%3'i'11&11111r'   c                 h    |/	 |                      |          S # t          t          f$ r |cY S w xY wd S r?   )r   	TypeErrorr   rG   s     r&   rU   zJSONField.python_value   sR    ''...z*    s    //c                     |Dt          |t                    s-t                              |                     |                    }|S d S r?   )r]   r	   rf   rg   rh   rG   s     r&   rI   zJSONField.db_value   sF    eT** 9 0 0 7 788L r'   c                       fd}|S )Nc                     t          |t          t          f          rt          || j                  }t          | |          S r?   )r]   rd   re   AsIsrI   r   )r!   rhsops     r&   innerzJSONField._e.<locals>.inner   s<    #d|,, /3..dB,,,r'   r2   )r   r   s   ` r&   _ezJSONField._e   s#    	- 	- 	- 	- 	- r'   c                 8    |                      |           |         S r?   )Path)r!   r`   s     r&   ra   zJSONField.__getitem__   s    yyt$$r'   c                 >    d |D             }t          j        | g|R  S )Nc                 0    g | ]}t          |d           S F	converterrY   .0ps     r&   
<listcomp>z%JSONField.extract.<locals>.<listcomp>   %    :::qqE***:::r'   )rf   r   r!   pathss     r&   extractzJSONField.extract   s-    ::E:::t,e,,,,r'   c                 B    t          | dt          |d                    S )Nz->Fr   r   rY   r!   rS   s     r&   extract_jsonzJSONField.extract_json   s!    $eDE&B&B&BCCCr'   c                 B    t          | dt          |d                    S )Nz->>Fr   r   r   s     r&   extract_textzJSONField.extract_text   s!    $uTU'C'C'CDDDr'   c                 T    |                      |                               ||          S r?   )r   rl   rj   s      r&   rl   zJSONField.append   "    yy%%eW555r'   c                 T    |                      |                               ||          S r?   )r   rs   rj   s      r&   rs   zJSONField.insert   r   r'   c                 T    |                      |                               ||          S r?   )r   ru   rj   s      r&   ru   zJSONField.set   s"    yy""5'222r'   c                 T    |                      |                               ||          S r?   )r   rx   rj   s      r&   rx   zJSONField.replace   s"    yy&&ug666r'   c                 R    |                      |                               |          S r?   )r   r|   )r!   datas     r&   r|   zJSONField.update   s     yy%%d+++r'   c                 x    |s'|                      |                                           S t          j        | g|R  S r?   )r   r   rf   r~   r   s     r&   r   zJSONField.remove   s>     	,99T??))+++~d+U++++r'   c                 6    t                               |           S r?   )rf   r   r@   s    r&   r   zJSONField.json_type       ||D!!!r'   c                 0    |r| |fn| f}t          j        | S r?   )rf   r   )r!   rS   r$   s      r&   r   zJSONField.length   s$    #0d||$#T**r'   c                 6    t                               |           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)
        )rf   r   r@   s    r&   r   zJSONField.children   s     ||D!!!r'   c                 6    t                               |           S r?   )rf   r   r@   s    r&   r   zJSONField.tree  r   r'   )NNr?   ))r(   r)   r*   rB   unpackrL   r   rO   rU   rI   r   r   EQ__eq__NE__ne__GT__gt__GTE__ge__LT__lt__LTE__le__Field__hash__ra   r   r   r   rl   rs   ru   rx   r|   r   r   r   r   r   r-   r.   s   @r&   r   r      s       JFD2 2 2 2 2 2
       RYYFRYYFRYYFRZZFRYYFRZZF~H% % %- - -D D DE E E6 6 6 66 6 6 63 3 3 37 7 7 7, , ,, , ,
" " "+ + + +" " """ " " " " " "r'   r   c                   .    e Zd ZdZeZd Zd Zd Zd Z	dS )
JSONBFieldJSONBc                     |Dt          |t                    s-t                              |                     |                    }|S d S r?   )r]   r	   rf   r   rh   rG   s     r&   rI   zJSONBField.db_value
  sF    eT** :!1!1%!8!899L r'   c                 6    t                               |           S r?   )rf   rg   r@   s    r&   rg   zJSONBField.json  s    wwt}}r'   c                 >    d |D             }t          j        | g|R  S )Nc                 0    g | ]}t          |d           S r   r   r   s     r&   r   z&JSONBField.extract.<locals>.<listcomp>  r   r'   )rf   r   r   s     r&   r   zJSONBField.extract  s.    ::E:::-u----r'   c                 x    |s'|                      |                                           S t          j        | g|R  S r?   )r   r   rf   r   r   s     r&   r   zJSONBField.remove  s>     	,99T??))+++t,e,,,,r'   N)
r(   r)   r*   rB   r   r   rI   rg   r   r   r2   r'   r&   r   r     sZ        JD    . . .- - - - -r'   r   c                   J     e Zd Zd
 fd	Zd Zed             Zd Zdd	Z xZ	S )SearchFieldFNc                     |rt          dt          |          z            t          t          |                               ||d           d S )Nz8SearchField does not accept these keyword arguments: %s.T)	unindexedr,   null)r   sortedr   r   rO   )r!   r   r,   kr%   s       r&   rO   zSearchField.__init__  sm     	; .06q		: ; ; ;k4  ))I6A 	* 	N 	N 	N 	N 	Nr'   c                 "    t          | |          S r?   )match)r!   terms     r&   r   zSearchField.match%  s    T4   r'   c                     t          | d          s:d | j        j        j        D             }|                    | j                  | _        | j        S )N_fts_column_indexc                 F    g | ]}t          |t                    |j        S r2   )r]   r   r#   )r   fs     r&   r   z0SearchField.fts_column_index.<locals>.<listcomp>+  s8     < < < *1k : :<QV < < <r'   )hasattrr"   _metasorted_fieldsindexr#   r   )r!   search_fieldss     r&   fts_column_indexzSearchField.fts_column_index(  s\    t011 	D< <TZ-=-K < < <M%2%8%8%C%CD"%%r'   c                 h    | j         }t                              | j        j        j        |||          S r?   )r  rf   	highlightr"   r   entity)r!   leftright
column_idxs       r&   r  zSearchField.highlight0  s*    *
||DJ,3ZuMMMr'   ...   c                     d|cxk     rdk     sn t          d          | j        }t                              | j        j        j        |||||          S )Nr   A   z/max_tokens must be between 1 and 64 (inclusive))r   r  rf   snippetr"   r   r  )r!   r  r  over_length
max_tokensr	  s         r&   r  zSearchField.snippet4  sc    J########NOOO*
zz$**1:tU%z3 3 	3r'   )FN)r
  r  )
r(   r)   r*   rO   r   r   r  r  r  r-   r.   s   @r&   r   r     s        N N N N N N! ! ! & & X&N N N3 3 3 3 3 3 3 3r'   r   c                   (     e Zd ZddZd fd	Z xZS )VirtualTableSchemaManagerTc                    | j                             t          | j         j        j        |                    }|                                 }|                    d           |r|                    d           |                    | j                                       d           | j         j        j        }t          |t                    r|                    |          S |                    t          |                                        d           g }| j         j        }|j        r$|                    d |j        D                        |j        D ]}t          |t                    s|j        rt#          |j                  g}|j        r"|                    t          d                     |                    t+          |                     |j        r$|                    d |j        D                        |r(|                    |                     |                     |                    t1          |                    S )NzCREATE VIRTUAL TABLE zIF NOT EXISTS z USING  c                 ,    g | ]}t          |          S r2   r8   r   as     r&   r   zCVirtualTableSchemaManager._create_virtual_table.<locals>.<listcomp>V  s    DDDc!ffDDDr'   	UNINDEXEDc                 ,    g | ]}t          |          S r2   r  r  s     r&   r   zCVirtualTableSchemaManager._create_virtual_table.<locals>.<listcomp>b  s    ===c!ff===r'   )r"   clean_optionsr   r   options_create_contextliteralr   extension_moduler]   r	   r8   prefix_argumentsextendr   r   _hiddenr   r,   r   rl   r
   	arguments_create_table_option_sqlr   )	r!   safer  r9   
ext_moduler#  metarR   	field_defs	            r&   _create_virtual_tablez/VirtualTableSchemaManager._create_virtual_table=  s&   ***tz'/99; ; ""$$+,,, 	*KK()))	
#dj//
')


Z%6
j$'' 	'77:&&&J  ((---	z  	FDDd.CDDDEEE ' 	2 	2E%*.. %-  1223I 3  [!1!1222Xi001111> 	?==dn===>>> 	ET::7CCDDDww'	22333r'   c                     t          | j        t                    r | j        |fi |S  t	          t
          |           j        |fi |S r?   )
issubclassr"   VirtualModelr)  r   r  _create_table)r!   r%  r  r%   s      r&   r-  z'VirtualTableSchemaManager._create_tableh  sd    dj,// 	?-4-d>>g>>>Cu.55C   	r'   T)r(   r)   r*   r)  r-  r-   r.   s   @r&   r  r  <  sR        )4 )4 )4 )4V         r'   r  c                   >    e Zd Z G d d          Zed             ZdS )r,  c                   "    e Zd ZdZdZdZdZeZdS )VirtualModel.MetaNF)	r(   r)   r*   r#  r  r   primary_keyr  schema_manager_classr2   r'   r&   Metar1  q  s,        	8r'   r4  c                     |S r?   r2   )clsr  s     r&   r  zVirtualModel.clean_optionsx  s    r'   N)r(   r)   r*   r4  classmethodr  r2   r'   r&   r,  r,  p  sW        9 9 9 9 9 9 9 9   [  r'   r,  c                   $    e Zd Zed             ZdS )BaseFTSModelc                 ~   |                     d          }|                     d          }|                     d          }|                     d          }t          |t                    r|dk    rd|d<   n<t          |t                    r't	          |j        j        j        |j                  |d<   |||d<   |rVt          |t          t          f          rd                    d |D                       }d	|                    d
          z  |d<   |r*| j        j                                        dk    rd|z  |d<   |S )Ncontentprefixtokenizecontent_rowidrX   z'',c                 ,    g | ]}t          |          S r2   )str)r   is     r&   r   z.BaseFTSModel.clean_options.<locals>.<listcomp>  s    ":":":a3q66":":":r'   z'%s'z' fts5z"%s")getr]   rA  r   r   r"   r   
table_namer,   rd   tuplerZ   stripr  lower)r6  r  r;  r<  r=  r>  s         r&   r  zBaseFTSModel.clean_options~  sG   ++i((X&&;;z**O44gs## 	=2!%GI'' 	=!'(;(F(/(;"= "=GI $'4GO$ 	<&4-00 <":":6":":":;; &d);); ;GH 	4	288::fDD #)8"3GJr'   N)r(   r)   r*   r7  r  r2   r'   r&   r9  r9  }  s-          [  r'   r9  c                      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dS )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dS )FTSModel.MetazFTS%sN)r(   r)   r*   FTS_VERSIONr  r2   r'   r&   r4  rL    s        "[0r'   r4  c           	          | j         j        }| j         j                            d|d|d|d          }|                                S )NzINSERT INTO (z
) VALUES('z');)r   rE  databaseexecute_sqlfetchone)r6  cmdtblress       r&   _fts_cmdzFTSModel._fts_cmd  sO    i"i ,,,25##sssCCC@B B||~~r'   c                 ,    |                      d          S NoptimizerV  r6  s    r&   rY  zFTSModel.optimize      ||J'''r'   c                 ,    |                      d          S NrebuildrZ  r[  s    r&   r_  zFTSModel.rebuild      ||I&&&r'   c                 ,    |                      d          S )Nintegrity-checkrZ  r[  s    r&   integrity_checkzFTSModel.integrity_check  s    ||-...r'         c                 8    |                      d|d|          S )Nzmerge=r?  rZ  )r6  blockssegmentss      r&   mergezFTSModel.merge  s!    |||VVVXX>???r'   Tc                 :    |                      d|rdpdz            S )Nzautomerge=%s10rZ  )r6  states     r&   	automergezFTSModel.automerge  s"    ||Nem.BsCDDDr'   c                 6    t          | j        j        |          S zU
        Generate a `MATCH` expression appropriate for searching this table.
        r   r   r  r6  r   s     r&   r   zFTSModel.match      
 SY%t,,,r'   c                 z    t                               | j        j        t                    }t          j        |g|R  S r?   )rf   	matchinfor   r  FTS3_MATCHINFOfts_rank)r6  weightsru  s      r&   rankzFTSModel.rank  s2    LL!1>BB	{9/w////r'   c                 z    t                               | j        j        t                    }t          j        |g|R  S r?   )rf   ru  r   r  FTS4_MATCHINFOfts_bm25r6  rx  
match_infos      r&   bm25zFTSModel.bm25  s2    \\#)"2NCC
{:00000r'   c                 z    t                               | j        j        t                    }t          j        |g|R  S r?   )rf   ru  r   r  r{  	fts_bm25fr}  s      r&   bm25fzFTSModel.bm25f  s2    \\#)"2NCC
|J11111r'   c                 z    t                               | j        j        t                    }t          j        |g|R  S r?   )rf   ru  r   r  r{  
fts_lucener}  s      r&   lucenezFTSModel.lucene  s2    \\#)"2NCC
}Z2'2222r'   c                    |s |            }nut          |t                    r[g }| j        j        D ]F}	|                    |	|                    |	j        d                    }
|                    |
           G || }n || }d}|}|r| |                    |          f}|r|st          |          } | j	        | 
                    |                     |                                        |          S )N      ?r2   )r]   re   r   r   rD  r#   rl   aliasr8   selectwherer   order_by)r6  r   rx  
with_scorescore_aliasscore_fnexplicit_orderingry  weight_argsrR   field_weight	selectionr  s                r&   _searchzFTSModel._search  s     	&8::DD&& 		&K0 1 1  '{{5'++ej#2N2NOO""<00008[)DD8W%D	 	7djj556I 	(/ 	(;''H$syy''(##	%r'   NFscorec                 @    |                      ||||| j        |          S 'Full-text search using selected `term`.)r  ry  r6  r   rx  r  r  r  s         r&   searchzFTSModel.search  .     {{H  	r'   c                 @    |                      ||||| j        |          S z:Full-text search for selected `term` using BM25 algorithm.)r  r  r  s         r&   search_bm25zFTSModel.search_bm25  r  r'   c                 @    |                      ||||| j        |          S r  )r  r  r  s         r&   search_bm25fzFTSModel.search_bm25f  s.     {{I  	r'   c                 @    |                      ||||| j        |          S r  )r  r  r  s         r&   search_lucenezFTSModel.search_lucene  s.     {{J  	r'   )rd  re  r.  NFr  F)r(   r)   r*   __doc__r0   r1   r4  r7  rV  rY  r_  rc  ri  rn  r   ry  r  r  r  r  r  r  r  r  r2   r'   r&   rJ  rJ    sA         JLLE1 1 1 1 1 1 1 1   [ ( ( [( ' ' [' / / [/ @ @ @ [@ E E E [E - - [- 0 0 [0 1 1 [1 2 2 [2 3 3 [3 % % [%6 FM!&	 	 	 [	 8=;@	 	 	 [	 9><A	 	 	 [	 :?=B	 	 	 [	 	 	r'   rJ  abcdefghijklmnopqrstuvwxyzz	 ,"(){}*:_+0123456789   c              #   `   K   | ])}t          |          t          vt          |          V  *d S r?   )chr	_alphanumr   s     r&   	<genexpr>r  1  s8      KK3q663J3JSVV3J3J3J3JKKr'      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dS )%	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dS )FTS5Model.MetarC  N)r(   r)   r*   r  r2   r'   r&   r4  r  q  s        !r'   r4  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)rB   r  pkc                 ^   | j         j        j        dk    rt          | j        d                   | j         j                                        D ]8}t          |t          t          f          st          | j        d                   9| j         j
        rt          | j        d                   d S )Nr   r  rB   r  )r   r2  r#   ImproperlyConfigured_error_messagesfieldsvaluesr]   r   r   indexes)r6  rR   s     r&   validate_modelzFTS5Model.validate_model{  s     9 %00&s':4'@AAAY%,,.. 	N 	NEek:%>?? N*3+>|+LMMMN9 	E&s':7'CDDD	E 	Er'   c                    t           j        d d         t          k     rdS t          j        d          }	 |                    d           no#  	 |                    d           |                    d           | j        j                            d           n#  Y Y |	                                 dS xY wY nxY w|	                                 n# |	                                 w xY wdS )Nr   Fz:memory:z0CREATE VIRTUAL TABLE fts5test USING fts5 (data);TrC  )
r   sqlite_version_infoFTS5_MIN_SQLITE_VERSIONconnectexecuteenable_load_extensionload_extensionr   rP  close)r6  tmp_dbs     r&   fts5_installedzFTS5Model.fts5_installed  s    &rr*-DDD5 ,,	NNMNNNN	::,,T222%%f--- 	"11&9999u LLNNNNN :9LLNNNNFLLNNNNtsA   A 
C B7*B8 B7B2B7C 2B75C C%c                     t                               |           }|D ]G}|                    d          r|                    d          r-t	          |          t
          z  r dS HdS )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endswithru   _invalid_ascii)querytokenstokens      r&   validate_queryzFTS5Model.validate_query  sv     ""5)) 	 	E$$ )<)< 5zzN* uutr'   r  c                    g }d}t                               |           }|D ]}|                    d          r+|                    d          r|                    |           Bt          |          }|t          z  }|rd}|D ]}|                    ||          }|                    |           |rd                    |          S | S )z2
        Clean a query of invalid tokens.
        Fr  Tr  )	r  r  r  r  rl   ru   r  rx   rZ   )	r  rx   accumany_invalidr  r  	token_setinvalid_for_tokencs	            r&   clean_queryzFTS5Model.clean_query  s    
 ""5)) 
	  
	 E$$ )<)< U###E

I )N :  6"* 6 6A!MM!W55EELL 	#88E??"r'   c                 6    t          | j        j        |          S rp  rq  rr  s     r&   r   zFTS5Model.match  rs  r'   c                 8    |r
 | j         | nt          d          S )Nry  )r  r8   )r6  r$   s     r&   ry  zFTS5Model.rank  s    "&7xsxCKK7r'   c                 :    t          j        | j        j        g|R  S r?   )rf   r  r   r  )r6  rx  s     r&   r  zFTS5Model.bm25  s    wsy'2'2222r'   NFr  c                 d    |                      t                              |          ||||          S r  )r  r  r  r  s         r&   r  zFTS5Model.search  s7     !!$''  	r'   c           
         |st          d          }nt          |t                    rg }| j        j        D ]`}t          |t
                    rI|j        sB|                    |                    ||                    |j	        d                               at          j        | j        j        g|R  }nt          j        | j        j        g|R  }d}	|}
|r| |                    |          f}	|r|st          |          }
 | j        |	                     |                     t"                              |                                                  |
          S )r  ry  r  r2   )r8   r]   re   r   r   r   r   rl   rD  r#   rf   r  r  r  r  r  r   r  r  r  )r6  r   rx  r  r  r  ry  r  rR   r  r  s              r&   r  zFTS5Model.search_bm25  si     
	7v;;DD&& 	7K0 J Je[11 J%/ J&&E7;;uz3+G+GHHJ J J739+:k:::DD739+6g666D	 	7djj556I 	(/ 	(;''H$syy!6!6t!<!<==>>(##	%r'   c           	      l   | j         j        }|g}|g}|                                D ]<\  }}|                    t	          |                     |                    |           =t          t          d          | j         j        t          |          t          d          t          |          f          S )NzINSERT INTOVALUES)r   r  itemsrl   r   r
   r8   r   )r6  rS  extra_paramsrT  columnsr  keyrH   s           r&   _fts_cmd_sqlzFTS5Model._fts_cmd_sql  s    i%&,,.. 	! 	!JCNN6#;;'''MM%    IW%%MMV$$& ' ' 	'r'   c                 \     | j         |fi |}| j        j                            |          S r?   )r  r   rP  r  )r6  rS  r  r  s       r&   rV  zFTS5Model._fts_cmd	  s5      5555y!))%000r'   c                 l    d|cxk    rdk    sn t          d          |                     d|          S )Nr   r  zlevel must be between 0 and 16rn  ry  )r   rV  )r6  levels     r&   rn  zFTS5Model.automerge  sF    U    b    =>>>||Ke|444r'   c                 0    |                      d|          S )Nri  r  rZ  )r6  npagess     r&   ri  zFTS5Model.merge  s    ||G&|111r'   c                 ,    |                      d          S rX  rZ  r[  s    r&   rY  zFTS5Model.optimize  r\  r'   c                 ,    |                      d          S r^  rZ  r[  s    r&   r_  zFTS5Model.rebuild  r`  r'   c                 0    |                      d|          S )Npgszr  rZ  )r6  r  s     r&   set_pgszzFTS5Model.set_pgsz   s    ||F|...r'   c                 0    |                      d|          S )Nry  r  rZ  )r6  rank_expressions     r&   set_rankzFTS5Model.set_rank$  s    ||F|999r'   c                 ,    |                      d          S )Nz
delete-allrZ  r[  s    r&   
delete_allzFTS5Model.delete_all(  s    ||L)))r'   r   c                 0    |                      d|          S )Nrb  r  rZ  )r6  ry  s     r&   rc  zFTS5Model.integrity_check,  s    ||-D|999r'   rowc           	          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)r  colinstancez5table_type must be either "row", "col" or "instance".z_vocab_model_%sc                       e Zd Z j        j        Zp j        j        dz   Ze                     j        j         e	                    Z
dS )"FTS5Model.VocabModel.<locals>.Meta_vN)r(   r)   r*   r   rP  rE  rf   	fts5vocabr  r8   r  )r6  table
table_types   r&   r4  r  9  sV        9-"Aci&:T&A
#%<<I$C
OO$% $%   r'   r4  )r   doccntr   r4  r  r  offsetz%sVocab)r   r   r   	TextFieldIntegerFieldr   r(   setattrr   r,  getattr)r6  r  r  attrr4  attrs
class_names   ```    r&   
VocabModelzFTS5Model.VocabModel0  s,   777 + , , , !:-sD!! 	I% % % % % % % % % % % % %Y//#~~#~~# E U""+I66ez))".|"<"<h"S\1JCtJGGHHHsD!!!r'   r  )r   )r  N)r(   r)   r*   r  r   r   r4  r  r7  r  r  staticmethodr  r  r  r   ry  r  r  r  r  rV  rn  ri  rY  r_  r  r  r  rc  r  r2   r'   r&   r  r  7  s       4 4n JLLE" " " " " " " "5FD	 O E E [E   [*   \ #&3r77    \. - - [- 8 8 [8 3 3 [3 FM!&   [ 8=;@% % % [%6 ' ' [' 1 1 [1 5 5 [5
 2 2 [2 ( ( [( ' ' [' / / [/ : : [: * * [* : : : [: " " " [" " "r'   r  MATCHc                 8    t          | t          j        |          S r?   )r   r   r  )lhsr   s     r&   r   r   T  s    c28S)))r'   ):rg   resyswarningspeeweer   r   r   r   r   r	   r
   r   r   r   r   playhouse.sqlite_udfr   r   r   rv  r{  r  rM  r  	AutoFieldr   r0   r4   DecimalFieldr<   DateTimeFieldrD   rL   r   r  r   r   r   r   SchemaManagerr  Modelr,  r9  rJ  	_alphabetru   upperr  r  ranger  compiler  r  r  r   r2   r'   r&   <module>r     s    				 



            # # # # # #                                                       % % % % % % % % % % % % 4 4 4 4 4 4 
22A26)CC!!KKK# 9 9 9 9 9 9 9 91 1 1 1 1 1 1 1; ; ; ; ; ; ; ;" " " " "L " " "
% % % % %} % % %;7 ;7 ;7 ;7 ;7z ;7 ;7 ;7z7 7 7 7 7 7 7 7>]" ]" ]" ]" ]"	 ]" ]" ]"@- - - - - - - -.3 3 3 3 3% 3 3 3>1 1 1 1 1 1 1 1h
 
 
 
 
5 
 
 
    <   @L L L L L| L L L^ )	S*++S^^S""##$ S##b''__	 KKUU3ZZKKKKKBJ:;;	X" X" X" X" X" X" X" X"v * * * * *r'   