12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- /*
- * EliasDB
- *
- * Copyright 2016 Matthias Ladkau. All rights reserved.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
- package rumble
- import (
- "fmt"
- "devt.de/krotik/common/defs/rumble"
- "devt.de/krotik/eliasdb/api"
- "devt.de/krotik/eliasdb/eql"
- )
- // Function: query
- // ===============
- /*
- QueryFunc runs an EQL query.
- */
- type QueryFunc struct {
- }
- /*
- Name returns the name of the function.
- */
- func (f *QueryFunc) Name() string {
- return "db.query"
- }
- /*
- Validate is called for parameter validation and to reset the function state.
- */
- func (f *QueryFunc) Validate(argsNum int, rt rumble.Runtime) rumble.RuntimeError {
- var err rumble.RuntimeError
- if argsNum != 2 {
- err = rt.NewRuntimeError(rumble.ErrInvalidConstruct,
- "Function query requires 2 parameters: partition and a query string")
- }
- return err
- }
- /*
- Execute executes the rumble function.
- */
- func (f *QueryFunc) Execute(argsVal []interface{}, vars rumble.Variables,
- rt rumble.Runtime) (interface{}, rumble.RuntimeError) {
- part := fmt.Sprint(argsVal[0])
- query := fmt.Sprint(argsVal[1])
- res, err := eql.RunQuery("db.query", part, query, api.GM)
- if err != nil {
- // Wrap error message in RuntimeError
- return nil, rt.NewRuntimeError(rumble.ErrInvalidState,
- fmt.Sprintf(err.Error()))
- }
- // Convert result to rumble data structure
- labels := res.Header().Labels()
- cols := make([]interface{}, len(labels))
- for i, v := range labels {
- cols[i] = v
- }
- rrows := res.Rows()
- rows := make([]interface{}, len(rrows))
- for i, v := range rrows {
- rows[i] = v
- }
- return map[interface{}]interface{}{
- "cols": cols,
- "rows": rows,
- }, err
- }
|