func NewQueryEngine(query *parser.SelectQuery, responseChan chan *protocol.Response) *QueryEngine { limit := query.Limit shouldLimit := true if limit == 0 { shouldLimit = false } queryEngine := &QueryEngine{ query: query, where: query.GetWhereCondition(), limit: limit, limits: make(map[string]int), shouldLimit: shouldLimit, responseChan: responseChan, seriesToPoints: make(map[string]*protocol.Series), } yield := func(series *protocol.Series) error { response := &protocol.Response{Type: &responseQuery, Series: series} responseChan <- response return nil } if query.HasAggregates() { queryEngine.executeCountQueryWithGroupBy(query, yield) } else if containsArithmeticOperators(query) { queryEngine.executeArithmeticQuery(query, yield) } else { queryEngine.distributeQuery(query, yield) } return queryEngine }
func NewQueryEngine(query *parser.SelectQuery, responseChan chan *protocol.Response) (*QueryEngine, error) { limit := query.Limit queryEngine := &QueryEngine{ query: query, where: query.GetWhereCondition(), limiter: NewLimiter(limit), responseChan: responseChan, seriesToPoints: make(map[string]*protocol.Series), // stats stuff explain: query.IsExplainQuery(), runStartTime: 0, runEndTime: 0, pointsRead: 0, pointsWritten: 0, shardId: 0, shardLocal: false, //that really doesn't matter if it is not EXPLAIN query duration: nil, seriesStates: make(map[string]*SeriesState), } if queryEngine.explain { queryEngine.runStartTime = float64(time.Now().UnixNano()) / float64(time.Millisecond) } yield := func(series *protocol.Series) error { var response *protocol.Response queryEngine.limiter.calculateLimitAndSlicePoints(series) if len(series.Points) == 0 { return nil } if queryEngine.explain { //TODO: We may not have to send points, just count them queryEngine.pointsWritten += int64(len(series.Points)) } response = &protocol.Response{Type: &queryResponse, Series: series} responseChan <- response return nil } var err error if query.HasAggregates() { err = queryEngine.executeCountQueryWithGroupBy(query, yield) } else if containsArithmeticOperators(query) { err = queryEngine.executeArithmeticQuery(query, yield) } else { err = queryEngine.distributeQuery(query, yield) } if err != nil { return nil, err } return queryEngine, nil }