move SQLite datemath code to the correct SQLMaker class
Arthur Axel 'fREW' Schmidt [Mon, 31 Jan 2011 19:39:46 +0000 (13:39 -0600)]
lib/DBIx/Class/SQLMaker.pm
lib/DBIx/Class/SQLMaker/SQLite.pm
t/sqlmaker/op_dt.t

index dfd5087..f317bac 100644 (file)
@@ -194,24 +194,9 @@ sub _where_op_CONVERT_DATETIME {
   ;
 }
 
-{
-  my %part_map = (
-     month        => 'm',
-     day_of_month => 'd',
-     year         => 'Y',
-  );
-
-  sub _datetime_sql { "STRFTIME('$part_map{$_[1]}', $_[2])" }
-}
+sub _datetime_sql { die 'date part extraction not implemented for this database' }
 
-sub _datetime_diff_sql {
-   my ($self, $part, $left, $right) = @_;
-   '(' .
-      $self->_datetime_sql($part, $left)
-       . ' - ' .
-      $self->_datetime_sql($part, $right)
-   . ')'
-}
+sub _datetime_diff_sql { die 'date diffing not implemented for this database' }
 
 sub _where_op_GET_DATETIME {
   my ($self) = @_;
index acf0337..61d9f7e 100644 (file)
@@ -8,4 +8,26 @@ use base qw( DBIx::Class::SQLMaker );
 # Disable it here
 sub _lock_select () { '' };
 
+
+{
+  my %part_map = (
+     month        => 'm',
+     day_of_month => 'd',
+     year         => 'Y',
+  );
+
+  sub _datetime_sql { "STRFTIME('%$part_map{$_[1]}', $_[2])" }
+}
+
+sub _datetime_diff_sql {
+   my ($self, $part, $left, $right) = @_;
+   if ($part eq 'day') {
+      return "(JULIANDAY($left) - JULIANDAY($right))"
+   } elsif ($part eq 'second') {
+      return "(STRFTIME('%s',$left) - STRFTIME('%s',$right))"
+   } else {
+      die "part $part is not supported by SQLite"
+   }
+}
+
 1;
index 693b5fb..22b0bec 100644 (file)
@@ -54,16 +54,16 @@ is_same_sql_bind (
        { -op => [ '=', 12, { -dt_month => { -ident => 'artist.when_began' } } ] },
        { -op => [ '=', 2010, { -dt_get => [year => \'artist.when_began'] } ] },
        { -op => [ '=', 14, { -dt_get => [day_of_month => \'artist.when_began'] } ] },
-       { -op => [ '=', 10, { -dt_diff => [year => { -ident => 'artist.when_began' }, \'artist.when_ended'] } ] },
+       { -op => [ '=', 10, { -dt_diff => [second => { -ident => 'artist.when_began' }, \'artist.when_ended'] } ] },
     ]
   } ) ],
   "SELECT *
      FROM artist
      WHERE ( (
-       ( ? = STRFTIME('m', artist.when_began) ) AND
-       ( ? = STRFTIME('Y', artist.when_began) ) AND
-       ( ? = STRFTIME('d', artist.when_began) ) AND
-       ( ? = ( STRFTIME('Y', artist.when_began) - STRFTIME('Y', artist.when_ended)))
+       ( ? = STRFTIME('%m', artist.when_began) ) AND
+       ( ? = STRFTIME('%Y', artist.when_began) ) AND
+       ( ? = STRFTIME('%d', artist.when_began) ) AND
+       ( ? = ( STRFTIME('%s', artist.when_began) - STRFTIME('%s', artist.when_ended)))
      ) )
   ",
   [