-
Notifications
You must be signed in to change notification settings - Fork 7
/
class_query_shortcuts.cr
87 lines (75 loc) · 2.53 KB
/
class_query_shortcuts.cr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
require "../query"
# This module is **extended** by an object whenever it includes the `Model` module.
# It brings shortucts to a matching query initialization:
#
# ```
# class User
# include Onyx::SQL::Model
# end
#
# User.query == Query(User).new
# ```
module Onyx::SQL::Model::ClassQueryShortcuts(T)
# Create a new `Query(T)`.
def query : Query
Query(T).new
end
{% for method in %w(
delete
group_by
insert
limit
offset
set
update
where
having
all
one
) %}
# Create a new `Query(self)` and call `Query#{{method.id}}` on it.
def {{method.id}}(*args, **nargs) : Query(T)
query.{{method.id}}(*args, **nargs)
end
{% end %}
# Create a new `Query(self)` and call `Query#order_by` on it.
def order_by(value : T::Field | String, order : Query::Order? = nil) : Query(T)
query.order_by(value, order)
end
# Create a new `Query(self)` and call `Query#returning` on it.
def returning(values : Enumerable(T::Field | T::Reference | Char | String))
query.returning(values)
end
# ditto
def returning(*values : T::Field | T::Reference | Char | String)
returning(values)
end
# ditto
def returning(klass : T.class, *values : T::Field | T::Reference | Char | String)
query.returning(klass, *values)
end
# Create a new `Query(self)` and call `Query#select` on it.
def select(values : Enumerable(T::Field | T::Reference | Char | String))
query.select(values)
end
# ditto
def select(*values : T::Field | T::Reference | Char | String)
self.select(values)
end
# ditto
def select(klass : T.class, *values : T::Field | T::Reference | Char | String)
query.select(klass, *values)
end
# Create a new `Query(self)` and call `Query#join` on it.
def join(table : String, on : String, as _as : String? = nil, type : Onyx::SQL::Query::JoinType = :inner) : Query(T)
query.join(table, on, _as, type)
end
# ditto
def join(reference : T::Reference, on : String? = nil, as _as : String = reference.to_s.underscore, type : Onyx::SQL::Query::JoinType = :inner) : Query(T)
query.join(reference, on, _as, type)
end
# ditto
def join(reference : T::Reference, klass, *, on : String? = nil, as _as : String = reference.to_s.underscore, type : JoinType = :inner, &block)
query.join(reference, klass, on: on, as: _as, type: type, &block)
end
end