Include entire thread in tweet-detail query result
This commit is contained in:
parent
4c81846d15
commit
4343ab7971
@ -197,6 +197,7 @@ type TweetDetailView struct {
|
|||||||
TweetTrove
|
TweetTrove
|
||||||
ParentIDs []TweetID
|
ParentIDs []TweetID
|
||||||
MainTweetID TweetID
|
MainTweetID TweetID
|
||||||
|
ThreadIDs []TweetID
|
||||||
ReplyChains [][]TweetID
|
ReplyChains [][]TweetID
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -247,6 +248,39 @@ func (p Profile) GetTweetDetail(id TweetID, current_user_id UserID) (TweetDetail
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Threaded replies
|
||||||
|
stmt, err = p.DB.Preparex(`
|
||||||
|
with recursive thread_replies(id) as (
|
||||||
|
values(?)
|
||||||
|
union all
|
||||||
|
select tweets.id from tweets
|
||||||
|
join thread_replies on tweets.in_reply_to_id = thread_replies.id
|
||||||
|
where tweets.user_id = ?
|
||||||
|
)
|
||||||
|
|
||||||
|
select ` + TWEETS_ALL_SQL_FIELDS + `
|
||||||
|
from tweets
|
||||||
|
left join tombstone_types on tweets.tombstone_type = tombstone_types.rowid
|
||||||
|
left join likes on tweets.id = likes.tweet_id and likes.user_id = ?
|
||||||
|
inner join thread_replies on tweets.id = thread_replies.id
|
||||||
|
order by id asc`)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer stmt.Close()
|
||||||
|
var reply_thread []Tweet
|
||||||
|
err = stmt.Select(&reply_thread, id, ret.Tweets[ret.MainTweetID].UserID, current_user_id)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
for _, tweet := range reply_thread {
|
||||||
|
ret.Tweets[tweet.ID] = tweet
|
||||||
|
if tweet.ID != ret.MainTweetID {
|
||||||
|
ret.ThreadIDs = append(ret.ThreadIDs, tweet.ID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var replies []Tweet
|
var replies []Tweet
|
||||||
stmt, err = p.DB.Preparex(
|
stmt, err = p.DB.Preparex(
|
||||||
`select ` + TWEETS_ALL_SQL_FIELDS + `
|
`select ` + TWEETS_ALL_SQL_FIELDS + `
|
||||||
@ -254,16 +288,22 @@ func (p Profile) GetTweetDetail(id TweetID, current_user_id UserID) (TweetDetail
|
|||||||
left join tombstone_types on tweets.tombstone_type = tombstone_types.rowid
|
left join tombstone_types on tweets.tombstone_type = tombstone_types.rowid
|
||||||
left join likes on tweets.id = likes.tweet_id and likes.user_id = ?
|
left join likes on tweets.id = likes.tweet_id and likes.user_id = ?
|
||||||
where in_reply_to_id = ?
|
where in_reply_to_id = ?
|
||||||
|
and id != ? -- skip the main Thread if there is one
|
||||||
order by num_likes desc
|
order by num_likes desc
|
||||||
limit 50`)
|
limit 50`)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
defer stmt.Close()
|
defer stmt.Close()
|
||||||
err = stmt.Select(&replies, current_user_id, id)
|
thread_top_id := TweetID(0)
|
||||||
|
if len(ret.ThreadIDs) > 0 {
|
||||||
|
thread_top_id = ret.ThreadIDs[0]
|
||||||
|
}
|
||||||
|
err = stmt.Select(&replies, current_user_id, id, thread_top_id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(replies) > 0 {
|
if len(replies) > 0 {
|
||||||
reply_1_ids := []interface{}{}
|
reply_1_ids := []interface{}{}
|
||||||
for _, r := range replies {
|
for _, r := range replies {
|
||||||
|
@ -256,3 +256,39 @@ func TestTweetDetailWithParents(t *testing.T) {
|
|||||||
|
|
||||||
require.Len(tweet_detail.ReplyChains, 0)
|
require.Len(tweet_detail.ReplyChains, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestTweetDetailWithThread(t *testing.T) {
|
||||||
|
require := require.New(t)
|
||||||
|
assert := assert.New(t)
|
||||||
|
|
||||||
|
profile, err := persistence.LoadProfile("../../sample_data/profile")
|
||||||
|
require.NoError(err)
|
||||||
|
|
||||||
|
tweet_detail, err := profile.GetTweetDetail(TweetID(1698762403163304110), UserID(0))
|
||||||
|
require.NoError(err)
|
||||||
|
|
||||||
|
assert.Len(tweet_detail.Retweets, 0)
|
||||||
|
|
||||||
|
assert.Len(tweet_detail.Tweets, 11)
|
||||||
|
|
||||||
|
expected_thread := []TweetID{
|
||||||
|
1698762405268902217, 1698762406929781161, 1698762408410390772, 1698762409974857832,
|
||||||
|
1698762411853971851, 1698762413393236329, 1698762414957666416,
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(expected_thread, tweet_detail.ThreadIDs)
|
||||||
|
|
||||||
|
for _, id := range expected_thread {
|
||||||
|
_, is_ok := tweet_detail.Tweets[id]
|
||||||
|
assert.True(is_ok)
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Len(tweet_detail.Users, 2)
|
||||||
|
_, is_ok := tweet_detail.Users[1458284524761075714]
|
||||||
|
assert.True(is_ok)
|
||||||
|
_, is_ok = tweet_detail.Users[534463724]
|
||||||
|
assert.True(is_ok)
|
||||||
|
|
||||||
|
require.Len(tweet_detail.ReplyChains, 1) // Should not include the Thread replies
|
||||||
|
assert.Equal(tweet_detail.ReplyChains[0][0], TweetID(1698792233619562866))
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user