route filter improvement

This commit is contained in:
Pedro Nasser
2016-08-13 19:25:07 -03:00
parent 680bd08137
commit c5025142bf
8 changed files with 96 additions and 12 deletions

View File

@@ -260,10 +260,10 @@ func (ds *BoltDatastore) GetRoute(appName, routeName string) (*models.Route, err
return route, err
}
func (ds *BoltDatastore) GetRoutes(filter *models.RouteFilter) ([]*models.Route, error) {
func (ds *BoltDatastore) GetRoutesByApp(appName string, filter *models.RouteFilter) ([]*models.Route, error) {
res := []*models.Route{}
err := ds.db.View(func(tx *bolt.Tx) error {
b, err := ds.getRouteBucketForApp(tx, filter.AppName)
b, err := ds.getRouteBucketForApp(tx, appName)
if err != nil {
return err
}
@@ -294,6 +294,43 @@ func (ds *BoltDatastore) GetRoutes(filter *models.RouteFilter) ([]*models.Route,
return res, nil
}
func (ds *BoltDatastore) GetRoutes(filter *models.RouteFilter) ([]*models.Route, error) {
res := []*models.Route{}
err := ds.db.View(func(tx *bolt.Tx) error {
i := 0
rbucket := tx.Bucket(ds.routesBucket)
b := rbucket.Cursor()
var k, v []byte
k, v = b.First()
// Iterates all buckets
for ; k != nil && v == nil; k, v = b.Next() {
bucket := rbucket.Bucket(k)
r := bucket.Cursor()
var k2, v2 []byte
k2, v2 = r.Last()
// Iterate all routes
for ; k2 != nil; k2, v2 = r.Prev() {
var route models.Route
err := json.Unmarshal(v2, &route)
if err != nil {
return err
}
if models.ApplyRouteFilter(&route, filter) {
i++
res = append(res, &route)
}
}
}
return nil
})
if err != nil {
return nil, err
}
return res, nil
}
func (ds *BoltDatastore) Put(key, value []byte) error {
ds.db.Update(func(tx *bolt.Tx) error {
b := tx.Bucket(ds.extrasBucket) // todo: maybe namespace by app?

View File

@@ -122,7 +122,19 @@ func TestBolt(t *testing.T) {
}
// Testing list routes
routes, err := ds.GetRoutes(&models.RouteFilter{AppName: testApp.Name})
routes, err := ds.GetRoutesByApp(testApp.Name, &models.RouteFilter{})
if err != nil {
t.Fatalf("Test GetRoutes: error: %s", err)
}
if len(routes) == 0 {
t.Fatal("Test GetRoutes: expected result count to be greater than 0")
}
if routes[0].Path != testRoute.Path {
t.Fatalf("Test GetRoutes: expected `app.Name` to be `%s` but it was `%s`", testRoute.Path, routes[0].Path)
}
// Testing list routes
routes, err = ds.GetRoutes(&models.RouteFilter{Image: testRoute.Image})
if err != nil {
t.Fatalf("Test GetRoutes: error: %s", err)
}

View File

@@ -33,6 +33,10 @@ func (m *Mock) GetRoutes(routeFilter *models.RouteFilter) ([]*models.Route, erro
return m.FakeRoutes, nil
}
func (m *Mock) GetRoutesByApp(appName string, routeFilter *models.RouteFilter) ([]*models.Route, error) {
return m.FakeRoutes, nil
}
func (m *Mock) StoreRoute(route *models.Route) (*models.Route, error) {
return m.FakeRoute, nil
}

View File

@@ -263,6 +263,32 @@ func (ds *PostgresDatastore) GetRoutes(filter *models.RouteFilter) ([]*models.Ro
return res, nil
}
func (ds *PostgresDatastore) GetRoutesByApp(appName string, filter *models.RouteFilter) ([]*models.Route, error) {
res := []*models.Route{}
filter.AppName = appName
filterQuery := buildFilterQuery(filter)
rows, err := ds.db.Query(fmt.Sprintf("%s %s", routeSelector, filterQuery))
// todo: check for no rows so we don't respond with a sql 500 err
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var route models.Route
err := scanRoute(rows, &route)
if err != nil {
return nil, err
}
res = append(res, &route)
}
if err := rows.Err(); err != nil {
return nil, err
}
return res, nil
}
func buildFilterQuery(filter *models.RouteFilter) string {
filterQuery := ""