3
0

Switch to rh package for handling record paging

This commit is contained in:
Denis Arh
2019-08-15 12:38:22 +02:00
parent 53c946efe8
commit 5ee1a90655
3 changed files with 49 additions and 5 deletions
+19 -2
View File
@@ -23,6 +23,7 @@ type (
Report(module *types.Module, metrics, dimensions, filter string) (results interface{}, err error)
Find(module *types.Module, filter types.RecordFilter) (set types.RecordSet, f types.RecordFilter, err error)
Export(module *types.Module, filter types.RecordFilter) (set types.RecordSet, err error)
Create(record *types.Record) (*types.Record, error)
Update(record *types.Record) (*types.Record, error)
@@ -117,7 +118,7 @@ func (r record) Report(module *types.Module, metrics, dimensions, filter string)
func (r record) Find(module *types.Module, filter types.RecordFilter) (set types.RecordSet, f types.RecordFilter, err error) {
var query squirrel.SelectBuilder
f = filter
f.PerPage = rh.NormalizePerPage(f.PerPage, 5, 100, 50)
f.PageFilter.NormalizePerPageWithDefaults()
query, err = r.buildQuery(module, filter)
if err != nil {
@@ -128,10 +129,26 @@ func (r record) Find(module *types.Module, filter types.RecordFilter) (set types
return
}
return set, f, rh.FetchPaged(r.db(), query.Columns(r.columns()...), f.Page, f.PerPage, &set)
}
// Export ignores paging and does not return filter
//
// @todo optimize and include value loading
func (r record) Export(module *types.Module, filter types.RecordFilter) (set types.RecordSet, err error) {
filter.PerPage = 0
filter.Page = 0
query, err := r.buildQuery(module, filter)
if err != nil {
return
}
// Assemble SQL for fetching record (where + sorting + paging)...
query = query.
Columns(r.columns()...)
return set, f, r.fetchPaged(&set, query, f.Page, f.PerPage)
return set, rh.FetchAll(r.db(), query, &set)
}
func (r record) buildQuery(module *types.Module, f types.RecordFilter) (query squirrel.SelectBuilder, err error) {
+26
View File
@@ -44,6 +44,7 @@ type (
Report(namespaceID, moduleID uint64, metrics, dimensions, filter string) (interface{}, error)
Find(filter types.RecordFilter) (set types.RecordSet, f types.RecordFilter, err error)
Export(types.RecordFilter, Encoder) error
Create(record *types.Record) (*types.Record, error)
Update(record *types.Record) (*types.Record, error)
@@ -52,6 +53,10 @@ type (
// Fields(module *types.Module, record *types.Record) ([]*types.RecordValue, error)
}
Encoder interface {
Record(*types.Record) error
}
)
func Record() RecordService {
@@ -149,6 +154,27 @@ func (svc record) Find(filter types.RecordFilter) (set types.RecordSet, f types.
return
}
// Export returns all records
//
// @todo better value handling
func (svc record) Export(filter types.RecordFilter, enc Encoder) error {
m, err := svc.loadModule(filter.NamespaceID, filter.ModuleID)
if err != nil {
return err
}
set, err := svc.recordRepo.Export(m, filter)
if err != nil {
return err
}
if err = svc.preloadValues(m, set...); err != nil {
return err
}
return set.Walk(enc.Record)
}
func (svc record) Create(mod *types.Record) (r *types.Record, err error) {
if mod.NamespaceID == 0 {
return nil, ErrNamespaceRequired
+4 -3
View File
@@ -4,6 +4,7 @@ import (
"time"
"github.com/cortezaproject/corteza-server/internal/permissions"
"github.com/cortezaproject/corteza-server/pkg/rh"
)
type (
@@ -29,10 +30,10 @@ type (
ModuleID uint64 `json:"moduleID,string"`
NamespaceID uint64 `json:"namespaceID,string"`
Filter string `json:"query"`
Page uint `json:"page"`
PerPage uint `json:"perPage"`
Sort string `json:"sort"`
Count uint `json:"count"`
// Standard paging fields & helpers
rh.PageFilter
}
)