Changeset 128
- Timestamp:
- 12/16/10 20:15:34 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
server/trunk/web/lib/Sophie/Controller/Search.pm
r125 r128 328 328 } 329 329 330 sub bydep : XMLRPCPath('/search/rpm/bydep') { 331 my ( $self, $c, $searchspec, $deptype, $depname, $depsense, $depevr ) = @_; 332 $searchspec ||= {}; 333 334 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 335 336 my $deprs = $c->model('Base::Deps')->search( 337 { 338 deptype => $deptype, 339 depname => $depname, 340 ($depsense 341 ? (-nest => \[ 342 'rpmdepmatch(flags, evr, rpmsenseflag(?), ?)', 343 [ plain_text => $depsense], 344 [ plain_text => $depevr ] 345 ]) 346 : ()), 347 } 348 )->get_column('pkgid'); 349 $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search( 350 { 351 -and => [ 352 (exists($searchspec->{src}) 353 ? { issrc => $searchspec->{src} ? 1 : 0 } 354 : ()), 355 { pkgid => 356 { IN => $deprs->as_query, }, 357 }, 358 $distrs 359 ? { pkgid => { IN => $distrs->get_column('pkgid')->as_query, }, } 360 : (), 361 ] 362 }, 363 ); 364 $c->forward('format_search', $searchspec); 365 } 366 367 sub byfile : XMLRPCPath('/search/rpm/byfile') { 368 my ( $self, $c, $searchspec, $file) = @_; 369 my ($dirname, $basename) = $file =~ m:^(.*/)?([^/]+)$:; 370 $searchspec ||= {}; 371 372 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 373 my $filers = $c->model('Base')->resultset('Files') 374 ->search({ 375 ($dirname 376 ? (dirname => $dirname) 377 : ()), 378 basename => $basename, 379 }) 380 ->get_column('pkgid'); 381 $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search( 382 { 383 -and => [ 384 (exists($searchspec->{src}) 385 ? { issrc => $searchspec->{src} ? 1 : 0 } 386 : ()), 387 { pkgid => 388 { IN => $filers->as_query, }, 389 }, 390 $distrs 391 ? { pkgid => { IN => $distrs->get_column('pkgid')->as_query, }, } 392 : (), 393 ] 394 }, 395 ); 396 $c->forward('format_search', $searchspec); 397 } 398 399 sub fuzzy : XMLRPCPath('/search/rpm/fuzzy') { 400 my ($self, $c, $searchspec, $name) = @_; 401 $searchspec ||= {}; 402 403 my $deprs = $c->model('Base')->resultset('Deps')->search( 404 { deptype => 'P', depname => { '~*' => $name } } 405 )->get_column('pkgid'); 406 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 407 408 $c->stash->{rs} = 409 410 $c->model('Base')->resultset('Rpms')->search( 411 { 412 -and => [ 413 (exists($searchspec->{src}) 414 ? { issrc => $searchspec->{src} ? 1 : 0 } 415 : ()), 416 { -or => [ 417 { name => 418 { '~*' => $name, }, 419 }, 420 # { pkgid => 421 # { IN => $deprs->as_query, }, 422 # }, 423 ] 424 }, 425 $distrs 426 ? { pkgid => { IN => $distrs->get_column('pkgid')->as_query, }, } 427 : (), 428 ] 429 }, 430 ); 431 432 $c->forward('format_search', $searchspec); 433 } 434 435 sub quick : XMLRPCPath('/search/rpm/quick') { 436 my ($self, $c, $searchspec, @keywords) = @_; 437 $searchspec ||= {}; 438 my $tsquery = join(' & ', map { $_ =~ s/ /\\ /g; $_ } @keywords); 439 440 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 441 442 $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search( 443 { 444 -or => [ 445 # { -nest => \[ 446 # "to_tsvector('english', description) @@ to_tsquery(?)", 447 # [ plain_text => $tsquery], 448 # ], }, 449 { 450 name => { '~*' => [ @keywords ] }, 451 }, 452 ], 453 (exists($searchspec->{src}) 454 ? (issrc => $searchspec->{src} ? 1 : 0) 455 : ()), 456 ($distrs 457 ? (pkgid => { IN => $distrs->get_column('pkgid')->as_query, },) 458 : ()), 459 }, 460 ); 461 $c->forward('format_search', $searchspec); 462 } 463 464 sub description : XMLRPCPath('/search/rpm/description') { 465 my ($self, $c, $searchspec, @keywords) = @_; 466 $searchspec ||= {}; 467 my $tsquery = join(' & ', map { $_ =~ s/ /\\ /g; $_ } @keywords); 468 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 469 $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search( 470 { 471 -nest => \[ 472 "to_tsvector('english', description) @@ to_tsquery(?)", 473 [ plain_text => $tsquery], 474 ], 475 (exists($searchspec->{src}) 476 ? (issrc => $searchspec->{src} ? 1 : 0) 477 : ()), 478 ($distrs 479 ? (pkgid => { IN => $distrs->get_column('pkgid')->as_query, },) 480 : ()), 481 }, 482 { 483 select => [ 484 "ts_rank_cd(to_tsvector('english', description),to_tsquery(?)) as rank", 485 'pkgid' 486 ], 487 bind => [ $tsquery ], 488 order_by => [ 'rank desc', 'name', 'evr using >>', 'issrc' ], 489 }, 490 )->as_subselect_rs; 491 $c->forward('format_search', $searchspec); 492 } 493 494 sub file_search : XMLRPCPath('/search/file/byname') { 495 my ( $self, $c, $searchspec, $file) = @_; 496 my ($dirname, $basename) = $file =~ m:^(.*/)?([^/]+)$:; 497 $searchspec ||= {}; 498 499 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 500 my @col = qw(dirname basename md5 size pkgid count); 501 $c->stash->{rs} = $c->model('Base::Files') 502 ->search( 503 { 504 -and => [ 505 ($dirname 506 ? (dirname => $dirname) 507 : ()), 508 basename => $basename, 509 ($searchspec->{content} ? { has_content => 1 } : ()), 510 ($distrs 511 ? (pkgid => { IN => $distrs->get_column('pkgid')->as_query, },) 512 : ()), 513 ], 514 }, 515 { 516 'select' => [ 'contents is NOT NULL as has_content', 517 'rpmfilesmode(mode) as perm', @col, '"group"', 518 '"user"' ], 519 as => [ qw(has_content perm), @col, 520 'group', 'user' ], 521 } 522 ); 523 524 $c->stash->{column} = [ 525 @col, qw(has_content perm user group) 526 ]; 527 528 $c->forward('format_search', $searchspec); 529 } 530 531 sub dep_search : XMLRPCPath('/search/dep/match') { 532 my ($self, $c, $searchspec, $deptype, $depname, $depsense, $depevr) = @_; 533 534 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 535 $c->stash->{rs} = $c->model('Base::Deps')->search( 330 sub deps_rs : Private { 331 my ($self, $c, $searchspec, $deptype, $depname, $depsense, $depevr ) = @_; 332 333 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 334 335 return $c->model('Base::Deps')->search( 536 336 { 537 337 -and => [ … … 557 357 }, 558 358 { 559 ' select' => [ 'rpmsenseflag("flags")', qw(depname evr flags pkgid)],560 ' as' => [ qw(sense name evr flags pkgid) ],359 '+select' => [ { rpmsenseflag => 'flags' }, 'depname', ], 360 '+as' => [ qw(sense name) ], 561 361 562 362 } 363 ); 364 } 365 366 sub file_rs : Private { 367 my ( $self, $c, $searchspec, $file) = @_; 368 my ($dirname, $basename) = $file =~ m:^(.*/)?([^/]+)$:; 369 $searchspec ||= {}; 370 371 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 372 373 return $c->model('Base::Files')->search( 374 { 375 -and => [ 376 ($dirname 377 ? (dirname => $dirname) 378 : ()), 379 basename => $basename, 380 ($searchspec->{content} ? { has_content => 1 } : ()), 381 ($distrs 382 ? (pkgid => { IN => $distrs->get_column('pkgid')->as_query, },) 383 : ()), 384 ], 385 }, 386 { 387 '+select' => [ 388 'contents is NOT NULL as has_content', 389 { rpmfilesmode => 'mode' }, 390 ], 391 '+as' => [ qw(has_content perm), ], 392 } 393 ); 394 } 395 396 sub bydep : XMLRPCPath('/search/rpm/bydep') { 397 my ( $self, $c, $searchspec, $deptype, $depname, $depsense, $depevr ) = @_; 398 $searchspec ||= {}; 399 400 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 401 402 my $deprs = $c->forward( 403 'deps_rs', [ 404 $searchspec, $deptype, $depname, 405 $depsense, $depevr 406 ], 407 )->get_column('pkgid'); 408 $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search( 409 { 410 pkgid => 411 { IN => $deprs->as_query, }, 412 }, 413 ); 414 $c->forward('format_search', $searchspec); 415 } 416 417 sub byfile : XMLRPCPath('/search/rpm/byfile') { 418 my ( $self, $c, $searchspec, $file) = @_; 419 my ($dirname, $basename) = $file =~ m:^(.*/)?([^/]+)$:; 420 $searchspec ||= {}; 421 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 422 423 my $filers = $c->forward('file_rs', [ $searchspec, $file ]) 424 ->get_column('pkgid'); 425 $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search( 426 { 427 $distrs 428 ? { pkgid => { IN => $distrs->get_column('pkgid')->as_query, }, } 429 : (), 430 }, 431 ); 432 $c->forward('format_search', $searchspec); 433 } 434 435 sub fuzzy : XMLRPCPath('/search/rpm/fuzzy') { 436 my ($self, $c, $searchspec, $name) = @_; 437 $searchspec ||= {}; 438 439 my $deprs = $c->model('Base')->resultset('Deps')->search( 440 { deptype => 'P', depname => { '~*' => $name } } 441 )->get_column('pkgid'); 442 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 443 444 $c->stash->{rs} = 445 446 $c->model('Base')->resultset('Rpms')->search( 447 { 448 -and => [ 449 (exists($searchspec->{src}) 450 ? { issrc => $searchspec->{src} ? 1 : 0 } 451 : ()), 452 { -or => [ 453 { name => 454 { '~*' => $name, }, 455 }, 456 # { pkgid => 457 # { IN => $deprs->as_query, }, 458 # }, 459 ] 460 }, 461 $distrs 462 ? { pkgid => { IN => $distrs->get_column('pkgid')->as_query, }, } 463 : (), 464 ] 465 }, 466 ); 467 468 $c->forward('format_search', $searchspec); 469 } 470 471 sub quick : XMLRPCPath('/search/rpm/quick') { 472 my ($self, $c, $searchspec, @keywords) = @_; 473 $searchspec ||= {}; 474 my $tsquery = join(' & ', map { $_ =~ s/ /\\ /g; $_ } @keywords); 475 476 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 477 478 $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search( 479 { 480 -or => [ 481 # { -nest => \[ 482 # "to_tsvector('english', description) @@ to_tsquery(?)", 483 # [ plain_text => $tsquery], 484 # ], }, 485 { 486 name => { '~*' => [ @keywords ] }, 487 }, 488 ], 489 (exists($searchspec->{src}) 490 ? (issrc => $searchspec->{src} ? 1 : 0) 491 : ()), 492 ($distrs 493 ? (pkgid => { IN => $distrs->get_column('pkgid')->as_query, },) 494 : ()), 495 }, 496 ); 497 $c->forward('format_search', $searchspec); 498 } 499 500 sub description : XMLRPCPath('/search/rpm/description') { 501 my ($self, $c, $searchspec, @keywords) = @_; 502 $searchspec ||= {}; 503 my $tsquery = join(' & ', map { $_ =~ s/ /\\ /g; $_ } @keywords); 504 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 505 $c->stash->{rs} = $c->model('Base')->resultset('Rpms')->search( 506 { 507 -nest => \[ 508 "to_tsvector('english', description) @@ to_tsquery(?)", 509 [ plain_text => $tsquery], 510 ], 511 (exists($searchspec->{src}) 512 ? (issrc => $searchspec->{src} ? 1 : 0) 513 : ()), 514 ($distrs 515 ? (pkgid => { IN => $distrs->get_column('pkgid')->as_query, },) 516 : ()), 517 }, 518 { 519 select => [ 520 "ts_rank_cd(to_tsvector('english', description),to_tsquery(?)) as rank", 521 'pkgid' 522 ], 523 bind => [ $tsquery ], 524 order_by => [ 'rank desc', 'name', 'evr using >>', 'issrc' ], 525 }, 526 )->as_subselect_rs; 527 $c->forward('format_search', $searchspec); 528 } 529 530 sub file_search : XMLRPCPath('/search/file/byname') { 531 my ( $self, $c, $searchspec, $file) = @_; 532 my ($dirname, $basename) = $file =~ m:^(.*/)?([^/]+)$:; 533 $searchspec ||= {}; 534 535 $c->stash->{rs} = $c->forward('file_rs', [ $searchspec, $file ]); 536 537 my @col = qw(dirname basename md5 size pkgid count); 538 $c->stash->{column} = [ @col, qw(has_content perm user group) ]; 539 540 $c->forward('format_search', $searchspec); 541 } 542 543 sub dep_search : XMLRPCPath('/search/dep/match') { 544 my ($self, $c, $searchspec, $deptype, $depname, $depsense, $depevr) = @_; 545 546 my $distrs = $c->forward('distrib_search', [ $searchspec, 1 ]); 547 $c->stash->{rs} = $c->forward( 548 'deps_rs', [ 549 $searchspec, $deptype, $depname, 550 $depsense, $depevr 551 ], 563 552 ); 564 553
Note: See TracChangeset
for help on using the changeset viewer.