diff --git a/search/search.go b/search/search.go index fd768084..8485433c 100644 --- a/search/search.go +++ b/search/search.go @@ -768,10 +768,10 @@ func rangeToProto(r Range) (*pb.FacetRange, error) { func protoToRange(rng *pb.FacetRefinement_Range) Range { r := Range{Start: negInf, End: posInf} - if x, err := strconv.ParseFloat(rng.GetStart(), 64); err != nil { + if x, err := strconv.ParseFloat(rng.GetStart(), 64); err == nil { r.Start = x } - if x, err := strconv.ParseFloat(rng.GetEnd(), 64); err != nil { + if x, err := strconv.ParseFloat(rng.GetEnd(), 64); err == nil { r.End = x } return r diff --git a/search/search_test.go b/search/search_test.go index 0459cd74..519dfb63 100644 --- a/search/search_test.go +++ b/search/search_test.go @@ -7,6 +7,7 @@ package search import ( "errors" "fmt" + "math" "reflect" "strings" "testing" @@ -1268,3 +1269,33 @@ func TestDeleteMultiError(t *testing.T) { t.Fatalf("got nil, want not-nill MultiError[1]") } } + +func TestProtoToRange(t *testing.T) { + testCases := []struct { + desc string + rng *pb.FacetRefinement_Range + want Range + }{ + { + desc: "both bounds finite", + rng: &pb.FacetRefinement_Range{Start: proto.String("1.5e+00"), End: proto.String("3e+00")}, + want: Range{Start: 1.5, End: 3}, + }, + { + desc: "no lower bound", + rng: &pb.FacetRefinement_Range{End: proto.String("3e+00")}, + want: Range{Start: math.Inf(-1), End: 3}, + }, + { + desc: "no upper bound", + rng: &pb.FacetRefinement_Range{Start: proto.String("1.5e+00")}, + want: Range{Start: 1.5, End: math.Inf(1)}, + }, + } + for _, tc := range testCases { + got := protoToRange(tc.rng) + if got != tc.want { + t.Errorf("%s: protoToRange(%v) = %v, want %v", tc.desc, tc.rng, got, tc.want) + } + } +} diff --git a/v2/search/search.go b/v2/search/search.go index bd79d0e3..11e9cd24 100644 --- a/v2/search/search.go +++ b/v2/search/search.go @@ -768,10 +768,10 @@ func rangeToProto(r Range) (*pb.FacetRange, error) { func protoToRange(rng *pb.FacetRefinement_Range) Range { r := Range{Start: negInf, End: posInf} - if x, err := strconv.ParseFloat(rng.GetStart(), 64); err != nil { + if x, err := strconv.ParseFloat(rng.GetStart(), 64); err == nil { r.Start = x } - if x, err := strconv.ParseFloat(rng.GetEnd(), 64); err != nil { + if x, err := strconv.ParseFloat(rng.GetEnd(), 64); err == nil { r.End = x } return r diff --git a/v2/search/search_test.go b/v2/search/search_test.go index e757ed69..66cd69b3 100644 --- a/v2/search/search_test.go +++ b/v2/search/search_test.go @@ -7,6 +7,7 @@ package search import ( "errors" "fmt" + "math" "reflect" "strings" "testing" @@ -1268,3 +1269,33 @@ func TestDeleteMultiError(t *testing.T) { t.Fatalf("got nil, want not-nill MultiError[1]") } } + +func TestProtoToRange(t *testing.T) { + testCases := []struct { + desc string + rng *pb.FacetRefinement_Range + want Range + }{ + { + desc: "both bounds finite", + rng: &pb.FacetRefinement_Range{Start: proto.String("1.5e+00"), End: proto.String("3e+00")}, + want: Range{Start: 1.5, End: 3}, + }, + { + desc: "no lower bound", + rng: &pb.FacetRefinement_Range{End: proto.String("3e+00")}, + want: Range{Start: math.Inf(-1), End: 3}, + }, + { + desc: "no upper bound", + rng: &pb.FacetRefinement_Range{Start: proto.String("1.5e+00")}, + want: Range{Start: 1.5, End: math.Inf(1)}, + }, + } + for _, tc := range testCases { + got := protoToRange(tc.rng) + if got != tc.want { + t.Errorf("%s: protoToRange(%v) = %v, want %v", tc.desc, tc.rng, got, tc.want) + } + } +}