diff --git a/db/check.go b/db/check.go index ab0ccc6f..68462bdb 100644 --- a/db/check.go +++ b/db/check.go @@ -246,89 +246,3 @@ func (d *document) event(ctx context.Context, when method) (err error) { return } - -func (d *document) yield(ctx context.Context, stm sql.Statement, output sql.Token) (interface{}, error) { - - switch stm := stm.(type) { - - case *sql.SelectStatement: - - var doc *data.Doc - - for _, v := range stm.Expr { - if _, ok := v.Expr.(*sql.All); ok { - doc = d.current - break - } - } - - if doc == nil { - doc = data.New() - } - - for _, e := range stm.Expr { - - switch v := e.Expr.(type) { - case *sql.All: - break - default: - - // If the query has a GROUP BY expression - // then let's check if this is an aggregate - // function, and if it is then pass the - // first argument directly through. - - if len(stm.Group) > 0 { - if f, ok := e.Expr.(*sql.FuncExpression); ok && f.Aggr { - v, err := d.i.e.fetch(ctx, f.Args[0], d.current) - if err != nil { - return nil, err - } - doc.Set(v, f.String()) - continue - } - } - - // Otherwise treat the field normally, and - // calculate the value to be inserted into - // the final output document. - - v, err := d.i.e.fetch(ctx, v, d.current) - if err != nil { - return nil, err - } - - switch v { - case d.current: - doc.Set(nil, e.Field) - default: - doc.Set(v, e.Field) - } - - } - - } - - return doc.Data(), nil - - default: - - switch output { - default: - return nil, nil - case sql.DIFF: - return d.diff().Data(), nil - case sql.AFTER: - return d.current.Data(), nil - case sql.BEFORE: - return d.initial.Data(), nil - case sql.BOTH: - return map[string]interface{}{ - "after": d.current.Data(), - "before": d.initial.Data(), - }, nil - } - - } - -} diff --git a/db/db_test.go b/db/db_test.go index 61457904..3e0d1f18 100644 --- a/db/db_test.go +++ b/db/db_test.go @@ -15,14 +15,11 @@ package db import ( - "testing" - "net/http/httptest" "github.com/abcum/fibre" "github.com/abcum/surreal/cnf" "github.com/abcum/surreal/util/data" - . "github.com/smartystreets/goconvey/convey" ) func setupDB() { @@ -81,42 +78,3 @@ func setupSC() *fibre.Context { return ctx } - -func TestYield(t *testing.T) { - - Convey("Yield different responses when modifying a record", t, func() { - - setupDB() - - txt := ` - USE NS test DB test; - CREATE person:test SET test=1 RETURN AFTER; - UPDATE person:test SET test=2 RETURN BEFORE; - UPDATE person:test SET test=3 RETURN BOTH; - UPDATE person:test SET test=4 RETURN DIFF; - UPDATE person:test SET test=5 RETURN NONE; - DELETE person:test RETURN BEFORE; - ` - - res, err := Execute(setupKV(), txt, nil) - So(err, ShouldBeNil) - So(res, ShouldHaveLength, 7) - So(res[1].Result, ShouldHaveLength, 1) - So(data.Consume(res[1].Result[0]).Get("test").Data(), ShouldEqual, 1) - So(res[2].Result, ShouldHaveLength, 1) - So(data.Consume(res[2].Result[0]).Get("test").Data(), ShouldEqual, 1) - So(res[3].Result, ShouldHaveLength, 1) - So(data.Consume(res[3].Result[0]).Get("before.test").Data(), ShouldEqual, 2) - So(data.Consume(res[3].Result[0]).Get("after.test").Data(), ShouldEqual, 3) - So(res[4].Result, ShouldHaveLength, 1) - So(res[4].Result[0], ShouldHaveLength, 1) - So(data.Consume(res[4].Result[0]).Get("0.op").Data(), ShouldEqual, "replace") - So(data.Consume(res[4].Result[0]).Get("0.path").Data(), ShouldEqual, "/test") - So(data.Consume(res[4].Result[0]).Get("0.value").Data(), ShouldEqual, 4) - So(res[5].Result, ShouldHaveLength, 0) - So(res[6].Result, ShouldHaveLength, 1) - So(data.Consume(res[6].Result[0]).Get("test").Data(), ShouldEqual, 5) - - }) - -} diff --git a/db/yield.go b/db/yield.go new file mode 100644 index 00000000..9377efd7 --- /dev/null +++ b/db/yield.go @@ -0,0 +1,108 @@ +// Copyright © 2016 Abcum Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package db + +import ( + "context" + + "github.com/abcum/surreal/sql" + "github.com/abcum/surreal/util/data" +) + +func (d *document) yield(ctx context.Context, stm sql.Statement, output sql.Token) (interface{}, error) { + + switch stm := stm.(type) { + + case *sql.SelectStatement: + + var doc *data.Doc + + for _, v := range stm.Expr { + if _, ok := v.Expr.(*sql.All); ok { + doc = d.current + break + } + } + + if doc == nil { + doc = data.New() + } + + for _, e := range stm.Expr { + + switch v := e.Expr.(type) { + case *sql.All: + break + default: + + // If the query has a GROUP BY expression + // then let's check if this is an aggregate + // function, and if it is then pass the + // first argument directly through. + + if len(stm.Group) > 0 { + if f, ok := e.Expr.(*sql.FuncExpression); ok && f.Aggr { + v, err := d.i.e.fetch(ctx, f.Args[0], d.current) + if err != nil { + return nil, err + } + doc.Set(v, f.String()) + continue + } + } + + // Otherwise treat the field normally, and + // calculate the value to be inserted into + // the final output document. + + v, err := d.i.e.fetch(ctx, v, d.current) + if err != nil { + return nil, err + } + + switch v { + case d.current: + doc.Set(nil, e.Field) + default: + doc.Set(v, e.Field) + } + + } + + } + + return doc.Data(), nil + + default: + + switch output { + default: + return nil, nil + case sql.DIFF: + return d.diff().Data(), nil + case sql.AFTER: + return d.current.Data(), nil + case sql.BEFORE: + return d.initial.Data(), nil + case sql.BOTH: + return map[string]interface{}{ + "after": d.current.Data(), + "before": d.initial.Data(), + }, nil + } + + } + +} diff --git a/db/yield_test.go b/db/yield_test.go new file mode 100644 index 00000000..b184e71e --- /dev/null +++ b/db/yield_test.go @@ -0,0 +1,61 @@ +// Copyright © 2016 Abcum Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package db + +import ( + "testing" + + "github.com/abcum/surreal/util/data" + . "github.com/smartystreets/goconvey/convey" +) + +func TestYield(t *testing.T) { + + Convey("Yield different responses when modifying a record", t, func() { + + setupDB() + + txt := ` + USE NS test DB test; + CREATE person:test SET test=1 RETURN AFTER; + UPDATE person:test SET test=2 RETURN BEFORE; + UPDATE person:test SET test=3 RETURN BOTH; + UPDATE person:test SET test=4 RETURN DIFF; + UPDATE person:test SET test=5 RETURN NONE; + DELETE person:test RETURN BEFORE; + ` + + res, err := Execute(setupKV(), txt, nil) + So(err, ShouldBeNil) + So(res, ShouldHaveLength, 7) + So(res[1].Result, ShouldHaveLength, 1) + So(data.Consume(res[1].Result[0]).Get("test").Data(), ShouldEqual, 1) + So(res[2].Result, ShouldHaveLength, 1) + So(data.Consume(res[2].Result[0]).Get("test").Data(), ShouldEqual, 1) + So(res[3].Result, ShouldHaveLength, 1) + So(data.Consume(res[3].Result[0]).Get("before.test").Data(), ShouldEqual, 2) + So(data.Consume(res[3].Result[0]).Get("after.test").Data(), ShouldEqual, 3) + So(res[4].Result, ShouldHaveLength, 1) + So(res[4].Result[0], ShouldHaveLength, 1) + So(data.Consume(res[4].Result[0]).Get("0.op").Data(), ShouldEqual, "replace") + So(data.Consume(res[4].Result[0]).Get("0.path").Data(), ShouldEqual, "/test") + So(data.Consume(res[4].Result[0]).Get("0.value").Data(), ShouldEqual, 4) + So(res[5].Result, ShouldHaveLength, 0) + So(res[6].Result, ShouldHaveLength, 1) + So(data.Consume(res[6].Result[0]).Get("test").Data(), ShouldEqual, 5) + + }) + +}