Fix issue with leaderboard position due to wrong calculation of trend
This commit is contained in:
parent
1fb247c675
commit
559e88d9e6
6 changed files with 115 additions and 163 deletions
|
@ -72,6 +72,48 @@ sub _get_customer_rs {
|
|||
});
|
||||
}
|
||||
|
||||
sub _set_position_and_trend {
|
||||
my ( $self, @leaderboard ) = @_;
|
||||
|
||||
# Sort numerically descending
|
||||
@leaderboard = sort { $b->{value} <=> $a->{value} } @leaderboard;
|
||||
|
||||
my $position = 0;
|
||||
|
||||
my $previous_board = $self->get_latest;
|
||||
|
||||
if ( defined $previous_board ) {
|
||||
$previous_board = $previous_board->values;
|
||||
}
|
||||
|
||||
for my $lb_val ( @leaderboard ) {
|
||||
$position++;
|
||||
$lb_val->{position} = $position;
|
||||
|
||||
my $previous_value;
|
||||
|
||||
if ( defined $previous_board ) {
|
||||
$previous_value = $previous_board->find({ user_id => $lb_val->{user_id} });
|
||||
}
|
||||
|
||||
my $trend;
|
||||
|
||||
if ( ! defined $previous_value ) {
|
||||
$trend = 0;
|
||||
} elsif ( $previous_value->position > $position ) {
|
||||
$trend = -1;
|
||||
} elsif ( $previous_value->position < $position ) {
|
||||
$trend = 1;
|
||||
} else {
|
||||
$trend = 0;
|
||||
}
|
||||
|
||||
$lb_val->{trend} = $trend;
|
||||
}
|
||||
|
||||
return @leaderboard;
|
||||
}
|
||||
|
||||
sub _create_total_set {
|
||||
my ( $self, $start, $end ) = @_;
|
||||
|
||||
|
@ -79,42 +121,19 @@ sub _create_total_set {
|
|||
|
||||
my @leaderboard;
|
||||
|
||||
my $previous_board = $self->get_latest;
|
||||
|
||||
if ( defined $previous_board ) {
|
||||
$previous_board = $previous_board->values;
|
||||
}
|
||||
|
||||
while ( my $user_result = $user_rs->next ) {
|
||||
my $transaction_rs = $user_result->transactions->search_between( $start, $end );
|
||||
|
||||
my $transaction_sum = $transaction_rs->get_column('value')->sum;
|
||||
|
||||
my $previous_value;
|
||||
|
||||
if ( defined $previous_board ) {
|
||||
$previous_value = $previous_board->find({ user_id => $user_result->id });
|
||||
}
|
||||
|
||||
my $trend;
|
||||
|
||||
if ( ! defined $previous_value ) {
|
||||
$trend = 0;
|
||||
} elsif ( $previous_value->value > $transaction_sum ) {
|
||||
$trend = -1;
|
||||
} elsif ( $previous_value->value < $transaction_sum ) {
|
||||
$trend = 1;
|
||||
} else {
|
||||
$trend = 0;
|
||||
}
|
||||
|
||||
push @leaderboard, {
|
||||
user_id => $user_result->id,
|
||||
value => $transaction_sum || 0,
|
||||
trend => $trend,
|
||||
};
|
||||
}
|
||||
|
||||
@leaderboard = $self->_set_position_and_trend(@leaderboard);
|
||||
|
||||
$self->create_related(
|
||||
'sets',
|
||||
{
|
||||
|
@ -133,42 +152,19 @@ sub _create_count_set {
|
|||
|
||||
my @leaderboard;
|
||||
|
||||
my $previous_board = $self->get_latest;
|
||||
|
||||
if ( defined $previous_board ) {
|
||||
$previous_board = $previous_board->values;
|
||||
}
|
||||
|
||||
while ( my $user_result = $user_rs->next ) {
|
||||
my $transaction_rs = $user_result->transactions->search_between( $start, $end );
|
||||
|
||||
my $transaction_count = $transaction_rs->count;
|
||||
|
||||
my $previous_value;
|
||||
|
||||
if ( defined $previous_board ) {
|
||||
$previous_value = $previous_board->find({ user_id => $user_result->id });
|
||||
}
|
||||
|
||||
my $trend;
|
||||
|
||||
if ( ! defined $previous_value ) {
|
||||
$trend = 0;
|
||||
} elsif ( $previous_value->value > $transaction_count ) {
|
||||
$trend = -1;
|
||||
} elsif ( $previous_value->value < $transaction_count ) {
|
||||
$trend = 1;
|
||||
} else {
|
||||
$trend = 0;
|
||||
}
|
||||
|
||||
push @leaderboard, {
|
||||
user_id => $user_result->id,
|
||||
value => $transaction_count || 0,
|
||||
trend => $trend,
|
||||
};
|
||||
}
|
||||
|
||||
@leaderboard = $self->_set_position_and_trend(@leaderboard);
|
||||
|
||||
$self->create_related(
|
||||
'sets',
|
||||
{
|
||||
|
@ -187,41 +183,19 @@ sub _create_total_all_time {
|
|||
|
||||
my @leaderboard;
|
||||
|
||||
my $previous_board = $self->get_latest;
|
||||
|
||||
if ( defined $previous_board ) {
|
||||
$previous_board = $previous_board->values;
|
||||
}
|
||||
|
||||
while ( my $user_result = $user_rs->next ) {
|
||||
my $transaction_rs = $user_result->transactions;
|
||||
|
||||
my $transaction_sum = $transaction_rs->get_column('value')->sum;
|
||||
|
||||
my $previous_value;
|
||||
|
||||
if ( defined $previous_board ) {
|
||||
$previous_value = $previous_board->find({ user_id => $user_result->id });
|
||||
}
|
||||
|
||||
my $trend;
|
||||
|
||||
if ( ! defined $previous_value ) {
|
||||
$trend = 0;
|
||||
} elsif ( $previous_value->value > $transaction_sum ) {
|
||||
$trend = -1;
|
||||
} elsif ( $previous_value->value < $transaction_sum ) {
|
||||
$trend = 1;
|
||||
} else {
|
||||
$trend = 0;
|
||||
}
|
||||
|
||||
push @leaderboard, {
|
||||
user_id => $user_result->id,
|
||||
value => $transaction_sum || 0,
|
||||
};
|
||||
}
|
||||
|
||||
@leaderboard = $self->_set_position_and_trend(@leaderboard);
|
||||
|
||||
$self->create_related(
|
||||
'sets',
|
||||
{
|
||||
|
@ -240,42 +214,19 @@ sub _create_count_all_time {
|
|||
|
||||
my @leaderboard;
|
||||
|
||||
my $previous_board = $self->get_latest;
|
||||
|
||||
if ( defined $previous_board ) {
|
||||
$previous_board = $previous_board->values;
|
||||
}
|
||||
|
||||
while ( my $user_result = $user_rs->next ) {
|
||||
my $transaction_rs = $user_result->transactions;
|
||||
|
||||
my $transaction_count = $transaction_rs->count;
|
||||
|
||||
my $previous_value;
|
||||
|
||||
if ( defined $previous_board ) {
|
||||
$previous_value = $previous_board->find({ user_id => $user_result->id });
|
||||
}
|
||||
|
||||
my $trend;
|
||||
|
||||
if ( ! defined $previous_value ) {
|
||||
$trend = 0;
|
||||
} elsif ( $previous_value->value > $transaction_count ) {
|
||||
$trend = -1;
|
||||
} elsif ( $previous_value->value < $transaction_count ) {
|
||||
$trend = 1;
|
||||
} else {
|
||||
$trend = 0;
|
||||
}
|
||||
|
||||
push @leaderboard, {
|
||||
user_id => $user_result->id,
|
||||
value => $transaction_count || 0,
|
||||
trend => $trend,
|
||||
};
|
||||
}
|
||||
|
||||
@leaderboard = $self->_set_position_and_trend(@leaderboard);
|
||||
|
||||
$self->create_related(
|
||||
'sets',
|
||||
{
|
||||
|
|
|
@ -23,6 +23,10 @@ __PACKAGE__->add_columns(
|
|||
is_foreign_key => 1,
|
||||
is_nullable => 0,
|
||||
},
|
||||
"position" => {
|
||||
data_type => "integer",
|
||||
is_nullable => 0,
|
||||
},
|
||||
"value" => {
|
||||
data_type => "decimal",
|
||||
size => [ 16, 2 ],
|
||||
|
|
Reference in a new issue