evalExpr evaluates any expression.
(expr entql.Expr)
| 170 | |
| 171 | // evalExpr evaluates any expression. |
| 172 | func (e *state) evalExpr(expr entql.Expr) *sql.Predicate { |
| 173 | switch expr := expr.(type) { |
| 174 | case *entql.BinaryExpr: |
| 175 | return e.evalBinary(expr) |
| 176 | case *entql.UnaryExpr: |
| 177 | return sql.Not(e.evalExpr(expr.X)) |
| 178 | case *entql.NaryExpr: |
| 179 | ps := make([]*sql.Predicate, len(expr.Xs)) |
| 180 | for i, x := range expr.Xs { |
| 181 | ps[i] = e.evalExpr(x) |
| 182 | } |
| 183 | return nary[expr.Op](ps...) |
| 184 | case *entql.CallExpr: |
| 185 | switch expr.Func { |
| 186 | case entql.FuncHasPrefix, entql.FuncHasSuffix, entql.FuncContains, entql.FuncEqualFold, entql.FuncContainsFold: |
| 187 | expect(len(expr.Args) == 2, "invalid number of arguments for %s", expr.Func) |
| 188 | f, ok := expr.Args[0].(*entql.Field) |
| 189 | expect(ok, "*entql.Field, got %T", expr.Args[0]) |
| 190 | v, ok := expr.Args[1].(*entql.Value) |
| 191 | expect(ok, "*entql.Value, got %T", expr.Args[1]) |
| 192 | s, ok := v.V.(string) |
| 193 | expect(ok, "string value, got %T", v.V) |
| 194 | return strFunc[expr.Func](e.field(f), s) |
| 195 | case entql.FuncHasEdge: |
| 196 | expect(len(expr.Args) > 0, "invalid number of arguments for %s", expr.Func) |
| 197 | edge, ok := expr.Args[0].(*entql.Edge) |
| 198 | expect(ok, "*entql.Edge, got %T", expr.Args[0]) |
| 199 | return e.evalEdge(edge.Name, expr.Args[1:]...) |
| 200 | } |
| 201 | } |
| 202 | panic("invalid") |
| 203 | } |
| 204 | |
| 205 | // evalBinary evaluates binary expressions. |
| 206 | func (e *state) evalBinary(expr *entql.BinaryExpr) *sql.Predicate { |
no test coverage detected