Skip to content

Commit

Permalink
refactor: use struct embedding to avoid interface forwarding
Browse files Browse the repository at this point in the history
issue: #279
  • Loading branch information
CodeBear801 committed Apr 14, 2020
1 parent 04d3930 commit fedd283
Show file tree
Hide file tree
Showing 16 changed files with 86 additions and 149 deletions.
2 changes: 1 addition & 1 deletion integration/cmd/oasis/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ var flags struct {
func init() {
flag.IntVar(&flags.listenPort, "p", 8090, "Listen port.")
flag.StringVar(&flags.osrmBackendEndpoint, "osrm", "", "OSRM-backend endpoint")
flag.StringVar(&flags.finderType, "finder", "", "Specify search finder to search for nearby charge stations for given location, use TNSearchFinder or LocalIndexerFinder")
flag.StringVar(&flags.finderType, "finder", "", "Specify search finder to search for nearby charge stations for given location, use CloudFinder or LocalFinder")
flag.StringVar(&flags.tnSearchEndpoint, "search", "", "TN-Search-backend endpoint")
flag.StringVar(&flags.tnSearchAPIKey, "searchApiKey", "", "API key for TN-Search-backend")
flag.StringVar(&flags.tnSearchAPISignature, "searchApiSignature", "", "API Signature for TN-Search-backend")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ func New(sc *searchconnector.TNSearchConnector) *cloudStationFinder {

// NewOrigStationFinder creates finder to search for nearby charge stations near orig based on telenav search
func (finder *cloudStationFinder) NewOrigStationFinder(oasisReq *oasis.Request) stationfindertype.NearbyStationsIterator {
return NewOrigStationFinder(finder.sc, oasisReq)
return newOrigStationFinder(finder.sc, oasisReq)
}

// NewDestStationFinder creates finder to search for nearby charge stations near destination based on telenav search
func (finder *cloudStationFinder) NewDestStationFinder(oasisReq *oasis.Request) stationfindertype.NearbyStationsIterator {
return NewDestStationFinder(finder.sc, oasisReq)
return newDestStationFinder(finder.sc, oasisReq)
}

// NewLowEnergyLocationStationFinder creates finder to search for nearby charge stations when energy is low based on telenav search
func (finder *cloudStationFinder) NewLowEnergyLocationStationFinder(location *nav.Location) stationfindertype.NearbyStationsIterator {
return NewLowEnergyLocationStationFinder(finder.sc, location)
return newLowEnergyLocationStationFinder(finder.sc, location)
}
Original file line number Diff line number Diff line change
@@ -1,49 +1,35 @@
package cloudfinder

import (
"sync"

"github.com/Telenav/osrm-backend/integration/pkg/api/oasis"
"github.com/Telenav/osrm-backend/integration/pkg/api/search/nearbychargestation"
"github.com/Telenav/osrm-backend/integration/pkg/api/search/searchcoordinate"
"github.com/Telenav/osrm-backend/integration/service/oasis/searchconnector"
"github.com/Telenav/osrm-backend/integration/service/oasis/searchhelper"
"github.com/Telenav/osrm-backend/integration/service/oasis/stationfinder/stationfindertype"
)

//@todo: This number need to be adjusted based on charge station profile
const destMaxSearchCandidateNumber = 999

type destStationFinder struct {
tnSearchConnector *searchconnector.TNSearchConnector
oasisReq *oasis.Request
searchResp *nearbychargestation.Response
searchRespLock *sync.RWMutex
bf *basicFinder
oasisReq *oasis.Request
*basicFinder
}

func NewDestStationFinder(sc *searchconnector.TNSearchConnector, oasisReq *oasis.Request) *destStationFinder {
func newDestStationFinder(sc *searchconnector.TNSearchConnector, oasisReq *oasis.Request) *destStationFinder {
obj := &destStationFinder{
oasisReq: oasisReq,
bf: newBasicFinder(sc),
oasisReq,
newBasicFinder(sc),
}
obj.prepare()
return obj
}

func (sf *destStationFinder) prepare() {
func (dFinder *destStationFinder) prepare() {
req, _ := searchhelper.GenerateSearchRequest(
searchcoordinate.Coordinate{
Lat: sf.oasisReq.Coordinates[1].Lat,
Lon: sf.oasisReq.Coordinates[1].Lon},
Lat: dFinder.oasisReq.Coordinates[1].Lat,
Lon: dFinder.oasisReq.Coordinates[1].Lon},
destMaxSearchCandidateNumber,
sf.oasisReq.MaxRange-sf.oasisReq.SafeLevel)
sf.bf.getNearbyChargeStations(req)

return
}

// NearbyStationsIterator provides channel which contains near by station information for dest
func (sf *destStationFinder) IterateNearbyStations() <-chan *stationfindertype.ChargeStationInfo {
return sf.bf.IterateNearbyStations()
dFinder.oasisReq.MaxRange-dFinder.oasisReq.SafeLevel)
dFinder.getNearbyChargeStations(req)
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import (
// CreateMockDestStationFinder1 creates mock dest station finder with nearbychargestation.MockSearchResponse1
func CreateMockDestStationFinder1() *destStationFinder {
obj := &destStationFinder{
oasisReq: nil,
bf: &basicFinder{
nil,
&basicFinder{
tnSearchConnector: nil,
searchResp: nearbychargestation.MockSearchResponse1,
searchRespLock: &sync.RWMutex{},
Expand All @@ -22,8 +22,8 @@ func CreateMockDestStationFinder1() *destStationFinder {
// CreateMockDestStationFinder2 creates mock dest station finder with nearbychargestation.MockSearchResponse2
func createMockDestStationFinder2() *destStationFinder {
obj := &destStationFinder{
oasisReq: nil,
bf: &basicFinder{
nil,
&basicFinder{
tnSearchConnector: nil,
searchResp: nearbychargestation.MockSearchResponse2,
searchRespLock: &sync.RWMutex{},
Expand All @@ -35,8 +35,8 @@ func createMockDestStationFinder2() *destStationFinder {
// CreateMockDestStationFinder3 creates mock dest station finder with nearbychargestation.MockSearchResponse3
func createMockDestStationFinder3() *destStationFinder {
obj := &destStationFinder{
oasisReq: nil,
bf: &basicFinder{
nil,
&basicFinder{
tnSearchConnector: nil,
searchResp: nearbychargestation.MockSearchResponse3,
searchRespLock: &sync.RWMutex{},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,12 @@ func TestDestStationFinderIterator(t *testing.T) {
sf := CreateMockDestStationFinder1()
c := sf.IterateNearbyStations()
var r []*stationfindertype.ChargeStationInfo
go func() {
for item := range c {
r = append(r, item)
}

if !reflect.DeepEqual(r, mockChargeStationInfo1) {
t.Errorf("expect %v but got %v", mockChargeStationInfo1, r)
}
}()
for item := range c {
r = append(r, item)
}

if !reflect.DeepEqual(r, mockChargeStationInfo1) {
t.Errorf("expect %#v but got %#v", mockChargeStationInfo1, r)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,38 +5,32 @@ import (
"github.com/Telenav/osrm-backend/integration/pkg/api/search/searchcoordinate"
"github.com/Telenav/osrm-backend/integration/service/oasis/searchconnector"
"github.com/Telenav/osrm-backend/integration/service/oasis/searchhelper"
"github.com/Telenav/osrm-backend/integration/service/oasis/stationfinder/stationfindertype"
)

// LowEnergyLocationCandidateNumber indicates how much charge station to be searched for low energy point
const LowEnergyLocationCandidateNumber = 20

type lowEnergyLocationStationFinder struct {
location *nav.Location
bf *basicFinder
*basicFinder
}

func NewLowEnergyLocationStationFinder(sc *searchconnector.TNSearchConnector, location *nav.Location) *lowEnergyLocationStationFinder {
func newLowEnergyLocationStationFinder(sc *searchconnector.TNSearchConnector, location *nav.Location) *lowEnergyLocationStationFinder {
obj := &lowEnergyLocationStationFinder{
location: location,
bf: newBasicFinder(sc),
location,
newBasicFinder(sc),
}
obj.prepare()
return obj
}

func (sf *lowEnergyLocationStationFinder) prepare() {
func (lFinder *lowEnergyLocationStationFinder) prepare() {
req, _ := searchhelper.GenerateSearchRequest(
searchcoordinate.Coordinate{
Lat: sf.location.Lat,
Lon: sf.location.Lon},
Lat: lFinder.location.Lat,
Lon: lFinder.location.Lon},
LowEnergyLocationCandidateNumber,
-1)
sf.bf.getNearbyChargeStations(req)
lFinder.getNearbyChargeStations(req)
return
}

// NearbyStationsIterator provides channel which contains near by station information for low energy location
func (sf *lowEnergyLocationStationFinder) IterateNearbyStations() <-chan *stationfindertype.ChargeStationInfo {
return sf.bf.IterateNearbyStations()
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import (
// createMockLowEnergyLocationStationFinder1 creates mock low energy location station finder with nearbychargestation.MockSearchResponse1
func createMockLowEnergyLocationStationFinder1() *lowEnergyLocationStationFinder {
obj := &lowEnergyLocationStationFinder{
location: nil,
bf: &basicFinder{
nil,
&basicFinder{
tnSearchConnector: nil,

searchResp: nearbychargestation.MockSearchResponse1,
Expand All @@ -23,8 +23,8 @@ func createMockLowEnergyLocationStationFinder1() *lowEnergyLocationStationFinder
// createMockLowEnergyLocationStationFinder2 creates mock low energy location station finder with nearbychargestation.MockSearchResponse2
func createMockLowEnergyLocationStationFinder2() *lowEnergyLocationStationFinder {
obj := &lowEnergyLocationStationFinder{
location: nil,
bf: &basicFinder{
nil,
&basicFinder{
tnSearchConnector: nil,
searchResp: nearbychargestation.MockSearchResponse2,
searchRespLock: &sync.RWMutex{},
Expand All @@ -36,8 +36,8 @@ func createMockLowEnergyLocationStationFinder2() *lowEnergyLocationStationFinder
// createMockLowEnergyLocationStationFinder3 creates mock low energy location station finder with nearbychargestation.MockSearchResponse3
func createMockLowEnergyLocationStationFinder3() *lowEnergyLocationStationFinder {
obj := &lowEnergyLocationStationFinder{
location: nil,
bf: &basicFinder{
nil,
&basicFinder{
tnSearchConnector: nil,
searchResp: nearbychargestation.MockSearchResponse3,
searchRespLock: &sync.RWMutex{},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func TestLowEnergyLocationStationFinderIterator1(t *testing.T) {
r = append(r, item)
}
if !reflect.DeepEqual(r, mockChargeStationInfo1) {
t.Errorf("expect %v but got %v", mockChargeStationInfo1, r)
t.Errorf("expect %#v but got %#v", mockChargeStationInfo1, r)
}
}(&wg)
wg.Wait()
Expand All @@ -42,7 +42,7 @@ func TestLowEnergyLocationStationFinderIterator2(t *testing.T) {
r = append(r, item)
}
if !reflect.DeepEqual(r, mockChargeStationInfo2) {
t.Errorf("expect %v but got %v", mockChargeStationInfo2, r)
t.Errorf("expect %#v but got %#v", mockChargeStationInfo2, r)
}
}(&wg)
wg.Wait()
Expand All @@ -61,7 +61,7 @@ func TestLowEnergyLocationStationFinderIterator3(t *testing.T) {
r = append(r, item)
}
if !reflect.DeepEqual(r, mockChargeStationInfo3) {
t.Errorf("expect %v but got %v", mockChargeStationInfo3, r)
t.Errorf("expect %#v but got %#v", mockChargeStationInfo3, r)
}
}(&wg)
wg.Wait()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,39 +5,33 @@ import (
"github.com/Telenav/osrm-backend/integration/pkg/api/search/searchcoordinate"
"github.com/Telenav/osrm-backend/integration/service/oasis/searchconnector"
"github.com/Telenav/osrm-backend/integration/service/oasis/searchhelper"
"github.com/Telenav/osrm-backend/integration/service/oasis/stationfinder/stationfindertype"
)

//@todo: This number need to be adjusted based on charge station profile
const origMaxSearchCandidateNumber = 999

type origStationFinder struct {
oasisReq *oasis.Request
bf *basicFinder
*basicFinder
}

func NewOrigStationFinder(sc *searchconnector.TNSearchConnector, oasisReq *oasis.Request) *origStationFinder {
func newOrigStationFinder(sc *searchconnector.TNSearchConnector, oasisReq *oasis.Request) *origStationFinder {
obj := &origStationFinder{
oasisReq: oasisReq,
bf: newBasicFinder(sc),
oasisReq,
newBasicFinder(sc),
}
obj.prepare()
return obj
}

func (sf *origStationFinder) prepare() {
func (oFinder *origStationFinder) prepare() {
req, _ := searchhelper.GenerateSearchRequest(
searchcoordinate.Coordinate{
Lat: sf.oasisReq.Coordinates[0].Lat,
Lon: sf.oasisReq.Coordinates[0].Lon},
Lat: oFinder.oasisReq.Coordinates[0].Lat,
Lon: oFinder.oasisReq.Coordinates[0].Lon},
origMaxSearchCandidateNumber,
sf.oasisReq.CurrRange)
oFinder.oasisReq.CurrRange)

sf.bf.getNearbyChargeStations(req)
oFinder.getNearbyChargeStations(req)
return
}

// NearbyStationsIterator provides channel which contains near by station information for orig
func (sf *origStationFinder) IterateNearbyStations() <-chan *stationfindertype.ChargeStationInfo {
return sf.bf.IterateNearbyStations()
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import (
// CreateMockOrigStationFinder1 creates mock orig station finder with nearbychargestation.MockSearchResponse1
func CreateMockOrigStationFinder1() *origStationFinder {
obj := &origStationFinder{
oasisReq: nil,
bf: &basicFinder{
nil,
&basicFinder{
tnSearchConnector: nil,
searchResp: nearbychargestation.MockSearchResponse1,
searchRespLock: &sync.RWMutex{},
Expand All @@ -22,8 +22,8 @@ func CreateMockOrigStationFinder1() *origStationFinder {
// CreateMockOrigStationFinder2 creates mock orig station finder with nearbychargestation.MockSearchResponse2
func CreateMockOrigStationFinder2() *origStationFinder {
obj := &origStationFinder{
oasisReq: nil,
bf: &basicFinder{
nil,
&basicFinder{
tnSearchConnector: nil,
searchResp: nearbychargestation.MockSearchResponse2,
searchRespLock: &sync.RWMutex{},
Expand All @@ -35,8 +35,8 @@ func CreateMockOrigStationFinder2() *origStationFinder {
// CreateMockOrigStationFinder3 creates mock orig station finder with nearbychargestation.MockSearchResponse3
func CreateMockOrigStationFinder3() *origStationFinder {
obj := &origStationFinder{
oasisReq: nil,
bf: &basicFinder{
nil,
&basicFinder{
tnSearchConnector: nil,
searchResp: nearbychargestation.MockSearchResponse3,
searchRespLock: &sync.RWMutex{},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,12 @@ func TestOrigStationFinderIterator(t *testing.T) {
c := sf.IterateNearbyStations()
var r []*stationfindertype.ChargeStationInfo

isdoneC := make(chan bool)
go func() {
for item := range c {
r = append(r, item)
}
for item := range c {
r = append(r, item)
}

if !reflect.DeepEqual(r, mockChargeStationInfo1) {
t.Errorf("expect %#v but got %#v", mockChargeStationInfo1, r)
}

if !reflect.DeepEqual(r, mockChargeStationInfo1) {
t.Errorf("expect %v but got %v", mockChargeStationInfo1, r)
}
isdoneC <- true
}()
<-isdoneC
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@ package localfinder
import (
"github.com/Telenav/osrm-backend/integration/pkg/api/oasis"
"github.com/Telenav/osrm-backend/integration/service/oasis/spatialindexer"
"github.com/Telenav/osrm-backend/integration/service/oasis/stationfinder/stationfindertype"
"github.com/golang/glog"
)

type destStationLocalFinder struct {
basicFinder *basicLocalFinder
*basicLocalFinder
}

func newDestStationFinder(localFinder spatialindexer.Finder, oasisReq *oasis.Request) *destStationLocalFinder {
Expand All @@ -22,22 +21,12 @@ func newDestStationFinder(localFinder spatialindexer.Finder, oasisReq *oasis.Req
}

obj := &destStationLocalFinder{
basicFinder: newBasicLocalFinder(localFinder),
newBasicLocalFinder(localFinder),
}
obj.basicFinder.getNearbyChargeStations(spatialindexer.Location{
obj.getNearbyChargeStations(spatialindexer.Location{
Lat: oasisReq.Coordinates[1].Lat,
Lon: oasisReq.Coordinates[1].Lon},
oasisReq.MaxRange-oasisReq.SafeLevel)

return obj
}

// NearbyStationsIterator provides channel which contains near by station information for dest
func (localFinder *destStationLocalFinder) IterateNearbyStations() <-chan *stationfindertype.ChargeStationInfo {
return localFinder.basicFinder.IterateNearbyStations()
}

// Stop stops functionality of finder
func (localFinder *destStationLocalFinder) Stop() {
localFinder.basicFinder.Stop()
}
Loading

0 comments on commit fedd283

Please sign in to comment.