Current section
Files
Jump to
Current section
Files
lib/enum/enum_like_sql_util.ex
defmodule ServicexUtils.Enum.EnumLikeSqlUtil do
def group_by(maps, group_by_key_list) do
maps
|> Enum.group_by(fn(map) ->
group_by_key_list
|> Enum.map(fn(key) -> map[key] end)
end)
|> Map.to_list()
|> Enum.map(fn(group_by_result) ->
{group_value_list, maps} = group_by_result
group_by_keys_map = Enum.zip(group_by_key_list, group_value_list) |> Enum.into(%{})
{group_by_keys_map, maps}
end)
end
def sum(group_by_results, sum_key_list) do
initial_result = sum_key_list
|> Enum.reduce(%{}, fn(key, initial_result) -> Map.put(initial_result, key, 0) end)
sum_result_maps = group_by_results
|> Enum.map(fn(group_by_result) ->
{group_by_keys_map, maps} = group_by_result
sum_result_map = maps
|> Enum.reduce(initial_result, fn(map, result_map) ->
sum_tmp_map = sum_key_list
|> Enum.reduce(result_map, fn(key, tmp_map) ->
Map.put(tmp_map, key, tmp_map[key] + map[key])
end)
end)
Map.merge(group_by_keys_map, sum_result_map)
end)
end
# [
# {%{"item_id" => 1}, %{all_count: 1, picked_date: 0, picking_id: 3, status: 1}},
# {%{"item_id" => 2}, %{all_count: 1, picked_date: 0, picking_id: 3, status: 1}}
# ]
# %{all_count: group_by_resultsのkey毎の総件数
def count(group_by_results, count_key_list \\ []) do
# [%{picking_id: 4, shipping_id: 5}, %{*: 5}]
initial_result = count_key_list
|> Enum.reduce(%{}, fn(key, initial_result) -> Map.put(initial_result, key, 0) end)
count_result_maps = group_by_results
|> Enum.map(fn(group_by_result) ->
{group_by_keys_map, maps} = group_by_result
# 件数をカウント
# *の件数(mapの単純な総件数)
all_count = maps
|> Enum.count()
count_map = %{all_count: all_count}
# 指定カラムのnot nullの件数(SQL仕様)
col_count_map = count_key_list
|> Enum.reduce(count_map, fn(count_key, count_map) ->
col_count = maps
|> Enum.count(fn(map) -> map[count_key] != nil end)
Map.put(count_map, count_key, col_count)
end)
count_map = count_map
|> Map.merge(col_count_map)
{group_by_keys_map, count_map}
end)
end
end