204 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * StatusNet - the distributed open-source microblogging tool
 | |
|  * Copyright (C) 2011, StatusNet, Inc.
 | |
|  *
 | |
|  * Score of a notice by activity spam service
 | |
|  *
 | |
|  * PHP version 5
 | |
|  *
 | |
|  * This program is free software: you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU Affero General Public License as published by
 | |
|  * the Free Software Foundation, either version 3 of the License, or
 | |
|  * (at your option) any later version.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU Affero General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Affero General Public License
 | |
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | |
|  *
 | |
|  * @category  Spam
 | |
|  * @package   StatusNet
 | |
|  * @author    Evan Prodromou <evan@status.net>
 | |
|  * @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 <evan@status.net>
 | |
|  * @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
 | |
| 
 | |
|     public static function save($notice, $result)
 | |
|     {
 | |
| 
 | |
|         $orig = null;
 | |
|         $score = Spam_score::getKV('notice_id', $notice->id);
 | |
| 
 | |
|         if (empty($score)) {
 | |
|             $score = new Spam_score();
 | |
|         } else {
 | |
|             $orig = clone($score);
 | |
|         }
 | |
| 
 | |
|         $score->notice_id = $notice->id;
 | |
|         $score->score = $result->probability;
 | |
|         $score->is_spam = $result->isSpam;
 | |
|         $score->scaled = Spam_score::scale($score->score);
 | |
|         $score->created = common_sql_now();
 | |
|         $score->notice_created = $notice->created;
 | |
| 
 | |
|         if (empty($orig)) {
 | |
|             $score->insert();
 | |
|         } else {
 | |
|             $score->update($orig);
 | |
|         }
 | |
| 
 | |
|         self::blow('spam_score:notice_ids');
 | |
| 
 | |
|         return $score;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 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::getKV('id', $score->notice_id);
 | |
|                 if (!empty($notice)) {
 | |
|                     $orig = clone($score);
 | |
|                     $score->notice_created = $notice->created;
 | |
|                     $score->update($orig);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function saveNew($notice, $result)
 | |
|     {
 | |
| 
 | |
|         $score = new Spam_score();
 | |
| 
 | |
|         $score->notice_id = $notice->id;
 | |
|         $score->score = $result->probability;
 | |
|         $score->is_spam = $result->isSpam;
 | |
|         $score->scaled = Spam_score::scale($score->score);
 | |
|         $score->created = common_sql_now();
 | |
|         $score->notice_created = $notice->created;
 | |
| 
 | |
|         $score->insert();
 | |
| 
 | |
|         self::blow('spam_score:notice_ids');
 | |
| 
 | |
|         return $score;
 | |
|     }
 | |
| 
 | |
|     public static function scale($score)
 | |
|     {
 | |
|         $raw = round($score * Spam_score::MAX_SCALE);
 | |
|         return max(0, min(Spam_score::MAX_SCALE, $raw));
 | |
|     }
 | |
| 
 | |
|     public function delete($useWhere = false)
 | |
|     {
 | |
|         self::blow('spam_score:notice_ids');
 | |
|         self::blow('spam_score:notice_ids;last');
 | |
|         return parent::delete($useWhere);
 | |
|     }
 | |
| }
 |