
    ph3                        d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZ d dlmZ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!  ejD                  e#      Z$ G d d      Z%y)    N)defaultdict)ThreadPoolExecutor)datetime)DictListOptional)Session)MatchedTypeStatus)
MatchInput)MatchOutput)KeywordsService)LogsService)OutputService)get_web_crawler)WineService)
Calculator)
WebCrawlerc                      e Zd Z e        e        e        e       dddfdededededed	ed
efdZ	dede
fdZdede
fdZdede
defdZde
fdZdedededefdZdedefdZdedefdZdefdZdedee   fdZy )!MatcherServicezutf-8750ml   output_servicelogs_servicekeywords_servicewine_serviceoutput_encodingdefault_bottle_sizemax_threadsc                     || _         || _        || _        || _        || _        || _        || _        t               | _        t               | _	        y N)
r   r   r   r   r   r   r   setrunning_keyword_matchesrunning_history_matches)selfr   r   r   r   r   r   r   s           a/var/www/html/wine-match-dev/backend/winematch-backend/src/apps/match/services/matcher_service.py__init__zMatcherService.__init__   sP     -( 0(.#6 &'*u$'*u$    retailer_code
match_typec                     |sy |t         j                  k(  r| j                  j                  |       y |t         j                  k(  r| j
                  j                  |       y y r!   )r
   KEYWORDr#   addHISTORYr$   r%   r)   r*   s      r&   add_to_running_matchesz%MatcherService.add_to_running_matches-   sQ    ,,,((,,];;...((,,]; /r(   c                     |sy |t         j                  k(  r| j                  j                  |       y |t         j                  k(  r| j
                  j                  |       y y r!   )r
   r,   r#   discardr.   r$   r/   s      r&   remove_from_running_matchesz*MatcherService.remove_from_running_matches5   sQ    ,,,((00?;...((00? /r(   returnc                 f    |sy|t         j                  k(  r|| j                  vS || j                  vS )NT)r
   r,   r#   r$   r/   s      r&   is_terminated_matchz"MatcherService.is_terminated_match=   s8    ,,, (D(DDD (D(DDDr(   c                     |t         j                  k(  r| j                  j                          y | j                  j                          y r!   )r
   r,   r#   clearr$   )r%   r*   s     r&   clear_running_matchesz$MatcherService.clear_running_matchesE   s4    ,,,((..0((..0r(   dbrun_keyworddatec                 J   
K   t        ||      st        d      t        j                  d| d        j                  j                  ||      }|st        j                  d       y  j                  j                  |      
g }t               t        t              dt        dt        f
 fd}|D cg c]
  } ||       }	}t        j                  |	  d {   } j                  ||        j                  j!                  |||        j"                  j%                  |||t&        j(                  d	t+        j,                         t/        |      d
   d   d   d          t        j                  d| dt1                      y c c}w 7 w)N)r:   codezRetailer not found[z] Matching process startedzNo output list found.outputr4   c                 n  K   j                  
|       }t        j                  || 
j                        }|j                  }|j
                  rj                  |j
                        nd }|r!|j                  |       	dxx   dz  cc<   |S rj                  |       d {    |j                  t        j                  j                  k(  r|j                  s	dxx   dz  cc<   |S |j                  t        j                  j                  k(  r	dxx   dz  cc<   |S 	dxx   dz  cc<   |S 7 w)N)web_crawleroutput_linehMatch   kMatchaMatchuMatch)_parse_inputr   
from_inputoutput_delimiterbottle_size_idhistory_stringgetapply_history_match_apply_keyword_matchmatchr
   r,   valueerrors	AMBIGUOUS)r@   match_inputmatch_output	bottle_id
history_idhistory_matchesidsr;   r%   statsrB   s        r&   process_outputz.MatcherService.execute.<locals>.process_output\   s-    ++QW+XK&11+v{GcGcdL#22IMYMhMh,,\-H-HInrJ00TBh1$   //cBBB%%)<)<)B)BB<K^K^(Oq(O   "((K,A,A,G,GG(Oq(O   (Oq(O Cs   B$D5'D3(BD5 rD   rF   rG   rH   z] Match completed. Stats: )r   
ValueErrorloggerinfor   load_retailer_outputwarningload_historiesr"   r   intstrr   asynciogather_set_wine_namessave_matched_to_filer   save_match_logr   SUCCESSr   nowlendict)r%   r:   r)   r;   r<   output_listresultsr\   otasksrY   rZ   r[   rB   s   `  `      @@@@r&   executezMatcherService.executeK   s{    "1Rm"L122a&@AB))>>}dSNN23--<<]K%'eC 	  	  	  	 * -88q"88..R)00{[((NNLLN(O(O(O(O	
 	a&@eNO- 9.s   B9F#FF#'F!(B:F#rV   rZ   c                   K   |j                   s't        j                  j                  |_        d|_        y | j                  |j                         d {   }|j                  dk(  r$|j                         }|j                  |||        y |j                  dkD  r|j                  |       y |j                          y 7 iw)Nzvintage missingrE   )vintager
   UNKNOWNrR   rQ   rS   calculate_matchkeyword_stringmatches_sizefirst_matchapply_single_keyword_matchapply_ambiguous_matchapply_unknown_match)r%   rV   rZ   match_result
wine_db_ids        r&   rP   z#MatcherService._apply_keyword_match   s     ##!,!4!4!:!:L"3L!11,2M2MNN$$)%113J33JTJ&&*..|<,,. Os   AC B>A*C rC   c                 
   t        t        |dd       dd       }t        |      r |       }|sd}|r|j                  |      ng }d}t        |dd       	 ||j                     j	                         }|r|j                         dk(  rd}t        |      dk(  s|j                         dk(  sd}d}t        |d	d       	 ||j                     }| j                  j                  |      r|nd}t               }	 d}	t        |d
d       	 ||j                     }	t        j                  |	      }
|
|_        d}t        |dd       	 ||j"                     }||_        d}t        |dd       	 ||j&                     }||_        d}t        |dd       	 ||j*                     }||_        g }t        |dg       xs g D ]L  }|t        |      |kD  r||   nd}|s|j	                         s.|j/                  |j	                                N dj1                  |      j	                         |_        g }t        |dg       xs g D ]L  }|t        |      |kD  r||   nd}|s|j	                         s.|j/                  |j	                                N dj1                  |      }t        j4                  |      }||_        |j	                         |_        g }t        |dg       xs g D ]L  }|t        |      |kD  r||   nd}|s|j	                         s.|j/                  |j	                                N dj1                  |      }|j	                         |_        |}t        j<                  |      }| j                  j?                  |      }| j                  jA                  |      }t        j4                  |      }| j                  j?                  |      }|j	                         |_!        |st        jD                  |j:                        }|st        |dd      rd}|xs d|_#        |sB| j                  jI                  |      }|s%| j                  jI                  |j2                        }|st        |dd      s| jJ                  }|xs d|_&        | j                  j                  |      }|r||_'        |S # t
        $ r d}Y Ow xY w# t
        $ r d}Y w xY w# t
        $ r d}	Y w xY w# t
        $ r d}Y w xY w# t
        $ r d}Y w xY w# t
        $ r d}Y w xY w# t
        $ r+}tP        jS                  tU        |      d       Y d }~|S d }~ww xY w)NrK   	delimiterz\|r]   vintage_indexzn.v.NVr   bottle_size_indexprice_index	sku_indextax_status_index	url_indexlist_description_indexes list_history_indexeslist_keyword_indexesvintage_default_nvFbottle_size_default_blankT)exc_info)+getattrcallablesplitr   strip	Exceptionlowerrm   upperr   r   get_bottle_idr   r   r   parse_moneypricer   skur   
tax_statusr   urlappendjoindescriptioncleanuphistory_textoriginal_history_textoriginal_keyword_textcleanup_numeric_htmlreplace_aliasesremove_size_infokeyword_textparse_vintageru   parse_bottle_sizer   sizerL   r_   errorre   )r%   rB   rC   	separator	wine_inforu   original_size_infor   rU   price_stringr   r   r   r   
desc_buildittexth_inputh_input_strhistory_inputk_inputk_input_strmatches_inputrW   es                            r&   rI   zMatcherService._parse_input   sj   GK1CTJKY]^	I!II 5@K%%i0R	 ;6B#K$=$=>DDF w}}&0GG!W]]_%<G  ; 3T:F(%.{/L/L%M"
 &*%:%:%H%HI[%\!bd l_	0L{M48D&#,[-D-D#EL **<8E %K C{K6B#K$9$9:C "KO J{$6=I$!*;+G+G!HJ &0K" C{K6B#K$9$9:C "KO Jk+ErJPb 4(*3y>B;Ny}TVDJJL%%djjl34 '*hhz&:&@&@&BK# Gk+A2FL" 1(*3y>B;Ny}TVDJJLNN4::<01 '''*K&..{;M'4K$0;0A0A0CK- Gk+A2FL" 1(*3y>B;Ny}TVDJJLNN4::<01 ((7+K0;0A0A0CK-'M&;;MJM 11AA-PM 11BB=QM&..}=M 11AA-PM'4':':'<K$ $22;3T3TUw{4H%P")-RK ,,>>?QR00BB;CZCZ[D5PRV W//#zrK--;;DAI-6* i    (%'"( ! &#%L& ! C ! $!#J$ ! Cx  	0LLQ$L//	0s   R2 ;S 4T S +T ?S( T %S: 4T T 6T T "A4T T (BT ;T F$T 2S SSSS%!T $S%%T (S73T 6S77T :T	T T		T TT TT 	U' UUsearch_textc                     K   ddl m}  |        j                  j                        } fd}t	         j
                        5 }|j                  ||       d d d        S # 1 sw Y   S xY ww)Nr   )AtomicKwMatchc           
         	 t        j                  j                  j                  |       j                  j	                  |       j                  j                  |       j                  j                  j                  |             }j                  | |       y # t        $ r%}t        j                  d|  d|        Y d }~y d }~ww xY w)NzError scoring z: )r   	get_scorer   get_patternget_normalized_sorted_patternget_normalized_patternscoreget_required_wordsr"   r   r_   r   )id_r   r   rQ   r   r%   s      r&   evaluatez0MatcherService.calculate_match.<locals>.evaluate$  s    :",,))55c:))GGL))@@EKK))<<SA 		#u% :~cU"QC899:s   BB 	C'CC)max_workers)(src.apps.match.services.atomic_kw_searchr   r   get_candidate_listr   r   map)r%   r   r   
candidatesr   executorrQ   s   ``    @r&   rw   zMatcherService.calculate_match  si     J**==kJ
	:  D,<,<= 	/LL:.	/ 	/ s   AA5A(
A5(A2-A5outputsc                    |D cg c]9  }|j                   t        j                  j                  k(  s+|j                  r8|; }}t        t        d |D                    }|sy | j                  j                  ||      }|D ci c]  }|j                  |j                   }}|D ]%  }|j                  |v s||j                     |_        ' y c c}w c c}w )Nc              3   N   K   | ]  }|j                   s|j                     y wr!   )r   ).0rq   s     r&   	<genexpr>z1MatcherService._set_wine_names.<locals>.<genexpr>9  s     PQ1<<ALLPs   %%)r:   rZ   )rQ   r
   r,   rR   rS   listr"   r   get_wines_with_descriptionidlabelr   	wine_name)	r%   r:   r   rq   valid_outputswine_idswineswwine_maps	            r&   rh   zMatcherService._set_wine_names7  s    $+eqqww+:M:M:S:S/S\]\d\deeP-PPQ!!<<<Q+01aADD!''M11 	5A||x'&q||4	5 f 2s   ,CCCCN)__name__
__module____qualname__r   r   r   r   re   rd   r'   r
   r0   r3   boolr6   r9   r	   r   rs   r   r"   rP   r   rI   rw   r   rh    r(   r&   r   r      s5    )6$/M,;,=$/M&#*-%- "- *	-
 "- - !- -(<C <[ <@ @+ @E E+ ERV E1 1<P <P <P$ <PV^ <P|/{ / /DS DZ DL 2
5' 
5D4E 
5r(   r   )&rf   loggingcollectionsr   concurrent.futuresr   r   typingr   r   r   sqlalchemy.ormr	   src.apps.match.enumsr
   r   "src.apps.match.schemas.match_inputr   #src.apps.match.schemas.match_outputr   (src.apps.match.services.keywords_servicer   $src.apps.match.services.logs_servicer   &src.apps.match.services.output_servicer   #src.apps.match.services.web_crawlerr   $src.apps.match.services.wine_servicer   src.apps.match.utils.calculatorr   'src.apps.web_crawler.models.web_crawlerr   	getLoggerr   r_   r   r   r(   r&   <module>r      sY      # 1  ' ' " 4 9 ; D < @ ? < 6 >			8	$i5 i5r(   