Add retweet queries
This commit is contained in:
parent
4a3c12b04a
commit
1c67a9039d
49
persistence/retweet_queries.go
Normal file
49
persistence/retweet_queries.go
Normal 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
|
||||||
|
}
|
37
persistence/retweet_queries_test.go
Normal file
37
persistence/retweet_queries_test.go
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
@ -44,7 +44,7 @@ create table tweets (rowid integer primary key,
|
|||||||
);
|
);
|
||||||
|
|
||||||
create table retweets(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,
|
tweet_id integer not null,
|
||||||
retweeted_by integer not null,
|
retweeted_by integer not null,
|
||||||
retweeted_at integer not null,
|
retweeted_at integer not null,
|
||||||
|
@ -26,6 +26,10 @@ func create_or_load_profile(profile_path string) persistence.Profile {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
err = profile.SaveTweet(create_stable_tweet())
|
err = profile.SaveTweet(create_stable_tweet())
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
err = profile.SaveRetweet(create_stable_retweet())
|
||||||
} else {
|
} else {
|
||||||
profile, err = persistence.LoadProfile(profile_path)
|
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
|
* Create a new user with a random ID and handle
|
||||||
@ -173,3 +189,18 @@ func create_dummy_tweet() scraper.Tweet {
|
|||||||
Hashtags: []string{"hash1", "hash2"},
|
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),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user