App-DBBrowser
view release on metacpan or search on metacpan
lib/App/DBBrowser/GetContent/Filter.pm view on Meta::CPAN
package # hide from PAUSE
App::DBBrowser::GetContent::Filter;
use warnings;
use strict;
use 5.016;
use List::MoreUtils qw( any uniq );
use Term::Choose qw();
use Term::Choose::Constants qw( EXTRA_W );
use Term::Choose::LineFold qw( line_fold print_columns );
use Term::Choose::Util qw( insert_sep get_term_width get_term_height unicode_sprintf );
use Term::Choose::Screen qw( clear_screen );
use Term::Form qw();
use Term::Form::ReadLine qw();
use App::DBBrowser::Auxil;
sub new {
my ( $class, $info, $options, $d ) = @_;
my $sf = {
i => $info,
o => $options,
d => $d
};
bless $sf, $class;
}
sub input_filter {
my ( $sf, $sql ) = @_;
my $tc = Term::Choose->new( $sf->{i}{tc_default} );
my $confirm = ' OK';
my $back = ' ' . $sf->{i}{s_back};
my $reset = ' ' . $sf->{i}{reset};
my $reparse = ' Reparse';
my $merge_rows = 'Merge_Rows';
my $range_rows = 'Range_Rows';
my $row_groups = 'Row_Groups';
my $empty_rows = 'Empty_Rows';
my $choose_rows = 'Choose_Rows';
my $remove_cell = 'Remove_Cell';
my $insert_cell = 'Insert_Cell';
my $split_table = 'Split_Table';
my $split_column = 'Split_Column';
my $join_columns = 'Join_Columns';
my $fill_up_rows = 'Fill_up_Rows';
my $empty_to_null = ' Empty_2_null';
my $empty_cols = 'Empty_Columns';
my $choose_cols = 'Choose_Columns';
my $append_col = 'Append_Columns';
my $cols_to_rows = 'Columns_to_Rows';
my $convert_date = 'Convert_DateTime';
my $s_and_replace = 'Search_&_Replace';
my $field_count = @{$sql->{insert_args}} * @{$sql->{insert_args}[0]};
my $bu_insert_args = [ map { [ @$_ ] } @{$sql->{insert_args}} ]; # copy the entire data
$sf->{empty_to_null} = $sf->{o}{insert}{empty_to_null_file};
my $working = $field_count > 500_000 ? 'Working ... ' : undef;
my $old_idx = 0;
FILTER: while ( 1 ) {
my $skip = ' ';
my $menu = [
undef, $choose_rows, $range_rows, $row_groups,
$confirm, $choose_cols, $empty_rows, $empty_cols,
$reset, $s_and_replace, $convert_date, $skip,
$reparse, $remove_cell, $insert_cell, $skip,
$empty_to_null, $join_columns, $split_column, $append_col,
$cols_to_rows, $split_table, $merge_rows, $fill_up_rows,
];
my $max_cols = 4;
my $info = $sf->__get_filter_info( $sql );
# Choose
my $idx = $tc->choose(
$menu,
{ info => $info, prompt => 'Filter:', layout => 0, order => 0, max_cols => $max_cols, index => 1,
default => $old_idx, undef => $back, busy_string => $working }
);
$sf->__print_busy_string( $working );
if ( ! $idx ) {
$sql->{insert_args} = [];
delete $sf->{d}{fi};
return;
}
if ( $sf->{o}{G}{menu_memory} ) {
if ( $old_idx == $idx && ! $ENV{TC_RESET_AUTO_UP} ) {
$old_idx = 0;
next FILTER;
}
$old_idx = $idx;
}
my $filter = $menu->[$idx];
my $filter_str = sprintf( "Filter: %s", $filter );
if ( $filter eq $reset ) {
$sf->__print_busy_string( $working );
$sql->{insert_args} = [ map { [ @$_ ] } @{$bu_insert_args} ];
$sf->{empty_to_null} = $sf->{o}{insert}{empty_to_null_file};
next FILTER
}
elsif ( $filter eq $confirm ) {
if ( $sf->{empty_to_null} ) {
no warnings 'uninitialized';
$sql->{insert_args} = [ map { [ map { length $_ ? $_ : undef } @$_ ] } @{$sql->{insert_args}} ];
}
return 1;
}
elsif ( $filter eq $reparse ) {
return -1;
}
elsif ( $filter eq $choose_cols ) {
$sf->__choose_columns( $sql, $filter_str, $working );
}
elsif ( $filter eq $choose_rows ) {
( run in 0.860 second using v1.01-cache-2.11-cpan-39bf76dae61 )