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

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

Instance Method Summary collapse

Instance Method Details

#before_delete(objects) ⇒ Object



256
257
258
259
260
# File 'lib/spiderfw/model/mixins/tree.rb', line 256

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



218
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
249
250
251
252
253
254
# File 'lib/spiderfw/model/mixins/tree.rb', line 218

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
                        sibling_i = pos-2
                        sub.each_index do |i|
                            if sub[i] == obj
                                sibling_i += 1 if i <= sibling_i
                                break
                            end
                        end
                        tree_insert_node_right(el, obj, sub[sibling_i])
                    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



360
361
362
363
364
365
# File 'lib/spiderfw/model/mixins/tree.rb', line 360

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



383
384
385
386
387
388
389
390
391
392
393
394
# File 'lib/spiderfw/model/mixins/tree.rb', line 383

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



308
309
310
311
312
313
314
315
316
317
# File 'lib/spiderfw/model/mixins/tree.rb', line 308

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



358
359
360
361
362
363
364
365
366
367
# File 'lib/spiderfw/model/mixins/tree.rb', line 358

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



294
295
296
297
298
299
300
301
302
303
304
305
306
# File 'lib/spiderfw/model/mixins/tree.rb', line 294

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)
    obj.get(tree_el).each do |child|
        child.save
    end
end

#tree_insert_node_first(tree_el, obj, parent) ⇒ Object



324
325
326
327
# File 'lib/spiderfw/model/mixins/tree.rb', line 324

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



329
330
331
332
# File 'lib/spiderfw/model/mixins/tree.rb', line 329

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



334
335
336
337
# File 'lib/spiderfw/model/mixins/tree.rb', line 334

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



319
320
321
322
# File 'lib/spiderfw/model/mixins/tree.rb', line 319

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



369
370
371
372
373
374
375
376
377
378
379
380
# File 'lib/spiderfw/model/mixins/tree.rb', line 369

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



279
280
281
282
283
284
285
286
287
288
289
290
291
292
# File 'lib/spiderfw/model/mixins/tree.rb', line 279

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



339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
# File 'lib/spiderfw/model/mixins/tree.rb', line 339

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



348
349
350
351
352
353
354
# File 'lib/spiderfw/model/mixins/tree.rb', line 348

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