X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F42toplimit.t;h=242e62325317f537b9c53674f5819c7619e8d0ca;hb=a33d2444e0981129eb060521de27c5e2104f37ba;hp=96c4fa83a3dab2b3f7d71c4b03c13f39aac792d5;hpb=07dc2055e959594655d2fd8103330926e0f57030;p=dbsrgits%2FDBIx-Class.git diff --git a/t/42toplimit.t b/t/42toplimit.t index 96c4fa8..242e623 100644 --- a/t/42toplimit.t +++ b/t/42toplimit.t @@ -10,12 +10,31 @@ my $schema = DBICTest->init_schema; # Trick the sqlite DB to use Top limit emulation # We could test all of this via $sq->$op directly, -# but some conditions needs a $rsrc +# but some conditions need a $rsrc delete $schema->storage->_sql_maker->{_cached_syntax}; $schema->storage->_sql_maker->limit_dialect ('Top'); my $rs = $schema->resultset ('BooksInLibrary')->search ({}, { prefetch => 'owner', rows => 1, offset => 3 }); +sub default_test_order { + my $order_by = shift; + is_same_sql_bind( + $rs->search ({}, {order_by => $order_by})->as_query, + "(SELECT + TOP 1 me__id, source, owner, title, price, owner__id, name FROM + (SELECT + TOP 4 me.id AS me__id, me.source, me.owner, me.title, me.price, owner.id AS owner__id, owner.name + FROM books me + JOIN owners owner ON + owner.id = me.owner + WHERE ( source = ? ) + ORDER BY me__id ASC + ) me ORDER BY me__id DESC + )", + [ [ source => 'Library' ] ], + ); +} + sub test_order { my $args = shift; @@ -26,13 +45,18 @@ sub test_order { is_same_sql_bind( $rs->search ({}, {order_by => $args->{order_by}})->as_query, - "( - SELECT * FROM ( - SELECT TOP 1 * FROM ( - SELECT TOP 4 me.foo, me.bar, me.hello, me.goodbye, me.sensors, me.read_count FROM fourkeys me ORDER BY $args->{order_inner} - ) foo ORDER BY $args->{order_outer} - ) bar - $req_order + "(SELECT + me__id, source, owner, title, price, owner__id, name FROM + (SELECT + TOP 1 me__id, source, owner, title, price, owner__id, name FROM + (SELECT + TOP 4 me.id AS me__id, me.source, me.owner, me.title, me.price, owner.id AS owner__id, owner.name FROM + books me + JOIN owners owner ON owner.id = me.owner + WHERE ( source = ? ) + ORDER BY $args->{order_inner} + ) me ORDER BY $args->{order_outer} + ) me $req_order )", [ [ source => 'Library' ] ], ); @@ -40,10 +64,10 @@ sub test_order { my @tests = ( { - order_by => \ 'foo DESC', + order_by => \'foo DESC', order_req => 'foo DESC', order_inner => 'foo DESC', - order_outer => 'foo ASC' + order_outer => 'foo ASC' }, { order_by => { -asc => 'foo' }, @@ -91,53 +115,38 @@ my @tests = ( order_inner => 'foo ASC, bar DESC, hello ASC, sensors ASC', order_outer => 'foo DESC, bar ASC, hello DESC, sensors DESC', }, - { - order_by => undef, - order_req => undef, - order_inner => 'foo ASC, bar ASC, hello ASC, goodbye ASC', - order_outer => 'foo DESC, bar DESC, hello DESC, goodbye DESC', - }, - { - order_by => '', - order_req => undef, - order_inner => 'foo ASC, bar ASC, hello ASC, goodbye ASC', - order_outer => 'foo DESC, bar DESC, hello DESC, goodbye DESC', - }, - { - order_by => {}, - order_req => undef, - order_inner => 'foo ASC, bar ASC, hello ASC, goodbye ASC', - order_outer => 'foo DESC, bar DESC, hello DESC, goodbye DESC', - }, - { - order_by => [], - order_req => undef, - order_inner => 'foo ASC, bar ASC, hello ASC, goodbye ASC', - order_outer => 'foo DESC, bar DESC, hello DESC, goodbye DESC', - }, ); -plan (tests => scalar @tests + 1); +my @default_tests = ( undef, '', {}, [] ); + +plan (tests => scalar @tests + scalar @default_tests + 1); test_order ($_) for @tests; +default_test_order ($_) for @default_tests; + is_same_sql_bind ( $rs->search ({}, { group_by => 'title', order_by => 'title' })->as_query, - '( - SELECT me__id, source, owner, title, price, owner__id, name - FROM ( - SELECT TOP 1 me__id, source, owner, title, price, owner__id, name - FROM ( - SELECT TOP 4 me.id AS me__id, me.source, me.owner, me.title, me.price, owner.id AS owner__id, owner.name - FROM books me - JOIN owners owner ON owner.id = me.owner +'(SELECT +me.id, me.source, me.owner, me.title, me.price, owner.id, owner.name FROM + ( SELECT + id, source, owner, title, price FROM + ( SELECT + TOP 1 id, source, owner, title, price FROM + ( SELECT + TOP 4 me.id, me.source, me.owner, me.title, me.price FROM + books me JOIN + owners owner ON owner.id = me.owner WHERE ( source = ? ) GROUP BY title ORDER BY title ASC - ) AS me - ORDER BY title DESC - ) AS me - ORDER BY title; - )', - [ [ source => 'Library' ] ], + ) me + ORDER BY title DESC + ) me + ORDER BY title + ) me JOIN + owners owner ON owner.id = me.owner WHERE + ( source = ? ) + ORDER BY title)' , + [ [ source => 'Library' ], [ source => 'Library' ] ], );