
    Xjk                       d dl mZ d dl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mZ d dlmZ d d	lmZmZmZmZmZ d d
lmZ  ee          Zh dZdZddddddddZ ej        dej                  Z ddddZ!d d dddddZ"ddddZ# ej        d          Z$ ej        d           ej        d          fZ% ed           G d d                      Z&e G d  d!                      Z' ed           G d" d#                      Z( G d$ d%          Z)dod+Z*dpd.Z+dqdrd8Z,dsdtd;Z-dud=Z.dvd@Z/dwdBZ0dxdDZ1dydGZ2dzd{dLZ3d|dNZ4d}dQZ5d~ddVZ6ddXZ7dd_Z8dd`Z9ddbZ:ddeZ;ddfZ<ddiZ=ddlZ>ddnZ?dS )    )annotationsN)Iterable)	dataclassfield)date)Any)Session	load_only)TaxDocument)&clear_duplicate_external_superseded_byis_same_legal_referencenormalize_legal_doc_numbernormalize_relation_titlerelation_identity_key)
get_logger>   	normative
regulationlocal_policy   	effectiveobsoletepartially_obsoleteamended)u   全文有效u   全文废止u   全文失效u   部分废止u   部分失效u	   已修订u   部分修订zr<p[^>]+class=["\'][^"\']*arc_date[^"\']*["\'][^>]*>.*?<span[^>]+class=["\'][^"\']*xg[^"\']*["\'][^>]*>(.*?)</span>         )amendspartially_supersedes
supersedes   )N r   r   r   r   u7   ^(?P<title>.+?)修正案(?:[（(][^）)]{1,20}[）)])?$uD   关于(?:修改|修订)[《〈](?P<title>[^》〉\n]{2,100})[》〉]ux   关于[^。\n]{0,80}修订(?:后|后的|发布|印发)?[^《〈。\n]{0,20}[《〈](?P<title>[^》〉\n]{2,100})[》〉]T)frozenc                  d    e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   ded<   dZded<   dS )RelationTargetintidstrtitle
str | None
doc_number
source_urlcategory_iddate | None
issue_datedoc_typeNsource_status)__name__
__module____qualname____annotations__r0        ^/lsinfo/ai/hellotax_ai/data_center/backend/app/services/tax_data_processor/relation_builder.pyr$   r$   #   sq         GGGJJJ $M$$$$$$r6   r$   c                  Z   e Zd ZU dZded<   dZded<   dZded<   dZded<   dZded<   dZ	ded<   dZ
ded	<   dZded
<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<    ee          Zded<   d!dZd"dZd S )#RelationBuildStatsr   r%   documents_processeddocuments_changedsupersedes_self_removedreferences_self_removed references_removed_by_supersedessupersedes_dedupedreferences_dedupedsupersedes_resolvedreferences_resolvedsupersedes_unresolvedreferences_unresolved supersedes_demoted_to_references!references_invalid_target_removed non_regulation_documents_skippedreverse_links_changedinvalid_reverse_links_clearedstatuses_changedstatus_review_neededduplicate_external_clearederrors)default_factoryz	list[str]samplesotherreturnNonec           
         | j         D ]X}|dk    r | j                            |j                   (t          | |t	          | |          t	          ||          z              Yd S )NrO   )__dataclass_fields__rO   extendsetattrgetattr)selfrP   names      r7   addzRelationBuildStats.addF   sv    - 	P 	PDy  ##EM2222dGD$$7$7'%:N:N$NOOOO		P 	Pr6   dict[str, Any]c                >      fd j         D             d j        iz  S )Nc                >    i | ]}|d k    |t          |          S )rO   )rW   ).0rY   rX   s     r7   
<dictcomp>z.RelationBuildStats.as_dict.<locals>.<dictcomp>N   s1    eeedSW[dSdSdgdD))SdSdSdr6   rO   )rT   rO   )rX   s   `r7   as_dictzRelationBuildStats.as_dictM   s=    eeeed6Oeeeirtx  uA  iB  B  	Br6   N)rP   r9   rQ   rR   )rQ   r[   )r1   r2   r3   r:   r4   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   r   listrO   rZ   r`   r5   r6   r7   r9   r9   .   s             #$$$$$#$$$$$,-$----          !"""""!""""",-$-----.%....,-$----!""""")*!**** !!!!!&'''''FOOOOt444G4444P P P PB B B B B Br6   r9   c                  8    e Zd ZU ded<   ded<   ded<   ded<   dS )	ReverseCandidater%   	source_id	target_idr'   relationr-   source_issue_dateN)r1   r2   r3   r4   r5   r6   r7   rc   rc   P   s9         NNNNNNMMM""""""r6   rc   c                      e Zd Zd!dZed"d            Zd#d$dZd%dZed&d            Z	d'd(dZ
ed)d            Zed*d             ZdS )+RelationResolverdocsIterable[TaxDocument]c                   i | _         i | _        i | _        i | _        g | _        |D ](}t          |j        |j        |j        |j	        |j
        |j        |j        t          |dd           pt          t          |dd                               }|| j         |j        <   |j	        r!|| j        |j	                                        <   |                     |j                  D ]}|                     | j        ||           t%          |j                  }|r8| j                            ||f           |                     | j        ||           *d S )Nr0   content_html)r&   r(   r*   r+   r,   r.   r/   r0   )
docs_by_idby_source_urlby_doc_numberby_titletitle_targetsr$   r&   r(   r*   r+   r,   r.   r/   rW   source_status_from_htmlstrip_doc_number_keys_add_uniquer   append)rX   rj   doctargetkey	title_keys         r7   __init__zRelationResolver.__init__Y   s   578:?A:<?A 
	C 
	CC#svSY3>fift  CF  CR  _b  _m  x{  xD  T[  \_  ap  rv  Tw  Tw  Tv  {R  SZ  [^  `n  pt  Su  Su  {v  {v  w  w  wF)/DOFI&  G@F"6#4#:#:#<#<=,,V->?? B B  !3S&AAAA0>>I C"))9f*=>>>  	6BBB
	C 
	Cr6   dbr	   rQ   c                   |                     t                                        t          t          j        t          j        t          j        t          j        t          j        t          j	        t          j
        t          j                                                t          j                                                  } | |          S N)queryr   optionsr
   r&   r(   r*   r+   r,   r.   r/   rm   order_byall)clsr}   rj   s      r7   from_dbzRelationResolver.from_dbk   s    xx$$,,Y{~{GXZeZpr}  sI  KV  Kb  do  dz  |G  |P  R]  Rj  .k  .k  l  l  u  u  vA  vD  E  E  I  I  K  Ks4yyr6   Nr*   r)   r(   r+   RelationTarget | Nonec                   |r0| j                             |                                          }|r|S |pd                                }|                    d          r,| j                            t          |                    }|r|S n8|                     |          D ]"}| j                            |          }|r|c S #t          |          }|r| j                            |          }|r|S d S )Nr!      《u   〈)ro   getrt   
startswithrq   r   ru   rp   )rX   r*   r(   r+   ry   
raw_numberrz   r{   s           r7   lookupzRelationResolver.lookupp   s    	'++J,<,<,>,>??F  &B--//
  00 	"]&&'?
'K'KLLF  ,,Z88 " "+//44 "!MMM",U33	 	]&&y11F tr6   
source_docr   c                    t          |          t                    dk     rd S fd| j        D             }|sd S |                     |          S )Nr    c                h    g | ].\  }}|j         j         k    t          |          $|v s|v ,|/S r5   )r&   is_regulation_like)r^   
target_keyry   r   r{   s      r7   
<listcomp>z<RelationResolver.lookup_containing_title.<locals>.<listcomp>   s      A  A  A!3VVYZdZgMgMgl~  @F  mG  mGMg  MV  Zd  Md  Md  hr  v  h  hf  h  h  hr6   )r   lenrr   _best_title_candidate)rX   r(   r   
candidatesr{   s     ` @r7   lookup_containing_titlez(RelationResolver.lookup_containing_title   s    ,U33	y>>A4 A  A  A  A  At7I  A  A  A
 	4))*jAAAr6   r   list[RelationTarget]r$   c                D   t          |dd           t          |dd           dfd}rXfd| D             }|r ||          }t          |d 	          S d
 | D             }|r ||          }t          |d 	          S  ||           }t          |d 	          S )Nr.   r,   poolr   rQ   c                (    fd| D             }|p| S )Nc                *    g | ]}|j         k    |S r5   )r,   )r^   ry   source_categorys     r7   r   zXRelationResolver._best_title_candidate.<locals>.prefer_same_category.<locals>.<listcomp>   s'    ```&:LP_:_:_V:_:_:_r6   r5   )r   same_categoryr   s     r7   prefer_same_categoryzDRelationResolver._best_title_candidate.<locals>.prefer_same_category   s'    ````$```M (D(r6   c                8    g | ]}|j         	|j         k    |S r5   r.   )r^   ry   source_dates     r7   r   z:RelationResolver._best_title_candidate.<locals>.<listcomp>   s0    sssFF<MsRXRcgrRrRrRrRrRrr6   c                6    | j         pt          j        | j        fS r   r.   r   minr&   ry   s    r7   <lambda>z8RelationResolver._best_title_candidate.<locals>.<lambda>       V5F5R$(TZT]4^ r6   )rz   c                     g | ]}|j         	|S r5   r   )r^   ry   s     r7   r   z:RelationResolver._best_title_candidate.<locals>.<listcomp>   s     JJJ8IJVJJJr6   c                6    | j         pt          j        | j        fS r   )r.   r   maxr&   r   s    r7   r   z8RelationResolver._best_title_candidate.<locals>.<lambda>   r   r6   c                6    | j         pt          j        | j        fS r   r   r   s    r7   r   z8RelationResolver._best_title_candidate.<locals>.<lambda>   s    V->-J$(FI,V r6   )r   r   rQ   r   )rW   r   r   )r   r   r   	not_afterr   afterr   r   s         @@r7   r   z&RelationResolver._best_title_candidate   s   j,==!*mTBB	) 	) 	) 	) 	) 	)  	`ssssjsssI `++I664%^%^____JJ*JJJE `++E224%^%^____##J//4VVWWWWr6   ry   boolc                   |r|j         |j         k    rdS |r8|j        r1|                                |j                                        k    rdS |pd                                }t          |j                  }|r,|                    d          s|rt          |          |k    rdS t          |j                  }t          |p|                    d          r|nd           }	t          |	o|o|	|k              S )NTr!   r   )	r&   r+   rt   r   r*   r   r   r(   r   )
rX   r   r*   r(   r+   ry   r   
own_number	own_title	raw_titles
             r7   is_self_referencez"RelationResolver.is_self_reference   s    	fi:=004 	*/ 	Z5E5E5G5G:K`KfKfKhKh5h5h4 &B--//
/
0EFF
 	z44^DD 	* 	)*55CCt,Z-=>>	,U-uZEZEZ[iEjEj7tzzptvv	IH)Hi1GIIIr6   set[str]c                \   | st                      S |                                 }|                    dd                              dd          }t          |          }|||h}|                    d          r*|                    |                    ddd                     d |D             S )N r!      　u   中华人民共和国主席令u	   主席令r   c                    h | ]}||S r5   r5   r^   rz   s     r7   	<setcomp>z4RelationResolver._doc_number_keys.<locals>.<setcomp>   s    +++s++++r6   )setrt   replacer   r   rZ   )r*   strippedcompact
normalizedkeyss        r7   ru   z!RelationResolver._doc_number_keys   s     	55L##%%""3++33HbAA/99
':.  !ABB 	[HHZ''(H+WXYYZZZ++t++++r6   index dict[str, RelationTarget | None]rz   r'   rR   c                |    |                      |          }||| v rd S |r|j        |j        k    rd | |<   d S || |<   d S r   )r   r&   )r   rz   ry   existings       r7   rv   zRelationResolver._add_unique   sU    99S>>uF 	vy00E#JFc


r6   )rj   rk   )r}   r	   rQ   ri   )NNN)r*   r)   r(   r)   r+   r)   rQ   r   )r(   r)   r   r   rQ   r   )r   r   r   r   rQ   r$   )NNNN)r   r   r*   r)   r(   r)   r+   r)   ry   r   rQ   r   )r*   r)   rQ   r   )r   r   rz   r'   ry   r$   rQ   rR   )r1   r2   r3   r|   classmethodr   r   r   staticmethodr   r   ru   rv   r5   r6   r7   ri   ri   W   s        C C C C$    [    ,B B B B X X X \X&J J J J J 	, 	, 	, \	,    \  r6   ri   rx   r   resolverrQ   Stuple[list[dict[str, Any]] | None, list[dict[str, Any]] | None, RelationBuildStats]c                   t          |           sd d t          dd          fS |                    | j        pd          }t	          | |          }|r!i |dg |                    d          pg |i}t          | ||          S )Nr   )r:   rG   r!   r   )r   r9   extractcontent_markdown_title_inferred_supersedesr   normalize_extracted_relations)rx   r   	extractorreltitle_supersedess        r7   build_relations_for_documentr      s    c"" kd.1ghiiijj


C06B
7
7C1#x@@ YXXl$Wsww|'<'<'B$WFV$WXX(c8<<<r6   r   r[   c           	        t          d          }t          |           sd|_        d d |fS t          |                    di                     }i }g }|                    dg           pg D ]}t          |t                    s|                    d          pd                                }|                    d          p!|                    t          |                    }	|                    d          }
|                    d	          pd}|t          vrd}|
                    ||	|
          }|                    | ||	|
|          r|xj        dz  c_        t          | ||          s8|xj        dz  c_        |                    t!          ||	||

                     :t!          ||	|||
          }t#          |          }|sat%          ||||           |r|xj        dz  c_        |xj        dz  c_        t+          |                                          }t/          |          }i }|D ]}t1          | |                    d          |          s|xj        dz  c_        7t5          |          }||z  r|xj        dz  c_        \t9          |||          r6|                    d          r|xj        dz  c_        |xj        dz  c_        |                    dg           pg D ]}|
                    |
          }|s|                    | ||          r|xj        dz  c_        Dt!          |j         pd|j!        ||
          }t1          | |                    d          |          s|xj        dz  c_        t5          |          }||z  r|xj        dz  c_        t9          |||           |xj        dz  c_        |                    dg           pg D ]s}t          |t                    s|                    d          pd                                }|                    d          p!|                    t          |                    }	|                    d          }
|
                    ||	|
          }|                    | ||	|
|          r|xj        dz  c_        t!          ||	||

          }t1          | |                    d          |          s|xj        dz  c_        t5          |          }||z  r|xj        dz  c_        >t9          |||          r$|r|xj        dz  c_        c|xj        dz  c_        ut+          |                                          }|pd |pd |fS )Nr   )r:   doc_num_to_titler   r*   r!   r(   r+   rf   r+   )rf   r+   doc_idreference_urls)r+   ry   
references)"r9   r   rG   _expand_doc_num_to_titler   
isinstancedictrt   _doc_num_title_keyRELATION_RANKr   r   r<   can_apply_legal_relationrE   rw   _relation_entry_primary_key_add_supersedes_entryrA   rC   ra   values_all_relation_keyscan_keep_referencerF   _entry_keysr>   _add_reference_entryrB   rD   r=   r*   r(   )rx   r   r   statsr   supersedes_by_keydemoted_referencesraw_itemr   r   r+   rf   ry   entryrz   r   supersedes_keysreferences_by_keyr   urlr   s                        r7   r   r      s2   1555Ec"" #12.dE""/8JB0O0OPP35/1GGL"--3 - -(D)) 	ll<006B==??
LL))a-=-A-ABTU_B`B`-a-a	\\,//
<<
++;|=((#HY
CC%%c:y*fUU 	))Q.))'VX>> 	22a722%%oj)V`j&k&k&klll
Iv]ghhh5!! 	/eUCCC 	-%%*%%%''1,''''..0011J(44O35# 1 1!#uyy':':HEE 	33q8335!!/! 	22a722 15%@@ 	1yy"" 1))Q.)))++q0++ww',,2 ' 'C00 	%%cc&%II 	))Q.)) 1 7RvZ]^^^!#uyy':':HEE 	33q8335!!/! 	22a722.u===!!Q&!!!GGL"--3 1 1(D)) 	ll<006B==??
LL))a-=-A-ABTU_B`B`-a-a	\\,//
Y
CC%%c:y*fUU 	))Q.))
Iv*UUU!#uyy':':HEE 	33q8335!!/! 	22a722 15%@@ 	1 1))Q.)))++q0++'..0011J$
 2dE::r6      Fr}   r	   
batch_sizer%   dry_runr   limitc                B   ddl m}  |            }t                              |           }t	                      }i }	|                     t                                        t          t          j	        t          j
        t          j        t          j        t          j        t          j        t          j        t          j        t          j        t          j        
  
                                      t          j                            d                                         t          j	                  }
|
                                }|rt/          ||          }d}d}||k     rt/          |||z
            }|
                    |                              |                                          }|sn|D ];}	 t7          |||          \  }}}|                    |           ||	|j	        <   t;          |j                  t;          |          k    s%t;          |j                  t;          |          k    rj|xj        dz  c_        t?          |j                   dk     r2|j         !                    d|j	         d|j
        d d                     |s||_        ||_        nI# tD          $ r<}|xj#        dz  c_#        |r |$                    d|j	         d	|            Y d }~nd }~ww xY w|dz  }=|s| %                                 |t?          |          z  }|r#|&                    d
| d| d|j                    ||k     |j'        (                                D ]}|j	        |	vrx|                     t          j                                      t          j	        |j	        k              )                                }tU          |tV                    r|nd |	|j	        <   tY          | ||	|          }|                    |           |s| %                                 |S )Nr   )RelationshipExtractorr   r   zid=z title=P   z[build_relations] doc_id=u    处理异常: u   [build_relations] 进度: /z	 changed=)r   )->app.services.tax_data_processor.parsers.relationship_extractorr   ri   r   r9   r   r   r   r
   r&   r(   r*   r+   r,   r.   r/   r   r   r   filterisnotr   countr   offsetr   r   r   rZ   _json_relation_valuer;   r   rO   rw   	ExceptionrM   warningcommitinforn   r   scalarr   ra   apply_reverse_relation_updates)r}   r   r   loggerr   r   r   r   r   relations_by_doc_idr   total	processedr   current_limitbatchrx   r   r   	doc_statsexcry   r   reverse_statss                           r7   rebuild_document_relationsr  -  s   dddddd%%''I''++H  EBDHH[!!)))KNKDUWbWmoz  pF  HS  H_  al  aw  yD  yM  OZ  Ok  mx  mC  EP  E[  +\  +\  ]  ]  d  d  ep  eA  eG  eG  HL  eM  eM  N  N  W  W  Xc  Xf  g  gEKKMME "E5!!IF
e

J	(9::V$$**=99==?? 	 	 	C]4PQTV^`i4j4j1
J			)$$$.8#CF+'77;OPZ;[;[[[_stw  uC  `D  `D  H\  ]g  Hh  Hh  `h  `h++q0++5=))B..,,-R36-R-R#)CRC.-R-RSSS" 4)3)3 ] ] ]! ]NN#[sv#[#[VY#[#[\\\] NII 	IIKKK#e** 	lKKjYjjjjQVQhjjkkk5 e

6 %,,.. ^ ^9///xx 677>>{~QWQZ?Z[[bbddH9CHd9S9S-]XXY]	*22xAT^efffM	IIm 
		Ls   7C(J  
K&*2K!!K&r  &dict[int, list[dict[str, Any]] | None]c                ^   t                      }t          ||          }|                     t                                        t          j                            d                                                     }t          |          d |	                                D             z  d |D             z  d |D             z  }|r\|                     t                                        t          j
                            |                                                    ng }d |D             }	t          |          }
|D ]k}|j
        |
v r|	                    |j                  }|rt          ||          r9|xj        dz  c_        |j        dv r|xj        dz  c_        |sd |_        l|                                D ]\  }}|	                    |          }|	                    |j                  }|r|s9|j        |j        k    r|xj        dz  c_        |s|j        |_        t)          |j        |j        |j        |j                  }|r"|xj        dz  c_        |st5          ||           t7          |j        |          }|r$||j        k    r|xj        dz  c_        |s||_        |S )Nc                    h | ]	}|j         
S r5   )rd   )r^   	candidates     r7   r   z1apply_reverse_relation_updates.<locals>.<setcomp>c  s     Z Z Z!4 Z Z Zr6   c                    h | ]	}|j         
S r5   r&   r^   rx   s     r7   r   z1apply_reverse_relation_updates.<locals>.<setcomp>c  s    ]|]|]|il^a^d]|]|]|r6   c                *    h | ]}|j         	|j         S r5   )superseded_by_doc_idr  s     r7   r   z1apply_reverse_relation_updates.<locals>.<setcomp>c  sV      @M  @M  @M  ^a  tw  tL  @M  AD  AY  @M  @M  @Mr6   c                    i | ]
}|j         |S r5   r  r  s     r7   r_   z2apply_reverse_relation_updates.<locals>.<dictcomp>e  s    ...##&#...r6   r   )r   r   r   )r9   _reverse_candidatesr   r   r   r  r   r   r   r   r&   in_r   r   rI   
doc_statusrK   itemsrd   rH   r   superseded_by_doc_numbersuperseded_by_titler*   r(   rL   r   _status_from_relationrf   rJ   )r}   r   r  r   r   r   linked_docsdoc_idsrj   rn   candidate_target_ids
target_docr   re   r  should_clear_externalproposed_statuss                    r7   r  r  _  s     E$X/BCCJ((;''..{/O/U/UVZ/[/[\\``bbK*oo Z ZjFWFWFYFY Z Z ZZ]|]|p{]|]|]||  @M  @M  ep  @M  @M  @M  MGNU]288K  ''(:(:7(C(CDDHHJJJ[]D.....Jz??! 
3 
3
=000^^J$CDD
 	2:zJJ 	++q0++ $QQQ&&!+&& 	3.2J+ * 0 0 2 2 8 8	9^^I..
^^I$788
 	 	*i.AAA''1,'' F2;2E
/ 7
8[]g]{  ~H  ~S  U_  Ue  !f  !f  	O,,1,, O6z:NNN/	0BJOO 	8*2GGG""a'"" 8(7
%Lr6   dict[int, ReverseCandidate]c                J   i }|                                 D ]
\  }}| j                            |          }|rt          |t                    s8|D ]}t          |t
                    s|                    d          }|r||k    r6| j                            |          }|                    d          pd}	|rt          |||	          s{t          |||	|j                  }
|                    |          }|r t          |
          t          |          k    r|
||<   А|S )Nr   rf   r   )rd   re   rf   rg   )
r  rn   r   r   ra   r   r   rc   r.   _candidate_sort_key)r   r  r   rd   r   sourceitemre   ry   rf   r  r   s               r7   r  r    sd   .0J!4!:!:!<!< 2 2	:$((33 	Z
D99 	 	2 	2DdD)) **I 	Y 6 6(,,Y77Fxx
++;|H !9&&(!S!S (9	\dx~  yJ  K  K  KI!~~i00H 229==@ST\@]@]]](1
9%	2 r6   r  tuple[int, date, int]c                t    t                               | j        d          | j        pt          j        | j        fS Nr   )r   r   rf   rg   r   r   rd   )r  s    r7   r&  r&    s2    i0!44i6Q6]UYU]_h_rssr6   r   c                2    t          | dd           t          v S )Nr/   )rW   REGULATION_DOC_TYPES)rx   s    r7   r   r     s    3
D))-AAAr6   
int | Nonec                    t          |           sd S t          | dd           dk    r8t          | dd           }t          |t                    rd|cxk    rdk    rn n|S t          S )Nr/   r   r,   r      )r   rW   r   r%   LOCAL_RELATION_LEVEL)rx   r,   s     r7   legal_relation_levelr2    s~    c"" tsJ%%55c=$77k3'' 	A,A,A,A,A,A,A,A,A,Ar6   rm   r)   c                   | sd S t                               |           }|sd S t          j        dd|                    d                                                    }t                                          D ]\  }}||v r|c S d S )Nz<[^>]+>r!   r   )SOURCE_STATUS_REsearchresubgrouprt   SOURCE_STATUS_MAPr  )rm   matchstatus_textlabelstatuss        r7   rs   rs     s     t##L11E t&BA77==??K*0022  vKMMM  4r6   r'  ry   
Any | Nonerf   c                p   t          |           sdS |pd}|dS t          |          sdS |dk    rYt          |dd           }|t          t          |dd                     }|dk    rdS | j        r|j        r| j        |j        k     rdS t	          |           }t	          |          }||dS ||k    rdS dS )NFr   Tr   r0   rm   r   )r   rW   rs   r.   r2  )r'  ry   rf   r0   source_leveltarget_levels         r7   r   r     s    f%% u'<H~tf%% u8>> 3GFNTX4Y4YZZMK''5 	!2 	8IFL]8]8]5'//L'//L|3ul""u4r6   re   c                z    |sdS |j                             |          }t          |ot          |                    S )NT)rn   r   r   r   )r'  re   r   ry   s       r7   r   r     sA     t $$Y//F5-f55666r6   r'   r!  c                    |j         t          vrd S t                              |           }|sd S t                              |j        d          }t                              |d          }||k    r|S d S r+  )r/   r-  STATUS_BY_RELATIONr   STATUS_RANKr  )rf   r!  proposedcurrent_rankproposed_ranks        r7   r  r    st    "666t!%%h//H t??:#8!<<LOOHa00M$$4r6   r   r   r   r+   c                r    |r|j         r|j         n| |r|j        nd |r|j        n|d}|r||d<   |r||d<   |S )N)r*   r   r(   rf   r+   )r*   r&   r(   )r   r   ry   rf   r+   r   s         r7   r   r     s    @F+l6K\+l6+<+<bl  FL  yVx~  yB  yB  RV  qw  aF  ag  am  am  }F  G  GE %$j )(lLr6   list[dict[str, Any]]c                   | j         pd                                }|sg S g }t                              |          x}r(|                    |                    d                     t          D ]4}|                    d |                    |          D                        5g }t                      }t          |          }|D ]}	t          |	          }
|
r
|
|k    s|
|v r|                    |	          p|                    |	|           }|r|j        | j        k    r]|                    |
           d|	                                 d|	                                dd}|j        r
|j        |d	<   |                    |           |S )
Nr!   r(   c              3  @   K   | ]}|                     d           V  dS )r(   N)r8  )r^   r:  s     r7   	<genexpr>z-_title_inferred_supersedes.<locals>.<genexpr>  s.      ZZG 4 4ZZZZZZr6   r(   r   u   》r   )r*   r(   rf   r+   )r(   rt   _TITLE_AMENDMENT_REr:  rw   r8  _TITLE_AMEND_PATTERNSrU   finditerr   r   r   r   r&   rZ   r+   )rx   r   r(   candidate_titlesr:  patternentriesseenown_title_keycandidate_titlenormalized_titlery   r   s                r7   r   r     s   Y_"##%%E 	"$$**5111 6G 4 4555( [ [ZZ'BRBRSXBYBYZZZZZZZ$&GUUD,U33M+  3ODD 	#3}#D#DHX\`H`H`77q8;[;[\kmp;q;q 	cf,,!"""A_%:%:%<%<AAAOLaLaLcLcqyzz 	4"("3E,uNr6   entries_by_keydict[str, dict[str, Any]]rz   r   r   rR   c                ,   |                      |          }|s|| |<   d S |xj        dz  c_        t                               |                     d          d          t                               |                     d          d          k    r|| |<   d S d S )Nr   rf   r   )r   r?   r   )rY  rz   r   r   r   s        r7   r   r     s    !!#&&H #s	!:..22]5F5Fx||T^G_G_ab5c5ccc#s dcr6   c                b    t          |          }|sdS || v r|xj        dz  c_        dS || |<   dS )NFr   T)r   r@   )rY  r   r   rz   s       r7   r   r     sO    
u

C u
n  A%  uN34r6   r   c                   t          |                     d          |                     d          |                     d          |                     d                    h}t          |                     d                    }t          |                     d                    }t          |                     d                    }|                    d	 |||fD                        d
 |D             S )Nr   r*   r(   r+   )r   r*   r(   r+   r*   rN  r   c              3     K   | ]}||V  	d S r   r5   r   s     r7   rM  z_entry_keys.<locals>.<genexpr>  s'      GG3GGGGGGGr6   c                    h | ]}||S r5   r5   r   s     r7   r   z_entry_keys.<locals>.<setcomp>  s    '''C3'C'''r6   )r   r   update)r   r   
number_keyr{   url_keys        r7   r   r     s   !8)<)<S_I`I`hmhqhqryhzhz  HM  HQ  HQ  R^  H_  H_  `  `  `  aD&%))L2I2IJJJJ%EIIg,>,>???I#uyy/F/FGGGGKKGG
Iw?GGGGGG''4''''r6   rT  Iterable[dict[str, Any]]c                p    t                      }| D ]$}|                    t          |                     %|S r   )r   ra  r   )rT  r   r   s      r7   r   r     s<    UUD ( (K&&''''Kr6   c                    t          |           }t          |                     d                    }||v r|S |rt          |          d         ndS )Nr   )r   r   r!   )r   r   r   sorted)r   r   id_keys      r7   r   r   %  sR    uD"%))H*=*=>>>F~~"*6$<<??*r6   valuelist[dict[str, Any]] | Nonec                8    t          | t                    r| r| nd S r   )r   ra   )ri  s    r7   r   r   ,  s     ud++??554?r6   mappingdict[str, str]c                    i }|                                  D ]-\  }}||t          |          <   t          |          }|r|||<   .|S r   )r  r   r   )rl  expandedr   r(   r   s        r7   r   r   /  s[    !H$]]__ ) )
E38#J//0/
;;
 	)#(HZ Or6   r*   c                Z    | pd                     dd                               dd          S )Nr!   r   r   )r   r^  s    r7   r   r   8  s-    "%%c2..66xDDDr6   )rx   r   r   ri   rQ   r   )rx   r   r   r[   r   ri   rQ   r   )r   FNr   )
r}   r	   r   r%   r   r   r   r%   rQ   r9   )F)
r}   r	   r   ri   r  r  r   r   rQ   r9   )r   ri   r  r  rQ   r$  )r  rc   rQ   r)  )rx   r   rQ   r   )rx   r   rQ   r.  )rm   r)   rQ   r)   r   )r'  r   ry   r>  rf   r)   rQ   r   )r'  r   re   r.  r   ri   rQ   r   )rf   r'   r!  r   rQ   r)   )NN)r   r'   r   r)   ry   r   rf   r)   r+   r)   rQ   r[   )rx   r   r   ri   rQ   rJ  )
rY  rZ  rz   r'   r   r[   r   r9   rQ   rR   )rY  rZ  r   r[   r   r9   rQ   r   )r   r[   rQ   r   )rT  rd  rQ   r   )r   r[   rQ   r'   )ri  r   rQ   rj  )rl  rm  rQ   rm  )r*   r)   rQ   r'   )@
__future__r   r6  collections.abcr   dataclassesr   r   datetimer   typingr   sqlalchemy.ormr	   r
   app.models.tax_datar   1app.services.tax_data_processor.relation_identityr   r   r   r   r   common_loggingr   r1   r  r-  r1  r9  compileSr4  r   rE  rD  rO  rP  r$   r9   rc   ri   r   r   r  r  r  r&  r   r2  rs   r   r   r  r   r   r   r   r   r   r   r   r   r   r5   r6   r7   <module>r|     s   " " " " " " 				 $ $ $ $ $ $ ( ( ( ( ( ( ( (             - - - - - - - - + + + + + +              & % % % % %	H		BBB  %0*^h  {O  au  DM  _h  i  i 2:  c  eg  ei  j  j aqIIAA!STbcdd )CWgqrr  bj!Z[[ #$kllnxnpnx  zw  ox  ox  y 
$% % % % % % % % B B B B B B B BB $# # # # # # # #n n n n n n n n`= = = =[; [; [; [;z0 0 0 0 0d& & & & &P   ,t t t tB B B B       
 
 
 
    07 7 7 7
 
 
 
       4$ $ $ $   ( ( ( (   + + + +@ @ @ @   E E E E E Er6   