| File: | lib/SQL/Select.pm |
| Coverage: | 91.2% |
| line | stmt | bran | cond | sub | pod | time | code |
|---|---|---|---|---|---|---|---|
| 1 | package SQL::Select; | ||||||
| 2 | |||||||
| 3 | 24 24 24 | 189 73 305 | use strict; | ||||
| 4 | 24 24 24 | 267 76 287 | use warnings; | ||||
| 5 | 24 24 24 | 274 81 285 | use base 'SQL::Statement'; | ||||
| 6 | #use Smart::Comments; | ||||||
| 7 | |||||||
| 8 | sub new { | ||||||
| 9 | 2132 | 0 | 17691 | my $class = ref $_[0] ? ref shift : shift; | |||
| 10 | 2132 | 204223 | bless { | ||||
| 11 | select => [@_], | ||||||
| 12 | from => [], | ||||||
| 13 | where => [], | ||||||
| 14 | limit => undef, | ||||||
| 15 | offset => undef, | ||||||
| 16 | order_by => [], | ||||||
| 17 | op => 'and', | ||||||
| 18 | }, $class; | ||||||
| 19 | } | ||||||
| 20 | |||||||
| 21 | sub select { | ||||||
| 22 | 43 | 0 | 4294 | my $self = shift; | |||
| 23 | 43 43 | 170 534 | push @{ $self->{select} }, @_; | ||||
| 24 | 43 | 223 | $self; | ||||
| 25 | } | ||||||
| 26 | |||||||
| 27 | sub from { | ||||||
| 28 | 2132 | 1 | 20062 | my $self = shift; | |||
| 29 | 2132 2132 | 6730 20422 | push @{ $self->{from} }, @_; | ||||
| 30 | 2132 | 20351 | $self; | ||||
| 31 | } | ||||||
| 32 | |||||||
| 33 | sub limit { | ||||||
| 34 | 1896 | 0 | 12902 | $_[0]->{limit} = $_[1]; | |||
| 35 | 1896 | 9907 | $_[0] | ||||
| 36 | } | ||||||
| 37 | |||||||
| 38 | sub offset { | ||||||
| 39 | 9 | 0 | 72 | $_[0]->{offset} = $_[1]; | |||
| 40 | 9 | 52 | $_[0]; | ||||
| 41 | } | ||||||
| 42 | |||||||
| 43 | sub order_by { | ||||||
| 44 | 63 | 0 | 366 | my $self = shift; | |||
| 45 | 63 63 | 241 739 | push @{ $self->{order_by} }, join(" ", @_); | ||||
| 46 | 63 | 445 | $self; | ||||
| 47 | } | ||||||
| 48 | |||||||
| 49 | sub op { | ||||||
| 50 | 2 | 0 | 23 | $_[0]->{op} = lc($_[1]); | |||
| 51 | 2 | 25 | $_[0]; | ||||
| 52 | } | ||||||
| 53 | |||||||
| 54 | sub generate { | ||||||
| 55 | 2129 | 0 | 9356 | my $self = shift; | |||
| 56 | 2129 | 5994 | my $sql; | ||||
| 57 | 2129 | 10266 | local $" = ', '; | ||||
| 58 | 2129 2129 2129 | 9221 23311 17457 | $sql .= "select @{ $self->{select} } from @{ $self->{from} }"; | ||||
| 59 | 2129 2129 | 7721 16154 | my @where = @{ $self->{where} }; | ||||
| 60 | 2129 2106 | 20830 20184 | my $where = join ' '. $self->{op} . ' ', map { join(' ', @$_) } @where; | ||||
| 61 | 2129 2034 | 14210 11196 | if ($where) { $sql .= " where $where" } | ||||
| 62 | 2129 | 11354 | my $order_by = $self->{order_by}; | ||||
| 63 | 2129 59 | 11300 529 | if (@$order_by) { $sql .= " order by @$order_by"; } | ||||
| 64 | 2129 | 11135 | my $limit = $self->{limit}; | ||||
| 65 | 2129 1896 | 12129 11344 | if (defined $limit) { $sql .= " limit $limit"; } | ||||
| 66 | 2129 | 11015 | my $offset = $self->{offset}; | ||||
| 67 | 2129 9 | 9971 55 | if ($offset) { $sql .= " offset $offset"; } | ||||
| 68 | ### $sql | ||||||
| 69 | 2129 | 16899 | return $sql . ";\n"; | ||||
| 70 | } | ||||||
| 71 | |||||||
| 72 | 1; | ||||||
| 73 | |||||||