@@ -136,26 +136,21 @@ defmodule Mongo.Ecto.NormalizedQuery do
136136 { coll , model , primary_key ( model ) }
137137 end
138138
139+ defp from ( % Query { from: % Ecto.SubQuery { } } ) do
140+ raise ArgumentError , "MongoDB does not support subqueries"
141+ end
142+
139143 @ aggregate_ops [ :min , :max , :sum , :avg ]
140144 @ special_ops [ :count | @ aggregate_ops ]
141145
142146 defp projection ( % Query { select: nil } , _params , _from ) ,
143147 do: { :find , % { } , [ ] }
144- defp projection ( % Query { select: % Query.SelectExpr { fields: nil , take: take } } = query , params , from ) ,
145- do: IO . inspect ( take )
146148 defp projection ( % Query { select: % Query.SelectExpr { fields: fields } } = query , params , from ) ,
147149 do: projection ( fields , params , from , query , % { } , [ ] )
148150
149151 defp projection ( [ ] , _params , _from , _query , pacc , facc ) ,
150152 do: { :find , pacc , Enum . reverse ( facc ) }
151- defp projection ( [ { :& , _ , [ 0 ] } = field | rest ] , params , { _ , model , pk } = from , query , pacc , facc )
152- when model != nil do
153- pacc = Enum . into ( model . __schema__ ( :fields ) , pacc , & { field ( & 1 , pk ) , true } )
154- facc = [ field | facc ]
155-
156- projection ( rest , params , from , query , pacc , facc )
157- end
158- defp projection ( [ { :& , _ , [ 0 ] } = field | rest ] , params , { _ , nil , _ } = from , query , _pacc , facc ) do
153+ defp projection ( [ { :& , _ , [ 0 , nil , _ ] } = field | rest ] , params , { _ , nil , _ } = from , query , _pacc , facc ) do
159154 # Model is nil, we want empty projection, but still extract fields
160155 facc =
161156 case projection ( rest , params , from , query , % { } , [ field | facc ] ) do
@@ -166,6 +161,18 @@ defmodule Mongo.Ecto.NormalizedQuery do
166161 end
167162 { :find , % { } , facc }
168163 end
164+ defp projection ( [ { :& , _ , [ 0 , nil , _ ] } = field | rest ] , params , { _ , model , pk } = from , query , pacc , facc ) do
165+ pacc = Enum . into ( model . __schema__ ( :fields ) , pacc , & { field ( & 1 , pk ) , true } )
166+ facc = [ field | facc ]
167+
168+ projection ( rest , params , from , query , pacc , facc )
169+ end
170+ defp projection ( [ { :& , _ , [ 0 , fields , _ ] } = field | rest ] , params , { _ , model , pk } = from , query , pacc , facc ) do
171+ pacc = Enum . into ( fields , pacc , & { field ( & 1 , pk ) , true } )
172+ facc = [ field | facc ]
173+
174+ projection ( rest , params , from , query , pacc , facc )
175+ end
169176 defp projection ( [ { { :. , _ , [ _ , name ] } , _ , _ } = field | rest ] , params , from , query , pacc , facc ) do
170177 { _ , _ , pk } = from
171178
@@ -207,21 +214,6 @@ defmodule Mongo.Ecto.NormalizedQuery do
207214 defp projection ( [ { op , _ , _ } | _rest ] , _params , _from , query , _pacc , _facc ) when is_op ( op ) do
208215 error ( query , "select clause" )
209216 end
210- # We skip all values and then add them when constructing return result
211- defp projection ( [ % Tagged { value: { :^ , _ , [ idx ] } } = field | rest ] , params , from , query , pacc , facc ) do
212- { _ , _ , pk } = from
213- value = params |> elem ( idx ) |> value ( params , pk , query , "select clause" )
214- facc = [ { :value , value , field } | facc ]
215-
216- projection ( rest , params , from , query , pacc , facc )
217- end
218- defp projection ( [ field | rest ] , params , from , query , pacc , facc ) do
219- { _ , _ , pk } = from
220- value = value ( field , params , pk , query , "select clause" )
221- facc = [ { :value , value , field } | facc ]
222-
223- projection ( rest , params , from , query , pacc , facc )
224- end
225217
226218 defp limit_skip ( % Query { limit: limit , offset: offset } = query , params , { _ , _ , pk } ) do
227219 [ limit: offset_limit ( limit , params , pk , query , "limit clause" ) ,
0 commit comments