Extend by page statistics

This commit is contained in:
Dmitriy Simushev 2013-05-28 14:50:13 +00:00
parent 734c68a022
commit 62a2176aaa
7 changed files with 247 additions and 23 deletions

View File

@ -202,7 +202,11 @@ $dbtables = array(
"date" => "int NOT NULL DEFAULT 0", "date" => "int NOT NULL DEFAULT 0",
"address" => "varchar(1024)", "address" => "varchar(1024)",
"visits" => "int NOT NULL DEFAULT 0", "visits" => "int NOT NULL DEFAULT 0",
"chats" => "int NOT NULL DEFAULT 0" "chats" => "int NOT NULL DEFAULT 0",
"sentinvitations" => "int NOT NULL DEFAULT 0",
"acceptedinvitations" => "int NOT NULL DEFAULT 0",
"rejectedinvitations" => "int NOT NULL DEFAULT 0",
"ignoredinvitations" => "int NOT NULL DEFAULT 0"
), ),
); );
@ -254,7 +258,7 @@ $dbtables_can_update = array(
"${mysqlprefix}chatsitevisitor" => array(), "${mysqlprefix}chatsitevisitor" => array(),
"${mysqlprefix}requestcallback" => array("callbackid", "token", "function", "arguments"), "${mysqlprefix}requestcallback" => array("callbackid", "token", "function", "arguments"),
"${mysqlprefix}visitedpage" => array(), "${mysqlprefix}visitedpage" => array(),
"${mysqlprefix}visitedpagestatistics" => array(), "${mysqlprefix}visitedpagestatistics" => array("sentinvitations", "acceptedinvitations", "rejectedinvitations", "ignoredinvitations"),
); );
function show_install_err($text) function show_install_err($text)

View File

@ -240,6 +240,22 @@ if ($act == "silentcreateall") {
runsql("ALTER TABLE ${mysqlprefix}chatgroup ADD vchosturl varchar(255) DEFAULT ''", $link); runsql("ALTER TABLE ${mysqlprefix}chatgroup ADD vchosturl varchar(255) DEFAULT ''", $link);
} }
if (in_array("${mysqlprefix}visitedpagestatistics.sentinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}visitedpagestatistics ADD sentinvitations int NOT NULL DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}visitedpagestatistics.acceptedinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}visitedpagestatistics ADD acceptedinvitations int NOT NULL DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}visitedpagestatistics.rejectedinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}visitedpagestatistics ADD rejectedinvitations int NOT NULL DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}visitedpagestatistics.ignoredinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}visitedpagestatistics ADD ignoredinvitations int NOT NULL DEFAULT 0", $link);
}
// Add absent indexes // Add absent indexes
$absent_indexes = array(); $absent_indexes = array();
foreach ($dbtables_indexes as $id => $indexes) { foreach ($dbtables_indexes as $id => $indexes) {

View File

@ -427,30 +427,204 @@ function calculate_page_statistics() {
$start = empty($result['start']) ? 0 : $result['start']; $start = empty($result['start']) ? 0 : $result['start'];
$today = floor(time() / (24*60*60)) * 24*60*60; $today = floor(time() / (24*60*60)) * 24*60*60;
$statistics = array();
// Calculate statistics // Calculate statistics
$db->query( // Get main pages info
"INSERT INTO {visitedpagestatistics} (" . $db_results = $db->query(
"date, address, visits, chats" . "SELECT FLOOR(visittime / (24*60*60)) * 24*60*60 AS date, " .
") SELECT FLOOR(p.visittime / (24*60*60)) * 24*60*60 AS date, " . "address, " .
"p.address AS address, " . "COUNT(DISTINCT pageid) AS visits " .
"COUNT(DISTINCT p.pageid) AS visittimes, " . "FROM {visitedpage} ".
"COUNT(DISTINCT t.threadid) AS chattimes " . "WHERE calculated = 0 " .
"FROM {visitedpage} p " . "AND (visittime - :start) > 24*60*60 " .
"LEFT OUTER JOIN {chatthread} t ON (" . "AND (:today - visittime) > 24*60*60 " .
"p.address = t.referer " . "GROUP BY date, address",
"AND DATE(FROM_UNIXTIME(p.visittime)) = " .
"DATE(FROM_UNIXTIME(t.dtmcreated))) " .
"WHERE p.calculated = 0 " .
"AND (p.visittime - :start) > 24*60*60 " .
"AND (:today - p.visittime) > 24*60*60 " .
"GROUP BY date, address " .
"ORDER BY date",
array( array(
':start' => $start, ':start' => $start,
':today' => $today ':today' => $today
) ),
array('return_rows' => Database::RETURN_ALL_ROWS)
); );
foreach($db_results as $result) {
$statistics[$result['date'] . '_' . $result['address']] = $result;
}
// Get total chats count
$db_results = $db->query(
"SELECT FLOOR(p.visittime / (24*60*60)) * 24*60*60 AS date, " .
"p.address AS address, " .
"COUNT(DISTINCT t.threadid) AS chats " .
"FROM {visitedpage} p, {chatthread} t, " .
"(SELECT " .
"COUNT(*) AS msgs, " .
"m.threadid " .
"FROM {indexedchatmessage} m " .
"WHERE m.ikind = :kind_user OR m.ikind = :kind_agent " .
"GROUP BY m.threadid) tmp " .
"WHERE t.referer = p.address " .
"AND p.calculated = 0 " .
"AND t.threadid = tmp.threadid " .
"AND tmp.msgs > 0 " .
"AND t.dtmchatstarted <> 0 " .
"AND (p.visittime - :start) > 24*60*60 " .
"AND (:today - p.visittime) > 24*60*60 " .
"AND DATE(FROM_UNIXTIME(p.visittime)) " .
"= DATE(FROM_UNIXTIME(t.dtmcreated)) " .
"AND (t.invitationstate = :not_invited " .
"OR t.invitationstate = :invitation_accepted) " .
"GROUP BY date, address",
array(
':start' => $start,
':today' => $today,
':not_invited' => Thread::INVITATION_NOT_INVITED,
':invitation_accepted' => Thread::INVITATION_ACCEPTED,
':kind_agent' => Thread::KIND_AGENT,
':kind_user' => Thread::KIND_USER
),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
// Store info in statistics data
foreach($db_results as $result) {
$key = $result['date'] . '_' . $result['address'];
if (empty($statistics[$key])) {
$statistics[$key] = array();
}
$statistics[$key] += $result;
}
// Get info about accepted invitations
$db_results = $db->query(
"SELECT FLOOR(p.visittime / (24*60*60)) * 24*60*60 AS date, " .
"p.address AS address, " .
"COUNT(DISTINCT t.threadid) AS invitations_accepted " .
"FROM {visitedpage} p, {chatthread} t " .
"WHERE t.referer = p.address " .
"AND p.calculated = 0 " .
"AND (p.visittime - :start) > 24*60*60 " .
"AND (:today - p.visittime) > 24*60*60 " .
"AND DATE(FROM_UNIXTIME(p.visittime)) " .
"= DATE(FROM_UNIXTIME(t.dtmcreated)) " .
"AND t.invitationstate = :invitation_accepted " .
"GROUP BY date, address",
array(
':start' => $start,
':today' => $today,
':invitation_accepted' => Thread::INVITATION_ACCEPTED
),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
// Store info in statistics data
foreach($db_results as $result) {
$key = $result['date'] . '_' . $result['address'];
if (empty($statistics[$key])) {
$statistics[$key] = array();
}
$statistics[$key] += $result;
}
// Get info about rejected invitations
$db_results = $db->query(
"SELECT FLOOR(p.visittime / (24*60*60)) * 24*60*60 AS date, " .
"p.address AS address, " .
"COUNT(DISTINCT t.threadid) AS invitations_rejected " .
"FROM {visitedpage} p, {chatthread} t " .
"WHERE t.referer = p.address " .
"AND p.calculated = 0 " .
"AND (p.visittime - :start) > 24*60*60 " .
"AND (:today - p.visittime) > 24*60*60 " .
"AND DATE(FROM_UNIXTIME(p.visittime)) " .
"= DATE(FROM_UNIXTIME(t.dtmcreated)) " .
"AND t.invitationstate = :invitation_rejected " .
"GROUP BY date, address",
array(
':start' => $start,
':today' => $today,
':invitation_rejected' => Thread::INVITATION_REJECTED
),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
// Store info in statistics data
foreach($db_results as $result) {
$key = $result['date'] . '_' . $result['address'];
if (empty($statistics[$key])) {
$statistics[$key] = array();
}
$statistics[$key] += $result;
}
// Get info about ignored invitations
$db_results = $db->query(
"SELECT FLOOR(p.visittime / (24*60*60)) * 24*60*60 AS date, " .
"p.address AS address, " .
"COUNT(DISTINCT t.threadid) AS invitations_ignored " .
"FROM {visitedpage} p, {chatthread} t " .
"WHERE t.referer = p.address " .
"AND p.calculated = 0 " .
"AND (p.visittime - :start) > 24*60*60 " .
"AND (:today - p.visittime) > 24*60*60 " .
"AND DATE(FROM_UNIXTIME(p.visittime)) " .
"= DATE(FROM_UNIXTIME(t.dtmcreated)) " .
"AND t.invitationstate = :invitation_ignored " .
"GROUP BY date, address",
array(
':start' => $start,
':today' => $today,
':invitation_ignored' => Thread::INVITATION_IGNORED
),
array('return_rows' => Database::RETURN_ALL_ROWS)
);
// Store info in statistics data
foreach($db_results as $result) {
$key = $result['date'] . '_' . $result['address'];
if (empty($statistics[$key])) {
$statistics[$key] = array();
}
$statistics[$key] += $result;
}
// Sort statistics by date before save it in the database
ksort($statistics);
foreach($statistics as $row) {
// Set default values
$row += array(
'visits' => 0,
'chats' => 0,
'invitations_accepted' => 0,
'invitations_rejected' => 0,
'invitations_ignored' => 0
);
$row['invitations_sent'] = $row['invitations_accepted']
+ $row['invitations_rejected']
+ $row['invitations_ignored'];
// Prepare data for insert
$insert_data = array();
foreach($row as $field_name => $field_value) {
$insert_data[':' . $field_name] = $field_value;
}
$db->query(
"INSERT INTO {visitedpagestatistics} (" .
"date, address, visits, chats, " .
"sentinvitations, acceptedinvitations, " .
"rejectedinvitations, ignoredinvitations " .
") VALUES (".
":date, :address, :visits, :chats, :invitations_sent, " .
":invitations_accepted, :invitations_rejected, " .
":invitations_ignored " .
")",
$insert_data
);
}
// Mark all visited pages as 'calculated' // Mark all visited pages as 'calculated'
$db->query( $db->query(
"UPDATE {visitedpage} SET calculated = 1 " . "UPDATE {visitedpage} SET calculated = 1 " .

View File

@ -470,6 +470,10 @@ report.byoperator.title=Threads by operator
report.bypage.1=Page report.bypage.1=Page
report.bypage.2=View times report.bypage.2=View times
report.bypage.3=Chat threads report.bypage.3=Chat threads
report.bypage.4=Invitations sent
report.bypage.5=Invitations accepted
report.bypage.6=Invitations rejected
report.bypage.7=Invitations ignored
report.bypage.title=Chat threads by page report.bypage.title=Chat threads by page
report.no_items=Not enough data report.no_items=Not enough data
report.total=Total: report.total=Total:

View File

@ -469,6 +469,10 @@ report.byoperator.title=
report.bypage.1=Страница report.bypage.1=Страница
report.bypage.2=Просмотров report.bypage.2=Просмотров
report.bypage.3=Диалогов report.bypage.3=Диалогов
report.bypage.4=Приглашений отправлено
report.bypage.5=Приглашений принято
report.bypage.6=Приглашений отклонено
report.bypage.7=Приглашений проигнорировано
report.bypage.title=Статистика по страницам report.bypage.title=Статистика по страницам
report.no_items=Мало данных report.no_items=Мало данных
report.total=Итого: report.total=Итого:

View File

@ -154,7 +154,11 @@ if ($statisticstype == 'bydate') {
$page['reportByPage'] = $db->query( $page['reportByPage'] = $db->query(
"SELECT SUM(visits) as visittimes, " . "SELECT SUM(visits) as visittimes, " .
"address, " . "address, " .
"SUM(chats) as chattimes " . "SUM(chats) as chattimes, " .
"SUM(sentinvitations) AS sentinvitations, " .
"SUM(acceptedinvitations) AS acceptedinvitations, " .
"SUM(rejectedinvitations) AS rejectedinvitations, " .
"SUM(ignoredinvitations) AS ignoredinvitations " .
"FROM {visitedpagestatistics} " . "FROM {visitedpagestatistics} " .
"WHERE date >= :start " . "WHERE date >= :start " .
"AND date < :end " . "AND date < :end " .

View File

@ -221,7 +221,19 @@ require_once('inc_errors.php');
<?php echo getlocal("report.bypage.2") ?> <?php echo getlocal("report.bypage.2") ?>
</th><th> </th><th>
<?php echo getlocal("report.bypage.3") ?> <?php echo getlocal("report.bypage.3") ?>
</th></tr> </th>
<?php if ($page['show_invitations_info']) { ?>
<th>
<?php echo getlocal("report.bypage.4") ?>
</th><th>
<?php echo getlocal("report.bypage.5") ?>
</th><th>
<?php echo getlocal("report.bypage.6") ?>
</th><th>
<?php echo getlocal("report.bypage.7") ?>
</th>
<?php } ?>
</tr>
</thead> </thead>
<tbody> <tbody>
<?php if( $page['reportByPage'] ) { ?> <?php if( $page['reportByPage'] ) { ?>
@ -230,11 +242,17 @@ require_once('inc_errors.php');
<td><a href="<?php echo htmlspecialchars($row['address']) ?>"><?php echo htmlspecialchars($row['address']) ?></a></td> <td><a href="<?php echo htmlspecialchars($row['address']) ?>"><?php echo htmlspecialchars($row['address']) ?></a></td>
<td><?php echo $row['visittimes'] ?></td> <td><?php echo $row['visittimes'] ?></td>
<td><?php echo $row['chattimes'] ?></td> <td><?php echo $row['chattimes'] ?></td>
<?php if ($page['show_invitations_info']) { ?>
<td><?php echo $row['sentinvitations'] ?></td>
<td><?php echo $row['acceptedinvitations'] ?></td>
<td><?php echo $row['rejectedinvitations'] ?></td>
<td><?php echo $row['ignoredinvitations'] ?></td>
<?php } ?>
</tr> </tr>
<?php } ?> <?php } ?>
<?php } else { ?> <?php } else { ?>
<tr> <tr>
<td colspan="3"> <td colspan="<?php echo($page['show_invitations_info'] ? 7 : 3); ?>">
<?php echo getlocal("report.no_items") ?> <?php echo getlocal("report.no_items") ?>
</td> </td>
</tr> </tr>