From aaa3f2775466cf3df1d1154164dfb30980667cbb Mon Sep 17 00:00:00 2001 From: Andrew Dunham Date: Tue, 14 Apr 2015 18:49:02 -0700 Subject: [PATCH] Fix Err fallout for graph/iterator.Or iterator --- graph/iterator/or_iterator.go | 10 +++++++++ graph/iterator/or_iterator_test.go | 44 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/graph/iterator/or_iterator.go b/graph/iterator/or_iterator.go index 3c07b18..48875dc 100644 --- a/graph/iterator/or_iterator.go +++ b/graph/iterator/or_iterator.go @@ -33,6 +33,7 @@ type Or struct { itCount int currentIterator int result graph.Value + err error } func NewOr() *Or { @@ -147,6 +148,11 @@ func (it *Or) Next() bool { return graph.NextLogOut(it, it.result, true) } + if err := graph.Err(curIt); err != nil { + it.err = err + return graph.NextLogOut(it, nil, false) + } + if it.isShortCircuiting && !first { break } @@ -159,6 +165,10 @@ func (it *Or) Next() bool { return graph.NextLogOut(it, nil, false) } +func (it *Or) Err() error { + return it.err +} + func (it *Or) Result() graph.Value { return it.result } diff --git a/graph/iterator/or_iterator_test.go b/graph/iterator/or_iterator_test.go index 27cdc7d..edbd6d4 100644 --- a/graph/iterator/or_iterator_test.go +++ b/graph/iterator/or_iterator_test.go @@ -15,6 +15,7 @@ package iterator import ( + "errors" "reflect" "testing" @@ -148,3 +149,46 @@ func TestShortCircuitingOrBasics(t *testing.T) { t.Errorf("Failed to iterate optimized Or correctly, got:%v expect:%v", got, expect) } } + +func TestOrIteratorErr(t *testing.T) { + retErr := errors.New("unique") + orErr := newTestIterator(false, retErr) + + fix1 := NewFixed(Identity) + fix1.Add(1) + + or := NewOr() + or.AddSubIterator(fix1) + or.AddSubIterator(orErr) + or.AddSubIterator(NewInt64(1, 5)) + + if !or.Next() { + t.Errorf("Failed to iterate Or correctly") + } + if got := or.Result(); got != 1 { + t.Errorf("Failed to iterate Or correctly, got:%v expect:1", got) + } + + if or.Next() != false { + t.Errorf("Or iterator did not pass through underlying 'false'") + } + if or.Err() != retErr { + t.Errorf("Or iterator did not pass through underlying Err") + } +} + +func TestShortCircuitOrIteratorErr(t *testing.T) { + retErr := errors.New("unique") + orErr := newTestIterator(false, retErr) + + or := NewOr() + or.AddSubIterator(orErr) + or.AddSubIterator(NewInt64(1, 5)) + + if or.Next() != false { + t.Errorf("Or iterator did not pass through underlying 'false'") + } + if or.Err() != retErr { + t.Errorf("Or iterator did not pass through underlying Err") + } +}