Changeset 40


Ignore:
Timestamp:
11/27/10 17:38:12 (13 years ago)
Author:
nanardon
Message:
  • search function take into account search spec
  • add fts over description
Location:
server/trunk/web
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • server/trunk/web/lib/Sophie/Base/Result/Rpms.pm

    r4 r40  
    66 
    77__PACKAGE__->table('rpms'); 
    8 __PACKAGE__->add_columns(qw/pkgid summary description issrc/); 
     8__PACKAGE__->add_columns(qw/pkgid summary description issrc name/); 
    99__PACKAGE__->set_primary_key(qw/pkgid/); 
    1010__PACKAGE__->has_many(Rpmfile => 'Sophie::Base::Result::RpmFile', 'pkgid'); 
  • server/trunk/web/lib/Sophie/Controller/Explorer.pm

    r38 r40  
    2626 
    2727    $c->stash->{path} = join('/', grep { $_  } @args); 
     28    for(my $i=0; $i < @args; $i++) { 
     29        push(@{$c->stash->{eachpath}}, { dir=>$args[$i], path =>join('/', 
     30                    @args[0 .. $i] ) }); 
     31    } 
    2832    $c->stash->{dirurl} = $c->uri_for('/0explorer/dir', 
    2933        $c->stash->{path} ? 
  • server/trunk/web/lib/Sophie/Controller/Rpms.pm

    r28 r40  
    179179 
    180180 
    181 sub rpms : Chained : PathPart { 
     181sub rpms : Chained : PathPart :XMLRPCLocal { 
    182182    my ( $self, $c, $pkgid ) = @_; 
    183183    $c->stash->{pkgid} = $c->model('Base')->resultset('Rpms')->search(pkgid => $pkgid)->next; 
  • server/trunk/web/lib/Sophie/Controller/Search.pm

    r16 r40  
    22use Moose; 
    33use namespace::autoclean; 
     4use Sophie; 
    45 
    56BEGIN {extends 'Catalyst::Controller'; } 
     
    2122 
    2223=cut 
     24 
     25my $search_param = { 
     26    rows => Sophie->config()->{'max_reply'} || 20000, 
     27    order_by => [ 'name', 'evr using >>', 'issrc' ], 
     28    select => [ 'pkgid' ], 
     29}; 
    2330 
    2431sub index :Path :Args(0) { 
     
    2835} 
    2936 
     37sub distrib_search : Private { 
     38    my ( $self, $c, $searchspec ) = @_; 
     39 
     40    return $c->model('Base')->resultset('Distribution') 
     41        ->search( 
     42            { 
     43                $searchspec->{distribution} 
     44                    ? (name => $searchspec->{distribution}) 
     45                    : () 
     46            } 
     47        )->search_related('Release', 
     48            { 
     49                $searchspec->{release} 
     50                    ? (release => $searchspec->{release}) 
     51                    : () 
     52            } 
     53        )->search_related('Arch', 
     54            { 
     55                $searchspec->{arch} 
     56                    ? (arch => $searchspec->{arch}) 
     57                    : () 
     58            } 
     59        )->search_related('Medias') 
     60        ->search_related('MediasPaths') 
     61        ->search_related('Paths') 
     62        ->search_related('Rpmfiles'); 
     63} 
     64 
    3065sub bytag : XMLRPCPath('/search/rpm/bytag') { 
    3166    my ( $self, $c, $searchspec, $tag, $tagvalue ) = @_; 
    3267 
    33     @{$c->stash->{xmlrpc}} = $c->model('Base')->resultset('Rpms')->search( 
    34         { 
    35             pkgid => { IN => $c->model('Base')->resultset('Tags') 
    36                 ->search({ tagname => $tag, value => $tagvalue}) 
    37                 ->get_column('pkgid')->as_query } 
    38         } 
    39     )->get_column('pkgid')->all 
     68    my $tagrs = $c->model('Base')->resultset('Tags') 
     69        ->search({ tagname => lc($tag), value => $tagvalue}) 
     70        ->get_column('pkgid'); 
     71    $c->stash->{xmlrpc} = [ $c->model('Base')->resultset('Rpms')->search( 
     72        { 
     73            -and => [  
     74                (exists($searchspec->{src}) 
     75                    ? { issrc => $searchspec->{src} ? 1 : 0 } 
     76                    : ()), 
     77                { pkgid =>  
     78                    { IN => $tagrs->as_query, }, 
     79                }, 
     80                { pkgid => 
     81                    { IN => $c->forward('distrib_search', [ $searchspec 
     82                        ])->get_column('pkgid')->as_query, },  
     83                }, 
     84            ]      
     85        }, 
     86        $search_param, 
     87    )->get_column('pkgid')->all ] 
    4088 
    4189} 
     
    4492    my ( $self, $c, $searchspec, $deptype, $depname, $depsense, $depevr ) = @_; 
    4593 
    46     @{$c->stash->{xmlrpc}} = $c->model('Base')->resultset('Rpms')->search( 
    47         { 
    48             pkgid => { IN => $c->model('Base')->resultset('Deps') 
    49                 ->search({ 
    50                         deptype => $deptype, 
    51                         depname => $depname, 
    52                         ($depsense 
    53                             ? (-nest => \[ 
    54                                 'rpmdepmatch(flags, evr, rpmsenseflag(?), ?)', 
    55                                      [ plain_text => $depsense], 
    56                                      [ plain_text => $depevr ] 
    57                                  ]) 
    58                             : () 
    59                         ), 
    60                 }) 
    61                 ->get_column('pkgid')->as_query } 
     94    my $deprs = $c->model('Base')->resultset('Deps')->search( 
     95        { 
     96            deptype => $deptype, 
     97            depname => $depname, 
     98            ($depsense 
     99                ? (-nest => \[ 
     100                    'rpmdepmatch(flags, evr, rpmsenseflag(?), ?)', 
     101                    [ plain_text => $depsense], 
     102                    [ plain_text => $depevr ] 
     103                ]) 
     104            : ()), 
    62105        } 
    63     )->get_column('pkgid')->all 
    64  
     106    )->get_column('pkgid'); 
     107    $c->stash->{xmlrpc} = [ $c->model('Base')->resultset('Rpms')->search( 
     108        { 
     109            -and => [  
     110                (exists($searchspec->{src}) 
     111                    ? { issrc => $searchspec->{src} ? 1 : 0 } 
     112                    : ()), 
     113                { pkgid =>  
     114                    { IN => $deprs->as_query, }, 
     115                }, 
     116                { pkgid => 
     117                    { IN => $c->forward('distrib_search', [ $searchspec 
     118                        ])->get_column('pkgid')->as_query, },  
     119                }, 
     120            ]      
     121        }, 
     122        $search_param, 
     123    )->get_column('pkgid')->all ] 
    65124} 
    66125 
     
    69128    my ($dirname, $basename) = $file =~ m:^(.*/)?([^/]+)$:; 
    70129 
    71     @{$c->stash->{xmlrpc}} = $c->model('Base')->resultset('Rpms')->search( 
    72         { 
    73             pkgid => { IN => $c->model('Base')->resultset('Files') 
    74                 ->search({ 
    75                         ($dirname 
    76                             ? (dirname => $dirname) 
    77                             : ()), 
    78                         basename => $basename, 
    79                 }) 
    80                 ->get_column('pkgid')->as_query } 
    81         } 
    82     )->get_column('pkgid')->all 
     130    my $filers = $c->model('Base')->resultset('Files') 
     131    ->search({ 
     132            ($dirname 
     133                ? (dirname => $dirname) 
     134                : ()), 
     135            basename => $basename, 
     136        }) 
     137    ->get_column('pkgid'); 
     138    $c->stash->{xmlrpc} = [ $c->model('Base')->resultset('Rpms')->search( 
     139        { 
     140            -and => [  
     141                (exists($searchspec->{src}) 
     142                    ? { issrc => $searchspec->{src} ? 1 : 0 } 
     143                    : ()), 
     144                { pkgid =>  
     145                    { IN => $filers->as_query, }, 
     146                }, 
     147                { pkgid => 
     148                    { IN => $c->forward('distrib_search', [ $searchspec 
     149                        ])->get_column('pkgid')->as_query, },  
     150                }, 
     151            ]      
     152        }, 
     153        $search_param, 
     154    )->get_column('pkgid')->all ] 
     155} 
     156 
     157sub fuzzy : XMLRPCPath('/search/rpm/fuzzy') { 
     158    my ($self, $c, $searchspec, $name) = @_; 
     159 
     160    my $namers = $c->model('Base')->resultset('Tags')->search( 
     161        { tagname => 'name', value => { '~*' => $name } } 
     162    )->get_column('pkgid'); 
     163    my $deprs = $c->model('Base')->resultset('Deps')->search( 
     164        { deptype => 'P', depname => { '~*' => $name } } 
     165    )->get_column('pkgid'); 
     166 
     167    $c->stash->{xmlrpc} = [ $c->model('Base')->resultset('Rpms')->search( 
     168        { 
     169            -and => [ 
     170                (exists($searchspec->{src}) 
     171                    ? { issrc => $searchspec->{src} ? 1 : 0 } 
     172                    : ()), 
     173                { -or => [ 
     174                    { pkgid =>  
     175                        { IN => $namers->as_query, }, 
     176                    }, 
     177                    { pkgid => 
     178                        { IN => $deprs->as_query, }, 
     179                    }, ] 
     180                }, 
     181                { pkgid => 
     182                    { IN => $c->forward('distrib_search', [ $searchspec 
     183                        ])->get_column('pkgid')->as_query, },  
     184                }, 
     185            ]      
     186        }, 
     187        $search_param, 
     188    )->get_column('pkgid')->all ] 
     189} 
     190 
     191sub description : XMLRPCPath('/search/rpm/description') { 
     192    my ($self, $c, $searchspec, @keywords) = @_; 
     193    my $tsquery = join(' & ', map { $_ =~ s/ /\\ /g; $_ } @keywords); 
     194    $c->stash->{xmlrpc} = [ map { $_->get_column('pkgid') } $c->model('Base')->resultset('Rpms')->search( 
     195        { 
     196            -nest => \[ 
     197                    "to_tsvector('english', description) @@ to_tsquery(?)", 
     198                    [ plain_text => $tsquery], 
     199                ], 
     200                (exists($searchspec->{src}) 
     201                    ? (issrc => $searchspec->{src} ? 1 : 0) 
     202                    : ()), 
     203                pkgid => 
     204                    { IN => $c->forward('distrib_search', [ $searchspec 
     205                ])->get_column('pkgid')->as_query, },  
     206                 
     207           
     208        }, 
     209        { 
     210            %$search_param, 
     211            select => [  
     212                "ts_rank_cd(to_tsvector('english', description),to_tsquery(?)) as rank", 
     213                'pkgid' 
     214            ], 
     215            bind => [ $tsquery ],  
     216            order_by => [ 'rank desc', 'name', 'evr using >>', 'issrc' ], 
     217        }, 
     218    )->all ] 
     219 
    83220} 
    84221 
  • server/trunk/web/root/templates/html/0explorer/file.tt

    r38 r40  
    44 
    55[% FOREACH file = xmlrpc %] 
     6[% info = c.forward('/rpms/info', [ file.pkgid ]) %] 
    67<a href="[% c.uri_for('/rpms', file.pkgid) %]"> 
    7     [% c.forward('/rpms/info', [ file.pkgid ]).name | html %] 
     8    [% info.name | html %]-[% info.version %]-[% info.release %].[% info.arch %] 
    89</a><br> 
    910[% END %] 
  • server/trunk/web/root/templates/html/explorer/index.html

    r38 r40  
    11 
    2 <p>[% path %]</p> 
     2<p> 
     3<a href="[% c.uri_for('/explorer') %]">/</a> 
     4[% FOREACH p = eachpath %] 
     5<a href="[% c.uri_for('/explorer', p.path) %]">[% p.dir | html %]</a> 
     6[% END %] 
     7</p> 
    38 
    49<div id="exp_dir" style="float: left; border: outset; width: 30%"> 
    510    Loading... 
    611</div> 
    7 <div id="exp_file" style="float: left; border: outset; width: 30%"> 
     12<div id="exp_file" style="float: left; border: outset; width: 60%"> 
    813    Loading... 
    914</div> 
  • server/trunk/web/root/templates/includes/header.tt

    r38 r40  
    2525        <p id="sophie_menu"> 
    2626        <span><a href="[% c.uri_for('/distrib') %]">Distribution</a></span> 
     27        <span><a href="[% c.uri_for('/explorer') %]">Explorer</a></span> 
    2728        </p> 
    2829    </div> 
  • server/trunk/web/sophie.conf.in

    r25 r40  
    55dbuser sophie 
    66dbpassword **** 
     7# max_reply 10000 
Note: See TracChangeset for help on using the changeset viewer.