|
1 | 1 | module Granite::Query::Assembler
|
2 | 2 | abstract class Base(Model)
|
| 3 | + @placeholder : String = "" |
3 | 4 | @where : String?
|
4 | 5 | @order : String?
|
5 | 6 | @limit : String?
|
@@ -41,26 +42,40 @@ module Granite::Query::Assembler
|
41 | 42 | clauses = ["WHERE"]
|
42 | 43 |
|
43 | 44 | @query.where_fields.each do |expression|
|
44 |
| - add_aggregate_field expression[:field] |
45 |
| - |
46 | 45 | clauses << expression[:join].to_s.upcase unless clauses.size == 1
|
47 | 46 |
|
48 |
| - if expression[:value].nil? |
49 |
| - clauses << "#{expression[:field]} IS NULL" |
50 |
| - elsif expression[:value].is_a?(Array) |
51 |
| - in_stmt = String.build do |str| |
52 |
| - str << '(' |
53 |
| - expression[:value].as(Array).each_with_index do |val, idx| |
54 |
| - str << '\'' if expression[:value].is_a?(Array(String)) |
55 |
| - str << val |
56 |
| - str << '\'' if expression[:value].is_a?(Array(String)) |
57 |
| - str << ',' if expression[:value].as(Array).size - 1 != idx |
| 47 | + if expression[:field]?.nil? # custom SQL |
| 48 | + expression = expression.as(NamedTuple(join: Symbol, stmt: String, value: Granite::Columns::Type)) |
| 49 | + |
| 50 | + if !expression[:value].nil? |
| 51 | + param_token = add_parameter expression[:value] |
| 52 | + clause = expression[:stmt].gsub(@placeholder, param_token) |
| 53 | + else |
| 54 | + clause = expression[:stmt] |
| 55 | + end |
| 56 | + |
| 57 | + clauses << clause |
| 58 | + else # standard where query |
| 59 | + expression = expression.as(NamedTuple(join: Symbol, field: String, operator: Symbol, value: Granite::Columns::Type)) |
| 60 | + add_aggregate_field expression[:field] |
| 61 | + |
| 62 | + if expression[:value].nil? |
| 63 | + clauses << "#{expression[:field]} IS NULL" |
| 64 | + elsif expression[:value].is_a?(Array) |
| 65 | + in_stmt = String.build do |str| |
| 66 | + str << '(' |
| 67 | + expression[:value].as(Array).each_with_index do |val, idx| |
| 68 | + str << '\'' if expression[:value].is_a?(Array(String)) |
| 69 | + str << val |
| 70 | + str << '\'' if expression[:value].is_a?(Array(String)) |
| 71 | + str << ',' if expression[:value].as(Array).size - 1 != idx |
| 72 | + end |
| 73 | + str << ')' |
58 | 74 | end
|
59 |
| - str << ')' |
| 75 | + clauses << "#{expression[:field]} #{sql_operator(expression[:operator])} #{in_stmt}" |
| 76 | + else |
| 77 | + clauses << "#{expression[:field]} #{sql_operator(expression[:operator])} #{add_parameter expression[:value]}" |
60 | 78 | end
|
61 |
| - clauses << "#{expression[:field]} #{sql_operator(expression[:operator])} #{in_stmt}" |
62 |
| - else |
63 |
| - clauses << "#{expression[:field]} #{sql_operator(expression[:operator])} #{add_parameter expression[:value]}" |
64 | 79 | end
|
65 | 80 | end
|
66 | 81 |
|
|
0 commit comments