From 235dc49d5f96fb6705962341a06f1a77f0fd8681 Mon Sep 17 00:00:00 2001 From: Vladimir Mihailenco Date: Mon, 22 Aug 2016 09:39:22 +0000 Subject: [PATCH 1/3] Rename GeoPosition to GeoPos for consistency with Redis Server. Simplify code where possible. --- command.go | 20 +++++++++-------- commands.go | 10 ++++----- parser.go | 62 +++++++++++++++++++++++++---------------------------- 3 files changed, 45 insertions(+), 47 deletions(-) diff --git a/command.go b/command.go index d89eab65..8ac048ac 100644 --- a/command.go +++ b/command.go @@ -806,10 +806,6 @@ type GeoLocation struct { GeoHash int64 } -type GeoPosition struct { - Longitude, Latitude float64 -} - // GeoRadiusQuery is used with GeoRadius to query geospatial index. type GeoRadiusQuery struct { Radius float64 @@ -886,10 +882,16 @@ func (cmd *GeoLocationCmd) readReply(cn *pool.Conn) error { return nil } +//------------------------------------------------------------------------------ + +type GeoPos struct { + Longitude, Latitude float64 +} + type GeoPosCmd struct { baseCmd - positions []*GeoPosition + positions []*GeoPos } func NewGeoPosCmd(args ...interface{}) *GeoPosCmd { @@ -897,11 +899,11 @@ func NewGeoPosCmd(args ...interface{}) *GeoPosCmd { return &GeoPosCmd{baseCmd: cmd} } -func (cmd *GeoPosCmd) Val() []*GeoPosition { +func (cmd *GeoPosCmd) Val() []*GeoPos { return cmd.positions } -func (cmd *GeoPosCmd) Result() ([]*GeoPosition, error) { +func (cmd *GeoPosCmd) Result() ([]*GeoPos, error) { return cmd.Val(), cmd.Err() } @@ -915,12 +917,12 @@ func (cmd *GeoPosCmd) reset() { } func (cmd *GeoPosCmd) readReply(cn *pool.Conn) error { - reply, err := cn.Rd.ReadArrayReply(newGeoPositionSliceParser()) + reply, err := cn.Rd.ReadArrayReply(geoPosSliceParser) if err != nil { cmd.err = err return err } - cmd.positions = reply.([]*GeoPosition) + cmd.positions = reply.([]*GeoPos) return nil } diff --git a/commands.go b/commands.go index bcaeadad..3d3fe2f6 100644 --- a/commands.go +++ b/commands.go @@ -234,7 +234,7 @@ type Cmdable interface { ClusterAddSlots(slots ...int) *StatusCmd ClusterAddSlotsRange(min, max int) *StatusCmd GeoAdd(key string, geoLocation ...*GeoLocation) *IntCmd - GeoPos(key string, name ...string) *GeoPosCmd + GeoPos(key string, members ...string) *GeoPosCmd GeoRadius(key string, longitude, latitude float64, query *GeoRadiusQuery) *GeoLocationCmd GeoRadiusByMember(key, member string, query *GeoRadiusQuery) *GeoLocationCmd GeoDist(key string, member1, member2, unit string) *FloatCmd @@ -2055,12 +2055,12 @@ func (c *cmdable) GeoHash(key string, members ...string) *StringSliceCmd { return cmd } -func (c *cmdable) GeoPos(key string, names ...string) *GeoPosCmd { - args := make([]interface{}, 2+len(names)) +func (c *cmdable) GeoPos(key string, members ...string) *GeoPosCmd { + args := make([]interface{}, 2+len(members)) args[0] = "geopos" args[1] = key - for i, name := range names { - args[2+i] = name + for i, member := range members { + args[2+i] = member } cmd := NewGeoPosCmd(args...) c.process(cmd) diff --git a/parser.go b/parser.go index c1db8d0d..46220d40 100644 --- a/parser.go +++ b/parser.go @@ -273,46 +273,42 @@ func newGeoLocationSliceParser(q *GeoRadiusQuery) proto.MultiBulkParse { } } -func newGeoPositionParser() proto.MultiBulkParse { - return func(rd *proto.Reader, n int64) (interface{}, error) { - var pos GeoPosition - var err error +func geoPosParser(rd *proto.Reader, n int64) (interface{}, error) { + var pos GeoPos + var err error - pos.Longitude, err = rd.ReadFloatReply() - if err != nil { - return nil, err - } - pos.Latitude, err = rd.ReadFloatReply() - if err != nil { - return nil, err - } - - return &pos, nil + pos.Longitude, err = rd.ReadFloatReply() + if err != nil { + return nil, err } + + pos.Latitude, err = rd.ReadFloatReply() + if err != nil { + return nil, err + } + + return &pos, nil } -func newGeoPositionSliceParser() proto.MultiBulkParse { - return func(rd *proto.Reader, n int64) (interface{}, error) { - positions := make([]*GeoPosition, 0, n) - for i := int64(0); i < n; i++ { - v, err := rd.ReadReply(newGeoPositionParser()) - if err != nil { - // response may contain nil results - if err == Nil { - positions = append(positions, nil) - continue - } - return nil, err - } - switch vv := v.(type) { - case *GeoPosition: - positions = append(positions, vv) - default: - return nil, fmt.Errorf("got %T, expected *GeoPosition", v) +func geoPosSliceParser(rd *proto.Reader, n int64) (interface{}, error) { + positions := make([]*GeoPos, 0, n) + for i := int64(0); i < n; i++ { + v, err := rd.ReadReply(geoPosParser) + if err != nil { + if err == Nil { + positions = append(positions, nil) + continue } + return nil, err + } + switch v := v.(type) { + case *GeoPos: + positions = append(positions, v) + default: + return nil, fmt.Errorf("got %T, expected *GeoPos", v) } - return positions, nil } + return positions, nil } func commandInfoParser(rd *proto.Reader, n int64) (interface{}, error) { From 8b7922d185896d0df2436a92a278454e588139b7 Mon Sep 17 00:00:00 2001 From: Vladimir Mihailenco Date: Mon, 22 Aug 2016 09:46:42 +0000 Subject: [PATCH 2/3] Add test for GeoPos. --- commands_test.go | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/commands_test.go b/commands_test.go index b4d0ff3b..ea33e1b8 100644 --- a/commands_test.go +++ b/commands_test.go @@ -2689,20 +2689,35 @@ var _ = Describe("Commands", func() { // "166274.15156960033" // GEODIST Sicily Palermo Catania km // "166.27415156960032" - geoDist := client.GeoDist("Sicily", "Palermo", "Catania", "km") - Expect(geoDist.Err()).NotTo(HaveOccurred()) - Expect(geoDist.Val()).To(BeNumerically("~", 166.27, 0.01)) + dist, err := client.GeoDist("Sicily", "Palermo", "Catania", "km").Result() + Expect(err).NotTo(HaveOccurred()) + Expect(dist).To(BeNumerically("~", 166.27, 0.01)) - geoDist = client.GeoDist("Sicily", "Palermo", "Catania", "m") - Expect(geoDist.Err()).NotTo(HaveOccurred()) - Expect(geoDist.Val()).To(BeNumerically("~", 166274.15, 0.01)) + dist, err = client.GeoDist("Sicily", "Palermo", "Catania", "m").Result() + Expect(err).NotTo(HaveOccurred()) + Expect(dist).To(BeNumerically("~", 166274.15, 0.01)) }) It("should get geo hash in string representation", func() { - res, err := client.GeoHash("Sicily", "Palermo", "Catania").Result() + hashes, err := client.GeoHash("Sicily", "Palermo", "Catania").Result() Expect(err).NotTo(HaveOccurred()) - Expect(res[0]).To(Equal("sqc8b49rny0")) - Expect(res[1]).To(Equal("sqdtr74hyu0")) + Expect(hashes).To(ConsistOf([]string{"sqc8b49rny0", "sqdtr74hyu0"})) + }) + + It("should return geo position", func() { + pos, err := client.GeoPos("Sicily", "Palermo", "Catania", "NonExisting").Result() + Expect(err).NotTo(HaveOccurred()) + Expect(pos).To(ConsistOf([]*redis.GeoPos{ + { + Longitude: 13.361389338970184, + Latitude: 38.1155563954963, + }, + { + Longitude: 15.087267458438873, + Latitude: 37.50266842333162, + }, + nil, + })) }) }) From 559e13782cb19009c8154b0a40f32455e0019827 Mon Sep 17 00:00:00 2001 From: Vladimir Mihailenco Date: Mon, 22 Aug 2016 09:47:13 +0000 Subject: [PATCH 3/3] travis: test on Go 1.7. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index afbe1a48..25bce050 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,8 +5,8 @@ services: - redis-server go: - - 1.5 - 1.6 + - 1.7 - tip matrix: