func Rankings(w http.ResponseWriter, req *http.Request, ctx *models.Context) error { var results models.WilsonSorter pipe := ctx.C(V).Pipe([]bson.M{ {"$match": bson.M{"active": true}}, {"$group": bson.M{ "_id": "$photo", "count": bson.M{"$sum": 1}, "avg": bson.M{"$avg": "$score"}, "scores": bson.M{"$push": "$score"}, "title": bson.M{"$addToSet": "$title"}, "description": bson.M{"$addToSet": "$description"}, "user": bson.M{"$addToSet": "$photouser"}, }}, {"$unwind": "$user"}, {"$unwind": "$title"}, {"$unwind": "$description"}, }) pipe.All(&results) // calculate wilson rating http://www.goproblems.com/test/wilson/wilson-new.php vc := make([]int, 5) for _, r := range results { scores := r["scores"].([]interface{}) for _, s := range scores { index := int(s.(float64) - 1) vc[index] += 1 } sum := 0.0 for i, c := range vc { w := float64(i) / 4.0 sum += float64(c) * w } r["wilson"] = models.Wilson(len(scores), sum) vc[0], vc[1], vc[2], vc[3], vc[4] = 0, 0, 0, 0, 0 } sort.Sort(results) return AJAX("rankings.html").Execute(w, map[string]interface{}{ "results": results, "ctx": ctx, }) }
func TopVoted(w http.ResponseWriter, req *http.Request, ctx *models.Context) error { page := 1 page, err := strconv.Atoi(req.URL.Query().Get(":page")) if err != nil && page == 0 { page = 1 } skip := ITEMS_PER_PAGE * (page - 1) match := bson.M{"active": true} if f, ok := ctx.Session.Values["filter"]; ok { f.(*models.Filter).AddQuery(match) } var results models.WilsonSorter pipe := ctx.C(V).Pipe([]bson.M{ {"$match": match}, {"$group": bson.M{ "_id": "$photo", "scores": bson.M{"$push": "$score"}, "title": bson.M{"$addToSet": "$title"}, "description": bson.M{"$addToSet": "$description"}, "user": bson.M{"$addToSet": "$photouser"}, }}, {"$skip": skip}, {"$limit": ITEMS_PER_PAGE}, {"$unwind": "$user"}, {"$unwind": "$title"}, {"$unwind": "$description"}, }) pipe.All(&results) // calculate wilson rating http://www.goproblems.com/test/wilson/wilson-new.php vc := make([]int, 5) for _, r := range results { scores := r["scores"].([]interface{}) for _, s := range scores { index := int(s.(float64) - 1) vc[index] += 1 } sum := 0.0 for i, c := range vc { w := float64(i) / 4.0 sum += float64(c) * w } r["wilson"] = models.Wilson(len(scores), sum) vc[0], vc[1], vc[2], vc[3], vc[4] = 0, 0, 0, 0, 0 } sort.Sort(results) data := "" var layer bytes.Buffer for _, r := range results { p := &models.Photo{ Id: r["_id"].(bson.ObjectId), User: r["user"].(bson.ObjectId), Title: r["title"].(string), Description: r["description"].(string), } err := layerTemplate.Execute(&layer, map[string]interface{}{"p": p, "ctx": ctx}) if err != nil { models.Log("layer template: ", err.Error()) } data += fmt.Sprintf(`{"image":"%s","thumb":"%s","title":"%s","description":"%s", "layer":"%s"},`, models.ImageUrl(p.Id.Hex(), ""), models.ImageUrl(p.Id.Hex(), "thumb"), p.Title, p.Description, strings.Replace(layer.String(), "\n", "", -1), ) layer.Reset() } data = strings.TrimRight(data, ",") w.Header().Set("Content-Type", "application/json") fmt.Fprintf(w, "["+data+"]") return nil }