46 lines
1.1 KiB
Go
46 lines
1.1 KiB
Go
|
package opensearch_query
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type query struct {
|
||
|
Size int `json:"size"`
|
||
|
Aggregations aggregationRequest `json:"aggregations"`
|
||
|
Query interface{} `json:"query,omitempty"`
|
||
|
}
|
||
|
|
||
|
type boolQuery struct {
|
||
|
FilterQueryString string
|
||
|
TimestampField string
|
||
|
TimeRangeFrom time.Time
|
||
|
TimeRangeTo time.Time
|
||
|
DateFieldFormat string
|
||
|
}
|
||
|
|
||
|
// MarshalJSON customizes the JSON marshaling for boolQuery.
|
||
|
func (b *boolQuery) MarshalJSON() ([]byte, error) {
|
||
|
// Construct range
|
||
|
dateTimeRange := map[string]interface{}{
|
||
|
"from": b.TimeRangeFrom,
|
||
|
"to": b.TimeRangeTo,
|
||
|
"include_lower": true,
|
||
|
"include_upper": true,
|
||
|
}
|
||
|
if b.DateFieldFormat != "" {
|
||
|
dateTimeRange["format"] = b.DateFieldFormat
|
||
|
}
|
||
|
rangeFilter := map[string]map[string]interface{}{"range": {b.TimestampField: dateTimeRange}}
|
||
|
|
||
|
// Construct Filter
|
||
|
queryFilter := map[string]map[string]interface{}{
|
||
|
"query_string": {"query": b.FilterQueryString},
|
||
|
}
|
||
|
|
||
|
// Construct boolean query
|
||
|
bq := map[string]map[string]interface{}{"bool": {"filter": []interface{}{rangeFilter, queryFilter}}}
|
||
|
|
||
|
return json.Marshal(&bq)
|
||
|
}
|