queryable.ex (1298B)
1 defprotocol Ecto.Queryable do 2 @moduledoc """ 3 Converts a data structure into an `Ecto.Query`. 4 """ 5 6 @doc """ 7 Converts the given `data` into an `Ecto.Query`. 8 """ 9 def to_query(data) 10 end 11 12 defimpl Ecto.Queryable, for: Ecto.Query do 13 def to_query(query), do: query 14 end 15 16 defimpl Ecto.Queryable, for: Ecto.SubQuery do 17 def to_query(subquery) do 18 %Ecto.Query{from: %Ecto.Query.FromExpr{source: subquery}} 19 end 20 end 21 22 defimpl Ecto.Queryable, for: BitString do 23 def to_query(source) when is_binary(source) do 24 %Ecto.Query{from: %Ecto.Query.FromExpr{source: {source, nil}}} 25 end 26 end 27 28 defimpl Ecto.Queryable, for: Atom do 29 def to_query(module) do 30 try do 31 module.__schema__(:query) 32 rescue 33 UndefinedFunctionError -> 34 message = if :code.is_loaded(module) do 35 "the given module does not provide a schema" 36 else 37 "the given module does not exist" 38 end 39 40 raise Protocol.UndefinedError, 41 protocol: @protocol, value: module, description: message 42 end 43 end 44 end 45 46 defimpl Ecto.Queryable, for: Tuple do 47 def to_query({source, schema} = from) 48 when is_binary(source) and is_atom(schema) and not is_nil(schema) do 49 %Ecto.Query{from: %Ecto.Query.FromExpr{source: from, prefix: schema.__schema__(:prefix)}} 50 end 51 end