o
    ðT·j t  ã                   @   sô  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ZdZdZdZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd „ d eƒZG d!d"„ d"eƒZG d#d$„ d$e ƒZ!G d%d&„ d&e"ƒZ#G d'd(„ d(e$ƒZ%G d)d*„ d*e%ƒZ&G d+d,„ d,e&ƒZ'd-Z(e)d.ƒe)e(ƒB e)e( *¡ ƒB e)e+d/ƒfƒB Z,e)d0d1„ e-d2ƒD ƒƒZ.[([,e /d3¡Z0G d4d5„ d5e&ƒZ1d6e	_2d7d8„ Z3dS )9é    N)Ú*)Ú
ColumnBase)ÚEnclosedNodeList)ÚEntity)Ú
Expression)ÚNode)ÚNodeList)ÚOP)Ú
merge_dict)Úsqlite3)Ú
fts_parserÚpcxÚpcnalxé   )é   é	   r   c                       s,   e Zd ZdZd Z ZZ‡ fdd„Z‡  ZS )Ú
RowIDFieldTÚrowidc                    s>   || j krtdt| ƒ| j f ƒ‚tt| ƒj||g|¢R Ž  d S )Nz%s must be named "%s".)Úrequired_nameÚ
ValueErrorÚtypeÚsuperr   Úbind)ÚselfÚmodelÚnameÚargs©Ú	__class__© úW/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/playhouse/sqlite_ext.pyr      s
   
ÿzRowIDField.bind)	Ú__name__Ú
__module__Ú__qualname__Úauto_incrementÚcolumn_namer   r   r   Ú__classcell__r   r   r   r    r      s    r   c                   @   s   e Zd Zd Z ZZdS )Ú
DocIDFieldÚdocidN)r!   r"   r#   r%   r   r   r   r   r   r    r'   "   s    r'   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚAutoIncrementFieldc                    s    t t| ƒ |¡}t|tdƒfƒS )NÚAUTOINCREMENT)r   r)   Úddlr   ÚSQL)r   ÚctxÚ	node_listr   r   r    r+   '   s   zAutoIncrementField.ddl)r!   r"   r#   r+   r&   r   r   r   r    r)   &   s    r)   c                       s(   e Zd ZdZdd„ Z‡ fdd„Z‡  ZS )ÚTDecimalFieldÚTEXTc                 C   s   d S ©Nr   ©r   r   r   r    Úget_modifiers.   s    zTDecimalField.get_modifiersc                    s    |d urt tt| ƒ |¡ƒS d S r1   )Ústrr   r/   Údb_value©r   Úvaluer   r   r    r5   0   s   ÿzTDecimalField.db_value)r!   r"   r#   Ú
field_typer3   r5   r&   r   r   r   r    r/   ,   s    r/   c                   @   s   e Zd Zg d¢Zd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                 C   s.   t |tƒr
|  |¡}|rt |tƒs| ¡ S |S r1   )Ú
isinstancer4   ÚadaptÚ	isoformatr6   r   r   r    r5   >   s
   

zISODateTimeField.db_valueN)r!   r"   r#   Úformatsr5   r   r   r   r    r9   5   s    r9   c                       s¤   e Zd Zd"‡ fdd„	Zdd„ Zedd„ ƒZdd	„ Zd"d
d„Zd"dd„Z	d"dd„Z
d"dd„Zd"dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Z‡  ZS )#ÚJSONPathNc                    s"   t t| ƒ ¡  || _|pd| _d S ©Nr   )r   r>   Ú__init__Ú_fieldÚ_path)r   ÚfieldÚpathr   r   r    r@   H   s   zJSONPath.__init__c                 C   s   | j  |¡S r1   )rA   Úpython_valuer6   r   r   r    Ú
_converterM   s   zJSONPath._converterc                 C   s   t dd | j¡ ƒS )Nz$%sÚ )ÚValueÚjoinrB   r2   r   r   r    rD   P   s   zJSONPath.pathc                 C   sD   t |tƒs	|dkrd| }nd| dd¡ }t| ƒ| j| j|f ƒS )Nú#z[%s]z."%s"ú"z"")r:   ÚintÚreplacer   rA   rB   )r   ÚidxÚitemr   r   r    Ú__getitem__T   s   
zJSONPath.__getitem__c                 C   ó:   |s	t |ttfƒrt | j |¡¡}t | j| d j|¡S ©NrJ   )	r:   ÚlistÚdictÚfnÚjsonrA   Ú_json_dumpsÚjson_setrD   ©r   r7   Úas_jsonr   r   r    Úappend[   ó   zJSONPath.appendc                 C   ó4   |s	t |ttfƒrt | j |¡¡}|| j| j|ƒS r1   )r:   rS   rT   rU   rV   rA   rW   rD   ©r   Úfuncr7   rZ   r   r   r    Ú_json_operation`   ó   zJSONPath._json_operationc                 C   ó   |   tj||¡S r1   )r`   rU   Újson_insertrY   r   r   r    Úinserte   ó   zJSONPath.insertc                 C   rb   r1   )r`   rU   rX   rY   r   r   r    Úseth   re   zJSONPath.setc                 C   rb   r1   )r`   rU   Újson_replacerY   r   r   r    rM   k   re   zJSONPath.replacec                 C   ó   |   t | | j |¡¡¡S r1   )rf   rU   Ú
json_patchrA   rW   r6   r   r   r    Úupdaten   ó   zJSONPath.updatec                 C   ó   t  | j| j¡S r1   )rU   Újson_removerA   rD   r2   r   r   r    Úremoveq   re   zJSONPath.removec                 C   rl   r1   )rU   Ú	json_typerA   rD   r2   r   r   r    ro   t   re   zJSONPath.json_typec                 C   rl   r1   )rU   Újson_array_lengthrA   rD   r2   r   r   r    Úlengthw   re   zJSONPath.lengthc                 C   rl   r1   )rU   Ú	json_eachrA   rD   r2   r   r   r    Úchildrenz   re   zJSONPath.childrenc                 C   rl   r1   )rU   Ú	json_treerA   rD   r2   r   r   r    Útree}   re   zJSONPath.treec                 C   ó$   |  | jrt | j| j¡¡S | j¡S r1   )ÚsqlrB   rU   Újson_extractrA   rD   ©r   r-   r   r   r    Ú__sql__€   ó
   ÿÿzJSONPath.__sql__r1   )r!   r"   r#   r@   rF   ÚpropertyrD   rP   r[   r`   rd   rf   rM   rj   rn   ro   rq   rs   ru   rz   r&   r   r   r   r    r>   G   s$    





r>   c                   @   sV   e Zd Zddd„Zddd„Zddd„Zddd	„Zdd
d„Zdd„ Zdd„ Z	dd„ Z
dS )Ú	JSONBPathNc                 C   rQ   rR   )	r:   rS   rT   rU   ÚjsonbrA   rW   Ú	jsonb_setrD   rY   r   r   r    r[   …   r\   zJSONBPath.appendc                 C   r]   r1   )r:   rS   rT   rU   r~   rA   rW   rD   r^   r   r   r    r`   Š   ra   zJSONBPath._json_operationc                 C   rb   r1   )r`   rU   Újsonb_insertrY   r   r   r    rd   �   re   zJSONBPath.insertc                 C   rb   r1   )r`   rU   r   rY   r   r   r    rf   ’   re   zJSONBPath.setc                 C   rb   r1   )r`   rU   Újsonb_replacerY   r   r   r    rM   •   re   zJSONBPath.replacec                 C   rh   r1   )rf   rU   Újsonb_patchrA   rW   r6   r   r   r    rj   ˜   rk   zJSONBPath.updatec                 C   rl   r1   )rU   Újsonb_removerA   rD   r2   r   r   r    rn   ›   re   zJSONBPath.removec                 C   rv   r1   )rw   rB   rU   Újsonb_extractrA   rD   ry   r   r   r    rz   ž   r{   zJSONBPath.__sql__r1   )r!   r"   r#   r[   r`   rd   rf   rM   rj   rn   rz   r   r   r   r    r}   „   s    




r}   c                       sú   e Zd ZdZeZd'‡ fdd„	Zdd„ Zdd„ Zd	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d„ Zdd„ Zdd„ Zdd„ Zd(dd„Zd(dd„Zd(dd„Zd(dd„Z dd„ Z!dd„ Z"dd „ Z#d(d!d"„Z$d#d$„ Z%d%d&„ Z&‡  Z'S ))Ú	JSONFieldr0   Nc                    s2   |pt j| _|p
t j| _tt| ƒjdi |¤Ž d S r?   )rV   ÚdumpsrW   ÚloadsÚ_json_loadsr   r…   r@   )r   Ú
json_dumpsÚ
json_loadsÚkwargsr   r   r    r@   §   s   zJSONField.__init__c              	   C   s4   |d urz|   |¡W S  ttfy   | Y S w d S r1   )rˆ   Ú	TypeErrorr   r6   r   r   r    rE   ¬   s   ÿýzJSONField.python_valuec                 C   ó*   |d urt |tƒst |  |¡¡}|S d S r1   )r:   r   rU   rV   rW   r6   r   r   r    r5   ³   ó
   
ýzJSONField.db_valuec                    s   ‡ fdd„}|S )Nc                    s&   t |ttfƒrt|| jƒ}t| ˆ |ƒS r1   )r:   rS   rT   ÚAsIsr5   r   )r   Úrhs©Úopr   r    Úinnerº   s   zJSONField._e.<locals>.innerr   )r’   r“   r   r‘   r    Ú_e¹   s   zJSONField._ec                 C   s   |   | ¡| S r1   )ÚPath)r   rO   r   r   r    rP   Ç   ó   zJSONField.__getitem__c                 G   ó    dd„ |D ƒ}t j| g|¢R Ž S )Nc                 S   ó   g | ]}t |d d�‘qS ©F©Ú	converter©rH   ©Ú.0Úpr   r   r    Ú
<listcomp>Ë   ó    z%JSONField.extract.<locals>.<listcomp>)rU   rx   ©r   Úpathsr   r   r    ÚextractÊ   ó   zJSONField.extractc                 C   ó   t | dt|dd�ƒS )Nz->Frš   ©r   rH   ©r   rD   r   r   r    Úextract_jsonÍ   ó   zJSONField.extract_jsonc                 C   r¦   )Nz->>Frš   r§   r¨   r   r   r    Úextract_textÏ   rª   zJSONField.extract_textc                 C   ó   |   | ¡ ||¡S r1   )r•   r[   rY   r   r   r    r[   Ò   ó   zJSONField.appendc                 C   r¬   r1   )r•   rd   rY   r   r   r    rd   Õ   r­   zJSONField.insertc                 C   r¬   r1   )r•   rf   rY   r   r   r    rf   Ø   r­   zJSONField.setc                 C   r¬   r1   )r•   rM   rY   r   r   r    rM   Û   r­   zJSONField.replacec                 C   s   |   | ¡ |¡S r1   )r•   rj   )r   Údatar   r   r    rj   Þ   re   zJSONField.updatec                 G   ó$   |s	|   | ¡ ¡ S tj| g|¢R Ž S r1   )r•   rn   rU   rm   r¢   r   r   r    rn   á   ó   zJSONField.removec                 C   ó
   t  | ¡S r1   )rU   ro   r2   r   r   r    ro   æ   ó   
zJSONField.json_typec                 C   s   |r| |fn| f}t j|Ž S r1   )rU   rp   )r   rD   r   r   r   r    rq   é   s   
zJSONField.lengthc                 C   r±   )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)
        )rU   rr   r2   r   r   r    rs   í   s   
zJSONField.childrenc                 C   r±   r1   )rU   rt   r2   r   r   r    ru   þ   r²   zJSONField.tree)NNr1   )(r!   r"   r#   r8   r>   r•   r@   rE   r5   r”   r	   ÚEQÚ__eq__ÚNEÚ__ne__ÚGTÚ__gt__ÚGTEÚ__ge__ÚLTÚ__lt__ÚLTEÚ__le__ÚFieldÚ__hash__rP   r¤   r©   r«   r[   rd   rf   rM   rj   rn   ro   rq   rs   ru   r&   r   r   r   r    r…   £   s8    










r…   c                   @   s4   e Zd ZdZeZdd„ Zdd„ Zdd„ Zdd	„ Z	d
S )Ú
JSONBFieldÚJSONBc                 C   r�   r1   )r:   r   rU   r~   rW   r6   r   r   r    r5     rŽ   zJSONBField.db_valuec                 C   r±   r1   )rU   rV   r2   r   r   r    rV     r²   zJSONBField.jsonc                 G   r—   )Nc                 S   r˜   r™   rœ   r�   r   r   r    r      r¡   z&JSONBField.extract.<locals>.<listcomp>)rU   r„   r¢   r   r   r    r¤     r¥   zJSONBField.extractc                 G   r¯   r1   )r•   rn   rU   rƒ   r¢   r   r   r    rn     r°   zJSONBField.removeN)
r!   r"   r#   r8   r}   r•   r5   rV   r¤   rn   r   r   r   r    rÁ     s    rÁ   c                       sD   e Zd Zd‡ fdd„	Zdd„ Zedd„ ƒZd	d
„ Zddd„Z‡  Z	S )ÚSearchFieldFNc                    s.   |r
t dt|ƒ ƒ‚tt| ƒj||dd� d S )Nz8SearchField does not accept these keyword arguments: %s.T)Ú	unindexedr%   Únull)r   Úsortedr   rÃ   r@   )r   rÄ   r%   Úkr   r   r    r@     s   ÿ
ÿzSearchField.__init__c                 C   s
   t | |ƒS r1   )Úmatch)r   Útermr   r   r    rÈ   !  r²   zSearchField.matchc                 C   s2   t | dƒsdd„ | jjjD ƒ}| | j¡| _| jS )NÚ_fts_column_indexc                 S   s   g | ]
}t |tƒr|j‘qS r   )r:   rÃ   r   ©rž   Úfr   r   r    r    '  s    ÿz0SearchField.fts_column_index.<locals>.<listcomp>)Úhasattrr   Ú_metaÚsorted_fieldsÚindexr   rÊ   )r   Úsearch_fieldsr   r   r    Úfts_column_index$  s   
zSearchField.fts_column_indexc                 C   s   | j }t | jjj|||¡S r1   )rÒ   rU   Ú	highlightr   rÎ   Úentity)r   ÚleftÚrightÚ
column_idxr   r   r    rÓ   ,  s   zSearchField.highlightú...é   c                 C   sD   d|  k rdk st dƒ‚ t dƒ‚| j}t | jjj|||||¡S )Nr   éA   z/max_tokens must be between 1 and 64 (inclusive))r   rÒ   rU   Úsnippetr   rÎ   rÔ   )r   rÕ   rÖ   Úover_lengthÚ
max_tokensr×   r   r   r    rÛ   0  s   ÿÿzSearchField.snippet)FN)rØ   rÙ   )
r!   r"   r#   r@   rÈ   r|   rÒ   rÓ   rÛ   r&   r   r   r   r    rÃ     s    
rÃ   c                       s(   e Zd Zddd„Zd‡ fdd„	Z‡  ZS )ÚVirtualTableSchemaManagerTc           	      K   s.  | j  t| j jj|ƒ¡}|  ¡ }| d¡ |r| d¡ | | j ¡ d¡ | j jj}t	|t
ƒr4| |¡S | t|ƒ¡ d¡ g }| j j}|jrR| dd„ |jD ƒ¡ |jD ]"}t	|tƒs_|jr`qUt|jƒg}|jrp| tdƒ¡ | t|ƒ¡ qU|jr†| dd„ |jD ƒ¡ |r�| |  |¡¡ | t|ƒ¡S )	NzCREATE VIRTUAL TABLE zIF NOT EXISTS z USING ú c                 S   ó   g | ]}t |ƒ‘qS r   ©r,   ©rž   Úar   r   r    r    R  ó    zCVirtualTableSchemaManager._create_virtual_table.<locals>.<listcomp>Ú	UNINDEXEDc                 S   rà   r   rá   râ   r   r   r    r    ^  rä   )r   Úclean_optionsr
   rÎ   ÚoptionsÚ_create_contextÚliteralrw   Úextension_moduler:   r   r,   Úprefix_argumentsÚextendrÏ   r   Ú_hiddenr   r%   rÄ   r[   r   Ú	argumentsÚ_create_table_option_sqlr   )	r   Úsaferç   r-   Ú
ext_modulerî   ÚmetarC   Ú	field_defr   r   r    Ú_create_virtual_table9  s<   ÿ





z/VirtualTableSchemaManager._create_virtual_tablec                    s6   t | jtƒr| j|fi |¤ŽS tt| ƒj|fi |¤ŽS r1   )Ú
issubclassr   ÚVirtualModelrô   r   rÞ   Ú_create_table)r   rð   rç   r   r   r    r÷   d  s   
ÿÿz'VirtualTableSchemaManager._create_table©T)r!   r"   r#   rô   r÷   r&   r   r   r   r    rÞ   8  s    
+rÞ   c                   @   s&   e Zd ZG dd„ dƒZedd„ ƒZdS )rö   c                   @   s    e Zd ZdZdZdZdZeZdS )zVirtualModel.MetaNF)	r!   r"   r#   rî   rê   rë   Úprimary_keyrÞ   Úschema_manager_classr   r   r   r    ÚMetam  s    rû   c                 C   s   |S r1   r   )Úclsrç   r   r   r    ræ   t  s   zVirtualModel.clean_optionsN)r!   r"   r#   rû   Úclassmethodræ   r   r   r   r    rö   l  s    rö   c                   @   s   e Zd Zedd„ ƒZdS )ÚBaseFTSModelc                 C   s¼   |  d¡}|  d¡}|  d¡}t|tƒr|dkrd|d< n	t|tƒr&tdƒ‚|rLt|ttfƒr:d dd	„ |D ƒ¡}n	t|tƒrCt|ƒ}d
| 	d¡ |d< |r\| j
j ¡ dkr\d| |d< |S )NÚcontentÚprefixÚtokenizerG   z''z[The content option must be a Model, a table-name string, or the empty string (contentless).ú,c                 S   rà   r   )r4   )rž   Úir   r   r    r    ‹  rä   z.BaseFTSModel.clean_options.<locals>.<listcomp>z'%s'z' Úfts5z"%s")Úgetr:   r4   r¿   ÚImproperlyConfiguredrS   ÚtuplerI   rL   ÚstriprÎ   rê   Úlower)rü   rç   rÿ   r   r  r   r   r    ræ   z  s    





zBaseFTSModel.clean_optionsN)r!   r"   r#   rý   ræ   r   r   r   r    rþ   y  s    rþ   c                   @   s   e Zd ZdZeƒ ZG dd„ dƒZedd„ ƒZedd„ ƒZ	edd	„ ƒZ
ed
d„ ƒZed*dd„ƒZed+dd„ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZe	!	 d,d"d#„ƒZe	 	 d,d$d%„ƒZe	 	 d,d&d'„ƒZe	 	 d,d(d)„ƒZdS )-ÚFTSModelz�
    VirtualModel class for creating tables that use the FTS4 search
    extension. To use FTS3, set ``Meta.extension_module = 'FTS3'``.
    c                   @   s   e Zd Zde ZdS )zFTSModel.MetazFTS%sN)r!   r"   r#   ÚFTS_VERSIONrê   r   r   r   r    rû   Ÿ  s    rû   c                 C   s(   | j j}| j j d|||f ¡}| ¡ S )Nz INSERT INTO %s(%s) VALUES('%s');)rÎ   Ú
table_nameÚdatabaseÚexecute_sqlÚfetchone)rü   ÚcmdÚtblÚresr   r   r    Ú_fts_cmd¢  s
   ÿzFTSModel._fts_cmdc                 C   ó
   |   d¡S ©NÚoptimize©r  ©rü   r   r   r    r  ©  ó   
zFTSModel.optimizec                 C   r  ©NÚrebuildr  r  r   r   r    r  ­  r  zFTSModel.rebuildc                 C   r  )Núintegrity-checkr  r  r   r   r    Úintegrity_check±  r  zFTSModel.integrity_checkéÈ   é   c                 C   s   |   d||f ¡S )Nzmerge=%s,%sr  )rü   ÚblocksÚsegmentsr   r   r    Úmergeµ  s   zFTSModel.mergeTc                 C   s   |   d|rdpd ¡S )Nzautomerge=%sÚ1Ú0r  )rü   Ústater   r   r    Ú	automerge¹  ó   zFTSModel.automergec                 C   ó   t | jj|ƒS ©zU
        Generate a `MATCH` expression appropriate for searching this table.
        ©rÈ   rÎ   rÔ   ©rü   rÉ   r   r   r    rÈ   ½  ó   zFTSModel.matchc                 G   ó"   t  | jjt¡}t j|g|¢R Ž S r1   )rU   Ú	matchinforÎ   rÔ   ÚFTS3_MATCHINFOÚfts_rank)rü   Úweightsr.  r   r   r    ÚrankÄ  ó   zFTSModel.rankc                 G   r-  r1   )rU   r.  rÎ   rÔ   ÚFTS4_MATCHINFOÚfts_bm25©rü   r1  Ú
match_infor   r   r    Úbm25É  r3  zFTSModel.bm25c                 G   r-  r1   )rU   r.  rÎ   rÔ   r4  Ú	fts_bm25fr6  r   r   r    Úbm25fÎ  r3  zFTSModel.bm25fc                 G   r-  r1   )rU   r.  rÎ   rÔ   r4  Ú
fts_lucener6  r   r   r    ÚluceneÓ  r3  zFTSModel.lucenec                 C   s¬   |s|ƒ }n-t |tƒr/g }| jjD ]}	t |	tƒrq| |	| |	jd¡¡}
| |
¡ q||Ž }n||Ž }d}|}|r@| | |¡f}|rH|sHt	|ƒ}| j
|Ž  |  |¡¡ |¡S )Nç      ð?r   )r:   rT   rÎ   rÏ   r   r  r   r[   Úaliasr,   ÚselectÚwhererÈ   Úorder_by)rü   rÉ   r1  Ú
with_scoreÚscore_aliasÚscore_fnÚexplicit_orderingr2  Úweight_argsrC   Úfield_weightÚ	selectionrA  r   r   r    Ú_searchØ  s.   


ÿýzFTSModel._searchNFÚscorec                 C   ó   |   ||||| j|¡S ©ú'Full-text search using selected `term`.)rI  r2  ©rü   rÉ   r1  rB  rC  rE  r   r   r    Úsearch÷  ó   úzFTSModel.searchc                 C   rK  )z:Full-text search for selected `term` using BM25 algorithm.)rI  r8  rN  r   r   r    Úsearch_bm25  rP  zFTSModel.search_bm25c                 C   rK  )z;Full-text search for selected `term` using BM25F algorithm.)rI  r:  rN  r   r   r    Úsearch_bm25f  rP  zFTSModel.search_bm25fc                 C   rK  )z<Full-text search for selected `term` using Lucene algorithm.)rI  r<  rN  r   r   r    Úsearch_lucene  rP  zFTSModel.search_lucene)r  r  rø   ©NFrJ  F)r!   r"   r#   Ú__doc__r   r   rû   rý   r  r  r  r  r"  r&  rÈ   r2  r8  r:  r<  rI  rO  rQ  rR  rS  r   r   r   r    r
  ˜  sX    









ÿÿÿÿr
  Úabcdefghijklmnopqrstuvwxyzz	 ,"(){}*:_+0123456789é   c                 c   s$   � | ]}t |ƒtvrt |ƒV  qd S r1   )ÚchrÚ	_alphanumr�   r   r   r    Ú	<genexpr>-  s   €" rZ  é€   z [^\s"]+|"[^"\\]*(?:\\.[^"\\]*)*"c                   @   sP  e Zd ZdZeƒ ZG dd„ dƒZddddœZedd	„ ƒZ	ed
d„ ƒZ
edd„ ƒZeedƒfdd„ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZe		d:dd„ƒZe		d:dd„ƒZed d!„ ƒZed"d#„ ƒZed$d%„ ƒZed&d'„ ƒZed(d)„ ƒZed*d+„ ƒZed,d-„ ƒZed.d/„ ƒZed0d1„ ƒZed2d3„ ƒZed;d5d6„ƒZed<d8d9„ƒZ dS )=Ú	FTS5Modela  
    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 its 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, unless created with
    the contentless_delete=1 option (sqlite >= 3.43).

    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(ft, rowid, b) VALUES('delete', old.a, old.b);
    END;
    CREATE TRIGGER tbl_au AFTER UPDATE ON tbl BEGIN
      INSERT INTO ft(ft, rowid, b) VALUES('delete', old.a, old.b);
      INSERT INTO ft(rowid, b) VALUES (new.a, new.b);
    END;

    Note: with sqlite's default recursive_triggers=off, INSERT OR REPLACE on
    the content table skips the delete trigger and corrupts the index. Enable
    PRAGMA recursive_triggers if REPLACE may be used.

    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                   @   s   e Zd ZdZdS )zFTS5Model.Metar  N)r!   r"   r#   rê   r   r   r   r    rû   r  s    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)r8   rÐ   Úpkc                 C   sd   | j jjdkrt| jd ƒ‚| j j ¡ D ]}t|tt	fƒs$t| jd ƒ‚q| j j
r0t| jd ƒ‚d S )Nr   r]  r8   rÐ   )rÎ   rù   r   r  Ú_error_messagesÚfieldsÚvaluesr:   rÃ   r   Úindexes)rü   rC   r   r   r    Úvalidate_model|  s   ÿÿzFTS5Model.validate_modelc              	   C   s    t jd d… tk rdS t  d¡}z:z| d¡ W n+   z| d¡ | d¡ W n   Y Y W | ¡  dS | jj	 d¡ Y W | ¡  dS W | ¡  dS | ¡  w )Nr   Fz:memory:z0CREATE VIRTUAL TABLE fts5test USING fts5 (data);Tr  )
r   Úsqlite_version_infoÚFTS5_MIN_SQLITE_VERSIONÚconnectÚexecuteÚenable_load_extensionÚload_extensionÚcloserÎ   r  )rü   Útmp_dbr   r   r    Úfts5_installed‡  s&   

þô

þzFTS5Model.fts5_installedc                 C   s@   t  | ¡}|D ]}| d¡r| d¡rqt|ƒt@ r dS qd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.
        rK   FT)Ú	_quote_reÚfindallÚ
startswithÚendswithrf   Ú_invalid_ascii)ÚqueryÚtokensÚtokenr   r   r    Úvalidate_query�  s   
ÿzFTS5Model.validate_queryrW  c           	      C   s†   g }d}t  | ¡}|D ].}| d¡r| d¡r| |¡ qt|ƒ}|t@ }|r4d}|D ]}| ||¡}q+| |¡ q|rAd |¡S | S )z2
        Clean a query of invalid tokens.
        FrK   Trß   )	rl  rm  rn  ro  r[   rf   rp  rM   rI   )	rq  rM   ÚaccumÚany_invalidrr  rs  Ú	token_setÚinvalid_for_tokenÚcr   r   r    Úclean_query¬  s"   


zFTS5Model.clean_queryc                 C   s   dd„ | j jD ƒ}t ||¡S )z�
        Translate a search-box query (quoted phrases, AND/OR/NOT, -exclusion,
        column:filters, parentheses) into an FTS5 query.
        c                 S   s"   g | ]}t |tƒr|js|j‘qS r   )r:   rÃ   rÄ   r%   rË   r   r   r    r    Ê  s
    ÿÿz'FTS5Model.web_query.<locals>.<listcomp>)rÎ   rÏ   Ú_fts_parserÚparse)rü   rq  Úcolumnsr   r   r    Ú	web_queryÄ  s   zFTS5Model.web_queryc                 C   r(  r)  r*  r+  r   r   r    rÈ   Î  r,  zFTS5Model.matchc                 G   s   |r| j |Ž S tdƒS )Nr2  )r8  r,   )rü   r   r   r   r    r2  Õ  r'  zFTS5Model.rankc                 G   s   t j| jjg|¢R Ž S r1   )rU   r8  rÎ   rÔ   )rü   r1  r   r   r    r8  Ù  r'  zFTS5Model.bm25NFrJ  c                 C   s   |   t |¡||||¡S rL  )rQ  r\  rz  rN  r   r   r    rO  Ý  s   ûzFTS5Model.searchc              
   C   sÊ   |st dƒ}n8t|tƒr4g }| jjD ]}t|tƒr'| | || |jd¡¡¡ qt	j
| jjg|¢R Ž }nt	j
| jjg|¢R Ž }d}	|}
|rL| | |¡f}	|rT|sTt |ƒ}
| j|	Ž  |  t |¡¡¡ |
¡S )rM  r2  r=  r   )r,   r:   rT   rÎ   rÏ   rÃ   r[   r  r   rU   r8  rÔ   r>  r?  r@  rÈ   r\  rz  rA  )rü   rÉ   r1  rB  rC  rE  r2  rF  rC   rH  rA  r   r   r    rQ  è  s0   


ÿ€ÿýzFTS5Model.search_bm25c                 K   sd   | j j}|g}|g}| ¡ D ]\}}| t|ƒ¡ | |¡ qttdƒ| j jt|ƒtdƒt|ƒfƒS )NzINSERT INTOÚVALUES)rÎ   rÔ   Úitemsr[   r   r   r,   r   )rü   r  Úextra_paramsr  r}  r`  Úkeyr7   r   r   r    Ú_fts_cmd_sql  s   ûzFTS5Model._fts_cmd_sqlc                 K   s    | j |fi |¤Ž}| jj |¡S r1   )rƒ  rÎ   r  rf  )rü   r  r�  rq  r   r   r    r    s   zFTS5Model._fts_cmdc                 C   s2   d|  krdkst dƒ‚ t dƒ‚| jd|d�S )Nr   é@   zlevel must be between 0 and 64r&  ©r2  )r   r  )rü   Úlevelr   r   r    r&    s
   ÿzFTS5Model.automergec                 C   ó   | j d|d�S )Nr"  r…  r  )rü   Únpagesr   r   r    r"  !  ó   zFTS5Model.mergec                 C   r  r  r  r  r   r   r    r  %  r  zFTS5Model.optimizec                 C   r  r  r  r  r   r   r    r  )  r  zFTS5Model.rebuildc                 C   r‡  )NÚpgszr…  r  )rü   rŠ  r   r   r    Úset_pgsz-  r‰  zFTS5Model.set_pgszc                 C   r‡  )Nr2  r…  r  )rü   Úrank_expressionr   r   r    Úset_rank1  r‰  zFTS5Model.set_rankc                 C   r  )Nz
delete-allr  r  r   r   r    Ú
delete_all5  r  zFTS5Model.delete_allc                 K   sœ   i }| j jD ]0}t|tƒsq|j|v r| |j¡||j< q|j|v r,| |j¡||j< q|js6td|j ƒ‚q|rDtdd 	t
|ƒ¡ ƒ‚| jdd|i|¤ŽS )a  
        Remove a row using the fts5 'delete' command, passing the values
        exactly as they were indexed. This is how rows are removed from
        external-content and contentless tables, which cannot look up the
        old values themselves.
        zIdelete_command() requires the value of "%s" as it was originally indexed.z4delete_command() received unrecognized column(s): %sz, Údeleter   N)r�  )rÎ   rÏ   r:   rÃ   r   Úpopr%   rÄ   r   rI   rÆ   r  )rü   r   r`  ru  rC   r   r   r    Údelete_command9  s$   


ÿýÿzFTS5Model.delete_commandr   c                 C   r‡  )Nr  r…  r  )rü   r2  r   r   r    r  S  r‰  zFTS5Model.integrity_checkÚrowc                    s�   ˆdvrt dƒ‚ˆdkrdndˆ ‰G ‡ ‡‡‡fdd„dƒ}ˆdkr%d}n	ˆd	kr,d
}nd}dd„ |D ƒ}tƒ |d< ||d< tdˆ j tf|ƒS )N)r’  ÚcolÚinstancez5table_type must be either "row", "col" or "instance".r’  Ú_vz_v_%sc                       s8   e Zd Z” jjZ”p” jj” Ze ” jje	”ƒ¡Z
dS )z"FTS5Model.VocabModel.<locals>.MetaN)r!   r"   r#   rÎ   r  r  rU   Ú	fts5vocabrÔ   r,   rê   r   ©rü   ÚsuffixÚtableÚ
table_typer   r    rû   a  s    þrû   )rÉ   ÚdocÚcntr“  )rÉ   r“  r›  rœ  )rÉ   r›  r“  Úoffsetc                 S   s"   i | ]}||d v rt ƒ ntƒ “qS ))rÉ   r“  )Ú	TextFieldÚIntegerField)rž   ry  r   r   r    Ú
<dictcomp>o  s    ÿz(FTS5Model.VocabModel.<locals>.<dictcomp>r   z%sVocab)r   r   r   r!   rö   )rü   rš  r™  rû   r}  Úattrsr   r—  r    Ú
VocabModelW  s   ÿ
zFTS5Model.VocabModelrT  )r   )r’  N)!r!   r"   r#   rU  r   r   rû   r^  rý   rb  rk  Ústaticmethodrt  rX  rz  r~  rÈ   r2  r8  rO  rQ  rƒ  r  r&  r"  r  r  r‹  r�  rŽ  r‘  r  r¢  r   r   r   r    r\  3  sp    <ü




	


ÿ
ÿ









r\  ÚMATCHc                 C   s   t | tj|ƒS r1   )r   r	   r¤  )Úlhsr�   r   r   r    rÈ   {  r–   rÈ   )4rV   ÚreÚpeeweer   r   r   r   r   r   r	   r
   r   Ú	playhouser   r{  r/  r4  r  rd  Ú	AutoFieldr   r'   r)   ÚDecimalFieldr/   ÚDateTimeFieldr9   r>   r}   rž  r…   rÁ   r¿   rÃ   ÚSchemaManagerrÞ   ÚModelrö   rþ   r
  Ú	_alphabetrf   ÚupperrX  rY  Úrangerp  Úcompilerl  r\  r¤  rÈ   r   r   r   r    Ú<module>   sb    	=_4 ÿ
þý
  H