Skip to content

Instantly share code, notes, and snippets.

@nihen
Created January 4, 2012 19:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nihen/1561525 to your computer and use it in GitHub Desktop.
Save nihen/1561525 to your computer and use it in GitHub Desktop.
SQL::Maker::Select::Joinful
package SQL::Maker::Select::Joinful;
use strict;
use warnings;
use utf8;
use base 'SQL::Maker::Select';
sub add_join {
my ($self, $joins) = @_;
push @{ $self->{joins} }, $joins;
return $self;
}
sub as_sql {
my $self = shift;
my $sql = '';
my $new_line = $self->new_line;
if (@{ $self->{select} }) {
$sql .= $self->{prefix};
$sql .= 'DISTINCT ' if $self->{distinct};
$sql .= join(', ', map {
my $alias = $self->{select_map}->{$_};
if (!$alias) {
$self->_quote($_)
} elsif ($alias && $_ =~ /(?:^|\.)\Q$alias\E$/) {
$self->_quote($_)
} else {
$self->_quote($_) . ' AS ' . $self->_quote($alias)
}
} @{ $self->{select} }) . $new_line;
}
$sql .= 'FROM ';
if ($self->{from} && @{ $self->{from} }) {
$sql .= join ', ',
map { $self->_add_index_hint($_->[0], $_->[1]) }
@{ $self->{from} };
}
if ($self->{joins} && @{ $self->{joins} }) {
for my $join (@{ $self->{joins} }) {
$sql .= ' ' . uc($join->{type}) . ' JOIN ' . $self->_quote($join->{table});
$sql .= ' ' . $self->_quote($join->{alias}) if $join->{alias};
if ( defined $join->{condition} ) {
if (ref $join->{condition} && ref $join->{condition} eq 'ARRAY') {
$sql .= ' USING ('. join(', ', map { $self->_quote($_) } @{ $join->{condition} }) . ')';
}
else {
$sql .= ' ON ' . $join->{condition};
}
}
}
}
$sql .= $new_line;
$sql .= $self->as_sql_where() if $self->{where};
$sql .= $self->as_sql_group_by if $self->{group_by};
$sql .= $self->as_sql_having if $self->{having};
$sql .= $self->as_sql_order_by if $self->{order_by};
$sql .= $self->as_sql_limit if $self->{limit};
$sql .= $self->as_sql_for_update;
$sql =~ s/${new_line}+$//;
return $sql;
}
1;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment