Fix #524. Arithmetic operator and where conditions don't play nice
parent
bd03a579bd
commit
062de961c9
|
@ -7,6 +7,7 @@
|
|||
- [Issue #529](https://github.com/influxdb/influxdb/issues/529). Don't run influxdb as root
|
||||
- [Issue #547](https://github.com/influxdb/influxdb/issues/547). Add difference function (Thanks, @mboelstra)
|
||||
- [Issue #550](https://github.com/influxdb/influxdb/issues/550). Fix tests on 32-bit ARM
|
||||
- [Issue #524](https://github.com/influxdb/influxdb/issues/524). Arithmetic operators and where conditions don't play nice together
|
||||
|
||||
## v0.6.5 [2014-05-19]
|
||||
|
||||
|
|
|
@ -104,8 +104,8 @@ func getColumns(values []*parser.Value, columns map[string]bool) {
|
|||
}
|
||||
}
|
||||
|
||||
func filterColumns(columns map[string]bool, fields []string, point *protocol.Point) {
|
||||
if columns["*"] {
|
||||
func filterColumns(columns map[string]struct{}, fields []string, point *protocol.Point) {
|
||||
if _, ok := columns["*"]; ok {
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -127,9 +127,28 @@ func Filter(query *parser.SelectQuery, series *protocol.Series) (*protocol.Serie
|
|||
return series, nil
|
||||
}
|
||||
|
||||
columns := map[string]bool{}
|
||||
getColumns(query.GetColumnNames(), columns)
|
||||
getColumns(query.GetGroupByClause().Elems, columns)
|
||||
columns := map[string]struct{}{}
|
||||
if query.GetFromClause().Type == parser.FromClauseInnerJoin {
|
||||
outer:
|
||||
for t, cs := range query.GetResultColumns() {
|
||||
for _, c := range cs {
|
||||
// if this is a wildcard select, then drop all columns and
|
||||
// just use '*'
|
||||
if c == "*" {
|
||||
columns = make(map[string]struct{}, 1)
|
||||
columns[c] = struct{}{}
|
||||
break outer
|
||||
}
|
||||
columns[t.Name+"."+c] = struct{}{}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for _, cs := range query.GetResultColumns() {
|
||||
for _, c := range cs {
|
||||
columns[c] = struct{}{}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
points := series.Points
|
||||
series.Points = nil
|
||||
|
@ -141,12 +160,14 @@ func Filter(query *parser.SelectQuery, series *protocol.Series) (*protocol.Serie
|
|||
}
|
||||
|
||||
if ok {
|
||||
fmt.Printf("columns: %v, fields: %v\n", columns, series.Fields)
|
||||
|
||||
filterColumns(columns, series.Fields, point)
|
||||
series.Points = append(series.Points, point)
|
||||
}
|
||||
}
|
||||
|
||||
if !columns["*"] {
|
||||
if _, ok := columns["*"]; !ok {
|
||||
newFields := []string{}
|
||||
for _, f := range series.Fields {
|
||||
if _, ok := columns[f]; !ok {
|
||||
|
|
|
@ -200,7 +200,7 @@ func (self *DataTestSuite) DifferenceGroupValues(c *C) (Fun, Fun) {
|
|||
serieses := client.RunQuery("select difference(value) from test_difference_group_values group by time(20s) order asc", c, "m")
|
||||
c.Assert(serieses, HasLen, 1)
|
||||
maps := ToMap(serieses[0])
|
||||
c.Assert(maps, HasLen, 3)
|
||||
c.Assert(maps, HasLen, 3)
|
||||
c.Assert(maps[0]["difference"], Equals, 10.0)
|
||||
c.Assert(maps[1]["difference"], Equals, 20.0)
|
||||
c.Assert(maps[2]["difference"], Equals, 80.0)
|
||||
|
@ -233,7 +233,7 @@ func (self *DataTestSuite) DifferenceGroupValues(c *C) (Fun, Fun) {
|
|||
// serieses := client.RunQuery("select range(value) from test_difference_group_same_time_values group by time(10s) order asc", c, "m")
|
||||
// c.Assert(serieses, HasLen, 1)
|
||||
// maps := ToMap(serieses[0])
|
||||
// c.Assert(maps, HasLen, 6)
|
||||
// c.Assert(maps, HasLen, 6)
|
||||
// c.Assert(maps[0]["difference"], Equals, 10.0)
|
||||
// c.Assert(maps[1]["difference"], Equals, 10.0)
|
||||
// c.Assert(maps[2]["difference"], Equals, 20.0)
|
||||
|
@ -310,6 +310,50 @@ func (self *DataTestSuite) SmallGroupByIntervals(c *C) (Fun, Fun) {
|
|||
}
|
||||
}
|
||||
|
||||
// issue #524
|
||||
func (self *DataTestSuite) WhereAndArithmetic(c *C) (Fun, Fun) {
|
||||
return func(client Client) {
|
||||
i := 0
|
||||
serieses := CreatePointsFromFunc("foo", 2, 2, func(_ int) float64 { i++; return float64(i) })
|
||||
client.WriteData(serieses, c)
|
||||
}, func(client Client) {
|
||||
serieses := client.RunQuery("select column1 / 2 from foo where column0 > 1", c, "m")
|
||||
c.Assert(serieses, HasLen, 1)
|
||||
maps := ToMap(serieses[0])
|
||||
c.Assert(maps, HasLen, 1)
|
||||
c.Assert(maps[0]["expr0"], Equals, 2.0)
|
||||
}
|
||||
}
|
||||
|
||||
// issue #524
|
||||
func (self *DataTestSuite) JoinAndArithmetic(c *C) (Fun, Fun) {
|
||||
return func(client Client) {
|
||||
t1 := time.Now().Truncate(time.Hour).Add(-4 * time.Hour)
|
||||
t2 := t1.Add(time.Hour)
|
||||
t3 := t2.Add(time.Hour)
|
||||
t4 := t3.Add(time.Hour)
|
||||
data := fmt.Sprintf(`[
|
||||
{
|
||||
"name":"foo",
|
||||
"columns":["time", "val"],
|
||||
"points":[[%d, 1],[%d, 2]]
|
||||
},
|
||||
{
|
||||
"name":"bar",
|
||||
"columns":["time", "val"],
|
||||
"points":[[%d, 3],[%d, 4]]
|
||||
|
||||
}]`, t1.Unix(), t3.Unix(), t2.Unix(), t4.Unix())
|
||||
client.WriteJsonData(data, c, "s")
|
||||
}, func(client Client) {
|
||||
serieses := client.RunQuery("select foo.val + bar.val from foo inner join bar where bar.val <> 3", c, "m")
|
||||
c.Assert(serieses, HasLen, 1)
|
||||
maps := ToMap(serieses[0])
|
||||
c.Assert(maps, HasLen, 1)
|
||||
c.Assert(maps[0]["expr0"], Equals, 6.0)
|
||||
}
|
||||
}
|
||||
|
||||
// issue #540
|
||||
func (self *DataTestSuite) RegexMatching(c *C) (Fun, Fun) {
|
||||
return func(client Client) {
|
||||
|
|
|
@ -115,6 +115,14 @@ func (self *SelectQuery) HasAggregates() bool {
|
|||
// Returns a mapping from the time series names (or regex) to the
|
||||
// column names that are references
|
||||
func (self *SelectQuery) GetReferencedColumns() map[*Value][]string {
|
||||
return self.getColumns(true)
|
||||
}
|
||||
|
||||
func (self *SelectQuery) GetResultColumns() map[*Value][]string {
|
||||
return self.getColumns(false)
|
||||
}
|
||||
|
||||
func (self *SelectQuery) getColumns(includeWhereClause bool) map[*Value][]string {
|
||||
mapping := make(map[string][]string)
|
||||
|
||||
notPrefixedColumns := []string{}
|
||||
|
@ -126,7 +134,7 @@ func (self *SelectQuery) GetReferencedColumns() map[*Value][]string {
|
|||
}
|
||||
|
||||
if !self.IsSinglePointQuery() {
|
||||
if condition := self.GetWhereCondition(); condition != nil {
|
||||
if condition := self.GetWhereCondition(); condition != nil && includeWhereClause {
|
||||
notPrefixedColumns = append(notPrefixedColumns, getReferencedColumnsFromCondition(condition, mapping)...)
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue