mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 10:54:59 +00:00
61 lines
1.2 KiB
Go
61 lines
1.2 KiB
Go
package query
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"pilosa/db"
|
|
)
|
|
|
|
var InvalidQueryError = errors.New("Invalid query format.")
|
|
|
|
type QueryParser struct {
|
|
QueryString string
|
|
}
|
|
|
|
func (q *QueryParser) Walk(data interface{}) (*Query, error) {
|
|
query := new(Query)
|
|
|
|
slice, ok := data.([]interface{})
|
|
if !ok {
|
|
return nil, InvalidQueryError
|
|
}
|
|
operation, ok := slice[0].(string)
|
|
|
|
if !ok {
|
|
return nil, InvalidQueryError
|
|
}
|
|
if operation == "union" || operation == "intersect" {
|
|
query.Operation = operation
|
|
inputs := slice[1:]
|
|
query.Inputs = make([]QueryInput, len(inputs))
|
|
for idx, input := range inputs {
|
|
subquery, err := q.Walk(input)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
query.Inputs[idx] = subquery
|
|
}
|
|
} else if operation == "bitmap" {
|
|
query.Operation = "get"
|
|
frame, ok := slice[1].(string)
|
|
if !ok {
|
|
return nil, InvalidQueryError
|
|
}
|
|
id, ok := slice[2].(float64)
|
|
if !ok {
|
|
return nil, InvalidQueryError
|
|
}
|
|
id_int := int(id)
|
|
query.Inputs = []QueryInput{db.Bitmap{frame, id_int}}
|
|
}
|
|
|
|
return query, nil
|
|
}
|
|
|
|
func (q *QueryParser) Parse() (*Query, error) {
|
|
var data interface{}
|
|
if err := json.Unmarshal([]byte(q.QueryString), &data); err != nil {
|
|
return nil, err
|
|
}
|
|
return q.Walk(data)
|
|
}
|