diff options
Diffstat (limited to 'internal/timeline/timeline.go')
-rw-r--r-- | internal/timeline/timeline.go | 80 |
1 files changed, 22 insertions, 58 deletions
diff --git a/internal/timeline/timeline.go b/internal/timeline/timeline.go index 1076d05a6..fb7671819 100644 --- a/internal/timeline/timeline.go +++ b/internal/timeline/timeline.go @@ -21,6 +21,7 @@ package timeline import ( "context" "sync" + "time" ) // GrabFunction is used by a Timeline to grab more items to index. @@ -73,26 +74,9 @@ type Timeline interface { // If prepareNext is true, then the next predicted query will be prepared already in a goroutine, // to make the next call to Get faster. Get(ctx context.Context, amount int, maxID string, sinceID string, minID string, prepareNext bool) ([]Preparable, error) - // GetXFromTop returns x amount of items from the top of the timeline, from newest to oldest. - GetXFromTop(ctx context.Context, amount int) ([]Preparable, error) - // GetXBehindID returns x amount of items from the given id onwards, from newest to oldest. - // This will NOT include the item with the given ID. - // - // This corresponds to an api call to /timelines/home?max_id=WHATEVER - GetXBehindID(ctx context.Context, amount int, fromID string, attempts *int) ([]Preparable, error) - // GetXBeforeID returns x amount of items up to the given id, from newest to oldest. - // This will NOT include the item with the given ID. - // - // This corresponds to an api call to /timelines/home?since_id=WHATEVER - GetXBeforeID(ctx context.Context, amount int, sinceID string, startFromTop bool) ([]Preparable, error) - // GetXBetweenID returns x amount of items from the given maxID, up to the given id, from newest to oldest. - // This will NOT include the item with the given IDs. - // - // This corresponds to an api call to /timelines/home?since_id=WHATEVER&max_id=WHATEVER_ELSE - GetXBetweenID(ctx context.Context, amount int, maxID string, sinceID string) ([]Preparable, error) /* - INDEXING FUNCTIONS + INDEXING + PREPARATION FUNCTIONS */ // IndexOne puts a item into the timeline at the appropriate place according to its 'createdAt' property. @@ -100,35 +84,14 @@ type Timeline interface { // The returned bool indicates whether or not the item was actually inserted into the timeline. This will be false // if the item is a boost and the original item or another boost of it already exists < boostReinsertionDepth back in the timeline. IndexOne(ctx context.Context, itemID string, boostOfID string, accountID string, boostOfAccountID string) (bool, error) - - // OldestIndexedItemID returns the id of the rearmost (ie., the oldest) indexed item, or an error if something goes wrong. - // If nothing goes wrong but there's no oldest item, an empty string will be returned so make sure to check for this. - OldestIndexedItemID(ctx context.Context) (string, error) - // NewestIndexedItemID returns the id of the frontmost (ie., the newest) indexed item, or an error if something goes wrong. - // If nothing goes wrong but there's no newest item, an empty string will be returned so make sure to check for this. - NewestIndexedItemID(ctx context.Context) (string, error) - - IndexBefore(ctx context.Context, itemID string, amount int) error - IndexBehind(ctx context.Context, itemID string, amount int) error - - /* - PREPARATION FUNCTIONS - */ - - // PrepareXFromTop instructs the timeline to prepare x amount of items from the top of the timeline. - PrepareFromTop(ctx context.Context, amount int) error - // PrepareBehind instructs the timeline to prepare the next amount of entries for serialization, from position onwards. - // If include is true, then the given item ID will also be prepared, otherwise only entries behind it will be prepared. - PrepareBehind(ctx context.Context, itemID string, amount int) error - // IndexOne puts a item into the timeline at the appropriate place according to its 'createdAt' property, + // IndexAndPrepareOne puts a item into the timeline at the appropriate place according to its 'createdAt' property, // and then immediately prepares it. // // The returned bool indicates whether or not the item was actually inserted into the timeline. This will be false // if the item is a boost and the original item or another boost of it already exists < boostReinsertionDepth back in the timeline. IndexAndPrepareOne(ctx context.Context, itemID string, boostOfID string, accountID string, boostOfAccountID string) (bool, error) - // OldestPreparedItemID returns the id of the rearmost (ie., the oldest) prepared item, or an error if something goes wrong. - // If nothing goes wrong but there's no oldest item, an empty string will be returned so make sure to check for this. - OldestPreparedItemID(ctx context.Context) (string, error) + // PrepareXFromTop instructs the timeline to prepare x amount of items from the top of the timeline, useful during init. + PrepareFromTop(ctx context.Context, amount int) error /* INFO FUNCTIONS @@ -136,13 +99,24 @@ type Timeline interface { // ActualPostIndexLength returns the actual length of the item index at this point in time. ItemIndexLength(ctx context.Context) int + // OldestIndexedItemID returns the id of the rearmost (ie., the oldest) indexed item, or an error if something goes wrong. + // If nothing goes wrong but there's no oldest item, an empty string will be returned so make sure to check for this. + OldestIndexedItemID(ctx context.Context) (string, error) + // NewestIndexedItemID returns the id of the frontmost (ie., the newest) indexed item, or an error if something goes wrong. + // If nothing goes wrong but there's no newest item, an empty string will be returned so make sure to check for this. + NewestIndexedItemID(ctx context.Context) (string, error) /* UTILITY FUNCTIONS */ - // Reset instructs the timeline to reset to its base state -- cache only the minimum amount of items. - Reset() error + // LastGot returns the time that Get was last called. + LastGot() time.Time + // Prune prunes preparedItems and indexedItems in this timeline to the desired lengths. + // This will be a no-op if the lengths are already < the desired values. + // Prune acquires a lock on the timeline before pruning. + // The return value is the combined total of items pruned from preparedItems and indexedItems. + Prune(desiredPreparedItemsLength int, desiredIndexedItemsLength int) int // Remove removes a item from both the index and prepared items. // // If a item has multiple entries in a timeline, they will all be removed. @@ -157,12 +131,13 @@ type Timeline interface { // timeline fulfils the Timeline interface type timeline struct { - itemIndex *itemIndex + indexedItems *indexedItems preparedItems *preparedItems grabFunction GrabFunction filterFunction FilterFunction prepareFunction PrepareFunction accountID string + lastGot time.Time sync.Mutex } @@ -175,7 +150,7 @@ func NewTimeline( prepareFunction PrepareFunction, skipInsertFunction SkipInsertFunction) (Timeline, error) { return &timeline{ - itemIndex: &itemIndex{ + indexedItems: &indexedItems{ skipInsert: skipInsertFunction, }, preparedItems: &preparedItems{ @@ -185,17 +160,6 @@ func NewTimeline( filterFunction: filterFunction, prepareFunction: prepareFunction, accountID: timelineAccountID, + lastGot: time.Time{}, }, nil } - -func (t *timeline) Reset() error { - return nil -} - -func (t *timeline) ItemIndexLength(ctx context.Context) int { - if t.itemIndex == nil || t.itemIndex.data == nil { - return 0 - } - - return t.itemIndex.data.Len() -} |