Commit f147f10
Changed files (3)
question.go
@@ -13,7 +13,7 @@ import (
// this question is a member of
func assignCategory(category string, record *Record) {
if _, inMap := recordMap[category]; inMap != true {
- recordMap[category] = map[int]Record{}
+ recordMap[category] = []Record{}
categoryKeys = append(categoryKeys, category)
record.Category = len(categoryKeys) - 1
} else {
@@ -41,8 +41,7 @@ func parseLine(line string) error {
record.Answer = strings.TrimSpace(tokens[1])
category := strings.TrimSpace(strings.ToLower(tokens[2]))
assignCategory(category, &record)
- key := len(recordMap[category]) + 1
- recordMap[category][key] = record
+ recordMap[category] = append(recordMap[category], record)
return nil
}
serverHandlers.go
@@ -25,17 +25,20 @@ var userTestsLock = sync.RWMutex{}
func getRecordForCategory(category string) Record {
mapLock.Lock()
defer mapLock.Unlock()
- if len(recordMap[category]) == 0 {
+ length := len(recordMap[category])
+ if length == 0 {
recordMap[category] = usedRecordMap[category]
- usedRecordMap[category] = map[int]Record{}
+ usedRecordMap[category] = usedRecordMap[category][0:0]
+ length = len(recordMap[category])
}
- recordIndex := rand.Intn(len(recordMap[category]))
+ recordIndex := rand.Intn(length)
record := recordMap[category][recordIndex]
- delete(recordMap[category], recordIndex)
+ recordMap[category][recordIndex] = recordMap[category][length-1]
+ recordMap[category] = recordMap[category][:length-1] //shrink length by one
if usedRecordMap[category] == nil {
- usedRecordMap[category] = map[int]Record{}
+ usedRecordMap[category] = []Record{}
}
- usedRecordMap[category][len(usedRecordMap[category])] = record
+ usedRecordMap[category] = append(usedRecordMap[category], record)
return record
}
structures.go
@@ -9,12 +9,12 @@ const API_ROOT = "/api"
// categorical buckets. the category serves as
// the keyname. the map is populated through the
// loadRecords function call.
-var recordMap map[string]map[int]Record
+var recordMap map[string][]Record
// usedRecordMap contains the questions that have
// already been used. when recordMap is empty,
// usedRecordMap replaces it.
-var usedRecordMap map[string]map[int]Record
+var usedRecordMap map[string][]Record
// mapLock locks the maps to prevent concurrency issues
var mapLock *sync.Mutex
@@ -116,7 +116,7 @@ func (cSem *CountingSemaphore) SetCapacity(cap int) {
}
func init() {
- recordMap = map[string]map[int]Record{}
- usedRecordMap = map[string]map[int]Record{}
+ recordMap = map[string][]Record{}
+ usedRecordMap = map[string][]Record{}
mapLock = &sync.Mutex{}
}