Skip to content

Commit

Permalink
[DB MIGRATION REQ'D] Insights feed
Browse files Browse the repository at this point in the history
* Create insight baseline and insight model and DAOs
* Calculate 7-day and 30-day retweet averages at the end of each Twitter crawl
* Generate post retweet and least likely follower insights at the end of each Twitter crawl
* Display baselines view in app
 [ci skip]
  • Loading branch information
ginatrapani committed May 14, 2012
1 parent 24440cd commit 7a49531
Show file tree
Hide file tree
Showing 25 changed files with 1,252 additions and 11 deletions.
14 changes: 13 additions & 1 deletion tests/TestOfDAOFactory.php
Expand Up @@ -375,6 +375,18 @@ public function testGetShortLinkDAO() {
$this->assertNotNull($dao);
$this->assertIsA($dao, 'ShortLinkMySQLDAO');
}

public function testInsightBaselineDAO() {
$dao = DAOFactory::getDAO('InsightBaselineDAO');
$this->assertNotNull($dao);
$this->assertIsA($dao, 'InsightBaselineMySQLDAO');
}

public function testInsightDAO() {
$dao = DAOFactory::getDAO('InsightDAO');
$this->assertNotNull($dao);
$this->assertIsA($dao, 'InsightMySQLDAO');
}
/**
* Test get InstallerDAO without a config file, override with array of config values
*/
Expand All @@ -387,7 +399,7 @@ public function testGetInstallerDAONoConfigFile(){
$this->assertTrue(isset($dao));
$this->assertIsA($dao, 'InstallerMySQLDAO');
$result = $dao->getTables();
$this->assertEqual(sizeof($result), 29);
$this->assertEqual(sizeof($result), 31);
$this->assertEqual($result[0], $cfg_values["table_prefix"].'encoded_locations');
$this->restoreConfigFile();
}
Expand Down
104 changes: 104 additions & 0 deletions tests/TestOfInsightBaselineMySQLDAO.php
@@ -0,0 +1,104 @@
<?php
/**
*
* ThinkUp/tests/TestOfInsightBaselineMySQLDAO.php
*
* Copyright (c) 2012 Gina Trapani
*
* LICENSE:
*
* This file is part of ThinkUp (http://thinkupapp.com).
*
* ThinkUp is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any
* later version.
*
* ThinkUp 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 General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with ThinkUp. If not, see
* <http://www.gnu.org/licenses/>.
*
* @license http://www.gnu.org/licenses/gpl.html
* @copyright 2012 Gina Trapani
* @author Gina Trapani
*/
require_once dirname(__FILE__).'/init.tests.php';
require_once THINKUP_WEBAPP_PATH.'_lib/extlib/simpletest/autorun.php';
require_once THINKUP_WEBAPP_PATH.'config.inc.php';

class TestOfInsightBaselineMySQLDAO extends ThinkUpUnitTestCase {
public function setUp() {
parent::setUp();
$this->builders = self::buildData();
}

protected function buildData() {
$builders = array();
$builders[] = FixtureBuilder::build('insight_baselines', array('date'=>'2012-05-01',
'slug'=>'avg_replies_per_week', 'instance_id'=>1, 'value'=>51));
return $builders;
}

public function tearDown() {
$this->builders = null;
parent::tearDown();
}

public function testInsertInsightBaseline() {
$dao = new InsightBaselineMySQLDAO();
//date specified
$result = $dao->insertInsightBaseline('avg_replies_per_week', 1, 51, '2012-05-05');
$this->assertTrue($result);

$result = $dao->getInsightBaseline('avg_replies_per_week', 1, '2012-05-05');
$this->assertEqual($result->value, 51);

//inserting existing baseline should update
$result = $dao->insertInsightBaseline('avg_replies_per_week', 1, 50, '2012-05-05');
$this->assertTrue($result);

//assert update was successful
$result = $dao->getInsightBaseline('avg_replies_per_week', 1, '2012-05-05');
$this->assertEqual($result->value, 50);

//no date specified
$result = $dao->insertInsightBaseline('avg_replies_per_week', 1, 4551);
$this->assertTrue($result);
$result = $dao->getInsightBaseline('avg_replies_per_week', 1);
$this->assertEqual($result->value, 4551);
}

public function testGetInsightBaseline() {
$dao = new InsightBaselineMySQLDAO();
$result = $dao->getInsightBaseline('avg_replies_per_week', 1, '2012-05-01');
$this->assertIsA($result, 'InsightBaseline');
$this->assertEqual($result->slug, 'avg_replies_per_week');
$this->assertEqual($result->date, '2012-05-01');
$this->assertEqual($result->instance_id, 1);
$this->assertEqual($result->value, 51);

$result = $dao->getInsightBaseline('avg_replies_per_week', 1, '2012-05-02');
$this->assertNull($result);
}

public function testUpdateInsightBaseline() {
$dao = new InsightBaselineMySQLDAO();

//update existing baseline
$result = $dao->updateInsightBaseline('avg_replies_per_week', 1, 101, '2012-05-01');
$this->assertTrue($result);
//check that value was updated
$result = $dao->getInsightBaseline('avg_replies_per_week', 1, '2012-05-01');
$this->assertEqual($result->value, 101);

//update nonexistent baseline
$result = $dao->updateInsightBaseline('avg_replies_per_week', 1, 101, '2012-05-10');
$this->assertFalse($result);

//no date specified
$result = $dao->updateInsightBaseline('avg_replies_per_week', 1, 101);
$this->assertFalse($result);
}
}
100 changes: 100 additions & 0 deletions tests/TestOfInsightMySQLDAO.php
@@ -0,0 +1,100 @@
<?php
/**
*
* ThinkUp/tests/TestOfInsightMySQLDAO.php
*
* Copyright (c) 2012 Gina Trapani
*
* LICENSE:
*
* This file is part of ThinkUp (http://thinkupapp.com).
*
* ThinkUp is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any
* later version.
*
* ThinkUp 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 General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with ThinkUp. If not, see
* <http://www.gnu.org/licenses/>.
*
* @license http://www.gnu.org/licenses/gpl.html
* @copyright 2012 Gina Trapani
* @author Gina Trapani
*/
require_once dirname(__FILE__).'/init.tests.php';
require_once THINKUP_WEBAPP_PATH.'_lib/extlib/simpletest/autorun.php';
require_once THINKUP_WEBAPP_PATH.'config.inc.php';

class TestOfInsightMySQLDAO extends ThinkUpUnitTestCase {
public function setUp() {
parent::setUp();
$this->builders = self::buildData();
}

protected function buildData() {
$builders = array();
$builders[] = FixtureBuilder::build('insights', array('date'=>'2012-05-01', 'slug'=>'avg_replies_per_week',
'instance_id'=>'1', 'text'=>'Retweet spike! Your post got retweeted 110 times',
'emphasis'=>Insight::EMPHASIS_HIGH));
return $builders;
}

public function tearDown() {
$this->builders = null;
parent::tearDown();
}
public function testGetInsight() {
$dao = new InsightMySQLDAO();
$result = $dao->getInsight('avg_replies_per_week', 1, '2012-05-01');
$this->assertIsA($result, 'Insight');
$this->assertEqual($result->slug, 'avg_replies_per_week');
$this->assertEqual($result->date, '2012-05-01');
$this->assertEqual($result->instance_id, 1);
$this->assertEqual($result->text, 'Retweet spike! Your post got retweeted 110 times');
$this->assertEqual($result->emphasis, Insight::EMPHASIS_HIGH);

$result = $dao->getInsight('avg_replies_per_week', 1, '2012-05-02');
$this->assertNull($result);
}

public function testInsertInsight() {
$dao = new InsightMySQLDAO();
//date specified
$result = $dao->insertInsight('avg_replies_per_week', 1, '2012-05-05', 'Oh hai! You rock');
$this->assertTrue($result);

$result = $dao->getInsight('avg_replies_per_week', 1, '2012-05-05');
$this->assertEqual($result->text, 'Oh hai! You rock');
$this->assertNull($result->related_data);
$this->assertEqual($result->emphasis, Insight::EMPHASIS_LOW);

//inserting existing insight should update
$result = $dao->insertInsight('avg_replies_per_week', 1, '2012-05-05', 'Oh hai! Updated: You rock',
Insight::EMPHASIS_HIGH);
$this->assertTrue($result);

//assert update was successful
$result = $dao->getInsight('avg_replies_per_week', 1, '2012-05-05');
$this->assertEqual($result->text, 'Oh hai! Updated: You rock');
$this->assertEqual($result->emphasis, Insight::EMPHASIS_HIGH);
}

public function testUpdateInsight() {
$dao = new InsightMySQLDAO();

//update existing baseline
$result = $dao->updateInsight('avg_replies_per_week', 1, '2012-05-01', 'LOLlerskates', Insight::EMPHASIS_MED);
$this->assertTrue($result);
//check that value was updated
$result = $dao->getInsight('avg_replies_per_week', 1, '2012-05-01');
$this->assertEqual($result->text, 'LOLlerskates');
$this->assertEqual($result->emphasis, Insight::EMPHASIS_MED);

//update nonexistent baseline
$result = $dao->updateInsight('avg_replies_per_week', 1, '2012-05-10', 'ooooh burn');
$this->assertFalse($result);
}
}
17 changes: 16 additions & 1 deletion tests/TestOfInstaller.php
Expand Up @@ -139,6 +139,8 @@ public function testInstallerShowTables() {
$config->getValue('table_prefix')."instances, ".
$config->getValue('table_prefix')."instances_twitter, ".
$config->getValue('table_prefix')."invites," .
$config->getValue('table_prefix')."insight_baselines," .
$config->getValue('table_prefix')."insights," .
//$config->getValue('table_prefix')."links," .
$config->getValue('table_prefix')."links_short," .
$config->getValue('table_prefix')."mentions," .
Expand Down Expand Up @@ -215,6 +217,8 @@ public function testInstallerCheckTable() {
$config->getValue('table_prefix')."instances, ".
$config->getValue('table_prefix')."instances_twitter, ".
$config->getValue('table_prefix')."invites," .
$config->getValue('table_prefix')."insight_baselines," .
$config->getValue('table_prefix')."insights," .
$config->getValue('table_prefix')."links_short," .
$config->getValue('table_prefix')."mentions," .
$config->getValue('table_prefix')."mentions_posts, " .
Expand Down Expand Up @@ -282,6 +286,8 @@ public function testDoThinkUpTablesExist() {
$config->getValue('table_prefix')."instances, ".
$config->getValue('table_prefix')."instances_twitter, ".
$config->getValue('table_prefix')."invites," .
$config->getValue('table_prefix')."insight_baselines," .
$config->getValue('table_prefix')."insights," .
$config->getValue('table_prefix')."mentions," .
$config->getValue('table_prefix')."mentions_posts, " .
$config->getValue('table_prefix')."owner_instances, ".
Expand Down Expand Up @@ -325,6 +331,8 @@ public function testInstallerIsThinkUpInstalled() {
$config->getValue('table_prefix')."instances, ".
$config->getValue('table_prefix')."instances_twitter, ".
$config->getValue('table_prefix')."invites," .
$config->getValue('table_prefix')."insight_baselines," .
$config->getValue('table_prefix')."insights," .
$config->getValue('table_prefix')."mentions," .
$config->getValue('table_prefix')."mentions_posts, " .
$config->getValue('table_prefix')."owner_instances, ".
Expand Down Expand Up @@ -405,6 +413,8 @@ public function testInstallerPopulateTables() {
$config->getValue('table_prefix')."instances, ".
$config->getValue('table_prefix')."instances_twitter, ".
$config->getValue('table_prefix')."invites," .
$config->getValue('table_prefix')."insight_baselines," .
$config->getValue('table_prefix')."insights," .
$config->getValue('table_prefix')."links," .
$config->getValue('table_prefix')."links_short," .
$config->getValue('table_prefix')."mentions," .
Expand Down Expand Up @@ -447,6 +457,8 @@ public function testInstallerPopulateTables() {
$config->getValue('table_prefix')."instances, ".
$config->getValue('table_prefix')."instances_twitter, ".
$config->getValue('table_prefix')."invites," .
$config->getValue('table_prefix')."insight_baselines," .
$config->getValue('table_prefix')."insights," .
$config->getValue('table_prefix')."mentions," .
$config->getValue('table_prefix')."mentions_posts, " .
$config->getValue('table_prefix')."owner_instances, ".
Expand Down Expand Up @@ -488,6 +500,8 @@ public function testInstallerPopulateTables() {
$config->getValue('table_prefix')."instances, ".
$config->getValue('table_prefix')."instances_twitter, ".
$config->getValue('table_prefix')."invites," .
$config->getValue('table_prefix')."insight_baselines," .
$config->getValue('table_prefix')."insights," .
$config->getValue('table_prefix')."links," .
$config->getValue('table_prefix')."links_short," .
$config->getValue('table_prefix')."mentions," .
Expand Down Expand Up @@ -555,7 +569,8 @@ public function testGetTablesToInstall(){

$expected_tables = array('encoded_locations', 'favorites', 'follower_count', 'follows', 'group_member_count',
'group_members', 'groups', 'hashtags', 'hashtags_posts',
'instances', 'instances_twitter', 'invites', 'links', 'links_short', 'mentions', 'mentions_posts', 'options',
'insight_baselines', 'insights', 'instances', 'instances_twitter', 'invites',
'links', 'links_short', 'mentions', 'mentions_posts', 'options',
'owner_instances', 'owners', 'places','places_posts',
'plugins', 'post_errors', 'posts', 'stream_data', 'stream_procs', 'user_errors', 'users');
$this->assertIdentical($tables, $expected_tables);
Expand Down
2 changes: 1 addition & 1 deletion tests/TestOfInstallerMySQLDAO.php
Expand Up @@ -82,7 +82,7 @@ public function testGetTables() {
$config_array = $config->getValuesArray();
$dao = new InstallerMySQLDAO($config_array);
$result = $dao->getTables();
$this->assertEqual(sizeof($result), 28);
$this->assertEqual(sizeof($result), 30);
$this->assertEqual($result[0], $config_array["table_prefix"].'encoded_locations');
}
public function testCheckTable() {
Expand Down
38 changes: 38 additions & 0 deletions tests/TestOfPostMySQLDAO.php
Expand Up @@ -2830,4 +2830,42 @@ public function testUpdatePostText() {
$post = $dao->getPost(10, 'twitter');
$this->assertEqual($post->post_text, 'This is updated post 10');
}

public function testGetAverageRetweetCount() {
$builders = array();
//Add straight text posts
$counter = 1;
while ($counter < 40) {
$pseudo_minute = str_pad($counter, 2, "0", STR_PAD_LEFT);
if ($counter % 3 == 0) {
$source = '<a href="http://twitter.com" rel="nofollow">Tweetie for Mac</a>';
} else if ($counter % 3 == 1) {
$source = '<a href="http://twitter.com/tweetbutton" rel="nofollow">Tweet Button</a>';
} else {
$source = 'web';
}
$builders[] = FixtureBuilder::build('posts', array('id'=>$counter+256, 'post_id'=>$counter+256,
'author_user_id'=>'13', 'author_username'=>'ev', 'author_fullname'=>'Ev Williams',
'author_avatar'=>'avatar.jpg', 'post_text'=>'This is post '.$counter,
'source'=>$source, 'pub_date'=>'-'.$counter.'d', 'in_reply_to_user_id'=>null,
'reply_count_cache'=>($counter==10)?0:rand(0, 4), 'is_protected'=>0,
'retweet_count_cache'=>floor($counter/2), 'network'=>'twitter',
'old_retweet_count_cache' => floor($counter/3), 'in_rt_of_user_id' => null,
'in_reply_to_post_id'=>null, 'in_retweet_of_post_id'=>null, 'is_geo_encoded'=>0));
$counter++;
}

$dao = new PostMySQLDAO();
//without date (today)
$average_retweet_count = $dao->getAverageRetweetCount('ev', 'twitter', 7);
$this->assertEqual($average_retweet_count, 3);

//yesterday
$average_retweet_count = $dao->getAverageRetweetCount('ev', 'twitter', 7, date("Y-m-d", strtotime("-1 day")));
$this->assertEqual($average_retweet_count, 4);

//40 days ago
$average_retweet_count = $dao->getAverageRetweetCount('ev', 'twitter', 7, date("Y-m-d", strtotime("-40 day")));
$this->assertEqual($average_retweet_count, 17);
}
}
2 changes: 2 additions & 0 deletions tests/all_model_tests.php
Expand Up @@ -43,6 +43,8 @@
$model_tests->add(new TestOfGroupMySQLDAO());
$model_tests->add(new TestOfGroupMemberMySQLDAO());
$model_tests->add(new TestOfGroupMembershipCountMySQLDAO());
$model_tests->add(new TestOfInsightBaselineMySQLDAO());
$model_tests->add(new TestOfInsightMySQLDAO());
$model_tests->add(new TestOfInstanceMySQLDAO());
$model_tests->add(new TestOfInstaller());
$model_tests->add(new TestOfInstallerMySQLDAO());
Expand Down
8 changes: 7 additions & 1 deletion webapp/_lib/model/class.DAOFactory.php
Expand Up @@ -179,7 +179,13 @@ class DAOFactory {
//ShortLink MySQL DAO
'ShortLinkDAO' => array (
//MySQL Version
'mysql' => 'ShortLinkMySQLDAO')
'mysql' => 'ShortLinkMySQLDAO'),
'InsightBaselineDAO' => array (
//MySQL Version
'mysql' => 'InsightBaselineMySQLDAO'),
'InsightDAO' => array (
//MySQL Version
'mysql' => 'InsightMySQLDAO')
);

/*
Expand Down
2 changes: 1 addition & 1 deletion webapp/_lib/model/class.Dataset.php
Expand Up @@ -62,7 +62,7 @@ class Dataset {
* @var array String of allowed DAO names
*/
var $FETCHING_DAOS = array('FollowDAO', 'PostDAO', 'LinkDAO', 'FollowerCountDAO', 'FavoritePostDAO',
'PluginOptionDAO', 'GroupMembershipCountDAO');
'PluginOptionDAO', 'GroupMembershipCountDAO', 'InsightDAO');

/**
*
Expand Down

0 comments on commit 7a49531

Please sign in to comment.