AlignDB-ToXLSX
view release on metacpan or search on metacpan
lib/AlignDB/ToXLSX.pm view on Meta::CPAN
{ # check table existing
my @table_names = $dbh->tables( '', '', '' );
# table names are quoted by ` (back-quotes) which is the
# quote_identifier
my $table_name = "`$table`";
unless ( List::MoreUtils::PP::any { $_ =~ /$table_name/i } @table_names ) {
print " " x 4, "Table $table does not exist\n";
return 0;
}
}
{ # check column existing
my $sql_query = qq{
SHOW FIELDS
FROM $table
LIKE "$column"
};
#@type DBI
my $sth = $dbh->prepare($sql_query);
$sth->execute();
my ($field) = $sth->fetchrow_array;
if ( not $field ) {
print " " x 4, "Column $column does not exist\n";
return 0;
}
}
{ # check values in column
my $sql_query = qq{
SELECT COUNT($column)
FROM $table
};
#@type DBI
my $sth = $dbh->prepare($sql_query);
$sth->execute;
my ($count) = $sth->fetchrow_array;
if ( not $count ) {
print " " x 4, "Column $column has no records\n";
}
return $count;
}
}
sub quantile {
my ( $self, $data, $part_number ) = @_;
my $stat = Statistics::Descriptive::Full->new();
$stat->add_data(@$data);
my $min = $stat->min;
my @quantiles;
my $base = 100 / $part_number;
for ( 1 .. $part_number - 1 ) {
my $percentile = $stat->percentile( $_ * $base );
push @quantiles, $percentile;
}
my $max = $stat->max;
return [ $min, @quantiles, $max, ];
}
sub quantile_sql {
my ( $self, $opt, $part_number ) = @_;
#@type DBI
my $dbh = $self->{dbh};
# bind value
my $bind_value = $opt->{bind_value};
unless ( defined $bind_value ) {
$bind_value = [];
}
# init DBI query
my $sql_query = $opt->{sql_query};
#@type DBI
my $sth = $dbh->prepare($sql_query);
$sth->execute(@$bind_value);
my @data;
while ( my @row = $sth->fetchrow_array ) {
push @data, $row[0];
}
return $self->quantile( \@data, $part_number );
}
sub calc_threshold {
my $self = shift;
my ( $combine, $piece );
#@type DBI
my $dbh = $self->{dbh};
#@type DBI
my $sth = $dbh->prepare(
q{
SELECT SUM(FLOOR(align_comparables / 500) * 500)
FROM align
}
);
$sth->execute;
my ($total_length) = $sth->fetchrow_array;
if ( $total_length <= 5_000_000 ) {
$piece = 10;
}
elsif ( $total_length <= 10_000_000 ) {
$piece = 10;
}
elsif ( $total_length <= 100_000_000 ) {
$piece = 20;
( run in 2.237 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )