From ac55da631e88dd88657f4acd4113d6cd29bf2aa4 Mon Sep 17 00:00:00 2001 From: dakkar Date: Mon, 7 Nov 2005 16:25:39 +0000 Subject: aggiunto retrieve per tag multipli --- lib/Bookmarks/C/Main.pm | 14 ++++---- lib/Bookmarks/M/DB/Tags.pm | 16 +++++---- lib/Bookmarks/M/TagSet.pm | 89 ++++++++++++++++++++++++++++++++++++++++++++++ root/links | 6 +++- 4 files changed, 111 insertions(+), 14 deletions(-) create mode 100644 lib/Bookmarks/M/TagSet.pm diff --git a/lib/Bookmarks/C/Main.pm b/lib/Bookmarks/C/Main.pm index aa71f34..3434e00 100644 --- a/lib/Bookmarks/C/Main.pm +++ b/lib/Bookmarks/C/Main.pm @@ -32,16 +32,16 @@ sub tags : Global { sub tag : Regex('^tag/(.*)$') { my ( $self, $c ) = @_; - my $tagname=$c->req->snippets->[0]; - my ($tag)=Bookmarks::M::DB::Tags->search({name=>$tagname}); - if (!defined $tag) { - $c->stash->{tagname}=$tagname; + my @tagnames=split /\+/,$c->req->snippets->[0]; + my ($tagset)=Bookmarks::M::TagSet->retrieve({tags=>[@tagnames]}); + if (!defined $tagset) { + $c->stash->{tagnames}=[@tagnames]; $c->stash->{template}='notag'; } else { - my @links=$tag->ordered_links(); - my @related_tags=$tag->related_tags(); - $c->stash->{tag}=$tag; + my @links=$tagset->ordered_links(); + my @related_tags=$tagset->related_tags(); + $c->stash->{tagset}=$tagset; $c->stash->{links}=[@links]; $c->stash->{related}=[@related_tags]; $c->stash->{template}='links'; diff --git a/lib/Bookmarks/M/DB/Tags.pm b/lib/Bookmarks/M/DB/Tags.pm index b01695a..3686a7d 100644 --- a/lib/Bookmarks/M/DB/Tags.pm +++ b/lib/Bookmarks/M/DB/Tags.pm @@ -1,9 +1,10 @@ package Bookmarks::M::DB::Tags; - +use Bookmarks::M::DB::LinksTags; use strict; __PACKAGE__->has_many( links => ['Bookmarks::M::DB::LinksTags' => 'link'] ); +# magari ordiniamoli per popolrità __PACKAGE__->set_sql('related_tags', <<'END_SQL'); SELECT DISTINCT tags.pk FROM tags, links_tags lt1, links_tags lt2 @@ -38,14 +39,17 @@ sub get_all_tags_by_popularity { return $_[0]->search_popularity(); } +sub links_sorter($$) { + return + ($_[1]->access_count || 0) + <=> + ($_[0]->access_count || 0) +} + sub ordered_links { my ($self)=@_; my @links=$self->links(); - return sort { - ($b->access_count || 0) - <=> - ($a->access_count || 0) - } @links; + return sort links_sorter @links; } =head1 NAME diff --git a/lib/Bookmarks/M/TagSet.pm b/lib/Bookmarks/M/TagSet.pm new file mode 100644 index 0000000..aa84783 --- /dev/null +++ b/lib/Bookmarks/M/TagSet.pm @@ -0,0 +1,89 @@ +package Bookmarks::M::TagSet; +use base 'Catalyst::Base'; +use Bookmarks::M::DB::Tags; + +our $VERSION='0.1'; + +sub retrieve { + my ($class, $opts)=@_; + + return unless defined $opts->{tags}; + return unless ref($opts->{tags}) eq 'ARRAY'; + my @tagnames=@{$opts->{tags}}; + return unless @tagnames; + + my @tags=map { + (Bookmarks::M::DB::Tags->search({name=>$_}))[0] + or return; + } @tagnames; + + my $self=bless {tags=>[@tags]},$class; +} + +sub size { + my ($self)=@_; + return scalar @{$self->{tags}}; +} + +sub tags { + my ($self)=@_; + return @{$self->{tags}}; +} + +sub unite_stuff { + my ($generator,$key)=@_; + + my %set=(); + while (my @slice=$generator->()) { + for my $item (@slice) { + $set{$key->($item)}||=$item; + } + } + + return values %set; +} + +sub intersect_stuff { + my ($generator,$key)=@_; + + my $count=0; + my %set=(); + while (my @slice=$generator->()) { + $count++; + for my $item (@slice) { + my $this_key=$key->($item); + $set{$this_key}||=[$item,0]; + $set{$this_key}->[1]++; + } + } + + return map { $_->[0] } grep { $_->[1] == $count } values %set; +} + +sub ordered_links { + my ($self)=@_; + + my @tags=@{$self->{tags}}; + # intersezione dei link, per chiave primaria + my @links=intersect_stuff( + sub { return unless @tags; return (shift @tags)->ordered_links() }, + sub { "$_[0]" } + ); + + return sort Bookmarks::M::DB::Tags::links_sorter @links; +} + +sub related_tags { + my ($self)=@_; + + my @tags=@{$self->{tags}}; + # intersezione dei related + my @related=intersect_stuff( + sub { return unless @tags; return (shift @tags)->related_tags() }, + sub { "$_[0]" } + ); + + return @related; +} + +1; diff --git a/root/links b/root/links index 62321c7..40bfa51 100644 --- a/root/links +++ b/root/links @@ -3,7 +3,11 @@ links -

Tag: [% tag.name %] ( [% tag.descr %] )

+

+[% IF tagset.size() == 1 %]Tag:[% ELSE %]Tags:[% END %] +[% FOR tag IN tagset.tags %] + [% tag.name %] ( [% tag.descr %] ) - +[% END %]

Related: