Changeset 457
- Timestamp:
- 10/18/08 15:14:23 (3 years ago)
- Location:
- wiki-toolkit/trunk
- Files:
-
- 3 modified
-
Changes (modified) (1 diff)
-
lib/Wiki/Toolkit/Store/Database.pm (modified) (3 diffs)
-
t/061_list_metadata_by_type.t (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
wiki-toolkit/trunk/Changes
r454 r457 2 2 Complete support for store->list_metadata_by_type, which 3 3 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) 4 6 5 7 0.76 13 July 2008 -
wiki-toolkit/trunk/lib/Wiki/Toolkit/Store/Database.pm
r454 r457 1950 1950 } 1951 1951 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 1954 sub _current_node_id_versions { 1955 my ($self) = @_; 1956 1967 1957 my $dbh = $self->dbh; 1968 1958 1969 # Ideally we'd do this as one big query1970 # However, this would need a temporary table on many1971 # database engines, so we cheat and do it as two1972 1959 my $nv_sql = 1973 1960 "SELECT node_id, MAX(version) ". … … 1984 1971 push @nv_where, $where; 1985 1972 } 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 1986 sub 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(); 1986 1996 1987 1997 # Now the metadata bit … … 1993 2003 join(" OR ", @nv_where). 1994 2004 ")"; 1995 $sth = $dbh->prepare( $sql );2005 my $sth = $dbh->prepare( $sql ); 1996 2006 $sth->execute($type); 1997 2007 1998 2008 my $values = $sth->fetchall_arrayref([0]); 1999 2009 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 2023 sub 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) ); 2000 2045 } 2001 2046 -
wiki-toolkit/trunk/t/061_list_metadata_by_type.t
r454 r457 6 6 plan skip_all => "no backends configured"; 7 7 } else { 8 plan tests => ( 6* scalar @Wiki::Toolkit::TestLib::wiki_info );8 plan tests => ( 9 * scalar @Wiki::Toolkit::TestLib::wiki_info ); 9 9 } 10 10 … … 33 33 $wiki->write_node( "Cafe Roma", "A cafe unmod", $node{"checksum"}, 34 34 { category => [ "Cafe", "Oxford", "Unmoderated", "NotSeen" ], 35 latitude => "51.759", longitude => "-1.270" } 35 latitude => "51.759", longitude => "-1.270", 36 locale => [ "Oxford" ] }, 36 37 ); 37 38 … … 39 40 my @md; 40 41 42 41 43 # With nothing, get back undef 42 44 is($wiki->store->list_metadata_by_type(), undef, "Needs a type given"); 45 43 46 44 47 # Postcode should be easy … … 47 50 "Correct metadata listing" ); 48 51 52 49 53 # Latitude also 50 54 @md = $wiki->store->list_metadata_by_type("latitude"); 51 55 is_deeply( [sort @md], [ "51.759", "51.911" ], 52 56 "Correct metadata listing" ); 57 53 58 54 59 # For category, will not see unmoderated versio … … 57 62 "Oxford", "Restaurant", "Thai Food" ], 58 63 "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 59 69 60 70 # Now moderate that one, see it come in … … 65 75 "Correct metadata listing" ); 66 76 77 @md = $wiki->store->list_metadata_names(); 78 is_deeply( [sort @md], [ "category", "latitude", "locale", 79 "longitude", "postcode" ], 80 "Correct metadata names" ); 81 82 67 83 # And un-moderate another, see its go away 68 84 $wiki->store->dbh->do("UPDATE content SET moderated = 'f' WHERE version = 2"); … … 71 87 "Oxford", "Restaurant", "Thai Food" ], 72 88 "Correct metadata listing" ); 89 90 @md = $wiki->store->list_metadata_names(); 91 is_deeply( [sort @md], [ "category", "latitude", "longitude", "postcode" ], 92 "Correct metadata names" ); 73 93 } 74 94
