Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix the pinning api filtering #992

Open
wants to merge 2 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 38 additions & 57 deletions api/v1/pinning.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,15 @@ import (

"github.com/application-research/estuary/pinner"

"github.com/application-research/estuary/model"
pinningstatus "github.com/application-research/estuary/pinner/status"
"github.com/application-research/estuary/util"
"github.com/ipfs/go-cid"
"github.com/labstack/echo/v4"
"github.com/libp2p/go-libp2p/core/peer"
"golang.org/x/xerrors"
"gorm.io/gorm"

"github.com/application-research/estuary/model"
pinningstatus "github.com/application-research/estuary/pinner/status"
"github.com/application-research/estuary/util"
)

const (
Expand Down Expand Up @@ -176,62 +177,42 @@ func filterForStatusQuery(q *gorm.DB, statuses map[pinningstatus.PinningStatus]b
return q, nil // if no status filter or all statuses are specified, return all pins
}

pinned := statuses[pinningstatus.PinningStatusPinned]
failed := statuses[pinningstatus.PinningStatusFailed]
pinning := statuses[pinningstatus.PinningStatusPinning]
queued := statuses[pinningstatus.PinningStatusQueued]

if len(statuses) == 1 {
switch {
case pinned:
return q.Where("active and not failed and not pinning"), nil
case failed:
return q.Where("failed and not active and not pinning"), nil
case pinning:
return q.Where("pinning and not active and not failed"), nil
default:
return q.Where("not active and not pinning and not failed"), nil
}
}

if len(statuses) == 2 {
if pinned && failed {
return q.Where("(active or failed) and not pinning"), nil
}

if pinned && queued {
return q.Where("active and not failed and not pinning"), nil
}

if pinned && pinning {
return q.Where("(active or pinning) and not failed"), nil
}

if pinning && failed {
return q.Where("(pinning or failed) and not active"), nil
}

if pinning && queued {
return q.Where("pinning and not active and not failed"), nil
}

if failed && queued {
return q.Where("failed and not active and not pinning"), nil
whereSet := false
for status, ok := range statuses {
if ok {
switch status {
case pinningstatus.PinningStatusPinned:
if whereSet {
q = q.Or("active")
} else {
q = q.Where("active")
whereSet = true
}
case pinningstatus.PinningStatusFailed:
if whereSet {
q = q.Or("failed")
} else {
q = q.Where("failed")
whereSet = true
}
case pinningstatus.PinningStatusPinning:
if whereSet {
q = q.Or("pinning")
} else {
q = q.Where("pinning")
whereSet = true
}
case pinningstatus.PinningStatusQueued:
if whereSet {
q = q.Or("not active and not pinning and not failed")
} else {
q = q.Where("not active and not pinning and not failed")
whereSet = true
}
}
}
}

if !statuses[pinningstatus.PinningStatusFailed] {
return q.Where("not failed and (active or pinning)"), nil
}

if !statuses[pinningstatus.PinningStatusPinned] {
return q.Where("not active and (failed or pinning"), nil
}

if !statuses[pinningstatus.PinningStatusPinning] {
return q.Where("not pinning and (active or failed"), nil
}
return q.Where("active or pinning or failed"), nil
return q, nil
}

// handleAddPin godoc
Expand Down
44 changes: 39 additions & 5 deletions api/v1/pinning_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ import (
"gorm.io/driver/sqlite"
"gorm.io/gorm"

pinningstatus "github.com/application-research/estuary/pinner/status"
"github.com/stretchr/testify/assert"

pinningstatus "github.com/application-research/estuary/pinner/status"
)

type Conts struct {
Expand All @@ -33,7 +34,16 @@ func TestStatusFilterQuery(t *testing.T) {

resp, err = filterForStatusQuery(db, s)
assert.NoError(err)
assert.Equal("SELECT * FROM `conts` WHERE failed and not active and not pinning",
assert.Equal("SELECT * FROM `conts` WHERE failed",
resp.Find([]Conts{}).Statement.SQL.String())

s = map[pinningstatus.PinningStatus]bool{
pinningstatus.PinningStatusQueued: true,
}

resp, err = filterForStatusQuery(db, s)
assert.NoError(err)
assert.Equal(" SELECT * FROM `conts` WHERE not active and not pinning and not failed",
resp.Find([]Conts{}).Statement.SQL.String())

s = map[pinningstatus.PinningStatus]bool{
Expand All @@ -43,7 +53,7 @@ func TestStatusFilterQuery(t *testing.T) {

resp, err = filterForStatusQuery(db, s)
assert.NoError(err)
assert.Equal("SELECT * FROM `conts` WHERE (active or failed) and not pinning",
assert.Equal("SELECT * FROM `conts` WHERE failed OR active",
resp.Find([]Conts{}).Statement.SQL.String())

s = map[pinningstatus.PinningStatus]bool{
Expand All @@ -53,16 +63,40 @@ func TestStatusFilterQuery(t *testing.T) {

resp, err = filterForStatusQuery(db, s)
assert.NoError(err)
assert.Equal("SELECT * FROM `conts` WHERE (active or pinning) and not failed",
assert.Equal("SELECT * FROM `conts` WHERE pinning OR active",
resp.Find([]Conts{}).Statement.SQL.String())

s = map[pinningstatus.PinningStatus]bool{
pinningstatus.PinningStatusPinning: true,
pinningstatus.PinningStatusQueued: true,
}

resp, err = filterForStatusQuery(db, s)
assert.NoError(err)
assert.Equal("SELECT * FROM `conts` WHERE pinning OR (not active and not pinning and not failed)",
resp.Find([]Conts{}).Statement.SQL.String())

s = map[pinningstatus.PinningStatus]bool{
pinningstatus.PinningStatusPinning: true,
pinningstatus.PinningStatusQueued: true,
pinningstatus.PinningStatusFailed: true,
}

resp, err = filterForStatusQuery(db, s)
assert.NoError(err)
assert.Equal("SELECT * FROM `conts` WHERE pinning and not active and not failed",
assert.Equal("SELECT * FROM `conts` WHERE pinning OR (not active and not pinning and not failed) OR failed",
resp.Find([]Conts{}).Statement.SQL.String())

s = map[pinningstatus.PinningStatus]bool{
pinningstatus.PinningStatusPinning: true,
pinningstatus.PinningStatusQueued: true,
pinningstatus.PinningStatusFailed: true,
pinningstatus.PinningStatusPinned: true,
}

resp, err = filterForStatusQuery(db, s)
assert.NoError(err)
assert.Equal(" SELECT * FROM `conts`",
resp.Find([]Conts{}).Statement.SQL.String())

}