Fix total and page navigation for records

Introduce helper func(IteratorPaging) to count total and create page navigation for records and also fixes timezone and milliseconds fir dateTime field value for query.
This commit is contained in:
Vivek Patel
2022-09-30 18:29:38 +05:30
parent ff5cba8508
commit ef72ffa373
4 changed files with 209 additions and 88 deletions
+20 -84
View File
@@ -2,8 +2,6 @@ package dalutils
import (
"context"
"math"
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/dal"
"github.com/cortezaproject/corteza-server/pkg/filter"
@@ -118,20 +116,8 @@ func drainIterator(ctx context.Context, iter dal.Iterator, mod *types.Module, f
// close iterator after we've drained it
defer iter.Close()
const (
// minimum amount of records we need to re-fetch
minRefetch = 10
// refetch 20% more records that we missed
refetchFactor = 1.2
)
var (
// counter for false checks
checked uint
fetched uint
ok bool
r *types.Record
r *types.Record
)
// Get the requested number of record
@@ -141,86 +127,36 @@ func drainIterator(ctx context.Context, iter dal.Iterator, mod *types.Module, f
set = make(types.RecordSet, 0, 1000)
}
for f.Limit == 0 || uint(len(set)) < f.Limit {
// reset counters every drain
checked = 0
fetched = 0
// drain whatever we fetched
for iter.Next(ctx) {
fetched++
if err = iter.Err(); err != nil {
return
}
r = prepareRecordTarget(mod)
if err = iter.Scan(r); err != nil {
return
}
// check fetched record
if f.Check != nil {
if ok, err = f.Check(r); err != nil {
return
} else if !ok {
continue
}
}
checked++
set = append(set, r)
}
// if an error occurred inside Next(),
// we need to stop draining
if err = iter.Err(); err != nil {
return
}
if fetched == 0 || f.Limit == 0 || (0 < f.Limit && fetched < f.Limit) {
// do not re-fetch if:
// 1) nothing was fetch in the previous run
// 2) there was no limit (everything was fetched)
// 3) there are less fetched items then value of limit
break
}
// Fetch more records
if checked > 0 {
howMuchMore := checked
if howMuchMore < minRefetch {
howMuchMore = minRefetch
}
howMuchMore = uint(math.Floor(float64(howMuchMore) * refetchFactor))
// request more items
if err = iter.More(howMuchMore, r); err != nil {
return
}
}
}
// Make out filter
outFilter = f
pp := f.Paging.Clone()
if len(set) > 0 && f.PrevPage != nil {
pp.PrevPage, err = iter.BackCursor(set[0])
if err != nil {
err = dal.IteratorPaging(ctx, iter, pp, f.Sorting, func(i dal.Iterator) (out dal.ValueGetter, ok bool) {
r = prepareRecordTarget(mod)
if err = i.Scan(r); err != nil {
return
}
}
if len(set) > 0 {
pp.NextPage, err = iter.ForwardCursor(set[len(set)-1])
if err != nil {
return
// check fetched record
if f.Check != nil {
if ok, err = f.Check(r); err != nil {
return nil, false
} else if !ok {
return nil, ok
}
}
if f.Limit == 0 || uint(len(set)) < f.Limit {
set = append(set, r)
}
return r, true
})
if err != nil {
return
}
outFilter.Paging = *pp
outFilter.Total = uint(len(set))
return
}