diff --git a/executor/executor.go b/executor/executor.go index 223d555a7..7654d3196 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -88,7 +88,10 @@ func (self *Executor) RunPQL(database_name string, pql string) interface{} { // see if the outer query function is a custom query reserved_functions := stringSlice{"get", "set", "union", "intersect", "count", "top-n"} - tokens := query.Lex(pql) + tokens, err := query.Lex(pql) + if err != nil { + spew.Dump(err) + } outer_token := tokens[0].Text if reserved_functions.pos(outer_token) != -1 { diff --git a/query/parser.go b/query/parser.go index d1af47f07..258d8b755 100644 --- a/query/parser.go +++ b/query/parser.go @@ -122,6 +122,12 @@ ArgLoop: case 1: query.Args["frame"] = token.Text case 2: + i, err := strconv.Atoi(token.Text) + if err != nil { + return nil, fmt.Errorf("Expecting integer id! (%v)", err) + } + query.Args["filter"] = i + case 3: i, err := strconv.ParseUint(token.Text, 10, 64) if err != nil { return nil, fmt.Errorf("Expecting integer id! (%v)", err) diff --git a/query/parser_test.go b/query/parser_test.go index 4d136a37f..859ed6ffb 100644 --- a/query/parser_test.go +++ b/query/parser_test.go @@ -17,14 +17,14 @@ func TestQueryParser(t *testing.T) { So(query.Args, ShouldResemble, map[string]interface{}{"id": uint64(10), "frame": "general"}) }) Convey("Basic parse - set()", t, func() { - tokens, err := Lex("set(10, general, 20)") + tokens, err := Lex("set(10, general, 0, 20)") So(err, ShouldBeNil) query, err := Parse(tokens) So(err, ShouldBeNil) So(query.Operation, ShouldEqual, "set") - So(query.Args, ShouldResemble, map[string]interface{}{"id": uint64(10), "frame": "general", "profile_id": uint64(20)}) + So(query.Args, ShouldResemble, map[string]interface{}{"id": uint64(10), "frame": "general", "filter": int(0), "profile_id": uint64(20)}) }) Convey("Basic nested query parse", t, func() { tokens, err := Lex("union(get(10,general), get(11,brand), get(12))") diff --git a/query/planner.go b/query/planner.go index 392f567ac..29aa18ca8 100644 --- a/query/planner.go +++ b/query/planner.go @@ -293,7 +293,7 @@ func (qp *QueryPlanner) buildTree(query *Query, slice int) QueryTree { // handle SET operation regardless of the slice if query.Operation == "set" { - tree = &SetQueryTree{&db.Bitmap{query.Args["id"].(uint64), query.Args["frame"].(string)}, query.Args["profile_id"].(uint64)} + tree = &SetQueryTree{&db.Bitmap{query.Args["id"].(uint64), query.Args["frame"].(string), query.Args["filter"].(int)}, query.Args["profile_id"].(uint64)} return tree } @@ -317,7 +317,7 @@ func (qp *QueryPlanner) buildTree(query *Query, slice int) QueryTree { } } else { if query.Operation == "get" { - tree = &GetQueryTree{&db.Bitmap{query.Args["id"].(uint64), query.Args["frame"].(string)}, slice} + tree = &GetQueryTree{&db.Bitmap{query.Args["id"].(uint64), query.Args["frame"].(string), 0}, slice} return tree } else if query.Operation == "count" { subquery := qp.buildTree(&query.Subqueries[0], slice) diff --git a/query/planner_test.go b/query/planner_test.go index ec448d243..e2bb09828 100644 --- a/query/planner_test.go +++ b/query/planner_test.go @@ -55,10 +55,10 @@ func TestQueryPlanner(t *testing.T) { So(len(qp), ShouldEqual, 7) So(qp[0].(GetQueryStep).Operation, ShouldEqual, "get") So(qp[0].(GetQueryStep).Slice, ShouldEqual, 0) - So(*(qp[0].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general"}) + So(*(qp[0].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general", 0}) So(qp[1].(GetQueryStep).Operation, ShouldEqual, "get") So(qp[1].(GetQueryStep).Slice, ShouldEqual, 0) - So(*(qp[1].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{20, "general"}) + So(*(qp[1].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{20, "general", 0}) So(qp[2].(UnionQueryStep).Operation, ShouldEqual, "union") So(qp[2].(UnionQueryStep).Inputs, ShouldResemble, []*uuid.UUID{ qp[0].(GetQueryStep).Id, @@ -66,10 +66,10 @@ func TestQueryPlanner(t *testing.T) { }) So(qp[3].(GetQueryStep).Operation, ShouldEqual, "get") So(qp[3].(GetQueryStep).Slice, ShouldEqual, 1) - So(*(qp[3].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general"}) + So(*(qp[3].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general", 0}) So(qp[4].(GetQueryStep).Operation, ShouldEqual, "get") So(qp[4].(GetQueryStep).Slice, ShouldEqual, 1) - So(*(qp[4].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{20, "general"}) + So(*(qp[4].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{20, "general", 0}) So(qp[5].(UnionQueryStep).Operation, ShouldEqual, "union") So(qp[5].(UnionQueryStep).Inputs, ShouldResemble, []*uuid.UUID{ qp[3].(GetQueryStep).Id, @@ -96,10 +96,10 @@ func TestQueryPlanner(t *testing.T) { So(len(qp), ShouldEqual, 3) So(qp[0].(GetQueryStep).Operation, ShouldEqual, "get") So(qp[0].(GetQueryStep).Slice, ShouldEqual, 0) - So(*(qp[0].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general"}) + So(*(qp[0].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general", 0}) So(qp[1].(GetQueryStep).Operation, ShouldEqual, "get") So(qp[1].(GetQueryStep).Slice, ShouldEqual, 1) - So(*(qp[1].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general"}) + So(*(qp[1].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general", 0}) So(qp[2].(CatQueryStep).Operation, ShouldEqual, "cat") So(qp[2].(CatQueryStep).Inputs, ShouldResemble, []*uuid.UUID{ qp[0].(GetQueryStep).Id, @@ -121,10 +121,10 @@ func TestQueryPlanner(t *testing.T) { So(len(qp), ShouldEqual, 7) So(qp[0].(GetQueryStep).Operation, ShouldEqual, "get") So(qp[0].(GetQueryStep).Slice, ShouldEqual, 0) - So(*(qp[0].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general"}) + So(*(qp[0].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general", 0}) So(qp[1].(GetQueryStep).Operation, ShouldEqual, "get") So(qp[1].(GetQueryStep).Slice, ShouldEqual, 0) - So(*(qp[1].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{20, "general"}) + So(*(qp[1].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{20, "general", 0}) So(qp[2].(UnionQueryStep).Operation, ShouldEqual, "union") So(qp[2].(UnionQueryStep).Inputs, ShouldResemble, []*uuid.UUID{ qp[0].(GetQueryStep).Id, @@ -132,10 +132,10 @@ func TestQueryPlanner(t *testing.T) { }) So(qp[3].(GetQueryStep).Operation, ShouldEqual, "get") So(qp[3].(GetQueryStep).Slice, ShouldEqual, 1) - So(*(qp[3].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general"}) + So(*(qp[3].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general", 0}) So(qp[4].(GetQueryStep).Operation, ShouldEqual, "get") So(qp[4].(GetQueryStep).Slice, ShouldEqual, 1) - So(*(qp[4].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{20, "general"}) + So(*(qp[4].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{20, "general", 0}) So(qp[5].(UnionQueryStep).Operation, ShouldEqual, "union") So(qp[5].(UnionQueryStep).Inputs, ShouldResemble, []*uuid.UUID{ qp[3].(GetQueryStep).Id, @@ -148,7 +148,7 @@ func TestQueryPlanner(t *testing.T) { }) }) Convey("Set query plan - including parsing", t, func() { - query := QueryForPQL("set(10, general, 100)") + query := QueryForPQL("set(10, general, 0, 100)") database, fragment1 := basic_database() @@ -160,7 +160,7 @@ func TestQueryPlanner(t *testing.T) { So(len(qp), ShouldEqual, 1) So(qp[0].(SetQueryStep).Operation, ShouldEqual, "set") So(qp[0].(SetQueryStep).ProfileId, ShouldEqual, 100) - So(*(qp[0].(SetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general"}) + So(*(qp[0].(SetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general", 0}) }) Convey("Top-n query plan - including parsing", t, func() { query := QueryForPQL("top-n(get(10, general), [1,2,3], 50)") @@ -174,12 +174,12 @@ func TestQueryPlanner(t *testing.T) { qp := *qplanner.Plan(query, &id, destination) So(len(qp), ShouldEqual, 5) So(qp[0].(GetQueryStep).Operation, ShouldEqual, "get") - So(*(qp[0].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general"}) + So(*(qp[0].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general", 0}) So(qp[1].(*TopNQueryStep).Operation, ShouldEqual, "top-n") So(qp[1].(*TopNQueryStep).Input, ShouldEqual, qp[0].(GetQueryStep).Id) So(qp[1].(*TopNQueryStep).N, ShouldEqual, 50) So(qp[2].(GetQueryStep).Operation, ShouldEqual, "get") - So(*(qp[2].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general"}) + So(*(qp[2].(GetQueryStep).Bitmap), ShouldResemble, db.Bitmap{10, "general", 0}) So(qp[3].(*TopNQueryStep).Operation, ShouldEqual, "top-n") So(qp[3].(*TopNQueryStep).Input, ShouldEqual, qp[2].(GetQueryStep).Id) So(qp[3].(*TopNQueryStep).N, ShouldEqual, 50)