(no commit message)
[dbsrgits/SQL-Abstract.git] / t / 08special_ops.t
diff --git a/t/08special_ops.t b/t/08special_ops.t
new file mode 100644 (file)
index 0000000..5bc5996
--- /dev/null
@@ -0,0 +1,71 @@
+#!/usr/bin/perl\r
+\r
+use strict;\r
+use warnings;\r
+use Test::More;\r
+\r
+use FindBin;\r
+use lib "$FindBin::Bin";\r
+use TestSqlAbstract;\r
+\r
+plan tests => 2;\r
+\r
+use SQL::Abstract;\r
+\r
+my $sqlmaker = SQL::Abstract->new(special_ops => [\r
+\r
+  # special op for MySql MATCH (field) AGAINST(word1, word2, ...)\r
+  {regex => qr/^match$/i, \r
+   handler => sub {\r
+     my ($self, $field, $op, $arg) = @_;\r
+     $arg = [$arg] if not ref $arg;\r
+     my $label         = $self->_quote($field);\r
+     my ($placeholder) = $self->_convert('?');\r
+     my $placeholders  = join ", ", (($placeholder) x @$arg);\r
+     my $sql           = $self->_sqlcase('match') . " ($label) "\r
+                       . $self->_sqlcase('against') . " ($placeholders) ";\r
+     my @bind = $self->_bindtype($field, @$arg);\r
+     return ($sql, @bind);\r
+     }\r
+   },\r
+\r
+  # special op for Basis+ NATIVE\r
+  {regex => qr/^native$/i, \r
+   handler => sub {\r
+     my ($self, $field, $op, $arg) = @_;\r
+     $arg =~ s/'/''/g;\r
+     my $sql = "NATIVE (' $field $arg ')";\r
+     return ($sql);\r
+     }\r
+   },\r
+\r
+]);\r
+\r
+my @tests = (\r
+\r
+  #1 \r
+  { where => {foo => {-match => 'foo'},\r
+              bar => {-match => [qw/foo bar/]}},\r
+    stmt  => " WHERE ( MATCH (bar) AGAINST (?, ?) AND MATCH (foo) AGAINST (?) )",\r
+    bind  => [qw/foo bar foo/],\r
+  },\r
+\r
+  #2\r
+  { where => {foo => {-native => "PH IS 'bar'"}},\r
+    stmt  => " WHERE ( NATIVE (' foo PH IS ''bar'' ') )",\r
+    bind  => [],\r
+  },\r
+\r
+);\r
+\r
+\r
+for (@tests) {\r
+\r
+  my($stmt, @bind) = $sqlmaker->where($_->{where}, $_->{order});\r
+  is_same_sql_bind($stmt, \@bind, $_->{stmt}, $_->{bind});\r
+}\r
+\r
+\r
+\r
+\r
+\r