Skip to content

Commit

Permalink
feat(multifilter): Adding Joiner interface to the MultiFilter (#106)
Browse files Browse the repository at this point in the history
* Adding Joiner interface to the MultiFilter

* updating gen

* coverage
  • Loading branch information
Jacobbrewer1 authored Feb 4, 2025
1 parent c6ee891 commit 6850144
Show file tree
Hide file tree
Showing 5 changed files with 148 additions and 11 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci-code-approval.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ jobs:

- name: Check code coverage
run: |
go test -coverprofile=coverage.out $(go list ./... | grep -v /examples)
go test -coverprofile=coverage.out -coverpkg=$(go list ./... | grep -v /examples | grep -v 'mock_') $(go list ./... | grep -v /examples)
coverage=$(go tool cover -func=coverage.out | grep total | awk '{print $3}' | sed 's/%//')
if (( $(echo "$coverage < 80" | bc -l) )); then
echo "Code coverage is below 80%: $coverage%"
Expand Down
32 changes: 31 additions & 1 deletion mock_MultiFilter.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

33 changes: 24 additions & 9 deletions multifilter.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,41 @@ package patcher
import "strings"

type MultiFilter interface {
Joiner
Wherer
Add(where Wherer)
Add(where any)
}

type multiFilter struct {
joinSql *strings.Builder
joinArgs []any
whereSql *strings.Builder
whereArgs []any
}

func (m *multiFilter) Join() (string, []any) {
return m.joinSql.String(), m.joinArgs
}

func (m *multiFilter) Where() (string, []any) {
return m.whereSql.String(), m.whereArgs
}

func (m *multiFilter) Add(filter any) {
if joiner, ok := filter.(Joiner); ok {
appendJoin(joiner, m.joinSql, &m.joinArgs)
}

if wherer, ok := filter.(Wherer); ok {
appendWhere(wherer, m.whereSql, &m.whereArgs)
}
}

func NewMultiFilter() MultiFilter {
return &multiFilter{
joinSql: new(strings.Builder),
joinArgs: nil,
whereSql: new(strings.Builder),
whereArgs: nil,
}
}

func (m *multiFilter) Add(where Wherer) {
appendWhere(where, m.whereSql, &m.whereArgs)
}

func (m *multiFilter) Where() (string, []any) {
return m.whereSql.String(), m.whereArgs
}
51 changes: 51 additions & 0 deletions multifilter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,54 @@ func (s *multiFilterSuite) TestNewMultiFilter_Add_WhereTyper() {
s.Equal("AND where\nOR whereTwo\n", sql)
s.Equal([]any{"arg1", "arg2", "arg3", "arg4"}, args)
}

func (s *multiFilterSuite) TestNewMultiFilter_Add_Joiner() {
mf := NewMultiFilter()
s.NotNil(mf)

mj := NewMockJoiner(s.T())
mj.On("Join").Return("join", []any{"arg1", "arg2"})
mf.Add(mj)

sql, args := mf.Join()
s.Equal("join\n", sql)
s.Equal([]any{"arg1", "arg2"}, args)
}

func (s *multiFilterSuite) TestNewMultiFilter_Add_MultiJoiner() {
mf := NewMultiFilter()
s.NotNil(mf)

mj := NewMockJoiner(s.T())
mj.On("Join").Return("join", []any{"arg1", "arg2"})
mf.Add(mj)

mjTwo := NewMockJoiner(s.T())
mjTwo.On("Join").Return("joinTwo", []any{"arg3", "arg4"})
mf.Add(mjTwo)

sql, args := mf.Join()
s.Equal("join\njoinTwo\n", sql)
s.Equal([]any{"arg1", "arg2", "arg3", "arg4"}, args)
}

func (s *multiFilterSuite) TestNewMultiFilter_Add_JoinerAndWherer() {
mf := NewMultiFilter()
s.NotNil(mf)

mj := NewMockJoiner(s.T())
mj.On("Join").Return("join", []any{"arg1", "arg2"})
mf.Add(mj)

mw := NewMockWherer(s.T())
mw.On("Where").Return("where", []any{"arg3", "arg4"})
mf.Add(mw)

sql, args := mf.Join()
s.Equal("join\n", sql)
s.Equal([]any{"arg1", "arg2"}, args)

sql, args = mf.Where()
s.Equal("AND where\n", sql)
s.Equal([]any{"arg3", "arg4"}, args)
}
41 changes: 41 additions & 0 deletions sql_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,47 @@ func (s *newSQLPatchSuite) TestNewSQLPatch_Success_MultiFilter() {
s.Equal([]any{int64(1), "test"}, patch.args)
}

func (s *newSQLPatchSuite) TestNewSQLPatch_Success_MultiFilter_Joiner() {
type testObj struct {
Id *int `db:"id_tag"`
Name *string `db:"name_tag"`
}

obj := testObj{
Id: ptr(1),
Name: ptr("test"),
}

mf := NewMockMultiFilter(s.T())
mf.On("Join").Return("JOIN table2 ON table1.id = table2.id", nil)

patch := NewSQLPatch(obj, WithJoin(mf))

s.Equal([]string{"id_tag = ?", "name_tag = ?"}, patch.fields)
s.Equal([]any{int64(1), "test"}, patch.args)
}

func (s *newSQLPatchSuite) TestNewSQLPatch_Success_MultiFilter_JoinerAndWhere() {
type testObj struct {
Id *int `db:"id_tag"`
Name *string `db:"name_tag"`
}

obj := testObj{
Id: ptr(1),
Name: ptr("test"),
}

mf := NewMockMultiFilter(s.T())
mf.On("Join").Return("JOIN table2 ON table1.id = table2.id", nil)
mf.On("Where").Return("where", []any{"arg1", "arg2"})

patch := NewSQLPatch(obj, WithJoin(mf), WithWhere(mf))

s.Equal([]string{"id_tag = ?", "name_tag = ?"}, patch.fields)
s.Equal([]any{int64(1), "test"}, patch.args)
}

func (s *newSQLPatchSuite) TestNewSQLPatch_WhereString() {
type testObj struct {
Id *int `db:"id_tag"`
Expand Down

0 comments on commit 6850144

Please sign in to comment.