Changeset 128


Ignore:
Timestamp:
12/16/10 20:15:34 (13 years ago)
Author:
nanardon
Message:
  • factorize SQL code
File:
1 edited

Legend:

Unmodified
Added
Removed
  • server/trunk/web/lib/Sophie/Controller/Search.pm

    r125 r128  
    328328} 
    329329 
    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( 
     330sub 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( 
    536336        { 
    537337            -and => [ 
     
    557357        }, 
    558358        { 
    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) ], 
    561361 
    562362        } 
     363    ); 
     364} 
     365 
     366sub 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 
     396sub 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 
     417sub 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 
     435sub 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 
     471sub 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 
     500sub 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 
     530sub 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 
     543sub 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        ], 
    563552    ); 
    564553 
Note: See TracChangeset for help on using the changeset viewer.