@ -429,33 +429,88 @@ impl From<EncodedTriple> for EncodedTerm {
}
}
impl From < NamedNodeRef < ' _ > > for EncodedTerm {
fn from ( named_node : NamedNodeRef < ' _ > ) -> Self {
Self ::NamedNode {
iri_id : StrHash ::new ( named_node . as_str ( ) ) ,
#[ derive(Eq, PartialEq, Debug, Clone, Hash) ]
pub struct EncodedTriple {
pub subject : EncodedTerm ,
pub predicate : EncodedTerm ,
pub object : EncodedTerm ,
}
impl EncodedTriple {
pub fn new ( subject : EncodedTerm , predicate : EncodedTerm , object : EncodedTerm ) -> Self {
Self {
subject ,
predicate ,
object ,
}
}
}
impl From < BlankNodeRef < ' _ > > for EncodedTerm {
fn from ( blank_node : BlankNodeRef < ' _ > ) -> Self {
#[ derive(Eq, PartialEq, Debug, Clone, Hash) ]
pub struct EncodedQuad {
pub subject : EncodedTerm ,
pub predicate : EncodedTerm ,
pub object : EncodedTerm ,
pub graph_name : EncodedTerm ,
}
impl EncodedQuad {
pub fn new (
subject : EncodedTerm ,
predicate : EncodedTerm ,
object : EncodedTerm ,
graph_name : EncodedTerm ,
) -> Self {
Self {
subject ,
predicate ,
object ,
graph_name ,
}
}
}
pub struct TermEncoder { }
impl TermEncoder {
pub fn new ( ) -> Self {
Self { }
}
pub fn encode_term < ' a > ( & self , term : impl Into < TermRef < ' a > > ) -> EncodedTerm {
match term . into ( ) {
TermRef ::NamedNode ( named_node ) = > self . encode_named_node ( named_node ) ,
TermRef ::BlankNode ( blank_node ) = > self . encode_blank_node ( blank_node ) ,
TermRef ::Literal ( literal ) = > self . encode_literal ( literal ) ,
TermRef ::Triple ( triple ) = > self . encode_triple ( triple . as_ref ( ) ) . into ( ) ,
}
}
#[ allow(clippy::unused_self) ]
fn encode_named_node ( & self , named_node : NamedNodeRef < ' _ > ) -> EncodedTerm {
EncodedTerm ::NamedNode {
iri_id : StrHash ::new ( named_node . as_str ( ) ) ,
}
}
#[ allow(clippy::unused_self) ]
fn encode_blank_node ( & self , blank_node : BlankNodeRef < ' _ > ) -> EncodedTerm {
if let Some ( id ) = blank_node . unique_id ( ) {
Self ::NumericalBlankNode { id }
EncodedTerm ::NumericalBlankNode { id }
} else {
let id = blank_node . as_str ( ) ;
if let Ok ( id ) = id . try_into ( ) {
Self ::SmallBlankNode ( id )
EncodedTerm ::SmallBlankNode ( id )
} else {
Self ::BigBlankNode {
EncodedTerm ::BigBlankNode {
id_id : StrHash ::new ( id ) ,
}
}
}
}
}
impl From < LiteralRef < ' _ > > for EncodedTerm {
fn from ( literal : LiteralRef < ' _ > ) -> Self {
#[ allow(clippy::unused_self) ]
fn encode_literal ( & self , literal : LiteralRef < ' _ > ) -> EncodedTerm {
let value = literal . value ( ) ;
let datatype = literal . datatype ( ) . as_str ( ) ;
let native_encoding = match datatype {
@ -463,20 +518,20 @@ impl From<LiteralRef<'_>> for EncodedTerm {
literal . language ( ) . map ( | language | {
if let Ok ( value ) = SmallString ::try_from ( value ) {
if let Ok ( language ) = SmallString ::try_from ( language ) {
Self ::SmallSmallLangStringLiteral { value , language }
EncodedTerm ::SmallSmallLangStringLiteral { value , language }
} else {
Self ::SmallBigLangStringLiteral {
EncodedTerm ::SmallBigLangStringLiteral {
value ,
language_id : StrHash ::new ( language ) ,
}
}
} else if let Ok ( language ) = SmallString ::try_from ( language ) {
Self ::BigSmallLangStringLiteral {
EncodedTerm ::BigSmallLangStringLiteral {
value_id : StrHash ::new ( value ) ,
language ,
}
} else {
Self ::BigBigLangStringLiteral {
EncodedTerm ::BigBigLangStringLiteral {
value_id : StrHash ::new ( value ) ,
language_id : StrHash ::new ( language ) ,
}
@ -487,9 +542,9 @@ impl From<LiteralRef<'_>> for EncodedTerm {
"http://www.w3.org/2001/XMLSchema#string" = > {
let value = value ;
Some ( if let Ok ( value ) = SmallString ::try_from ( value ) {
Self ::SmallStringLiteral ( value )
EncodedTerm ::SmallStringLiteral ( value )
} else {
Self ::BigStringLiteral {
EncodedTerm ::BigStringLiteral {
value_id : StrHash ::new ( value ) ,
}
} )
@ -532,12 +587,12 @@ impl From<LiteralRef<'_>> for EncodedTerm {
Some ( term ) = > term ,
None = > {
if let Ok ( value ) = SmallString ::try_from ( value ) {
Self ::SmallTypedLiteral {
EncodedTerm ::SmallTypedLiteral {
value ,
datatype_id : StrHash ::new ( datatype ) ,
}
} else {
Self ::BigTypedLiteral {
EncodedTerm ::BigTypedLiteral {
value_id : StrHash ::new ( value ) ,
datatype_id : StrHash ::new ( datatype ) ,
}
@ -545,112 +600,30 @@ impl From<LiteralRef<'_>> for EncodedTerm {
}
}
}
}
impl From < NamedOrBlankNodeRef < ' _ > > for EncodedTerm {
fn from ( term : NamedOrBlankNodeRef < ' _ > ) -> Self {
match term {
NamedOrBlankNodeRef ::NamedNode ( named_node ) = > named_node . into ( ) ,
NamedOrBlankNodeRef ::BlankNode ( blank_node ) = > blank_node . into ( ) ,
}
}
}
impl From < SubjectRef < ' _ > > for EncodedTerm {
fn from ( term : SubjectRef < ' _ > ) -> Self {
match term {
SubjectRef ::NamedNode ( named_node ) = > named_node . into ( ) ,
SubjectRef ::BlankNode ( blank_node ) = > blank_node . into ( ) ,
SubjectRef ::Triple ( triple ) = > triple . as_ref ( ) . into ( ) ,
pub fn encode_graph_name < ' a > ( & self , name : impl Into < GraphNameRef < ' a > > ) -> EncodedTerm {
match name . into ( ) {
GraphNameRef ::NamedNode ( named_node ) = > self . encode_named_node ( named_node ) ,
GraphNameRef ::BlankNode ( blank_node ) = > self . encode_blank_node ( blank_node ) ,
GraphNameRef ::DefaultGraph = > EncodedTerm ::DefaultGraph ,
}
}
}
impl From < TermRef < ' _ > > for EncodedTerm {
fn from ( term : TermRef < ' _ > ) -> Self {
match term {
TermRef ::NamedNode ( named_node ) = > named_node . into ( ) ,
TermRef ::BlankNode ( blank_node ) = > blank_node . into ( ) ,
TermRef ::Literal ( literal ) = > literal . into ( ) ,
TermRef ::Triple ( triple ) = > triple . as_ref ( ) . into ( ) ,
fn encode_triple ( & self , triple : TripleRef < ' _ > ) -> EncodedTriple {
EncodedTriple {
subject : self . encode_term ( triple . subject ) ,
predicate : self . encode_term ( triple . predicate ) ,
object : self . encode_term ( triple . object ) ,
}
}
}
impl From < GraphNameRef < ' _ > > for EncodedTerm {
fn from ( name : GraphNameRef < ' _ > ) -> Self {
match name {
GraphNameRef ::NamedNode ( named_node ) = > named_node . into ( ) ,
GraphNameRef ::BlankNode ( blank_node ) = > blank_node . into ( ) ,
GraphNameRef ::DefaultGraph = > Self ::DefaultGraph ,
}
}
}
impl From < TripleRef < ' _ > > for EncodedTerm {
fn from ( triple : TripleRef < ' _ > ) -> Self {
Self ::Triple ( Rc ::new ( triple . into ( ) ) )
}
}
#[ derive(Eq, PartialEq, Debug, Clone, Hash) ]
pub struct EncodedTriple {
pub subject : EncodedTerm ,
pub predicate : EncodedTerm ,
pub object : EncodedTerm ,
}
impl EncodedTriple {
pub fn new ( subject : EncodedTerm , predicate : EncodedTerm , object : EncodedTerm ) -> Self {
Self {
subject ,
predicate ,
object ,
}
}
}
impl From < TripleRef < ' _ > > for EncodedTriple {
fn from ( triple : TripleRef < ' _ > ) -> Self {
Self {
subject : triple . subject . into ( ) ,
predicate : triple . predicate . into ( ) ,
object : triple . object . into ( ) ,
}
}
}
#[ derive(Eq, PartialEq, Debug, Clone, Hash) ]
pub struct EncodedQuad {
pub subject : EncodedTerm ,
pub predicate : EncodedTerm ,
pub object : EncodedTerm ,
pub graph_name : EncodedTerm ,
}
impl EncodedQuad {
pub fn new (
subject : EncodedTerm ,
predicate : EncodedTerm ,
object : EncodedTerm ,
graph_name : EncodedTerm ,
) -> Self {
Self {
subject ,
predicate ,
object ,
graph_name ,
}
}
}
impl From < QuadRef < ' _ > > for EncodedQuad {
fn from ( quad : QuadRef < ' _ > ) -> Self {
Self {
subject : quad . subject . into ( ) ,
predicate : quad . predicate . into ( ) ,
object : quad . object . into ( ) ,
graph_name : quad . graph_name . into ( ) ,
pub fn encode_quad < ' a > ( & self , quad : impl Into < QuadRef < ' a > > ) -> EncodedQuad {
let quad = quad . into ( ) ;
EncodedQuad {
subject : self . encode_term ( quad . subject ) ,
predicate : self . encode_term ( quad . predicate ) ,
object : self . encode_term ( quad . object ) ,
graph_name : self . encode_graph_name ( quad . graph_name ) ,
}
}
}
@ -819,10 +792,95 @@ pub fn parse_day_time_duration_str(value: &str) -> Option<EncodedTerm> {
value . parse ( ) . map ( EncodedTerm ::DayTimeDurationLiteral ) . ok ( )
}
pub trait Decoder : StrLookup {
fn decode_term ( & self , encoded : & EncodedTerm ) -> Result < Term , StorageError > ;
pub struct TermDecoder < ' a , S : StrLookup > {
lookup : & ' a S ,
}
impl < ' a , S : StrLookup > TermDecoder < ' a , S > {
pub fn new ( lookup : & ' a S ) -> Self {
Self { lookup }
}
pub fn decode_term ( & self , encoded : & EncodedTerm ) -> Result < Term , StorageError > {
match encoded {
EncodedTerm ::DefaultGraph = > {
Err ( CorruptionError ::msg ( "The default graph tag is not a valid term" ) . into ( ) )
}
EncodedTerm ::NamedNode { iri_id } = > {
Ok ( NamedNode ::new_unchecked ( get_required_str ( self . lookup , iri_id ) ? ) . into ( ) )
}
EncodedTerm ::NumericalBlankNode { id } = > Ok ( BlankNode ::new_from_unique_id ( * id ) . into ( ) ) ,
EncodedTerm ::SmallBlankNode ( id ) = > Ok ( BlankNode ::new_unchecked ( id . as_str ( ) ) . into ( ) ) ,
EncodedTerm ::BigBlankNode { id_id } = > {
Ok ( BlankNode ::new_unchecked ( get_required_str ( self . lookup , id_id ) ? ) . into ( ) )
}
EncodedTerm ::SmallStringLiteral ( value ) = > {
Ok ( Literal ::new_simple_literal ( * value ) . into ( ) )
}
EncodedTerm ::BigStringLiteral { value_id } = > {
Ok ( Literal ::new_simple_literal ( get_required_str ( self . lookup , value_id ) ? ) . into ( ) )
}
EncodedTerm ::SmallSmallLangStringLiteral { value , language } = > {
Ok ( Literal ::new_language_tagged_literal_unchecked ( * value , * language ) . into ( ) )
}
EncodedTerm ::SmallBigLangStringLiteral { value , language_id } = > {
Ok ( Literal ::new_language_tagged_literal_unchecked (
* value ,
get_required_str ( self . lookup , language_id ) ? ,
)
. into ( ) )
}
EncodedTerm ::BigSmallLangStringLiteral { value_id , language } = > {
Ok ( Literal ::new_language_tagged_literal_unchecked (
get_required_str ( self . lookup , value_id ) ? ,
* language ,
)
. into ( ) )
}
EncodedTerm ::BigBigLangStringLiteral {
value_id ,
language_id ,
} = > Ok ( Literal ::new_language_tagged_literal_unchecked (
get_required_str ( self . lookup , value_id ) ? ,
get_required_str ( self . lookup , language_id ) ? ,
)
. into ( ) ) ,
EncodedTerm ::SmallTypedLiteral { value , datatype_id } = > {
Ok ( Literal ::new_typed_literal (
* value ,
NamedNode ::new_unchecked ( get_required_str ( self . lookup , datatype_id ) ? ) ,
)
. into ( ) )
}
EncodedTerm ::BigTypedLiteral {
value_id ,
datatype_id ,
} = > Ok ( Literal ::new_typed_literal (
get_required_str ( self . lookup , value_id ) ? ,
NamedNode ::new_unchecked ( get_required_str ( self . lookup , datatype_id ) ? ) ,
)
. into ( ) ) ,
EncodedTerm ::BooleanLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::FloatLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::DoubleLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::IntegerLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::DecimalLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::DateTimeLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::DateLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::TimeLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::GYearMonthLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::GYearLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::GMonthDayLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::GDayLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::GMonthLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::DurationLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::YearMonthDurationLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::DayTimeDurationLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::Triple ( triple ) = > Ok ( self . decode_triple ( triple ) ? . into ( ) ) ,
}
}
fn decode_subject ( & self , encoded : & EncodedTerm ) -> Result < Subject , StorageError > {
pub fn decode_subject ( & self , encoded : & EncodedTerm ) -> Result < Subject , StorageError > {
match self . decode_term ( encoded ) ? {
Term ::NamedNode ( named_node ) = > Ok ( named_node . into ( ) ) ,
Term ::BlankNode ( blank_node ) = > Ok ( blank_node . into ( ) ) ,
@ -834,7 +892,7 @@ pub trait Decoder: StrLookup {
}
}
fn decode_named_or_blank_node (
pub fn decode_named_or_blank_node (
& self ,
encoded : & EncodedTerm ,
) -> Result < NamedOrBlankNode , StorageError > {
@ -852,7 +910,7 @@ pub trait Decoder: StrLookup {
}
}
fn decode_named_node ( & self , encoded : & EncodedTerm ) -> Result < NamedNode , StorageError > {
pub fn decode_named_node ( & self , encoded : & EncodedTerm ) -> Result < NamedNode , StorageError > {
match self . decode_term ( encoded ) ? {
Term ::NamedNode ( named_node ) = > Ok ( named_node ) ,
Term ::BlankNode ( _ ) = > Err ( CorruptionError ::msg (
@ -868,7 +926,7 @@ pub trait Decoder: StrLookup {
}
}
fn decode_triple ( & self , encoded : & EncodedTriple ) -> Result < Triple , StorageError > {
pub fn decode_triple ( & self , encoded : & EncodedTriple ) -> Result < Triple , StorageError > {
Ok ( Triple ::new (
self . decode_subject ( & encoded . subject ) ? ,
self . decode_named_node ( & encoded . predicate ) ? ,
@ -876,7 +934,7 @@ pub trait Decoder: StrLookup {
) )
}
fn decode_quad ( & self , encoded : & EncodedQuad ) -> Result < Quad , StorageError > {
pub fn decode_quad ( & self , encoded : & EncodedQuad ) -> Result < Quad , StorageError > {
Ok ( Quad ::new (
self . decode_subject ( & encoded . subject ) ? ,
self . decode_named_node ( & encoded . predicate ) ? ,
@ -903,87 +961,6 @@ pub trait Decoder: StrLookup {
}
}
impl < S : StrLookup > Decoder for S {
fn decode_term ( & self , encoded : & EncodedTerm ) -> Result < Term , StorageError > {
match encoded {
EncodedTerm ::DefaultGraph = > {
Err ( CorruptionError ::msg ( "The default graph tag is not a valid term" ) . into ( ) )
}
EncodedTerm ::NamedNode { iri_id } = > {
Ok ( NamedNode ::new_unchecked ( get_required_str ( self , iri_id ) ? ) . into ( ) )
}
EncodedTerm ::NumericalBlankNode { id } = > Ok ( BlankNode ::new_from_unique_id ( * id ) . into ( ) ) ,
EncodedTerm ::SmallBlankNode ( id ) = > Ok ( BlankNode ::new_unchecked ( id . as_str ( ) ) . into ( ) ) ,
EncodedTerm ::BigBlankNode { id_id } = > {
Ok ( BlankNode ::new_unchecked ( get_required_str ( self , id_id ) ? ) . into ( ) )
}
EncodedTerm ::SmallStringLiteral ( value ) = > {
Ok ( Literal ::new_simple_literal ( * value ) . into ( ) )
}
EncodedTerm ::BigStringLiteral { value_id } = > {
Ok ( Literal ::new_simple_literal ( get_required_str ( self , value_id ) ? ) . into ( ) )
}
EncodedTerm ::SmallSmallLangStringLiteral { value , language } = > {
Ok ( Literal ::new_language_tagged_literal_unchecked ( * value , * language ) . into ( ) )
}
EncodedTerm ::SmallBigLangStringLiteral { value , language_id } = > {
Ok ( Literal ::new_language_tagged_literal_unchecked (
* value ,
get_required_str ( self , language_id ) ? ,
)
. into ( ) )
}
EncodedTerm ::BigSmallLangStringLiteral { value_id , language } = > {
Ok ( Literal ::new_language_tagged_literal_unchecked (
get_required_str ( self , value_id ) ? ,
* language ,
)
. into ( ) )
}
EncodedTerm ::BigBigLangStringLiteral {
value_id ,
language_id ,
} = > Ok ( Literal ::new_language_tagged_literal_unchecked (
get_required_str ( self , value_id ) ? ,
get_required_str ( self , language_id ) ? ,
)
. into ( ) ) ,
EncodedTerm ::SmallTypedLiteral { value , datatype_id } = > {
Ok ( Literal ::new_typed_literal (
* value ,
NamedNode ::new_unchecked ( get_required_str ( self , datatype_id ) ? ) ,
)
. into ( ) )
}
EncodedTerm ::BigTypedLiteral {
value_id ,
datatype_id ,
} = > Ok ( Literal ::new_typed_literal (
get_required_str ( self , value_id ) ? ,
NamedNode ::new_unchecked ( get_required_str ( self , datatype_id ) ? ) ,
)
. into ( ) ) ,
EncodedTerm ::BooleanLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::FloatLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::DoubleLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::IntegerLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::DecimalLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::DateTimeLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::DateLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::TimeLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::GYearMonthLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::GYearLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::GMonthDayLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::GDayLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::GMonthLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::DurationLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::YearMonthDurationLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::DayTimeDurationLiteral ( value ) = > Ok ( Literal ::from ( * value ) . into ( ) ) ,
EncodedTerm ::Triple ( triple ) = > Ok ( self . decode_triple ( triple ) ? . into ( ) ) ,
}
}
}
fn get_required_str < L : StrLookup > ( lookup : & L , id : & StrHash ) -> Result < String , StorageError > {
Ok ( lookup . get_str ( id ) ? . ok_or_else ( | | {
CorruptionError ::new ( format! (