lib/hui/query/facet_interval.ex

defmodule Hui.Query.FacetInterval do
  @moduledoc """
  Struct related to [interval faceting](http://lucene.apache.org/solr/guide/faceting.html#interval-faceting) query.

  ### Example

      iex> x = %Hui.Query.FacetInterval{interval: "price", set: ["[0,10]", "(10,100]"]}
      %Hui.Query.FacetInterval{
        interval: "price",
        set: ["[0,10]", "(10,100]"],
        per_field: false
      }
      iex> y = %Hui.Query.Facet{interval: x, field: ["type", "year"]}
      %Hui.Query.Facet{
        contains: nil,
        "contains.ignoreCase": nil,
        "enum.cache.minDf": nil,
        excludeTerms: nil,
        exists: nil,
        facet: true,
        field: ["type", "year"],
        interval: %Hui.Query.FacetInterval{
          interval: "price",
          set: ["[0,10]", "(10,100]"],
          per_field: false
        },
        limit: nil,
        matches: nil,
        method: nil,
        mincount: nil,
        missing: nil,
        offset: nil,
        "overrequest.count": nil,
        "overrequest.ratio": nil,
        pivot: nil,
        "pivot.mincount": nil,
        prefix: nil,
        query: nil,
        range: nil,
        sort: nil,
        threads: nil
      }
      iex> y |> Hui.Encoder.encode # render struct into URL query string with `facet` prefixes
      "facet=true&facet.field=type&facet.field=year&facet.interval=price&facet.interval.set=%5B0%2C10%5D&facet.interval.set=%2810%2C100%5D"

  ### Example - per field intervals, f.[fieldname].facet.interval

      iex> x = %Hui.Query.FacetInterval{interval: "price", set: ["[0,10]", "(10,100]"], per_field: true}
      %Hui.Query.FacetInterval{
        interval: "price",
        set: ["[0,10]", "(10,100]"],
        per_field: true
      }
      iex> y = %Hui.Query.Facet{field: "type", interval: x}
      %Hui.Query.Facet{
        contains: nil,
        "contains.ignoreCase": nil,
        "enum.cache.minDf": nil,
        excludeTerms: nil,
        exists: nil,
        facet: true,
        field: "type",
        interval: %Hui.Query.FacetInterval{
          interval: "price",
          set: ["[0,10]", "(10,100]"],
          per_field: true
        },
        limit: nil,
        matches: nil,
        method: nil,
        mincount: nil,
        missing: nil,
        offset: nil,
        "overrequest.count": nil,
        "overrequest.ratio": nil,
        pivot: nil,
        "pivot.mincount": nil,
        prefix: nil,
        query: nil,
        range: nil,
        sort: nil,
        threads: nil
      }
      iex> y |> Hui.Encoder.encode
      "facet=true&facet.field=type&facet.interval=price&f.price.facet.interval.set=%5B0%2C10%5D&f.price.facet.interval.set=%2810%2C100%5D"

  """

  defstruct [:interval, :set, per_field: false]

  @typedoc """
  Struct for interval faceting parameters, use in conjunction with
  the faceting struct - `t:Hui.Query.Facet.t/0`.
  """
  @type t :: %__MODULE__{interval: binary, set: binary | list(binary), per_field: boolean}

  @spec new(binary, binary | list(binary)) :: t
  def new(interval, set \\ nil), do: %__MODULE__{interval: interval, set: set}

  @spec new :: t
  def new(), do: %__MODULE__{}
end