From 3a1f0e68be16aabe0f77b8b18135026ab6df09ca Mon Sep 17 00:00:00 2001 From: Preetam Jinka Date: Wed, 4 Apr 2018 23:40:33 -0700 Subject: [PATCH 1/2] init executor --- internal/query/executor.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 internal/query/executor.go diff --git a/internal/query/executor.go b/internal/query/executor.go new file mode 100644 index 0000000..3f561bf --- /dev/null +++ b/internal/query/executor.go @@ -0,0 +1,33 @@ +package query + +// Executor is a query executor. +type Executor struct{} + +func NewExecutor(t Table) *Executor { + return &Executor{} +} + +func (e *Executor) Execute(query Desc) error { + // TODO + return nil +} + +type Table interface { + NewCursor() (Cursor, error) + NewCursorForFields(fields []string) (Cursor, error) +} + +type Cursor interface { + GetRow() (Row, error) + Next() bool + Err() error +} + +type Seeker interface { + Seek(Row) error +} + +type Row interface { + Fields() []string + Get(field string) (interface{}, error) +} From aebc2754261b8428f41f97001c12da7d56464464 Mon Sep 17 00:00:00 2001 From: Preetam Jinka Date: Thu, 5 Apr 2018 07:15:33 -0700 Subject: [PATCH 2/2] more wip --- internal/query/executor.go | 39 +++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/internal/query/executor.go b/internal/query/executor.go index 3f561bf..8224fb5 100644 --- a/internal/query/executor.go +++ b/internal/query/executor.go @@ -1,14 +1,47 @@ package query // Executor is a query executor. -type Executor struct{} +type Executor struct { + table Table +} -func NewExecutor(t Table) *Executor { - return &Executor{} +func NewExecutor(table Table) *Executor { + return &Executor{ + table: table, + } } func (e *Executor) Execute(query Desc) error { + // Get a cursor + var cur Cursor + var err error + if len(query.Columns) == 0 && len(query.GroupBy) == 0 { + // No aggregations. Use a plain cursor. + cur, err = e.table.NewCursor() + if err != nil { + return err + } + } else { + fieldsMap := map[string]struct{}{} + for _, col := range query.Columns { + fieldsMap[col.Name] = struct{}{} + } + for _, col := range query.GroupBy { + fieldsMap[col.Name] = struct{}{} + } + fields := make([]string, 0, len(fieldsMap)) + for field := range fieldsMap { + fields = append(fields, field) + } + cur, err = e.table.NewCursorForFields(fields) + if err != nil { + return err + } + } + // TODO + _ = cur + return nil }