
    i6                     6   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
Zd dlmZmZ d dlmZmZmZ d dlmZmZ deez  d	ej*                  d
efdZ G d dej0                        Z G d dej0                        Z G d d      ZdedefdZdeez  deez  fdZy)    N)defaultdict)RLock)logger)histogram_observecounter_add)ResultLegacyResult
MainResult)	AnswerSet
BaseAnswerresultpriorityreturnc                 X   d}| d   D ]i  }t        t        j                  j                  j                  |      d      s7|t	        t        j                  j                  |   j
                        z  }k |t        | d         z  }d}| d   D ]  }|dk(  r	|dk(  r||z  }|||z  z  } |S )Ng      ?enginesweight	positionsr   lowhigh)hasattrsearxr   getfloatr   len)r   r   r   result_enginescorepositions         /root/searxng/searx/results.pycalculate_scorer      s     F	* I5==((,,];XFeEMM11-@GGHHFI c&%&&FE;' 'uvVOEVh&&E' L    c                   ,    e Zd ZU eed<   eed<   eed<   y)TimingenginetotalloadN)__name__
__module____qualname__str__annotations__r    r    r   r"   r"   )   s    KL
Kr    r"   c                   ,    e Zd ZU eed<   eed<   eed<   y)UnresponsiveEnginer#   
error_type	suspendedN)r&   r'   r(   r)   r*   boolr+   r    r   r-   r-   /   s    KOOr    r-   c                       e Zd ZU dZeeeez  f   ed<   e	e   ed<   e
e   ed<   eed<   e
e   ed<   d Zded	z  d
e	eez     fdZdefdZdeez  defdZd Zde	eez     fdZedefd       ZddededefdZdededefdZde	e   fdZy	)ResultContainerz]In the result container, the results are collected, sorted and duplicates
    will be merged.main_results_map	infoboxessuggestionsanswerscorrectionsc                 B   i | _         g | _        t               | _        t	               | _        t               | _        g | _        t        t              | _
        d| _        d| _        t               | _        g | _        d | _        d | _        t#               | _        d | _        y )NFc                      y)NTr+   )_s    r   <lambda>z*ResultContainer.__init__.<locals>.<lambda>O   s    r    )r3   r4   setr5   r   r6   r7   _number_of_resultsr   dictengine_data_closedpagingunresponsive_enginestimingsredirect_url	on_resultr   _lock_main_results_sortedselfs    r   __init__zResultContainer.__init__A   s     "5 {5-/6A$6G"!=@U!%'(,DR!G
EI!r    engine_nameNresultsc                 :   | j                   rt        j                  d|       y d}t        |      D ]s  }t	        |t
              r|j                  xs ||_        |j                          | j                  |      sKt	        |t              r| j                  j                  |       wt	        |t              r|dz  }| j                  ||       t        d|       |j                  d      xs |xs d|d<   t!        |      }|j                          d|v r1| j                  |      r| j"                  j                  |d          d|v rV| j                  |      rCt%        j&                  d	|j                   d
t(               | j                  j                  |       sd|v r1| j                  |      r| j*                  j                  |d          d|v r$| j                  |      r| j-                  |       d|v r1| j                  |      r| j.                  j1                  |d          d|v rA| j                  |      r.|j                  r"|d   | j2                  |j                     |d   <   J| j                  |      s]|dz  }| j                  ||       v |t4        j6                  j6                  v rXt4        j6                  j6                  |   }t9        |d|j:                  dd       | j<                  s|j<                  rd| _        y y y y )Nz)container is closed, ignoring results: %sr      z5no handler implemented to process the result of type r#    
suggestionanswerzanswer results from engine z4 are without typification / migrate to Answer class.
correctioninfoboxnumber_of_resultsr?   keyr   countT)r@   logdebuglist
isinstancer   r#   normalize_result_fieldsrE   r   r6   addr
   _merge_main_resultNotImplementedErrorr   r	   r5   warningswarnDeprecationWarningr7   _merge_infoboxr=   appendr?   r   r   r   namerA   )rI   rK   rL   
main_countr   engs         r   extendzResultContainer.extendS   s    <<IIA7K
7m =	F&&) & <..0~~f-fj1LL$$V,
3!OJ++FJ? .0eflem.noo $*::h#7#L;#L"x %f-..06)~~f-((,,VL-ABv%~~f- 9&--RS.
 ((06)~~f-((,,VL-AB&~~f-++F3&&0~~f-//66v>Q7RS F*~~f-!==MSTaMbD,,V]];F5MJ>>&)!OJ++FJ?{=	~ %--///--''4Cj(CHHhP;;3::" $.; 0r    new_infoboxc                    d}t        |dd       }|F| j                  5  | j                  D ]!  }|t        |dd       k(  st        ||       d}# 	 d d d        |r| j                  j	                  |       y y # 1 sw Y   (xY w)NTidF)getattrrF   r4   merge_two_infoboxesrc   )rI   rh   add_infoboxnew_idexisting_infoboxs        r   rb   zResultContainer._merge_infobox   s    dD1 ,(, ,$)94!FF+,<kJ&+,,
 NN!!+. , ,s    A7A77B r   r   c                 &   t        |      }| j                  5  | j                  j                  |      }|s!|g|_        || j                  |<   	 d d d        y t        ||       |j                  j                  |       d d d        y # 1 sw Y   y xY wN)hashrF   r3   r   r   merge_two_main_resultsrc   )rI   r   r   result_hashmergeds        r   r]   z"ResultContainer._merge_main_result   s    6lZZ 	.**..{;F$,: 5;%%k2	. 	. #662##H-	. 	. 	.s   6B'BBc                     d| _         | j                  j                         D ]F  }t        ||j                        |_        |j                  D ]  }t        |j
                  d|d        H y )NTr#   r   )r@   r3   valuesr   r   r   r   r   )rI   r   eng_names      r   closezResultContainer.close   sb    ++224 	GF*66??CFL"NN GFLL(HgFG	Gr    r   c                 |   | j                   s| j                          | j                  r| j                  S t        | j                  j                         d d      }g }i }d}d}|D ]A  }t        j                  j                  j                  |j                  xs d      }|r.t        |j                        dkD  r|j                  d   nd|_        |j                   d|j                   d|j                  s|j                  rd	nd }|j                  |      }	|	j|	d
   dkD  rbt        |      |	d   z
  |k  rN|	d   }
|j!                  |
|       |j                         D ]  }|d   }||
k\  s|dz   |d<    |	d
xx   dz  cc<    |j#                  |       t        |      |d||<   D || _        | j                  S )zgReturns a sorted list of results to be displayed in the main result
        area (:ref:`result types`).c                     | j                   S rq   )r   )xs    r   r;   z5ResultContainer.get_ordered_results.<locals>.<lambda>   s
    qww r    T)rU   reverse      rO   r   :img_srcrV   indexrN   )r   rV   )r@   ry   rG   sortedr3   rw   r   r   r   r#   r   
categoriescategorytemplate	thumbnailr   insertrc   )rI   rL   gresultscategoryPositions	max_countmax_distanceresr#   r   grpr   itemvs                r   get_ordered_resultsz#ResultContainer.get_ordered_results   s    ||JJL$$,,, ..557=NX\] 57.0	 "	C]]**..szz/?R@F7:6;L;L7MPQ7Qv003WY ,,qacmmWZWbWb	ik7lmH#''1C c'lQ&6S]SQX\=Y\h=h Gs+ .446 .DWAEz()AW. G! $8;HPY.Z!(+E"	H %-!(((r    c                 f   | j                   st        j                  d       y| j                  5  t	        | j
                        }|r| j
                  s
	 ddd       yt        |t        | j
                        z        }|t        | j                               k  rd}|cddd       S # 1 sw Y   yxY w)zReturns the average of results number, returns zero if the average
        result number is smaller than the actual result count.zFcall to ResultContainer.number_of_results before ResultContainer.closer   N)	r@   rW   errorrF   sumr=   intr   r   )rI   resultnum_sumaverages      r   rT   z!ResultContainer.number_of_results   s    
 ||II^_ZZ 	 7 78M (?(?	 	
 -#d.E.E*FFGGT55788	 	 	s   %B'A B''B0r.   r/   c                 6   | j                   5  | j                  rt        j                  d       	 d d d        y t        j
                  j
                  |   j                  r&| j                  j                  t        |||             d d d        y # 1 sw Y   y xY w)NzKcall to ResultContainer.add_unresponsive_engine after ResultContainer.close)
rF   r@   rW   r   r   r   display_error_messagesrB   r\   r-   )rI   rK   r.   r/   s       r   add_unresponsive_enginez'ResultContainer.add_unresponsive_engine  s~    ZZ 	f||		gh	f 	f }}$$[1HH))--.@jZc.de	f 	f 	fs   #BABBengine_timepage_load_timec                     | j                   5  | j                  rt        j                  d       	 d d d        y | j                  j                  t        |||             d d d        y # 1 sw Y   y xY w)Nz>call to ResultContainer.add_timing after ResultContainer.close)r$   r%   )rF   r@   rW   r   rC   rc   r"   )rI   rK   r   r   s       r   
add_timingzResultContainer.add_timing  sb    ZZ 	]||		Z[	] 	] LL{+N [\		] 	] 	]s   #A)'A))A2c                     | j                   5  | j                  s t        j                  d       g cd d d        S | j                  cd d d        S # 1 sw Y   y xY w)Nz@call to ResultContainer.get_timings before ResultContainer.close)rF   r@   rW   r   rC   rH   s    r   get_timingszResultContainer.get_timings!  sH    ZZ 	 <<		\]	  	  <<		  	  	 s   #AAA)F)r&   r'   r(   __doc__r>   r   r
   r	   r*   rY   r<   r)   r   rJ   r   rg   rb   r]   ry   r   propertyrT   r0   r   r   r   r"   r   r+   r    r   r2   r2   5   s   
 3
\ 99::L!!SSJ$K#:K#04Vl5J0KK#Z/, /.l)B .c . G8)T*|*C%D 8)t 3  $f3 fC fTX f]c ] ]u ] T&\  r    r2   originotherc                    t        t        j                  j                  | j                     dd      }t        t        j                  j                  |j                     dd      }||kD  r|j                  | _        | xj                  |j                  z  c_        |j                  r| j                  dg       }|j                  D ]}  }d}|j                  d      }| j                  dg       D ]?  }|||j                  d      k(  s$|j                  d      |j                  d      k(  s=d} n |sm|j                  |        || _        |j                  r4| j                  s|j                  | _        n||kD  r|j                  | _        |j                  r| j                  s|j                  | _        nt               }	| j                  D ]K  }
|
j                  d	      }|r|	j                  |       |
j                  d      }|s;|	j                  |       M |j                  D ]E  }
|
j                  d	      |	vs|
j                  d      |	vs+| j                  j                  |
       G |j                  r\| j                  s|j                  | _        yt        |j                        t        | j                        kD  r|j                  | _        yyy)
1Merges the values from ``other`` into ``origin``.r   rN   urlsTentityNurlFlabel)rk   r   r   r#   r   r   rc   r   
attributesr<   r\   contentr   )r   r   weight1weight2	url_itemsurl2
unique_urlentity_url2url1attr_names_1attrr   r   s                r   rl   rl   )  sQ    emm++FMM:HaHGemm++ELL98QGG
NNemm#NzzJJvr*	JJ 	'DJ((8,K

62. +txx?Q0QHHUOtxx6!&J   &	'  }}~~"]]FNw"]]FN   % 0 0F%(UL)) -) $$U+(+ $$V,- (( 388G$L8TXXh=OWc=c%%,,T23 }}~~"]]FN#fnn"55"]]FN 6 r    c                    t        |j                  xs d      t        | j                  xs d      kD  r|j                  | _        t        |j                  xs d      t        | j                  xs d      kD  r|j                  | _        t        |t              r"t        | t              r| j                  |       n1t        |t              r!t        | t              r| j                  |       | j                  j                  |j                  xs d       | j                  r| j                  j                  j                  d      s|j                  r{|j                  j                  j                  d      rU| j                  j                  |j                  j                        | _
        | j                  j                         | _        yyyyy)r   rO   s)schemeN)r   r   titlerZ   r
   defaults_fromr	   r   r\   r#   
parsed_urlr   endswith_replacegeturlr   )r   r   s     r   rs   rs   e  s[    5==B#fnn&:";; 5;;"FLL$6B 77{{ %$FJ)GU#	E<	(Z-MU# NNu||)r* !2!2!9!9!B!B3!G 0 0 7 7 @ @ E & 1 1 : :%BRBRBYBY : ZF**113FJ !F "Hr    )typingtr_   collectionsr   	threadingr   r   r   rW   searx.enginessearx.metricsr   r   searx.result_typesr   r	   r
   searx.result_types.answerr   r   PriorityTyper   r   
NamedTupler"   r-   r2   rl   rs   r+   r    r   <module>r      s      #    8 ? ? ;%%% 0Q\\  q  q h9+ 9+\ 9+x4:#< 4ZR^E^ 4r    