Anko

Anko

Table.Reader for Elasticsearch isn't working :(

I’m trying to write a Table.Reader implementation for Snap.SearchResponse from the snap library (GitHub - breakroom/snap: An Elasticsearch/OpenSearch client for Elixir · GitHub) which talks to elasticsearch

This is what I think it should look like

if Code.ensure_loaded?(Table.Reader) do
  defimpl Table.Reader, for: Snap.SearchResponse do
    def init(result) do
      columns = get_columns(result)
      rows = get_rows(result)
      {:rows, %{columns: columns}, rows}
    end

    defp get_columns(response) do
      if response.hits.hits |> Enum.empty?() do
        []
      else
        hits = response.hits.hits
        hits |> List.first() |> Map.fetch!(:source) |> Map.keys()
      end
    end

    defp get_rows(response) do
      hits = response.hits.hits

      hits
      |> Enum.map(fn hit ->
        hit.source |> Map.values()
      end)
    end
  end
end

and here is an Example Snap.SearchResponse

%Snap.SearchResponse{
  took: 1,
  timed_out: false,
  shards: %{"failed" => 0, "skipped" => 0, "successful" => 1, "total" => 1},
  hits: %Snap.Hits{
    total: %{"relation" => "gte", "value" => 10000},
    max_score: 1.0,
    hits: [
      %Snap.Hit{
        index: "products",
        type: nil,
        id: "BH2lkY0BtfUXFCo5NxOU",
        score: 1.0,
        source: %{
          "Country" => "Myanmar",
          "Item Type" => "Beverages",
          "Order Date" => "5/29/2016",
          "Order ID" => "238846909",
          "Order Priority" => "L",
          "Region" => "Asia",
          "Sales Channel" => "Offline",
          "Ship Date" => "6/15/2016",
          "Total Cost" => "284933.77",
          "Total Profit" => "140360.58",
          "Total Revenue" => "425294.35",
          "Unit Cost" => "31.79",
          "Unit Price" => "47.45",
          "Units Sold" => "8963"
        },
        fields: nil,
        explanation: nil,
        matched_queries: nil,
        highlight: nil,
        inner_hits: nil
      },
      %Snap.Hit{
        index: "products",
        type: nil,
        id: "BX2lkY0BtfUXFCo5NxOU",
        score: 1.0,
        source: %{
          "Country" => "Costa Rica",
          "Item Type" => "Cereal",
          "Order Date" => "2/23/2017",
          "Order ID" => "673583209",
          "Order Priority" => "L",
          "Region" => "Central America and the Caribbean",
          "Sales Channel" => "Online",
          "Ship Date" => "2/26/2017",
          "Total Cost" => "830895.45",
          "Total Profit" => "628546.05",
          "Total Revenue" => "1459441.50",
          "Unit Cost" => "117.11",
          "Unit Price" => "205.70",
          "Units Sold" => "7095"
        },
        fields: nil,
        explanation: nil,
        matched_queries: nil,
        highlight: nil,
        inner_hits: nil
      },
      %Snap.Hit{
        index: "products",
        type: nil,
        id: "Bn2lkY0BtfUXFCo5NxOU",
        score: 1.0,
        source: %{
          "Country" => "Cameroon",
          "Item Type" => "Meat",
          "Order Date" => "7/30/2014",
          "Order ID" => "277272450",
          "Order Priority" => "H",
          "Region" => "Sub-Saharan Africa",
          "Sales Channel" => "Offline",
          "Ship Date" => "8/12/2014",
          "Total Cost" => "3623195.15",
          "Total Profit" => "568282.00",
          "Total Revenue" => "4191477.15",
          "Unit Cost" => "364.69",
          "Unit Price" => "421.89",
          "Units Sold" => "9935"
        },
        fields: nil,
        explanation: nil,
        matched_queries: nil,
        highlight: nil,
        inner_hits: nil
      },
      %Snap.Hit{
        index: "products",
        type: nil,
        id: "B32lkY0BtfUXFCo5NxOU",
        score: 1.0,
        source: %{
          "Country" => "Republic of the Congo",
          "Item Type" => "Clothes",
          "Order Date" => "9/23/2015",
          "Order ID" => "593713462",
          "Order Priority" => "H",
          "Region" => "Sub-Saharan Africa",
          "Sales Channel" => "Online",
          "Ship Date" => "10/7/2015",
          "Total Cost" => "66734.08",
          "Total Profit" => "136745.28",
          "Total Revenue" => "203479.36",
          "Unit Cost" => "35.84",
          "Unit Price" => "109.28",
          "Units Sold" => "1862"
        },
        fields: nil,
        explanation: nil,
        matched_queries: nil,
        highlight: nil,
        inner_hits: nil
      }
    ]
  },
  suggest: nil,
  aggregations: nil,
  scroll_id: nil,
  pit_id: nil
}

so i’ve forked snap, added this code and loaded it in a livebook

{:ok, results} = Snap.Search.search(Elastic, "products", %{query: %{match_all: %{}}})

results

I would expect livebook to show me a data table, but instead it just shows me the full Snap.SearchResponse pasted above. I have tried added IO.puts in the Table.Reader init function but to no avail. Any ideas how i can debug this?

Marked As Solved

jonatanklosko

jonatanklosko

Creator of Livebook

In order for Livebook to render a struct in a special way, it needs to implement the Kino.Render protocol. See kino_db/lib/kino_db.ex at 0de094fcefb2f28a5c413e95ce551adf00dcb5e7 · livebook-dev/kino_db · GitHub for example.

Where Next?

Popular in Questions Top

sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
chrisalley
ExUnit now has describe blocks which is a welcome addition coming from RSpec. In the docs, it states that nested hierarchies of describe ...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
johnnyicon
Hi all, I’ve just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I’m trying to use Postgres...
New
nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New

Other popular topics Top

gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New
saif
Hello everyone, Long time lurker first time poster here. I’ve recently begun working on Elixir full-time again! :raised_hands: It’s been...
New
KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 36128 110
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New
klo
Got a question about when to concat vs. prepending items to list then reversing to achieve appending. So i know lists boil down to [1 | ...
New
joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
Qqwy
Update: How to use the Blogs & Podcasts section You can post links to your blog posts or podcasts either in one of the Official Blog...
3271 126479 1222
New

We're in Beta

About us Mission Statement