Refactor record repo
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user