func()

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
	}
}