� =��g������ddlZddlZddlZddlZddlZddlTddlmZddlmZddlmZddlm Z ddlm Z ddlm Z dd lm Z dd lm Z dd lmZdd lmZdd lmZ ddlmZmZmZmZmZmZmZmZmZmZmZdZn #e$rdZYnwxYwejddkre Z!dZ"dZ#e�ej$dd�dkrdndZ%ndZ%dZ&Gd�de'��Z(Gd�de(��Z)Gd�de'��Z*Gd�de+��Z,Gd�d e��Z-Gd!�d"e-��Z.Gd#�d$e/��Z0Gd%�d&e0��Z1Gd'�d(e2��Z3Gd)�d*e4��Z5Gd+�d,e6��Z7Gd-�d.e7��Z8Gd/�d0e8��Z9d1Z:e;d2��e;e:��ze;e:�<����ze;e=d3��f��zZ>e;d4�e?d5��D����Z@[:[>ejAd6��ZBGd7�d8e8��ZC dRd9�ZDGd:�d;e7��ZEd<e _Fd=�ZGGd>�d?eH��ZIer@dZJd@ZKdAZLdZMdZNdBZOdCZPdDZQdEZRdFZSdZTd@ZUdAZVdZWdZXdBZYdCZZdDZ[dEZ\dFZ]dGZ^dSdH�Z_dTdI�Z`GdJ�dKeI��ZadL�ZbdM�ZcdN�ZddO�ZedP�ZfdQ�ZgdS)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� rc�.��eZdZdZdxZxZZ�fd�Z�xZS)� RowIDFieldT�rowidc���||jkr'tt|���d|j�d����tt|��j||g|�R�dS)Nz must be named "z".)� required_name� ValueError�type�superr!�bind)�self�model�name�args� __class__s ��d/home/asafur/pinokio/api/open-webui.git/app/env/lib/python3.11/site-packages/playhouse/sqlite_ext.pyr(zRowIDField.bind8sm��� �4�%� %� %��"�4�j�j�j�j�$�*<�*<�*<�>�?�?� ?�$��j�$���$�U�D�8�4�8�8�8�8�8�8�) �__name__� __module__� __qualname__�auto_increment� column_namer+r$r(� __classcell__�r-s@r.r!r!4sL��������N�)0�0�K�0�$��9�9�9�9�9�9�9�9�9r/r!c��eZdZdxZxZZdS)� DocIDField�docidN)r0r1r2r4r+r$�r/r.r8r8?s������)0�0�K�0�$���r/r8c���eZdZ�fd�Z�xZS)�AutoIncrementFieldc���tt|���|��}t|t d��f��S)N� AUTOINCREMENT)r'r<�ddlr �SQL)r)�ctx� node_listr-s �r.r?zAutoIncrementField.ddlDs<����,�d�3�3�7�7��<�<� ���C��$8�$8�9�:�:�:r/)r0r1r2r?r5r6s@r.r<r<Cs8�������;�;�;�;�;�;�;�;�;r/r<c��eZdZdZd�ZdS)� TDecimalField�TEXTc��dS�Nr:�r)s r.� get_modifierszTDecimalField.get_modifiersKs���r/N)r0r1r2� field_typerIr:r/r.rDrDIs�������J�!�!�!�!�!r/rDc���eZdZd�fd� Zed���Zd�Zdd�Zdd�Zdd�Z dd�Z dd �Z d �Z d �Z d �Zd �Zd�Zd�Zd�Z�xZS)�JSONPathNc�v��tt|�����||_|pd|_dS�Nr:)r'rL�__init__�_field�_path)r)�field�pathr-s �r.rOzJSONPath.__init__Os5��� �h����&�&�(�(�(��� ��Z�R�� � � r/c�V�tdd�|j��z��S)Nz$%s�)�Value�joinrQrHs r.rSz JSONPath.pathTs#���U�R�W�W�T�Z�0�0�0�1�1�1r/c��t|t��s|dkrd|z}nd|z}t|��|j|j|fz��S)N�#z[%s]z.%s)� isinstance�intr&rPrQ)r)�idx�items r.� __getitem__zJSONPath.__getitem__XsS�� �c�3� � � �3�#�:�:��C�<�D�D��3�;�D��t�D�z�z�$�+�t�z�T�G�';�<�<�<r/c���|st|ttf��r2t�|j�|����}t�|j|dj|��S�NrY) rZ�list�dict�fn�jsonrP� _json_dumps�json_setrS�r)�value�as_jsons r.�appendzJSONPath.append_s^�� � <�j���t� �5�5� <��G�G�D�K�3�3�E�:�:�;�;�E��{�{�4�;��S� ���>�>�>r/c���|st|ttf��r2t�|j�|����}||j|j|��SrG)rZrarbrcrdrPrerS�r)�funcrhris r.�_json_operationzJSONPath._json_operationdsX�� � <�j���t� �5�5� <��G�G�D�K�3�3�E�:�:�;�;�E��t�D�K���E�2�2�2r/c�D�|�tj||��SrG)rnrc� json_insertrgs r.�insertzJSONPath.insertis���#�#�B�N�E�7�C�C�Cr/c�D�|�tj||��SrG)rnrcrfrgs r.�setz JSONPath.setls���#�#�B�K���@�@�@r/c�D�|�tj||��SrG)rnrc� json_replacergs r.�replacezJSONPath.replaceo����#�#�B�O�U�G�D�D�Dr/c��|�t�||j�|������SrG)rsrc� json_patchrPre�r)rhs r.�updatezJSONPath.updaters2���x�x�� � �d�D�K�,C�,C�E�,J�,J�K�K�L�L�Lr/c�L�t�|j|j��SrG)rc� json_removerPrSrHs r.�removezJSONPath.removeus���~�~�d�k�4�9�5�5�5r/c�L�t�|j|j��SrG)rc� json_typerPrSrHs r.r�zJSONPath.json_typex����|�|�D�K���3�3�3r/c�L�t�|j|j��SrG)rc�json_array_lengthrPrSrHs r.�lengthzJSONPath.length{s���#�#�D�K���;�;�;r/c�L�t�|j|j��SrG)rc� json_eachrPrSrHs r.�childrenzJSONPath.children~r�r/c�L�t�|j|j��SrG)rc� json_treerPrSrHs r.�treez JSONPath.tree�r�r/c��|�|jr%t�|j|j��n|j��SrG)�sqlrQrc� json_extractrPrS�r)rAs r.�__sql__zJSONPath.__sql__�s>���w�w��*�6�r���t�{�D�I�>�>�>�*.�+�7�7� 7r/rG)r0r1r2rO�propertyrSr^rjrnrqrsrvr{r~r�r�r�r�r�r5r6s@r.rLrLNsC������� � � � � � � �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/rLc�H�eZdZd d�Zd d�Zd d�Zd d�Zd d�Zd�Zd�Z d �Z dS) � JSONBPathNc���|st|ttf��r2t�|j�|����}t�|j|dj|��Sr`) rZrarbrc�jsonbrPre� jsonb_setrSrgs r.rjzJSONBPath.append�s^�� � =�j���t� �5�5� =��H�H�T�[�4�4�U�;�;�<�<�E��|�|�D�K��c����?�?�?r/c���|st|ttf��r2t�|j�|����}||j|j|��SrG)rZrarbrcr�rPrerSrls r.rnzJSONBPath._json_operation�sX�� � =�j���t� �5�5� =��H�H�T�[�4�4�U�;�;�<�<�E��t�D�K���E�2�2�2r/c�D�|�tj||��SrG)rnrc� jsonb_insertrgs r.rqzJSONBPath.insert�rwr/c�D�|�tj||��SrG)rnrcr�rgs r.rsz JSONBPath.set�s���#�#�B�L�%��A�A�Ar/c�D�|�tj||��SrG)rnrc� jsonb_replacergs r.rvzJSONBPath.replace�s���#�#�B�$4�e�W�E�E�Er/c��|�t�||j�|������SrG)rsrc� jsonb_patchrPrerzs r.r{zJSONBPath.update�s2���x�x����t�T�[�-D�-D�U�-K�-K�L�L�M�M�Mr/c�L�t�|j|j��SrG)rc� jsonb_removerPrSrHs r.r~zJSONBPath.remove�s�����t�{�D�I�6�6�6r/c��|�|jr%t�|j|j��n|j��SrG)r�rQrc� jsonb_extractrPrSr�s r.r�zJSONBPath.__sql__�s@���w�w��*�6�r�'�'�� �T�Y�?�?�?�*.�+�7�7� 7r/rG) r0r1r2rjrnrqrsrvr{r~r�r: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��eZdZdZdZeZd�fd� Zd�Zd�Z d�Z e e j ��Z e e j��Ze e j��Ze e j��Ze e j��Ze e j��ZejZd�Zd �Zd �Zd �Zdd �Zdd �Zdd�Z dd�Z!d�Z"d�Z#d�Z$dd�Z%d�Z&d�Z'�xZ(S)� JSONField�JSONFNc ���|p tj|_|p tj|_t t |��jdi|��dSrN)rd�dumpsre�loads� _json_loadsr'r�rO)r)� json_dumps� json_loads�kwargsr-s �r.rOzJSONField.__init__�sJ���%�3�����%�3�����'��i����'�1�1�&�1�1�1�1�1r/c�h�|�/ |�|��S#ttf$r|cYSwxYwdSrG)r�� TypeErrorr%rzs r.� python_valuezJSONField.python_value�sR�� � � ��'�'��.�.�.���z�*� � � �� � � � ���� � s ��/�/c��|�Dt|t��s-t�|�|����}|SdSrG)rZr rcrdrerzs r.�db_valuezJSONField.db_value�sF�� � ��e�T�*�*� 9����� 0� 0�� 7� 7�8�8���L� � r/c����fd�}|S)Nc���t|ttf��rt||jd���}t |�|��S)NF)� converter�unpack)rZrarbrVr�r)r)�rhs�ops �r.�innerzJSONField._e.<locals>.inner�sB����#��d�|�,�,� H��C�4�=��G�G�G���d�B��,�,� ,r/r:)r�r�s` r.�_ez JSONField._e�s#��� -� -� -� -� -�� r/c�8�|�|��|SrG)�Path)r)r]s r.r^zJSONField.__getitem__�s���y�y����t�$�$r/c�>�d�|D��}tj|g|�R�S)Nc�0�g|]}t|d�����S�F�r��rV��.0�ps r.� <listcomp>z%JSONField.extract.<locals>.<listcomp>��%��:�:�:�q��q�E�*�*�*�:�:�:r/)rcr��r)�pathss r.�extractzJSONField.extract�s-��:�:�E�:�:�:����t�,�e�,�,�,�,r/c�B�t|dt|d�����S)Nz->Fr��rrV�r)rSs r.� extract_jsonzJSONField.extract_json�s!���$��e�D�E�&B�&B�&B�C�C�Cr/c�B�t|dt|d�����S)Nz->>Fr�r�r�s r.� extract_textzJSONField.extract_text�s!���$��u�T�U�'C�'C�'C�D�D�Dr/c�T�|�|���||��SrG)r�rjrgs r.rjzJSONField.append��"���y�y����%�%�e�W�5�5�5r/c�T�|�|���||��SrG)r�rqrgs r.rqzJSONField.insert�r�r/c�T�|�|���||��SrG)r�rsrgs r.rsz JSONField.set�s"���y�y����"�"�5�'�2�2�2r/c�T�|�|���||��SrG)r�rvrgs r.rvzJSONField.replace�s"���y�y����&�&�u�g�6�6�6r/c�R�|�|���|��SrG)r�r{)r)�datas r.r{zJSONField.update�s ���y�y����%�%�d�+�+�+r/c�x�|s'|�|�����Stj|g|�R�SrG)r�r~rcr}r�s r.r~zJSONField.remove�s>��� ,��9�9�T�?�?�)�)�+�+� +��~�d�+�U�+�+�+�+r/c�6�t�|��SrG)rcr�rHs r.r�zJSONField.json_type�����|�|�D�!�!�!r/c�0�|r||fn|f}tj|�SrG)rcr�)r)rSr,s r.r�zJSONField.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) )rcr�rHs r.r�zJSONField.children�s���|�|�D�!�!�!r/c�6�t�|��SrG)rcr�rHs r.r�zJSONField.treer�r/)NNrG))r0r1r2rJr�rLr�rOr�r�r�r �EQ�__eq__�NE�__ne__�GT�__gt__�GTE�__ge__�LT�__lt__�LTE�__le__�Field�__hash__r^r�r�r�rjrqrsrvr{r~r�r�r�r�r5r6s@r.r�r��s���������J� �F� �D�2�2�2�2�2�2� ������ ��� �R���Y�Y�F� �R���Y�Y�F� �R���Y�Y�F� �R���Z�Z�F� �R���Y�Y�F� �R���Z�Z�F��~�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�.�eZdZdZeZd�Zd�Zd�Zd�Z dS)� JSONBField�JSONBc��|�Dt|t��s-t�|�|����}|SdSrG)rZr rcr�rerzs r.r�zJSONBField.db_value sF�� � ��e�T�*�*� :�����!1�!1�%�!8�!8�9�9���L� � r/c�6�t�|��SrG)rcrdrHs r.rdzJSONBField.jsons���w�w�t�}�}�r/c�>�d�|D��}tj|g|�R�S)Nc�0�g|]}t|d�����Sr�r�r�s r.r�z&JSONBField.extract.<locals>.<listcomp>r�r/)rcr�r�s r.r�zJSONBField.extracts.��:�:�E�:�:�:�����-�u�-�-�-�-r/c�x�|s'|�|�����Stj|g|�R�SrG)r�r~rcr�r�s r.r~zJSONBField.removes>��� ,��9�9�T�?�?�)�)�+�+� +���t�,�e�,�,�,�,r/N) r0r1r2rJr�r�r�rdr�r~r:r/r.r�r�sZ�������J� �D���� ���.�.�.�-�-�-�-�-r/r�c�J��eZdZd �fd� Zd�Zed���Zd�Zd d �Z�xZ S) � SearchFieldFNc ���|rtdt|��z���tt|���||d���dS)Nz8SearchField does not accept these keyword arguments: %s.T)� unindexedr4�null)r%�sortedr'r�rO)r)r�r4�kr-s �r.rOzSearchField.__init__sm��� � ;��.�06�q� � �:�;�;� ;� �k�4� � �)�)�I�6A�� *� N� N� N� N� Nr/c�"�t||��SrG)�match)r)�terms r.r�zSearchField.match&s���T�4� � � r/c��t|d��s:d�|jjjD��}|�|j��|_|jS)N�_fts_column_indexc�F�g|]}t|t���|j��Sr:)rZr�r+)r��fs r.r�z0SearchField.fts_column_index.<locals>.<listcomp>,s8��<�<�<�� *�1�k� :� :�<�Q�V�<�<�<r/)�hasattrr*�_meta� sorted_fields�indexr+r�)r)� search_fieldss r.�fts_column_indexzSearchField.fts_column_index)s\���t�0�1�1� D�<�<�T�Z�-=�-K�<�<�<�M�%2�%8�%8���%C�%C�D� "��%�%r/c�h�|j}t�|jjj|||��SrG)rrc� highlightr*r�entity)r)�left�right� column_idxs r.rzSearchField.highlight1s*���*� ��|�|�D�J�,�3�Z��u�M�M�Mr/�...�c��d|cxkrdksntd���|j}t�|jjj|||||��S)Nr�Az/max_tokens must be between 1 and 64 (inclusive))r%rrc�snippetr*rr)r)rr � over_length� max_tokensr s r.rzSearchField.snippet5sc���J�#�#�#�#��#�#�#�#��N�O�O� O��*� ��z�z�$�*�*�1�:�t�U�%�z�3�3� 3r/)FN)r r ) r0r1r2rOr�r�rrrr5r6s@r.r�r�s��������N�N�N�N�N�N�!�!�!��&�&��X�&�N�N�N�3�3�3�3�3�3�3�3r/r�c�(��eZdZdd�Zd�fd� Z�xZS)�VirtualTableSchemaManagerTc ��|j�t|jjj|����}|���}|�d��|r|�d��|�|j���d��|jjj}t|t��r|�|��S|�t|�����d��g}|jj}|j r$|� d�|j D����|jD]}t|t��s|jr�t#|j��g}|jr"|�td����|�t+|������|jr$|� d�|jD����|r(|� |�|����|�t1|����S)NzCREATE VIRTUAL TABLE zIF NOT EXISTS z USING � c�,�g|]}t|����Sr:�r@�r��as r.r�zCVirtualTableSchemaManager._create_virtual_table.<locals>.<listcomp>Ws��D�D�D��c�!�f�f�D�D�Dr/� UNINDEXEDc�,�g|]}t|����Sr:rrs r.r�zCVirtualTableSchemaManager._create_virtual_table.<locals>.<listcomp>cs��=�=�=��c�!�f�f�=�=�=r/)r*� clean_optionsr r�options�_create_context�literalr��extension_modulerZr r@�prefix_arguments�extendrr!�_hiddenrr4r�rjr � arguments�_create_table_option_sqlr) r)�saferrA� ext_moduler$�metarR� field_defs r.�_create_virtual_tablez/VirtualTableSchemaManager._create_virtual_table>s&���*�*�*� �t�z�'�/�� 9� 9�;�;���"�"�$�$�� � � �+�,�,�,� � *� �K�K�(� )� )� )� � �#�d�j�/�/� �'�)� � � ��Z�%�6� � �j�$� '� '� '��7�7�:�&�&� &� ����J��� � �(�(��-�-�-�� ��z��� � � F� � � �D�D�d�.C�D�D�D� E� E� E��'� 2� 2�E��%�*�.�.� �%�-� ���� 1�2�2�3�I��� 3�� � ��[�!1�!1�2�2�2� � � �X�i�0�0� 1� 1� 1� 1� �>� ?� � � �=�=�d�n�=�=�=� >� >� >� � E� � � �T�:�:�7�C�C� D� D� D��w�w�'� �2�2�3�3�3r/c ���t|jt��r|j|fi|��St t |��j|fi|��SrG)� issubclassr*� VirtualModelr*r'r� _create_table)r)r&rr-s �r.r.z'VirtualTableSchemaManager._create_tableisd��� �d�j�,� /� /� ?�-�4�-�d�>�>�g�>�>� >�C�u�.��5�5�C� ������ r/�T)r0r1r2r*r.r5r6s@r.rr=sR�������)4�)4�)4�)4�V���������r/rc�>�eZdZGd�d��Zed���ZdS)r-c�"�eZdZdZdZdZdZeZdS)�VirtualModel.MetaNF) r0r1r2r$r r!� primary_keyr�schema_manager_classr:r/r.�Metar2rs,������� ������ �8���r/r5c��|SrGr:)�clsrs r.rzVirtualModel.clean_optionsys���r/N)r0r1r2r5� classmethodrr:r/r.r-r-qsW������9�9�9�9�9�9�9�9�����[���r/r-c�$�eZdZed���ZdS)� BaseFTSModelc�F�|�d��}|�d��}|�d��}t|t��r |dkrd|d<n<t|t��r't |jjj|j��|d<|rVt|ttf��rd� d�|D����}d|� d ��z|d<|r*|jj ���d krd |z|d<|S) N�content�prefix�tokenizerUz''�,c�,�g|]}t|����Sr:)�str)r��is r.r�z.BaseFTSModel.clean_options.<locals>.<listcomp>�s��":�":�":�a�3�q�6�6�":�":�":r/z'%s'z' �fts5�"%s")�getrZ� basestringr�rr*r� table_namer4ra�tuplerW�stripr �lower)r7rr<r=r>s r.rzBaseFTSModel.clean_optionss&���+�+�i�(�(�����X�&�&���;�;�z�*�*�� �g�z� *� *� =�w�"�}�}�!%�G�I� � � ��� '� '� =�!'�� �(;�(F�(/�(;�"=�"=�G�I� � � <��&�4��-�0�0� <����":�":�6�":�":�":�;�;�� &����d�);�);� ;�G�H� � � 4�� �2�8�8�:�:�f�D�D�#)�8�"3�G�J� ��r/N)r0r1r2r8rr:r/r.r:r:~s-����������[���r/r:c��eZdZdZe��ZGd�d��Zed���Zed���Z ed���Z ed���Z edd ���Z edd ���Z ed ���Zed���Zed���Zed���Zed���Zed���Ze dd���Ze dd���Ze dd���Ze dd���ZdS)�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��eZdZdezZdS)� FTSModel.MetazFTS%sN)r0r1r2� FTS_VERSIONr r:r/r.r5rN�s������"�[�0���r/r5c ��|jj}|jj�d|�d|�d|�d���}|���S)Nz INSERT INTO �(z ) VALUES('z');)rrG�database� execute_sql�fetchone)r7�cmd�tbl�ress r.�_fts_cmdzFTSModel._fts_cmd�sO���i�"���i� �,�,�,�25�#�#�s�s�s�C�C�C� @�B�B���|�|�~�~�r/c�,�|�d��S�N�optimize�rX�r7s r.r[zFTSModel.optimize�����|�|�J�'�'�'r/c�,�|�d��S�N�rebuildr\r]s r.razFTSModel.rebuild�����|�|�I�&�&�&r/c�,�|�d��S)N�integrity-checkr\r]s r.�integrity_checkzFTSModel.integrity_check�s���|�|�-�.�.�.r/���c�8�|�d|�d|����S)Nzmerge=r?r\)r7�blocks�segmentss r.�mergezFTSModel.merge�s!���|�|�|�V�V�V�X�X�>�?�?�?r/Tc�:�|�d|rdpdz��S)Nz automerge=%s�1�0r\)r7�states r.� automergezFTSModel.automerge�s"���|�|�N�e�m��.B�s�C�D�D�Dr/c�6�t|jj|��S�zU Generate a `MATCH` expression appropriate for searching this table. �r�rr�r7r�s r.r�zFTSModel.match���� �S�Y�%�t�,�,�,r/c�z�t�|jjt��}tj|g|�R�SrG)rc� matchinforr�FTS3_MATCHINFO�fts_rank)r7�weightsrws r.�rankz FTSModel.rank�s2���L�L���!1�>�B�B� ��{�9�/�w�/�/�/�/r/c�z�t�|jjt��}tj|g|�R�SrG)rcrwrr�FTS4_MATCHINFO�fts_bm25�r7rz� match_infos r.�bm25z FTSModel.bm25�s2���\�\�#�)�"2�N�C�C� ��{�:�0��0�0�0�0r/c�z�t�|jjt��}tj|g|�R�SrG)rcrwrrr}� fts_bm25frs r.�bm25fzFTSModel.bm25f�s2���\�\�#�)�"2�N�C�C� ��|�J�1��1�1�1�1r/c�z�t�|jjt��}tj|g|�R�SrG)rcrwrrr}� fts_luceners r.�lucenezFTSModel.lucene�s2���\�\�#�)�"2�N�C�C� ��}�Z�2�'�2�2�2�2r/c���|s |��}nut|t��r[g}|jjD]F} |�| |�| jd����} |�| ���G||�}n||�}d} |} |r||�|��f} |r|st|��} |j | �� |� |����� | ��S)N��?r:) rZrbrrrEr+rj�aliasr@�select�wherer��order_by) r7r�rz� with_score� score_alias�score_fn�explicit_orderingr{� weight_argsrR� field_weight� selectionr�s r.�_searchzFTSModel._search�s��� &��8�:�:�D�D� ��� &� &� &��K���0� 1� 1�� '�{�{�5�'�+�+�e�j�#�2N�2N�O�O� ��"�"�<�0�0�0�0��8�[�)�D�D��8�W�%�D�� ��� � 7��d�j�j��5�5�6�I� � (�/� (��;�'�'�H�����$���s�y�y����'�'���(�#�#� %r/NF�scorec�@�|�|||||j|��S��'Full-text search using selected `term`.)r�r{�r7r�rzr�r�r�s r.�searchzFTSModel.search��.���{�{� � � � � �H� � �� r/c�@�|�|||||j|��S�z:Full-text search for selected `term` using BM25 algorithm.)r�r�r�s r.� search_bm25zFTSModel.search_bm25r�r/c�@�|�|||||j|��Sr�)r�r�r�s r.� search_bm25fzFTSModel.search_bm25fs.���{�{� � � � � �I� � �� r/c�@�|�|||||j|��Sr�)r�r�r�s r.� search_lucenezFTSModel.search_lucenes.���{�{� � � � � �J� � �� r/)rfrgr/�NFr�F)r0r1r2�__doc__r8r9r5r8rXr[rarerkrpr�r{r�r�r�r�r�r�r�r�r:r/r.rLrL�sA�������� �J�L�L�E�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/rL�abcdefghijklmnopqrstuvwxyzz ,"(){}*:_+0123456789�c#�`K�|])}t|��tv�t|��V��*dSrG)�chr� _alphanumr�s r.� <genexpr>r�.s8����K�K��3�q�6�6��3J�3J�S��V�V�3J�3J�3J�3J�K�Kr/�z(?:[^\s"]|"(?:\\.|[^"])*")+c�*�eZdZdZe��ZGd�d��Zdddd�Zed���Z ed ���Z e d ���Z e e d ��fd ���Zed ���Zed���Zed���Ze d"d���Ze d"d���Zed���Zed���Zed���Zed���Zed���Zed���Zed���Zed���Zed���Zed#d���Zed$d!���ZdS)%� 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��eZdZdZdS)�FTS5Model.MetarCN�r0r1r2r r:r/r.r5r�ns������!���r/r5zQBesides 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)rJr�pkc�^�|jjjdkrt|jd���|jj���D]8}t|ttf��st|jd����9|jj rt|jd���dS)Nr"r�rJr) rr3r+�ImproperlyConfigured�_error_messages�fields�valuesrZr�r!�indexes)r7rRs r.�validate_modelzFTS5Model.validate_modelxs��� �9� � %�� 0� 0�&�s�':�4�'@�A�A� A��Y�%�,�,�.�.� N� N�E��e�k�:�%>�?�?� N�*�3�+>�|�+L�M�M�M� N� �9� � E�&�s�':�7�'C�D�D� D� E� Er/c���tjdd�tkrdStjd��} |�d��no# |�d��|�d��|jj�d��n#YY|� ��dSxYwYnxYw|� ��n#|� ��wxYwdS)NrFz:memory:z0CREATE VIRTUAL TABLE fts5test USING fts5 (data);TrC) r�sqlite_version_info�FTS5_MIN_SQLITE_VERSION�connect�execute�enable_load_extension�load_extensionrrR�close)r7�tmp_dbs r.�fts5_installedzFTS5Model.fts5_installed�s��� � &�r��r� *�-D� D� D��5����,�,�� � �N�N�M� N� N� N� N�� :� :��,�,�T�2�2�2��%�%�f�-�-�-�� �"�1�1�&�9�9�9�9�� ��u� �L�L�N�N�N�N�N����:�9���� �L�L�N�N�N�N��F�L�L�N�N�N�N�����tsA�A � C� B7�*B�8 B7�B2�B7�C�2B7�5C�C%c���t�|��}|D]G}|�d��r|�d��r�-t |��t zrdS�HdS)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_queryzFTS5Model.validate_query�sv���"�"�5�)�)��� � �E�����$�$� �����)<�)<� ���5�z�z�N�*� ��u�u� ��tr/r�c��g}d}t�|��}|D]�}|�d��r+|�d��r|�|���Bt |��}|t z}|rd}|D]}|�||��}�|�|����|rd�|��S|S)z2 Clean a query of invalid tokens. Fr�Tr) r�r�r�r�rjrsr�rvrW) r�rv�accum� any_invalidr�r�� token_set�invalid_for_token�cs r.� clean_queryzFTS5Model.clean_query�s��� ��� ��"�"�5�)�)��� � �E�����$�$� �����)<�)<� �� � �U�#�#�#���E� � �I� )�N� :� � � 6�"� �*�6�6�A�!�M�M�!�W�5�5�E�E� �L�L�� � � � � � #��8�8�E�?�?� "�� r/c�6�t|jj|��Srrrsrts r.r�zFTS5Model.match�rur/c�8�|r |j|�ntd��S)Nr{)r�r@)r7r,s r.r{zFTS5Model.rank�s��"&�7�x�s�x����C��K�K�7r/c�:�tj|jjg|�R�SrG)rcr�rr)r7rzs r.r�zFTS5Model.bm25�s���w�s�y�'�2�'�2�2�2�2r/NFr�c�d�|�t�|��||||��Sr�)r�r�r�r�s r.r�zFTS5Model.search�s7����� � !� !�$� '� '� � � � � �� r/c ��|std��}n�t|t��r�g}|jjD]`}t|t ��rI|jsB|�|�||�|j d�������atj |jj g|�R�}ntj |jj g|�R�}d} |} |r||� |��f} |r|st|��} |j| ��|�t"�|�������| ��S)r�r{r�r:)r@rZrbrrr�r�rjrEr+rcr�rr�r�r�r�r�r�r�) r7r�rzr�r�r�r{r�rRr�r�s r.r�zFTS5Model.search_bm25�si��� 7��v�;�;�D�D� ��� &� &� 7��K���0� J� J���e�[�1�1�J�%�/�J��&�&�� � �E�7�;�;�u�z�3�+G�+G�H�H�J�J�J���7�3�9�+�:�k�:�:�:�D�D��7�3�9�+�6�g�6�6�6�D�� ��� � 7��d�j�j��5�5�6�I� � (�/� (��;�'�'�H�����$���s�y�y��!6�!6�t�!<�!<�=�=�>�>���(�#�#� %r/c �l�|jj}|g}|g}|���D]<\}}|�t |����|�|���=t t d��|jjt|��t d��t|��f��S)Nz INSERT INTO�VALUES)rr�itemsrjrr r@r)r7rU� extra_paramsrV�columnsr��keyrhs r.� _fts_cmd_sqlzFTS5Model._fts_cmd_sql�s����i����%�����&�,�,�.�.� !� !�J�C�� �N�N�6�#�;�;� '� '� '� �M�M�%� � � � �� � � � � �I� � �W� %� %� ��M�M� �V� $� $� &�'�'� 'r/c �\�|j|fi|��}|jj�|��SrG)r�rrRr�)r7rUr�r�s r.rXzFTS5Model._fts_cmds5�� �� ��5�5� �5�5���y�!�)�)�%�0�0�0r/c�l�d|cxkrdksntd���|�d|���S)Nrr zlevel must be between 0 and 16rp�r{)r%rX)r7�levels r.rpzFTS5Model.automerge sF���U� � � � �b� � � � ��=�>�>� >��|�|�K�e�|�4�4�4r/c�0�|�d|���S)Nrkr�r\)r7�npagess r.rkzFTS5Model.merges���|�|�G�&�|�1�1�1r/c�,�|�d��SrZr\r]s r.r[zFTS5Model.optimizer^r/c�,�|�d��Sr`r\r]s r.razFTS5Model.rebuildrbr/c�0�|�d|���S)N�pgszr�r\)r7r�s r.�set_pgszzFTS5Model.set_pgszs���|�|�F��|�.�.�.r/c�0�|�d|���S)Nr{r�r\)r7�rank_expressions r.�set_rankzFTS5Model.set_rank!s���|�|�F��|�9�9�9r/c�,�|�d��S)Nz delete-allr\r]s r.� delete_allzFTS5Model.delete_all%s���|�|�L�)�)�)r/rc�0�|�d|���S)Nrdr�r\)r7r{s r.rezFTS5Model.integrity_check)s���|�|�-�D�|�9�9�9r/�rowc �������dvrtd���d�z}t�|��s�G���fd�d��}tt��t ��t ��t ��|d�}�dkrtt��|d<n�dkrtt��|d <d �jz}t�|t|tf|����t�|��S) N)r��col�instancez5table_type must be either "row", "col" or "instance".z_vocab_model_%sc���eZdZ�jjZ�p�jjdzZe��jje �����Z dS)�"FTS5Model.VocabModel.<locals>.Meta�_vN) r0r1r2rrRrGrc� fts5vocabrr@r )r7�table� table_types���r.r5r�6sV��������9�-��"�A�c�i�&:�T�&A� �#%�<�<��I�$��C� �O�O�$%�$%� � � r/r5)r��doc�cntr"r5r�r��offsetz%sVocab) r%r�r � TextField� IntegerFieldr!r0�setattrr&r-�getattr)r7r�r��attrr5�attrs� class_names``` r.� VocabModelzFTS5Model.VocabModel-s,����� �7� 7� 7��+�,�,� ,�!�:�-���s�D�!�!� I� %� %� %� %� %� %� %� %� %� %� %� %�%�Y�/�/�#�~�~�#�~�~�#���� ��E��U�"�"�+�I�6�6��e� � ��z�)�)�".�|�"<�"<��h��"�S�\�1�J� �C��t�J����G�G� H� H� H��s�D�!�!�!r/r�)r)r�N)r0r1r2r�r!r"r5r�r8r�r�� staticmethodr�r�r�r�r{r�r�r�r�rXrprkr[rar�r�r�rerr:r/r.r�r�4s�������4�4�n �J�L�L�E�"�"�"�"�"�"�"�"�5�F�D� ��O��E�E��[�E�����[��*� � ��\� ��#&�3�r�7�7�����\��.�-�-��[�-� �8�8��[�8��3�3��[�3��FM�!&�����[���8=�;@�%�%�%��[�%�6� '� '��[� '��1�1��[�1��5�5��[�5� �2�2��[�2��(�(��[�(��'�'��[�'��/�/��[�/��:�:��[�:��*�*��[�*��:�:�:��[�:��"�"�"��[�"�"�"r/r�c�������������+�jjD]}|j�ur|�n�td����jj�����G�����fd�dt ��}G���fd�d��}d�jz}t||fd|i��S)z3Model factory for the transitive closure extension.Nz,Unable to find self-referential foreign key.c���eZdZee��Zee��Zee��Zee��Z ee��Z ee��Z Gd�d��Z e d��fd� ��Ze d��fd� ��Ze d �����fd� ��ZdS) �&ClosureTable.<locals>.BaseClosureTablec��eZdZdZdS)�+ClosureTable.<locals>.BaseClosureTable.Meta�transitive_closureNr�r:r/r.r5r is������3� � � r/r5NFc�~�����|j�d�����|�|jk����|j|k�����}|�|�|j|k��}n |s|�|jdk��}|S�N�depth��onr)r�rr�rW�idr��root�objects�r7�noder� include_noder�� model_class� source_keys ��r.� descendantsz2ClosureTable.<locals>.BaseClosureTable.descendantsls���� ��f�[�#�)�/�/�'�*B�*B�C�C��d�3�J�#�&�$8�d�:�:��e�C�H��,�-�-��g�i�i� � � �� � �C�I��$6�7�7���!� 3�� � �C�I��M�2�2���Lr/c�~�����|j�d�����|�|jk����|j|k�����}|r|�|j|k��}n |s|�|jdk��}|Sr)r�rr�rWrr�rrrs ��r.� ancestorsz0ClosureTable.<locals>.BaseClosureTable.ancestorsys���� ��f�[�#�)�/�/�'�*B�*B�C�C��d�3�J�#�(�$:�d�<�<��e�C�F�d�N�+�+��g�i�i� � � 3�� � �C�I��$6�7�7���!� 3�� � �C�I��M�2�2���Lr/c� ����urK|j��j��}������|k��}n���� ���|�|jk����|j|k|jdkz��}������ |z��� ��}|s|�� |k��}|S)Nr�) �__data__rEr+r�r�rWrrrr) r7rr�fk_valuer��siblings� foreign_keyr�referencing_class�referencing_keyrs �����r.r#z/ClosureTable.<locals>.BaseClosureTable.siblings�s���� �K�/�/��=�,�,�[�-=�>�>��#�*�*�,�,�2�2�;�(�3J�K�K���.�#�V�O�4�4�!�T�#�;�#�(�+B�T�D�D�"�U�C�F�d�N�s�y�A�~�#F�G�G�� %� �&�(�(��%� �h� 6�7�7�!�'�)�)��  � 8�� � �J�$�$6�7�7���Lr/�NF�F)r0r1r2r rrrr�idcolumn� parentcolumnr� tablenamer5r8rrr#)r$rr%r&rs�����r.�BaseClosureTabler as3�������� �\�*�*�� �\�,� '� '���<� �*�*��#�|�I�.�.� ��|�L�)�)�� �L��+�+� � 4� 4� 4� 4� 4� 4� 4� 4� � � � � � � � �� � � � � � � � � �� � � � � � � � � � � � �� � � r/r,c�`��eZdZ�jjZ�jj�j�jd�ZdZdS)�ClosureTable.<locals>.Meta)r+r)r*FN) r0r1r2rrRrGr4rr3)r$r%r&s���r.r5r.�sB�������$�*�3��*�0�;�'�3�'�3�5�5��� � � r/r5z %sClosure)r�refs� rel_modelr%r3r-r0r&) rr$r%r&� field_objr,r5r+rs ```` @r.� ClosureTabler2Os$�������� �'����$�*�/� M� M�I��"�k�1�1�'� ���2��K�L�L� L��"�.�J���$��;�;�;�;�;�;�;�;�;�;�;�<�;�;�;�z������������ ��-� -�D� ��'�)�F�D�>� :� :�:r/c���eZdZGd�d��Zed���Zed d���Zed���Zed���Z ed���Z ed ���Z ed ���Z d S) �LSMTablec��eZdZdZdZdS)� LSMTable.Meta�lsm1N)r0r1r2r �filenamer:r/r.r5r6�s������!�����r/r5c��|jj}|std���t|��dkr|ddkrd|z}|jjstd���|jj}t |t ��rtd���t |tttf��std���d |_ t |t��rd }nt |t��rd }nd }|d|j z|g|j_ t|jj ��dkr|jj d |j_n d|j_|S)NzILSM1 extension requires that you specify a filename for the LSM database.�rr�rDz-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�BLOBrEr )rr8r%�lenr3rZ� AutoFieldr� BlobFieldrr#r+r!r� _value_field)r7rr8r�� data_types r.rzLSMTable.clean_options�sl���9�%��� -��>�?�?� ?��8�}�}��!�!�h�q�k�S�&8�&8�!�H�,���y�$� N��L�M�M� M��i�#�� �c�9� %� %� +��*�+�+� +��#� �9�l�C�D�D� .��-�.�.� .��� � �c�<� (� (� ��I�I� ��Y� '� '� ��I�I��I�&.����0A�9�%M�� �"� �s�y�&� '� '�1� ,� ,�%(�Y�%<�Q�%?�C�I� "� "�%)�C�I� "��r/�lsm.soc�D�|jj�|��dSrG)rrRr�)r7rSs r.r�zLSMTable.load_extension�s!�� � ��)�)�$�/�/�/�/�/r/c��|j�'|j� |�|j|j��S|j� ||jkS|j� ||jkSdSrG)�start�stop�between)r�r\s r.� slice_to_exprzLSMTable.slice_to_expr�sZ�� �9� �S�X�%9��;�;�s�y�#�(�3�3� 3� �Y� "��#�)�#� #� �X� !��#�(�?� "�"� !r/c�&�t|t��r6t�||��}|�|�|��}|dfSt|t ��r|�|��dfS|�||k��dfS�NFT)rZ�slicer4rHr�r)r�r��lookup�exprs r.�_apply_lookup_to_queryzLSMTable._apply_lookup_to_query�s��� �f�e� $� $� 4��)�)�#�v�6�6�D���� � �D�)�)���%�<� � �� � +� +� 4��;�;�v�&�&��-� -��;�;�s�f�}�-�-�t�3� 3r/c���|�|������|jj|��\}}|r*|���}|jj�|dn|S|S�Nr )rNr�� namedtuplesrr3rEr@)r7r�r�� is_singler�s r.� get_by_idzLSMTable.get_by_id�sr���5�5� �J�J�L�L� $� $� &� &� �I� !� �����y� � ��)�)�+�+�C� �Y�3�?�3�q�6�6�S� H��Lr/c��|jj�|jj|i}ntt|t��r0i}t |jjdd�|��D] \}}|||<� n/t|t ��r|}nt||��r|j}|||jj<|� |��� ��dSrP) rr@rZrH�ziprrb�__dict__r3rvr�)r7r�rhr�rR�fvals r.� set_by_idzLSMTable.set_by_id�s��� �9� !� -��I�*�E�2�D�D� ��u� %� %� "��D�"�3�9�#:�1�2�2�#>��F�F� #� #� ��t�"��U� � � #� ��t� $� $� "��D�D� ��s� #� #� "��>�D�&)��S�Y� "�#� � � �D���!�!�#�#�#�#�#r/c��|�|���|jj|��\}}|���SrG)rN�deleterr3r�)r7r�r�rRs r.� delete_by_idzLSMTable.delete_by_idsB���5�5� �J�J�L�L� �I� !� �����y��}�}���r/N)rB) r0r1r2r5r8rr�rrHrNrSrXr[r:r/r.r4r4�s����������������!�!��[�!�F�0�0�0��[�0��#�#��\�#�� 4� 4��\� 4�� � ��[� �� $� $��[� $�����[���r/r4�MATCHc�0�tj||��duSrG)�rer�)�regexrhs r.�_sqlite_regexpr`s�� �9�U�E� "� "�$� .�.r/c�6��eZdZ d�fd� Z�fd�Zd�Z�xZS)�SqliteExtDatabaseNTFc���tt|��j|g|�Ri| ��d|_|rtst d���to|du} |r~| rt |��nl|�td��|�td��|�td��|�td��|r | std���t|��|r|�tdd ��|r | std ���t|��|r|�td ��| |_dS) NzRSqliteExtDatabase initialized with C extensions, but shared library was not found!Fr~ryr�r�z0C extension required to register hash functions.�regexpr:z(C extension required to use bloomfilter.� json_contains)r'rbrO� _row_factory�CYTHON_SQLITE_EXTENSIONSr�r�register_functionr�r{r%rr`r�_json_contains� _c_extensions) r)rR� c_extensions�rank_functions�hash_functions�regexp_function� bloomfilterrer,r��prefer_cr-s �r.rOzSqliteExtDatabase.__init__s���� 0����&�&�/��J�4�J�J�J�6�J�J�J� ��� � 5� 8� 5�&�(4�5�5� 5�,�K��U�1J�� � ;�� ;�'��-�-�-�-��&�&�t�Z�8�8�8��&�&�t�Z�8�8�8��&�&�t�[�9�9�9��&�&�t�\�:�:�:� � *�� /� �".�/�/�/� #�D� )� )� )� � @� � "� "�>�8�Q� ?� ?� ?� � '�� M� �!K�L�L�L� �� &� &� &� � D� � "� "�>�?� C� C� C�%����r/c���tt|���|��|jr|j|_dSdSrG)r'rb�_add_conn_hooksrf� row_factory�r)�connr-s �r.rrz!SqliteExtDatabase._add_conn_hooks;sH��� ���&�&�6�6�t�<�<�<� � � 1�#�0�D� � � � 1� 1r/c��||_dSrG)rf�r)rcs r.rszSqliteExtDatabase.row_factory@s������r/)NTFFFF)r0r1r2rOrrrsr5r6s@r.rbrbso�������CG�7<�27�!&�!&�!&�!&�!&�!&�F1�1�1�1�1� ������r/rbr r:��rrgr� c�0�����fd�}t|��S)zt Expose a sqlite3_status() call for a particular flag as a property of the Database object. c�:��t���}�r|dn|SrP)r)r)�result�flag�return_highwaters ��r.�getterz__status__.<locals>.getteras#���&�t�,�,�F� 0�<�6�!�9�9�f� <r/�r�)r~rr�s`` r.� __status__r�\s2����  =� =� =� =� =� =�����r/c�4�������fd�}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���|jj�td���t|jj���}�r|dS�r|dn|S)Nzdatabase connection not opened.rr )�_staterur�r)r)r}r~�return_currentrs ���r.r�z__dbstatus__.<locals>.getterlsV����{��'�*�+L�M�M�M�)�$�+�*:�D�A�A�F�� !��a�y� � 0�<�6�!�9�9�f� <r/r�)r~rr�r�s``` r.� __dbstatus__r�fs8�����  =� =� =� =� =� =� =�����r/c�d��eZdZ�fd�Zd�fd� Z�fd�Z�fd�Zd�Zd�Zd�Z d �Z e d ���Z e d ���Z dd �Z dd�Zdd�Zee��Zeed��Zee��Zee��Zee��Zeed��Zee��Zee ��Z!ee"d��Z#e$e%��Z&e$e'd��Z(e$e)d��Z*e$e+d��Z,e$e-dd��Z.e$e/dd��Z0e$e1dd��Z2e$e3dd��Z4e$e5dd��Z6e$e7dd��Z8�xZ9S)�CSqliteExtDatabasec���d|_dx|_x|_|_d|_t t |��j|i|��dSr')� _conn_helper� _commit_hook�_rollback_hook� _update_hook�_replace_busy_handlerr'r�rO)r)r,r�r-s �r.rOzCSqliteExtDatabase.__init__vsT��� $�D� �JN� N�D� � N�� 3�d�6G�).�D� &� 4�E�$�d� +� +� 4�d� E�f� E� E� E� E� Er/Fc �X��tt|��j|fi|��||_dSrG)r'r��initr�)r)rR�replace_busy_handlerr�r-s �r.r�zCSqliteExtDatabase.init|s7��� 0�E�$�d� +� +� 0�� D� D�V� D� D� D�)=�D� &� &� &r/c���|jr|j�d��|jr|j�d��|jr|j�d��tt|��� |��SrG) r�r��set_commit_hookr��set_rollback_hookr��set_update_hookr'r��_closerts �r.r�zCSqliteExtDatabase._close�s����� � 8��!�1�1�$�7�7�7��"� :��!�3�3�D�9�9�9�� � 8��!�1�1�$�7�7�7��+�T�2�2�9�9�$�?�?� ?r/c����tt|���|��t|��|_|j�|j�|j��|j�|j�|j��|j �|j� |j ��|j r(|j pd}|j� |dz��dSdS)Nrxi�)r'r�rrrr�r�r�r�r�r�r�r��_timeout�set_busy_handler)r)ru�timeoutr-s �r.rrz"CSqliteExtDatabase._add_conn_hooks�s���� �$�d� +� +� ;� ;�D� A� A� A� 0�� 6� 6�D� �� �,��!�1�1�$�2C�D�D�D��"�.��!�3�3�D�4G�H�H�H�� �,��!�1�1�$�2C�D�D�D��)� C��-�,�1���!�2�2�7�T�>�B�B�B�B�B� C� Cr/c�p�||_|���s|j�|��|SrG)r�� is_closedr�r�rws r.� on_commitzCSqliteExtDatabase.on_commit��8�� "�D� ��>�>�#�#� 6��!�1�1�"�5�5�5��Ir/c�p�||_|���s|j�|��|SrG)r�r�r�r�rws r.� on_rollbackzCSqliteExtDatabase.on_rollback�s8��"$�D� ��>�>�#�#� 8��!�3�3�B�7�7�7��Ir/c�p�||_|���s|j�|��|SrG)r�r�r�r�rws r.� on_updatezCSqliteExtDatabase.on_update�r�r/c�4�|j���SrG)r��changesrHs r.r�zCSqliteExtDatabase.changes�s���$�,�,�.�.� .r/c�4�|j���SrG)r��last_insert_rowidrHs r.r�z$CSqliteExtDatabase.last_insert_rowid�s���$�6�6�8�8� 8r/c�4�|j���SrG)r�� autocommitrHs r.r�zCSqliteExtDatabase.autocommit�s���$�/�/�1�1� 1r/Nc�r�t|���|���|||���S�N)�pagesr+�progress)r� connection)r)� destinationr�r+r�s r.rzCSqliteExtDatabase.backup�s>���$�/�/�+�+�[�-C�-C�-E�-E� %�D�8�E�E�E� Er/c�N�t|���||||���Sr�)rr�)r)r8r�r+r�s r.rz!CSqliteExtDatabase.backup_to_file�s2��!�$�/�/�"3�"3�X�U�'+�h�@�@�@� @r/c�(�t|||||��SrG)r)r)r��columnr"� read_onlys r.� blob_openzCSqliteExtDatabase.blob_open�s����e�V�U�I�>�>� >r/Tr(�NNN):r0r1r2rOr�r�rrr�r�r�r�r�r�r�rrr�r��SQLITE_STATUS_MEMORY_USED� memory_used�SQLITE_STATUS_MALLOC_SIZE� malloc_size�SQLITE_STATUS_MALLOC_COUNT� malloc_count�SQLITE_STATUS_PAGECACHE_USED�pagecache_used� SQLITE_STATUS_PAGECACHE_OVERFLOW�pagecache_overflow�SQLITE_STATUS_PAGECACHE_SIZE�pagecache_size�SQLITE_STATUS_SCRATCH_USED� scratch_used�SQLITE_STATUS_SCRATCH_OVERFLOW�scratch_overflow�SQLITE_STATUS_SCRATCH_SIZE� scratch_sizer��SQLITE_DBSTATUS_LOOKASIDE_USED�lookaside_used�SQLITE_DBSTATUS_LOOKASIDE_HIT� lookaside_hit�#SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE�lookaside_miss�#SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL�lookaside_miss_full�SQLITE_DBSTATUS_CACHE_USED� cache_used�SQLITE_DBSTATUS_SCHEMA_USED� schema_used�SQLITE_DBSTATUS_STMT_USED�statement_used�SQLITE_DBSTATUS_CACHE_HIT� cache_hit�SQLITE_DBSTATUS_CACHE_MISS� cache_miss�SQLITE_DBSTATUS_CACHE_WRITE� cache_writer5r6s@r.r�r�us�������� F� F� F� F� F�  >� >� >� >� >� >� @� @� @� @� @� C� C� C� C� C� � � �  � � �  � � �  /� /� /� � 9� 9� �� 9� � 2� 2� �� 2� E� E� E� E�=A�$(� @� @� @� @�  ?� ?� ?� ?�!�j�!:�;�;� � �j�!:�D�A�A� �!�z�"<�=�=� �#��$@�A�A��'�Z�(H�I�I��#��$@�$�G�G��!�z�"<�=�=� �%�:�&D�E�E��!�z�"<�d�C�C� �&��&D�E�E��$� �%B�D�I�I� �%��&I�&*�,�,��*�l�+N�+/�1�1��!�\�"<�e�T�J�J� �#�l�#>��t�L�L� �%��&?���M�M�� �L�!:�E�4�H�H� �!�\�"<�e�T�J�J� �"�l�#>��t�L�L� � � � � r/r�c�8�t|tj|��SrG)rr r\)�lhsr�s r.r�r��s�� �c�2�8�S� )� )�)r/c�\��t���}�fd�td|d��D��S)Nc �\��g|](}tjd�||dz���d��)S)z@Irr)�structr�)r�rB�bufs �r.r�z%_parse_match_info.<locals>.<listcomp>�s6��� M� M� M�1�F�M�$��A�a��c�E� � +� +�A� .� M� M� Mr/rr)r=�range)r��bufsizes` r.�_parse_match_infor��s4����#�h�h�G� M� M� M� M��a��!�8L�8L� M� M� M�Mr/c�V�|sdg|zSdg|z}t|��D] \}}|||<� |S)Nr r)� enumerate)�ncol� raw_weightsrzrB�weights r.� get_weightsr��sL�� � ��s�T�z���#��*��"�;�/�/� � �I�A�v��G�A�J�J� �Nr/c�J�t|��}d}|dd�\}}t||��}t|��D]c}d||zdzz}t|��D]F} || } | s� || dzz} || } || dz} | dkr|| t| ��| z zz }�G�d| S)N�r:rr r)r�r�r��float)�raw_match_infor�r�r�r�r�rz� phrase_num�phrase_info_idx�col_numr��col_idx�row_hits� all_rows_hitss r.r{r{�s���#�>�2�2�J� �E� �b�q�b�>�D�A�q��!�[�)�)�G��A�h�h�D�D� ��z�A�~��1�2���Q�x�x� D� D�G��W�%�F�� ��%��1��5�G� "�'�*�H�&�w��{�3�M��!�|�|���5��?�?�]�#B�C�C��� D� �6�Mr/c��t|��}d}d}d}td��\}}}} ||} ||} ||} | | z} | | z}t| |��}t| ��D]�}t| ��D]�}||}|dkr�|d||| zzzz}t||��}t||dz��}t j| |z dz|dzz ��}|dkrd }t|| |z��}t|| |z��pd }||z }||d zz}d |z ||zz}|||zz}|||z z}|||zz }�׌�| 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�rrrr:g�?g�����ư>r�)r�r�r�r��math�log)r�r,r��K�Br��P_O�C_O�N_O�A_O� term_count� col_count� total_docs�L_O�X_OrzrB�jr��x�term_frequency�docs_with_term�idf� doc_length� avg_length�ratio�num�b_part�denom�pc_scores r.r�r�s���#�>�2�2�J� �A� �A� �E��q����C��c�3��C��J��3��I��C��J� � �/�C� � �/�C�:�)�T�*�*�G� �:� � �)�)���y�!�!� )� )�A��Q�Z�F���{�{���q�A��I� �-�.�/�A�"�:�a�=�1�1�N�"�:�a�!�e�#4�5�5�N��(��.�0�3�6�#�c�)�+�,�,�C��c�z�z����z�#��'�2�3�3�J��z�#��'�2�3�3�9�r�J���+�E� �A��G�,�C��1�W��E� �*�F�"�a�&�j�1�E��c�E�k�*�H� �h��'� (�E�E�3 )�6 �6�Mr/c��g} |�tj|��tj|��f��n#YdSxYw|�rB|���\}}t |t ��rnt |t ��r0|D],}||vrdS|�||||f���-n�t |t ��r |D] }||vrdS� n�||vrdSn�t |t ��r�t |t ��rdSt |t ��rU tt|����D]%}|�||||f���&n #t$rYdSwxYw||vrdSn||krdS|��BdSrJ) rjrdr��poprZrbrar�r=� IndexError)�src_json�obj_json�stack�obj�srcr�r]rBs r.riribs��� �E�� � � �d�j��*�*�D�J�x�,@�,@�A�B�B�B�B����u�u���� ���9�9�;�;���S� �c�4� � � ��#�t�$�$� ��7�7�C��#�~�~�$�u�u��L�L�#�c�(�C��H�!5�6�6�6�6�7��C��&�&� ��%�%�D��3���$�u�u�'�%��C����u� � ��T� "� "� ��#�t�$�$� ��u��C��&�&� �!�"�3�s�8�8�_�_�7�7��� � �c�!�f�c�!�f�%5�6�6�6�6�7��!�!�!�!� �5�5�!�����C����u� � �C�Z�Z��5�5 ��6 �4s�;A�A�'AE*�* E8�7E8r�r()FF)hrdr�r^r��sys�peeweerrrrrr r r r r r�playhouse._sqlite_extrrrrrrrrrrrrg� ImportError� version_inforArFrxr}r�rOr�r>r!r8r<� DecimalFieldrDrLr�rr�r�r�r�� SchemaManagerr�Modelr-r:rL� _alphabetrs�upperr�r�r�r��compiler�r�r2r4r\r`�SqliteDatabaserbr�r�r�r�r�r��SQLITE_STATUS_PARSER_STACKr�r�r�r�r�r�r�r�r�r�r�r�r��SQLITE_DBSTATUS_DEFERRED_FKSr�r�r�r�r�r�r{r�rir:r/r.�<module>r%s�� � � � � � � � � � � � � � � � � � � � �����������#�#�#�#�#�#�������������������������������������������������������%� � � � � � � � � � � � � � � � � � � � � � � � � � � $�����%�%�%�$����%������A��!����J����� ���2�2�A�2�6�)�C�C�!�!��K�K��K�#��9�9�9�9�9��9�9�9�1�1�1�1�1��1�1�1�;�;�;�;�;��;�;�;� "�"�"�"�"�L�"�"�"� 87�87�87�87�87�z�87�87�87�t7�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� � � ������<����8L�L�L�L�L�|�L�L�L�^ )� � �S�*� +� +� �S��^�^�� �S����"�"� #� #�$��S�#�#�b�'�'��_�_�� ���K�K�U�U�3�Z�Z�K�K�K�K�K�� � � �B�J�5� 6� 6� �X"�X"�X"�X"�X"� �X"�X"�X"�vCG�!%�X;�X;�X;�X;�vd�d�d�d�d�|�d�d�d�N ���/�/�/�*�*�*�*�*��*�*�*�Z�TM� !��#$� �'(�$�!"��%&�"� !��!"��#$� �!"��!"��%&�"�!"��"#�� !��$%�!�*+�'�*+�'� !��!"��"#��#%� � � � � �  �  �  �  �cM�cM�cM�cM�cM�.�cM�cM�cM�L*�*�*�N�N�N� ���!�!�!�HN�N�N�b#�#�#�#�#s�A9�9B�B
Memory