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

Last change on this file since 284 was 284, checked in by nanardon, 13 years ago
  • limit result in solver
  • show only resolved dependencies
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            rows => $searchspec->{rows},
115        }
116    );
117}
118
119sub byfile : Private {
120    my ( $self, $c, $searchspec, $file) = @_;
121    $searchspec ||= {};
122    $c->stash->{xmlrpc} = [ 
123        $c->forward(
124            'byfile_rpc', [ $searchspec, $file ]
125        )->get_column('pkgid')->all
126    ];
127}
128
129sub byfile_rpc : XMLRPCPath('byfile') {
130    my ( $self, $c, $searchspec, $file) = @_;
131    $searchspec ||= {};
132    my $distrs = $c->forward('/search/distrib_search', [ $searchspec, 1 ]);
133
134    my $filers = $c->forward('/search/file_rs', [ $searchspec, $file ])
135        ->get_column('pkgid');
136    $c->stash->{rs} = $c->model('Base::Rpms')->search(
137        {
138            pkgid => { IN => $filers->as_query, },
139        },
140        {
141            order_by => [ 'name', 'evr using >>', 'issrc', 'arch' ],
142        }
143    );
144}
145
146sub fuzzy : Private {
147    my ($self, $c, $searchspec, $name) = @_;
148    $c->forward('fuzzy_rpc', [ $searchspec, $name ]);
149    $c->stash->{xmlrpc} = 
150        [ $c->stash->{rs}->get_column('pkgid')->all ];
151}
152
153sub fuzzy_rpc : XMLRPCPath('fuzzy') {
154    my ($self, $c, $searchspec, $name) = @_;
155    $searchspec ||= {};
156
157    # my $deprs = $c->model('Base')->resultset('Deps')->search(
158    #    { deptype => 'P', depname => { '~*' => $name } }
159    # )->get_column('pkgid');
160    my $distrs = $c->forward('/search/distrib_search', [ $searchspec, 1 ]);
161
162    $c->stash->{rs} = 
163
164        $c->model('Base')->resultset('Rpms')->search(
165        {
166            -and => [
167                (exists($searchspec->{src})
168                    ? { issrc => $searchspec->{src} ? 1 : 0 }
169                    : ()),
170                { -or => [
171                    { name => 
172                        { '~*' => $name, },
173                    },
174#                    { pkgid =>
175#                        { IN => $deprs->as_query, },
176#                    },
177                     ]
178                },
179                $distrs
180                    ? { pkgid => { IN => $distrs->get_column('pkgid')->as_query, }, }
181                    : (),
182            ]     
183        },
184    );
185}
186
187sub quick : XMLRPCPath('quick') {
188    my ($self, $c, $searchspec, @keywords) = @_;
189    $searchspec ||= {};
190    my $tsquery = join(' & ', map { $_ =~ s/ /\\ /g; $_ } @keywords);
191   
192    my $distrs = $c->forward('/search/distrib_search', [ $searchspec, 1 ]);
193
194    $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search(
195            {
196                -or => [
197#                    { -nest => \[
198#                        "to_tsvector('english', description) @@ to_tsquery(?)",
199#                        [ plain_text => $tsquery],
200#                    ], },
201                    {
202                    name => { '~*' => [ @keywords ] },
203                    },
204                ],
205            (exists($searchspec->{src})
206                ? (issrc => $searchspec->{src} ? 1 : 0)
207                : ()),
208            ($distrs 
209                ? (pkgid => { IN => $distrs->get_column('pkgid')->as_query, },)
210                : ()),
211        },
212    );
213}
214
215sub description : Private {
216    my ($self, $c, $searchspec, @keywords) = @_;
217    return [ $c->forward('description_rpc')->get_column('pkgid')->all ];
218}
219
220sub description_rpc : XMLRPCPath('description') {
221    my ($self, $c, $searchspec, @keywords) = @_;
222    $searchspec ||= {};
223    my $tsquery = join(' & ', map { $_ =~ s/ /\\ /g; $_ } @keywords);
224    my $distrs = $c->forward('/search/distrib_search', [ $searchspec, 1 ]);
225    $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search(
226        {
227            -nest => \[
228                    "to_tsvector('english', description) @@ to_tsquery(?)",
229                    [ plain_text => $tsquery],
230                ],
231                (exists($searchspec->{src})
232                    ? (issrc => $searchspec->{src} ? 1 : 0)
233                    : ()),
234                ($distrs 
235                    ? (pkgid => { IN => $distrs->get_column('pkgid')->as_query, },)
236                    : ()),
237        },
238        {
239            select => [ 
240                "ts_rank_cd(to_tsvector('english', description),to_tsquery(?)) as rank",
241                'pkgid'
242            ],
243            bind => [ $tsquery ], 
244            order_by => [ 'rank desc', 'name', 'evr using >>', 'issrc' ],
245        },
246    )->as_subselect_rs;
247}
248
249sub sources : XMLRPCPath('sources') {
250    my ( $self, $c, $searchspec, $pkgid ) = @_;
251
252    my $distrs = $c->forward('/search/distrib_search', [ $searchspec, 1 ]);
253    my $sourcerpm = $c->forward('/rpms/queryformat', [ $pkgid, '%{SOURCERPM}' ]);
254    my $nosourcerpm = $sourcerpm;
255    $nosourcerpm =~ s/\.src.rpm$/\.nosrc.rpm/;
256
257    $c->stash->{rs} = $c->model('Base::Rpms')->search(
258        {
259            -and => [
260                { pkgid => {
261                    IN => $c->model('Base::RpmFile')->search(
262                        { filename => [ $sourcerpm, $nosourcerpm ] }
263                    )->get_column('pkgid')->as_query
264                }, },
265                ($distrs 
266                    ? ({ pkgid => { IN => $distrs->get_column('pkgid')->as_query, }, },)
267                    : ()),
268            ],
269        }
270    );
271}
272
273sub binaries : XMLRPCPath('binaries') {
274    my ( $self, $c, $searchspec, $pkgid ) = @_;
275
276    my $distrs = $c->forward('/search/distrib_search', [ $searchspec, 1 ]);
277    my $sourcerpm = $c->forward('/rpms/queryformat', [ $pkgid,
278            '%{NAME}-%{VERSION}-%{RELEASE}.src.rpm' ]);
279    my $nosourcerpm = $sourcerpm;
280    $nosourcerpm =~ s/\.src.rpm$/\.nosrc.rpm/;
281
282    my $tagrs = $c->model('Base')->resultset('Tags')
283        ->search({ tagname => 'sourcerpm', value => [ $sourcerpm, $nosourcerpm ] })
284        ->get_column('pkgid');
285    $c->stash->{rs} = $c->model('Base::Rpms')->search(
286        {
287            -and => [
288                { issrc => 0 },
289                { pkgid =>
290                    { IN => $tagrs->as_query, },
291                },
292                ($distrs 
293                    ? ({ pkgid => { IN => $distrs->get_column('pkgid')->as_query, }, })
294                    : ()),
295            ]
296        },
297        {
298            order_by => [ qw(arch name), 'evr using >>' ],
299        },
300    );
301}
302
303sub end : Private {
304    my ( $self, $c, $searchspec ) = @_;
305    $searchspec ||= {};
306    $c->stash->{rs} or return;
307
308    my $rs = $c->stash->{rs}->search(
309        {},
310        {
311            page => $searchspec->{page} || 
312                 $c->req->param('page') || 1,
313            rows => $searchspec->{rows} || 
314                 $c->req->param('rows') || 10,
315        },
316    );
317
318    $c->stash->{rs} = $rs;
319    my @results = $rs->get_column('pkgid')->all;
320   
321    $c->stash->{xmlrpc} = {};
322    if (!$searchspec->{nopager}) {
323        my $pager = $c->stash->{rs}->pager;
324        $c->stash->{pager} = $pager;
325        $c->stash->{xmlrpc} = {
326                pages => $pager->last_page,
327                current_page => $pager->current_page,
328                total_entries => $pager->total_entries,
329                entries_per_page => $pager->entries_per_page,
330        };
331    }
332    $c->stash->{xmlrpc}{results} = \@results;
333
334    #$c->forward('/end');
335}
336
337
338=head1 AUTHOR
339
340Olivier Thauvin
341
342=head1 LICENSE
343
344This library is free software. You can redistribute it and/or modify
345it under the same terms as Perl itself.
346
347=cut
348
349__PACKAGE__->meta->make_immutable;
350
3511;
Note: See TracBrowser for help on using the repository browser.