diff --git a/lib/chart/mapping.ex b/lib/chart/mapping.ex index 865fc00..8bea67f 100644 --- a/lib/chart/mapping.ex +++ b/lib/chart/mapping.ex @@ -142,6 +142,7 @@ defmodule Contex.Mapping do end defp check_required_columns!(expected_mappings, column_map) do + required_mappings = Enum.map(expected_mappings, fn {k, _v} -> k end) provided_mappings = Map.keys(column_map) @@ -159,13 +160,11 @@ defmodule Contex.Mapping do defp confirm_columns_in_dataset!(dataset, column_map) do available_columns = [nil | Dataset.column_names(dataset)] - - missing_columns = Map.values(column_map) |> List.flatten() |> missing_columns(available_columns) - - case missing_columns do + |> Enum.filter(& not is_nil(&1)) + |>case do [] -> :ok @@ -176,8 +175,8 @@ defmodule Contex.Mapping do end defp missing_columns(required_columns, provided_columns) do - MapSet.new(required_columns) - |> MapSet.difference(MapSet.new(provided_columns)) + MapSet.new(provided_columns) + |> MapSet.difference(MapSet.new(required_columns)) |> MapSet.to_list() end diff --git a/lib/chart/pie_chart.ex b/lib/chart/pie_chart.ex index 936e08a..279a070 100644 --- a/lib/chart/pie_chart.ex +++ b/lib/chart/pie_chart.ex @@ -16,6 +16,7 @@ defmodule Contex.PieChart do defstruct [ :dataset, + :total, :mapping, :options, :colour_scale @@ -67,11 +68,13 @@ defmodule Contex.PieChart do options = check_options(options) options = Keyword.merge(@default_options, options) mapping = Mapping.new(@required_mappings, Keyword.get(options, :mapping), dataset) - + val_accessor = dataset |> Dataset.value_fn(mapping.column_map[:value_col]) + total = dataset.data |> Enum.reduce(0, fn col, acc -> val_accessor.(col) + acc end) %PieChart{ dataset: dataset, mapping: mapping, options: options, + total: total, colour_scale: Keyword.get(options, :colour_scale) } end @@ -229,14 +232,13 @@ defmodule Contex.PieChart do end @spec scale_values(PieChart.t()) :: [{value :: number(), label :: any()}] - defp scale_values(%PieChart{dataset: dataset, mapping: mapping}) do + defp scale_values(%PieChart{dataset: dataset, mapping: mapping, total: 0}), do: raise ArithmeticError, message: "[Invalid dataset]#{inspect(dataset.data)} Sum of values should be a non-zero number" + defp scale_values(%PieChart{dataset: dataset, mapping: mapping, total: total}) do val_accessor = dataset |> Dataset.value_fn(mapping.column_map[:value_col]) cat_accessor = dataset |> Dataset.value_fn(mapping.column_map[:category_col]) - sum = dataset.data |> Enum.reduce(0, fn col, acc -> val_accessor.(col) + acc end) - dataset.data - |> Enum.map_reduce(sum, &{{val_accessor.(&1) / &2 * 100, cat_accessor.(&1)}, &2}) + |> Enum.map_reduce(total, &{{val_accessor.(&1) / &2 * 100, cat_accessor.(&1)}, &2}) |> elem(0) end end