151 lines
4.3 KiB
Perl
151 lines
4.3 KiB
Perl
package WebGUI::Workflow::Activity::SummarizePassiveAnalytics;
|
|
|
|
use strict;
|
|
use base 'WebGUI::Workflow::Activity';
|
|
|
|
=head1 NAME
|
|
|
|
Package WebGUI::Workflow::Activity::SummarizePassiveAnalytics
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
Summarize how long a user stayed on a page, using a user supplied interval.
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
See WebGUI::Workflow::Activity for details on how to use any activity.
|
|
|
|
=head1 METHODS
|
|
|
|
These methods are available from this class:
|
|
|
|
=cut
|
|
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 definition ( session, definition )
|
|
|
|
See WebGUI::Workflow::Activity::definition() for details.
|
|
|
|
=cut
|
|
|
|
sub definition {
|
|
my $class = shift;
|
|
my $session = shift;
|
|
my $definition = shift;
|
|
my $i18n = WebGUI::International->new($session, 'PassiveAnalytics');
|
|
push(@{$definition}, {
|
|
name=>$i18n->get('Summarize Passive Analytics'),
|
|
properties=> {
|
|
deltaInterval => {
|
|
fieldType => 'interval',
|
|
label => $i18n->get('pause interval'),
|
|
defaultValue => 15,
|
|
hoverHelp => $i18n->get('pause interval help'),
|
|
},
|
|
}
|
|
});
|
|
return $class->SUPER::definition($session,$definition);
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 get_statement( session, counter )
|
|
|
|
Return a statement handle at the desired offset.
|
|
|
|
=cut
|
|
|
|
sub get_statement {
|
|
my ($session, $counter) = @_;
|
|
my $passive = q{select SQL_CALC_FOUND_ROWS * from passiveLog where userId <> '1' limit ?, 500000};
|
|
my $sth = $session->db->read($passive, [$counter+0]);
|
|
return $sth;
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 execute ( [ object ] )
|
|
|
|
Analyze the passiveLog table, and generate the deltaLog table.
|
|
|
|
=head3 notes
|
|
|
|
If there is only 1 line in the table for a particular sessionId or
|
|
userId, no conclusions as to how long the user viewed a page can be
|
|
drawn from that. Similarly, the last entry in their browsing log
|
|
yields no data, since we require another entry in the passiveLog to
|
|
determine a delta.
|
|
|
|
=cut
|
|
|
|
sub execute {
|
|
my ($self, undef, $instance) = @_;
|
|
my $session = $self->session;
|
|
my $endTime = time() + $self->getTTL;
|
|
my $deltaInterval = $self->get('deltaInterval');
|
|
|
|
my $lastUserId;
|
|
my $lastSessionId;
|
|
my $lastTimeStamp;
|
|
my $lastAssetId;
|
|
my $lastUrl;
|
|
my $counter = $instance->getScratch('counter');
|
|
my $sth = get_statement($session, $counter);
|
|
if (! $counter) { #Clean up from last time, just in case
|
|
$session->db->write('delete from deltaLog');
|
|
$session->db->write('delete from PA_lastLog');
|
|
}
|
|
|
|
my $total_rows = $session->db->quickScalar('select found_rows()');
|
|
|
|
my $deltaLog = $session->db->prepare('insert into deltaLog (userId, assetId, timeStamp, url, delta) VALUES (?,?,?,?,?)');
|
|
my $recordLast = $session->db->prepare('REPLACE INTO PA_lastLog (userId, sessionId, timeStamp, url) VALUES (?,?,?,?)');
|
|
my $fetchLast = $session->db->prepare('select * from PA_lastLog where sessionId=? and userId=?');
|
|
|
|
my $expired = 0;
|
|
LOG_CHUNK: while (1) {
|
|
LOG_ENTRY: while (my $logLine = $sth->hashRef()) {
|
|
$counter++;
|
|
$fetchLast->execute([@{$logLine}{qw/sessionId userId/}]);
|
|
my $lastLine = $fetchLast->hashRef();
|
|
$recordLast->execute([ (@{ $logLine }{qw/userId sessionId timeStamp url/}) ]);
|
|
if ($lastLine->{timeStamp}) {
|
|
my $delta = $logLine->{timeStamp} - $lastLine->{timeStamp};
|
|
if ($delta <= $deltaInterval) {
|
|
$deltaLog->execute([ (@{ $lastLine }{qw/userId assetId timeStamp url/}), $delta]);
|
|
}
|
|
}
|
|
if (time() > $endTime) {
|
|
$expired = 1;
|
|
last LOG_ENTRY;
|
|
}
|
|
}
|
|
|
|
if ($expired) {
|
|
$deltaLog->finish;
|
|
$recordLast->finish;
|
|
$fetchLast->finish;
|
|
$sth->finish;
|
|
$instance->setScratch('counter', $counter);
|
|
return $self->WAITING(1);
|
|
}
|
|
last LOG_CHUNK if $counter >= $total_rows;
|
|
$sth = get_statement($session, $counter);
|
|
}
|
|
|
|
$instance->deleteScratch('counter');
|
|
$deltaLog->finish;
|
|
$recordLast->finish;
|
|
$fetchLast->finish;
|
|
$sth->finish;
|
|
$session->db->write('delete from PA_lastLog');
|
|
return $self->COMPLETE;
|
|
}
|
|
|
|
|
|
|
|
1;
|
|
|
|
#vim:ft=perl
|