Skip to content

Commit

Permalink
Set is smarter and Update interface is simpler now
Browse files Browse the repository at this point in the history
  • Loading branch information
amirrezaask committed Mar 17, 2022
1 parent d6713ba commit 182c452
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 20 deletions.
11 changes: 5 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -423,13 +423,12 @@ Just like select where stuff, same code.
Same as select.

##### Set
You can use `Set`, `Sets`, `Update` method to set values.
You can use `Set` method to set value.
```go
orm.Query[Post]().Where("id", 1).Set("read", true).Update() // UPDATE posts SET read=? WHERE id = ?, [true, 1]
orm.Query[Post]().Where("id", 1).Sets([2]interface{}{"read", true}).Update() // UPDATE posts SET read=? WHERE id = ?, [true, 1]
orm.Query[Post]().Where("id", 1).Update(orm.KV{
"read": true,
}) // UPDATE posts SET read=? WHERE id = ?, [true, 1]
orm.Query[Message]().
Where("id", 1).
Set("read", true, "seen", true).
Update() // UPDATE posts SET read=?, seen=? WHERE id = ?, [true, true, 1]
```

#### Delete
Expand Down
14 changes: 7 additions & 7 deletions orm.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,23 +182,23 @@ func Find[T Entity](id interface{}) (T, error) {
return *out, nil
}

func toTuples(obj Entity, withPK bool) [][2]interface{} {
var tuples [][2]interface{}
func toKeyValues(obj Entity, withPK bool) []any {
var tuples []any
vs := genericValuesOf(obj, withPK)
cols := getSchemaFor(obj).Columns(withPK)
for i, col := range cols {
tuples = append(tuples, [2]interface{}{
col,
vs[i],
})
tuples = append(tuples, col, vs[i])
}
return tuples
}

// Update given Entity in database.
func Update(obj Entity) error {
s := getSchemaFor(obj)
q, args, err := NewQueryBuilder[Entity](s).SetDialect(s.getDialect()).Sets(toTuples(obj, false)...).Where(s.pkName(), genericGetPKValue(obj)).Table(s.Table).ToSql()
q, args, err := NewQueryBuilder[Entity](s).
SetDialect(s.getDialect()).
Set(toKeyValues(obj, false)...).
Where(s.pkName(), genericGetPKValue(obj)).Table(s.Table).ToSql()

if err != nil {
return err
Expand Down
17 changes: 10 additions & 7 deletions query.go
Original file line number Diff line number Diff line change
Expand Up @@ -707,17 +707,20 @@ func (q *QueryBuilder[OUTPUT]) SetUpdate() *QueryBuilder[OUTPUT] {
return q
}

func (q *QueryBuilder[OUTPUT]) Set(name string, value interface{}) *QueryBuilder[OUTPUT] {
func (q *QueryBuilder[OUTPUT]) Set(keyValues ...any) *QueryBuilder[OUTPUT] {
if len(keyValues)%2 != 0 {
q.err = fmt.Errorf("when using Set, passed argument count should be even: %w", q.err)
return q
}
q.SetUpdate()
q.sets = append(q.sets, [2]interface{}{name, value})
for i := 0; i < len(keyValues); i++ {
if i != 0 && i%2 == 1 {
q.sets = append(q.sets, [2]any{keyValues[i-1], keyValues[i]})
}
}
return q
}

func (q *QueryBuilder[OUTPUT]) Sets(tuples ...[2]interface{}) *QueryBuilder[OUTPUT] {
q.SetUpdate()
q.sets = append(q.sets, tuples...)
return q
}
func (q *QueryBuilder[OUTPUT]) SetDialect(dialect *Dialect) *QueryBuilder[OUTPUT] {
q.placeholderGenerator = dialect.PlaceHolderGenerator
return q
Expand Down

0 comments on commit 182c452

Please sign in to comment.