defmodule Elastix.Mapping do @moduledoc """ The mapping API is used to define how documents are stored and indexed. [Elastic documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html) """ import Elastix.HTTP, only: [prepare_url: 2] alias Elastix.{HTTP, JSON} @doc """ Creates a new mapping. ## Examples iex> mapping = %{properties: %{user: %{type: "text"}, post_date: %{type: "date"}, message: %{type: "text"}}} iex> Elastix.Mapping.put("http://localhost:9200", "twitter", "tweet", mapping) {:ok, %HTTPoison.Response{...}} """ @spec put( elastic_url :: String.t(), index_names :: String.t() | list, type_name :: String.t(), data :: map, query_params :: Keyword.t() ) :: HTTP.resp() def put(elastic_url, index_names, type_name, data, query_params \\ []) def put(elastic_url, index_names, type_name, data, query_params) when is_list(index_names) do prepare_url(elastic_url, make_path(index_names, [type_name], query_params)) |> HTTP.put(JSON.encode!(data)) end def put(elastic_url, index_name, type_name, data, query_params), do: put(elastic_url, [index_name], type_name, data, query_params) @doc """ Gets info on one or a list of mappings for one or a list of indices. ## Examples iex> Elastix.Mapping.get("http://localhost:9200", "twitter", "tweet") {:ok, %HTTPoison.Response{...}} """ @spec get( elastic_url :: String.t(), index_names :: String.t() | list, query_params :: Keyword.t() ) :: HTTP.resp() def get(elastic_url, index_names, query_params \\ []) def get(elastic_url, index_names, query_params) when is_list(index_names) do prepare_url(elastic_url, make_path(index_names, [], query_params)) |> HTTP.get() end def get(elastic_url, index_name, query_params), do: get(elastic_url, [index_name], query_params) @doc """ Gets info on every mapping. ## Examples iex> Elastix.Mapping.get_all("http://localhost:9200") {:ok, %HTTPoison.Response{...}} """ @spec get_all(elastic_url :: String.t(), query_params :: Keyword.t()) :: HTTP.resp() def get_all(elastic_url, query_params \\ []) do prepare_url(elastic_url, make_all_path(query_params)) |> HTTP.get() end @doc """ Gets info on every given mapping. ## Examples iex> Elastix.Mapping.get_all("http://localhost:9200", ["tweet", "user"]) {:ok, %HTTPoison.Response{...}} """ @spec get_all_with_type( elastic_url :: String.t(), type_names :: String.t() | list, query_params :: Keyword.t() ) :: HTTP.resp() def get_all_with_type(elastic_url, type_names, query_params \\ []) def get_all_with_type(elastic_url, type_names, query_params) when is_list(type_names) do prepare_url(elastic_url, make_all_path(type_names, query_params)) |> HTTP.get() end def get_all_with_type(elastic_url, type_name, query_params), do: get_all_with_type(elastic_url, [type_name], query_params) @doc false def make_path(index_names, type_names, query_params) do index_names = Enum.join(index_names, ",") path = if Enum.any?(type_names) do type_names = Enum.join(type_names, ",") "/#{index_names}/_mapping/#{type_names}" else "/#{index_names}" end case query_params do [] -> path _ -> HTTP.append_query_string(path, query_params) end end @doc false def make_all_path(query_params) do path = "/_mapping" case query_params do [] -> path _ -> HTTP.append_query_string(path, query_params) end end @doc false def make_all_path(type_names, query_params) do type_names = Enum.join(type_names, ",") path = "/#{type_names}" case query_params do [] -> path _ -> HTTP.append_query_string(path, query_params) end end end