. * * @category Spam * @package StatusNet * @author Evan Prodromou * @copyright 2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ if (!defined('STATUSNET')) { exit(1); } /** * Score of a notice per the activity spam service * * @category Spam * @package StatusNet * @author Evan Prodromou * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 * @link http://status.net/ * * @see DB_DataObject */ class Spam_score extends Managed_DataObject { const MAX_SCALE = 10000; public $__table = 'spam_score'; // table name public $notice_id; // int public $score; // float public $created; // datetime /** * Get an instance by key * * @param string $k Key to use to lookup (usually 'notice_id' for this class) * @param mixed $v Value to lookup * * @return Spam_score object found, or null for no hits * */ function staticGet($k, $v=null) { return Managed_DataObject::staticGet('Spam_score', $k, $v); } /** * The One True Thingy that must be defined and declared. */ public static function schemaDef() { return array( 'description' => 'score of the notice per activityspam', 'fields' => array( 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice getting scored'), 'score' => array('type' => 'double', 'not null' => true, 'description' => 'score for the notice (0.0, 1.0)'), 'scaled' => array('type' => 'int', 'description' => 'scaled score for the notice (0, 10000)'), 'is_spam' => array('type' => 'tinyint', 'description' => 'flag for spamosity'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'notice_created' => array('type' => 'datetime', 'description' => 'date the notice was created'), ), 'primary key' => array('notice_id'), 'foreign keys' => array( 'spam_score_notice_id_fkey' => array('notice', array('notice_id' => 'id')), ), 'indexes' => array( 'spam_score_created_idx' => array('created'), 'spam_score_scaled_idx' => array('scaled'), ), ); } public static function upgrade() { Spam_score::upgradeScaled(); Spam_score::upgradeIsSpam(); Spam_score::upgradeNoticeCreated(); } protected static function upgradeScaled() { $score = new Spam_score(); $score->whereAdd('scaled IS NULL'); if ($score->find()) { while ($score->fetch()) { $orig = clone($score); $score->scaled = Spam_score::scale($score->score); $score->update($orig); } } } protected static function upgradeIsSpam() { $score = new Spam_score(); $score->whereAdd('is_spam IS NULL'); if ($score->find()) { while ($score->fetch()) { $orig = clone($score); $score->is_spam = ($score->score >= 0.90) ? 1 : 0; $score->update($orig); } } } protected static function upgradeNoticeCreated() { $score = new Spam_score(); $score->whereAdd('notice_created IS NULL'); if ($score->find()) { while ($score->fetch()) { $notice = Notice::staticGet('id', $score->notice_id); if (!empty($notice)) { $orig = clone($score); $score->notice_created = $notice->created; $score->update($orig); } } } } protected static function scale($score) { $raw = round($score * Spam_score::MAX_SCALE); return max(0, min(Spam_score::MAX_SCALE, $raw)); } }