
    Y*i:                        d Z ddlZddlmZ dej
                  fdZdeeej
                  f   dej
                  fdZ	dej
                  d	edej
                  fd
Z
dedee   dej
                  fdZdedeeej
                  f   dej
                  fdZdedeeej
                  f   dej
                  fdZdeeej
                  f   d	edej
                  fdZdedeeej
                  f   dej
                  dej
                  fdZy)z
DiploAI Knowledge Graph - Link Builder (Phase 2b)

Hybrid model:
  Sloj A (from WordPress): Toolset, taxonomy->topic, SUBTOPIC_OF, TAGGED_WITH, PUBLISHED_ON
    N)WPExtractorreturnc                  2    t        j                  g d      S )N)	source_idsource_name	target_idtarget_namelinkmeta)columns)pd	DataFrame     link_builder.py_empty_linksr      s    << !@ A Ar   
nodes_dictc                     | j                         D cg c]  }|j                  r| }}|st        j                         S t        j                  |d      S c c}w )z1Combine all node DataFrames into one for lookups.Tignore_index)valuesemptyr   r   concat)r   dfdfss      r   _combine_nodesr      sL    "))+
<+"2882+C
<||~99St,, =s
   AAdf_topics_rawsite_prefixc                        d   dk7     j                         }|j                  r
t               S  fd}t        j                         }|dz   |d   j                  t              z   |d<   |d   j                         |d<   |dz   |d   j                  t              j                  t              z   |d	<   |d   j                  |      j                         |d
<   d|d<   d |d<   t        d| dt        |              |S )Nparentr   c                 \    d   | k(     }|j                   s|d   j                         S dS )Nterm_idname )r   item)tidmatchr   s     r   _topic_namez)build_subtopic_links.<locals>._topic_name$   s5    mI6#=>+0;;uV}!!#>B>r   _topic_r"   r   r#   r   r   r	   SUBTOPIC_OFr
   r   [z] SUBTOPIC_OF: )copyr   r   r   r   astypestrtolistintapplyprintlen)r   r   childrenr(   r   s   `    r   build_subtopic_linksr5      s    ]849:??AH~~~? 
B!I-0C0J0J30OOB{O (//1B}!I-0B0I0I#0N0U0UVY0ZZB{O *00=DDFB}BvJBvJ	Ak]/#b'
34Ir   	extractorwp_idsc                 X   | j                   }| j                  |      \  }}g }||fD ]  }|j                  rt        j                         }|dz   |d   z   dz   |d   j                  t              z   |d<   |d   |d<   |dz   |d   z   dz   |d   j                  t              z   |d	<   |d
   |d<   |d   j                  d       |d<   d |d<   |j                  |        |s
t               S t        j                  |d      j                         }t        d| dt        |              |S )N_parent_typeparent_wp_idr   parent_titler   
child_typechild_wp_idr   child_titler	   relationship_namec                 B    | j                         j                  dd      S )N r9   )upperreplacexs    r   <lambda>z%build_toolset_links.<locals>.<lambda>F   s    !'')BSBSTWY\B]r   r
   r   Tr   r+   z] Toolset links: )r   get_toolset_relationsr   r   r   r-   r.   r1   appendr   r   drop_duplicatesr2   r3   )	r6   r7   prefixdf_child	df_parentframesdf_rawlnkresults	            r   build_toolset_linksrR   8   sD   ""F#99&AHiFY'<<lln!C<&*??#E~H^HeHefiHjjK#N3M!C<&*>>DvmG\GcGcdgGhhK#M2M01778]^FFc ( ~YYvD1AACF	AfX&s6{m
45Mr   c           
         | j                   }t        |      }|j                  r
t               S t	        |ddg   j
                        }g }| j                  D ](  }| j                  |      }|j                  r"||d<   |dz   |d   z   dz   |d   j                  t              z   |d<   t        j                         }|d   j                         |d<   |d   j                         |d	<   |d
   j                         |d<   |j                         D 	
cg c]/  \  }	}
d|
d   j                          d|
d   j                          1 c}
}	|d<   |d   j                  |      |d<   |g d   }d |d<   |j!                  |       + |s
t               S t        j"                  |d      }t%        d| dt'        |              |S c c}
}	w )Nr#   node_id	post_typer9   IDsrc_idr   
post_titler   taxonomy_namer	   RELATED_z_&_taxonomy_typer
   r   )r   r   r   r	   r
   r   Tr   r+   z] Post-Topic links: )r   r   r   r   dictr   include_post_typesget_post_topic_linksr-   r.   r   r   r/   iterrowsrC   maprI   r   r2   r3   )r6   r   rK   combined
name_to_idrN   ptrawrP   r9   rrQ   s               r   build_post_topic_linksrf   V   s   ""Fj)H~~~h	23::;JF**,,R099Ks;'77#=D	@P@PQT@UUHllnx=//1K .557M 188:M 
&1 q~++-.c!O2D2J2J2L1MN&
F }-11*=KRSFc% +( ~YYvD1F	AfX)#f+
78M
s   4Gc                    | j                   }t        |      }|j                  r
t               S ||d   j	                  d           }|j                  r
t               S |d   j                  t              j                         }| j                  |      }|j                  r
t               S t        t        |d   j                  t              |d               }||d   j	                  d          }t        t        |d   j                  t              |d               }	t        j                         }
|d   j                  t              j                  |      |
d<   d |
d<   |d	   j                  t              j                  |	      |
d
<   |d   j                         |
d<   d|
d<   d |
d<   |
j                  dd
gd       t!        d| dt#        |
              |
S )Nlabelsc                     | dgk(  xs | dgk(  S )NTagDater   rE   s    r   rG   z)build_tagged_with_links.<locals>.<lambda>   s    A%L<YARXQYM<Yr   wp_idrT   c                     | dgk(  S )Nrj   r   rE   s    r   rG   z)build_tagged_with_links.<locals>.<lambda>   s
    A%Lr   post_idr   r   r"   r   tag_namer	   TAGGED_WITHr
   r   T)subsetinplacer+   z] TAGGED_WITH: )r   r   r   r   r1   r-   r0   r/   get_post_tag_linksr\   zipr.   r   r   r`   dropnar2   r3   )r6   r   rK   ra   non_metapost_idsrd   wpid_to_nodeid	tag_nodestag_to_nodeidr   s              r   build_tagged_with_linksr{      s   ""Fj)H~~~(+112YZZ[H~~~ '',335H

&
&x
0C
yy~#hw/66s;Xi=PQRN(+112HIJIYw/66s;Yy=QRSM	B)n++C044^DB{OB})n++C044]CB{OJ..0B}BvJBvJIIk;/I>	AfX_SWI
./Ir   c                    | j                  dt        j                               }|j                  sd|j                  vr
t               S t        j                  |d   d      }|j                         }|j                         s
t               S ||   j                         }||   j                  j                  d      j                  t              }t        j                         }|d   j                         |d<   |d   j                         |d	<   |d
z   |z   j                         |d<   ||   j                  j                  d      j                         |d<   d|d<   d |d<   t!        d| dt#        |              |S )Npostsdatecoerce)errorsMrT   r   r#   r   _date_r   z%B %Yr	   PUBLISHED_ONr
   r   r+   z] PUBLISHED_ON: )getr   r   r   r   r   to_datetimenotnaanyr,   dt	to_periodr-   r.   r/   strftimer2   r3   )r   r   r}   datesvaliddocsymr   s           r   build_published_on_linksr      sB   NN7BLLN3E{{fEMM1~NN5=:EKKME99;~<D	u	"	"3	'	.	.s	3B	B9o,,.B{OV++-B}"X-2::<B{Oe009@@BB}BvJBvJ	Ak]*3r7)
45Ir   c                    | j                   }t        |      }||d   j                  d          d   j                  t              j                         }t        ||      }t        | |      }t        | |      }t        | |      }	t        ||      }
t        j                  ||||	|
gd      }|j                  d       t        d| dt        |              |S )Nrl   c                 4    t        |       j                         S )N)r.   isdigitrE   s    r   rG   z!build_all_links.<locals>.<lambda>   s    A8Hr   Tr   )rr   r+   z] TOTAL links: )r   r   r1   r-   r0   r/   r5   rR   rf   r{   r   r   r   rJ   r2   r3   )r6   r   r   rK   ra   r7   subtopictoolset
post_topictagged	publisheddf_linkss               r   build_all_linksr      s     ""Fj)Hhw'--.HIJ7SZZ[^_ffhF#M6:H!)V4G'	:>J$Y
;F(V<Iyy(GZKZ^_HT*	AfX_S]O
45Or   )__doc__pandasr   wp_extractorr   r   r   r\   r.   r   r5   listr0   rR   rf   r{   r   r   r   r   r   <module>r      sW    $Abll A
-tC$56 -2<< - &).0ll4;  $S	.0ll<#k #'+C,='>#CE<<#T{ (,S",,->(?DFLLJc2<<.?)@ *-24,,<{  $S",,%6 7#%<<46LLr   