func (self *FilteringSuite) TestEqualityFiltering(c *C) { queryStr := "select * from t where column_one = 100 and column_two <> 6;" query, err := parser.ParseSelectQuery(queryStr) c.Assert(err, IsNil) series, err := common.StringToSeriesArray(` [ { "points": [ {"values": [{"int64_value": 100},{"int64_value": 5 }], "timestamp": 1381346631, "sequence_number": 1}, {"values": [{"int64_value": 100},{"int64_value": 6 }], "timestamp": 1381346631, "sequence_number": 1}, {"values": [{"int64_value": 90 },{"int64_value": 15}], "timestamp": 1381346632, "sequence_number": 1} ], "name": "t", "fields": ["column_one", "column_two"] } ] `) c.Assert(err, IsNil) result, err := Filter(query, series[0]) c.Assert(err, IsNil) c.Assert(result, NotNil) c.Assert(result.Points, HasLen, 1) c.Assert(*result.Points[0].Values[0].Int64Value, Equals, int64(100)) c.Assert(*result.Points[0].Values[1].Int64Value, Equals, int64(5)) }
func (self *FilteringSuite) TestFilteringWithGroupBy(c *C) { queryStr := "select sum(column_one) from t group by column_two where column_one = 85;" query, err := parser.ParseSelectQuery(queryStr) c.Assert(err, IsNil) series, err := common.StringToSeriesArray(` [ { "points": [ {"values": [{"int64_value": 100},{"int64_value": 5 }], "timestamp": 1381346631, "sequence_number": 1}, {"values": [{"int64_value": 85},{"int64_value": 6 }], "timestamp": 1381346631, "sequence_number": 1}, {"values": [{"int64_value": 90 },{"int64_value": 15}], "timestamp": 1381346632, "sequence_number": 1} ], "name": "t", "fields": ["column_one", "column_two"] } ] `) c.Assert(err, IsNil) result, err := Filter(query, series[0]) c.Assert(err, IsNil) c.Assert(result, NotNil) c.Assert(result.Points, HasLen, 1) c.Assert(result.Fields, HasLen, 2) }
func (self *FilteringSuite) TestFilteringNonExistentColumn(c *C) { queryStr := "select * from t where column_one = 100 and column_two <> 6" query, err := parser.ParseSelectQuery(queryStr) c.Assert(err, IsNil) series, err := common.StringToSeriesArray(` [ { "points": [ {"values": [{"int64_value": 100}], "timestamp": 1381346631, "sequence_number": 1}, {"values": [{"int64_value": 90 }], "timestamp": 1381346632, "sequence_number": 1} ], "name": "t", "fields": ["column_one"] } ] `) c.Assert(err, IsNil) _, err = Filter(query, series[0]) c.Assert(err, NotNil) }
func (self *ClusterConfiguration) addContinuousQuery(db string, query *ContinuousQuery) error { if self.continuousQueries == nil { self.continuousQueries = map[string][]*ContinuousQuery{} } if self.ParsedContinuousQueries == nil { self.ParsedContinuousQueries = map[string]map[uint32]*parser.SelectQuery{} } selectQuery, err := parser.ParseSelectQuery(query.Query) if err != nil { return fmt.Errorf("Failed to parse continuous query: %s", query.Query) } if self.ParsedContinuousQueries[db] == nil { self.ParsedContinuousQueries[db] = map[uint32]*parser.SelectQuery{query.Id: selectQuery} } else { self.ParsedContinuousQueries[db][query.Id] = selectQuery } self.continuousQueries[db] = append(self.continuousQueries[db], query) return nil }
func (self *FilteringSuite) TestNotRegexFiltering(c *C) { queryStr := "select * from t where column_one !~ /.*foo.*/ and time > now() - 1d;" query, err := parser.ParseSelectQuery(queryStr) c.Assert(err, IsNil) series, err := common.StringToSeriesArray(` [ { "points": [ {"values": [{"string_value": "100"}], "timestamp": 1381346631, "sequence_number": 1}, {"values": [{"string_value": "foobar"}], "timestamp": 1381346631, "sequence_number": 1} ], "name": "t", "fields": ["column_one"] } ] `) c.Assert(err, IsNil) result, err := Filter(query, series[0]) c.Assert(err, IsNil) c.Assert(result, NotNil) c.Assert(result.Points, HasLen, 1) c.Assert(*result.Points[0].Values[0].StringValue, Equals, "100") }
func (self *FilteringSuite) TestFilteringWithJoin(c *C) { queryStr := "select * from t as bar inner join t as foo where bar.column_one = 100 and foo.column_two <> 6;" query, err := parser.ParseSelectQuery(queryStr) c.Assert(err, IsNil) series, err := common.StringToSeriesArray(` [ { "points": [ {"values": [{"int64_value": 100},{"int64_value": 5 }], "timestamp": 1381346631, "sequence_number": 1}, {"values": [{"int64_value": 100},{"int64_value": 6 }], "timestamp": 1381346631, "sequence_number": 1}, {"values": [{"int64_value": 90 },{"int64_value": 15}], "timestamp": 1381346632, "sequence_number": 1} ], "name": "foo_join_bar", "fields": ["bar.column_one", "foo.column_two"] } ] `) c.Assert(err, IsNil) result, err := Filter(query, series[0]) c.Assert(err, IsNil) c.Assert(result, NotNil) // no filtering should happen for join queries c.Assert(result.Points, HasLen, 1) }
func (s *RaftServer) CreateContinuousQuery(db string, query string) error { selectQuery, err := parser.ParseSelectQuery(query) if err != nil { return fmt.Errorf("Failed to parse continuous query: %s", query) } if !selectQuery.IsValidContinuousQuery() { return fmt.Errorf("Continuous queries with a group by clause must include time(...) as one of the elements") } if !selectQuery.IsNonRecursiveContinuousQuery() { return fmt.Errorf("Continuous queries with :series_name interpolation must use a regular expression in the from clause that prevents recursion") } duration, _, err := selectQuery.GetGroupByClause().GetGroupByTime() if err != nil { return fmt.Errorf("Couldn't get group by time for continuous query: %s", err) } // if there are already-running queries, we need to initiate a backfill if selectQuery.GetIntoClause().Backfill && !s.clusterConfig.LastContinuousQueryRunTime().IsZero() { zeroTime := time.Time{} currentBoundary := time.Now() if duration != nil { currentBoundary = currentBoundary.Truncate(*duration) } go s.runContinuousQuery(db, selectQuery, zeroTime, currentBoundary) } else { // TODO: make continuous queries backfill for queries that don't have a group by time } command := NewCreateContinuousQueryCommand(db, query) _, err = s.doOrProxyCommand(command) return err }