| 2148 | return nl, nil |
| 2149 | } |
| 2150 | func NodeFromExpr(e *Expr) (Node, error) { |
| 2151 | if e == nil { |
| 2152 | return nil, fmt.Errorf("Nil expression?") |
| 2153 | } |
| 2154 | var n Node |
| 2155 | if e.Op != "" { |
| 2156 | /* |
| 2157 | // Logic, Expressions, Operators etc |
| 2158 | TokenMultiply: {Kw: "*", Description: "Multiply"}, |
| 2159 | TokenMinus: {Kw: "-", Description: "-"}, |
| 2160 | TokenPlus: {Kw: "+", Description: "+"}, |
| 2161 | TokenPlusPlus: {Kw: "++", Description: "++"}, |
| 2162 | TokenPlusEquals: {Kw: "+=", Description: "+="}, |
| 2163 | TokenDivide: {Kw: "/", Description: "Divide /"}, |
| 2164 | TokenModulus: {Kw: "%", Description: "Modulus %"}, |
| 2165 | TokenEqual: {Kw: "=", Description: "Equal"}, |
| 2166 | TokenEqualEqual: {Kw: "==", Description: "=="}, |
| 2167 | TokenNE: {Kw: "!=", Description: "NE"}, |
| 2168 | TokenGE: {Kw: ">=", Description: "GE"}, |
| 2169 | TokenLE: {Kw: "<=", Description: "LE"}, |
| 2170 | TokenGT: {Kw: ">", Description: "GT"}, |
| 2171 | TokenLT: {Kw: "<", Description: "LT"}, |
| 2172 | TokenIf: {Kw: "if", Description: "IF"}, |
| 2173 | TokenAnd: {Kw: "&&", Description: "&&"}, |
| 2174 | TokenOr: {Kw: "||", Description: "||"}, |
| 2175 | TokenLogicOr: {Kw: "or", Description: "Or"}, |
| 2176 | TokenLogicAnd: {Kw: "and", Description: "And"}, |
| 2177 | TokenIN: {Kw: "in", Description: "IN"}, |
| 2178 | TokenLike: {Kw: "like", Description: "LIKE"}, |
| 2179 | TokenNegate: {Kw: "not", Description: "NOT"}, |
| 2180 | TokenBetween: {Kw: "between", Description: "between"}, |
| 2181 | TokenIs: {Kw: "is", Description: "IS"}, |
| 2182 | TokenNull: {Kw: "null", Description: "NULL"}, |
| 2183 | TokenContains: {Kw: "contains", Description: "contains"}, |
| 2184 | TokenIntersects: {Kw: "intersects", Description: "intersects"}, |
| 2185 | */ |
| 2186 | //e.Op = strings.ToUpper(e.Op) |
| 2187 | switch strings.ToUpper(e.Op) { |
| 2188 | case "EXPR": |
| 2189 | // udf |
| 2190 | n = &FuncNode{} |
| 2191 | case "AND", "OR": |
| 2192 | // bool |
| 2193 | n = &BooleanNode{} |
| 2194 | case "INCLUDE": |
| 2195 | n = &IncludeNode{} |
| 2196 | case "NOT": |
| 2197 | // This is a special Case, it is possible its urnary |
| 2198 | // but in general we can collapse it |
| 2199 | n = &UnaryNode{} |
| 2200 | case "EXISTS": |
| 2201 | n = &UnaryNode{} |
| 2202 | case "BETWEEN": |
| 2203 | n = &TriNode{} |
| 2204 | case "=", "-", "+", "++", "+=", "/", "%", "==", "<=", "!=", ">=", ">", "<", "*", |
| 2205 | "LIKE", "CONTAINS", "INTERSECTS", "IN": |
| 2206 | |
| 2207 | // very weird special case for FILTER * where the * is an ident not op |