DBIx-Class-Smooth

 view release on metacpan or  search on metacpan

lib/DBIx/Class/Smooth/Functions.pm  view on Meta::CPAN

use 5.20.0;
use strict;
use warnings;

package DBIx::Class::Smooth::Functions;

# ABSTRACT: Specify columns
our $AUTHORITY = 'cpan:CSSON'; # AUTHORITY
our $VERSION = '0.0108';

use Carp qw/croak/;
use List::Util qw/uniq/;
use List::SomeUtils qw/any/;
use boolean;
use Ref::Util qw/is_scalarref is_refref is_arrayref/;
use Sub::Exporter::Progressive -setup => {
    exports => [qw/
        Ascii
        Bin
        Char
        CharLength
        Concat
        ConcatWS
        Elt
        ExportSet
        Hex
        Substring
    /]
};

use experimental qw/postderef signatures/;

sub first_is_voc($function_name, @params) {
    if (!scalar @params) {
        return { uc $function_name => undef };
    }
    my $first = shift @params;
    # If an inner call requires a rendered sql string, the outer call needs to do that as well
    if (is_refref $first && is_arrayref $$first) {
        my $inner_sql_string = $$first->[0];
        my $sql_string = $inner_sql_string . (scalar @params ? ', ' . join ', ' => @params : '');
        return \["@{[ uc $function_name ]}($sql_string)"];
    }
    # If you pass the $value_or_columnname as a string ref, then we render an sql string
    elsif (is_scalarref $first) {
        my $sql_string = "'$$first'" . (scalar @params ? ', ' . join ', ' => @params : '');
        return \["@{[ uc $function_name ]}($sql_string)"];
    }
    unshift @params => $first;
    return { uc $function_name => \@params };
}

sub all_is_voc($function_name, @params) {
    my $any_is_ref = scalar grep { is_scalarref $_ } @params;

    if ($any_is_ref) {
        my $sql_string = join ', ' => map { is_scalarref $_ ? "'$$_'" : $_ } @params;
        return \["@{[ uc $function_name ]}($sql_string)"];
    }
    else {
        return { uc $function_name => \@params };
    }
}

sub drop_last_if_undef(@params) {
    if (!defined $params[-1]) {
        pop @params;
    }
    return @params;
}

# $voc = Value or column name
sub Ascii($voc) { return first_is_voc ascii => $voc; }

sub Bin($voc) { return first_is_voc bin => $voc; }



( run in 1.592 second using v1.01-cache-2.11-cpan-39bf76dae61 )