Skip to content

Commit

Permalink
Convert dating type in mapper
Browse files Browse the repository at this point in the history
  • Loading branch information
tkleinke committed Jan 24, 2024
1 parent d60b48b commit da61b1f
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 16 deletions.
2 changes: 1 addition & 1 deletion web/api/lib/worker/indexer.ex
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ defmodule Api.Worker.Indexer do
IdaiFieldDb.fetch_changes(project)
|> Enum.filter(&filter_non_owned_document/1)
|> Enum.map(&Mapper.rename_type_to_category/1)
|> Enum.map(Mapper.process)
|> Enum.map(Mapper.process(configuration))
|> Enum.filter(&filter_configuration_document/1)
|> log_finished("mapping", project)
|> Enricher.process(project, IdaiFieldDb.get_doc(project), configuration)
Expand Down
37 changes: 33 additions & 4 deletions web/api/lib/worker/mapper.ex
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
defmodule Api.Worker.Mapper do
alias Api.Core.CategoryTreeList
alias Api.Core.ProjectConfig

def process, do: fn change -> process(change) end
def process(change = %{ doc: %{ resource: %{ category: "Project" }}}) do
def process(configuration), do: fn change -> process(change, configuration) end
def process(change = %{ doc: %{ resource: %{ category: "Project" }}}, _) do
id = change.doc.resource.identifier
change = put_in(change.doc.resource.id, id)
put_in(change.id, id)
|> rename_type_to_category
end
def process(change = %{ deleted: true }), do: change
def process(change) do
def process(change = %{ deleted: true }, _), do: change
def process(change, configuration) do
change
|> rename_type_to_category
|> convert_period
|> convert_dating_fields(configuration)
end

def rename_type_to_category(change = %{ doc: %{ resource: %{ type: _ } }}) do
Expand All @@ -36,4 +39,30 @@ defmodule Api.Worker.Mapper do
change
end
end

defp convert_dating_fields(change = %{ doc: %{ resource: resource }}, configuration) do
category_definition = CategoryTreeList.find_by_name(resource.category, configuration)
converted_resource = Enum.reduce(resource, %{}, convert_dating_field(category_definition))
|> Enum.into(%{})
put_in(change, [:doc, :resource], converted_resource)
end

defp convert_dating_field(category_definition) do
fn field, resource -> convert_dating_field(resource, field, get_field_definition(field, category_definition)) end
end
defp convert_dating_field(resource, { field_name, dating_entries }, %{ inputType: "dating" }) do
put_in(resource[field_name], Enum.map(dating_entries, &convert_dating_entry(&1)))
end
defp convert_dating_field(resource, { field_name, field_value }, _) do
put_in(resource[field_name], field_value)
end

defp get_field_definition({ field_name, _}, category_definition) do
ProjectConfig.get_field_definition(category_definition.groups, field_name)
end

defp convert_dating_entry(dating_entry = %{ "type" => "exact" }) do
put_in(dating_entry, ["type"], "single")
end
defp convert_dating_entry(dating_entry), do: dating_entry
end
63 changes: 52 additions & 11 deletions web/api/test/unit/worker/mapper_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,14 @@ defmodule Api.Worker.MapperTest do
use Plug.Test

test "convert type to category" do
change = %{ doc: %{ resource: %{ type: "abc" }}}
%{ doc: %{ resource: resource }} = Mapper.process change
start_supervised({Api.Core.ProjectConfigLoader, {["test-project"]}})
configuration = Api.Core.ProjectConfigLoader.get("test-project")

change = %{ doc: %{ resource: %{ type: "Operation" }}}
%{ doc: %{ resource: resource }} = Mapper.process(change, configuration)

assert resource[:type] == nil
assert resource.category == "abc"
assert resource.category == "Operation"
end

test "convert Project category document" do
Expand All @@ -19,7 +22,9 @@ defmodule Api.Worker.MapperTest do
identifier: "Proj-A",
id: "id-A"
}}}
%{id: change_id, doc: %{ resource: resource }} = change |> Mapper.rename_type_to_category |> Mapper.process
%{id: change_id, doc: %{ resource: resource }} = change
|> Mapper.rename_type_to_category
|> Mapper.process(nil)

assert resource.category == "Project"
assert resource.id == "Proj-A"
Expand All @@ -28,43 +33,79 @@ defmodule Api.Worker.MapperTest do

test "leave deletion unchanged" do
change = %{ deleted: true }
result = Mapper.process change
result = Mapper.process(change, nil)

assert result == %{ deleted: true }
end

test "convert old style period field - period is string" do
start_supervised({Api.Core.ProjectConfigLoader, {["test-project"]}})
configuration = Api.Core.ProjectConfigLoader.get("test-project")

change = %{ doc: %{ resource: %{
:type => "abc",
:type => "Operation",
"period" => "start"
}}}
%{ doc: %{ resource: resource }} = Mapper.process change
%{ doc: %{ resource: resource }} = Mapper.process(change, configuration)

assert resource["period"] == %{ "value" => "start" }
end

test "convert old style period field - period and periodEnd as strings" do
start_supervised({Api.Core.ProjectConfigLoader, {["test-project"]}})
configuration = Api.Core.ProjectConfigLoader.get("test-project")

change = %{ doc: %{ resource: %{
:type => "abc",
:type => "Operation",
"period" => "start",
"periodEnd" => "end"
}}}
%{ doc: %{ resource: resource }} = Mapper.process change
%{ doc: %{ resource: resource }} = Mapper.process(change, configuration)

assert resource["periodEnd"] == nil
assert resource["period"] == %{ "value" => "start", "endValue" => "end" }
end

test "new style period field - leave unchanged" do
start_supervised({Api.Core.ProjectConfigLoader, {["test-project"]}})
configuration = Api.Core.ProjectConfigLoader.get("test-project")

change = %{ doc: %{ resource: %{
:type => "abc",
:type => "Operation",
"period" => %{
"value" => "start",
"endValue" => "end"
}
}}}
%{ doc: %{ resource: resource }} = Mapper.process change
%{ doc: %{ resource: resource }} = Mapper.process(change, configuration)

assert resource["period"] == %{ "value" => "start", "endValue" => "end" }
end

test "convert dating type" do
start_supervised({Api.Core.ProjectConfigLoader, {["test-project"]}})
configuration = Api.Core.ProjectConfigLoader.get("test-project")

change = %{ doc: %{ resource: %{
:type => "Operation",
"dating" => [%{
"type" => "exact",
"end" => %{
"year" => -1,
"inputYear" => 1,
"inputType" => "bce"
}
}]
} } }
%{ doc: %{ resource: resource }} = Mapper.process(change, configuration)

assert Enum.at(resource["dating"], 0) == %{
"type" => "single",
"end" => %{
"year" => -1,
"inputYear" => 1,
"inputType" => "bce"
}
}
end
end

0 comments on commit da61b1f

Please sign in to comment.