Module: Spider::Model::Tree::MapperMethods
- Defined in:
- lib/spiderfw/model/mixins/tree.rb
Instance Method Summary collapse
- #before_delete(objects) ⇒ Object
- #before_save(obj, mode) ⇒ Object
- #delete_children(obj, tree_el) ⇒ Object
-
#get_dependencies(task) ⇒ Object
Ensure that in Unit of Work parents are saved before children.
- #tree_assign_values(tree_el, obj, left) ⇒ Object
- #tree_delete(tree_el, obj) ⇒ Object
- #tree_insert_node(tree_el, obj, left = nil) ⇒ Object
- #tree_insert_node_first(tree_el, obj, parent) ⇒ Object
- #tree_insert_node_left(tree_el, obj, sibling) ⇒ Object
- #tree_insert_node_right(tree_el, obj, sibling) ⇒ Object
- #tree_insert_node_under(tree_el, obj, parent) ⇒ Object
- #tree_move_up_children(tree_el, obj) ⇒ Object
-
#tree_rebuild(tree_el, obj, left) ⇒ Object
def after_save(obj, mode) super debugger @model.elements_array.select{ |el| el.attributes == :tree }.each do |el| debugger left_el = el.attributes left = obj.get(left_el) if (!left) left = sequence_next(el.name) obj.set(left_el, left) end parent = obj.get(el.attributes) rebuild_from = parent ? parent : obj tree_rebuild(el, rebuild_from, left) end end.
- #tree_remove(tree_el, obj) ⇒ Object
- #unset_tree_vals(obj, tree_el) ⇒ Object
Instance Method Details
#before_delete(objects) ⇒ Object
250 251 252 253 254 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 250 def before_delete(objects) @model.elements_array.select{ |el| el.attributes[:association] == :tree }.each do |el| objects.each{ |obj| tree_remove(el, obj) } end end |
#before_save(obj, mode) ⇒ Object
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 219 def before_save(obj, mode) @model.elements_array.select{ |el| el.attributes[:association] == :tree }.each do |el| unless mode == :insert || obj.element_modified?(el.attributes[:reverse]) || obj.element_modified?(el.attributes[:tree_position]) next end # already set by parent unless obj.element_modified?(el.attributes[:tree_left]) if mode == :update tree_remove(el, obj) end parent = obj.get(el.attributes[:reverse]) if parent sub = parent.get(el.name) if obj.element_modified?(el.attributes[:tree_position]) && sub.length > 0 pos = obj.get(el.attributes[:tree_position]) if pos == 1 tree_insert_node_first(el, obj, parent) else tree_insert_node_right(el, obj, sub[pos-2]) end else tree_insert_node_under(el, obj, parent) end else tree_insert_node(el, obj) end end end super end |
#delete_children(obj, tree_el) ⇒ Object
351 352 353 354 355 356 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 351 def delete_children(obj, tree_el) obj.get(tree_el).each do |child| delete_children(child, tree_el) end obj.delete end |
#get_dependencies(task) ⇒ Object
Ensure that in Unit of Work parents are saved before children
374 375 376 377 378 379 380 381 382 383 384 385 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 374 def get_dependencies(task) deps = super if task.action == :save @model.elements_array.select{ |el| el.attributes[:association] == :tree }.each do |el| if task.object.element_modified?(el.attributes[:reverse]) parent = task.object.get(el.attributes[:reverse]) deps << [task, MapperTask.new(parent, :save)] if parent end end end deps end |
#tree_assign_values(tree_el, obj, left) ⇒ Object
299 300 301 302 303 304 305 306 307 308 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 299 def tree_assign_values(tree_el, obj, left) left_el = tree_el.attributes[:tree_left]; right_el = tree_el.attributes[:tree_right] cur = left+1 obj.get(tree_el).each do |child| cur = tree_assign_values(tree_el, child, cur) + 1 end obj.set(left_el, left) obj.set(right_el, cur) cur end |
#tree_delete(tree_el, obj) ⇒ Object
349 350 351 352 353 354 355 356 357 358 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 349 def tree_delete(tree_el, obj) tree_remove(tree_el, obj) def delete_children(obj, tree_el) obj.get(tree_el).each do |child| delete_children(child, tree_el) end obj.delete end delete_children(obj, tree_el) end |
#tree_insert_node(tree_el, obj, left = nil) ⇒ Object
288 289 290 291 292 293 294 295 296 297 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 288 def tree_insert_node(tree_el, obj, left=nil) left_el = tree_el.attributes[:tree_left]; right_el = tree_el.attributes[:tree_right] left = max(right_el) + 1 unless left right = tree_assign_values(tree_el, obj, left) diff = right-left+1 condition = Condition.new.set(right_el, '>=', left) bulk_update({right_el => QueryFuncs::Expression.new(":#{right_el}+#{diff}")}, condition) condition = Condition.new.set(left_el, '>=', left) bulk_update({left_el => QueryFuncs::Expression.new(":#{left_el}+#{diff}")}, condition) end |
#tree_insert_node_first(tree_el, obj, parent) ⇒ Object
315 316 317 318 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 315 def tree_insert_node_first(tree_el, obj, parent) obj.set(tree_el.attributes[:reverse], parent) tree_insert_node(tree_el, obj, parent.get(tree_el.attributes[:tree_left])+1) end |
#tree_insert_node_left(tree_el, obj, sibling) ⇒ Object
320 321 322 323 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 320 def tree_insert_node_left(tree_el, obj, sibling) obj.set(tree_el.attributes[:reverse], sibling.get(tree_el.attributes[:reverse])) tree_insert_node(tree_el, obj, sibling.get(tree_el.attributes[:tree_left])) end |
#tree_insert_node_right(tree_el, obj, sibling) ⇒ Object
325 326 327 328 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 325 def tree_insert_node_right(tree_el, obj, sibling) obj.set(tree_el.attributes[:reverse], sibling.get(tree_el.attributes[:reverse])) tree_insert_node(tree_el, obj, sibling.get(tree_el.attributes[:tree_right])+1) end |
#tree_insert_node_under(tree_el, obj, parent) ⇒ Object
310 311 312 313 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 310 def tree_insert_node_under(tree_el, obj, parent) obj.set(tree_el.attributes[:reverse], parent) tree_insert_node(tree_el, obj, parent.get(tree_el.attributes[:tree_right])) end |
#tree_move_up_children(tree_el, obj) ⇒ Object
360 361 362 363 364 365 366 367 368 369 370 371 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 360 def tree_move_up_children(tree_el, obj) left_el = tree_el.attributes[:tree_left]; right_el = tree_el.attributes[:tree_right] left = obj.get(left_el); right = obj.get(right_el) bulk_update({ :left_el => QueryFuncs::Expression.new(":#{left_el} - 1"), :right_el => QueryFuncs::Expression.new(":#{right_el} - 1") }, Condition.new.set(left_el, 'between', [left, right])) condition = Condition.new.set(right_el, '>', right) bulk_update({:right_el => QueryFuncs::Expression.new(":#{right_el} - 2")}, condition) condition = Condition.new.set(left_el, '>', right) bulk_update({:left_el => QueryFuncs::Expression.new(":#{left_el} - 2")}, condition) end |
#tree_rebuild(tree_el, obj, left) ⇒ Object
def after_save(obj, mode)
super
debugger
@model.elements_array.select{ |el| el.attributes[:association] == :tree }.each do |el|
debugger
left_el = el.attributes[:tree_left]
left = obj.get(left_el)
if (!left)
left = sequence_next(el.name)
obj.set(left_el, left)
end
parent = obj.get(el.attributes[:reverse])
rebuild_from = parent ? parent : obj
tree_rebuild(el, rebuild_from, left)
end
end
273 274 275 276 277 278 279 280 281 282 283 284 285 286 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 273 def tree_rebuild(tree_el, obj, left) left_el = tree_el.attributes[:tree_left]; right_el = tree_el.attributes[:tree_right] right = left + 1 children = obj.get(tree_el) if (children) children.each do |child| right = child.mapper.tree_rebuild(tree_el, child, right) end end obj.set(left_el, left) obj.set(right_el, right) do_update(obj) return right + 1 end |
#tree_remove(tree_el, obj) ⇒ Object
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 330 def tree_remove(tree_el, obj) left_el = tree_el.attributes[:tree_left]; right_el = tree_el.attributes[:tree_right] left = obj.get(left_el); right = obj.get(right_el) return unless left && right diff = right-left+1 condition = Condition.new.set(left_el, '>', right) bulk_update({left_el => QueryFuncs::Expression.new(":#{left_el} - #{diff}")}, condition) condition = Condition.new.set(right_el, '>', right) bulk_update({right_el => QueryFuncs::Expression.new(":#{right_el} - #{diff}")}, condition) def unset_tree_vals(obj, tree_el) left_el = tree_el.attributes[:tree_left]; right_el = tree_el.attributes[:tree_right] obj.set(left_el, nil); obj.set(right_el, nil) obj.get(tree_el).each do |sub| unset_tree_vals(sub, tree_el) end end unset_tree_vals(obj, tree_el) end |
#unset_tree_vals(obj, tree_el) ⇒ Object
339 340 341 342 343 344 345 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 339 def unset_tree_vals(obj, tree_el) left_el = tree_el.attributes[:tree_left]; right_el = tree_el.attributes[:tree_right] obj.set(left_el, nil); obj.set(right_el, nil) obj.get(tree_el).each do |sub| unset_tree_vals(sub, tree_el) end end |