| 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 rumbleimport (	"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}
 |