@@ -206,22 +206,20 @@ defmodule AshSqlite.SqlImplementation do
206
206
def multicolumn_distinct? , do: false
207
207
208
208
@ impl true
209
- def parameterized_type ( type , constraints , no_maps? \\ false )
210
-
211
- def parameterized_type ( { :parameterized , _ , _ } = type , _ , _ ) do
209
+ def parameterized_type ( { :parameterized , _ } = type , _ ) do
212
210
type
213
211
end
214
212
215
- def parameterized_type ( { :parameterized , _ } = type , _ , _ ) do
213
+ def parameterized_type ( { :parameterized , _ , _ } = type , _ ) do
216
214
type
217
215
end
218
216
219
- def parameterized_type ( { :in , type } , constraints , no_maps? ) do
220
- parameterized_type ( { :array , type } , constraints , no_maps? )
217
+ def parameterized_type ( { :in , type } , constraints ) do
218
+ parameterized_type ( { :array , type } , constraints )
221
219
end
222
220
223
- def parameterized_type ( { :array , type } , constraints , no_maps? ) do
224
- case parameterized_type ( type , constraints [ :items ] || [ ] , no_maps? ) do
221
+ def parameterized_type ( { :array , type } , constraints ) do
222
+ case parameterized_type ( type , constraints [ :items ] || [ ] ) do
225
223
nil ->
226
224
nil
227
225
@@ -230,11 +228,15 @@ defmodule AshSqlite.SqlImplementation do
230
228
end
231
229
end
232
230
233
- def parameterized_type ( type , _constraints , _no_maps? )
231
+ def parameterized_type ( { type , constraints } , [ ] ) do
232
+ parameterized_type ( type , constraints )
233
+ end
234
+
235
+ def parameterized_type ( type , _constraints )
234
236
when type in [ Ash.Type.Map , Ash.Type.Map.EctoType ] ,
235
237
do: nil
236
238
237
- def parameterized_type ( type , constraints , no_maps? ) do
239
+ def parameterized_type ( type , constraints ) do
238
240
if Ash.Type . ash_type? ( type ) do
239
241
cast_in_query? =
240
242
if function_exported? ( Ash.Type , :cast_in_query? , 2 ) do
@@ -244,7 +246,7 @@ defmodule AshSqlite.SqlImplementation do
244
246
end
245
247
246
248
if cast_in_query? do
247
- parameterized_type ( Ash.Type . ecto_type ( type ) , constraints , no_maps? )
249
+ parameterized_type ( Ash.Type . ecto_type ( type ) , constraints )
248
250
else
249
251
nil
250
252
end
@@ -258,136 +260,22 @@ defmodule AshSqlite.SqlImplementation do
258
260
end
259
261
260
262
@ impl true
261
- def determine_types ( mod , values ) do
262
- Code . ensure_compiled ( mod )
263
-
264
- cond do
265
- :erlang . function_exported ( mod , :types , 0 ) ->
266
- mod . types ( )
267
-
268
- :erlang . function_exported ( mod , :args , 0 ) ->
269
- mod . args ( )
270
-
271
- true ->
272
- [ :any ]
273
- end
274
- |> Enum . map ( fn types ->
275
- case types do
276
- :same ->
277
- types =
278
- for _ <- values do
279
- :same
280
- end
281
-
282
- closest_fitting_type ( types , values )
283
-
284
- :any ->
285
- for _ <- values do
286
- :any
287
- end
288
-
289
- types ->
290
- closest_fitting_type ( types , values )
263
+ def determine_types ( mod , args , returns \\ nil ) do
264
+ returns =
265
+ case returns do
266
+ { :parameterized , _ } -> nil
267
+ { :array , { :parameterized , _ } } -> nil
268
+ { :array , { type , constraints } } when type != :array -> { type , [ items: constraints ] }
269
+ { :array , _ } -> nil
270
+ { type , constraints } -> { type , constraints }
271
+ other -> other
291
272
end
292
- end )
293
- |> Enum . filter ( fn types ->
294
- Enum . all? ( types , & ( vagueness ( & 1 ) == 0 ) )
295
- end )
296
- |> case do
297
- [ type ] ->
298
- if type == :any || type == { :in , :any } do
299
- nil
300
- else
301
- type
302
- end
303
-
304
- # There are things we could likely do here
305
- # We only say "we know what types these are" when we explicitly know
306
- _ ->
307
- Enum . map ( values , fn _ -> nil end )
308
- end
309
- end
310
-
311
- defp closest_fitting_type ( types , values ) do
312
- types_with_values = Enum . zip ( types , values )
313
-
314
- types_with_values
315
- |> fill_in_known_types ( )
316
- |> clarify_types ( )
317
- end
318
-
319
- defp clarify_types ( types ) do
320
- basis =
321
- types
322
- |> Enum . map ( & elem ( & 1 , 0 ) )
323
- |> Enum . min_by ( & vagueness ( & 1 ) )
324
-
325
- Enum . map ( types , fn { type , _value } ->
326
- replace_same ( type , basis )
327
- end )
328
- end
329
-
330
- defp replace_same ( { :in , type } , basis ) do
331
- { :in , replace_same ( type , basis ) }
332
- end
333
273
334
- defp replace_same ( :same , :same ) do
335
- :any
336
- end
337
-
338
- defp replace_same ( :same , { :in , :same } ) do
339
- { :in , :any }
340
- end
341
-
342
- defp replace_same ( :same , basis ) do
343
- basis
344
- end
345
-
346
- defp replace_same ( other , _basis ) do
347
- other
348
- end
349
-
350
- defp fill_in_known_types ( types ) do
351
- Enum . map ( types , & fill_in_known_type / 1 )
352
- end
353
-
354
- defp fill_in_known_type (
355
- { vague_type , % Ash.Query.Ref { attribute: % { type: type , constraints: constraints } } } = ref
356
- )
357
- when vague_type in [ :any , :same ] do
358
- if Ash.Type . ash_type? ( type ) do
359
- type = type |> parameterized_type ( constraints , true ) |> array_to_in ( )
360
-
361
- { type || :any , ref }
362
- else
363
- type =
364
- if is_atom ( type ) && :erlang . function_exported ( type , :type , 1 ) do
365
- parameterized_type ( type , constraints , true ) |> array_to_in ( )
366
- else
367
- type |> array_to_in ( )
368
- end
274
+ { types , new_returns } = Ash.Expr . determine_types ( mod , args , returns )
369
275
370
- { type , ref }
371
- end
276
+ { types , new_returns || returns }
372
277
end
373
278
374
- defp fill_in_known_type (
375
- { { :array , type } , % Ash.Query.Ref { attribute: % { type: { :array , type } } = attribute } = ref }
376
- ) do
377
- { :in , fill_in_known_type ( { type , % { ref | attribute: % { attribute | type: type } } } ) }
378
- end
379
-
380
- defp fill_in_known_type ( { type , value } ) , do: { array_to_in ( type ) , value }
381
-
382
- defp array_to_in ( { :array , v } ) , do: { :in , array_to_in ( v ) }
383
-
384
- defp array_to_in ( v ) , do: v
385
-
386
- defp vagueness ( { :in , type } ) , do: vagueness ( type )
387
- defp vagueness ( :same ) , do: 2
388
- defp vagueness ( :any ) , do: 1
389
- defp vagueness ( _ ) , do: 0
390
-
391
279
defp do_get_path (
392
280
query ,
393
281
% Ash.Query.Function.GetPath { arguments: [ left , right ] , embedded?: pred_embedded? } ,
@@ -438,13 +326,6 @@ defmodule AshSqlite.SqlImplementation do
438
326
path
439
327
|> Enum . reject ( & is_integer / 1 )
440
328
|> do_determine_type_at_path ( type )
441
- |> case do
442
- nil ->
443
- nil
444
-
445
- { type , constraints } ->
446
- AshSqlite.Types . parameterized_type ( type , constraints )
447
- end
448
329
end
449
330
450
331
defp do_determine_type_at_path ( [ ] , _ ) , do: nil
0 commit comments