@@ -51,41 +51,57 @@ defmodule Ecto.Query.Builder.OrderBy do
51
51
{ Macro . t ( ) , { list , term } }
52
52
def escape ( kind , expr , params_acc , vars , env ) do
53
53
expr
54
- |> Macro . expand_once ( get_env ( env ) )
55
54
|> List . wrap ( )
56
- |> Enum . map_reduce ( params_acc , & do_escape ( & 1 , & 2 , kind , vars , env ) )
55
+ |> Enum . flat_map_reduce ( params_acc , & do_escape ( & 1 , & 2 , kind , vars , env ) )
57
56
end
58
57
59
58
defp do_escape ( { dir , { :^ , _ , [ expr ] } } , params_acc , kind , _vars , _env ) do
60
- { { quoted_dir! ( kind , dir ) ,
61
- quote ( do: Ecto.Query.Builder.OrderBy . field! ( unquote ( kind ) , unquote ( expr ) ) ) } , params_acc }
59
+ { [ { quoted_dir! ( kind , dir ) ,
60
+ quote ( do: Ecto.Query.Builder.OrderBy . field! ( unquote ( kind ) , unquote ( expr ) ) ) } ] , params_acc }
62
61
end
63
62
64
63
defp do_escape ( { :^ , _ , [ expr ] } , params_acc , kind , _vars , _env ) do
65
- { { :asc , quote ( do: Ecto.Query.Builder.OrderBy . field! ( unquote ( kind ) , unquote ( expr ) ) ) } ,
64
+ { [ { :asc , quote ( do: Ecto.Query.Builder.OrderBy . field! ( unquote ( kind ) , unquote ( expr ) ) ) } ] ,
66
65
params_acc }
67
66
end
68
67
69
68
defp do_escape ( { dir , field } , params_acc , kind , _vars , _env ) when is_atom ( field ) do
70
- { { quoted_dir! ( kind , dir ) , Macro . escape ( to_field ( field ) ) } , params_acc }
69
+ { [ { quoted_dir! ( kind , dir ) , Macro . escape ( to_field ( field ) ) } ] , params_acc }
71
70
end
72
71
73
72
defp do_escape ( field , params_acc , _kind , _vars , _env ) when is_atom ( field ) do
74
- { { :asc , Macro . escape ( to_field ( field ) ) } , params_acc }
73
+ { [ { :asc , Macro . escape ( to_field ( field ) ) } ] , params_acc }
75
74
end
76
75
77
76
defp do_escape ( { dir , expr } , params_acc , kind , vars , env ) do
78
- { ast , params_acc } = Builder . escape ( expr , :any , params_acc , vars , env )
79
- { { quoted_dir! ( kind , dir ) , ast } , params_acc }
77
+ fun = & escape_expansion ( kind , & 1 , & 2 , & 3 , & 4 , & 5 )
78
+ { ast , params_acc } = Builder . escape ( expr , :any , params_acc , vars , { env , fun } )
79
+ { [ { quoted_dir! ( kind , dir ) , ast } ] , params_acc }
80
80
end
81
81
82
- defp do_escape ( expr , params_acc , _kind , vars , env ) do
83
- { ast , params_acc } = Builder . escape ( expr , :any , params_acc , vars , env )
84
- { { :asc , ast } , params_acc }
82
+ defp do_escape ( expr , params_acc , kind , vars , env ) do
83
+ fun = & escape_expansion ( kind , & 1 , & 2 , & 3 , & 4 , & 5 )
84
+ { ast , params_acc } = Builder . escape ( expr , :any , params_acc , vars , { env , fun } )
85
+
86
+ if is_list ( ast ) do
87
+ { ast , params_acc }
88
+ else
89
+ { [ { :asc , ast } ] , params_acc }
90
+ end
85
91
end
86
92
87
- defp get_env ( { env , _ } ) , do: env
88
- defp get_env ( env ) , do: env
93
+ defp escape_expansion ( kind , expr , _type , params_acc , vars , env ) when is_list ( expr ) do
94
+ escape ( kind , expr , params_acc , vars , env )
95
+ end
96
+
97
+ defp escape_expansion ( _kind , field , _type , params_acc , _vars , _env ) when is_atom ( field ) do
98
+ { Macro . escape ( to_field ( field ) ) , params_acc }
99
+ end
100
+
101
+ defp escape_expansion ( kind , expr , type , params_acc , vars , env ) do
102
+ fun = & escape_expansion ( kind , & 1 , & 2 , & 3 , & 4 , & 5 )
103
+ Builder . escape ( expr , type , params_acc , vars , { env , fun } )
104
+ end
89
105
90
106
@ doc """
91
107
Checks the variable is a quoted direction at compilation time or
@@ -159,7 +175,15 @@ defmodule Ecto.Query.Builder.OrderBy do
159
175
"""
160
176
def order_by! ( query , exprs , op , file , line ) do
161
177
{ expr , params , subqueries } = order_by_or_distinct! ( :order_by , query , exprs , [ ] )
162
- expr = % Ecto.Query.ByExpr { expr: expr , params: Enum . reverse ( params ) , line: line , file: file , subqueries: subqueries }
178
+
179
+ expr = % Ecto.Query.ByExpr {
180
+ expr: expr ,
181
+ params: Enum . reverse ( params ) ,
182
+ line: line ,
183
+ file: file ,
184
+ subqueries: subqueries
185
+ }
186
+
163
187
apply ( query , expr , op )
164
188
end
165
189
0 commit comments