Skip to content

Commit

Permalink
Fixes #5, #32: Rewrote transformer to calculate after nodes correctly.
Browse files Browse the repository at this point in the history
In a number of different cases, the compiler was incapable of
figuring out the correct place for after nodes.  This also made
it impossible for there to be fields on the RHS of an expression
as the compiler would get confused and incorrectly compile them.
  • Loading branch information
brett19 committed Aug 9, 2018
1 parent 52b924a commit 0ba11ba
Show file tree
Hide file tree
Showing 6 changed files with 874 additions and 539 deletions.
157 changes: 4 additions & 153 deletions expression.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,44 +9,16 @@ import (

type VariableID int

func fieldExprCompare(lhs FieldExpr, rhs FieldExpr) bool {
if rhs.Root != lhs.Root {
return false
func (id VariableID) String() string {
if id == 0 {
return "$doc"
}

if len(rhs.Path) != len(lhs.Path) {
return false
}

for i, path := range rhs.Path {
if lhs.Path[i] != path {
return false
}
}

return true
}

func rootSetAddOne(set []FieldExpr, item FieldExpr) []FieldExpr {
for _, oitem := range set {
if fieldExprCompare(oitem, item) {
return set
}
}
return append(set, item)
}

func rootSetAdd(set []FieldExpr, items ...FieldExpr) []FieldExpr {
out := set
for _, item := range items {
out = rootSetAddOne(out, item)
}
return out
return fmt.Sprintf("$%d", id)
}

type Expression interface {
String() string
RootRefs() []FieldExpr
}

type TrueExpr struct {
Expand All @@ -56,21 +28,13 @@ func (expr TrueExpr) String() string {
return "True"
}

func (expr TrueExpr) RootRefs() []FieldExpr {
return nil
}

type FalseExpr struct {
}

func (expr FalseExpr) String() string {
return "False"
}

func (expr FalseExpr) RootRefs() []FieldExpr {
return nil
}

type ValueExpr struct {
Value interface{}
}
Expand All @@ -79,10 +43,6 @@ func (expr ValueExpr) String() string {
return fmt.Sprintf("%v", expr.Value)
}

func (expr ValueExpr) RootRefs() []FieldExpr {
return nil
}

type RegexExpr struct {
Regex interface{}
}
Expand All @@ -91,10 +51,6 @@ func (expr RegexExpr) String() string {
return fmt.Sprintf("/%v/", expr.Regex)
}

func (expr RegexExpr) RootRefs() []FieldExpr {
return nil
}

type NotExpr struct {
SubExpr Expression
}
Expand All @@ -103,10 +59,6 @@ func (expr NotExpr) String() string {
return "NOT " + expr.SubExpr.String()
}

func (expr NotExpr) RootRefs() []FieldExpr {
return expr.SubExpr.RootRefs()
}

type AndExpr []Expression

func (expr AndExpr) String() string {
Expand All @@ -124,14 +76,6 @@ func (expr AndExpr) String() string {
}
}

func (expr AndExpr) RootRefs() []FieldExpr {
var out []FieldExpr
for _, subexpr := range expr {
out = rootSetAdd(out, subexpr.RootRefs()...)
}
return out
}

type OrExpr []Expression

func (expr OrExpr) String() string {
Expand All @@ -149,14 +93,6 @@ func (expr OrExpr) String() string {
}
}

func (expr OrExpr) RootRefs() []FieldExpr {
var out []FieldExpr
for _, subexpr := range expr {
out = rootSetAdd(out, subexpr.RootRefs()...)
}
return out
}

type FieldExpr struct {
Root VariableID
Path []string
Expand All @@ -175,13 +111,6 @@ func (expr FieldExpr) String() string {
}
}

func (expr FieldExpr) RootRefs() []FieldExpr {
if expr.Root != 0 {
return nil
}
return []FieldExpr{expr}
}

type AnyInExpr struct {
VarId VariableID
InExpr Expression
Expand All @@ -193,13 +122,6 @@ func (expr AnyInExpr) String() string {
return fmt.Sprintf("any $%d in %s\n%s\nend", expr.VarId, expr.InExpr, exprStr)
}

func (expr AnyInExpr) RootRefs() []FieldExpr {
var out []FieldExpr
out = rootSetAdd(out, expr.InExpr.RootRefs()...)
out = rootSetAdd(out, expr.SubExpr.RootRefs()...)
return out
}

type EveryInExpr struct {
VarId VariableID
InExpr Expression
Expand All @@ -211,13 +133,6 @@ func (expr EveryInExpr) String() string {
return fmt.Sprintf("every $%d in %s\n%s\nend", expr.VarId, expr.InExpr, exprStr)
}

func (expr EveryInExpr) RootRefs() []FieldExpr {
var out []FieldExpr
out = rootSetAdd(out, expr.InExpr.RootRefs()...)
out = rootSetAdd(out, expr.SubExpr.RootRefs()...)
return out
}

type AnyEveryInExpr struct {
VarId VariableID
InExpr Expression
Expand All @@ -229,13 +144,6 @@ func (expr AnyEveryInExpr) String() string {
return fmt.Sprintf("any and every $%d in %s\n%s\nend", expr.VarId, expr.InExpr, exprStr)
}

func (expr AnyEveryInExpr) RootRefs() []FieldExpr {
var out []FieldExpr
out = rootSetAdd(out, expr.InExpr.RootRefs()...)
out = rootSetAdd(out, expr.SubExpr.RootRefs()...)
return out
}

type ExistsExpr struct {
SubExpr Expression
}
Expand All @@ -244,10 +152,6 @@ func (expr ExistsExpr) String() string {
return fmt.Sprintf("%s EXISTS", expr.SubExpr)
}

func (expr ExistsExpr) RootRefs() []FieldExpr {
return expr.SubExpr.RootRefs()
}

type NotExistsExpr struct {
SubExpr Expression
}
Expand All @@ -256,10 +160,6 @@ func (expr NotExistsExpr) String() string {
return fmt.Sprintf("%s IS MISSING", expr.SubExpr)
}

func (expr NotExistsExpr) RootRefs() []FieldExpr {
return expr.SubExpr.RootRefs()
}

type EqualsExpr struct {
Lhs Expression
Rhs Expression
Expand All @@ -269,13 +169,6 @@ func (expr EqualsExpr) String() string {
return fmt.Sprintf("%s = %s", expr.Lhs, expr.Rhs)
}

func (expr EqualsExpr) RootRefs() []FieldExpr {
var out []FieldExpr
out = rootSetAdd(out, expr.Lhs.RootRefs()...)
out = rootSetAdd(out, expr.Rhs.RootRefs()...)
return out
}

type NotEqualsExpr struct {
Lhs Expression
Rhs Expression
Expand All @@ -285,13 +178,6 @@ func (expr NotEqualsExpr) String() string {
return fmt.Sprintf("%s != %s", expr.Lhs, expr.Rhs)
}

func (expr NotEqualsExpr) RootRefs() []FieldExpr {
var out []FieldExpr
out = rootSetAdd(out, expr.Lhs.RootRefs()...)
out = rootSetAdd(out, expr.Rhs.RootRefs()...)
return out
}

type LessThanExpr struct {
Lhs Expression
Rhs Expression
Expand All @@ -301,13 +187,6 @@ func (expr LessThanExpr) String() string {
return fmt.Sprintf("%s < %s", expr.Lhs, expr.Rhs)
}

func (expr LessThanExpr) RootRefs() []FieldExpr {
var out []FieldExpr
out = rootSetAdd(out, expr.Lhs.RootRefs()...)
out = rootSetAdd(out, expr.Rhs.RootRefs()...)
return out
}

type LessEqualsExpr struct {
Lhs Expression
Rhs Expression
Expand All @@ -317,13 +196,6 @@ func (expr LessEqualsExpr) String() string {
return fmt.Sprintf("%s <= %s", expr.Lhs, expr.Rhs)
}

func (expr LessEqualsExpr) RootRefs() []FieldExpr {
var out []FieldExpr
out = rootSetAdd(out, expr.Lhs.RootRefs()...)
out = rootSetAdd(out, expr.Rhs.RootRefs()...)
return out
}

type GreaterThanExpr struct {
Lhs Expression
Rhs Expression
Expand All @@ -333,13 +205,6 @@ func (expr GreaterThanExpr) String() string {
return fmt.Sprintf("%s > %s", expr.Lhs, expr.Rhs)
}

func (expr GreaterThanExpr) RootRefs() []FieldExpr {
var out []FieldExpr
out = rootSetAdd(out, expr.Lhs.RootRefs()...)
out = rootSetAdd(out, expr.Rhs.RootRefs()...)
return out
}

type GreaterEqualsExpr struct {
Lhs Expression
Rhs Expression
Expand All @@ -349,13 +214,6 @@ func (expr GreaterEqualsExpr) String() string {
return fmt.Sprintf("%s >= %s", expr.Lhs, expr.Rhs)
}

func (expr GreaterEqualsExpr) RootRefs() []FieldExpr {
var out []FieldExpr
out = rootSetAdd(out, expr.Lhs.RootRefs()...)
out = rootSetAdd(out, expr.Rhs.RootRefs()...)
return out
}

type LikeExpr struct {
Lhs Expression
Rhs Expression
Expand All @@ -364,10 +222,3 @@ type LikeExpr struct {
func (expr LikeExpr) String() string {
return fmt.Sprintf("%s =~ %s", expr.Lhs, expr.Rhs)
}

func (expr LikeExpr) RootRefs() []FieldExpr {
var out []FieldExpr
out = rootSetAdd(out, expr.Lhs.RootRefs()...)
out = rootSetAdd(out, expr.Rhs.RootRefs()...)
return out
}
Loading

0 comments on commit 0ba11ba

Please sign in to comment.