=head1 NAME Data::Downloader::MetadataPivot =head1 DESCRIPTION Represents a database view whose columns are the possible types of metadata. =cut package Data::Downloader::MetadataPivot; use Log::Log4perl qw/:easy/; use Data::Downloader::DB; use base qw(Data::Downloader::DB::Object); use strict; use warnings; # # TODO only recreate the view if the columns have changed. # sub _determine_columns { return map $_->name, @{ Data::Downloader::MetadataSource::Manager->get_metadata_sources }; } =head1 METHODS =over =item rebuild_pivot_view Rebuild the database view which is a pivoted version of the metadata. This will be called automatically whenever a repository is saved. =cut sub rebuild_pivot_view { my $class = shift; my @columns = $class->_determine_columns; my $db = $class->init_db; my $sql = join "\n", "CREATE VIEW metadata_pivot as ", "select file ", ( join " ", map ", group_concat(case name when '$_' then value else null end) as $_ ", @columns ), " from metadatum m ", " group by file"; my ($existing_sql) = $db->dbh->selectrow_array( q[select sql from sqlite_master where type='view' and name='metadata_pivot'] ); return if defined($existing_sql) && $existing_sql eq $sql; DEBUG "updating metadata pivot, metadata columns : @columns"; $db->dbh->do("drop view if exists metadata_pivot") or die $db->dbh->errstr; $db->dbh->do($sql) or die $db->dbh->errstr; } =item do_setup Set up this class. If repositories are changed, this needs to be called. =cut sub do_setup { my $self = shift; my $meta = $self->meta; $meta->table("metadata_pivot"); $meta->setup(table => "metadata_pivot", columns => [file => { type => 'int', primary_key => 1 } ]); $meta->add_column($_) for $self->_determine_columns; # rose::db::sqlite can't do views # # Make the methods in this and the DD::File classes # $meta->make_methods(replace_existing => 1); Data::Downloader::File->meta->make_methods(replace_existing => 1); } =back =head1 SEE ALSO L perl -MData::Downloader::MetadataPivot -e 'print Data::Downloader::MetadataPivot->meta->perl_class_definition' L =cut 1;