[caracas-pm] Usando funciones SQL multiparámetro desde DBIx::Class

Ernesto Hernández-Novich emhnemhn at gmail.com
Tue Mar 29 06:10:58 PDT 2011


Si bien está documentado entre DBIx::Class::ResultSet y SQL::Abstract,
no hay ejemplos suficientes para las cosas complejas que uno tiene que
lograr cuando quiere utilizar funciones SQL como columnas o como
filtros. No me refiero a las estándar (SUM, AVG, MAX, MIN, etc.); me
refiero a funciones arbitrarias que uno escribe en manejadores de bases
de datos que ofrecen esa posibilidad, e incluso en presencia de
operadores binarios arbitrarios (por ejemplo, el >>  que pongo más
abajo).

El problema era expresar

select ... foo(a,bar(b,c)) as foo ...
  (...)
 where ... campo >> baz(d,e) ...

considerando que los puntos suspensivos corresponden a otras columnas de
interés o filtros, y que a, b, c, d y e son parámetros de la búsqueda,
mientras que campo siempre es la misma columna. Esto es, quiero que las
posiciones de a, b, c, d y e sean placeholders, en caso contrario el
desempeño de la base de datos no va a ser bueno.

Terminé escribiendo

...->search( {
  'campo' => {
    '>>=' => \[
               "baz(?,?)",
               [ 1 => $d ],
               [ 2 => $e ]
            ]
  },
  {
    '+select' => [
                   \[ "foo(?,bar(?,?))",
                      [ 1 => $a ],
                      [ 2 => $b ],
                      [ 3 => $c ]
                    ]
                 ],
    '+as'     => [ qw/foo/ ]
  }
);

Y al mirar la consulta generada usando DBIC_TRACE, la forma es
exactamente la que quiero, excepto que no se va a incluir el 'as foo',
sin embargo el ResultSet tiene la columna virtual 'foo' que debe ser
consultada vía get_column().             
-- 
Ernesto Hernández-Novich - @iamemhn - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't aptitude it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3



More information about the caracas-pm mailing list