From cd5636528fd880edb41c817a8a4f03b98da360dd Mon Sep 17 00:00:00 2001 From: Marcel Otto Date: Tue, 6 Jun 2017 23:35:46 +0200 Subject: [PATCH] core: RDF.Dataset.add, .put and .new support another dataset as input --- lib/rdf/dataset.ex | 22 ++++++++++++++++++++++ test/unit/dataset_test.exs | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/lib/rdf/dataset.ex b/lib/rdf/dataset.ex index 2f7f2da..a59ac66 100644 --- a/lib/rdf/dataset.ex +++ b/lib/rdf/dataset.ex @@ -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 diff --git a/test/unit/dataset_test.exs b/test/unit/dataset_test.exs index c3169ae..b320798 100644 --- a/test/unit/dataset_test.exs +++ b/test/unit/dataset_test.exs @@ -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}),