Changeset 457

Show
Ignore:
Timestamp:
10/18/08 15:14:23 (3 years ago)
Author:
nick
Message:

Add store->list_metadata_names, which will tell you all the different metadata types (names)

Location:
wiki-toolkit/trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • wiki-toolkit/trunk/Changes

    r454 r457  
    22        Complete support for store->list_metadata_by_type, which 
    33          returns a list of all the metadata values 
     4        Add store->list_metadata_names, which will tell you all the 
     5          different metadata types (names) 
    46 
    570.76    13 July 2008 
  • wiki-toolkit/trunk/lib/Wiki/Toolkit/Store/Database.pm

    r454 r457  
    19501950} 
    19511951 
    1952 =item B<list_metadata_by_type> 
    1953  
    1954     List all the currently defined values of the given type of metadata. 
    1955  
    1956     Will only return data from the latest moderated version of each node 
    1957  
    1958     # List all of the different metadata values with the type 'category' 
    1959     my @categories = $wiki->list_metadata_by_type('category'); 
    1960  
    1961 =cut 
    1962  
    1963 sub list_metadata_by_type { 
    1964     my ($self, $type) = @_; 
    1965  
    1966     return undef unless $type; 
     1952 
     1953# Internal function only, used when querying latest metadata 
     1954sub _current_node_id_versions { 
     1955    my ($self) = @_; 
     1956 
    19671957    my $dbh = $self->dbh; 
    19681958 
    1969     # Ideally we'd do this as one big query 
    1970     # However, this would need a temporary table on many 
    1971     #  database engines, so we cheat and do it as two 
    19721959    my $nv_sql =  
    19731960       "SELECT node_id, MAX(version) ". 
     
    19841971        push @nv_where, $where; 
    19851972    } 
     1973    return @nv_where; 
     1974} 
     1975 
     1976=item B<list_metadata_by_type> 
     1977 
     1978    List all the currently defined values of the given type of metadata. 
     1979 
     1980    Will only return data from the latest moderated version of each node 
     1981 
     1982    # List all of the different metadata values with the type 'category' 
     1983    my @categories = $wiki->list_metadata_by_type('category'); 
     1984 
     1985=cut 
     1986sub list_metadata_by_type { 
     1987    my ($self, $type) = @_; 
     1988 
     1989    return undef unless $type; 
     1990    my $dbh = $self->dbh; 
     1991 
     1992    # Ideally we'd do this as one big query 
     1993    # However, this would need a temporary table on many 
     1994    #  database engines, so we cheat and do it as two 
     1995    my @nv_where = $self->_current_node_id_versions(); 
    19861996 
    19871997    # Now the metadata bit 
     
    19932003       join(" OR ", @nv_where). 
    19942004       ")"; 
    1995     $sth = $dbh->prepare( $sql ); 
     2005    my $sth = $dbh->prepare( $sql ); 
    19962006    $sth->execute($type); 
    19972007 
    19982008    my $values = $sth->fetchall_arrayref([0]); 
    19992009    return ( map { $self->charset_decode( $_->[0] ) } (@$values) ); 
     2010} 
     2011 
     2012 
     2013=item B<list_metadata_names> 
     2014 
     2015    List all the currently defined kinds of metadata, eg Locale, Postcode 
     2016 
     2017    Will only return data from the latest moderated version of each node 
     2018 
     2019    # List all of the different kinds of metadata 
     2020    my @metadata_types = $wiki->list_metadata_names() 
     2021 
     2022=cut 
     2023sub list_metadata_names { 
     2024    my ($self) = @_; 
     2025 
     2026    my $dbh = $self->dbh; 
     2027 
     2028    # Ideally we'd do this as one big query 
     2029    # However, this would need a temporary table on many 
     2030    #  database engines, so we cheat and do it as two 
     2031    my @nv_where = $self->_current_node_id_versions(); 
     2032 
     2033    # Now the metadata bit 
     2034    my $sql =  
     2035       "SELECT DISTINCT metadata_type ". 
     2036       "FROM metadata ". 
     2037       "WHERE (". 
     2038       join(" OR ", @nv_where). 
     2039       ")"; 
     2040    my $sth = $dbh->prepare( $sql ); 
     2041    $sth->execute(); 
     2042 
     2043    my $types = $sth->fetchall_arrayref([0]); 
     2044    return ( map { $self->charset_decode( $_->[0] ) } (@$types) ); 
    20002045} 
    20012046 
  • wiki-toolkit/trunk/t/061_list_metadata_by_type.t

    r454 r457  
    66    plan skip_all => "no backends configured"; 
    77} else { 
    8     plan tests => ( 6 * scalar @Wiki::Toolkit::TestLib::wiki_info ); 
     8    plan tests => ( 9 * scalar @Wiki::Toolkit::TestLib::wiki_info ); 
    99} 
    1010 
     
    3333    $wiki->write_node( "Cafe Roma", "A cafe unmod", $node{"checksum"}, 
    3434        { category => [ "Cafe", "Oxford", "Unmoderated", "NotSeen" ], 
    35           latitude => "51.759", longitude => "-1.270" } 
     35          latitude => "51.759", longitude => "-1.270", 
     36          locale => [ "Oxford" ] }, 
    3637    ); 
    3738 
     
    3940    my @md; 
    4041 
     42 
    4143    # With nothing, get back undef 
    4244    is($wiki->store->list_metadata_by_type(), undef, "Needs a type given"); 
     45 
    4346 
    4447    # Postcode should be easy 
     
    4750       "Correct metadata listing" ); 
    4851 
     52 
    4953    # Latitude also 
    5054    @md = $wiki->store->list_metadata_by_type("latitude"); 
    5155    is_deeply( [sort @md], [ "51.759", "51.911" ], 
    5256       "Correct metadata listing" ); 
     57 
    5358 
    5459    # For category, will not see unmoderated versio 
     
    5762                           "Oxford", "Restaurant", "Thai Food" ], 
    5863       "Correct metadata listing" ); 
     64 
     65    @md = $wiki->store->list_metadata_names(); 
     66    is_deeply( [sort @md], [ "category", "latitude", "longitude", "postcode" ], 
     67       "Correct metadata names" ); 
     68 
    5969 
    6070    # Now moderate that one, see it come in 
     
    6575       "Correct metadata listing" ); 
    6676 
     77    @md = $wiki->store->list_metadata_names(); 
     78    is_deeply( [sort @md], [ "category", "latitude", "locale", 
     79                             "longitude", "postcode" ], 
     80       "Correct metadata names" ); 
     81 
     82 
    6783    # And un-moderate another, see its go away 
    6884    $wiki->store->dbh->do("UPDATE content SET moderated = 'f' WHERE version = 2"); 
     
    7187                           "Oxford", "Restaurant", "Thai Food" ], 
    7288       "Correct metadata listing" ); 
     89 
     90    @md = $wiki->store->list_metadata_names(); 
     91    is_deeply( [sort @md], [ "category", "latitude", "longitude", "postcode" ], 
     92       "Correct metadata names" ); 
    7393} 
    7494