(data []fexpr.ExprGroup, fieldResolver FieldResolver, maxExpressions *int)
| 105 | } |
| 106 | |
| 107 | func buildParsedFilterExpr(data []fexpr.ExprGroup, fieldResolver FieldResolver, maxExpressions *int) (dbx.Expression, error) { |
| 108 | if len(data) == 0 { |
| 109 | return nil, fexpr.ErrEmpty |
| 110 | } |
| 111 | |
| 112 | result := &concatExpr{separator: " "} |
| 113 | |
| 114 | for _, group := range data { |
| 115 | var expr dbx.Expression |
| 116 | var exprErr error |
| 117 | |
| 118 | switch item := group.Item.(type) { |
| 119 | case fexpr.Expr: |
| 120 | if *maxExpressions <= 0 { |
| 121 | return nil, ErrFilterExprLimit |
| 122 | } |
| 123 | |
| 124 | *maxExpressions-- |
| 125 | |
| 126 | expr, exprErr = resolveTokenizedExpr(item, fieldResolver) |
| 127 | case fexpr.ExprGroup: |
| 128 | expr, exprErr = buildParsedFilterExpr([]fexpr.ExprGroup{item}, fieldResolver, maxExpressions) |
| 129 | case []fexpr.ExprGroup: |
| 130 | expr, exprErr = buildParsedFilterExpr(item, fieldResolver, maxExpressions) |
| 131 | default: |
| 132 | exprErr = errors.New("unsupported expression item") |
| 133 | } |
| 134 | |
| 135 | if exprErr != nil { |
| 136 | return nil, exprErr |
| 137 | } |
| 138 | |
| 139 | if len(result.parts) > 0 { |
| 140 | var op string |
| 141 | if group.Join == fexpr.JoinOr { |
| 142 | op = "OR" |
| 143 | } else { |
| 144 | op = "AND" |
| 145 | } |
| 146 | result.parts = append(result.parts, &opExpr{op}) |
| 147 | } |
| 148 | |
| 149 | result.parts = append(result.parts, expr) |
| 150 | } |
| 151 | |
| 152 | return result, nil |
| 153 | } |
| 154 | |
| 155 | func resolveTokenizedExpr(expr fexpr.Expr, fieldResolver FieldResolver) (dbx.Expression, error) { |
| 156 | lResult, lErr := resolveToken(expr.Left, fieldResolver) |
no test coverage detected
searching dependent graphs…