Store datatype in a RDF.Literal.Generic internally as string
Besides being a bit more memory efficient this allows for pattern matching on the datatype of generic literals.
This commit is contained in:
parent
25a0f7443c
commit
0509e4cb2f
2 changed files with 8 additions and 9 deletions
|
@ -33,7 +33,8 @@ defmodule RDF.Literal.Generic do
|
|||
|
||||
defp normalize_datatype(nil), do: nil
|
||||
defp normalize_datatype(""), do: nil
|
||||
defp normalize_datatype(datatype), do: IRI.new(datatype)
|
||||
defp normalize_datatype(%IRI{} = datatype), do: to_string(datatype)
|
||||
defp normalize_datatype(datatype), do: datatype
|
||||
|
||||
@impl Datatype
|
||||
@spec new!(any, String.t | IRI.t | keyword) :: Literal.t
|
||||
|
@ -49,7 +50,7 @@ defmodule RDF.Literal.Generic do
|
|||
|
||||
@impl Datatype
|
||||
def datatype_id(%Literal{literal: literal}), do: datatype_id(literal)
|
||||
def datatype_id(%__MODULE__{} = literal), do: literal.datatype
|
||||
def datatype_id(%__MODULE__{} = literal), do: RDF.iri(literal.datatype)
|
||||
|
||||
@impl Datatype
|
||||
def value(%Literal{literal: literal}), do: value(literal)
|
||||
|
@ -69,7 +70,7 @@ defmodule RDF.Literal.Generic do
|
|||
|
||||
@impl Datatype
|
||||
def valid?(%Literal{literal: %__MODULE__{} = literal}), do: valid?(literal)
|
||||
def valid?(%__MODULE__{datatype: %IRI{}}), do: true
|
||||
def valid?(%__MODULE__{datatype: datatype}) when is_binary(datatype), do: true
|
||||
def valid?(_), do: false
|
||||
|
||||
@doc """
|
||||
|
|
|
@ -12,11 +12,10 @@ defmodule RDF.Literal.GenericTest do
|
|||
describe "new" do
|
||||
test "with value and datatype" do
|
||||
Enum.each @valid, fn {input, {value, datatype}} ->
|
||||
datatype_iri = RDF.iri(datatype)
|
||||
assert %Literal{literal: %Generic{value: ^value, datatype: ^datatype_iri}} =
|
||||
Generic.new(input, datatype: datatype_iri)
|
||||
assert %Literal{literal: %Generic{value: ^value, datatype: ^datatype_iri}} =
|
||||
assert %Literal{literal: %Generic{value: ^value, datatype: ^datatype}} =
|
||||
Generic.new(input, datatype: datatype)
|
||||
assert %Literal{literal: %Generic{value: ^value, datatype: ^datatype}} =
|
||||
Generic.new(input, datatype: RDF.iri(datatype))
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -30,8 +29,7 @@ defmodule RDF.Literal.GenericTest do
|
|||
|
||||
test "with canonicalize opts" do
|
||||
Enum.each @valid, fn {input, {value, datatype}} ->
|
||||
datatype_iri = RDF.iri(datatype)
|
||||
assert %Literal{literal: %Generic{value: ^value, datatype: ^datatype_iri}} =
|
||||
assert %Literal{literal: %Generic{value: ^value, datatype: ^datatype}} =
|
||||
Generic.new(input, datatype: datatype, canonicalize: true)
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue