#=============================================================================== # # FILE: ETA.pm # # DESCRIPTION: eta=estimated time of arrival # this module will be use to estimate # the remaining time of a list of repetitive # actions wich has varying but close times for each # action # # FILES: --- # BUGS: --- # NOTES: --- # AUTHOR: (), <> # COMPANY: # VERSION: 1.0 # CREATED: 12/06/2007 06:19:25 AM EET # REVISION: --- #=============================================================================== package SNA::ETA; use Moose; use DateTime; use Data::Dumper; has $_ => ( isa=>'Value',is=>'rw' ) for qw/ last_percent_made percent_finished now previous_ETA ETA median_ETA median_ETA_in_days median_ETA_in_hours total_hits /; has 'time_last_percent' => (isa=>'DateTime',is=>'rw',default=> sub { DateTime->now; } ); sub set_total_hits { my ($self,$total_hits) = @_; $self->{total_hits}=$total_hits; }; sub increment {#increment $profiles_processed my ($self) = @_; $self->{percent_finished} = ($self->{profiles_processed}++) / $self->{total_hits}; $self->{percent_finished} =~ s/(.*\..{3}).*/$1/; }; sub recalculate { my ($self) = @_; if($self->{last_percent_made} != $self->{percent_finished}){ my $now = DateTime->now; #calculate current ETA between last 2 profiles added $self->{ETA} = (100 - $self->{percent_finished}) / ($self->{percent_finished} - $self->{last_percent_made}) * ($now - $self->time_last_percent)->seconds ; #update last_percent_made $self->time_last_percent($now); $self->{last_percent_made} = $self->{percent_finished}; }; #calculate median ETA push @{$self->{previous_ETA}},$self->{ETA} if($self->{ETA}); $self->{median_ETA} = 0; map { $self->{median_ETA} +=$_; } @{$self->{previous_ETA}}; $self->{median_ETA} /= scalar @{$self->{previous_ETA}} if scalar @{$self->{previous_ETA}}; #convert median ETA to days and to hours $self->{median_ETA_in_days} = $self->{median_ETA}/(3600*24); $self->{median_ETA_in_hours} = $self->{median_ETA}/3600; $self->{median_ETA_in_days} =~ /(\d+\.\d{2})/;$self->{median_ETA_in_days} =$1; $self->{median_ETA_in_hours} =~ /(\d+\.\d{2})/;$self->{median_ETA_in_hours}=$1; #warn Dumper($self); }; sub get_eta { my ($self) = @_; return ($self->median_ETA_in_hours,$self->median_ETA_in_days); }; sub get_eta_string { my ($self) = @_; return sprintf "ETA: %s hours or %s days \n",$self->get_eta; }; 1;