func executeItemQuery(con *Context, q *datastore.Query, limit int, cursorStr string) ([]Item, string, error) { if cursor, err := datastore.DecodeCursor(cursorStr); err == nil { q = q.Start(cursor) } var is = make([]Item, 0, limit) var err error t := q.Run(con.C) for { var i Item _, err = t.Next(&i) if err == datastore.Done { break } is = append(is, i) if err != nil { con.Log.Errorf("Error fetching next item: %v", err) return nil, "", err } } var cursor datastore.Cursor if cursor, err = t.Cursor(); err == nil { return is, cursor.String(), nil } return nil, "", err }
func (cdb ComplaintDB) NewIter(q *datastore.Query) *ComplaintIterator { ci := ComplaintIterator{ //CDB: cdb, Query: q, Iter: q.Run(cdb.Ctx()), } return &ci }
func executeCallbackQuery(con *Context, q *datastore.Query, limit int) ([]Callback, error) { var is = make([]Callback, 0, limit) var err error t := q.Run(con.C) for { var i Callback _, err = t.Next(&i) if err == datastore.Done { break } is = append(is, i) if err != nil { con.Log.Errorf("Error fetching next item: %v", err) return nil, err } } return is, nil }
// Run runs the query. func (g *Goon) Run(q *datastore.Query) *Iterator { return &Iterator{ g: g, i: q.Run(g.Context), } }
func handler(w http.ResponseWriter, r *http.Request) { c := appengine.NewContext(r) u := user.Current(c) log.Infof(c, "Got a visitor to the front page!") //keep log in the imports //Check if the request is before or after to create the right query //The GET requests for the stories will be based around the SubmitDateTime //Using "after" will return stories after a certain date from newest to oldest //Using "before" will return stories before a certain date from oldest to newest //Default is to use the latest 3 submissions afterDate := r.FormValue("after") beforeDate := r.FormValue("before") returnLimit := 3 showPrevLink := false var q *datastore.Query if afterDate != "" { showPrevLink = true //Get the results in descending order for newest to oldest afterDate = strings.Replace(afterDate, "%20", " ", -1) //replace all %20 with " " ttime, err := time.Parse(DateTimeDatastoreFormat, afterDate) if err != nil { serveError(c, w, err) return } q = datastore.NewQuery(WebSubmissionEntityName). Filter("SubmitDateTime <", ttime). Order("-SubmitDateTime"). Limit(returnLimit) } else if beforeDate != "" { showPrevLink = true //Get the results is ascending order from oldest to newest beforeDate = strings.Replace(beforeDate, "%20", " ", -1) //replace all %20 with " " ttime, err := time.Parse(DateTimeDatastoreFormat, beforeDate) if err != nil { serveError(c, w, err) return } q = datastore.NewQuery(WebSubmissionEntityName). Filter("SubmitDateTime >", ttime). Order("SubmitDateTime"). Limit(returnLimit) //limit check at the beginning if less than the returnLimit redo from the beginning length, cerr := q.Count(c) if cerr != nil { serveError(c, w, cerr) } //TODO refactor to not duplicate the default query below if length < returnLimit { showPrevLink = false q = datastore.NewQuery(WebSubmissionEntityName). Order("-SubmitDateTime"). Limit(returnLimit) } } else { q = datastore.NewQuery(WebSubmissionEntityName). Order("-SubmitDateTime"). Limit(returnLimit) } //Populate the results struct and store the keys var pageCon PageContainer for t := q.Run(c); ; { var x WebSubmission key, err := t.Next(&x) if err == datastore.Done { break } if err != nil { // serveError(c,w,err) fmt.Fprintf(w, "nope %v", err.Error()) return } if u == nil { pageCon.Stories = append(pageCon.Stories, StoryListData{x, key, false}) } else { pageCon.Stories = append(pageCon.Stories, StoryListData{x, key, u.String() == x.SubmitBy}) } } //if we filled up the page with results there are probably more, build the //next page link length, cerr := q.Count(c) if cerr != nil { serveError(c, w, cerr) } if length == returnLimit { //get the submit datetime of the last story pageCon.AfterLink = pageCon.Stories[returnLimit-1].Story.SubmitDateTime.Format(DateTimeDatastoreFormat) } //If it was a prev page press reverse the result array to get it back into chronological order if length >= 1 && beforeDate != "" { for i, j := 0, len(pageCon.Stories)-1; i < j; i, j = i+1, j-1 { pageCon.Stories[i], pageCon.Stories[j] = pageCon.Stories[j], pageCon.Stories[i] } } //prev page link //check the length because going forward you can have null data if showPrevLink && length >= 1 { pageCon.BeforeLink = pageCon.Stories[0].Story.SubmitDateTime.Format(DateTimeDatastoreFormat) } //build and show the page page := template.Must(template.ParseFiles( "public/templates/_base.html", "public/templates/storylist.html", )) if err := page.Execute(w, pageCon); err != nil { serveError(c, w, err) fmt.Fprintf(w, "\n%v\n%v", err.Error(), pageCon) return } }