
    BTh$                         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 ddlm	Z	 	 d dl
Z
d dlmZ  G d
 de      Zd Z G d d      Zy# e$ rZ ed	      edZ[ww xY w)    N)date)datetime)Decimal)partial   )normalize_stats)JSONSerializerz?Please install elasticsearch or pytest-benchmark[elasticsearch]c                       e Zd Zd Zy)BenchmarkJSONSerializerc                     t        |t        t        f      r|j                         S t        |t              rt        |      S t        |t        j                        rt        |      S d|dS )NzUNSERIALIZABLE[])	
isinstancer   r   	isoformatr   floatuuidUUIDstr)selfdatas     x/var/www/catia.catastroantioquia-mas.com/valormas/lib/python3.12/site-packages/pytest_benchmark/storage/elasticsearch.pydefaultzBenchmarkJSONSerializer.default   sY    dT8,->>##g&;dii(t9$THA..    N)__name__
__module____qualname__r    r   r   r   r      s    /r   r   c                     t        j                  d      }t        |j                  d      }t	        t        ||             }|S )Nz^([^:]+)://[^@]+@z\1://***:***@)recompiler   sublistmap)hostsmsub_funmasked_hostss       r   _mask_hostsr'      s9    


&'Aaee-.GGU+,Lr   c                   x    e Zd ZddZd Zed        Zd ZddZddZ	e
d        Ze
d	        Zd
 Zd Zd Zd Zy)ElasticsearchStorageNc                     || _         || _        || _        t        j                  | j                   t                     | _        || _        || _        || _	        i | _
        | j                          y )N)
serializer)	_es_hosts	_es_index_es_doctypeelasticsearchElasticsearchr   _es_project_namedefault_machine_idlogger_cache_create_index)r   r#   indexdoctypeproject_namer4   r3   s          r   __init__zElasticsearchStorage.__init__%   s^    " ..t~~JaJcd)"4r   c                 ,    t        | j                        S Nr   r,   r   s    r   __str__zElasticsearchStorage.__str__0   s    4>>""r   c                 ,    t        | j                        S r<   r=   r>   s    r   locationzElasticsearchStorage.location3   s    4>>""r   c                     dddddiiid}| j                   j                  | j                  | j                  |      }t	        |d   d   d	   D cg c]  }|d
   	 c}      S c c}w )zS
        Returns sorted records names (ids) that corresponds with project.
        r   benchmark_idstermsfieldbenchmark_id)sizeaggsr7   doc_typebodyaggregationsbucketskey)r1   searchr-   r.   sorted)r   rK   resultrecords       r   queryzElasticsearchStorage.query7   sm     Og?X5Y#Z[t~~@P@PW[\6.3I/3Z[d3efve}fggfs   A#c              #     K   | j                  | j                  |      }| j                  |d   d         }t        |j	                               }|j                  d        |D ]#  \  }}|d   D ]  }t        |d           ||f % yw)zV
        Yield key and content of records that corresponds with project name.
        hitsc                 :    t        j                  | d   d   d      S )N   r   z%Y-%m-%dT%H:%M:%S.%f)r   strptime)xs    r   <lambda>z+ElasticsearchStorage.load.<locals>.<lambda>F   s    ("3"3AaD4DF\"] r   )rN   
benchmarksstatsN)_searchr2   _group_by_commit_and_timer!   itemssortr   )r   	id_prefixrgroupped_datarQ   rN   r   benchs           r   loadzElasticsearchStorage.load?   s      LL++Y766qy7HIm))+,]^ 	ICl+ 0g/0t)O	s   B	Bc                     ddddiigdddd|iiiid	}|rd
d|ii|d   d   d<   | j                   j                  | j                  | j                  |      S )Ni  r   orderdescboolfiltertermzcommit_info.project)rG   r`   rS   prefix_idrS   mustrI   )r1   rO   r-   r.   )r   projectra   rK   s       r   r]   zElasticsearchStorage._searchL   sz     7F"345x&3H'2R)STU

 -5y7I,JDM&!&)xxT^^d>N>NUYZZr   c                 (    i }dD ]
  }| |   ||<    |S )N)groupr\   optionsparamnameparamsfullnamerF   r   )source_es_recordrQ   benchmark_keys      r   _benchmark_from_es_recordz.ElasticsearchStorage._benchmark_from_es_recordW   s,    q 	DM$4]$CF=!	Dr   c                 (    i }dD ]
  }| |   ||<    |S )N)machine_infocommit_infor   versionr   )rw   rQ   run_keys      r   _run_info_from_es_recordz-ElasticsearchStorage._run_info_from_es_record^   s)    M 	8G.w7F7O	8r   c                     i }|D ]k  }|d   }dj                  |d   d   |d         }| j                  |      }||v r||   d   j                  |       P| j                  |      }|g|d<   |||<   m |S )N_sourcez{}_{}r|   idr   r[   )formatry   appendr   )r   rU   rQ   hit
source_hitrN   	benchmarkrun_infos           r   r^   z.ElasticsearchStorage._group_by_commit_and_timee   s     		'CYJ..M!:4!@*ZBXYC66zBIf}sL)00;88D*3&&s		' r   c              '      K   |r|d   nd}| j                  | j                  |      }|d   d   D ]B  }| j                  |d         }|j                  |j	                  d             |d   |d<   | D yw)z
        Yield benchmarks that corresponds with project. Put path and
        source (uncommon part of path) to benchmark dict.
        r   NrU   r   r\   rF   source)r]   r2   ry   updatepop)r   argsra   rb   r   rd   s         r   load_benchmarksz$ElasticsearchStorage.load_benchmarkss   s     
  $DG	LL++Y7V9V$ 	C223y>BELL7+,#N3E(OK		s   A4A6c                    |j                  d      }|D ]v  }|j                  |       |}| j                  r| j                  dz   |z   }|dz   |d   z   }||d<   | j                  j	                  | j
                  | j                  ||       x t        | j                        }| j                  j                  d| d| j
                   d| j                          y )	Nr[   _rv   rF   )r7   rJ   rK   r   zSaved benchmark data to z
 to index z as doctype )r   r   r3   r1   r7   r-   r.   r'   r,   r4   info)r   output_jsonsaveoutput_benchmarksrd   rF   doc_idr&   s           r   r   zElasticsearchStorage.save   s    'OOL9& 	ELL%L&&#66<|K!C'%
*;;F$0E.!HHNNnn))	  	 #4>>23L>DNNK[[ghlhxhxgyz{r   c                    ddddddiddddddd	id
dddddddddddddddddddddddddddddddddddddddddddddd
idddiddiddiddiddiddididi dddidddidddidddidddidddidddidddidddidddidddidddidddidddidddid ddiid!	iii}| j                   j                  j                  | j                  d"|#       y )$Nmappingsr   
propertiestypebooleanstringnot_analyzed)r   r7   )dirtyr   ro   r   z'strict_date_optional_time||epoch_millis)r   r   )
machinenode	processorpython_buildpython_compilerpython_implementationpython_implementation_versionpython_versionreleasesystemdoublelong)
disable_gcmax_time
min_roundsmin_timetimerwarmuphd15iqriqriqr_outliers
iterationsld15iqrmaxmeanmedianminoutliersq1q3roundsstddevstddev_outliersops)	r|   r   rt   rv   r}   rF   r{   rr   r\   i  )r7   ignorerK   )r1   indicescreater-   )r   mappings     r   r6   z"ElasticsearchStorage._create_index   sX    (*0))</7.&Q4<~+V+( .4?h$i)1N K-5$O,4~#N$,%3)
 )4<~+V19N(S6>-X9AN0[<D~3^BJUc9dJR]kAl;Cn2]4<~+V3;n*U+) )/5y.A-3X,>/5v.>-3X,>*0();+19*=+	$ ) + )FH+=+ %'9+ !/0@+ !-vv.>	+
 !*FH+=+ !&'9+ !'(:+ !)68*<+ !&'9+ !+VX,>+ !%vx&8+ !%vx&8+ !)66*:+ !)68*<+ !2FF3C+  !&'9!+"Q<#>@B
F 	dnnSwOr   r<   )r   r   r   r:   r?   propertyrA   rS   re   r]   staticmethodry   r   r^   r   r   r6   r   r   r   r)   r)   $   sp    	# # #h	[    |(DPr   r)   )r   r   r   r   decimalr   	functoolsr   r\   r   r/   elasticsearch.serializerr	   ImportErrorexcr   r'   r)   r   r   r   <module>r      sh    	      #b7
	/n 	/tP tP/  b
W
X^aabs   
A A	AA