source: server/trunk/web/lib/Sophie/Controller/Search/Rpm.pm @ 270

Last change on this file since 270 was 270, checked in by nanardon, 14 years ago
  • readd whatis command
File size: 10.0 KB
Line 
1package Sophie::Controller::Search::Rpm;
2use Moose;
3use namespace::autoclean;
4
5BEGIN {extends 'Catalyst::Controller'; }
6
7=head1 NAME
8
9Sophie::Controller::Search::Rpm - Catalyst Controller
10
11=head1 DESCRIPTION
12
13Catalyst Controller.
14
15=head1 METHODS
16
17=cut
18
19
20=head2 index
21
22=cut
23
24sub index :Path :Args(0) {
25    my ( $self, $c ) = @_;
26
27    $c->response->body('Matched Sophie::Controller::Search::Rpm in Search::Rpm.');
28}
29
30sub bypkgid : Private {
31    my ( $self, $c, $searchspec, $pkgid ) = @_;
32   
33    $c->stash->{xmlrpc} = [
34        $c->forward('/search/bypkgid_rs', [ $searchspec, $pkgid ])
35        ->get_column('pkgid')->all
36    ];
37}
38
39sub bypkgid_rpc : XMLRPCPath('bypkgid') {
40    my ( $self, $c, $searchspec, $pkgid ) = @_;
41   
42    $c->stash->{rs} = $c->forward('/search/bypkgid_rs', [ $searchspec, $pkgid ]);
43    #$c->forward('/search/format_search', $searchspec);
44}
45
46sub byname : Private {
47    my ( $self, $c, $searchspec, $name, $sense, $evr ) = @_;
48    $c->stash->{xmlrpc} = [
49        $c->forward('/search/byname_rs', [ $searchspec, $name, $sense, $evr ])
50        ->get_column('pkgid')->all
51    ];
52}
53
54=head2 search.rpm.byname (SEARCHSPEC, NAME, [SENSE, EVR])
55
56Search package by its NAME. SENSE and EVR are optional version filter where
57SENSE is dependency sign (C<E<gt>>, C<=>, ...) and EVR the search version as
58either C<VERSION>, C<VERSION-RELEASE> or C<EPOCH:VERSION-RELEASE>.
59
60SEARCHSPEC is a struct with search options.
61
62=cut
63
64sub byname_rpc : XMLRPCPath('byname') {
65    my ( $self, $c, $searchspec, $name, $sense, $evr ) = @_;
66    $c->stash->{rs} =
67        $c->forward('/search/byname_rs', [ $searchspec, $name, $sense, $evr ]);
68}
69
70sub bytag : Private {
71    my ( $self, $c, $searchspec, $tagname, $value ) = @_;
72   
73    $c->stash->{xmlrpc} = [
74        $c->forward('/search/bytag_rs', [ $searchspec, $tagname, $value ])
75        ->get_column('pkgid')->all
76    ];
77}
78
79sub bytag_rpc : XMLRPCPath('bytag') {
80    my ( $self, $c, $searchspec, $tagname, $value ) = @_;
81   
82    $c->stash->{rs} = $c->forward('/search/bytag_rs', [ $searchspec, $tagname, $value ]);
83    #$c->forward('/search/format_search', $searchspec);
84}
85
86sub bydep : Private {
87    my ( $self, $c, $searchspec, $deptype, $depname, $depsense, $depevr ) = @_;
88    $searchspec ||= {};
89
90    $c->stash->{xmlrpc} = [ $c->forward('bydep_rpc', [ 
91                $searchspec, $deptype, $depname, $depsense, $depevr ]
92    )->get_column('pkgid')->all ];
93}
94
95sub bydep_rpc : XMLRPCPath('bydep') {
96    my ( $self, $c, $searchspec, $deptype, $depname, $depsense, $depevr ) = @_;
97    $searchspec ||= {};
98
99    my $distrs = $c->forward('/search/distrib_search', [ $searchspec, 1 ]);
100
101    my $deprs = $c->forward(
102        '/search/deps_rs', [ 
103            $searchspec, $deptype, $depname,
104            $depsense, $depevr 
105        ],
106    )->get_column('pkgid');
107    $c->stash->{rs} = $c->model('Base::Rpms')->search(
108        {
109            pkgid => 
110                { IN => $deprs->as_query, },
111        },
112        {
113            order_by => [ 'name', 'evr using >>', 'issrc', 'arch' ],
114        }
115    );
116}
117
118sub byfile : Private {
119    my ( $self, $c, $searchspec, $file) = @_;
120    $searchspec ||= {};
121    $c->stash->{xmlrpc} = [ 
122        $c->forward(
123            'byfile_rpc', [ $searchspec, $file ]
124        )->get_column('pkgid')->all
125    ];
126}
127
128sub byfile_rpc : XMLRPCPath('byfile') {
129    my ( $self, $c, $searchspec, $file) = @_;
130    $searchspec ||= {};
131    my $distrs = $c->forward('/search/distrib_search', [ $searchspec, 1 ]);
132
133    my $filers = $c->forward('/search/file_rs', [ $searchspec, $file ])
134        ->get_column('pkgid');
135    $c->stash->{rs} = $c->model('Base::Rpms')->search(
136        {
137            pkgid => { IN => $filers->as_query, },
138        },
139        {
140            order_by => [ 'name', 'evr using >>', 'issrc', 'arch' ],
141        }
142    );
143}
144
145sub fuzzy : Private {
146    my ($self, $c, $searchspec, $name) = @_;
147    $c->forward('fuzzy_rpc', [ $searchspec, $name ]);
148    $c->stash->{xmlrpc} = 
149        [ $c->stash->{rs}->get_column('pkgid')->all ];
150}
151
152sub fuzzy_rpc : XMLRPCPath('fuzzy') {
153    my ($self, $c, $searchspec, $name) = @_;
154    $searchspec ||= {};
155
156    # my $deprs = $c->model('Base')->resultset('Deps')->search(
157    #    { deptype => 'P', depname => { '~*' => $name } }
158    # )->get_column('pkgid');
159    my $distrs = $c->forward('/search/distrib_search', [ $searchspec, 1 ]);
160
161    $c->stash->{rs} = 
162
163        $c->model('Base')->resultset('Rpms')->search(
164        {
165            -and => [
166                (exists($searchspec->{src})
167                    ? { issrc => $searchspec->{src} ? 1 : 0 }
168                    : ()),
169                { -or => [
170                    { name => 
171                        { '~*' => $name, },
172                    },
173#                    { pkgid =>
174#                        { IN => $deprs->as_query, },
175#                    },
176                     ]
177                },
178                $distrs
179                    ? { pkgid => { IN => $distrs->get_column('pkgid')->as_query, }, }
180                    : (),
181            ]     
182        },
183    );
184}
185
186sub quick : XMLRPCPath('quick') {
187    my ($self, $c, $searchspec, @keywords) = @_;
188    $searchspec ||= {};
189    my $tsquery = join(' & ', map { $_ =~ s/ /\\ /g; $_ } @keywords);
190   
191    my $distrs = $c->forward('/search/distrib_search', [ $searchspec, 1 ]);
192
193    $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search(
194            {
195                -or => [
196#                    { -nest => \[
197#                        "to_tsvector('english', description) @@ to_tsquery(?)",
198#                        [ plain_text => $tsquery],
199#                    ], },
200                    {
201                    name => { '~*' => [ @keywords ] },
202                    },
203                ],
204            (exists($searchspec->{src})
205                ? (issrc => $searchspec->{src} ? 1 : 0)
206                : ()),
207            ($distrs 
208                ? (pkgid => { IN => $distrs->get_column('pkgid')->as_query, },)
209                : ()),
210        },
211    );
212}
213
214sub description : Private {
215    my ($self, $c, $searchspec, @keywords) = @_;
216    return [ $c->forward('description_rpc')->get_column('pkgid')->all ];
217}
218
219sub description_rpc : XMLRPCPath('description') {
220    my ($self, $c, $searchspec, @keywords) = @_;
221    $searchspec ||= {};
222    my $tsquery = join(' & ', map { $_ =~ s/ /\\ /g; $_ } @keywords);
223    my $distrs = $c->forward('/search/distrib_search', [ $searchspec, 1 ]);
224    $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search(
225        {
226            -nest => \[
227                    "to_tsvector('english', description) @@ to_tsquery(?)",
228                    [ plain_text => $tsquery],
229                ],
230                (exists($searchspec->{src})
231                    ? (issrc => $searchspec->{src} ? 1 : 0)
232                    : ()),
233                ($distrs 
234                    ? (pkgid => { IN => $distrs->get_column('pkgid')->as_query, },)
235                    : ()),
236        },
237        {
238            select => [ 
239                "ts_rank_cd(to_tsvector('english', description),to_tsquery(?)) as rank",
240                'pkgid'
241            ],
242            bind => [ $tsquery ], 
243            order_by => [ 'rank desc', 'name', 'evr using >>', 'issrc' ],
244        },
245    )->as_subselect_rs;
246}
247
248sub sources : XMLRPCPath('sources') {
249    my ( $self, $c, $searchspec, $pkgid ) = @_;
250
251    my $distrs = $c->forward('/search/distrib_search', [ $searchspec, 1 ]);
252    my $sourcerpm = $c->forward('/rpms/queryformat', [ $pkgid, '%{SOURCERPM}' ]);
253    my $nosourcerpm = $sourcerpm;
254    $nosourcerpm =~ s/\.src.rpm$/\.nosrc.rpm/;
255
256    $c->stash->{rs} = $c->model('Base::Rpms')->search(
257        {
258            -and => [
259                { pkgid => {
260                    IN => $c->model('Base::RpmFile')->search(
261                        { filename => [ $sourcerpm, $nosourcerpm ] }
262                    )->get_column('pkgid')->as_query
263                }, },
264                ($distrs 
265                    ? ({ pkgid => { IN => $distrs->get_column('pkgid')->as_query, }, },)
266                    : ()),
267            ],
268        }
269    );
270}
271
272sub binaries : XMLRPCPath('binaries') {
273    my ( $self, $c, $searchspec, $pkgid ) = @_;
274
275    my $distrs = $c->forward('/search/distrib_search', [ $searchspec, 1 ]);
276    my $sourcerpm = $c->forward('/rpms/queryformat', [ $pkgid,
277            '%{NAME}-%{VERSION}-%{RELEASE}.src.rpm' ]);
278    my $nosourcerpm = $sourcerpm;
279    $nosourcerpm =~ s/\.src.rpm$/\.nosrc.rpm/;
280
281    my $tagrs = $c->model('Base')->resultset('Tags')
282        ->search({ tagname => 'sourcerpm', value => [ $sourcerpm, $nosourcerpm ] })
283        ->get_column('pkgid');
284    $c->stash->{rs} = $c->model('Base::Rpms')->search(
285        {
286            -and => [
287                { issrc => 0 },
288                { pkgid =>
289                    { IN => $tagrs->as_query, },
290                },
291                ($distrs 
292                    ? ({ pkgid => { IN => $distrs->get_column('pkgid')->as_query, }, })
293                    : ()),
294            ]
295        },
296        {
297            order_by => [ qw(arch name), 'evr using >>' ],
298        },
299    );
300}
301
302sub end : Private {
303    my ( $self, $c, $searchspec ) = @_;
304    $searchspec ||= {};
305    $c->stash->{rs} or return;
306
307    my $rs = $c->stash->{rs}->search(
308        {},
309        {
310            page => $searchspec->{page} || 
311                 $c->req->param('page') || 1,
312            rows => $searchspec->{rows} || 
313                 $c->req->param('rows') || 10,
314        },
315    );
316
317    $c->stash->{rs} = $rs;
318    my @results = $rs->get_column('pkgid')->all;
319   
320    $c->stash->{xmlrpc} = {};
321    if (!$searchspec->{nopager}) {
322        my $pager = $c->stash->{rs}->pager;
323        $c->stash->{pager} = $pager;
324        $c->stash->{xmlrpc} = {
325                pages => $pager->last_page,
326                current_page => $pager->current_page,
327                total_entries => $pager->total_entries,
328                entries_per_page => $pager->entries_per_page,
329        };
330    }
331    $c->stash->{xmlrpc}{results} = \@results;
332
333    #$c->forward('/end');
334}
335
336
337=head1 AUTHOR
338
339Olivier Thauvin
340
341=head1 LICENSE
342
343This library is free software. You can redistribute it and/or modify
344it under the same terms as Perl itself.
345
346=cut
347
348__PACKAGE__->meta->make_immutable;
349
3501;
Note: See TracBrowser for help on using the repository browser.