Fix NibbleIterator::_can_nibble_once(). Add boundaries() and one_nibble(), remove unused _check_index_usage().

This commit is contained in:
Daniel Nichter
2011-09-26 10:23:42 -06:00
parent eff835ffe7
commit 10e31c1b63

View File

@@ -199,7 +199,6 @@ sub next {
$self->_can_nibble_once(); $self->_can_nibble_once();
$self->_prepare_sths(); $self->_prepare_sths();
$self->_get_bounds(); $self->_get_bounds();
# $self->_check_index_usage();
if ( my $callback = $self->{callbacks}->{init} ) { if ( my $callback = $self->{callbacks}->{init} ) {
$callback->(); $callback->();
} }
@@ -280,9 +279,20 @@ sub nibble_index {
return $self->{index}; return $self->{index};
} }
sub boundaries {
my ($self) = @_;
return $self->{lb}, $self->{ub}, $self->{next_lb};
}
sub one_nibble {
my ($self) = @_;
return $self->{one_nibble};
}
sub set_chunk_size { sub set_chunk_size {
my ($self, $limit) = @_; my ($self, $limit) = @_;
MKDEBUG && _d('Setting new chunk size (LIMIT):', $limit); MKDEBUG && _d('Setting new chunk size (LIMIT):', $limit);
die "Chunk size must be > 0" unless $limit;
$self->{limit} = $limit - 1; $self->{limit} = $limit - 1;
return; return;
} }
@@ -372,8 +382,7 @@ sub _can_nibble_once {
my ($dbh, $tbl, $tp) = @{$self}{qw(dbh tbl TableParser)}; my ($dbh, $tbl, $tp) = @{$self}{qw(dbh tbl TableParser)};
my ($table_status) = $tp->get_table_status($dbh, $tbl->{db}, $tbl->{tbl}); my ($table_status) = $tp->get_table_status($dbh, $tbl->{db}, $tbl->{tbl});
my $n_rows = $table_status->{rows} || 0; my $n_rows = $table_status->{rows} || 0;
my $chunk_size = $self->{OptionParser}->get('chunk-size') || 1; $self->{one_nibble} = $n_rows <= $self->{limit} ? 1 : 0;
$self->{one_nibble} = $n_rows <= $chunk_size ? 1 : 0;
MKDEBUG && _d('One nibble:', $self->{one_nibble} ? 'yes' : 'no'); MKDEBUG && _d('One nibble:', $self->{one_nibble} ? 'yes' : 'no');
return $self->{one_nibble}; return $self->{one_nibble};
} }
@@ -410,29 +419,6 @@ sub _get_bounds {
return; return;
} }
sub _check_index_usage {
my ($self) = @_;
my ($dbh, $tbl, $q) = @{$self}{qw(dbh tbl Quoter)};
my $explain;
eval {
$explain = $dbh->selectall_arrayref("", {Slice => {}});
};
if ( $EVAL_ERROR ) {
warn "Cannot check if MySQL is using the chunk index: $EVAL_ERROR";
return;
}
my $explain_index = lc($explain->[0]->{key} || '');
MKDEBUG && _d('EXPLAIN index:', $explain_index);
if ( $explain_index ne $self->{index} ) {
die "Cannot nibble table $tbl->{db}.$tbl->{tbl} because MySQL chose "
. ($explain_index ? "the `$explain_index`" : 'no') . ' index'
. " instead of the chunk index `$self->{asc}->{index}`";
}
return;
}
sub _next_boundaries { sub _next_boundaries {
my ($self) = @_; my ($self) = @_;
@@ -453,7 +439,7 @@ sub _next_boundaries {
# which will cause us to nibble further ahead and maybe get a new lower # which will cause us to nibble further ahead and maybe get a new lower
# boundary that isn't identical, but we can't detect this, and in any # boundary that isn't identical, but we can't detect this, and in any
# case, if there's one infinite loop there will probably be others. # case, if there's one infinite loop there will probably be others.
if ( $self->_identical_boundaries($self->{lb}, $self->{next_lb}) ) { if ( $self->identical_boundaries($self->{lb}, $self->{next_lb}) ) {
MKDEBUG && _d('Infinite loop detected'); MKDEBUG && _d('Infinite loop detected');
my $tbl = $self->{tbl}; my $tbl = $self->{tbl};
my $index = $tbl->{tbl_struct}->{keys}->{$self->{index}}; my $index = $tbl->{tbl_struct}->{keys}->{$self->{index}};
@@ -497,7 +483,7 @@ sub _next_boundaries {
return 1; # have boundary return 1; # have boundary
} }
sub _identical_boundaries { sub identical_boundaries {
my ($self, $b1, $b2) = @_; my ($self, $b1, $b2) = @_;
# If only one boundary isn't defined, then they can't be identical. # If only one boundary isn't defined, then they can't be identical.