23
23
-define (USER_FIELDS_WITHOUT (L ), maps :without (L , ? USER_FIELDS )).
24
24
-define (USER_FIELDS_LIST , ? MAPS_TO_LIST (? USER_FIELDS )).
25
25
-define (USER_FIELDS_LIST (L ), ? MAPS_TO_LIST (? USER_FIELDS (L ))).
26
- -define (USER_FIELDS_LIST_WITHOUT (L ), ? MAPS_TO_LIST (maps :without (L , ? USER_FIELDS ))).
27
26
28
27
-define (COMMENT_SCHEMA , #{
29
28
fields => #{
40
39
-define (TREE_FIELDS , maps :get (fields , tree_m :schema ())).
41
40
-define (TREE_FIELDS_LIST , ? MAPS_TO_LIST (? TREE_FIELDS )).
42
41
43
- -define (COMMENT_FIELDS , maps :get (fields , ? COMMENT_SCHEMA )).
44
- -define (COMMENT_FIELDS_LIST , ? MAPS_TO_LIST (? COMMENT_FIELDS )).
45
- -define (COMMENT_FIELDS_LIST_WITHOUT (L ), ? MAPS_TO_LIST (maps :without (L , ? COMMENT_FIELDS ))).
46
-
47
42
schema () -> ? USER_SCHEMA .
48
43
49
44
% % =============================================================================
@@ -52,7 +47,7 @@ schema() -> ?USER_SCHEMA.
52
47
53
48
schema_test () ->
54
49
? assertEqual (? USER_SCHEMA , q :get (schema , q :from (? USER_SCHEMA ))),
55
- ? assertEqual (? USER_SCHEMA #{ model => ? MODULE } , q :get (schema , q :from (? MODULE ))).
50
+ ? assertEqual (maps : put ( model , ? MODULE , ? USER_SCHEMA ) , q :get (schema , q :from (? MODULE ))).
56
51
57
52
data_test () ->
58
53
? assertEqual (
@@ -94,11 +89,118 @@ q_test() ->
94
89
" on (\" __alias-0\" .\" id\" = \" __alias-1\" .\" author\" ) "
95
90
" where ((\" __alias-0\" .\" name\" = $1) and (\" __alias-1\" .\" text\" = $2)) "
96
91
" order by \" __alias-0\" .\" name\" ASC,\" __alias-0\" .\" id\" DESC "
97
- " for update" >>,
92
+ " for update of \" __alias-0 \" " >>,
98
93
Sql ),
99
94
? assertEqual ([<<" test1" >>, <<" test2" >>], Args ),
100
95
? assertEqual ({model , undefined , ? USER_FIELDS_LIST }, Feilds ).
101
96
97
+ q_lock_with_several_tables_test () ->
98
+ {Sql , Args , Feilds } = to_sql (
99
+ qsql :select (q :pipe (q :from (? USER_SCHEMA ), [
100
+ q :where (
101
+ fun ([#{name := Name }]) ->
102
+ pg_sql :'=:=' (Name , <<" test1" >>)
103
+ end ),
104
+ q :using (? COMMENT_SCHEMA ),
105
+ q :where (
106
+ fun ([#{id := UserId }, #{author := AuthorId , text := Name }]) ->
107
+ pg_sql :'andalso' (
108
+ pg_sql :'=:=' (UserId , AuthorId ),
109
+ pg_sql :'=:=' (Name , <<" test2" >>))
110
+ end ),
111
+ q :order_by (
112
+ fun ([#{name := Name , id := Id }|_ ]) ->
113
+ [{Name , asc }, {Id , desc }]
114
+ end ),
115
+ q :lock (for_update , fun (Tables ) -> q :lookup_tables (? COMMENT_SCHEMA , Tables ) end )
116
+ ]))),
117
+ ? assertEqual (
118
+ <<" select "
119
+ " \" __alias-0\" .\" id\" as \" id\" ,"
120
+ " \" __alias-0\" .\" name\" as \" name\" ,"
121
+ " \" __alias-0\" .\" password\" as \" password\" ,"
122
+ " \" __alias-0\" .\" salt\" as \" salt\" "
123
+ " from \" users\" as \" __alias-0\" ,"
124
+ " \" comments\" as \" __alias-1\" "
125
+ " where ((\" __alias-0\" .\" name\" = $1) and ((\" __alias-0\" .\" id\" = \" __alias-1\" .\" author\" ) and (\" __alias-1\" .\" text\" = $2))) "
126
+ " order by \" __alias-0\" .\" name\" ASC,\" __alias-0\" .\" id\" DESC "
127
+ " for update of \" __alias-1\" " >>,
128
+ Sql ),
129
+ ? assertEqual ([<<" test1" >>, <<" test2" >>], Args ),
130
+ ? assertEqual ({model , undefined , ? USER_FIELDS_LIST }, Feilds ).
131
+
132
+ q_lock_lookup_error_test () ->
133
+ ? assertException (
134
+ error ,
135
+ {unknown_table , #{table := <<" comments" >>}},
136
+ qsql :select (q :pipe (q :from (? USER_SCHEMA ), [
137
+ q :where (
138
+ fun ([#{name := Name }]) ->
139
+ pg_sql :'=:=' (Name , <<" test1" >>)
140
+ end ),
141
+ q :lock (for_update , fun (Tables ) -> q :lookup_tables (? COMMENT_SCHEMA , Tables ) end )
142
+ ]))).
143
+
144
+ q_lock_for_no_key_update_test () ->
145
+ {Sql , _Args , _Feilds } = to_sql (
146
+ qsql :select (q :pipe (q :from (? USER_SCHEMA ), [
147
+ q :where (
148
+ fun ([#{name := Name }]) ->
149
+ pg_sql :'=:=' (Name , <<" test1" >>)
150
+ end ),
151
+ q :lock (for_no_key_update )
152
+ ]))),
153
+ ? assertEqual (
154
+ <<" select "
155
+ " \" __alias-0\" .\" id\" as \" id\" ,"
156
+ " \" __alias-0\" .\" name\" as \" name\" ,"
157
+ " \" __alias-0\" .\" password\" as \" password\" ,"
158
+ " \" __alias-0\" .\" salt\" as \" salt\" "
159
+ " from \" users\" as \" __alias-0\" "
160
+ " where (\" __alias-0\" .\" name\" = $1) "
161
+ " for no key update of \" __alias-0\" " >>,
162
+ Sql ).
163
+
164
+ q_lock_for_share_test () ->
165
+ {Sql , _Args , _Feilds } = to_sql (
166
+ qsql :select (q :pipe (q :from (? USER_SCHEMA ), [
167
+ q :where (
168
+ fun ([#{name := Name }]) ->
169
+ pg_sql :'=:=' (Name , <<" test1" >>)
170
+ end ),
171
+ q :lock (for_share )
172
+ ]))),
173
+ ? assertEqual (
174
+ <<" select "
175
+ " \" __alias-0\" .\" id\" as \" id\" ,"
176
+ " \" __alias-0\" .\" name\" as \" name\" ,"
177
+ " \" __alias-0\" .\" password\" as \" password\" ,"
178
+ " \" __alias-0\" .\" salt\" as \" salt\" "
179
+ " from \" users\" as \" __alias-0\" "
180
+ " where (\" __alias-0\" .\" name\" = $1) "
181
+ " for share of \" __alias-0\" " >>,
182
+ Sql ).
183
+
184
+ q_lock_for_key_share_test () ->
185
+ {Sql , _Args , _Feilds } = to_sql (
186
+ qsql :select (q :pipe (q :from (? USER_SCHEMA ), [
187
+ q :where (
188
+ fun ([#{name := Name }]) ->
189
+ pg_sql :'=:=' (Name , <<" test1" >>)
190
+ end ),
191
+ q :lock (for_key_share )
192
+ ]))),
193
+ ? assertEqual (
194
+ <<" select "
195
+ " \" __alias-0\" .\" id\" as \" id\" ,"
196
+ " \" __alias-0\" .\" name\" as \" name\" ,"
197
+ " \" __alias-0\" .\" password\" as \" password\" ,"
198
+ " \" __alias-0\" .\" salt\" as \" salt\" "
199
+ " from \" users\" as \" __alias-0\" "
200
+ " where (\" __alias-0\" .\" name\" = $1) "
201
+ " for key share of \" __alias-0\" " >>,
202
+ Sql ).
203
+
102
204
q_from_query_test () ->
103
205
BaseQuery = q :pipe (q :from (? USER_SCHEMA ), [
104
206
q :select (fun ([#{id := Id , name := Name }]) -> #{num => Id * 2 , name => Name } end )
0 commit comments