From faad3621aea68c05d67e86e3b1b3dfc983c7b620 Mon Sep 17 00:00:00 2001 From: Ben Morrison Date: Tue, 14 May 2019 03:40:02 -0400 Subject: fleshing out Indexer interface --- registry/index.go | 26 +++++++++++++++++++++----- registry/query.go | 21 ++++++--------------- registry/types.go | 19 +++++++++++++++++++ 3 files changed, 46 insertions(+), 20 deletions(-) (limited to 'registry') diff --git a/registry/index.go b/registry/index.go index c3ea178..c5f8d2c 100644 --- a/registry/index.go +++ b/registry/index.go @@ -5,11 +5,6 @@ import ( "time" ) -// NewUserIndex returns a new instance of a user index -func NewUserIndex() *UserIndex { - return &UserIndex{} -} - // AddUser inserts a new user into the index. The *Data struct // contains the nickname and the time the user was added. func (index UserIndex) AddUser(nick string, url string) { @@ -28,3 +23,24 @@ func (index UserIndex) DelUser(url string) { delete(index, url) imutex.Unlock() } + +// GetUserStatuses returns a TimeMap containing a user's statuses +func (index UserIndex) GetUserStatuses(url string) TimeMap { + imutex.RLock() + status := index[url].Status + imutex.RUnlock() + return status +} + +// GetStatuses returns a TimeMap containing all statuses +func (index UserIndex) GetStatuses() TimeMap { + statuses := NewTimeMap() + imutex.RLock() + for _, v := range index { + for a, b := range v.Status { + statuses[a] = b + } + } + imutex.RUnlock() + return statuses +} diff --git a/registry/query.go b/registry/query.go index 32f5c6c..ce22ab4 100644 --- a/registry/query.go +++ b/registry/query.go @@ -3,15 +3,14 @@ package registry import ( "sort" "strings" - "time" ) // QueryUser checks the user index for nicknames that contain the // nickname provided as an argument. Entries are returned sorted // by the date they were added to the index. func (index UserIndex) QueryUser(name string) []string { - var timekey = map[time.Time]string{} - var keys TimeSlice + timekey := NewTimeMap() + keys := make(TimeSlice, 0) var users []string imutex.RLock() for k, v := range index { @@ -32,7 +31,7 @@ func (index UserIndex) QueryUser(name string) []string { // QueryTag returns all the known statuses that // contain the provided tag. func (index UserIndex) QueryTag(tag string) []string { - var statusmap TimeMapSlice + statusmap := NewTimeMapSlice() i := 0 imutex.RLock() for _, v := range index { @@ -47,7 +46,7 @@ func (index UserIndex) QueryTag(tag string) []string { // FindTag takes a user's tweets and looks for a given tag. // Returns the tweets with the tag as a []string. func (userdata *Data) FindTag(tag string) TimeMap { - var statuses TimeMap + statuses := NewTimeMap() for k, e := range userdata.Status { parts := strings.Split(e, "\t") statusslice := strings.Split(parts[3], " ") @@ -65,8 +64,8 @@ func (userdata *Data) FindTag(tag string) TimeMap { // SortByTime returns a string slice of the query results // sorted by time.Time func (tm TimeMapSlice) SortByTime() []string { - var unionmap TimeMap - var times TimeSlice + var unionmap = NewTimeMap() + var times = make(TimeSlice, 0) var data []string for _, e := range tm { for k, v := range e { @@ -83,11 +82,3 @@ func (tm TimeMapSlice) SortByTime() []string { return data } - -// GetStatuses returns the string slice containing a user's statuses -func (index UserIndex) GetStatuses(url string) TimeMap { - imutex.RLock() - status := index[url].Status - imutex.RUnlock() - return status -} diff --git a/registry/types.go b/registry/types.go index 429c55c..6e8e7b1 100644 --- a/registry/types.go +++ b/registry/types.go @@ -9,6 +9,10 @@ import ( type Indexer interface { AddUser(string, string) DelUser(string) + GetUserStatuses() TimeMap + GetStatuses() TimeMap + QueryUser(string) []string + QueryTag(string) []string } // UserIndex provides an index of users by URL @@ -39,6 +43,21 @@ var imutex = sync.RWMutex{} // TimeSlice is used for sorting by timestamp. type TimeSlice []time.Time +// NewUserIndex returns a new instance of a user index +func NewUserIndex() *UserIndex { + return &UserIndex{} +} + +// NewTimeMap returns an initialized TimeMap. +func NewTimeMap() TimeMap { + return make(TimeMap) +} + +// NewTimeMapSlice returns an initialized slice of TimeMaps with zero length. +func NewTimeMapSlice() TimeMapSlice { + return make(TimeMapSlice, 0) +} + // Len returns the length of the slice to be sorted. // This helps satisfy sort.Interface with respect to TimeSlice. func (t TimeSlice) Len() int { -- cgit 1.4.1-2-gfad0