@@ -58,11 +58,26 @@ defmodule Feeb.DB.Query do
5858
5959 def get_templated_query_id ( query_id , target_fields , meta \\ % { } )
6060
61+ def get_templated_query_id ( { context , domain , query_name } = query_id , target_fields , _meta )
62+ when query_name in [ :__all , :__fetch ] do
63+ model = Schema . get_model_from_query_id ( query_id )
64+
65+ real_query_id = { context , domain , :"#{ query_name } $#{ get_query_name_suffix ( target_fields ) } " }
66+
67+ case get ( real_query_id ) do
68+ { _ , _ , _ } = _compiled_query ->
69+ real_query_id
70+
71+ nil ->
72+ compile_templated_query ( query_name , query_id , target_fields , model )
73+ end
74+ end
75+
6176 def get_templated_query_id ( { context , domain , :__insert } = query_id , target_fields , _meta ) do
6277 model = Schema . get_model_from_query_id ( query_id )
6378
6479 target_fields =
65- if target_fields == :all do
80+ if target_fields == [ :* ] do
6681 model . __cols__ ( )
6782 else
6883 raise "Not supported for now, add & test it once needed"
@@ -106,16 +121,15 @@ defmodule Feeb.DB.Query do
106121 end
107122 end
108123
109- def get_templated_query_id ( { _context , _domain , query_name } = query_id , target_fields , _meta )
110- when query_name in [ :__all , :__fetch , :__delete ] do
124+ def get_templated_query_id ( { _context , _domain , :__delete } = query_id , target_fields , _meta ) do
111125 model = Schema . get_model_from_query_id ( query_id )
112126
113127 case get ( query_id ) do
114128 { _ , _ , _ } = _compiled_query ->
115129 query_id
116130
117131 nil ->
118- compile_templated_query ( query_name , query_id , target_fields , model )
132+ compile_templated_query ( :__delete , query_id , target_fields , model )
119133 end
120134 end
121135
@@ -139,34 +153,32 @@ defmodule Feeb.DB.Query do
139153 primary_keys = model . __primary_keys__ ( )
140154 assert_adhoc_query! ( primary_keys , query_id , model )
141155
142- set_conditions =
143- target_fields
144- |> Enum . reduce ( [ ] , fn field , acc ->
145- [ "#{ field } = ?" | acc ]
146- end )
147- |> Enum . reverse ( )
148- |> Enum . join ( ", " )
156+ set_clause = generate_update_set_clause ( target_fields )
157+ where_clause = generate_where_clause ( primary_keys )
158+ sql = "UPDATE #{ domain } #{ set_clause } #{ where_clause } ;"
149159
150- sql = "UPDATE #{ domain } SET #{ set_conditions } #{ generate_where_clause ( primary_keys ) } ;"
151160 adhoc_query = { sql , { [ ] , target_fields ++ primary_keys } , :update }
152161 append_runtime_query ( query_id , adhoc_query )
153162
154163 query_id
155164 end
156165
157- defp compile_templated_query ( :__all , { _ , domain , _ } = query_id , _target_fields , _model ) do
158- sql = "SELECT * FROM #{ domain } ;"
159- adhoc_query = { sql , { [ :* ] , [ ] } , :select }
166+ defp compile_templated_query ( :__all , { _ , domain , _ } = query_id , target_fields , _model ) do
167+ sql = "#{ generate_select_clause ( target_fields ) } FROM #{ domain } ;"
168+ adhoc_query = { sql , { target_fields , [ ] } , :select }
160169 append_runtime_query ( query_id , adhoc_query )
161170 query_id
162171 end
163172
164- defp compile_templated_query ( :__fetch , { _ , domain , _ } = query_id , _target_fields , model ) do
173+ defp compile_templated_query ( :__fetch , { _ , domain , _ } = query_id , target_fields , model ) do
165174 primary_keys = model . __primary_keys__ ( )
166175 assert_adhoc_query! ( primary_keys , query_id , model )
167- sql = "SELECT * FROM #{ domain } #{ generate_where_clause ( primary_keys ) } ;"
168176
169- adhoc_query = { sql , { [ :* ] , primary_keys } , :select }
177+ select_clause = generate_select_clause ( target_fields )
178+ where_clause = generate_where_clause ( primary_keys )
179+ sql = "#{ select_clause } FROM #{ domain } #{ where_clause } ;"
180+
181+ adhoc_query = { sql , { target_fields , primary_keys } , :select }
170182 append_runtime_query ( query_id , adhoc_query )
171183 query_id
172184 end
@@ -232,6 +244,16 @@ defmodule Feeb.DB.Query do
232244 end
233245 end
234246
247+ defp get_query_name_suffix ( target_fields ) when is_list ( target_fields ) do
248+ target_fields
249+ |> Enum . sort ( )
250+ |> Enum . reduce ( [ ] , fn field , acc ->
251+ [ "#{ field } " | acc ]
252+ end )
253+ |> Enum . reverse ( )
254+ |> Enum . join ( "$" )
255+ end
256+
235257 defp maybe_inject_returning_clause ( nil , _ ) , do: nil
236258 defp maybe_inject_returning_clause ( query , [ ] ) , do: query
237259
@@ -253,6 +275,32 @@ defmodule Feeb.DB.Query do
253275 defp get_returning_fields ( { _ , _ , operation } ) when operation in [ :update , :delete ] ,
254276 do: "*"
255277
278+ defp generate_select_clause ( [ ] ) , do: "SELECT *"
279+
280+ defp generate_select_clause ( fields ) when is_list ( fields ) do
281+ select_conditions =
282+ fields
283+ |> Enum . reduce ( [ ] , fn field , acc ->
284+ [ "#{ field } " | acc ]
285+ end )
286+ |> Enum . reverse ( )
287+ |> Enum . join ( ", " )
288+
289+ "SELECT #{ select_conditions } "
290+ end
291+
292+ defp generate_update_set_clause ( fields ) when is_list ( fields ) do
293+ set_conditions =
294+ fields
295+ |> Enum . reduce ( [ ] , fn field , acc ->
296+ [ "#{ field } = ?" | acc ]
297+ end )
298+ |> Enum . reverse ( )
299+ |> Enum . join ( ", " )
300+
301+ "SET #{ set_conditions } "
302+ end
303+
256304 defp generate_where_clause ( primary_keys ) when is_list ( primary_keys ) do
257305 where_conditions =
258306 primary_keys
0 commit comments