added control over inclusive/exclusive numeric/date ranges
This commit is contained in:
parent
ef59abe4c9
commit
78db88897c
|
@ -1,5 +1,9 @@
|
|||
function SearchCtrl($scope, $http, $routeParams, $log, $sce) {
|
||||
|
||||
$scope.inclusiveMin = true;
|
||||
$scope.inclusiveMax = false;
|
||||
$scope.inclusiveStart = true;
|
||||
$scope.inclusiveEnd = false;
|
||||
$scope.fieldNames = [];
|
||||
|
||||
$scope.minShouldOptions = [];
|
||||
|
@ -79,6 +83,8 @@ function SearchCtrl($scope, $http, $routeParams, $log, $sce) {
|
|||
"query": {
|
||||
"min": parseFloat($scope.min),
|
||||
"max": parseFloat($scope.max),
|
||||
"inclusive_min": $scope.inclusiveMin,
|
||||
"inclusive_max": $scope.inclusiveMax,
|
||||
"field": $scope.field,
|
||||
}
|
||||
}).
|
||||
|
@ -98,6 +104,8 @@ function SearchCtrl($scope, $http, $routeParams, $log, $sce) {
|
|||
"query": {
|
||||
"start": $scope.startDate,
|
||||
"end": $scope.endDate,
|
||||
"inclusive_start": $scope.inclusiveStart,
|
||||
"inclusive_end": $scope.inclusiveEnd,
|
||||
"field": $scope.field,
|
||||
}
|
||||
}).
|
||||
|
|
|
@ -15,12 +15,24 @@
|
|||
<input ng-model="startDate" type="text" class="form-control" id="inputStart" placeholder="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="inputInclusiveStart" class="col-sm-2 control-label">Inclusive Start</label>
|
||||
<div class="col-sm-10">
|
||||
<input ng-model="inclusiveStart" type="checkbox" class="form-control" id="inputInclusiveStart">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="inputEnd" class="col-sm-2 control-label">End Date</label>
|
||||
<div class="col-sm-10">
|
||||
<input ng-model="endDate" type="text" class="form-control" id="inputEnd" placeholder="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="inputInclusiveEnd" class="col-sm-2 control-label">Inclusive End</label>
|
||||
<div class="col-sm-10">
|
||||
<input ng-model="inclusiveEnd" type="checkbox" class="form-control" id="inputInclusiveEnd">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary" ng-click="searchDateRange()">Search</button>
|
||||
|
|
|
@ -15,12 +15,24 @@
|
|||
<input ng-model="min" type="text" class="form-control" id="inputMin" placeholder="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="inputInclusiveMin" class="col-sm-2 control-label">Inclusive Min</label>
|
||||
<div class="col-sm-10">
|
||||
<input ng-model="inclusiveMin" type="checkbox" class="form-control" id="inputInclusiveMin">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="inputMax" class="col-sm-2 control-label">Max</label>
|
||||
<div class="col-sm-10">
|
||||
<input ng-model="max" type="text" class="form-control" id="inputMax" placeholder="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="inputInclusiveMax" class="col-sm-2 control-label">Inclusive Max</label>
|
||||
<div class="col-sm-10">
|
||||
<input ng-model="inclusiveMax" type="checkbox" class="form-control" id="inputInclusiveMax">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary" ng-click="searchNumericRange()">Search</button>
|
||||
|
|
|
@ -19,16 +19,24 @@ import (
|
|||
type DateRangeQuery struct {
|
||||
Start *string `json:"start,omitempty"`
|
||||
End *string `json:"end,omitempty"`
|
||||
InclusiveStart *bool `json:"inclusive_start,omitempty"`
|
||||
InclusiveEnd *bool `json:"inclusive_end,omitempty"`
|
||||
FieldVal string `json:"field,omitempty"`
|
||||
BoostVal float64 `json:"boost,omitempty"`
|
||||
DateTimeParser *string `json:"datetime_parser,omitempty"`
|
||||
}
|
||||
|
||||
func NewDateRangeQuery(start, end *string) *DateRangeQuery {
|
||||
return NewDateRangeInclusiveQuery(start, end, nil, nil)
|
||||
}
|
||||
|
||||
func NewDateRangeInclusiveQuery(start, end *string, startInclusive, endInclusive *bool) *DateRangeQuery {
|
||||
return &DateRangeQuery{
|
||||
Start: start,
|
||||
End: end,
|
||||
BoostVal: 1.0,
|
||||
Start: start,
|
||||
End: end,
|
||||
InclusiveStart: startInclusive,
|
||||
InclusiveEnd: endInclusive,
|
||||
BoostVal: 1.0,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -86,7 +94,7 @@ func (q *DateRangeQuery) Searcher(i *indexImpl, explain bool) (search.Searcher,
|
|||
max = numeric_util.Int64ToFloat64(endTime.UnixNano())
|
||||
}
|
||||
|
||||
return search.NewNumericRangeSearcher(i.i, &min, &max, field, q.BoostVal, explain)
|
||||
return search.NewNumericRangeSearcher(i.i, &min, &max, q.InclusiveStart, q.InclusiveEnd, field, q.BoostVal, explain)
|
||||
}
|
||||
|
||||
func (q *DateRangeQuery) Validate() error {
|
||||
|
|
|
@ -13,17 +13,25 @@ import (
|
|||
)
|
||||
|
||||
type NumericRangeQuery struct {
|
||||
Min *float64 `json:"min,omitempty"`
|
||||
Max *float64 `json:"max,omitempty"`
|
||||
FieldVal string `json:"field,omitempty"`
|
||||
BoostVal float64 `json:"boost,omitempty"`
|
||||
Min *float64 `json:"min,omitempty"`
|
||||
Max *float64 `json:"max,omitempty"`
|
||||
InclusiveMin *bool `json:"inclusive_min,omitempty"`
|
||||
InclusiveMax *bool `json:"inclusive_max,omitempty"`
|
||||
FieldVal string `json:"field,omitempty"`
|
||||
BoostVal float64 `json:"boost,omitempty"`
|
||||
}
|
||||
|
||||
func NewNumericRangeQuery(min, max *float64) *NumericRangeQuery {
|
||||
return NewNumericRangeInclusiveQuery(min, max, nil, nil)
|
||||
}
|
||||
|
||||
func NewNumericRangeInclusiveQuery(min, max *float64, minInclusive, maxInclusive *bool) *NumericRangeQuery {
|
||||
return &NumericRangeQuery{
|
||||
Min: min,
|
||||
Max: max,
|
||||
BoostVal: 1.0,
|
||||
Min: min,
|
||||
Max: max,
|
||||
InclusiveMin: minInclusive,
|
||||
InclusiveMax: maxInclusive,
|
||||
BoostVal: 1.0,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -50,7 +58,7 @@ func (q *NumericRangeQuery) Searcher(i *indexImpl, explain bool) (search.Searche
|
|||
if q.FieldVal == "" {
|
||||
field = i.m.DefaultField
|
||||
}
|
||||
return search.NewNumericRangeSearcher(i.i, q.Min, q.Max, field, q.BoostVal, explain)
|
||||
return search.NewNumericRangeSearcher(i.i, q.Min, q.Max, q.InclusiveMin, q.InclusiveMax, field, q.BoostVal, explain)
|
||||
}
|
||||
|
||||
func (q *NumericRangeQuery) Validate() error {
|
||||
|
|
|
@ -25,7 +25,7 @@ type NumericRangeSearcher struct {
|
|||
searcher *DisjunctionSearcher
|
||||
}
|
||||
|
||||
func NewNumericRangeSearcher(index index.Index, min *float64, max *float64, field string, boost float64, explain bool) (*NumericRangeSearcher, error) {
|
||||
func NewNumericRangeSearcher(index index.Index, min *float64, max *float64, inclusiveMin, inclusiveMax *bool, field string, boost float64, explain bool) (*NumericRangeSearcher, error) {
|
||||
// account for unbounded edges
|
||||
if min == nil {
|
||||
negInf := math.Inf(-1)
|
||||
|
@ -35,9 +35,23 @@ func NewNumericRangeSearcher(index index.Index, min *float64, max *float64, fiel
|
|||
Inf := math.Inf(1)
|
||||
max = &Inf
|
||||
}
|
||||
if inclusiveMin == nil {
|
||||
defaultInclusiveMin := true
|
||||
inclusiveMin = &defaultInclusiveMin
|
||||
}
|
||||
if inclusiveMax == nil {
|
||||
defaultInclusiveMax := false
|
||||
inclusiveMax = &defaultInclusiveMax
|
||||
}
|
||||
// find all the ranges
|
||||
minInt64 := numeric_util.Float64ToInt64(*min)
|
||||
if !*inclusiveMin && minInt64 != math.MaxInt64 {
|
||||
minInt64 += 1
|
||||
}
|
||||
maxInt64 := numeric_util.Float64ToInt64(*max)
|
||||
if !*inclusiveMax && maxInt64 != math.MinInt64 {
|
||||
maxInt64 -= 1
|
||||
}
|
||||
// FIXME hard-coded precion, should match field declaration
|
||||
termRanges := splitInt64Range(minInt64, maxInt64, 4)
|
||||
terms := termRanges.Enumerate()
|
||||
|
|
Loading…
Reference in New Issue
Block a user