func()

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:]...)
		}
	}
}