#!/usr/bin/perl use strict; use warnings "all"; use locale; use FindBin; BEGIN { require "$FindBin::RealBin/../lib/Modules.pm"; } use Contenido::Globals; use Contenido::Init; use ErrorTee; use PidFile; use JSON::XS; use Data::Dumper; # begin Contenido::Init->init(); #PidFile->new($state); # db-based locking (run only on one host) #PidFile->new($state, per_host=>1); # db-based locking (run on whole cluster) #PidFile->new($state->{run_dir}); # file-based locking (run on whole cluster) my $keeper_module = $state->project.'::Keeper'; $keeper = $keeper_module->new($state); ############################################ # please use: # $state->{log_dir} for logging # $state->{tmp_dir} for temporary files ########################################### my @votings = $keeper->get_documents ( class => 'promosuite::Voting', status => [1,2], ); my $SIZE = 400; foreach my $voting ( @votings ) { my @voices; my $p = 0; my $voting_data = $voting->get_image('voting'); while ( my @vs = $keeper->get_documents ( class => 'promosuite::Voice', object_id => $voting->id, order_by => 'id', limit => $SIZE, offset => $SIZE * $p++ ) ) { push @voices, @vs; } if ( @voices ) { my %voting_data; foreach my $voice ( @voices ) { my $json = JSON::XS->new; my $voice_data = $json->decode($voice->voting); next unless ref $voice_data eq 'HASH'; while ( my ($qnum, $answer) = each %$voice_data ) { next unless ref $answer eq 'HASH'; while ( my ($anum, $value) = each %$answer ) { $voting_data{$qnum}{$anum}{total} = 0 unless defined $voting_data{$qnum}{$anum}{total}; $voting_data{$qnum}{$anum}{total} += $value; $voting_data{$qnum}{$anum}{count} = 0 unless defined $voting_data{$qnum}{$anum}{count}; $voting_data{$qnum}{$anum}{count}++; } } } for ( 1..$voting_data->{'question_amount'} ) { my $qnum = $_; if ( $voting_data->{questions}->[$qnum-1]->{amount} ) { for ( 1..$voting_data->{questions}->[$qnum-1]->{amount} ) { my $anum = $_ - 1; if ( exists $voting_data{$qnum} && exists $voting_data{$qnum}{$anum} ) { if ( $voting_data->{questions}->[$qnum-1]->{range} ) { $voting_data->{questions}->[$qnum-1]->{choices}->[$anum]->{votes} = $voting_data{$qnum}{$anum}{total}/$voting_data{$qnum}{$anum}{count}; } else { $voting_data->{questions}->[$qnum-1]->{choices}->[$anum]->{votes} = $voting_data{$qnum}{$anum}{total}; } } } } } $voting_data->{total} = scalar @voices; { local $Data::Dumper::Indent = 0; $voting->voting( Dumper($voting_data) ); } } $voting->status(3) if $voting->status == 2; $voting->store; }