Add retweet queries

This commit is contained in:
Alessio 2021-08-16 20:37:35 -07:00
parent 4a3c12b04a
commit 1c67a9039d
4 changed files with 118 additions and 1 deletions

View File

@ -0,0 +1,49 @@
package persistence
import (
"time"
"offline_twitter/scraper"
)
/**
* Save a Retweet. Do nothing if it already exists, because none of its parameters are modifiable.
*/
func (p Profile) SaveRetweet(r scraper.Retweet) error {
_, err := p.DB.Exec(`
insert into retweets (retweet_id, tweet_id, retweeted_by, retweeted_at)
values (?, ?, ?, ?)
on conflict do nothing
`,
r.RetweetID, r.TweetID, r.RetweetedByID, r.RetweetedAt.Unix(),
)
return err
}
/**
* Retrieve a Retweet by ID
*/
func (p Profile) GetRetweetById(id scraper.TweetID) (scraper.Retweet, error) {
stmt, err := p.DB.Prepare(`
select retweet_id, tweet_id, retweeted_by, retweeted_at
from retweets
where retweet_id = ?
`)
if err != nil {
return scraper.Retweet{}, err
}
defer stmt.Close()
var r scraper.Retweet
var retweeted_at int
row := stmt.QueryRow(id)
err = row.Scan(&r.RetweetID, &r.TweetID, &r.RetweetedByID, &retweeted_at)
if err != nil {
return scraper.Retweet{}, err
}
r.RetweetedAt = time.Unix(int64(retweeted_at), 0)
return r, nil
}

View File

@ -0,0 +1,37 @@
package persistence_test
import (
"testing"
"github.com/go-test/deep"
)
func TestSaveAndLoadRetweet(t *testing.T) {
profile_path := "test_profiles/TestRetweetQueries"
profile := create_or_load_profile(profile_path)
tweet := create_dummy_tweet()
err := profile.SaveTweet(tweet)
if err != nil {
t.Fatalf("Failed to save the tweet: %s", err.Error())
}
rt := create_dummy_retweet(tweet.ID)
// Save the Retweet
err = profile.SaveRetweet(rt)
if err != nil {
t.Fatalf("Failed to save the retweet: %s", err.Error())
}
// Reload the Retweet
new_rt, err := profile.GetRetweetById(rt.RetweetID)
if err != nil {
t.Fatalf("Failed to load the retweet: %s", err.Error())
}
if diff := deep.Equal(rt, new_rt); diff != nil {
t.Error(diff)
}
}

View File

@ -44,7 +44,7 @@ create table tweets (rowid integer primary key,
);
create table retweets(rowid integer primary key,
retweet_id integer not null,
retweet_id integer not null unique,
tweet_id integer not null,
retweeted_by integer not null,
retweeted_at integer not null,

View File

@ -26,6 +26,10 @@ func create_or_load_profile(profile_path string) persistence.Profile {
panic(err)
}
err = profile.SaveTweet(create_stable_tweet())
if err != nil {
panic(err)
}
err = profile.SaveRetweet(create_stable_retweet())
} else {
profile, err = persistence.LoadProfile(profile_path)
}
@ -114,6 +118,18 @@ func create_stable_tweet() scraper.Tweet {
}
}
/**
* Create a stable retweet with a fixed ID and parameters
*/
func create_stable_retweet() scraper.Retweet {
retweet_id := scraper.TweetID(-1)
return scraper.Retweet{
RetweetID: retweet_id,
TweetID: -1,
RetweetedByID: -1,
RetweetedAt: time.Unix(20000000, 0),
}
}
/**
* Create a new user with a random ID and handle
@ -173,3 +189,18 @@ func create_dummy_tweet() scraper.Tweet {
Hashtags: []string{"hash1", "hash2"},
}
}
/**
* Create a new retweet with a random ID for a given TweetID
*/
func create_dummy_retweet(tweet_id scraper.TweetID) scraper.Retweet {
rand.Seed(time.Now().UnixNano())
retweet_id := scraper.TweetID(rand.Int())
return scraper.Retweet{
RetweetID: retweet_id,
TweetID: tweet_id,
RetweetedByID: -1,
RetweetedAt: time.Unix(20000000, 0),
}
}