Skip to content

Commit

Permalink
Планировщик запросов. Планы #45
Browse files Browse the repository at this point in the history
  • Loading branch information
unhandled-exception committed Oct 12, 2022
1 parent 6a460e2 commit be3b022
Show file tree
Hide file tree
Showing 15 changed files with 826 additions and 24 deletions.
1 change: 1 addition & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,4 @@ linters-settings:
- Constant
- Term
- Statement$
- Scan
5 changes: 5 additions & 0 deletions pkg/planner/errors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package planner

import "github.com/pkg/errors"

var ErrFailedToCreatePlan = errors.New("failed to create plan")
15 changes: 15 additions & 0 deletions pkg/planner/plan.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package planner

import (
"github.com/unhandled-exception/sophiadb/pkg/records"
"github.com/unhandled-exception/sophiadb/pkg/scan"
)

type Plan interface {
Open() (scan.Scan, error)
Schema() records.Schema
BlocksAccessed() int64
Records() int64
DistinctValues(string) (int64, bool)
String() string
}
67 changes: 67 additions & 0 deletions pkg/planner/table_plan.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package planner

import (
"fmt"

"github.com/pkg/errors"
"github.com/unhandled-exception/sophiadb/pkg/metadata"
"github.com/unhandled-exception/sophiadb/pkg/records"
"github.com/unhandled-exception/sophiadb/pkg/scan"
)

type TablePlan struct {
trx scan.TRXInt
tablename string
layout records.Layout
stats metadata.StatInfo
}

type tablePlanMetadataManager interface {
Layout(tableName string, trx scan.TRXInt) (records.Layout, error)
GetStatInfo(tableName string, layout records.Layout, trx scan.TRXInt) (metadata.StatInfo, error)
}

func NewTablePlan(trx scan.TRXInt, tableName string, md tablePlanMetadataManager) (*TablePlan, error) {
p := &TablePlan{
trx: trx,
tablename: tableName,
}

var err error

p.layout, err = md.Layout(tableName, trx)
if err != nil {
return nil, errors.WithMessage(ErrFailedToCreatePlan, err.Error())
}

p.stats, err = md.GetStatInfo(tableName, p.layout, trx)
if err != nil {
return nil, errors.WithMessage(ErrFailedToCreatePlan, err.Error())
}

return p, nil
}

func (p *TablePlan) Open() (scan.Scan, error) {
return scan.NewTableScan(p.trx, p.tablename, p.layout)
}

func (p *TablePlan) Schema() records.Schema {
return p.layout.Schema
}

func (p *TablePlan) BlocksAccessed() int64 {
return p.stats.Blocks
}

func (p *TablePlan) Records() int64 {
return p.stats.Records
}

func (p *TablePlan) DistinctValues(fieldName string) (int64, bool) {
return p.stats.DistinctValues(fieldName)
}

func (p *TablePlan) String() string {
return fmt.Sprintf("scan table %s", p.tablename)
}
Loading

0 comments on commit be3b022

Please sign in to comment.