json/model/condition.go

56 lines
939 B
Go

package model
// Compare current node with another node
func (n *Node) Compare(op Operand, node *Node) bool {
switch op {
case OpEq:
return n.Value() == node.Value()
case OpNeq:
return n.Value() != node.Value()
case OpLess:
return less(n, node)
case OpGt:
return less(node, n)
case OpLessEq:
return less(n, node) || n.Value() == node.Value()
case OpGtEq:
return less(node, n) || n.Value() == node.Value()
case OpIn:
if n.Type != ArrayNode {
return false
}
for _, v := range n.ArrayValue {
if v.Value() == node.Value() {
return true
}
}
}
return false
}
func less(n1 *Node, n2 *Node) bool {
if n1.Type != n2.Type {
return false
}
switch n1.Type {
case NumberNode:
return n1.NumberValue < n2.NumberValue
case StringNode:
return n1.StringValue < n2.StringValue
default:
return false
}
}
type Operand int
const (
OpEq Operand = iota
OpNeq
OpLess
OpLessEq
OpGt
OpGtEq
OpIn
)