Changeset 147
- Timestamp:
- 12/20/10 00:21:14 (13 years ago)
- Location:
- server/trunk/web
- Files:
-
- 7 added
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
server/trunk/web/lib/Sophie/Controller/Search.pm
r144 r147 37 37 38 38 my $searchspec = { 39 page => $c->req->param('page') || undef,40 39 }; 41 40 … … 61 60 }; 62 61 } 63 64 62 } 65 63 … … 73 71 if ($c->req->param('search')) { 74 72 $c->session->{search} = $c->req->param('search'); 75 $c->forward(' quick', [73 $c->forward('/search/rpm/quick', [ 76 74 { 77 page => $c->req->param('page') || undef,78 75 src => 0, 79 76 } , grep { $_ } split(/\s/, $c->req->param('search')) ]); … … 104 101 my ( $self, $c, $searchspec ) = @_; 105 102 $searchspec ||= {}; 103 $c->stash->{rs} or return; 106 104 107 105 my $rs = $c->stash->{rs}->search( 108 106 {}, 109 107 { 110 page => $searchspec->{page} || 1, 111 rows => $searchspec->{rows} || 10, 108 page => $searchspec->{page} || 109 $c->req->param('page') || 1, 110 rows => $searchspec->{rows} || 111 $c->req->param('rows') || 10, 112 112 }, 113 113 ); … … 255 255 } 256 256 257 sub bypkgid : XMLRPCPath('/search/rpm/bypkgid'){257 sub bypkgid : Private { 258 258 my ( $self, $c, $searchspec, $pkgid ) = @_; 259 $searchspec ||= {}; 260 261 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 262 263 $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search( 264 { 265 -and => [ 266 (exists($searchspec->{src}) 267 ? { issrc => $searchspec->{src} ? 1 : 0 } 268 : ()), 269 { pkgid => $pkgid }, 270 $distrs 271 ? { pkgid => { IN => $distrs->get_column('pkgid')->as_query, } } 272 : () 273 ] 274 }, 275 ); 276 277 $c->forward('format_search', $searchspec); 278 } 279 280 =head2 search.rpm.byname (SEARCHSPEC, NAME, [SENSE, EVR]) 281 282 Search package by its NAME. SENSE and EVR are optional version filter where 283 SENSE is dependency sign (C<E<gt>>, C<=>, ...) and EVR the search version as 284 either C<VERSION>, C<VERSION-RELEASE> or C<EPOCH:VERSION-RELEASE>. 285 286 SEARCHSPEC is a struct with search options. 287 288 =cut 289 290 sub byname : XMLRPCPath('/search/rpm/byname') { 259 $c->log->debug(sprintf("Call to obsolete %s %s", __PACKAGE__, "bypkgid")); 260 $c->stash->{rs} = $c->forward('/search/rpm/bypkgid_rpc', [ $searchspec, $pkgid ]); 261 $c->forward('format_search', [ $searchspec ]); 262 } 263 264 sub byname_rs : Private { 291 265 my ( $self, $c, $searchspec, $name, $sense, $evr ) = @_; 292 266 $searchspec ||= {}; … … 294 268 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 295 269 296 $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search(270 return $c->model('Base::Rpms')->search( 297 271 { 298 272 -and => [ … … 317 291 } 318 292 ); 319 $c->forward('format_search', $searchspec); 320 321 } 322 323 sub bytag : XMLRPCPath('/search/rpm/bytag') { 293 } 294 295 sub byname : Private { 296 my ( $self, $c, $searchspec, $name, $sense, $evr ) = @_; 297 $c->log->debug(sprintf("Call to obsolete %s %s", __PACKAGE__, "byname")); 298 $c->stash->{rs} = $c->forward('/search/rpm/byname_rpc', [ $searchspec, $name, $sense, $evr ]); 299 $c->forward('format_search', [ $searchspec ]); 300 } 301 302 sub bytag_rs : Private { 324 303 my ( $self, $c, $searchspec, $tag, $tagvalue ) = @_; 325 304 $searchspec ||= {}; … … 329 308 ->get_column('pkgid'); 330 309 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 331 $c->stash->{rs} =$c->model('Base')->resultset('Rpms')->search(310 return $c->model('Base')->resultset('Rpms')->search( 332 311 { 333 312 -and => [ … … 344 323 }, 345 324 ); 346 $c->forward('format_search', $searchspec); 347 325 } 326 327 sub bytag : Private { 328 my ( $self, $c, $searchspec, $tag, $tagvalue ) = @_; 329 330 $c->log->debug(sprintf("Call to obsolete %s %s", __PACKAGE__, "bytag")); 331 $c->stash->{rs} = $c->forward('/search/rpm/bytag_rpc', [ $searchspec, $tag, $tagvalue ]); 332 $c->forward('format_search', [ $searchspec ]); 333 } 334 335 sub bypkgid_rs : Private { 336 my ( $self, $c, $searchspec, $pkgid ) = @_; 337 $searchspec ||= {}; 338 339 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 340 341 return $c->model('Base::Rpms')->search( 342 { 343 -and => [ 344 (exists($searchspec->{src}) 345 ? { issrc => $searchspec->{src} ? 1 : 0 } 346 : ()), 347 { pkgid => $pkgid }, 348 $distrs 349 ? { pkgid => { IN => $distrs->get_column('pkgid')->as_query, } } 350 : () 351 ] 352 }, 353 ); 348 354 } 349 355 … … 431 437 sub bydep : XMLRPCPath('/search/rpm/bydep') { 432 438 my ( $self, $c, $searchspec, $deptype, $depname, $depsense, $depevr ) = @_; 433 $searchspec ||= {}; 434 435 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 436 437 my $deprs = $c->forward( 438 'deps_rs', [ 439 $searchspec, $deptype, $depname, 440 $depsense, $depevr 441 ], 442 )->get_column('pkgid'); 443 $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search( 444 { 445 pkgid => 446 { IN => $deprs->as_query, }, 447 }, 448 { 449 order_by => [ 'name', 'evr using >>', 'issrc', 'arch' ], 450 } 451 ); 452 $c->forward('format_search', $searchspec); 453 } 454 455 sub byfile : XMLRPCPath('/search/rpm/byfile') { 439 $c->forward('/search/rpm/bydep', [ $searchspec, $deptype, $depname, $depsense, $depevr ]); 440 $c->forward('format_search', [ $searchspec ]); 441 } 442 443 sub byfile : Private { 456 444 my ( $self, $c, $searchspec, $file) = @_; 457 $searchspec ||= {}; 458 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 459 460 my $filers = $c->forward('file_rs', [ $searchspec, $file ]) 461 ->get_column('pkgid'); 462 $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search( 463 { 464 pkgid => { IN => $filers->as_query, }, 465 }, 466 { 467 order_by => [ 'name', 'evr using >>', 'issrc', 'arch' ], 468 } 469 ); 470 $c->forward('format_search', $searchspec); 471 } 472 473 sub fuzzy : XMLRPCPath('/search/rpm/fuzzy') { 474 my ($self, $c, $searchspec, $name) = @_; 475 $searchspec ||= {}; 476 477 my $deprs = $c->model('Base')->resultset('Deps')->search( 478 { deptype => 'P', depname => { '~*' => $name } } 479 )->get_column('pkgid'); 480 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 481 482 $c->stash->{rs} = 483 484 $c->model('Base')->resultset('Rpms')->search( 485 { 486 -and => [ 487 (exists($searchspec->{src}) 488 ? { issrc => $searchspec->{src} ? 1 : 0 } 489 : ()), 490 { -or => [ 491 { name => 492 { '~*' => $name, }, 493 }, 494 # { pkgid => 495 # { IN => $deprs->as_query, }, 496 # }, 497 ] 498 }, 499 $distrs 500 ? { pkgid => { IN => $distrs->get_column('pkgid')->as_query, }, } 501 : (), 502 ] 503 }, 504 ); 505 506 $c->forward('format_search', $searchspec); 507 } 508 509 sub quick : XMLRPCPath('/search/rpm/quick') { 510 my ($self, $c, $searchspec, @keywords) = @_; 511 $searchspec ||= {}; 512 my $tsquery = join(' & ', map { $_ =~ s/ /\\ /g; $_ } @keywords); 513 514 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 515 516 $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search( 517 { 518 -or => [ 519 # { -nest => \[ 520 # "to_tsvector('english', description) @@ to_tsquery(?)", 521 # [ plain_text => $tsquery], 522 # ], }, 523 { 524 name => { '~*' => [ @keywords ] }, 525 }, 526 ], 527 (exists($searchspec->{src}) 528 ? (issrc => $searchspec->{src} ? 1 : 0) 529 : ()), 530 ($distrs 531 ? (pkgid => { IN => $distrs->get_column('pkgid')->as_query, },) 532 : ()), 533 }, 534 ); 535 $c->forward('format_search', $searchspec); 536 } 537 538 sub description : XMLRPCPath('/search/rpm/description') { 539 my ($self, $c, $searchspec, @keywords) = @_; 540 $searchspec ||= {}; 541 my $tsquery = join(' & ', map { $_ =~ s/ /\\ /g; $_ } @keywords); 542 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 543 $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search( 544 { 545 -nest => \[ 546 "to_tsvector('english', description) @@ to_tsquery(?)", 547 [ plain_text => $tsquery], 548 ], 549 (exists($searchspec->{src}) 550 ? (issrc => $searchspec->{src} ? 1 : 0) 551 : ()), 552 ($distrs 553 ? (pkgid => { IN => $distrs->get_column('pkgid')->as_query, },) 554 : ()), 555 }, 556 { 557 select => [ 558 "ts_rank_cd(to_tsvector('english', description),to_tsquery(?)) as rank", 559 'pkgid' 560 ], 561 bind => [ $tsquery ], 562 order_by => [ 'rank desc', 'name', 'evr using >>', 'issrc' ], 563 }, 564 )->as_subselect_rs; 565 $c->forward('format_search', $searchspec); 566 } 567 568 sub sources : XMLRPCPath('/search/rpm/sources') { 569 my ( $self, $c, $searchspec, $pkgid ) = @_; 570 571 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 572 my $sourcerpm = $c->forward('/rpms/queryformat', [ $pkgid, '%{SOURCERPM}' ]); 573 my $nosourcerpm = $sourcerpm; 574 $nosourcerpm =~ s/\.src.rpm$/\.nosrc.rpm/; 575 576 $c->stash->{rs} = $c->model('Base::Rpms')->search( 577 { 578 -and => [ 579 { pkgid => { 580 IN => $c->model('Base::RpmFile')->search( 581 { filename => [ $sourcerpm, $nosourcerpm ] } 582 )->get_column('pkgid')->as_query 583 }, }, 584 ($distrs 585 ? ({ pkgid => { IN => $distrs->get_column('pkgid')->as_query, }, },) 586 : ()), 587 ], 588 } 589 ); 590 591 $c->forward('format_search', $searchspec); 592 } 593 594 sub binaries : XMLRPCPath('/search/rpm/binaries') { 595 my ( $self, $c, $searchspec, $pkgid ) = @_; 596 597 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 598 my $sourcerpm = $c->forward('/rpms/queryformat', [ $pkgid, 599 '%{NAME}-%{VERSION}-%{RELEASE}.src.rpm' ]); 600 my $nosourcerpm = $sourcerpm; 601 $nosourcerpm =~ s/\.src.rpm$/\.nosrc.rpm/; 602 603 my $tagrs = $c->model('Base')->resultset('Tags') 604 ->search({ tagname => 'sourcerpm', value => [ $sourcerpm, $nosourcerpm ] }) 605 ->get_column('pkgid'); 606 $c->stash->{rs} = $c->model('Base::Rpms')->search( 607 { 608 -and => [ 609 { issrc => 0 }, 610 { pkgid => 611 { IN => $tagrs->as_query, }, 612 }, 613 ($distrs 614 ? ({ pkgid => { IN => $distrs->get_column('pkgid')->as_query, }, }) 615 : ()), 616 ] 617 }, 618 { 619 order_by => [ qw(arch name), 'evr using >>' ], 620 }, 621 ); 622 623 $c->forward('format_search', $searchspec); 445 $c->forward('/search/rpm/byfile', [ $searchspec, $file ]); 446 $c->forward('format_search', [ $searchspec ]); 624 447 } 625 448 … … 633 456 $c->stash->{column} = [ @col, qw(has_content perm user group) ]; 634 457 635 $c->forward('format_search', $searchspec);458 $c->forward('format_search', [ $searchspec ]); 636 459 } 637 460 … … 648 471 649 472 $c->stash->{column} = [ qw(name sense evr flags pkgid) ]; 650 $c->forward('format_search', $searchspec); 473 $c->forward('format_search', [ $searchspec ]); 474 } 475 476 sub end : Private { 477 my ($self, $c, $searchspec) = @_; 478 warn join(' ', keys %{ $searchspec }); 479 480 $c->forward('/search/format_search', [ $searchspec ]); 481 $c->forward('/end'); 651 482 } 652 483 -
server/trunk/web/root/templates/html/search/results.tt
r142 r147 36 36 [% sargs.0.pkgid = pkgid %] 37 37 <ul> 38 [% FOREACH dep = c.forward('/search/dep _search', sargs).results%]38 [% FOREACH dep = c.forward('/search/dep/match', sargs) %] 39 39 <li>[% dep.name | html %] [% dep.sense | html %] [% dep.evr | html %]</li> 40 40 [% END %] … … 45 45 [% sargs.0.pkgid = pkgid %] 46 46 <ul class="filename"> 47 [% FOREACH file = c.forward('/search/file _search', sargs).results%]47 [% FOREACH file = c.forward('/search/file/byname', sargs) %] 48 48 <li>[% file.dirname | html -%][%- file.basename | html %]</li> 49 49 [% END %]
Note: See TracChangeset
for help on using the changeset viewer.