From a3bf8b65728cbde18a4c2f071399529e5bac4539 Mon Sep 17 00:00:00 2001 From: Alex Roitman Date: Fri, 10 Nov 2017 14:31:38 -0800 Subject: [PATCH] Tweak multi-field fset to return the count of updated fields --- controller/collection/collection.go | 9 +++++---- controller/crud.go | 10 ++++------ tests/keys_test.go | 6 ++++-- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/controller/collection/collection.go b/controller/collection/collection.go index 55a955b0..198a4fa1 100644 --- a/controller/collection/collection.go +++ b/controller/collection/collection.go @@ -235,7 +235,7 @@ func (c *Collection) SetField(id, field string, value float64) (obj geojson.Obje // SetFields is similar to SetField, just setting multiple fields at once func (c *Collection) SetFields(id string, in_fields []string, in_values []float64) ( - obj geojson.Object, fields []float64, updated bool, ok bool, + obj geojson.Object, fields []float64, updated_count int, ok bool, ) { i := c.items.Get(&itemT{id: id}) if i == nil { @@ -244,10 +244,11 @@ func (c *Collection) SetFields(id string, in_fields []string, in_values []float6 } item := i.(*itemT) for idx, field := range in_fields { - _upd := c.setField(item, field, in_values[idx]) - updated = updated || _upd + if c.setField(item, field, in_values[idx]) { + updated_count++ + } } - return item.object, c.getFieldValues(id), updated, true + return item.object, c.getFieldValues(id), updated_count, true } func (c *Collection) setField(item *itemT, field string, value float64) (updated bool) { diff --git a/controller/crud.go b/controller/crud.go index 7139082e..1467ed1a 100644 --- a/controller/crud.go +++ b/controller/crud.go @@ -829,6 +829,7 @@ func (c *Controller) cmdFset(msg *server.Message) (res resp.Value, d commandDeta var fields []string var values []float64 var xx bool + var updated_count int d, fields, values, xx, err = c.parseFSetArgs(vs) col := c.getCol(d.key) @@ -837,7 +838,7 @@ func (c *Controller) cmdFset(msg *server.Message) (res resp.Value, d commandDeta return } var ok bool - d.obj, d.fields, d.updated, ok = col.SetFields(d.id, fields, values) + d.obj, d.fields, updated_count, ok = col.SetFields(d.id, fields, values) if !(ok || xx) { err = errIDNotFound return @@ -845,6 +846,7 @@ func (c *Controller) cmdFset(msg *server.Message) (res resp.Value, d commandDeta if ok { d.command = "fset" d.timestamp = time.Now() + d.updated = updated_count > 0 fmap := col.FieldMap() d.fmap = make(map[string]int) for key, idx := range fmap { @@ -856,11 +858,7 @@ func (c *Controller) cmdFset(msg *server.Message) (res resp.Value, d commandDeta case server.JSON: res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}") case server.RESP: - if d.updated { - res = resp.IntegerValue(1) - } else { - res = resp.IntegerValue(0) - } + res = resp.IntegerValue(updated_count) } return } diff --git a/tests/keys_test.go b/tests/keys_test.go index b62fa621..7160a922 100644 --- a/tests/keys_test.go +++ b/tests/keys_test.go @@ -80,10 +80,12 @@ func keys_FSET_test(mc *mockServer) error { {"GET", "mykey", "myid", "WITHFIELDS", "HASH", 7}, {"[9my5xp7]"}, {"FSET", "mykey", "myid", "f1", 105.6}, {1}, {"GET", "mykey", "myid", "WITHFIELDS", "HASH", 7}, {"[9my5xp7 [f1 105.6]]"}, - {"FSET", "mykey", "myid", "f1", 1.1, "f2", 2.2}, {1}, + {"FSET", "mykey", "myid", "f1", 1.1, "f2", 2.2}, {2}, {"GET", "mykey", "myid", "WITHFIELDS", "HASH", 7}, {"[9my5xp7 [f1 1.1 f2 2.2]]"}, + {"FSET", "mykey", "myid", "f1", 1.1, "f2", 22.22}, {1}, + {"GET", "mykey", "myid", "WITHFIELDS", "HASH", 7}, {"[9my5xp7 [f1 1.1 f2 22.22]]"}, {"FSET", "mykey", "myid", "f1", 0}, {1}, - {"GET", "mykey", "myid", "WITHFIELDS", "HASH", 7}, {"[9my5xp7 [f2 2.2]]"}, + {"GET", "mykey", "myid", "WITHFIELDS", "HASH", 7}, {"[9my5xp7 [f2 22.22]]"}, {"FSET", "mykey", "myid", "f2", 0}, {1}, {"GET", "mykey", "myid", "WITHFIELDS", "HASH", 7}, {"[9my5xp7]"}, {"FSET", "mykey", "myid2", "xx", "f1", 1.1, "f2", 2.2}, {0},