MB-20793 : Validation for min/max/start/end params for numeric/date range facets
Corrected the validation and updated the unit tests.
This commit is contained in:
parent
f514ac7867
commit
78686c3fa3
20
search.go
20
search.go
|
@ -116,7 +116,7 @@ func (fr *FacetRequest) Validate() error {
|
|||
if nrCount > 0 && drCount > 0 {
|
||||
return fmt.Errorf("facet can only conain numeric ranges or date ranges, not both")
|
||||
}
|
||||
rangeSet := false
|
||||
|
||||
if nrCount > 0 {
|
||||
nrNames := map[string]interface{}{}
|
||||
for _, nr := range fr.NumericRanges {
|
||||
|
@ -124,13 +124,10 @@ func (fr *FacetRequest) Validate() error {
|
|||
return fmt.Errorf("numeric ranges contains duplicate name '%s'", nr.Name)
|
||||
}
|
||||
nrNames[nr.Name] = struct{}{}
|
||||
if !rangeSet && (nr.Min != nil || nr.Max != nil) {
|
||||
rangeSet = true
|
||||
if nr.Min == nil && nr.Max == nil {
|
||||
return fmt.Errorf("numeric range query must specify either min, max or both for range name '%s'", nr.Name)
|
||||
}
|
||||
}
|
||||
if !rangeSet {
|
||||
return fmt.Errorf("numeric range query must specify either min, max or both")
|
||||
}
|
||||
|
||||
} else {
|
||||
dateTimeParser, err := cache.DateTimeParserNamed(defaultDateTimeParser)
|
||||
|
@ -143,16 +140,11 @@ func (fr *FacetRequest) Validate() error {
|
|||
return fmt.Errorf("date ranges contains duplicate name '%s'", dr.Name)
|
||||
}
|
||||
drNames[dr.Name] = struct{}{}
|
||||
if !rangeSet {
|
||||
start, end := dr.ParseDates(dateTimeParser)
|
||||
if !start.IsZero() || !end.IsZero() {
|
||||
rangeSet = true
|
||||
}
|
||||
start, end := dr.ParseDates(dateTimeParser)
|
||||
if start.IsZero() && end.IsZero() {
|
||||
return fmt.Errorf("date range query must specify either start, end or both for range name '%s'", dr.Name)
|
||||
}
|
||||
}
|
||||
if !rangeSet {
|
||||
return fmt.Errorf("date range query must specify either start, end or both")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@ package bleve
|
|||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
|
@ -183,3 +184,81 @@ func TestUnmarshalingSearchResult(t *testing.T) {
|
|||
t.Errorf("expected 1 error, got %d", len(rv.Status.Errors))
|
||||
}
|
||||
}
|
||||
|
||||
func TestFacetNumericDateRangeRequests(t *testing.T) {
|
||||
var drMissingErr = fmt.Errorf("date range query must specify either start, end or both for range name 'testName'")
|
||||
var nrMissingErr = fmt.Errorf("numeric range query must specify either min, max or both for range name 'testName'")
|
||||
var drNrErr = fmt.Errorf("facet can only conain numeric ranges or date ranges, not both")
|
||||
value := float64(5)
|
||||
|
||||
facet := NewFacetRequest("Date_Range_Success_With_StartEnd", 1)
|
||||
facet.DateTimeRanges = make([]*dateTimeRange, 0, 1)
|
||||
facet.DateTimeRanges = append(facet.DateTimeRanges, &dateTimeRange{Name: "testName", Start: time.Unix(0, 0), End: time.Now()})
|
||||
if err := facet.Validate(); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
facet = NewFacetRequest("Date_Range_Success_With_Start", 1)
|
||||
facet.DateTimeRanges = make([]*dateTimeRange, 0, 1)
|
||||
facet.DateTimeRanges = append(facet.DateTimeRanges, &dateTimeRange{Name: "testName", Start: time.Unix(0, 0)})
|
||||
if err := facet.Validate(); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
facet = NewFacetRequest("Date_Range_Success_With_End", 1)
|
||||
facet.DateTimeRanges = make([]*dateTimeRange, 0, 1)
|
||||
facet.DateTimeRanges = append(facet.DateTimeRanges, &dateTimeRange{Name: "testName", End: time.Now()})
|
||||
if err := facet.Validate(); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
facet = NewFacetRequest("Numeric_Range_Success_With_MinMax", 1)
|
||||
facet.NumericRanges = make([]*numericRange, 0, 1)
|
||||
facet.NumericRanges = append(facet.NumericRanges, &numericRange{Name: "testName", Min: &value, Max: &value})
|
||||
if err := facet.Validate(); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
facet = NewFacetRequest("Numeric_Range_Success_With_Min", 1)
|
||||
facet.NumericRanges = make([]*numericRange, 0, 1)
|
||||
facet.NumericRanges = append(facet.NumericRanges, &numericRange{Name: "testName", Min: &value})
|
||||
if err := facet.Validate(); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
facet = NewFacetRequest("Numeric_Range_Success_With_Max", 1)
|
||||
facet.NumericRanges = make([]*numericRange, 0, 1)
|
||||
facet.NumericRanges = append(facet.NumericRanges, &numericRange{Name: "testName", Max: &value})
|
||||
if err := facet.Validate(); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
facet = NewFacetRequest("Date_Range_Missing_Failure", 1)
|
||||
facet.DateTimeRanges = make([]*dateTimeRange, 0, 1)
|
||||
facet.DateTimeRanges = append(facet.DateTimeRanges, &dateTimeRange{Name: "testName"})
|
||||
if err := facet.Validate(); err != nil {
|
||||
if err.Error() != drMissingErr.Error() {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
facet = NewFacetRequest("Numeric_Range_Missing_Failure", 1)
|
||||
facet.NumericRanges = make([]*numericRange, 0, 1)
|
||||
facet.NumericRanges = append(facet.NumericRanges, &numericRange{Name: "testName"})
|
||||
if err := facet.Validate(); err != nil {
|
||||
if err.Error() != nrMissingErr.Error() {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
facet = NewFacetRequest("Numeric_And_DateRanges_Failure", 1)
|
||||
facet.NumericRanges = make([]*numericRange, 0, 1)
|
||||
facet.NumericRanges = append(facet.NumericRanges, &numericRange{Name: "testName", Min: &value, Max: nil})
|
||||
facet.DateTimeRanges = make([]*dateTimeRange, 0, 1)
|
||||
facet.DateTimeRanges = append(facet.DateTimeRanges, &dateTimeRange{Name: "testName", Start: time.Unix(0, 0), End: time.Now()})
|
||||
if err := facet.Validate(); err != nil {
|
||||
if err.Error() != drNrErr.Error() {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue