From 2492014051e5cd4c37287a09639d18f85e1349dc Mon Sep 17 00:00:00 2001 From: Ben Morrison Date: Tue, 14 May 2019 03:08:07 -0400 Subject: moved query functions to own file, made SortByTime query-agnostic --- registry/index.go | 87 --------------------------------------------------- registry/query.go | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ registry/types.go | 10 +++--- 3 files changed, 98 insertions(+), 92 deletions(-) create mode 100644 registry/query.go (limited to 'registry') diff --git a/registry/index.go b/registry/index.go index 85277fc..4d82ebb 100644 --- a/registry/index.go +++ b/registry/index.go @@ -2,8 +2,6 @@ package registry import ( "log" - "sort" - "strings" "time" ) @@ -30,88 +28,3 @@ func (index UserIndex) DelUser(url string) { delete(index, url) imutex.Unlock() } - -// 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 sortedkeys TimeSlice - var users []string - imutex.RLock() - for k, v := range index { - if strings.Contains(v.nick, name) { - timekey[v.date] = v.nick + "\t" + k + "\t" + string(v.apidate) - sortedkeys = append(sortedkeys, v.date) - } - } - imutex.RUnlock() - sort.Sort(sortedkeys) - for _, e := range sortedkeys { - users = append(users, timekey[e]) - } - - return users -} - -// QueryTag returns all the known statuses that -// contain the provided tag. -func (index UserIndex) QueryTag(tag string) []string { - var statusmap StatusMapSlice - i := 0 - imutex.RLock() - for _, v := range index { - statusmap[i] = v.FindTag(tag) - i++ - } - imutex.RUnlock() - - return statusmap.SortByTime() -} - -// 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) StatusMap { - var statuses StatusMap - for k, e := range userdata.status { - parts := strings.Split(e, "\t") - statusslice := strings.Split(parts[3], " ") - for _, v := range statusslice { - if v[1:] == tag { - statuses[k] = e - break - } - } - } - - return statuses -} - -// SortByTime returns a string slice of the statuses sorted by time -func (sm StatusMapSlice) SortByTime() []string { - var tagmap StatusMap - var times TimeSlice - var statuses []string - for _, e := range sm { - for k, v := range e { - tagmap[k] = v - } - } - for k := range tagmap { - times = append(times, k) - } - sort.Sort(times) - for _, e := range times { - statuses = append(statuses, tagmap[e]) - } - - return statuses -} - -// GetStatuses returns the string slice containing a user's statuses -func (index UserIndex) GetStatuses(url string) StatusMap { - imutex.RLock() - status := index[url].status - imutex.RUnlock() - return status -} diff --git a/registry/query.go b/registry/query.go new file mode 100644 index 0000000..e024bc6 --- /dev/null +++ b/registry/query.go @@ -0,0 +1,93 @@ +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 + var users []string + imutex.RLock() + for k, v := range index { + if strings.Contains(v.nick, name) { + timekey[v.date] = v.nick + "\t" + k + "\t" + string(v.apidate) + keys = append(keys, v.date) + } + } + imutex.RUnlock() + sort.Sort(keys) + for _, e := range keys { + users = append(users, timekey[e]) + } + + return users +} + +// QueryTag returns all the known statuses that +// contain the provided tag. +func (index UserIndex) QueryTag(tag string) []string { + var statusmap TimeMapSlice + i := 0 + imutex.RLock() + for _, v := range index { + statusmap[i] = v.FindTag(tag) + i++ + } + imutex.RUnlock() + + return statusmap.SortByTime() +} + +// 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 + for k, e := range userdata.status { + parts := strings.Split(e, "\t") + statusslice := strings.Split(parts[3], " ") + for _, v := range statusslice { + if v[1:] == tag { + statuses[k] = e + break + } + } + } + + return statuses +} + +// 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 data []string + for _, e := range tm { + for k, v := range e { + unionmap[k] = v + } + } + for k := range unionmap { + times = append(times, k) + } + sort.Sort(times) + for _, e := range times { + data = append(data, unionmap[e]) + } + + 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 d3e421a..43b323f 100644 --- a/registry/types.go +++ b/registry/types.go @@ -19,16 +19,16 @@ type Data struct { nick string date time.Time apidate []byte - status StatusMap + status TimeMap } -// StatusMap holds the statuses posted by a given user. A standard -// time.Time value is used as the key, with the status as a string. -type StatusMap map[time.Time]string +// TimeMap holds extracted and processed user data as a +// string. A standard time.Time value is used as the key. +type TimeMap map[time.Time]string // StatusMapSlice is a slice of StatusMaps. Useful for sorting the // output of queries. -type StatusMapSlice []StatusMap +type TimeMapSlice []TimeMap // Mutex to control access to the User Index. var imutex = sync.RWMutex{} -- cgit 1.4.1-2-gfad0