// Converts the value to a str func (*str) Call(args ...interface{}) (v interface{}, err error) { if len(args) != 1 { return 0, errors.New("string expects exactly one argument") } switch a := args[0].(type) { case int64: v = strconv.FormatInt(a, 10) case float64: v = strconv.FormatFloat(a, 'f', -1, 64) case bool: v = strconv.FormatBool(a) case time.Duration: v = influxql.FormatDuration(a) case string: v = a default: err = fmt.Errorf("cannot convert %T to string", a) } return }
func TestContinuousQueryService_ResampleOptions(t *testing.T) { s := NewTestService(t) mc := NewMetaClient(t) mc.CreateDatabase("db", "") mc.CreateContinuousQuery("db", "cq", `CREATE CONTINUOUS QUERY cq ON db RESAMPLE EVERY 10s FOR 2m BEGIN SELECT mean(value) INTO cpu_mean FROM cpu GROUP BY time(1m) END`) s.MetaClient = mc db := s.MetaClient.Database("db") cq, err := NewContinuousQuery(db.Name, &db.ContinuousQueries[0]) if err != nil { t.Fatal(err) } else if cq.Resample.Every != 10*time.Second { t.Errorf("expected resample every to be 10s, got %s", influxql.FormatDuration(cq.Resample.Every)) } else if cq.Resample.For != 2*time.Minute { t.Errorf("expected resample for 2m, got %s", influxql.FormatDuration(cq.Resample.For)) } // Set RunInterval high so we can trigger using Run method. s.RunInterval = 10 * time.Minute done := make(chan struct{}) expectCallCnt := 0 callCnt := 0 // Set a callback for ExecuteStatement. s.QueryExecutor.StatementExecutor = &StatementExecutor{ ExecuteStatementFn: func(stmt influxql.Statement, ctx *influxql.ExecutionContext) error { callCnt++ if callCnt >= expectCallCnt { done <- struct{}{} } ctx.Results <- &influxql.Result{} return nil }, } s.Open() defer s.Close() // Set the 'now' time to the start of a 10 minute interval. Then trigger a run. // This should trigger two queries (one for the current time interval, one for the previous). now := time.Now().Truncate(10 * time.Minute) expectCallCnt += 2 s.RunCh <- &RunRequest{Now: now} if err := wait(done, 100*time.Millisecond); err != nil { t.Fatal(err) } // Trigger another run 10 seconds later. Another two queries should happen, // but it will be a different two queries. expectCallCnt += 2 s.RunCh <- &RunRequest{Now: now.Add(10 * time.Second)} if err := wait(done, 100*time.Millisecond); err != nil { t.Fatal(err) } // Reset the time period and send the initial request at 5 seconds after the // 10 minute mark. There should be exactly one call since the current interval is too // young and only one interval matches the FOR duration. expectCallCnt += 1 s.Run("", "", now.Add(5*time.Second)) if err := wait(done, 100*time.Millisecond); err != nil { t.Fatal(err) } // No overflow should be sent. if err := wait(done, 100*time.Millisecond); err == nil { t.Error("too many queries executed") } }