in src/ct/parser/tree.go [355:392]
func (n *Node) EvalRelations() (relation.Relations, relation.Relations) {
if n.left == nil {
return relation.NewRelations(), relation.NewRelations()
}
switch {
case n.left.val == "C" && n.right == nil:
return n.left.EvalRelations()
case n.left.val == "R" && n.right == nil:
orRels := relation.NewRelations()
andRels := relation.NewRelations()
r, _ := n.left.EvalRelation()
andRels = append(andRels, r)
return orRels, andRels
default:
m := n.right
conj := "and"
if m.right != nil {
conj = m.left.left.val
m = m.right
} else {
m = m.left
}
orRels, andRels := n.left.EvalRelations()
if r, err := m.EvalRelation(); err == nil {
switch conj {
case "or":
orRels = append(orRels, r)
orRels = append(orRels, andRels...)
andRels = relation.NewRelations()
default:
andRels = append(andRels, r)
andRels = append(andRels, orRels...)
orRels = relation.NewRelations()
}
}
return orRels, andRels
}
}