Skip to content

Commit beca833

Browse files
author
Marco De Salvo
committed
Transform RDFHashedQuadruple in a value type
1 parent 6522bb0 commit beca833

File tree

4 files changed

+24
-93
lines changed

4 files changed

+24
-93
lines changed

RDFSharp/Model/RDFGraph.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ public List<RDFTriple> SelectTriples(RDFResource s=null, RDFResource p=null, RDF
290290
_ => [.. Index.Hashes.Values]
291291
};
292292

293-
//Decompress hashed triples
293+
//Decompress hashes
294294
return hashes!.ConvertAll(ht => new RDFTriple(ht, Index));
295295
}
296296

RDFSharp/Store/Engines/RDFMemoryStore.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ public IEnumerator<RDFQuadruple> QuadruplesEnumerator
4848
{
4949
get
5050
{
51-
foreach (RDFHashedQuadruple hashedQuadruple in Index.Hashes.Values)
51+
foreach ((_, long cid, long sid, long pid, long oid, byte tfv) in Index.Hashes.Values)
5252
{
53-
yield return hashedQuadruple.TripleFlavor == 1 //SPO
54-
? new RDFQuadruple(Index.Contexts[hashedQuadruple.ContextID], Index.Resources[hashedQuadruple.SubjectID], Index.Resources[hashedQuadruple.PredicateID], Index.Resources[hashedQuadruple.ObjectID])
55-
: new RDFQuadruple(Index.Contexts[hashedQuadruple.ContextID], Index.Resources[hashedQuadruple.SubjectID], Index.Resources[hashedQuadruple.PredicateID], Index.Literals[hashedQuadruple.ObjectID]);
53+
yield return tfv == 1 //SPO
54+
? new RDFQuadruple(Index.Contexts[cid], Index.Resources[sid], Index.Resources[pid], Index.Resources[oid])
55+
: new RDFQuadruple(Index.Contexts[cid], Index.Resources[sid], Index.Resources[pid], Index.Literals[oid]);
5656
}
5757
}
5858
}
@@ -236,7 +236,7 @@ public override List<RDFQuadruple> SelectQuadruples(RDFContext c=null, RDFResour
236236
if (p != null) queryFilters.Append('P');
237237
if (o != null) queryFilters.Append('O');
238238
if (l != null) queryFilters.Append('L');
239-
List<RDFHashedQuadruple> hashedQuadruples = queryFilters.ToString() switch
239+
List<(long qid, long cid, long sid, long pid, long oid, byte tfv)> hashes = queryFilters.ToString() switch
240240
{
241241
"C" => [.. Index.LookupIndexByContext(c).Select(q => Index.Hashes[q])],
242242
"S" => [.. Index.LookupIndexBySubject(s).Select(q => Index.Hashes[q])],
@@ -264,8 +264,8 @@ public override List<RDFQuadruple> SelectQuadruples(RDFContext c=null, RDFResour
264264
_ => [.. Index.Hashes.Values]
265265
};
266266

267-
//Decompress hashed quadruples
268-
return hashedQuadruples!.ConvertAll(hq => new RDFQuadruple(hq, Index));
267+
//Decompress hashes
268+
return hashes!.ConvertAll(hq => new RDFQuadruple(hq, Index));
269269
}
270270
#endregion
271271

RDFSharp/Store/RDFQuadruple.cs

Lines changed: 9 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -130,24 +130,24 @@ private RDFQuadruple(RDFContext context, RDFResource subj, RDFResource pred)
130130
}
131131

132132
/// <summary>
133-
/// Builds a quadruple from the given hashed quadruple
133+
/// Builds a quadruple from the given hashes
134134
/// </summary>
135-
internal RDFQuadruple(RDFHashedQuadruple hashedQuadruple, RDFStoreIndex index)
135+
internal RDFQuadruple((long qid, long cid, long sid, long pid, long oid, byte tfv) hashes, RDFStoreIndex index)
136136
{
137-
Context = index.Contexts[hashedQuadruple.ContextID];
138-
Subject = index.Resources[hashedQuadruple.SubjectID];
139-
Predicate = index.Resources[hashedQuadruple.PredicateID];
140-
if (hashedQuadruple.TripleFlavor == 1) //SPO
137+
Context = index.Contexts[hashes.cid];
138+
Subject = index.Resources[hashes.sid];
139+
Predicate = index.Resources[hashes.pid];
140+
if (hashes.tfv == 1) //SPO
141141
{
142142
TripleFlavor = RDFModelEnums.RDFTripleFlavors.SPO;
143-
Object = index.Resources[hashedQuadruple.ObjectID];
143+
Object = index.Resources[hashes.oid];
144144
}
145145
else
146146
{
147147
TripleFlavor = RDFModelEnums.RDFTripleFlavors.SPL;
148-
Object = index.Literals[hashedQuadruple.ObjectID];
148+
Object = index.Literals[hashes.oid];
149149
}
150-
LazyQuadrupleID = new Lazy<long>(() => hashedQuadruple.QuadrupleID);
150+
LazyQuadrupleID = new Lazy<long>(() => hashes.qid);
151151
LazyReificationSubject = new Lazy<RDFResource>(() => new RDFResource($"bnode:{QuadrupleID}"));
152152
}
153153
#endregion
@@ -267,77 +267,4 @@ public RDFMemoryStore ReifyQuadrupleTerm(List<(RDFResource annPredicate, RDFPatt
267267
public Task<RDFMemoryStore> ReifyQuadrupleTermAsync(List<(RDFResource annPredicate, RDFPatternMember annObject)> quadrupleAnnotations = null)
268268
=> Task.Run(() => ReifyQuadrupleTerm(quadrupleAnnotations));
269269
#endregion
270-
}
271-
272-
/// <summary>
273-
/// RDFHashedQuadruple represents the internal hashed representation of a quadruple
274-
/// </summary>
275-
internal sealed class RDFHashedQuadruple : IEquatable<RDFHashedQuadruple>
276-
{
277-
#region Properties
278-
/// <summary>
279-
/// Identifier of the quadruple
280-
/// </summary>
281-
internal readonly long QuadrupleID;
282-
283-
/// <summary>
284-
/// Identifier of the member acting as context of the quadruple
285-
/// </summary>
286-
internal readonly long ContextID;
287-
288-
/// <summary>
289-
/// Identifier of the member acting as subject of the quadruple
290-
/// </summary>
291-
internal readonly long SubjectID;
292-
293-
/// <summary>
294-
/// Identifier of the member acting as predicate of the quadruple
295-
/// </summary>
296-
internal readonly long PredicateID;
297-
298-
/// <summary>
299-
/// Identifier of the member acting as object of the quadruple
300-
/// </summary>
301-
internal readonly long ObjectID;
302-
303-
/// <summary>
304-
/// Flavor of the quadruple (1=SPO, 2=SPL)
305-
/// </summary>
306-
internal readonly byte TripleFlavor;
307-
#endregion
308-
309-
#region Ctor
310-
/// <summary>
311-
/// Builds an hashed quadruple from the given quadruple
312-
/// </summary>
313-
internal RDFHashedQuadruple(RDFQuadruple quadruple)
314-
{
315-
TripleFlavor = (byte)quadruple.TripleFlavor;
316-
QuadrupleID = quadruple.QuadrupleID;
317-
ContextID = quadruple.Context.PatternMemberID;
318-
SubjectID = quadruple.Subject.PatternMemberID;
319-
PredicateID = quadruple.Predicate.PatternMemberID;
320-
ObjectID = quadruple.Object.PatternMemberID;
321-
}
322-
#endregion
323-
324-
#region Interfaces
325-
/// <summary>
326-
/// Performs the equality comparison between two hashed quadruples
327-
/// </summary>
328-
public bool Equals(RDFHashedQuadruple other)
329-
=> other != null && QuadrupleID == other.QuadrupleID;
330-
331-
/// <summary>
332-
/// Performs the equality comparison between two hashed quadruples
333-
/// </summary>
334-
public override bool Equals(object other)
335-
=> other is RDFHashedQuadruple hq && QuadrupleID == hq.QuadrupleID;
336-
337-
/// <summary>
338-
/// Calculates the hashcode of this hashed quadruple
339-
/// </summary>
340-
public override int GetHashCode()
341-
=> QuadrupleID.GetHashCode();
342-
#endregion
343270
}

RDFSharp/Store/RDFStoreIndex.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ internal sealed class RDFStoreIndex : IDisposable
2929
/// <summary>
3030
/// Hashed representation of the quadruples
3131
/// </summary>
32-
internal Dictionary<long, RDFHashedQuadruple> Hashes { get; set; }
32+
internal Dictionary<long, (long qid, long cid, long sid, long pid, long oid, byte tfv)> Hashes { get; set; }
3333

3434
/// <summary>
3535
/// Register of the contexts
@@ -152,10 +152,14 @@ private void Dispose(bool disposing)
152152
/// </summary>
153153
internal RDFStoreIndex Add(RDFQuadruple quadruple)
154154
{
155-
//Quadruple (Hash)
155+
#region Guards
156156
if (Hashes.ContainsKey(quadruple.QuadrupleID))
157157
return this;
158-
Hashes.Add(quadruple.QuadrupleID, new RDFHashedQuadruple(quadruple));
158+
#endregion
159+
160+
//Quadruple (Hash)
161+
Hashes.Add(quadruple.QuadrupleID, (quadruple.QuadrupleID, quadruple.Context.PatternMemberID,
162+
quadruple.Subject.PatternMemberID, quadruple.Predicate.PatternMemberID, quadruple.Object.PatternMemberID, (byte)quadruple.TripleFlavor));
159163

160164
//Context (Register)
161165
Contexts.TryAdd(quadruple.Context.PatternMemberID, (RDFContext)quadruple.Context);

0 commit comments

Comments
 (0)