Commit f147f10

Richard Luby <richluby@gmail.com>
2016-11-18 09:12:24
fixed blank questions being given
switched using idiomatic go slices instead of non-updating maps
1 parent 6692814
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{}
 }