Module: Spider::Model::Tree::MapperMethods

Defined in:
lib/spiderfw/model/mixins/tree.rb

Instance Method Summary collapse

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