2
2
# This will likely require adapter specific subclassing :[.
3
3
module Granite::Query::Assembler
4
4
class Postgresql (Model ) < Base (Model )
5
- def build_where
5
+ @where : String ?
6
+ @order : String ?
7
+ @limit : String ?
8
+ @offset : String ?
9
+ @group_by : String ?
10
+
11
+ def where
12
+ return @where if @where
13
+
6
14
clauses = @query .where_fields.map do |field , value |
7
15
add_aggregate_field field
8
16
@@ -14,19 +22,21 @@ module Granite::Query::Assembler
14
22
end
15
23
end
16
24
17
- return " " if clauses.none?
25
+ return nil if clauses.none?
18
26
19
- " WHERE #{ clauses.join " AND " } "
27
+ @where = " WHERE #{ clauses.join " AND " } "
20
28
end
21
29
22
- def build_order (use_default_order = true )
30
+ def order (use_default_order = true )
31
+ return @order if @order
32
+
23
33
order_fields = @query .order_fields
24
34
25
35
if order_fields.none?
26
36
if use_default_order
27
37
order_fields = default_order
28
38
else
29
- return " "
39
+ return nil
30
40
end
31
41
end
32
42
@@ -40,7 +50,19 @@ module Granite::Query::Assembler
40
50
end
41
51
end
42
52
43
- " ORDER BY #{ order_clauses.join " , " } "
53
+ @order = " ORDER BY #{ order_clauses.join " , " } "
54
+ end
55
+
56
+ def limit
57
+ @limit ||= if limit = @query .limit
58
+ " LIMIT #{ limit } "
59
+ end
60
+ end
61
+
62
+ def offset
63
+ @offset ||= if offset = @query .offset
64
+ " OFFSET #{ offset } "
65
+ end
44
66
end
45
67
46
68
def log (* stuff)
@@ -50,48 +72,42 @@ module Granite::Query::Assembler
50
72
[{field: Model .primary_name, direction: " ASC" }]
51
73
end
52
74
53
- def build_group_by
54
- if @aggregate_fields .any?
55
- " GROUP BY #{ @aggregate_fields .join " , " } "
56
- else
57
- " "
58
- end
75
+ def group_by
76
+ @group_by ||= if @aggregate_fields .any?
77
+ " GROUP BY #{ @aggregate_fields .join " , " } "
78
+ end
59
79
end
60
80
61
81
def count : Executor ::Value (Model , Int64 )
62
- where = build_where
63
- order = build_order(false )
64
- group = build_group_by
65
-
66
- sql = <<-SQL
67
- SELECT COUNT (* )
68
- FROM #{ table_name }
69
- # {where}
70
- # {group}
71
- # {order}
72
- SQL
82
+ sql = build_sql do |s |
83
+ s << " SELECT COUNT(*)"
84
+ s << " FROM #{ table_name } "
85
+ s << where
86
+ s << group_by
87
+ s << order
88
+ end
73
89
74
90
Executor ::Value (Model , Int64 ).new sql, numbered_parameters, default: 0 _i64
75
91
end
76
92
77
93
def first (n : Int32 = 1 ) : Executor ::List (Model )
78
- sql = <<-SQL
79
- SELECT #{ field_list }
80
- FROM #{ table_name }
81
- # {build_where}
82
- # {build_order}
83
- LIMIT #{ n }
84
- SQL
94
+ sql = build_sql do |s |
95
+ s << " SELECT #{ field_list } "
96
+ s << " FROM #{ table_name } "
97
+ s << where
98
+ s << order
99
+ s << " LIMIT #{ n } "
100
+ s << offset
101
+ end
85
102
86
103
Executor ::List (Model ).new sql, numbered_parameters
87
104
end
88
105
89
106
def delete
90
- sql = <<-SQL
91
- DELETE
92
- FROM #{ table_name }
93
- # {build_where}
94
- SQL
107
+ sql = build_sql do |s |
108
+ s << " DELETE FROM #{ table_name } "
109
+ s << where
110
+ end
95
111
96
112
log sql, numbered_parameters
97
113
Model .adapter.open do |db |
@@ -100,12 +116,14 @@ module Granite::Query::Assembler
100
116
end
101
117
102
118
def select
103
- sql = <<-SQL
104
- SELECT #{ field_list }
105
- FROM #{ table_name }
106
- # {build_where}
107
- # {build_order}
108
- SQL
119
+ sql = build_sql do |s |
120
+ s << " SELECT #{ field_list } "
121
+ s << " FROM #{ table_name } "
122
+ s << where
123
+ s << order
124
+ s << limit
125
+ s << offset
126
+ end
109
127
110
128
Executor ::List (Model ).new sql, numbered_parameters
111
129
end
0 commit comments