diff --git a/NEWS.md b/NEWS.md index 362d3db6..df4939f2 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,8 @@ Listing news on any major breaking changes in DFG. For regular changes, see integrated Github.com project milestones for DFG. +# v0.27 +- `delete` returns number of nodes deleted and no longer the object that was deleted. + # v0.26 - Graph structure plotting now uses GraphMakie.jl instead of GraphPlot.jl. Update by replacing `using GraphPlot` with `using GraphMakie`. diff --git a/ext/DFGPlots.jl b/ext/DFGPlots.jl index a2c3c842..99681759 100644 --- a/ext/DFGPlots.jl +++ b/ext/DFGPlots.jl @@ -24,7 +24,7 @@ end function DFGPlotProps() return DFGPlotProps( (var = colorant"lightgreen", fac = colorant"cyan3"), - (var = 40.0, fac = 20.0), + (var = 50.0, fac = 20.0), (var = :circle, fac = :rect), GraphMakie.Stress(), true, diff --git a/src/DataBlobs/services/BlobEntry.jl b/src/DataBlobs/services/BlobEntry.jl index b92a6f49..e7cbb99c 100644 --- a/src/DataBlobs/services/BlobEntry.jl +++ b/src/DataBlobs/services/BlobEntry.jl @@ -206,7 +206,8 @@ Notes: - users responsibility to delete data in db before deleting entry """ function deleteBlobEntry!(var::AbstractDFGVariable, key::Symbol) - return pop!(var.dataDict, key) + pop!(var.dataDict, key) + return 1 end function deleteBlobEntry!(var::VariableDFG, key::Symbol) @@ -217,7 +218,8 @@ function deleteBlobEntry!(var::VariableDFG, key::Symbol) ), ) end - return deleteat!(var.blobEntries, findfirst(x -> x.label == key, var.blobEntries)) + deleteat!(var.blobEntries, findfirst(x -> x.label == key, var.blobEntries)) + return 1 end function deleteBlobEntry!(dfg::AbstractDFG, label::Symbol, key::Symbol) diff --git a/src/DataBlobs/services/BlobStores.jl b/src/DataBlobs/services/BlobStores.jl index 7ca2469c..a94c0ab0 100644 --- a/src/DataBlobs/services/BlobStores.jl +++ b/src/DataBlobs/services/BlobStores.jl @@ -128,23 +128,13 @@ end # also creates an originId as uuid4 addBlob!(store::AbstractBlobStore, data) = addBlob!(store, uuid4(), data) -#fallback as not all blobStores use filename -function addBlob!(store::AbstractBlobStore, blobId::UUID, data, ::String) - return addBlob!(store, blobId, data) -end - -function addBlob!(store::AbstractBlobStore{T}, data::T, ::String) where {T} - return addBlob!(store, uuid4(), data) -end - #update -function updateBlob!(dfg::AbstractDFG, entry::BlobEntry, data::T) where {T} - return updateBlob!(getBlobStore(dfg, entry.blobstore), entry, data) +function updateBlob!(dfg::AbstractDFG, entry::BlobEntry, data) + return updateBlob!(getBlobStore(dfg, entry.blobstore), entry.blobId, data) end function updateBlob!(store::AbstractBlobStore, entry::BlobEntry, data) - blobId = isnothing(entry.blobId) ? entry.originId : entry.blobId - return updateBlob!(store, blobId, data) + return updateBlob!(store, entry.blobId, data) end #delete function deleteBlob!(dfg::AbstractDFG, entry::BlobEntry) @@ -241,10 +231,8 @@ end function deleteBlob!(store::FolderStore{T}, blobId::UUID) where {T} blobfilename = joinpath(store.folder, string(blobId)) - - data = getBlob(store, blobId) rm(blobfilename) - return data + return 1 end #hasBlob or existsBlob? @@ -292,7 +280,8 @@ function updateBlob!(store::InMemoryBlobStore{T}, blobId::UUID, data::T) where { end function deleteBlob!(store::InMemoryBlobStore, blobId::UUID) - return pop!(store.blobs, blobId) + pop!(store.blobs, blobId) + return 1 end hasBlob(store::InMemoryBlobStore, blobId::UUID) = haskey(store.blobs, blobId) @@ -430,7 +419,8 @@ function updateBlob!(store::RowBlobStore{T}, blobId::UUID, blob::T) where {T} end function deleteBlob!(store::RowBlobStore, blobId::UUID) - return getfield(pop!(store.blobs, blobId), :blob) + getfield(pop!(store.blobs, blobId), :blob) + return 1 end hasBlob(store::RowBlobStore, blobId::UUID) = haskey(store.blobs, blobId) diff --git a/src/DataBlobs/services/HelpersDataWrapEntryBlob.jl b/src/DataBlobs/services/HelpersDataWrapEntryBlob.jl index 250dfa87..509314f7 100644 --- a/src/DataBlobs/services/HelpersDataWrapEntryBlob.jl +++ b/src/DataBlobs/services/HelpersDataWrapEntryBlob.jl @@ -276,9 +276,10 @@ function updateData!( end function deleteData!(dfg::AbstractDFG, vLbl::Symbol, bLbl::Symbol) - de = deleteBlobEntry!(dfg, vLbl, bLbl) - db = deleteBlob!(dfg, de) - return de => db + de = getBlobEntry(dfg, vLbl, bLbl) + deleteBlobEntry!(dfg, vLbl, bLbl) + deleteBlob!(dfg, de) + return 2 end function deleteData!( @@ -296,7 +297,8 @@ function deleteData!( vLbl::Symbol, bLbl::Symbol, ) - de = deleteBlobEntry!(dfg, vLbl, bLbl) - db = deleteBlob!(blobstore, de) - return de => db + de = getBlobEntry(dfg, vLbl, bLbl) + deleteBlobEntry!(dfg, vLbl, bLbl) + deleteBlob!(blobstore, de) + return 2 end diff --git a/src/Deprecated.jl b/src/Deprecated.jl index 5450f1d4..752defa3 100644 --- a/src/Deprecated.jl +++ b/src/Deprecated.jl @@ -1,3 +1,11 @@ +## ================================================================================ +## Deprecated in v0.27 +##================================================================================= + +@deprecate getNeighborhood(args...; kwargs...) listNeighborhood(args...; kwargs...) +@deprecate addBlob!(store::AbstractBlobStore, blobId::UUID, data, ::String) addBlob!(store, blobId, data) +@deprecate addBlob!(store::AbstractBlobStore{T}, data::T, ::String) where {T} addBlob!(store, uuid4(), data) + ## ================================================================================ ## Deprecated in v0.25 ##================================================================================= @@ -62,8 +70,3 @@ DFGSummary(args) = error("DFGSummary is deprecated") @deprecate lsfWho(dfg::AbstractDFG, type::Symbol) lsf(dfg, getfield(Main, type)) -## ================================================================================ -## Deprecated in v0.23 -##================================================================================= -#NOTE free up getNeighbors to return the variables or factors -@deprecate getNeighbors(args...; kwargs...) listNeighbors(args...; kwargs...) diff --git a/src/GraphsDFG/services/GraphsDFG.jl b/src/GraphsDFG/services/GraphsDFG.jl index 79664f2a..51a9e0ee 100644 --- a/src/GraphsDFG/services/GraphsDFG.jl +++ b/src/GraphsDFG/services/GraphsDFG.jl @@ -174,21 +174,18 @@ function deleteVariable!(dfg::GraphsDFG, label::Symbol)#::Tuple{AbstractDFGVaria deleteNeighbors = true # reserved, orphaned factors are not supported at this time if deleteNeighbors - neigfacs = map(l -> deleteFactor!(dfg, l), listNeighbors(dfg, label)) + del_facs = map(l -> deleteFactor!(dfg, l), listNeighbors(dfg, label)) end - variable = dfg.g.variables[label] rem_vertex!(dfg.g, dfg.g.labels[label]) - - return variable, neigfacs + return sum(del_facs) + 1 end function deleteFactor!(dfg::GraphsDFG, label::Symbol; suppressGetFactor::Bool = false) if !haskey(dfg.g.factors, label) error("Factor label '$(label)' does not exist in the factor graph") end - factor = dfg.g.factors[label] rem_vertex!(dfg.g, dfg.g.labels[label]) - return factor + return 1 end function getVariables( @@ -319,7 +316,7 @@ function listNeighbors(dfg::GraphsDFG, label::Symbol; solvable::Int = 0) return neighbors_ll::Vector{Symbol} end -function getNeighborhood( +function listNeighborhood( dfg::GraphsDFG, variableFactorLabels::Vector{Symbol}, distance::Int; diff --git a/src/services/AbstractDFG.jl b/src/services/AbstractDFG.jl index aaefb682..914cc778 100644 --- a/src/services/AbstractDFG.jl +++ b/src/services/AbstractDFG.jl @@ -213,8 +213,15 @@ function updateGraphMetadata!(dfg::AbstractDFG, pair::Pair{Symbol, String}) return push!(dfg.graphMetadata, pair) end -deleteAgentMetadata!(dfg::AbstractDFG, key::Symbol) = pop!(dfg.agent.metadata, key) -deleteGraphMetadata!(dfg::AbstractDFG, key::Symbol) = pop!(dfg.graphMetadata, key) +function deleteAgentMetadata!(dfg::AbstractDFG, key::Symbol) + pop!(dfg.agent.metadata, key) + return 1 +end + +function deleteGraphMetadata!(dfg::AbstractDFG, key::Symbol) + pop!(dfg.graphMetadata, key) + return 1 +end emptyAgentMetadata!(dfg::AbstractDFG) = empty!(dfg.agent.metadata) emptyGraphMetadata!(dfg::AbstractDFG) = empty!(dfg.graphMetadata) @@ -263,7 +270,10 @@ end function updateBlobStore!(dfg::AbstractDFG, bs::AbstractBlobStore) return push!(dfg.blobStores, getLabel(bs) => bs) end -deleteBlobStore!(dfg::AbstractDFG, key::Symbol) = pop!(dfg.blobStores, key) +function deleteBlobStore!(dfg::AbstractDFG, key::Symbol) + pop!(dfg.blobStores, key) + return 1 +end emptyBlobStore!(dfg::AbstractDFG) = empty!(dfg.blobStores) listBlobStores(dfg::AbstractDFG) = collect(keys(dfg.blobStores)) @@ -1366,8 +1376,8 @@ function buildSubgraph( #build up the neighborhood from variableFactorLabels allvarfacs = getNeighborhood(dfg, variableFactorLabels, distance; solvable = solvable) - variableLabels = intersect(listVariables(dfg), allvarfacs) - factorLabels = intersect(listFactors(dfg), allvarfacs) + variableLabels = intersect(allvarfacs, listVariables(dfg)) + factorLabels = intersect(allvarfacs, listFactors(dfg)) # Copy the section of graph we want destDFG = deepcopyGraph(G, dfg, variableLabels, factorLabels; graphLabel, kwargs...) return destDFG diff --git a/src/services/DFGVariable.jl b/src/services/DFGVariable.jl index 9c8a0bdb..946450cb 100644 --- a/src/services/DFGVariable.jl +++ b/src/services/DFGVariable.jl @@ -570,9 +570,9 @@ Delete a Metadata entry at `key` for variable `label` in `dfg` """ function deleteMetadata!(dfg::AbstractDFG, label::Symbol, key::Symbol) v = getVariable(dfg, label) - rval = pop!(v.smallData, key) + pop!(v.smallData, key) updateVariable!(dfg, v) - return rval + return 1 end """ @@ -877,8 +877,8 @@ function deleteVariableSolverData!( if !haskey(var.solverDataDict, solveKey) throw(KeyError("VariableNodeData '$(solveKey)' does not exist")) end - vnd = pop!(var.solverDataDict, solveKey) - return vnd + pop!(var.solverDataDict, solveKey) + return 1 end """ @@ -1073,8 +1073,8 @@ function deletePPE!(dfg::AbstractDFG, variablekey::Symbol, ppekey::Symbol = :def if !haskey(var.ppeDict, ppekey) throw(KeyError("VariableNodeData '$(ppekey)' does not exist")) end - vnd = pop!(var.ppeDict, ppekey) - return vnd + pop!(var.ppeDict, ppekey) + return 1 end """ diff --git a/test/consol_DataEntryBlobTests.jl b/test/consol_DataEntryBlobTests.jl index 1bc9938e..fe2bf680 100644 --- a/test/consol_DataEntryBlobTests.jl +++ b/test/consol_DataEntryBlobTests.jl @@ -105,11 +105,11 @@ gde, gdb = getData(dfg, :x1, :random) # @test incrDataLabelSuffix(dfg,:x1,:another) == :another_2 # TODO exand support for Regex likely search on labels # @test incrDataLabelSuffix(dfg,:x1,"random") == "random_1" # TODO expand support for label::String -dde, ddb = deleteData!(dfg, :x1, :random) -_, _ = deleteData!(dfg, :x1, :another_1) +@test deleteData!(dfg, :x1, :random) == 2 +@test deleteData!(dfg, :x1, :another_1) == 2 -@test ade == gde == dde -@test dataset1 == gdb == ddb +@test ade == gde +@test dataset1 == gdb ade2 = addData!(dfg, :x2, deepcopy(ade), dataset1) # ade3,adb3 = updateBlob!(dfg, :x2, deepcopy(ade), dataset1) @@ -135,10 +135,10 @@ addBlobStore!(dfg, ds) ade = addData!(dfg, :default_inmemory_store, :x1, :random, dataset1) gde, gdb = getData(dfg, :x1, :random) -dde, ddb = deleteData!(dfg, :x1, :random) +@test deleteData!(dfg, :x1, :random) == 2 -@test ade == gde == dde -@test dataset1 == gdb == ddb +@test ade == gde +@test dataset1 == gdb ade2 = addData!(dfg, :x2, deepcopy(ade), dataset1) # ade3,adb3 = updateBlob!(dfg, :x2, deepcopy(ade), dataset1) diff --git a/test/iifInterfaceTests.jl b/test/iifInterfaceTests.jl index d5d0917f..699f0ac8 100644 --- a/test/iifInterfaceTests.jl +++ b/test/iifInterfaceTests.jl @@ -79,17 +79,11 @@ end @test updateFactor!(dfg2, f2) == f2 @test_throws ErrorException addFactor!(dfg2, f2) - dv3, dv3facs = deleteVariable!(dfg2, v3) - #TODO write compare if we want to compare complete one, for now just label - # @test dv3 == v3 - @test dv3.label == v3.label + dv3 = deleteVariable!(dfg2, v3) + @test dv3 == 2 @test_throws ErrorException deleteVariable!(dfg2, v3) @test issetequal(ls(dfg2), [:a, :b]) - df2 = dv3facs[1] - #TODO write compare if we want to compare complete one, for now just label - # @test df2 == f2 - @test df2.label == f2.label @test_throws ErrorException deleteFactor!(dfg2, f2) @test lsf(dfg2) == [:abf1] @@ -290,10 +284,10 @@ end @test listBlobEntries(dfg, :b) == Symbol[:key2] #delete - @test deleteBlobEntry!(v1, :key1) == de1 + @test deleteBlobEntry!(v1, :key1) == 1 @test listBlobEntries(v1) == Symbol[:key2] #delete from ddfg - @test deleteBlobEntry!(dfg, :a, :key2) == de2_update + @test deleteBlobEntry!(dfg, :a, :key2) == 1 @test listBlobEntries(v1) == Symbol[] end diff --git a/test/testBlocks.jl b/test/testBlocks.jl index f7c55f72..e98ed303 100644 --- a/test/testBlocks.jl +++ b/test/testBlocks.jl @@ -233,7 +233,7 @@ function GraphAgentMetadata!(fg::AbstractDFG) #TODO @test_broken addAgentMetadata! @test DFG.updateAgentMetadata!(fg, :b => "2") == getAgentMetadata(fg) - @test getAgentMetadata(fg, :b) == DFG.deleteAgentMetadata!(fg, :b) + @test DFG.deleteAgentMetadata!(fg, :b) == 1 @test DFG.emptyAgentMetadata!(fg) == Dict{Symbol, String}() # SessionData @@ -241,7 +241,7 @@ function GraphAgentMetadata!(fg::AbstractDFG) #TODO @test_broken addGraphMetadata! @test DFG.updateGraphMetadata!(fg, :b => "3") == getGraphMetadata(fg) - @test getGraphMetadata(fg, :b) == DFG.deleteGraphMetadata!(fg, :b) + @test DFG.deleteGraphMetadata!(fg, :b) == 1 @test DFG.emptyGraphMetadata!(fg) == Dict{Symbol, String}() # TODO Set-like if we want eg. list, merge, etc @@ -528,24 +528,22 @@ function VariablesandFactorsCRUD_SET!(fg, v1, v2, v3, f0, f1, f2) #deletions delvarCompare = getVariable(fg, :c) delfacCompare = getFactor(fg, :bcf1) - delvar, delfacs = deleteVariable!(fg, v3) - @test delvarCompare == delvar - @test delfacCompare == delfacs[1] + ndel = deleteVariable!(fg, v3) + @test ndel == 2 @test_throws ErrorException deleteVariable!(fg, v3) @test setdiff(ls(fg), [:a, :b]) == [] @test addVariable!(fg, v3) === v3 @test addFactor!(fg, f2) === f2 - @test getFactor(fg, :bcf1) == deleteFactor!(fg, f2) + @test deleteFactor!(fg, f2) == 1 @test_throws ErrorException deleteFactor!(fg, f2) @test lsf(fg) == [:abf1] delvarCompare = getVariable(fg, :c) delfacCompare = [] - delvar, delfacs = deleteVariable!(fg, v3) - @test delvarCompare == delvar - @test delfacCompare == [] + ndel = deleteVariable!(fg, v3) + @test ndel == 1 @test getVariable(fg, :a) == v1 @test getVariable(fg, :a, :default) == v1 @@ -668,7 +666,7 @@ function PPETestBlock!(fg, v1) @test getPPESuggested(fg, :a, :default) == ppe.suggested # Delete it - @test deletePPE!(fg, :a, :default) == ppe + @test deletePPE!(fg, :a, :default) == 1 @test_throws KeyError getPPE(fg, :a, :default) # Update add it @@ -679,21 +677,21 @@ function PPETestBlock!(fg, v1) ) == ppe # Update update it @test updatePPE!(fg, :a, ppe) == ppe - @test deletePPE!(fg, :a, :default) == ppe + @test deletePPE!(fg, :a, :default) == 1 # manually add ppe to v1 for tests v1.ppeDict[:default] = deepcopy(ppe) # Bulk copy PPE's for :x1 @test updatePPE!(fg, [v1], :default) == nothing # Delete it - @test deletePPE!(fg, :a, :default) == ppe + @test deletePPE!(fg, :a, :default) == 1 # New interface @test addPPE!(fg, :a, ppe) == ppe # Update update it @test updatePPE!(fg, :a, ppe) == ppe # Delete it - @test deletePPE!(fg, :a, :default) == ppe + @test deletePPE!(fg, :a, :default) == 1 #FIXME copied from lower # @test @test_deprecated getVariablePPEs(v1) == v1.ppeDict @@ -709,7 +707,7 @@ function PPETestBlock!(fg, v1) @test getPPE(fg, :a, :default) == ppe # Delete it - @test deletePPE!(fg, :a, :default) == ppe + @test deletePPE!(fg, :a, :default) == 1 # Update add it updatePPE!(fg, :a, ppe) #, :default) # Update update it @@ -719,7 +717,7 @@ function PPETestBlock!(fg, v1) # Bulk copy PPE's for x0 and x1 updatePPE!(fg, [v1], :default) # Delete it - @test deletePPE!(fg, :a, :default) == ppe + @test deletePPE!(fg, :a, :default) == 1 #TODO DEPRECATE # getEstimates @@ -800,7 +798,7 @@ function VSDTestBlock!(fg, v1) @test vndBack == vnd # Delete it - @test deleteVariableSolverData!(fg, :a, :parametric) == vndBack + @test deleteVariableSolverData!(fg, :a, :parametric) == 1 # Update add it @test @test_logs (:warn, r"does not exist") updateVariableSolverData!(fg, :a, vnd) == vnd @@ -832,7 +830,7 @@ function VSDTestBlock!(fg, v1) @test getSolverData(getVariable(fg, :a), :parametric).bw != altVnd.bw # Delete parametric from v1 - @test deleteVariableSolverData!(fg, :a, :parametric) == vnd + @test deleteVariableSolverData!(fg, :a, :parametric) == 1 @test_throws KeyError getVariableSolverData(fg, :a, :parametric) @@ -852,7 +850,7 @@ function VSDTestBlock!(fg, v1) vndBack = getVariableSolverData(fg, :a, :parametric) @test vndBack == vnd # Delete it - @test deleteVariableSolverData!(fg, :a, :parametric) == vndBack + @test deleteVariableSolverData!(fg, :a, :parametric) == 1 # Update add it updateVariableSolverData!(fg, :a, vnd) # Update update it @@ -860,8 +858,9 @@ function VSDTestBlock!(fg, v1) # Bulk copy update x0 updateVariableSolverData!(fg, [v1], :default) # Delete parametric from v1 - return deleteVariableSolverData!(fg, :a, :parametric) + deleteVariableSolverData!(fg, :a, :parametric) + return nothing #TODO # mergeVariableSolverData!(...) @@ -901,7 +900,7 @@ function smallDataTestBlock!(fg) @test_throws MethodError addMetadata!(fg, :a, :no => [1.0f0]) @test_throws MethodError addMetadata!(fg, :a, :no => [Nanosecond(3)]) - @test deleteMetadata!(fg, :a, :a) == 3 + @test deleteMetadata!(fg, :a, :a) == 1 @test updateMetadata!(fg, :a, :a => 3) == getVariable(fg, :a).smallData @test length(listMetadata(fg, :a)) == 9 emptyMetadata!(fg, :a) @@ -1010,10 +1009,10 @@ function DataEntriesTestBlock!(fg, v2) @test listBlobEntries(fg, :b) == Symbol[:key2] #delete - @test deleteBlobEntry!(v1, de1) == de1 + @test deleteBlobEntry!(v1, de1) == 1 @test listBlobEntries(v1) == Symbol[:key2] #delete from dfg - @test deleteBlobEntry!(fg, :a, :key2) == de2_update + @test deleteBlobEntry!(fg, :a, :key2) == 1 @test listBlobEntries(v1) == Symbol[] deleteBlobEntry!(fg, :b, :key2) @@ -1103,10 +1102,10 @@ function blobsStoresTestBlock!(fg) @test listBlobEntries(fg, :b) == Symbol[:label2] #delete - @test deleteBlobEntry!(fg, var1.label, de1.label) == de1 + @test deleteBlobEntry!(fg, var1.label, de1.label) == 1 @test listBlobEntries(fg, var1.label) == Symbol[:label2] #delete from dfg - @test deleteBlobEntry!(fg, :a, :label2) == de2_update + @test deleteBlobEntry!(fg, :a, :label2) == 1 var1 = getVariable(fg, :a) @test listBlobEntries(var1) == Symbol[] @@ -1119,7 +1118,7 @@ function blobsStoresTestBlock!(fg) # Getting @test getBlobStore(fg, fs.label) == fs # Deleting - @test deleteBlobStore!(fg, fs.label) == fs + @test deleteBlobStore!(fg, fs.label) == 1 # Updating updateBlobStore!(fg, fs) @test listBlobStores(fg) == [fs.label]