|
1 | 1 | use Mojolicious::Lite;
|
2 | 2 |
|
3 | 3 | use Mojo::Pg;
|
4 |
| -use List::Util qw(first); |
| 4 | +use List::Util qw( first ); |
5 | 5 |
|
6 |
| -my $user = getpwuid($<); # for vagrant user on dev box |
| 6 | +my $user = getpwuid($<); # for vagrant user on dev box |
7 | 7 |
|
8 | 8 | # carton exec /opt/perl-5.22.2/bin/perl ./app.pl daemon -m production -l http://*:5000
|
9 | 9 |
|
|
12 | 12 | app->pg->auto_migrate(1)->migrations->from_data;
|
13 | 13 |
|
14 | 14 | helper insert_search => sub {
|
15 |
| - my ($c, $search, $expect) = @_; |
16 |
| - return !!$c->pg->db->query(<<' SQL', $search, $expect)->rows; |
| 15 | + my ( $c, $search, $expect ) = @_; |
| 16 | + return !!$c->pg->db->query( <<' SQL', $search, $expect )->rows; |
17 | 17 | insert into searches (search, expect) values (?, ?)
|
18 | 18 | SQL
|
19 | 19 | };
|
20 | 20 |
|
21 | 21 | helper insert_source => sub {
|
22 |
| - my ($c, $name, $query) = @_; |
23 |
| - return !!$c->pg->db->query(<<' SQL', $name, $query)->rows; |
| 22 | + my ( $c, $name, $query ) = @_; |
| 23 | + return !!$c->pg->db->query( <<' SQL', $name, $query )->rows; |
24 | 24 | insert into sources (name, query) values (?, ?, ?)
|
25 | 25 | SQL
|
26 | 26 | };
|
27 | 27 |
|
28 | 28 | helper get_results => sub {
|
29 |
| - my $c = shift; |
30 |
| - return $c->pg->db->query(<<' SQL')->expand->hash->{results}; |
| 29 | + my $c = shift; |
| 30 | + return $c->pg->db->query(<<' SQL')->expand->hash->{results}; |
31 | 31 | select json_object_agg(search, results) as results
|
32 | 32 | from (
|
33 | 33 | select
|
|
42 | 42 | };
|
43 | 43 |
|
44 | 44 | helper perform_all_searches => sub {
|
45 |
| - my ($c) = @_; |
46 |
| - my $queries = $c->pg->db->query(<<' SQL'); |
| 45 | + my ($c) = @_; |
| 46 | + my $queries = $c->pg->db->query(<<' SQL'); |
47 | 47 | select
|
48 | 48 | searches.id as search_id,
|
49 | 49 | sources.id as source_id,
|
|
56 | 56 | left join results on searches.id = results.search_id
|
57 | 57 | and sources.id = results.source_id
|
58 | 58 | SQL
|
59 |
| - my $db = $c->pg->db; |
60 |
| - my $sql = 'insert into results (search_id, source_id, rank) values (?, ?, ?)'; |
61 |
| - $queries->hashes->each(sub{ |
62 |
| - my $query = shift; |
63 |
| - return if $query->{rank}; |
64 |
| - my $rank = $c->perform_one_search(@{$query}{qw/search expect name query/}); |
65 |
| - $db->query($sql, @{$query}{qw/search_id source_id/}, $rank); |
66 |
| - }); |
| 59 | + my $db = $c->pg->db; |
| 60 | + my $sql |
| 61 | + = 'insert into results (search_id, source_id, rank) values (?, ?, ?)'; |
| 62 | + $queries->hashes->each( sub { |
| 63 | + my $query = shift; |
| 64 | + return if $query->{rank}; |
| 65 | + my $rank = $c->perform_one_search( |
| 66 | + @{$query}{qw/search expect name query/} ); |
| 67 | + $db->query( $sql, @{$query}{qw/search_id source_id/}, $rank ); |
| 68 | + } ); |
67 | 69 | };
|
68 | 70 |
|
69 | 71 | helper perform_one_search => sub {
|
70 |
| - my ($c, $search, $expect, $name, $query) = @_; |
| 72 | + my ( $c, $search, $expect, $name, $query ) = @_; |
71 | 73 |
|
72 |
| - my $rank = |
73 |
| - $name eq 'SCO' ? _perform_sco($c, $search, $expect) : |
74 |
| - $name eq 'MWEB' ? _perform_mweb($c, $search, $expect) : |
75 |
| - _perform_mquery($c, $search, $expect, $query); |
| 74 | + my $rank |
| 75 | + = $name eq 'SCO' ? _perform_sco( $c, $search, $expect ) |
| 76 | + : $name eq 'MWEB' ? _perform_mweb( $c, $search, $expect ) |
| 77 | + : _perform_mquery( $c, $search, $expect, $query ); |
76 | 78 |
|
77 |
| - return $rank // 100; |
| 79 | + return $rank // 100; |
78 | 80 | };
|
79 | 81 |
|
80 | 82 | sub _perform_sco {
|
81 |
| - my ($c, $search, $expect) = @_; |
82 |
| - my $url = Mojo::URL->new('http://search.cpan.org/search?mode=all&n=100'); |
83 |
| - $url->query([query => $search]); |
84 |
| - my $tx = $c->app->ua->get($url); |
85 |
| - my $res = $tx->res->dom->find('.sr')->map('all_text')->to_array; |
86 |
| - my $idx = first { $res->[$_] eq $expect } @{$res->to_array}; |
87 |
| - return $idx < 0 ? undef : $idx + 1; |
| 83 | + my ( $c, $search, $expect ) = @_; |
| 84 | + my $url = Mojo::URL->new('http://search.cpan.org/search?mode=all&n=100'); |
| 85 | + $url->query( [ query => $search ] ); |
| 86 | + my $tx = $c->app->ua->get($url); |
| 87 | + my $res = $tx->res->dom->find('.sr')->map('all_text')->to_array; |
| 88 | + my $idx = first { $res->[$_] eq $expect } @{ $res->to_array }; |
| 89 | + return $idx < 0 ? undef : $idx + 1; |
88 | 90 | }
|
89 | 91 |
|
90 | 92 | sub _perform_mweb {
|
91 |
| - my ($c, $search, $expect) = @_; |
92 |
| - my $url = Mojo::URL->new('https://metacpan.org/search?size=100'); |
93 |
| - $url->query([q => $search]); |
94 |
| - my $tx = $c->app->ua->get($url); |
95 |
| - my $res = $tx->res->dom->find('.module-result big strong a')->map('all_text')->to_array; |
96 |
| - my $idx = first { $res->[$_] eq $expect } 0 .. $#{$res}; |
97 |
| - return $idx < 0 ? undef : $idx + 1; |
| 93 | + my ( $c, $search, $expect ) = @_; |
| 94 | + my $url = Mojo::URL->new('https://metacpan.org/search?size=100'); |
| 95 | + $url->query( [ q => $search ] ); |
| 96 | + my $tx = $c->app->ua->get($url); |
| 97 | + my $res |
| 98 | + = $tx->res->dom->find('.module-result big strong a')->map('all_text') |
| 99 | + ->to_array; |
| 100 | + my $idx = first { $res->[$_] eq $expect } 0 .. $#{$res}; |
| 101 | + return $idx < 0 ? undef : $idx + 1; |
98 | 102 | }
|
99 | 103 |
|
100 |
| -sub _perform_mquery {} |
| 104 | +sub _perform_mquery { } |
101 | 105 |
|
102 | 106 | get '/' => 'index';
|
103 | 107 |
|
104 | 108 | get '/results' => sub {
|
105 |
| - my $c = shift; |
106 |
| - $c->render(json => $c->get_results); |
| 109 | + my $c = shift; |
| 110 | + $c->render( json => $c->get_results ); |
107 | 111 | };
|
108 | 112 |
|
109 | 113 | app->start;
|
|
0 commit comments