@@ -559,5 +559,121 @@ sub documented_modules {
559559 };
560560}
561561
562+ sub find_module {
563+ my ( $self , $module , $fields ) = @_ ;
564+
565+ my $query = {
566+ bool => {
567+ must => [
568+ { term => { indexed => true } },
569+ { term => { authorized => true } },
570+ { term => { status => ' latest' } },
571+ {
572+ bool => {
573+ should => [
574+ { term => { documentation => $module } },
575+ {
576+ nested => {
577+ path => " module" ,
578+ query => {
579+ bool => {
580+ must => [
581+ {
582+ term => { " module.name" =>
583+ $module }
584+ },
585+ {
586+ bool => { should =>
587+ [
588+ { term =>
589+ { " module.authorized"
590+ => true
591+ } },
592+ { exists =>
593+ { field =>
594+ ' module.associated_pod'
595+ } },
596+ ],
597+ }
598+ },
599+ ],
600+ },
601+ },
602+ }
603+ },
604+ ]
605+ }
606+ },
607+ ],
608+ },
609+ };
610+
611+ my $res = $self -> es-> search(
612+ es_doc_path(' file' ),
613+ search_type => ' dfs_query_then_fetch' ,
614+ body => {
615+ query => $query ,
616+ sort => [
617+ ' _score' ,
618+ { ' version_numified' => { order => ' desc' } },
619+ { ' date' => { order => ' desc' } },
620+ { ' mime' => { order => ' asc' } },
621+ { ' stat.mtime' => { order => ' desc' } }
622+ ],
623+ _source => [
624+ qw( documentation module.indexed module.authoried module.name )
625+ ],
626+ size => 100,
627+ },
628+ );
629+
630+ my @candidates = @{ $res -> {hits }{hits } };
631+
632+ my ($file ) = grep {
633+ grep { $_ -> {indexed } && $_ -> {authorized } && $_ -> {name } eq $module }
634+ @{ $_ -> {module } || [] }
635+ } grep { !$_ -> {documentation } || $_ -> {documentation } eq $module }
636+ @candidates ;
637+
638+ $file ||= shift @candidates ;
639+ return undef
640+ if !$file ;
641+ return $self -> es-> get_source( es_doc_path(' file' ), $file -> {_id },
642+ ( $fields ? _source => $fields : () ),
643+ );
644+ }
645+
646+ sub find_pod {
647+ my ( $self , $name ) = @_ ;
648+ my $file = $self -> find_module($name );
649+ return $file
650+ unless $file ;
651+ my ($module )
652+ = grep { $_ -> {indexed } && $_ -> {authorized } && $_ -> {name } eq $name }
653+ @{ $file -> {module } || [] };
654+ if ( $module && ( my $pod = $module -> {associated_pod } ) ) {
655+ my ( $author , $release , @path ) = split ( / \/ / , $pod );
656+ my $query = {
657+ bool => {
658+ must => [
659+ { term => { author => $author } },
660+ { term => { release => $release } },
661+ { term => { path => join ( ' /' , @path ) } },
662+ ],
663+ },
664+ };
665+ my $pod_file = $self -> es-> search(
666+ es_doc_path(' file' ),
667+ body => {
668+ query => $query ,
669+ },
670+ );
671+ return $pod_file -> {hits }{hits }[0];
672+ }
673+ else {
674+ return $file ;
675+ }
676+ }
677+
562678__PACKAGE__ -> meta-> make_immutable;
5636791;
0 commit comments