From 5ee1a90655c0b11e0babaa9752cc3cc623d3f58c Mon Sep 17 00:00:00 2001 From: Denis Arh Date: Thu, 15 Aug 2019 12:38:22 +0200 Subject: [PATCH] Switch to rh package for handling record paging --- compose/internal/repository/record.go | 21 +++++++++++++++++++-- compose/internal/service/record.go | 26 ++++++++++++++++++++++++++ compose/types/record.go | 7 ++++--- 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/compose/internal/repository/record.go b/compose/internal/repository/record.go index 4a17549af..afb7d2c38 100644 --- a/compose/internal/repository/record.go +++ b/compose/internal/repository/record.go @@ -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) { diff --git a/compose/internal/service/record.go b/compose/internal/service/record.go index 12776283d..215e139ea 100644 --- a/compose/internal/service/record.go +++ b/compose/internal/service/record.go @@ -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 diff --git a/compose/types/record.go b/compose/types/record.go index 71bbecb19..3e7353cd6 100644 --- a/compose/types/record.go +++ b/compose/types/record.go @@ -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 } )