
    ŋKiG              	       f    d dl Z d dlZd dlZd dlmZ d Zd Zddededede	fd	Z
defd
ZdefdZy)    N)fuzzc                 0    d }| j                  dd|       y )Nc                     |y	 t        j                  | |t         j                        rdS dS # t         j                  $ r Y yw xY w)Nr   )flags   )research
IGNORECASEerror)patterntexts     R/mnt/media_drive2/site-root/code.jetlifecdn.com/xml-tools/sms-search/app/search.pyregexpzregister_regex.<locals>.regexp   sC    |))GT?QFQF88 s   '/ / AAREGEXP   )create_function)connr   s     r   register_regexr      s     xF+    c           
          | j                  dt        t        j                         dz        ||t        j                  |xs i       f       | j                          y )NzUINSERT INTO search_history(created_at_ms, mode, query, filters_json) VALUES (?,?,?,?)i  )executeinttimejsondumpscommit)r   modequeryfilterss       r   
log_searchr       sE    ,,[t	dE4::gm+DE ++-r   r   r   r   limitc                    t        |      \  }}|dk(  rCd|j                  dd       d}d| d}| j                  ||g||      j                         }	|	S |dk(  r-d| d}| j                  ||g||      j                         }	|	S |d	k(  r1d
| d}| j                  |d| dg||      j                         }	|	S |dk(  rkt	        |      }
|
r3d| d}d|
 dg|||}| j                  ||      j                         S d| d}| j                  ||g||      j                         S |dk(  r| j                  d| d|g|      j                         }g }|j                         j                         }|D ]@  }|d   xs dj                         }|j                  t        j                  ||      |f       B |j                  d d       |d| D cg c]  \  }}|	 c}}S g S c c}}w )z
  modes: exact_phrase, exact_substring, regex, fuzzy, relevance
  filters: address, date_from_ms, date_to_ms, type, thread_id
  exact_phrase" zu
      SELECT m.*
      FROM messages_fts f
      JOIN messages m ON m.id = f.rowid
      WHERE f.body MATCH ?
      z
      LIMIT ?
    	relevancez
      SELECT m.*, bm25(messages_fts) AS rank
      FROM messages_fts
      JOIN messages m ON m.id = messages_fts.rowid
      WHERE messages_fts MATCH ?
      z+
      ORDER BY rank ASC
      LIMIT ?
    exact_substringzH
      SELECT m.*
      FROM messages m
      WHERE m.body LIKE ?
      z1
      ORDER BY m.date_ms DESC
      LIMIT ?
    %regexzH
        SELECT m.* FROM messages m
        WHERE m.body LIKE ?
        zK AND m.body REGEXP ?
        ORDER BY m.date_ms DESC
        LIMIT ?
      zD
      SELECT m.* FROM messages m
      WHERE m.body REGEXP ?
      fuzzyz
      SELECT m.*
      FROM messages_fts
      JOIN messages m ON m.id = messages_fts.rowid
      WHERE messages_fts MATCH ?
      z
      LIMIT 1000
    bodyc                     | d   S )Nr    )xs    r   <lambda>zrun_search.<locals>.<lambda>m   s
    ad r   T)keyreverseN)build_filtersreplacer   fetchallextract_literal_hintlowerstripappendr   partial_ratiosort)r   r   r   r   r!   whereparamsqsqlrowslitbasepcandscoredqlrblscores                      r   
run_searchrI      s   
  (-%	^
U]]4#%R(A
 g C <<a0&0%01::<DK	[
 g C <<e4f4e45>>@DK	 g 	C <<%l;V;U;<EEGDK	W_
u
%C
	 
 
d se1:
-
-
-u
-a\\$"++-- g D <<u5v5u56??AA	W_<< 
 g  	&	 $8: 	 F				B 5fIO""$bmmT''B/345 KKNDK1$Ven-(%A--	) .s   G.c                    | xs i } g }g }| j                  d      r%|j                  d       |j                  | d          | j                  d      B| j                  d      dk7  r.|j                  d       |j                  t        | d                | j                  d      r.|j                  d       |j                  t        | d                | j                  d      r.|j                  d	       |j                  t        | d                | j                  d
      r.|j                  d       |j                  t        | d
                |rddj                  |      z   nd}||fS )NaddresszAND m.address = ?typer%   zAND m.type = ?	thread_idzAND m.thread_id = ?date_from_mszAND m.date_ms >= ?
date_to_mszAND m.date_ms <= ?z
  )getr8   r   join)r   clausesr<   r;   s       r   r2   r2   r   s.   Mr''&[[NN&'
MM')$%[[$V)<)BNN#$
MM#gfo&'[[NN()
MM#gk*+,[[ NN'(
MM#gn-./[[NN'(
MM#gl+,-+2&6;;w'
'%	r   regex_patternc                 X    t        j                  d|       }|rt        |t              S d S )Nz[A-Za-z0-9]{4,})r0   )r   findallmaxlen)rS   partss     r   r5   r5      s'    
**'
7% %U	/4/r   )   )r   r   r   	rapidfuzzr   r   r    strdictr   rI   r2   r5   r-   r   r   <module>r]      sZ     	  	,X3 Xs XT X# Xt4 00 0r   