Changeset 94

Show
Ignore:
Timestamp:
06/23/05 19:28:42 (3 years ago)
Author:
ogawa
Message:

Now support Request caching for DB when PluginData? is not available.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • tagwire/trunk/tagwire.pl

    r93 r94  
    1313use MT::Template::Context; 
    1414 
     15# DEBUG 
     16my $FORCE_PD_REFRESH = 0; 
     17my $ENABLE_PD_INDEXES = 1; 
     18my $ENABLE_REQ_CACHE = 1; 
     19 
    1520my $plugin; 
    1621eval { 
     
    2429 
    2530if (MT->can('add_callback')) { 
    26   my $mt = MT->instance; 
    27   MT->add_callback((ref $mt eq 'MT::App::CMS' ? 'AppPostEntrySave' : 'MT::Entry::post_save'), 
    28                    10, $plugin, \&update_indexes); 
    29 } 
    30  
    31 my $FORCE_REFRESH = 0; 
    32 sub update_indexes { 
     31    my $mt = MT->instance; 
     32    MT->add_callback((ref $mt eq 'MT::App::CMS' ? 'AppPostEntrySave' : 'MT::Entry::post_save'), 
     33                     10, $plugin, \&update_pd_indexes); 
     34} 
     35 
     36sub update_pd_indexes { 
     37    return unless $ENABLE_PD_INDEXES && $plugin; 
    3338    my ($eh, $app, $entry) = @_; 
    34     return unless $plugin; 
    3539    require MT::Entry; 
    3640    my $blog_id = $entry->blog_id; 
     
    4044    my (%eindex, %tindex); 
    4145    my $data; 
    42     if (!$pd || $FORCE_REFRESH) { 
     46    if (!$pd || $FORCE_PD_REFRESH) { 
    4347        $pd = new MT::PluginData(); 
    4448        $pd->plugin($plugin->name); 
     
    7882MT::Template::Context->add_tag('TagsTotal' => \&tags_total); 
    7983MT::Template::Context->add_tag('TagsTotalSum' => \&tags_total_sum); 
    80 MT::Template::Context->add_container_tag('EntriesWithKeywords' => \&entries_with_keywords); 
     84MT::Template::Context->add_container_tag('EntriesWithTags' => \&entries); 
    8185MT::Template::Context->add_container_tag('MostRelatedEntries' => \&most_related_entries); 
    8286 
    83 # For compatibility (this plugin formely named AllKeywords Plugin) 
     87# For compatibility (this plugin was formerly named 'AllKeywords') 
    8488MT::Template::Context->add_container_tag('AllKeywords' => \&tags); 
    8589MT::Template::Context->add_container_tag('EntryAllKeywords' => \&entry_tags); 
     
    8892MT::Template::Context->add_tag('AllKeywordsTotal' => \&tags_total); 
    8993MT::Template::Context->add_tag('AllKeywordsTotalSum' => \&tags_total_sum); 
     94MT::Template::Context->add_container_tag('EntriesWithKeywords' => \&entries); 
    9095 
    9196sub split_args { 
     
    131136 
    132137use MT::Request; 
    133 sub get_pdata { 
    134     return undef unless $plugin; 
    135     my ($blog_id) = @_; 
    136     my $r = MT::Request->instance; 
    137     my $cache = $r->cache('Tagwire::Cache'); 
    138     return $cache->{data} if $cache && ($cache->{blog_id} == $blog_id); 
    139     $r->cache('Tagwire::Cache', undef); 
    140      
     138sub get_pd_indexes { 
     139    return unless $ENABLE_PD_INDEXES && $plugin; 
     140    my $blog_id = $_[0] or return; 
     141    my ($r, $cname); 
     142    if ($ENABLE_REQ_CACHE) { 
     143        $r = MT::Request->instance; 
     144        $cname = 'Tagwire::Cache::' . $blog_id; 
     145        return $r->cache($cname) if defined $r->cache($cname); 
     146        $r->cache($cname, undef); 
     147    } 
    141148    my $data; 
    142149    eval { 
     
    146153        $data = $pd->data() if $pd; 
    147154    }; 
    148     if ($data) { 
    149         $cache->{blog_id} = $blog_id; 
    150         $cache->{data} = $data; 
    151         $r->cache('Tagwire::Cache', $cache); 
    152     } 
     155    $r->cache($cname, $data) if $ENABLE_REQ_CACHE && $data; 
     156    $data; 
     157} 
     158 
     159sub get_db_indexes { 
     160    my $blog_id = $_[0] or return; 
     161    my ($r, $cname); 
     162    if ($ENABLE_REQ_CACHE) { 
     163        $r = MT::Request->instance; 
     164        $cname = 'Tagwire::Cache::' . $blog_id; 
     165        return $r->cache($cname) if defined $r->cache($cname); 
     166        $r->cache($cname, undef); 
     167    } 
     168    my $data; 
     169    my (%eindex, %tindex); 
     170    my $iter = MT::Entry->load_iter({ blog_id => $blog_id, 
     171                                      status => MT::Entry::RELEASE() }); 
     172    while (my $e = $iter->()) { 
     173        my @tags = split_tags($e->keywords, 1) or next; 
     174        $eindex{$e->id} = { tags => \@tags, 
     175                            created_on => $e->created_on }; 
     176    } 
     177    foreach my $eid (keys %eindex) { 
     178        map { push @{$tindex{$_}}, $eid } @{$eindex{$eid}->{tags}}; 
     179    } 
     180    $data->{eindex} = \%eindex; 
     181    $data->{tindex} = \%tindex; 
     182    $r->cache($cname, $data) if $ENABLE_REQ_CACHE; 
    153183    $data; 
    154184} 
     
    158188 
    159189    # sort_by option (tag/tag-case/count, default = tag) 
    160     my $sort_by = $args->{sort_by} || 'keyword'; 
     190    my $sort_by = $args->{sort_by} || 'tag'; 
    161191    # sort_order option (ascend/descend, default = ascend) 
    162192    my $sort_order = $args->{sort_order} || 'ascend'; 
     
    170200    my %tags = (); 
    171201 
    172     my $data = get_pdata($blog_id); 
     202    my $data = get_pd_indexes($blog_id) || get_db_indexes($blog_id); 
    173203    if ($data) { 
    174204        my %tindex = %{$data->{tindex}}; 
     
    234264    my ($ctx, $args, $cond) = @_; 
    235265    my $e = $ctx->stash('entry') 
    236         or return $ctx->_no_entry_error('MTEntryTas'); 
     266        or return $ctx->_no_entry_error('MT' . $ctx->stash('tag')); 
    237267    return '' unless $e->keywords; 
    238268 
     
    276306} 
    277307 
    278 sub entries_with_keywords { 
     308sub entries { 
    279309    my ($ctx, $args, $cond) = @_; 
    280310 
    281     # keywords option (must be specified) 
    282     my $keywords = $args->{keywords} or return ''; 
     311    # tags(keywords) option (REQUIRED) 
     312    my $search = $args->{tags} || $args->{keywords} or return ''; 
    283313    # delimiter option (default = space characters) 
    284314    my $delimiter = $args->{delimiter} || ''; 
     
    288318    # sort_by option (title/status/created_on/modified_on/author_id/excerpt, default = created_on) 
    289319    my $sort_by = $args->{sort_by} || 'created_on'; 
    290     # sort_order option (ascend/descend, default = ascend) 
     320    # sort_order option (ascend/descend, default = descend) 
    291321    my $sort_order = $args->{sort_order} || 'descend'; 
    292322    # lastn option (default = 0, no cutoff) 
     
    295325    my $blog_id = $ctx->stash('blog_id'); 
    296326    my @entries; 
    297     my @patterns = split_args($keywords, $delimiter, $case_sensitive); 
    298  
    299     my $data = get_pdata($blog_id); 
     327    my @patterns = split_args($search, $delimiter, $case_sensitive); 
     328 
     329    my $data = get_pd_indexes($blog_id) || get_db_indexes($blog_id); 
    300330    if ($data) { 
    301331        my %tindex = %{$data->{tindex}}; 
     
    305335            foreach my $tag (@patterns) { 
    306336                foreach my $eid (@{$tindex{$tag}}) { 
    307                     $match{$eid} = exists $match{$eid} ? 
    308                         $match{$eid} + 1 : 1; 
     337                    $match{$eid} = exists $match{$eid} ? $match{$eid} + 1 : 1; 
    309338                } 
    310339            } 
    311340        } else { 
    312341            foreach my $tag (@patterns) { 
    313                 foreach my $mtag (grep { lc $_ == $tag } keys %tindex) { 
     342                foreach my $mtag (grep { lc $_ eq $tag } keys %tindex) { 
    314343                    foreach my $eid (@{$tindex{$mtag}}) { 
    315                         $match{$eid} = exists $match{$eid} ? 
    316                             $match{$eid} + 1 : 1; 
     344                        $match{$eid} = exists $match{$eid} ? $match{$eid} + 1 : 1; 
    317345                    } 
    318346                } 
     
    322350        my @eids = grep { $match{$_} == $count } keys %match or return; 
    323351        @eids = sort { $eindex{$b}->{created_on} <=> $eindex{$a}->{created_on} } @eids; 
     352        @eids = $sort_order eq 'descend' ? 
     353            sort { $eindex{$b}->{created_on} <=> $eindex{$a}->{created_on} } @eids : 
     354            sort { $eindex{$a}->{created_on} <=> $eindex{$b}->{created_on} } @eids; 
    324355        require MT::Entry; 
    325356        map { push @entries, MT::Entry->load($_) } @eids; 
    326         # The above code is sticked to "created_on", "descend". 
     357        # The above code is sticked to "created_on". 
    327358    } else { 
    328359        require MT::Entry; 
     
    378409    my ($ctx, $args, $cond) = @_; 
    379410    my $entry = $ctx->stash('entry') 
    380         or return $ctx->_no_entry_error('MTMostRelatedEntries'); 
     411        or return $ctx->_no_entry_error('MT' . $ctx->stash('tag')); 
    381412    return '' unless $entry->keywords; 
    382413 
     
    394425    my %match = (); 
    395426 
    396     my $data = get_pdata($blog_id); 
     427    my $data = get_pd_indexes($blog_id) || get_db_indexes($blog_id); 
    397428    if ($data) { 
    398429        my %tindex = %{$data->{tindex}}; 
     
    409440        } else { 
    410441            foreach my $tag (@patterns) { 
    411                 foreach my $mtag (grep { lc $_ == $tag } keys %tindex) { 
     442                foreach my $mtag (grep { lc $_ eq $tag } keys %tindex) { 
    412443                    foreach my $eid (@{$tindex{$mtag}}) { 
    413444                        next if $eid == $entry->id; 
     
    492523    my $args = shift; 
    493524    require MT::Entry; 
    494     my $blog_id = $args->{blog_id} or 
    495         MT->error('A Blog ID is required.'); 
     525    my $blog_id = $args->{blog_id} or MT->error('Blog ID is required.'); 
    496526    my $sort_by = $args->{sort_by} || 'created_on'; 
    497527    my $sort_order = $args->{sort_order} || 'descend'; 
     
    503533    my @patterns = split_args($args->{search}, $delimiter, $case_sensitive); 
    504534 
    505     my $data = get_pdata($blog_id); 
     535    my $data = get_pd_indexes($blog_id) || get_db_indexes($blog_id); 
    506536    if ($data) { 
    507537        my %tindex = %{$data->{tindex}}; 
     
    517547        } else { 
    518548            foreach my $tag (@patterns) { 
    519                 foreach my $mtag (grep { lc $_ == $tag } keys %tindex) { 
     549                foreach my $mtag (grep { lc $_ eq $tag } keys %tindex) { 
    520550                    foreach my $eid (@{$tindex{$mtag}}) { 
    521551                        $match{$eid} = exists $match{$eid} ? 
     
    528558        my @eids = grep { $match{$_} == $count } keys %match 
    529559            or return; 
    530         @eids = sort { $eindex{$b}->{created_on} <=> $eindex{$a}->{created_on} } @eids; 
     560        @eids = $sort_order eq 'descend' ? 
     561            sort { $eindex{$b}->{created_on} <=> $eindex{$a}->{created_on} } @eids : 
     562            sort { $eindex{$a}->{created_on} <=> $eindex{$b}->{created_on} } @eids; 
    531563        require MT::Entry; 
    532564        map { push @results, MT::Entry->load($_) } @eids; 
    533         # The above code is sticked to "created_on", "descend". 
     565        # The above code is sticked to "created_on". 
    534566    } else { 
    535567        my $iter = MT::Entry->load_iter({ blog_id => $blog_id,