database: Don't ignore empty results in toValue(s)()

There is apparently no reason to ignore empty results - it was probably the case in the past (`null` value).

["", "v"] should be considered invalid by toValue() because it represents two values.
["", "v"] should be returned as it by toValues(), not trimming "".

Tests passes, it will hopefully not cause any issue in prod.
This commit is contained in:
Quentin Machu 2015-12-09 16:14:48 -08:00
parent 9f0ed4dcfb
commit 32747a5f25
2 changed files with 11 additions and 8 deletions

View File

@ -139,17 +139,19 @@ func Healthcheck() health.Status {
// If the path leads to multiple values or if a database error occurs, an empty string and an error are returned // If the path leads to multiple values or if a database error occurs, an empty string and an error are returned
func toValue(p *path.Path) (string, error) { func toValue(p *path.Path) (string, error) {
var value string var value string
found := false
it, _ := p.BuildIterator().Optimize() it, _ := p.BuildIterator().Optimize()
defer it.Close() defer it.Close()
for cayley.RawNext(it) { for cayley.RawNext(it) {
if value != "" { if found {
log.Error("failed query in toValue: used on an iterator containing multiple values") log.Error("failed query in toValue: used on an iterator containing multiple values")
return "", ErrInconsistent return "", ErrInconsistent
} }
if it.Result() != nil { if it.Result() != nil {
value = store.NameOf(it.Result()) value = store.NameOf(it.Result())
found = true
} }
} }
if it.Err() != nil { if it.Err() != nil {
@ -170,10 +172,7 @@ func toValues(p *path.Path) ([]string, error) {
defer it.Close() defer it.Close()
for cayley.RawNext(it) { for cayley.RawNext(it) {
if it.Result() != nil { if it.Result() != nil {
value := store.NameOf(it.Result()) values = append(values, store.NameOf(it.Result()))
if value != "" {
values = append(values, value)
}
} }
} }
if it.Err() != nil { if it.Err() != nil {

View File

@ -72,11 +72,15 @@ func TestToValue(t *testing.T) {
store.AddQuad(cayley.Triple("bob", "likes", "running")) store.AddQuad(cayley.Triple("bob", "likes", "running"))
v, err = toValue(cayley.StartPath(store, "bob").Out("likes")) v, err = toValue(cayley.StartPath(store, "bob").Out("likes"))
assert.Nil(t, err, "toValue should have worked") assert.NotNil(t, err, "toValue should return an error and an empty string if the path leads to multiple values")
assert.Equal(t, "running", v, "toValue did not return the expected value") assert.Equal(t, "", v, "toValue should return an error and an empty string if the path leads to multiple values")
store.AddQuad(cayley.Triple("bob", "likes", "swimming")) store.AddQuad(cayley.Triple("bob", "likes", "swimming"))
va, err := toValues(cayley.StartPath(store, "bob").Out("likes")) va, err := toValues(cayley.StartPath(store, "bob").Out("likes"))
assert.Nil(t, err, "toValues should have worked") assert.Nil(t, err, "toValues should have worked")
assert.Len(t, va, 2, "toValues should have returned 2 values") if assert.Len(t, va, 3, "toValues should have returned 2 values") {
assert.Contains(t, va, "running")
assert.Contains(t, va, "swimming")
assert.Contains(t, va, "")
}
} }