Skip to content

Commit

Permalink
Fix #524. Arithmetic operator and where conditions don't play nice
Browse files Browse the repository at this point in the history
  • Loading branch information
jvshahid authored and pauldix committed May 27, 2014
1 parent 39ed677 commit d681a06
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 9 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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]

Expand Down
33 changes: 27 additions & 6 deletions src/engine/filtering.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand All @@ -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
Expand All @@ -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 {
Expand Down
48 changes: 46 additions & 2 deletions src/integration/data_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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) {
Expand Down
10 changes: 9 additions & 1 deletion src/parser/query_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{}
Expand All @@ -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)...)
}

Expand Down

0 comments on commit d681a06

Please sign in to comment.