core: RDF.Dataset.add, .put and .new support another dataset as input

This commit is contained in:
Marcel Otto 2017-06-06 23:35:46 +02:00
parent 232e2ac765
commit cd5636528f
2 changed files with 60 additions and 0 deletions

View file

@ -44,6 +44,11 @@ defmodule RDF.Dataset do
def new(%RDF.Graph{} = graph),
do: new() |> add(graph, graph.name)
@doc """
Creates an unnamed `RDF.Dataset` from another `RDF.Dataset`.
"""
def new(%RDF.Dataset{graphs: graphs}),
do: %RDF.Dataset{graphs: graphs}
@doc """
Creates an empty named `RDF.Dataset`.
@ -75,6 +80,11 @@ defmodule RDF.Dataset do
def new(name, %RDF.Graph{} = graph),
do: new(name) |> add(graph, graph.name)
@doc """
Creates a named `RDF.Dataset` from another `RDF.Dataset`.
"""
def new(name, %RDF.Dataset{graphs: graphs}),
do: %RDF.Dataset{new(name) | graphs: graphs}
@doc """
@ -135,6 +145,12 @@ defmodule RDF.Dataset do
end
end
def add(%RDF.Dataset{} = dataset, %RDF.Dataset{} = other_dataset, _) do
Enum.reduce graphs(other_dataset), dataset, fn (graph, dataset) ->
add(dataset, graph)
end
end
@doc """
Adds statements to a `RDF.Dataset` and overwrites all existing statements with the same subjects and predicates in the specified graph context.
@ -228,6 +244,12 @@ defmodule RDF.Dataset do
end
end
def put(%RDF.Dataset{} = dataset, %RDF.Dataset{} = other_dataset, _) do
Enum.reduce graphs(other_dataset), dataset, fn (graph, dataset) ->
put(dataset, graph)
end
end
def put(%RDF.Dataset{} = dataset, statements, graph_context)
when is_map(statements) do
with graph_context = convert_graph_name(graph_context) do

View file

@ -257,6 +257,44 @@ defmodule RDF.DatasetTest do
assert dataset_includes_statement?(ds, {EX.Subject1, EX.predicate2, EX.Object3, EX.Graph})
end
test "an unnamed Dataset" do
ds = Dataset.add(dataset(), Dataset.new([
{EX.Subject1, EX.predicate1, EX.Object1},
{EX.Subject1, EX.predicate2, EX.Object2},
]))
assert ds.name == nil
assert dataset_includes_statement?(ds, {EX.Subject1, EX.predicate1, EX.Object1})
assert dataset_includes_statement?(ds, {EX.Subject1, EX.predicate2, EX.Object2})
ds = Dataset.add(ds, Dataset.new({EX.Subject1, EX.predicate2, EX.Object3}))
ds = Dataset.add(ds, Dataset.new({EX.Subject1, EX.predicate2, EX.Object3, EX.Graph}))
assert ds.name == nil
assert Enum.count(ds) == 4
assert dataset_includes_statement?(ds, {EX.Subject1, EX.predicate1, EX.Object1})
assert dataset_includes_statement?(ds, {EX.Subject1, EX.predicate2, EX.Object2})
assert dataset_includes_statement?(ds, {EX.Subject1, EX.predicate2, EX.Object3})
assert dataset_includes_statement?(ds, {EX.Subject1, EX.predicate2, EX.Object3, EX.Graph})
end
test "a named Dataset" do
ds = Dataset.add(named_dataset(), Dataset.new(EX.DS1, [
{EX.Subject1, EX.predicate1, EX.Object1},
{EX.Subject1, EX.predicate2, EX.Object2},
]))
assert ds.name == uri(EX.DatasetName)
assert dataset_includes_statement?(ds, {EX.Subject1, EX.predicate1, EX.Object1})
assert dataset_includes_statement?(ds, {EX.Subject1, EX.predicate2, EX.Object2})
ds = Dataset.add(ds, Dataset.new(EX.DS2, {EX.Subject1, EX.predicate2, EX.Object3}))
ds = Dataset.add(ds, Dataset.new(EX.DS2, {EX.Subject1, EX.predicate2, EX.Object3, EX.Graph}))
assert ds.name == uri(EX.DatasetName)
assert Enum.count(ds) == 4
assert dataset_includes_statement?(ds, {EX.Subject1, EX.predicate1, EX.Object1})
assert dataset_includes_statement?(ds, {EX.Subject1, EX.predicate2, EX.Object2})
assert dataset_includes_statement?(ds, {EX.Subject1, EX.predicate2, EX.Object3})
assert dataset_includes_statement?(ds, {EX.Subject1, EX.predicate2, EX.Object3, EX.Graph})
end
test "a list of Descriptions" do
ds = Dataset.add(dataset(), [
Description.new({EX.Subject1, EX.predicate1, EX.Object1}),