0
0
Fork 0

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:
Sreekanth Sivasankaran 2017-02-02 12:15:48 +05:30
parent f514ac7867
commit 78686c3fa3
2 changed files with 85 additions and 14 deletions

View File

@ -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
}

View File

@ -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)
}
}
}