featurebase/query/query.go
2014-01-13 11:16:23 -06:00

74 lines
1.7 KiB
Go

package query
import (
"pilosa/db"
"strings"
"github.com/davecgh/go-spew/spew"
"tux21b.org/v1/gocql/uuid"
)
type QueryInput interface{}
type QueryResults struct {
Data interface{}
}
type PqlList []PqlListItem
type PqlListItem struct {
Id *uuid.UUID
Label string
PQL string
}
type Query struct {
Id *uuid.UUID
Operation string
Inputs []QueryInput //"strconv"
// Represents a parsed query. Inputs can be Query or Bitmap objects
// Maybe Bitmap and Query objects should have different fields to avoid using interface{}
ProfileId uint64
}
func QueryPlanForPQL(database *db.Database, pql string, destination *db.Location) *QueryPlan {
tokens := Lex(pql)
return QueryPlanForTokens(database, tokens, destination)
}
func QueryForPQL(pql string) *Query {
tokens := Lex(pql)
return QueryForTokens(tokens)
}
func QueryForTokens(tokens []Token) *Query {
query_parser := QueryParser{}
query, err := query_parser.Parse(tokens)
if err != nil {
panic(err)
}
return query
}
func QueryPlanForTokens(database *db.Database, tokens []Token, destination *db.Location) *QueryPlan {
query := QueryForTokens(tokens)
return QueryPlanForQuery(database, query, destination)
}
func QueryPlanForQuery(database *db.Database, query *Query, destination *db.Location) *QueryPlan {
query_planner := QueryPlanner{Database: database}
id := uuid.RandomUUID()
query_plan := query_planner.Plan(query, &id, destination)
return query_plan
}
func TokensToString(tokens []Token) string {
var str []string
for i, _ := range tokens {
spew.Dump(tokens[i].Text)
str = append(str, tokens[i].Text)
}
// for now, we're just using this function to pull the filter out of the outer function "outerfunc(filter)"
str = str[2 : len(str)-1]
return strings.Join(str, "")
}