Refactor record repo

This commit is contained in:
Denis Arh
2019-10-29 10:06:14 +01:00
parent 8db0c424ed
commit 69fb843b54
5 changed files with 54 additions and 61 deletions
+16 -15
View File
@@ -75,7 +75,7 @@ func (r record) columns() []string {
func (r record) query() squirrel.SelectBuilder {
return squirrel.
Select().
Select(r.columns()...).
From(r.table() + " AS r").
Where("r.deleted_at IS NULL")
}
@@ -83,19 +83,24 @@ func (r record) query() squirrel.SelectBuilder {
// @todo: update to accepted DeletedAt column semantics from Messaging
func (r record) FindByID(namespaceID, recordID uint64) (*types.Record, error) {
var (
query = r.query().
Columns(r.columns()...).
Where("id = ?", recordID)
return r.findOneBy(namespaceID, "id", recordID)
}
c = &types.Record{}
func (r record) findOneBy(namespaceID uint64, field string, value interface{}) (*types.Record, error) {
var (
rec = &types.Record{}
q = r.query().
Where(squirrel.Eq{field: value, "rel_namespace": namespaceID})
err = rh.FetchOne(r.db(), q, rec)
)
if namespaceID > 0 {
query = query.Where("rel_namespace = ?", namespaceID)
if err == nil && rec.ID == 0 {
return nil, ErrRecordNotFound
}
return c, isFound(r.fetchOne(c, query), c.ID > 0, ErrRecordNotFound)
return rec, nil
}
func (r record) Report(module *types.Module, metrics, dimensions, filter string) (results interface{}, err error) {
@@ -125,11 +130,11 @@ func (r record) Find(module *types.Module, filter types.RecordFilter) (set types
return
}
if f.Count, err = r.count(query); err != nil || f.Count == 0 {
if f.Count, err = rh.Count(r.db(), query); err != nil || f.Count == 0 {
return
}
return set, f, rh.FetchPaged(r.db(), query.Columns(r.columns()...), f.Page, f.PerPage, &set)
return set, f, rh.FetchPaged(r.db(), query, f.Page, f.PerPage, &set)
}
// Export ignores paging and does not return filter
@@ -144,10 +149,6 @@ func (r record) Export(module *types.Module, filter types.RecordFilter) (set typ
return
}
// Assemble SQL for fetching record (where + sorting + paging)...
query = query.
Columns(r.columns()...)
return set, rh.FetchAll(r.db(), query, &set)
}
+2 -1
View File
@@ -11,6 +11,7 @@ import (
"github.com/cortezaproject/corteza-server/compose/types"
"github.com/cortezaproject/corteza-server/pkg/ql"
"github.com/cortezaproject/corteza-server/pkg/rh"
)
type (
@@ -115,7 +116,7 @@ func (b *recordReportBuilder) Build(metrics, dimensions, filters string) (sql st
}
// Wrap to cast func to ensure numeric output
col := squirrel.Alias(SqlConcatExpr("CAST(", m.Expr, " AS DECIMAL(14,2))"), m.Alias)
col := squirrel.Alias(rh.SquirrelConcatExpr("CAST(", m.Expr, " AS DECIMAL(14,2))"), m.Alias)
b.report = b.report.Column(col)
b.numerics = append(b.numerics, m.Alias)
-4
View File
@@ -78,10 +78,6 @@ func (r repository) fetchPaged(set interface{}, q squirrel.SelectBuilder, page,
return rh.FetchPaged(r.db(), q, page, perPage, set)
}
func normalizePerPage(val, min, max, def uint) uint {
return rh.NormalizePerPage(val, min, max, def)
}
func isFound(err error, valid bool, nerr error) error {
return rh.IsFound(err, valid, nerr)
}
-41
View File
@@ -1,41 +0,0 @@
package repository
import (
"strings"
"gopkg.in/Masterminds/squirrel.v1"
)
type (
sqlConcatExpr struct {
parts []string
args []interface{}
err error
}
)
func SqlConcatExpr(args ...interface{}) squirrel.Sqlizer {
var w = new(sqlConcatExpr)
for _, a := range args {
if w.err != nil {
break
}
switch o := a.(type) {
case string:
w.parts = append(w.parts, o)
case squirrel.Sqlizer:
p, a, err := o.ToSql()
w.parts = append(w.parts, p)
w.args = append(w.args, a...)
w.err = err
}
}
return w
}
func (w *sqlConcatExpr) ToSql() (string, []interface{}, error) {
return strings.Join(w.parts, ""), w.args, w.err
}
+36
View File
@@ -1,6 +1,8 @@
package rh
import (
"strings"
"gopkg.in/Masterminds/squirrel.v1"
)
@@ -44,3 +46,37 @@ func (f squirrelFunction) ToSql() (sql string, args []interface{}, err error) {
return
}
type (
squirrelConcatExpr struct {
parts []string
args []interface{}
err error
}
)
func SquirrelConcatExpr(args ...interface{}) squirrel.Sqlizer {
var w = new(squirrelConcatExpr)
for _, a := range args {
if w.err != nil {
break
}
switch o := a.(type) {
case string:
w.parts = append(w.parts, o)
case squirrel.Sqlizer:
p, a, err := o.ToSql()
w.parts = append(w.parts, p)
w.args = append(w.args, a...)
w.err = err
}
}
return w
}
func (w *squirrelConcatExpr) ToSql() (string, []interface{}, error) {
return strings.Join(w.parts, ""), w.args, w.err
}