Current section

38 Versions

Jump to

Compare versions

9 files changed
+53 additions
-99 deletions
  @@ -13,9 +13,8 @@
13 13 <<"lib/exd/repo">>,<<"lib/exd/repo.ex">>,<<"lib/exd/repo/supervisor.ex">>,
14 14 <<"lib/exd/schema.ex">>,<<"lib/exd/sink">>,<<"lib/exd/sink.ex">>,
15 15 <<"lib/exd/sink/adapter">>,<<"lib/exd/sink/adapter.ex">>,
16 - <<"lib/exd/sink/adapter/logger.ex">>,<<"lib/exd/sink/adapter/sql.ex">>,
17 - <<"lib/exd/sink/adapter/test.ex">>,<<"lib/exd/source">>,
18 - <<"lib/exd/source.ex">>,<<"lib/exd/source/adapter">>,
16 + <<"lib/exd/sink/adapter/logger.ex">>,<<"lib/exd/sink/adapter/test.ex">>,
17 + <<"lib/exd/source">>,<<"lib/exd/source.ex">>,<<"lib/exd/source/adapter">>,
19 18 <<"lib/exd/source/adapter.ex">>,<<"lib/exd/source/adapter/crawler.ex">>,
20 19 <<"lib/exd/source/adapter/file.ex">>,<<"lib/exd/source/adapter/list.ex">>,
21 20 <<"lib/exd/store">>,<<"lib/exd/store.ex">>,<<"lib/exd/store/memory.ex">>,
  @@ -24,7 +23,12 @@
24 23 {<<"links">>,[{<<"GitHub">>,<<"https://github.com/madshargreave/exd">>}]}.
25 24 {<<"name">>,<<"exd">>}.
26 25 {<<"requirements">>,
27 - [[{<<"app">>,<<"mustache">>},
26 + [[{<<"app">>,<<"atomic_map">>},
27 + {<<"name">>,<<"atomic_map">>},
28 + {<<"optional">>,false},
29 + {<<"repository">>,<<"hexpm">>},
30 + {<<"requirement">>,<<"~> 0.8">>}],
31 + [{<<"app">>,<<"mustache">>},
28 32 {<<"name">>,<<"mustache">>},
29 33 {<<"optional">>,false},
30 34 {<<"repository">>,<<"hexpm">>},
  @@ -44,4 +48,4 @@
44 48 {<<"optional">>,false},
45 49 {<<"repository">>,<<"hexpm">>},
46 50 {<<"requirement">>,<<"~> 0.20.0">>}]]}.
47 - {<<"version">>,<<"0.1.2">>}.
51 + {<<"version">>,<<"0.1.3">>}.
  @@ -1,11 +1,17 @@
1 1 defimpl Exd.Parseable, for: Map do
2 2 alias Exd.Query
3 3
4 + @plugins %{
5 + "sql" => Exd.Sink.SQL
6 + }
7 +
4 8 def parse(map) do
5 9 query =
6 10 Query.new
7 11 |> parse_from(map)
8 12 |> parse_where(map)
13 + |> parse_select(map)
14 + |> parse_into(map)
9 15 {:ok, query}
10 16 end
11 17
  @@ -49,4 +55,28 @@ defimpl Exd.Parseable, for: Map do
49 55 defp parse_relation("is"), do: :=
50 56 defp parse_relation("is_not"), do: :<>
51 57
58 + defp parse_select(query, %{
59 + "select" => select
60 + }) do
61 + Query.select(query, select)
62 + end
63 +
64 + defp parse_into(query, %{
65 + "into" => %{
66 + "type" => type,
67 + "config" => config
68 + },
69 + }) do
70 + module = parse_into_module(type)
71 + config = parse_into_config(config)
72 + Query.into(query, module, config)
73 + end
74 + defp parse_into(query, _), do: query
75 + defp parse_into_module(name), do: Map.fetch!(@plugins, name)
76 + defp parse_into_config(config) when is_map(config) do
77 + config
78 + |> AtomicMap.convert(%{safe: false})
79 + |> Map.to_list
80 + end
81 +
52 82 end
  @@ -15,6 +15,12 @@ defimpl Exd.Sourceable, for: List do
15 15 def source(list, context) do
16 16 Flow.from_enumerable(list)
17 17 end
18 + # def into([first | _rest] = sinks, flow) when is_tuple(first) do
19 + # sinks
20 + # |> Enum.reduce(flow, fn sink, flow ->
21 + # Exd.Sourceable.into(sink, flow)
22 + # end)
23 + # end
18 24 end
19 25
20 26 defimpl Exd.Sourceable, for: Tuple do
  @@ -42,6 +42,7 @@ defmodule Exd.Query.Builder do
42 42 """
43 43 @spec into(Query.t, term, keyword) :: Query.t
44 44 def into(query, sink, opts \\ []) do
45 + # intos = [{sink, opts} | query.into]
45 46 %Query{query | into: {sink, opts}}
46 47 end
  @@ -32,7 +32,7 @@ defmodule Exd.Sink do
32 32
33 33 @impl true
34 34 def handle_events(events, _from, {adapter, sink_state}) do
35 - adapter.handle_into(events, sink_state)
35 + {:ok, sink_state} = adapter.handle_into(events, sink_state)
36 36 {:noreply, [], {adapter, sink_state}}
37 37 end
Loading more files…