From 1281d2b6bbc797af79d6a87b082276b2049693cd Mon Sep 17 00:00:00 2001 From: Ben Morrison Date: Tue, 14 May 2019 02:44:37 -0400 Subject: tentatively finished QueryTag and associated functions --- cache/index.go | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- cache/types.go | 13 +++++++++++-- 2 files changed, 63 insertions(+), 6 deletions(-) diff --git a/cache/index.go b/cache/index.go index ee00479..a6ee7b6 100644 --- a/cache/index.go +++ b/cache/index.go @@ -52,11 +52,59 @@ func (index UserIndex) QueryUser(name string) []string { 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 + for _, v := range index { + statusmap[i] = v.FindTag(tag) + i++ + } + + 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) { - //for _, e := range userdata.status { - //parts := strings.Split(e, "\t") +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 == tag { + statuses[k] = v + 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 { + return index[url].status } diff --git a/cache/types.go b/cache/types.go index 939114e..2962ab4 100644 --- a/cache/types.go +++ b/cache/types.go @@ -19,9 +19,17 @@ type Data struct { nick string date time.Time apidate []byte - status []string + status StatusMap } +// 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 + +// StatusMapSlice is a slice of StatusMaps. Useful for sorting the +// output of queries. +type StatusMapSlice []StatusMap + // Mutex to control access to the User Index. var imutex = sync.RWMutex{} @@ -34,7 +42,8 @@ func (t TimeSlice) Len() int { return len(t) } -// Less returns true if the timestamp at index i is before the timestamp at index j in TimeSlice. +// Less returns true if the timestamp at index i is before the +// timestamp at index j in TimeSlice. // This helps satisfy sort.Interface with respect to TimeSlice. func (t TimeSlice) Less(i, j int) bool { return t[i].Before(t[j]) -- cgit 1.4.1-2-gfad0