Skip to content

Commit b94fc85

Browse files
authored
Add more Blobentry functions (#1171)
* Add more Blobentry functions * fix docs * delete Blobentries and some tests * cover missing lines
1 parent ce268d4 commit b94fc85

File tree

6 files changed

+181
-47
lines changed

6 files changed

+181
-47
lines changed

docs/make.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ using Documenter
22
using GraphMakie
33
using DistributedFactorGraphs
44

5+
DFG.@usingDFG true
6+
57
makedocs(;
68
modules = [DistributedFactorGraphs],
79
format = Documenter.HTML(),

src/DataBlobs/services/BlobEntry.jl

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,19 +71,21 @@ end
7171
"""
7272
$(SIGNATURES)
7373
Finds and returns the first blob entry that matches the filter.
74-
74+
The result is sorted by `sortby[=getLabel]` and `sortlt[=natural_lt]` before returning the first entry.
7575
Also see: [`getBlobentry`](@ref)
7676
"""
7777
function getfirstBlobentry(
7878
v::AbstractGraphVariable;
7979
labelFilter::Union{Nothing, Function} = nothing,
8080
blobIdFilter::Union{Nothing, Function} = nothing,
81+
sortby::Function = getLabel,
82+
sortlt::Function = natural_lt,
8183
)
8284
entries = getBlobentries(v; labelFilter, blobIdFilter)
8385
if isempty(entries)
8486
return nothing
8587
else
86-
return entries[1]
88+
return sort(entries; by = sortby, lt = sortlt)[1]
8789
end
8890
end
8991

@@ -184,6 +186,23 @@ function deleteBlobentry!(var::AbstractGraphVariable, entry::Blobentry)
184186
return deleteBlobentry!(var, entry.label)
185187
end
186188

189+
##==============================================================================
190+
## Default bulk Agent and Graph Blobentry operations
191+
##==============================================================================
192+
function deleteAgentBlobentries!(dfg::AbstractDFG, labels::Vector{Symbol})
193+
cnts = map(labels) do label
194+
return deleteAgentBlobentry!(dfg, label)
195+
end
196+
return sum(cnts)
197+
end
198+
199+
function deleteGraphBlobentries!(dfg::AbstractDFG, labels::Vector{Symbol})
200+
cnts = map(labels) do label
201+
return deleteGraphBlobentry!(dfg, label)
202+
end
203+
return sum(cnts)
204+
end
205+
187206
##==============================================================================
188207
## Blobentry - Helper functions, Lists, etc
189208
##==============================================================================

src/DistributedFactorGraphs.jl

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ export getObservation
116116
##------------------------------------------------------------------------------
117117
export getVariable
118118
export hasVariable
119-
119+
export mergeVariables!
120120
##------------------------------------------------------------------------------
121121
## State
122122
##------------------------------------------------------------------------------
@@ -126,6 +126,7 @@ export getStates
126126
# Factor
127127
##------------------------------------------------------------------------------
128128
export mergeFactor!
129+
export mergeFactors!
129130
export hasFactor
130131

131132
##------------------------------------------------------------------------------
@@ -144,20 +145,22 @@ export getAgentBlobentries
144145

145146
export mergeBlobentries!
146147
export mergeGraphBlobentry!
148+
export mergeGraphBlobentries!
147149
export mergeAgentBlobentry!
150+
export mergeAgentBlobentries!
148151

149152
export deleteGraphBlobentry!
150153
export deleteAgentBlobentry!
154+
export deleteGraphBlobentries!
155+
export deleteAgentBlobentries!
151156

152157
export listBlobentries
153158
export listGraphBlobentries
154159
export listAgentBlobentries
155160

156161
export hasBlobentry
157-
158-
# TODO not yet implemented in DFG
159-
# addAgentBlobentry!
160-
# addGraphBlobentry!
162+
export hasGraphBlobentry
163+
export hasAgentBlobentry
161164

162165
##------------------------------------------------------------------------------
163166
## Blobstores and Blobs
@@ -199,14 +202,15 @@ export GraphsDFG
199202

200203
# export addBlobentry!, getBlobentry, mergeBlobentry!, deleteBlobentry! # historic for VariableBlobentry
201204
# export addBlobentries!, getBlobentries, mergeBlobentries!, deleteBlobentries!
202-
# TODO first pass progress
203205
# export addGraphBlobentry!, getGraphBlobentry, mergeGraphBlobentry!, deleteGraphBlobentry!
204206
# export addGraphBlobentries!, getGraphBlobentries, mergeGraphBlobentries!, deleteGraphBlobentries!
205207
# export addAgentBlobentry!, getAgentBlobentry, mergeAgentBlobentry!, deleteAgentBlobentry!
206208
# export addAgentBlobentries!, getAgentBlobentries, mergeAgentBlobentries!, deleteAgentBlobentries!
209+
#TODO blob entries not implemented on factors yet
207210
# export addFactorBlobentry!, getFactorBlobentry, mergeFactorBlobentry!, deleteFactorBlobentry!
208211
# export addFactorBlobentries!, getFactorBlobentries, mergeFactorBlobentries!, deleteFactorBlobentries!
209212

213+
# TODO first pass progress
210214
# export addVariableMetadata!, getVariableMetadata, mergeVariableMetadata!, deleteVariableMetadata!
211215
# export addFactorMetadata!, getFactorMetadata, mergeFactorMetadata!, deleteFactorMetadata!
212216
# export addAgentMetadata!, getAgentMetadata, mergeAgentMetadata!, deleteAgentMetadata!
@@ -546,31 +550,6 @@ include("services/DFGFactor.jl")
546550
include("Deprecated.jl")
547551
include("services/CompareUtils.jl")
548552

549-
#FIXME move
550-
function mergeGraphBlobentry!(dfg::GraphsDFG, entry::Blobentry)
551-
refBlobentries(dfg.graph)[getLabel(entry)] = entry
552-
return 1
553-
end
554-
555-
function mergeAgentBlobentry!(dfg::GraphsDFG, entry::Blobentry)
556-
refBlobentries(dfg.agent)[getLabel(entry)] = entry
557-
return 1
558-
end
559-
560-
function mergeGraphBlobentries!(dfg::GraphsDFG, entries::Vector{Blobentry})
561-
cnts = map(entries) do entry
562-
return mergeGraphBlobentry!(dfg, entry)
563-
end
564-
return sum(cnts)
565-
end
566-
567-
function mergeAgentBlobentries!(dfg::GraphsDFG, entries::Vector{Blobentry})
568-
cnts = map(entries) do entry
569-
return mergeAgentBlobentry!(dfg, entry)
570-
end
571-
return sum(cnts)
572-
end
573-
574553
# include("services/Sync.jl")
575554

576555
# Include the FilesDFG API.

src/GraphsDFG/services/GraphsDFG.jl

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,8 @@ function mergeVariable!(dfg::GraphsDFG, variable::AbstractGraphVariable)
9191
return 1
9292
end
9393

94-
function mergeVariables!(dfg::GraphsDFG, variables)
95-
cnts = map(mergeVariable!, variables)
94+
function DFG.mergeVariables!(dfg::GraphsDFG, variables)
95+
cnts = map(v -> mergeVariable!(dfg, v), variables)
9696
return sum(cnts)
9797
end
9898

@@ -112,6 +112,11 @@ function mergeFactor!(dfg::GraphsDFG, factor::AbstractGraphFactor)
112112
return 1
113113
end
114114

115+
function DFG.mergeFactors!(dfg::GraphsDFG, factors)
116+
cnts = map(f -> mergeFactor!(dfg, f), factors)
117+
return sum(cnts)
118+
end
119+
115120
function deleteVariable!(dfg::GraphsDFG, label::Symbol)#::Tuple{AbstractGraphVariable, Vector{<:AbstractGraphFactor}}
116121
if !haskey(dfg.g.variables, label)
117122
throw(LabelNotFoundError("Variable", label))
@@ -592,3 +597,81 @@ function addGraphBlobentries!(fg::GraphsDFG, entries::Vector{Blobentry})
592597
return addGraphBlobentry!(fg, entry)
593598
end
594599
end
600+
601+
function DFG.addAgentBlobentry!(fg::GraphsDFG, entry::Blobentry)
602+
if haskey(fg.agent.blobEntries, entry.label)
603+
throw(LabelExistsError("Blobentry", entry.label))
604+
end
605+
push!(fg.agent.blobEntries, entry.label => entry)
606+
return entry
607+
end
608+
609+
function DFG.addAgentBlobentries!(fg::GraphsDFG, entries::Vector{Blobentry})
610+
return map(entries) do entry
611+
return addAgentBlobentry!(fg, entry)
612+
end
613+
end
614+
615+
function DFG.getAgentBlobentry(fg::GraphsDFG, label::Symbol)
616+
if !haskey(fg.agent.blobEntries, label)
617+
throw(LabelNotFoundError("Blobentry", label))
618+
end
619+
return fg.agent.blobEntries[label]
620+
end
621+
622+
function DFG.getAgentBlobentries(
623+
fg::GraphsDFG;
624+
labelFilter::Union{Nothing, Function} = nothing,
625+
)
626+
entries = collect(values(fg.agent.blobEntries))
627+
filterDFG!(entries, labelFilter, getLabel)
628+
return entries
629+
end
630+
631+
function DFG.mergeGraphBlobentry!(dfg::GraphsDFG, entry::Blobentry)
632+
DFG.refBlobentries(dfg.graph)[getLabel(entry)] = entry
633+
return 1
634+
end
635+
636+
function DFG.mergeAgentBlobentry!(dfg::GraphsDFG, entry::Blobentry)
637+
DFG.refBlobentries(dfg.agent)[getLabel(entry)] = entry
638+
return 1
639+
end
640+
641+
function DFG.mergeGraphBlobentries!(dfg::GraphsDFG, entries::Vector{Blobentry})
642+
cnts = map(entries) do entry
643+
return mergeGraphBlobentry!(dfg, entry)
644+
end
645+
return sum(cnts)
646+
end
647+
648+
function DFG.mergeAgentBlobentries!(dfg::GraphsDFG, entries::Vector{Blobentry})
649+
cnts = map(entries) do entry
650+
return mergeAgentBlobentry!(dfg, entry)
651+
end
652+
return sum(cnts)
653+
end
654+
655+
function DFG.deleteGraphBlobentry!(dfg::GraphsDFG, label::Symbol)
656+
if !haskey(dfg.graph.blobEntries, label)
657+
throw(LabelNotFoundError("Blobentry", label))
658+
end
659+
delete!(dfg.graph.blobEntries, label)
660+
return 1
661+
end
662+
663+
function DFG.deleteAgentBlobentry!(dfg::GraphsDFG, label::Symbol)
664+
if !haskey(dfg.agent.blobEntries, label)
665+
throw(LabelNotFoundError("Blobentry", label))
666+
end
667+
delete!(dfg.agent.blobEntries, label)
668+
return 1
669+
end
670+
671+
function DFG.hasGraphBlobentry(dfg::GraphsDFG, label::Symbol)
672+
return haskey(dfg.graph.blobEntries, label)
673+
end
674+
675+
function DFG.hasAgentBlobentry(dfg::GraphsDFG, label::Symbol)
676+
return haskey(dfg.agent.blobEntries, label)
677+
end

src/services/AbstractDFG.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,13 +202,15 @@ function getGraphBlobentries end
202202
function addGraphBlobentry! end
203203
function addGraphBlobentries! end
204204
function mergeGraphBlobentry! end
205+
function mergeGraphBlobentries! end
205206
function deleteGraphBlobentry! end
206207

207208
function getAgentBlobentry end
208209
function getAgentBlobentries end
209210
function addAgentBlobentry! end
210211
function addAgentBlobentries! end
211212
function mergeAgentBlobentry! end
213+
function mergeAgentBlobentries! end
212214
function deleteAgentBlobentry! end
213215

214216
function getModelBlobentry end
@@ -222,6 +224,10 @@ function listGraphBlobentries end
222224
function listAgentBlobentries end
223225
function listModelBlobentries end
224226

227+
function hasGraphBlobentry end
228+
function hasAgentBlobentry end
229+
function hasModelBlobentry end
230+
225231
##==============================================================================
226232
## AbstractBlobstore CRUD
227233
##==============================================================================
@@ -369,6 +375,7 @@ otherwise, the variable will be added to the graph.
369375
Implement `mergeVariable!(dfg::AbstractDFG, variable::AbstractGraphVariable)`
370376
"""
371377
function mergeVariable! end
378+
function mergeVariables! end
372379

373380
"""
374381
$(SIGNATURES)
@@ -377,6 +384,7 @@ otherwise, the factor will be added to the graph.
377384
Implement `mergeFactor!(dfg::AbstractDFG, factor::AbstractGraphFactor)`
378385
"""
379386
function mergeFactor! end
387+
function mergeFactors! end
380388

381389
"""
382390
$(SIGNATURES)

test/testBlocks.jl

Lines changed: 55 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -194,20 +194,63 @@ function GraphAgentBlobentries!(fg::AbstractDFG)
194194
metadata = "",
195195
)
196196

197-
# User Blob Entries
198-
#TODO
199-
200-
# Robot Blob Entries
201-
#TODO
202-
203-
# Session Blob Entries
197+
# Agent Blob Entries
198+
ae = addAgentBlobentry!(fg, be)
199+
@test ae == be
200+
@test_throws DFG.LabelExistsError addAgentBlobentry!(fg, be)
201+
ge = getAgentBlobentry(fg, :key1)
202+
@test ge == be
203+
@test hasAgentBlobentry(fg, :key1)
204+
me = mergeAgentBlobentry!(fg, be)
205+
@test me == 1
206+
de = deleteAgentBlobentry!(fg, :key1)
207+
@test de == 1
208+
@test hasAgentBlobentry(fg, :key1) == false
209+
@test_throws DFG.LabelNotFoundError getAgentBlobentry(fg, :key1)
210+
@test_throws DFG.LabelNotFoundError deleteAgentBlobentry!(fg, :key1)
211+
212+
# Graph Blob Entries
204213
ae = addGraphBlobentry!(fg, be)
205214
@test ae == be
215+
@test_throws DFG.LabelExistsError addGraphBlobentry!(fg, be)
206216
ge = getGraphBlobentry(fg, :key1)
207217
@test ge == be
208-
209-
#TODO
210-
218+
@test hasGraphBlobentry(fg, :key1)
219+
me = mergeGraphBlobentry!(fg, be)
220+
@test me == 1
221+
de = deleteGraphBlobentry!(fg, :key1)
222+
@test de == 1
223+
@test hasGraphBlobentry(fg, :key1) == false
224+
@test_throws DFG.LabelNotFoundError getGraphBlobentry(fg, :key1)
225+
@test_throws DFG.LabelNotFoundError deleteGraphBlobentry!(fg, :key1)
226+
227+
be2 = Blobentry(; blobId = uuid4(), label = :key2, blobstore = :b)
228+
229+
bes = [be, be2]
230+
231+
ae = addAgentBlobentries!(fg, bes)
232+
@test length(ae) == 2
233+
@test_throws DFG.LabelExistsError addAgentBlobentries!(fg, bes)
234+
besr = getAgentBlobentries(fg)
235+
@test length(besr) == 2
236+
me = mergeAgentBlobentries!(fg, bes)
237+
@test me == 2
238+
de = deleteAgentBlobentries!(fg, [:key1, :key2])
239+
@test de == 2
240+
@test_throws DFG.LabelNotFoundError getAgentBlobentry(fg, :key1)
241+
@test_throws DFG.LabelNotFoundError getAgentBlobentry(fg, :key2)
242+
243+
ae = addGraphBlobentries!(fg, bes)
244+
@test length(ae) == 2
245+
@test_throws DFG.LabelExistsError addGraphBlobentries!(fg, bes)
246+
besr = getGraphBlobentries(fg)
247+
@test length(besr) == 2
248+
me = mergeGraphBlobentries!(fg, bes)
249+
@test me == 2
250+
de = deleteGraphBlobentries!(fg, [:key1, :key2])
251+
@test de == 2
252+
@test_throws DFG.LabelNotFoundError getGraphBlobentry(fg, :key1)
253+
@test_throws DFG.LabelNotFoundError getGraphBlobentry(fg, :key2)
211254
end
212255

213256
function DFGVariableSCA()
@@ -400,11 +443,11 @@ function VariablesandFactorsCRUD_SET!(fg, v1, v2, v3, f0, f1, f2)
400443
@test getLabel(fg[getLabel(f1)]) == getLabel(f1)
401444

402445
@test mergeVariable!(fg, v3) == 1
403-
@test mergeVariable!(fg, v3) == 1
446+
@test mergeVariables!(fg, [v3]) == 1
404447
@test_throws LabelExistsError addVariable!(fg, v3)
405448

406449
@test mergeFactor!(fg, f2) == 1
407-
@test mergeFactor!(fg, f2) == 1
450+
@test mergeFactors!(fg, [f2]) == 1
408451
@test_throws LabelExistsError addFactor!(fg, f2)
409452
#TODO Graphs.jl, but look at refactoring absract @test_throws LabelExistsError addFactor!(fg, f2)
410453

0 commit comments

Comments
 (0)