App-DBBrowser
view release on metacpan or search on metacpan
lib/App/DBBrowser/Table/Extensions/ScalarFunctions/GetArguments.pm view on Meta::CPAN
my ( $sf, $sql, $clause, $func, $cols, $r_data ) = @_;
my $tc = Term::Choose->new( $sf->{i}{tc_default} );
my $tr = Term::Form::ReadLine->new( $sf->{i}{tr_default} );
my $ax = App::DBBrowser::Auxil->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $ext = App::DBBrowser::Table::Extensions->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $const = '[value]';
my @pre = ( undef, $sf->{i}{ok}, $sf->{i}{menu_addition}, $const );
my $menu = [ @pre, @$cols ];
my $subset = [];
my $info = $ax->get_sql_info( $sql );
my @bu;
my @bu_args_sofar = @{$r_data->[-1]};
COLUMNS: while ( 1 ) {
$r_data->[-1] = [ @bu_args_sofar, @$subset ];
my $tmp_info = $info . $ext->nested_func_info( $r_data );
# Choose
my @idx = $tc->choose(
$menu,
{ %{$sf->{i}{lyt_h}}, info => $tmp_info, prompt => 'Columns:', meta_items => [ 0 .. $#pre - 1 ], ##
no_spacebar => [ $#pre ], include_highlighted => 2, index => 1 }
);
if ( ! $idx[0] ) {
if ( @bu ) {
$subset = pop @bu;
next COLUMNS;
}
return;
}
if ( $menu->[$idx[0]] eq $sf->{i}{ok} ) {
shift @idx;
$sf->__add_chosen_cols_to_subset( $sql, $clause, $subset, [ @{$menu}[@idx] ], $r_data );
$r_data->[-1] = [ @bu_args_sofar, @$subset ];
if ( ! @$subset ) {
return;
}
return $subset;
}
elsif ( $menu->[$idx[0]] eq $sf->{i}{menu_addition} ) {
# recursion
my $complex_col = $ext->column( $sql, $clause, $r_data );
if ( ! defined $complex_col ) {
next COLUMNS;
}
push @bu, [ @$subset ];
push @$subset, $complex_col;
}
elsif ( $menu->[$idx[0]] eq $const ) {
my $history;
if ( $func eq 'CONCAT' ) { ##
$history = [ '%', '_', '*', '?', '|' ];
}
my $value = $tr->readline(
'Value: ',
{ info => $tmp_info, history => $history }
);
if ( ! defined $value ) {
next COLUMNS;
}
push @bu, [ @$subset ];
push @$subset, $ax->quote_if_not_numeric( $value );
}
else {
push @bu, [ @$subset ];
$sf->__add_chosen_cols_to_subset( $sql, $clause, $subset, [ @{$menu}[@idx] ], $r_data );
}
}
}
sub __add_chosen_cols_to_subset {
my ( $sf, $sql, $clause, $subset, $chosen_cols, $r_data ) = @_;
if ( $sql->{aggregate_mode} && $clause =~ /^(?:select|having|order_by)\z/ ) {
my $sa = App::DBBrowser::Table::Substatement::Aggregate->new( $sf->{i}, $sf->{o}, $sf->{d} );
for my $aggr ( @$chosen_cols ) {
my $prep_aggr = $sa->get_prepared_aggr_func( $sql, $clause, $aggr, $r_data );
if ( ! length $prep_aggr ) {
next;
}
push @$subset, $prep_aggr;
push @{$r_data->[-1]}, $prep_aggr;
}
}
else {
push @$subset, @$chosen_cols;
}
}
sub choose_a_column {
my ( $sf, $sql, $clause, $cols, $r_data, $prompt ) = @_;
my $ax = App::DBBrowser::Auxil->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $ext = App::DBBrowser::Table::Extensions->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $tc = Term::Choose->new( $sf->{i}{tc_default} );
$prompt //= 'Column:';
my $info = $ax->get_sql_info( $sql ) . $ext->nested_func_info( $r_data );
my @pre = ( undef, $sf->{i}{menu_addition} );
while ( 1 ) {
# Choose
my $col = $tc->choose(
[ @pre, @$cols ],
{ %{$sf->{i}{lyt_h}}, info => $info, prompt => $prompt }
);
if ( ! defined $col ) {
return;
}
my $chosen_col;
if ( $col eq $sf->{i}{menu_addition} ) {
# recursion
my $complex_col = $ext->column( $sql, $clause, $r_data );
if ( ! defined $complex_col ) {
next;
}
$chosen_col = $complex_col;
}
elsif ( $sql->{aggregate_mode} && $clause =~ /^(?:select|having|order_by)\z/ ) {
my $sa = App::DBBrowser::Table::Substatement::Aggregate->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $prep_aggr = $sa->get_prepared_aggr_func( $sql, $clause, $col, $r_data );
if ( ! length $prep_aggr ) {
next;
( run in 3.257 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )