Skip to content

Commit fa6b755

Browse files
committed
More passing tests around query builder
1 parent 541eb72 commit fa6b755

4 files changed

Lines changed: 376 additions & 287 deletions

File tree

lib/mongo_ecto/conversions.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ defmodule Mongo.Ecto.Conversions do
33

44
import Mongo.Ecto.Utils
55

6+
def to_ecto_pk(%Ecto.Query.Tagged{type: type, value: value}) do
7+
{:ok, dumped} = Ecto.Type.adapter_dump(Mongo.Ecto, type, value)
8+
dumped
9+
end
610
def to_ecto_pk(%{__struct__: _} = value, _pk),
711
do: value
812
def to_ecto_pk(map, pk) when is_map(map) do
@@ -36,6 +40,8 @@ defmodule Mongo.Ecto.Conversions do
3640
:error -> :error
3741
end
3842
end
43+
def from_ecto_pk(%Ecto.Query.Tagged{type: type, value: value}, _pk),
44+
do: Ecto.Type.adapter_dump(Mongo.Ecto, type, value)
3945
def from_ecto_pk(%{__struct__: _} = value, _pk),
4046
do: {:ok, value}
4147
def from_ecto_pk(map, pk) when is_map(map),

lib/mongo_ecto/normalized_query.ex

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)