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
- #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
218 219 220 221 222 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 218 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
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 190 def before_save(obj, mode) @model.elements_array.select{ |el| el.attributes[:association] == :tree }.each do |el| unless obj.element_modified?(el.attributes[:reverse]) || obj.element_modified?(el.attributes[:tree_position]) next end 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 super end |
#delete_children(obj, tree_el) ⇒ Object
319 320 321 322 323 324 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 319 def delete_children(obj, tree_el) obj.get(tree_el).each do |child| delete_children(child, tree_el) end obj.delete end |
#tree_assign_values(tree_el, obj, left) ⇒ Object
267 268 269 270 271 272 273 274 275 276 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 267 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) end obj.set(left_el, left) obj.set(right_el, cur) cur end |
#tree_delete(tree_el, obj) ⇒ Object
317 318 319 320 321 322 323 324 325 326 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 317 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
256 257 258 259 260 261 262 263 264 265 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 256 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
283 284 285 286 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 283 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
288 289 290 291 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 288 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
293 294 295 296 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 293 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])) end |
#tree_insert_node_under(tree_el, obj, parent) ⇒ Object
278 279 280 281 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 278 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
328 329 330 331 332 333 334 335 336 337 338 339 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 328 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
241 242 243 244 245 246 247 248 249 250 251 252 253 254 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 241 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
298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 298 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
307 308 309 310 311 312 313 |
# File 'lib/spiderfw/model/mixins/tree.rb', line 307 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 |