[prev] [thread] [next] [Date index for 2004/07/27]
--Apple-Mail-7-988336482 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed Sorry, cleaned up a duplicate variable name. --Apple-Mail-7-988336482 Content-Transfer-Encoding: 7bit Content-Type: application/octet-stream; x-unix-mode=0644; name="class_dbi_mysql_limit.patch" Content-Disposition: attachment; filename=class_dbi_mysql_limit.patch diff -r -u Class-DBI-mysql-0.23/lib/Class/DBI/mysql.pm Class-DBI-mysql-0.23_jason/lib/Class/DBI/mysql.pm --- Class-DBI-mysql-0.23/lib/Class/DBI/mysql.pm 2004-02-28 04:19:47.000000000 -0600 +++ Class-DBI-mysql-0.23_jason/lib/Class/DBI/mysql.pm 2004-07-27 16:09:46.000000000 -0500 @@ -35,6 +35,7 @@ =head1 METHODS + =head2 set_up_table __PACKAGE__->set_up_table("table_name"); @@ -211,6 +212,70 @@ return $class->count_all(@_); } +=head2 _do_search + +Overrides Class::DBI _do_search() method to provide for more MySQL specific features, such +as LIMIT clauses. + +This function should NOT be called directly. It is automatically called when +you do $obj->search() or $obj->search_like(). + +=cut + +sub _do_search { + my ($proto, $search_type, @args) = @_; + my $class = ref $proto || $proto; + + @args = %{ $args[0] } if ref $args[0] eq "HASH"; + my (@cols, @vals); + my $search_opts = @args % 2 ? pop @args : {}; + while (my ($col, $val) = splice @args, 0, 2) { + my $column = $class->find_column($col) + || (List::Util::first { $_->accessor eq $col } $class->columns) + || $class->_croak("$col is not a column of $class"); + push @cols, $column; + push @vals, $class->_deflated_column($column, $val); + } + + my $frag = join " AND ", + map defined($vals[$_]) ? "$cols[$_] $search_type ?" : "$cols[$_] IS NULL", + 0 .. $#cols; + # ORDERING + $frag .= " ORDER BY $search_opts->{order_by}" + if $search_opts->{order_by}; + + # LIMITING + if ( defined $search_opts->{limit} ) { + if ( $search_opts->{limit} =~ m/^(\d+\s?,\s?)?\d+$/ ) { + $frag .= " LIMIT $search_opts->{limit}" + } else { + $class->_croak("LIMIT can only be a number (10), or 2 numbers separated by commas ( 1, 2 ), not '$search_opts->{limit}'."); + } + } + + return $class->sth_to_objects($class->sql_Retrieve($frag), + [ grep defined, @vals ]); + +} + +=head2 search and search_like + +These functions are the same as they are Class::DBI proper, except they will +also accept a limit clause in the search params, like so: + + # This will return only the first 5 rows: + __PACKAGE__->search( artist => "The Beatles", { limit => 5 } ); + + # This will return only 5 rows, starting from the 3rd row: + __PACKAGE__->search( artist => "The Beatles", { limit => "2, 5" } ); + + # can also be combined with order_by: + __PACKAGE__->search( artist => "The Beatles", + { order_by => "album DESC", limit => "2, 5" } ); + +=cut + + =head1 COPYRIGHT Copyright (C) 2001-2004 Tony Bowden. All rights reserved. Only in Class-DBI-mysql-0.23_jason/: Makefile.old diff -r -u Class-DBI-mysql-0.23/t/mysql.t Class-DBI-mysql-0.23_jason/t/mysql.t --- Class-DBI-mysql-0.23/t/mysql.t 2004-02-28 04:16:09.000000000 -0600 +++ Class-DBI-mysql-0.23_jason/t/mysql.t 2004-07-27 16:43:32.000000000 -0500 @@ -5,7 +5,7 @@ my $HAVE_TP = eval { require Time::Piece::MySQL }; -plan tests => 11; +plan tests => 21; use_ok "Class::DBI::mysql"; @@ -37,7 +37,7 @@ __PACKAGE__->set_up_table; __PACKAGE__->autoinflate(dates => 'Time::Piece') if $HAVE_TP; -END { __PACKAGE__->drop_table } +# END { __PACKAGE__->drop_table } #------------------------------------------------------------------------- @@ -80,4 +80,60 @@ eval { Foo->enum_vals('mydate') }; ok $@, $@; +# Test overriden search methods +my @searched_recs1 = Foo->search( name => "Full-text indexes" ); +is @searched_recs1, 1, "Overridden normal search works."; + +my @searched_recs2 = Foo->search_like( name => "support collections" ); +is @searched_recs2, 1, "Overridden normal search_like works."; + +my @limit_1 = Foo->search_like( name => "%", + { order_by => "name ASC", limit => 1} ); +is @limit_1, 1, "Limit 1 returns proper number of rows"; +# should return +# +-------------------------------+ +# | name | +# +-------------------------------+ +# | are called collections | +# | for full-text search | +# | Full-text indexes | +# | Full-text search in MySQL | +# | Function MATCH ... AGAINST() | +# | implements vector space model | +# | is used to do a search | +# | MySQL has now support | +# | Only MyISAM tables | +# | support collections | +# +-------------------------------+ + + +my @limit_2 = Foo->search_like( name => "%", + { order_by => "name ASC", limit => 2} ); +is @limit_2, 2, "Limit 2 returns proper number of rows"; + +my @limit_3 = Foo->search_like( name => "%", + { order_by => "name ASC", limit => "1, 3"} ); +is @limit_3, 3, "Limit 1, 3 returns proper number of rows"; + +# should return +# +-------------------------------+ +# | name | +# +-------------------------------+ +# | for full-text search | +# | Full-text indexes | +# | Full-text search in MySQL | +# +-------------------------------+ + +is $limit_3[0]->Name, "for full-text search", "First row is correct"; +is $limit_3[1]->Name, "Full-text indexes", "Second row is correct"; +is $limit_3[2]->Name, "Full-text search in MySQL", "Third row is correct"; + +my @limit_0 = Foo->search_like( name => "%", + { order_by => "name ASC", limit => "0"} ); +is @limit_0, 0, "Limit 0 returns empty set"; + + +eval { Foo->search_like( name => "%", + { order_by => "name ASC", limit => "z"} ); }; +ok $@, "Invalid Limit param croaks: $@"; --Apple-Mail-7-988336482 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed -jason scott gessner jason@xxxxxxxx.xxx --Apple-Mail-7-988336482--
warning cleanup
|
Generated at 11:35 on 01 Dec 2004 by mariachi v0.52