From: Simon Cozens Date: Wed, 11 Apr 2007 21:08:04 +0000 (+0000) Subject: HIGHLY EXPERIMENTAL - first stage of getting Tagtools to do what it was made for X-Git-Tag: 1.2+svn20070808~4 X-Git-Url: https://git.decadent.org.uk/gitweb/?p=memories.git;a=commitdiff_plain;h=857662436716c74a68a28b32aa55f2a468a0e4d2 HIGHLY EXPERIMENTAL - first stage of getting Tagtools to do what it was made for git-svn-id: http://svn.simon-cozens.org/memories/trunk@64 041978f6-d955-411f-a9d7-1d8545c9c3c7 --- diff --git a/Memories.pm b/Memories.pm index 1a0b994..43f9a3e 100644 --- a/Memories.pm +++ b/Memories.pm @@ -4,6 +4,7 @@ our $VERSION = "1.2"; use Maypole::Application qw(Authentication::UserSessionCookie); use HTML::TagCloud; use URI; +use Tagtools; use Memories::Config; use Memories::DBI; use Memories::Photo; @@ -15,12 +16,12 @@ use Memories::Album; use URI::Escape; use Calendar::Simple; use XML::RSS; -use Tagtools; Memories->config->auth->{ user_field } = "name"; Memories->config->model("Maypole::Model::CDBI::Plain"); Memories->setup([qw/ Memories::Photo Memories::User Memories::Tag Memories::Album Memories::SystemTag/]); +Memories->setup_tagging("photo"); sub message { my ($self, $message) = @_; diff --git a/Memories/Tag.pm b/Memories/Tag.pm index 744a98a..3354489 100644 --- a/Memories/Tag.pm +++ b/Memories/Tag.pm @@ -74,22 +74,8 @@ sub list_js :Exported { package Memories::Tagging; use base qw(Memories::DBI); -use Class::DBI::Pager; -__PACKAGE__->columns(TEMP => qw/count/); -__PACKAGE__->columns(Essential => qw/id tag photo/); -__PACKAGE__->set_sql(summary => qq/ -SELECT id, tag, count(*) AS count -FROM tagging -GROUP BY tag -ORDER BY count DESC -LIMIT 75 - /); -__PACKAGE__->set_sql(all => qq/ -SELECT id, tag, count(*) AS count -FROM tagging -GROUP BY tag -ORDER BY count DESC - /); + + __PACKAGE__->set_sql(user_summary => qq/ SELECT tagging.id id, tag, count(*) AS count FROM tagging, photo @@ -98,12 +84,4 @@ GROUP BY tag ORDER BY count DESC /); -Memories::Tagging->has_a("photo" => "Memories::Photo"); -Memories::Tagging->has_a("tag" => "Memories::Tag"); - -Memories::Photo->has_many(tags => ["Memories::Tagging" => "tag"]); -Memories::Photo->has_many(taggings => "Memories::Tagging"); -Memories::Tag->has_many(photos => ["Memories::Tagging" => "photo"] ); -Memories::Tag->has_many(taggings => "Memories::Tagging"); - 1; diff --git a/Tagtools.pm b/Tagtools.pm index f161c47..04e2f63 100644 --- a/Tagtools.pm +++ b/Tagtools.pm @@ -1,4 +1,5 @@ package Tagtools; +use Lingua::EN::Inflect::Number qw(to_PL); use URI::Escape; use HTML::TagCloud; use Carp; @@ -6,6 +7,7 @@ use Cache::FileCache; use Storable qw(freeze); use MIME::Base64; use Calendar::Simple; use Text::Balanced qw(extract_multiple extract_quotelike); + sub import { my $whence = caller; my ($class) = @_; @@ -55,7 +57,53 @@ sub import { for my $thing (qw(tagcloud calendar)) { *{$whence."::$thing"} = sub { shift->do_cached(\&{$whence."::_".$thing}, @_) } } + *{$whence."::setup_tagging"} = \&Tagtools::_setup_tagging; +} + +sub _setup_tagging { + my ($maypole_class, $target_table, $tag_table_name) = @_; + my $class_for = sub { + $maypole_class->config->model->class_of($maypole_class, shift) + }; + $tag_table_name ||= "tag"; + my $target = $class_for->($target_table) + || die "Couldn't find a class representing $target_table"; + my $via_table = $tag_table_name . "ging"; + + # Does the tag table exist? + # If not create it or at least moan + # If so configure it as a new class + + # At this point, the $via_table should now be able to be named as... + my $tag_class = $class_for->($tag_table_name); + my $via_table = $tag_table_name."ging"; + my $via = $tag_class."ging"; + # Set up the class + @{$via."::ISA"} = @{$tag_class."::ISA"}; + $via->columns(TEMP => qw/count/); + $via->columns(Essential => "id", $tag_table_name, $target_table); + # Set up the auxilliary methods + $via->set_sql(summary => qq/ + SELECT id, $tag_table_name, count(*) AS count + FROM $via_table + GROUP BY $tag_table_name + ORDER BY count DESC + LIMIT 50 + /); + $via->set_sql(all => qq/ + SELECT id, $tag_table_name, count(*) AS count + FROM $via_table + GROUP BY $tag_table_name + ORDER BY count DESC + /); + # Set up the has_many relations + $via->has_a($target_table => $target); + $via->has_a($tag_table_name => $tag_class); + $target->has_many(to_PL($tag_table_name) => [ $via => $tag_table_name ]); + $target->has_many(to_PL($via) => $via); + $tag_class->has_many(to_PL($target_table) => [ $via => $target_table ]); + $tag_class->has_many(to_PL($via_table) => $via); } sub separate_tags {