Skip to content

Commit d94425b

Browse files
authored
Merge pull request #25 from metacpan/mickey/suggest
Added suggest script
2 parents d10be13 + 56313bf commit d94425b

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed

bin/suggest.pl

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
use strict;
2+
use warnings;
3+
use v5.36;
4+
5+
use DateTime ();
6+
use Getopt::Long;
7+
use MetaCPAN::Logger qw< :log :dlog >;
8+
9+
use MetaCPAN::ES;
10+
11+
# args
12+
my $all;
13+
my $days = 1;
14+
GetOptions(
15+
"all" => \$all,
16+
"days=i" => \$days
17+
);
18+
19+
if ($all) {
20+
update_all();
21+
}
22+
else {
23+
update_days();
24+
}
25+
26+
log_info {"done."};
27+
28+
###
29+
30+
sub update_all () {
31+
my $dt = DateTime->new( year => 1994, month => 1 );
32+
my $end_time = DateTime->now->add( months => 1 );
33+
34+
while ( $dt < $end_time ) {
35+
my $gte = $dt->strftime("%Y-%m-%d");
36+
if ( my $d = $days ) {
37+
$dt->add( days => $d );
38+
log_info {"updating suggest data for $d days from: $gte"};
39+
}
40+
else {
41+
$dt->add( months => 1 );
42+
log_info {"updating suggest data for month: $gte"};
43+
}
44+
45+
my $lt = $dt->strftime("%Y-%m-%d");
46+
my $range = +{ range => { date => { gte => $gte, lt => $lt } } };
47+
48+
_update_slice($range);
49+
}
50+
}
51+
52+
sub update_days () {
53+
my $gte
54+
= DateTime->now()->subtract( days => $days )->strftime("%Y-%m-%d");
55+
my $range = +{ range => { date => { gte => $gte } } };
56+
57+
log_info {"updating suggest data since: $gte "};
58+
59+
_update_slice($range);
60+
}
61+
62+
sub _update_slice ($range) {
63+
my $es = MetaCPAN::ES->new( type => "file" );
64+
65+
my $files = $es->scroll(
66+
scroll => '5m',
67+
fields => [qw< id documentation >],
68+
body => {
69+
query => {
70+
bool => {
71+
must => [
72+
{ exists => { field => "documentation" } }, $range
73+
],
74+
}
75+
}
76+
},
77+
);
78+
79+
my $bulk = $es->bulk( timeout => '5m' );
80+
81+
while ( my $file = $files->next ) {
82+
my $documentation = $file->{fields}{documentation}[0];
83+
my $weight = 1000 - length($documentation);
84+
$weight = 0 if $weight < 0;
85+
86+
$bulk->update( {
87+
id => $file->{fields}{id}[0],
88+
doc => {
89+
suggest => {
90+
input => [$documentation],
91+
payload => { doc_name => $documentation },
92+
weight => $weight,
93+
}
94+
},
95+
} );
96+
}
97+
98+
$bulk->flush;
99+
}
100+
101+
__END__
102+
103+
=head1 SYNOPSIS
104+
105+
# bin/suggest [--all] [--days N]
106+
107+
=head1 DESCRIPTION
108+
109+
After importing releases from CPAN, this script will set the suggest
110+
field for autocompletion searches.

0 commit comments

Comments
 (0)