in query/aql_compiler.go [105:166]
func (qc *AQLQueryContext) adjustFilterToTimeFilter() {
toBeRemovedFilters := []int{}
timeFilter := common.TimeFilter{}
for i, filter := range qc.Query.FiltersParsed {
if e, ok := filter.(*expr.BinaryExpr); ok {
lhs, isCol := e.LHS.(*expr.VarRef)
if !isCol {
continue
}
// check if this filter on main table event time column
tableID, columnID, err := qc.QCHelper.ResolveColumn(lhs.Val)
if err != nil || tableID != 0 || columnID != 0 {
continue
}
val := ""
// only support number literal or string literal
switch rhs := e.RHS.(type) {
case *expr.NumberLiteral:
val = rhs.String()
case *expr.StringLiteral:
val = rhs.Val
}
if val == "" {
continue
}
switch e.Op {
case expr.LT:
if timeFilter.To == "" {
// only convert first LT
timeFilter.To = val
toBeRemovedFilters = append(toBeRemovedFilters, i)
} else {
qc.Error = utils.StackError(nil, "Only one '<' filter allowed for event time column")
return
}
case expr.GTE:
if timeFilter.From == "" {
// only convert first GTE
timeFilter.From = val
toBeRemovedFilters = append(toBeRemovedFilters, i)
} else {
qc.Error = utils.StackError(nil, "Only one '>=' filter allowed for event time column")
return
}
}
}
}
if timeFilter.From != "" || timeFilter.To != "" {
// processTimeFilter will handle the from is nil case
if qc.fromTime, qc.toTime, qc.Error = common.ParseTimeFilter(timeFilter, qc.fixedTimezone, utils.Now()); qc.Error != nil {
return
}
// remove from original query filter
for i := len(toBeRemovedFilters) - 1; i >= 0; i-- {
index := toBeRemovedFilters[i]
qc.Query.FiltersParsed = append(qc.Query.FiltersParsed[:index], qc.Query.FiltersParsed[index+1:]...)
}
}
}