summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@luxion>2005-11-07 16:25:39 +0000
committerdakkar <dakkar@luxion>2005-11-07 16:25:39 +0000
commitac55da631e88dd88657f4acd4113d6cd29bf2aa4 (patch)
tree968ad0b481788031216423f565d4c838441b0233
parent r705@narval2: dakkar | 2005-10-21 18:39:41 +0200 (diff)
downloadBookmarks-ac55da631e88dd88657f4acd4113d6cd29bf2aa4.tar.gz
Bookmarks-ac55da631e88dd88657f4acd4113d6cd29bf2aa4.tar.bz2
Bookmarks-ac55da631e88dd88657f4acd4113d6cd29bf2aa4.zip
aggiunto retrieve per tag multipli
-rw-r--r--lib/Bookmarks/C/Main.pm14
-rw-r--r--lib/Bookmarks/M/DB/Tags.pm16
-rw-r--r--lib/Bookmarks/M/TagSet.pm89
-rw-r--r--root/links6
4 files changed, 111 insertions, 14 deletions
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 @@
<title>links</title>
</head>
<body>
-<p>Tag: [% tag.name %] ( [% tag.descr %] )</p>
+<p>
+[% IF tagset.size() == 1 %]Tag:[% ELSE %]Tags:[% END %]
+[% FOR tag IN tagset.tags %]
+ [% tag.name %] ( [% tag.descr %] ) -
+[% END %]</p>
<p>Related:</p>
<ul>
[% FOR rtag IN related %]