[prev] [thread] [next] [Date index for 2004/07/28]
--Apple-Mail-3-1055570914 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed Taking a cue from mark addison, i have added a new method to C::DBI and greatly simplified the implementation in C::DBI::mysql. Basically, there is a new method added to C::DBI called _make_limit_frag, which returns '' Then, in C::DBI::mysql, i removed everything except the limit fragment logic and renamed it _make_limit_frag. My new tests pass, as well as the C::DBI tests. I am going to try this out on my mac, as well as my linux box, but feedback is needed from everyone else on the list! Thanks!!! --Apple-Mail-3-1055570914 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 Only in Class-DBI-mysql-0.23_jason/: blib 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-28 09:23:56.000000000 -0500 @@ -35,6 +35,7 @@ =head1 METHODS + =head2 set_up_table __PACKAGE__->set_up_table("table_name"); @@ -211,6 +212,50 @@ return $class->count_all(@_); } +=head2 _make_limit_frag + +Provides Class::DBI::_do_search() method with a method to provide for MySQL specific LIMIT clauses. + +This function should NOT be called directly. It is automatically called when +you do $obj->search() or $obj->search_like(). + +=cut + +sub _make_limit_frag { + my ($proto, $limit_args ) = @_; + my $class = ref $proto || $proto; + + my $frag = ''; + + if ( defined $limit_args ) { + if ( $limit_args =~ m/^(\d+\s?,\s?)?\d+$/ ) { + $frag .= " LIMIT $limit_args" + } else { + $class->_croak("LIMIT can only be a number (10), or 2 numbers separated by commas ( 1, 2 ), not '$limit_args'."); + } + } + + return $frag; +} + +=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 Only in Class-DBI-mysql-0.23_jason/: Makefile.old Only in Class-DBI-mysql-0.23_jason/: pm_to_blib 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-3-1055570914 Content-Transfer-Encoding: 7bit Content-Type: application/octet-stream; x-unix-mode=0644; name="class_dbi_make_limit_frag.patch" Content-Disposition: attachment; filename=class_dbi_make_limit_frag.patch Only in Class-DBI-0.96_jason/: blib diff -r -u Class-DBI-0.96/lib/Class/DBI.pm Class-DBI-0.96_jason/lib/Class/DBI.pm --- Class-DBI-0.96/lib/Class/DBI.pm 2004-04-30 02:22:12.000000000 -0500 +++ Class-DBI-0.96_jason/lib/Class/DBI.pm 2004-07-28 11:19:56.000000000 -0500 @@ -1090,11 +1090,25 @@ 0 .. $#cols; $frag .= " ORDER BY $search_opts->{order_by}" if $search_opts->{order_by}; - return $class->sth_to_objects($class->sql_Retrieve($frag), + + # added _make_limit_frag, which is designed to be subclassed + $frag .= $class->_make_limit_frag( $search_opts->{limit} ) + if defined $search_opts->{limit}; + + return $class->sth_to_objects($class->sql_Retrieve($frag), [ grep defined, @vals ]); } +# _make_limit_frag + +# Simple sub returns empty string for now. Subclasses of Class::DBI should +# override this to provide for database specific limit functionality. For an +# example implementation, see L<Class::DBI::mysql> +sub _make_limit_frag { + return ''; +} + #---------------------------------------------------------------------- # CONSTRUCTORS #---------------------------------------------------------------------- Only in Class-DBI-0.96_jason/: Makefile Only in Class-DBI-0.96_jason/: pm_to_blib --Apple-Mail-3-1055570914 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed -jason scott gessner jason@xxxxxxxx.xxx --Apple-Mail-3-1055570914--
Updated Limit Patch for C::DBI & C::DBI::MySQL
|
Re: Updated Limit Patch for C::DBI & C::DBI::MySQL
|
Re: Updated Limit Patch for C::DBI & C::DBI::MySQL
|
Re: Updated Limit Patch for C::DBI & C::DBI::MySQL
|
Generated at 11:34 on 01 Dec 2004 by mariachi v0.52