Skip to content

Commit

Permalink
Simplify code of GenericSubQ limit dialect
Browse files Browse the repository at this point in the history
  • Loading branch information
ribasushi committed Mar 2, 2012
1 parent 86bb5a2 commit 528e717
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 53 deletions.
68 changes: 17 additions & 51 deletions lib/DBIx/Class/SQLMaker/LimitDialects.pm
Original file line number Diff line number Diff line change
Expand Up @@ -562,63 +562,29 @@ sub _GenericSubQ {
my $root_rsrc = $rs_attrs->{_rsroot_rsrc};
my $root_tbl_name = $root_rsrc->name;

my ($order_by, @rest) = do {
my ($first_order_by) = do {
local $self->{quote_char};
$self->_order_by_chunks ($rs_attrs->{order_by})
};

unless (
$order_by
&&
! @rest
&&
( ! ref $order_by
||
( ref $order_by eq 'ARRAY' and @$order_by == 1 )
)
) {
$self->throw_exception (
'Generic Subquery Limit does not work on resultsets without an order, or resultsets '
. 'with complex order criteria (multicolumn and/or functions). Provide a single, '
. 'unique-column order criteria.'
);
}

($order_by) = @$order_by if ref $order_by;
map { ref $_ ? $_->[0] : $_ } $self->_order_by_chunks ($rs_attrs->{order_by})
} or $self->throw_exception (
'Generic Subquery Limit does not work on resultsets without an order. Provide a single, '
. 'unique-column order criteria.'
);

$order_by =~ s/\s+ ( ASC|DESC ) \s* $//ix;
$first_order_by =~ s/\s+ ( ASC|DESC ) \s* $//ix;
my $direction = lc ($1 || 'asc');

my ($unq_sort_col) = $order_by =~ /(?:^|\.)([^\.]+)$/;

my $inf = $root_rsrc->storage->_resolve_column_info (
$rs_attrs->{from}, [$order_by, $unq_sort_col]
);

my $ord_colinfo = $inf->{$order_by} || $self->throw_exception("Unable to determine source of order-criteria '$order_by'");
my ($first_ord_alias, $first_ord_col) = $first_order_by =~ /^ (?: ([^\.]+) \. )? ([^\.]+) $/x;

if ($ord_colinfo->{-result_source}->name ne $root_tbl_name) {
$self->throw_exception(sprintf
"Generic Subquery Limit order criteria can be only based on the root-source '%s'"
. " (aliased as '%s')", $root_rsrc->source_name, $rs_attrs->{alias},
);
}
$self->throw_exception(sprintf
"Generic Subquery Limit order criteria can be only based on the root-source '%s'"
. " (aliased as '%s')", $root_rsrc->source_name, $rs_attrs->{alias},
) if ($first_ord_alias and $first_ord_alias ne $rs_attrs->{alias});

# make sure order column is qualified
$order_by = "$rs_attrs->{alias}.$order_by"
unless $order_by =~ /^$rs_attrs->{alias}\./;
$first_ord_alias ||= $rs_attrs->{alias};

my $is_u;
my $ucs = { $root_rsrc->unique_constraints };
for (values %$ucs ) {
if (@$_ == 1 && "$rs_attrs->{alias}.$_->[0]" eq $order_by) {
$is_u++;
last;
}
}
$self->throw_exception(
"Generic Subquery Limit order criteria column '$order_by' must be unique (no unique constraint found)"
) unless $is_u;
"Generic Subquery Limit first order criteria '$first_ord_col' must be unique"
) unless $root_rsrc->_identifying_column_set([$first_ord_col]);

my ($stripped_sql, $in_sel, $out_sel, $alias_map, $extra_order_sel)
= $self->_subqueried_limit_attrs ($sql, $rs_attrs);
Expand Down Expand Up @@ -660,8 +626,8 @@ $order_sql
$rs_attrs->{alias},
$root_tbl_name,
$count_tbl_alias,
"$count_tbl_alias.$unq_sort_col",
$order_by,
"$count_tbl_alias.$first_ord_col",
"$first_ord_alias.$first_ord_col",
));
}

Expand Down
4 changes: 2 additions & 2 deletions t/sqlmaker/limit_dialects/generic_subq.t
Original file line number Diff line number Diff line change
Expand Up @@ -142,9 +142,9 @@ is_deeply (

{
$rs = $schema->resultset('Artist')->search({}, {
columns => 'name',
columns => 'artistid',
offset => 1,
order_by => 'name',
order_by => 'artistid',
});
local $rs->result_source->{name} = "weird \n newline/multi \t \t space containing \n table";

Expand Down

0 comments on commit 528e717

Please sign in to comment.