make user counts use the database table
This commit is contained in:
parent
7d85b79814
commit
416161c943
@ -64,6 +64,9 @@ class SitemapPlugin extends Plugin
|
|||||||
|
|
||||||
switch ($cls)
|
switch ($cls)
|
||||||
{
|
{
|
||||||
|
case 'Sitemap_user_count':
|
||||||
|
require_once $dir . '/' . $cls . '.php';
|
||||||
|
return false;
|
||||||
case 'SitemapindexAction':
|
case 'SitemapindexAction':
|
||||||
case 'NoticesitemapAction':
|
case 'NoticesitemapAction':
|
||||||
case 'UsersitemapAction':
|
case 'UsersitemapAction':
|
||||||
@ -71,6 +74,7 @@ class SitemapPlugin extends Plugin
|
|||||||
return false;
|
return false;
|
||||||
case 'SitemapAction':
|
case 'SitemapAction':
|
||||||
require_once $dir . '/' . strtolower($cls) . '.php';
|
require_once $dir . '/' . strtolower($cls) . '.php';
|
||||||
|
return false;
|
||||||
default:
|
default:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -105,6 +105,11 @@ class Sitemap_user_count extends Memcached_DataObject
|
|||||||
return array('registration_date' => 'K');
|
return array('registration_date' => 'K');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sequenceKey()
|
||||||
|
{
|
||||||
|
return array(false, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return key definitions for Memcached_DataObject
|
* return key definitions for Memcached_DataObject
|
||||||
*
|
*
|
||||||
@ -118,4 +123,165 @@ class Sitemap_user_count extends Memcached_DataObject
|
|||||||
{
|
{
|
||||||
return $this->keys();
|
return $this->keys();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static function getAll()
|
||||||
|
{
|
||||||
|
$userCounts = self::cacheGet('sitemap:user:counts');
|
||||||
|
|
||||||
|
if ($userCounts === false) {
|
||||||
|
|
||||||
|
$suc = new Sitemap_user_count();
|
||||||
|
$suc->orderBy('registration_date DESC');
|
||||||
|
|
||||||
|
// Fetch the first one to check up-to-date-itude
|
||||||
|
|
||||||
|
$n = $suc->find(true);
|
||||||
|
|
||||||
|
$today = self::today();
|
||||||
|
$userCounts = array();
|
||||||
|
|
||||||
|
if (!$n) { // No counts saved yet
|
||||||
|
$userCounts = self::initializeCounts();
|
||||||
|
} else if ($suc->registration_date < $today) { // There are counts but not up to today
|
||||||
|
$userCounts = self::fillInCounts($suc->registration_date);
|
||||||
|
} else if ($suc->registration_date == $today) { // Refresh today's
|
||||||
|
$userCounts[$today] = self::updateToday();
|
||||||
|
}
|
||||||
|
|
||||||
|
// starts with second-to-last date
|
||||||
|
|
||||||
|
while ($suc->fetch()) {
|
||||||
|
$userCounts[$suc->registration_date] = $suc->user_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
self::cacheSet('sitemap:user:counts', $userCounts);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $userCounts;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function initializeCounts()
|
||||||
|
{
|
||||||
|
$firstDate = self::getFirstDate(); // awww
|
||||||
|
$today = self::today();
|
||||||
|
|
||||||
|
$counts = array();
|
||||||
|
|
||||||
|
for ($d = $firstDate; $d <= $today; $d = self::incrementDay($d)) {
|
||||||
|
common_debug("Date = '$d'");
|
||||||
|
$n = self::getCount($d);
|
||||||
|
self::insertCount($d, $n);
|
||||||
|
$counts[$d] = $n;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $counts;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function fillInCounts($lastDate)
|
||||||
|
{
|
||||||
|
$today = self::today();
|
||||||
|
|
||||||
|
$counts = array();
|
||||||
|
|
||||||
|
$n = self::getCount($lastDate);
|
||||||
|
self::updateCount($lastDate, $n);
|
||||||
|
|
||||||
|
$counts[$lastDate] = $n;
|
||||||
|
|
||||||
|
for ($d = self::incrementDay($lastDate); $d <= $today; $d = self::incrementDay($d)) {
|
||||||
|
$n = self::getCount($d);
|
||||||
|
self::insertCount($d, $n);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $counts;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function updateToday()
|
||||||
|
{
|
||||||
|
$today = self::today();
|
||||||
|
|
||||||
|
$n = self::getCount($today);
|
||||||
|
self::updateCount($today, $n);
|
||||||
|
|
||||||
|
return $n;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function getCount($d)
|
||||||
|
{
|
||||||
|
$user = new User();
|
||||||
|
$user->whereAdd('created BETWEEN "'.$d.' 00:00:00" AND "'.self::incrementDay($d).' 00:00:00"');
|
||||||
|
$n = $user->count();
|
||||||
|
|
||||||
|
return $n;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function insertCount($d, $n)
|
||||||
|
{
|
||||||
|
common_debug("Inserting count '$n' for '$d'");
|
||||||
|
|
||||||
|
$suc = new Sitemap_user_count();
|
||||||
|
|
||||||
|
$suc->registration_date = DB_DataObject_Cast::date($d);
|
||||||
|
$suc->user_count = $n;
|
||||||
|
$suc->created = common_sql_now();
|
||||||
|
$suc->modified = $suc->created;
|
||||||
|
|
||||||
|
if (!$suc->insert()) {
|
||||||
|
common_log(LOG_WARNING, "Could not save user counts for '$d'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static function updateCount($d, $n)
|
||||||
|
{
|
||||||
|
$suc = Sitemap_user_count::staticGet('registration_date', DB_DataObject_Cast::date($d));
|
||||||
|
|
||||||
|
if (empty($suc)) {
|
||||||
|
throw new Exception("No such registration date: $d");
|
||||||
|
}
|
||||||
|
|
||||||
|
$orig = clone($suc);
|
||||||
|
|
||||||
|
$suc->registration_date = DB_DataObject_Cast::date($d);
|
||||||
|
$suc->user_count = $n;
|
||||||
|
$suc->created = common_sql_now();
|
||||||
|
$suc->modified = $suc->created;
|
||||||
|
|
||||||
|
if (!$suc->update($orig)) {
|
||||||
|
common_log(LOG_WARNING, "Could not save user counts for '$d'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static function incrementDay($d)
|
||||||
|
{
|
||||||
|
$dt = self::dateStrToInt($d);
|
||||||
|
return self::dateIntToStr($dt + 24 * 60 * 60);
|
||||||
|
}
|
||||||
|
|
||||||
|
static function dateStrToInt($d)
|
||||||
|
{
|
||||||
|
return strtotime($d.' 00:00:00');
|
||||||
|
}
|
||||||
|
|
||||||
|
static function dateIntToStr($dt)
|
||||||
|
{
|
||||||
|
return date('Y-m-d', $dt);
|
||||||
|
}
|
||||||
|
|
||||||
|
static function getFirstDate()
|
||||||
|
{
|
||||||
|
$u = new User();
|
||||||
|
$u->selectAdd();
|
||||||
|
$u->selectAdd('date(min(created)) as first_date');
|
||||||
|
if ($u->find(true)) {
|
||||||
|
return $u->first_date;
|
||||||
|
} else {
|
||||||
|
// Is this right?
|
||||||
|
return self::dateIntToStr(time());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static function today()
|
||||||
|
{
|
||||||
|
return self::dateIntToStr(time());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -68,11 +68,15 @@ class SitemapindexAction extends Action
|
|||||||
|
|
||||||
function showUserSitemaps()
|
function showUserSitemaps()
|
||||||
{
|
{
|
||||||
$userCounts = $this->getUserCounts();
|
$userCounts = Sitemap_user_count::getAll();
|
||||||
|
|
||||||
foreach ($userCounts as $dt => $cnt) {
|
foreach ($userCounts as $dt => $cnt) {
|
||||||
$cnt = $cnt+0;
|
$cnt = $cnt+0;
|
||||||
assert($cnt != 0);
|
|
||||||
|
if ($cnt == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$n = (int)$cnt / (int)SitemapPlugin::USERS_PER_MAP;
|
$n = (int)$cnt / (int)SitemapPlugin::USERS_PER_MAP;
|
||||||
if (($cnt % SitemapPlugin::USERS_PER_MAP) != 0) {
|
if (($cnt % SitemapPlugin::USERS_PER_MAP) != 0) {
|
||||||
$n++;
|
$n++;
|
||||||
@ -88,7 +92,9 @@ class SitemapindexAction extends Action
|
|||||||
$noticeCounts = $this->getNoticeCounts();
|
$noticeCounts = $this->getNoticeCounts();
|
||||||
|
|
||||||
foreach ($noticeCounts as $dt => $cnt) {
|
foreach ($noticeCounts as $dt => $cnt) {
|
||||||
assert($cnt != 0);
|
if ($cnt == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
$n = $cnt / SitemapPlugin::NOTICES_PER_MAP;
|
$n = $cnt / SitemapPlugin::NOTICES_PER_MAP;
|
||||||
if ($cnt % SitemapPlugin::NOTICES_PER_MAP) {
|
if ($cnt % SitemapPlugin::NOTICES_PER_MAP) {
|
||||||
$n++;
|
$n++;
|
||||||
@ -101,28 +107,7 @@ class SitemapindexAction extends Action
|
|||||||
|
|
||||||
function getUserCounts()
|
function getUserCounts()
|
||||||
{
|
{
|
||||||
$userCounts = User::cacheGet('sitemap:user:counts');
|
return Sitemap_user_count::getAll();
|
||||||
|
|
||||||
if ($userCounts === false) {
|
|
||||||
|
|
||||||
$user = new User();
|
|
||||||
|
|
||||||
$user->selectAdd();
|
|
||||||
$user->selectAdd('date(created) as regdate, count(*) as regcount');
|
|
||||||
$user->groupBy('regdate');
|
|
||||||
|
|
||||||
$user->find();
|
|
||||||
|
|
||||||
$userCounts = array();
|
|
||||||
|
|
||||||
while ($user->fetch()) {
|
|
||||||
$userCounts[$user->regdate] = $user->regcount;
|
|
||||||
}
|
|
||||||
|
|
||||||
User::cacheSet('sitemap:user:counts', $userCounts);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $userCounts;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getNoticeCounts()
|
function getNoticeCounts()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user