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

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

Instance Method Summary collapse

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