better override handling, handle defined-but-empty sql parts
[scpubgit/Q-Branch.git] / lib / SQL / Abstract / Clauses.pm
index 78ec300..aae5782 100644 (file)
@@ -63,6 +63,21 @@ sub register_defaults {
   $self->{expand}{exists} = sub {
     $_[0]->_expand_op(undef, [ exists => $_[2] ]);
   };
+
+  # check for overriden methods
+  if ($self->can('_table') ne SQL::Abstract->can('_table')) {
+    $self->{expand_clause}{'select.from'} = sub {
+      return +{ -literal => [ $_[0]->_table($_[2]) ] };
+    };
+  }
+  if ($self->can('_order_by') ne SQL::Abstract->can('_order_by')) {
+    $self->{expand_clause}{'select.order_by'} = sub {
+      my ($osql, @obind) = $_[0]->_order_by($_[2]);
+      $osql =~ s/^order by //i;
+      return undef unless length($osql);
+      return +{ -literal => [ $osql, @obind ] };
+    };
+  }
   return $self;
 }
 
@@ -205,14 +220,13 @@ sub render_aqt {
 
 sub render_statement {
   my ($self, $expr, $default_scalar_to) = @_;
-  $self->render_aqt(
+  @{$self->render_aqt(
     $self->expand_expr($expr, $default_scalar_to), 1
-  );
+  )};
 }
 
 sub select {
   my ($self, @args) = @_;
-
   my $stmt = do {
     if (ref(my $sel = $args[0]) eq 'HASH') {
       $sel
@@ -229,8 +243,8 @@ sub select {
     }
   };
 
-  my $rendered = $self->render_statement({ -select => $stmt });
-  return wantarray ? @$rendered : $rendered->[0];
+  my @rendered = $self->render_statement({ -select => $stmt });
+  return wantarray ? @rendered : $rendered[0];
 }
 
 sub update {
@@ -248,8 +262,8 @@ sub update {
       \%clauses;
     }
   };
-  my $rendered = $self->render_statement({ -update => $stmt });
-  return wantarray ? @$rendered : $rendered->[0];
+  my @rendered = $self->render_statement({ -update => $stmt });
+  return wantarray ? @rendered : $rendered[0];
 }
 
 sub delete {
@@ -263,8 +277,8 @@ sub delete {
       \%clauses;
     }
   };
-  my $rendered = $self->render_statement({ -delete => $stmt });
-  return wantarray ? @$rendered : $rendered->[0];
+  my @rendered = $self->render_statement({ -delete => $stmt });
+  return wantarray ? @rendered : $rendered[0];
 }
 
 sub insert {
@@ -278,8 +292,8 @@ sub insert {
       \%clauses;
     }
   };
-  my $rendered = $self->render_statement({ -insert => $stmt });
-  return wantarray ? @$rendered : $rendered->[0];
+  my @rendered = $self->render_statement({ -insert => $stmt });
+  return wantarray ? @rendered : $rendered[0];
 }
 
 sub _expand_insert_clause_target {
@@ -380,6 +394,8 @@ BEGIN {
   }
 }
 
+sub register_op { $_[0]->{is_op}{$_[1]} = 1; $_[0] }
+
 sub statement_list { sort keys %{$_[0]->{clauses_of}} }
 
 sub clauses_of {