Module: MongoMapper::Plugins::Tree::ClassMethods

Defined in:
lib/mongo_mapper/plugins/tree.rb

Instance Method Summary collapse

Instance Method Details

#ancestor_tree_keys(nv, dv) ⇒ Object

returns ancestor nv, dv, snv, sdv values as hash



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/mongo_mapper/plugins/tree.rb', line 37

def ancestor_tree_keys(nv,dv)
  numerator = nv
  denominator = dv
  ancnv = 0
  ancdv = 1
  ancsnv = 1
  ancsdv = 0
  rethash = {:nv => ancnv, :dv => ancdv, :snv => ancsnv, :sdv => ancsdv}
  # make sure we break if we get root values! (numerator == 0 + denominator == 0)
  #max_levels = 10
  while ((ancnv < nv) && (ancdv < dv)) && ((numerator > 0) && (denominator > 0))# && (max_levels > 0)
    #max_levels -= 1
    div = numerator / denominator
    mod = numerator % denominator
    # set return values to previous values, as they are the parent values
    rethash = {:nv => ancnv, :dv => ancdv, :snv => ancsnv, :sdv => ancsdv}

    ancnv = ancnv + (div * ancsnv)
    ancdv = ancdv + (div * ancsdv)
    ancsnv = ancnv + ancsnv
    ancsdv = ancdv + ancsdv

    numerator = mod
    if (numerator != 0)
      denominator = denominator % mod
      if denominator == 0
        denominator = 1
      end
    end
  end
  return rethash
end

#compare_keys(key1, key2) ⇒ Object



77
78
79
80
81
82
# File 'lib/mongo_mapper/plugins/tree.rb', line 77

def compare_keys(key1, key2)
( (key1[:nv] === key2[:nv]) and
  (key1[:dv] === key2[:dv]) and
  (key1[:snv] === key2[:snv]) and
  (key1[:sdv] === key2[:sdv]))
end

#keys_from_parent_keys_and_position(parent_keys, position) ⇒ Object

get_ancestor_keys(nv,dv)



70
71
72
73
74
75
# File 'lib/mongo_mapper/plugins/tree.rb', line 70

def keys_from_parent_keys_and_position(parent_keys, position)
  { :nv => parent_keys[:nv] + (position * parent_keys[:snv]),
    :dv => parent_keys[:dv] + (position * parent_keys[:sdv]),
    :snv => parent_keys[:nv] + ((position + 1) * parent_keys[:snv]),
    :sdv => parent_keys[:dv] + ((position + 1) * parent_keys[:sdv]) }
end

#position_from_nv_dv(nv, dv) ⇒ Object



31
32
33
34
# File 'lib/mongo_mapper/plugins/tree.rb', line 31

def position_from_nv_dv(nv, dv)
  anc_tree_keys = ancestor_tree_keys(nv, dv)
  (nv - anc_tree_keys[:nv]) / anc_tree_keys[:snv]
end

#rekey_all!Object

force all keys to update



16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/mongo_mapper/plugins/tree.rb', line 16

def rekey_all!
  # rekey keys for each root. will do children 
  _pos = 1
  self.roots.each do |root|
    new_keys = keys_from_parent_keys_and_position({:nv => 0, :dv => 1, :snv => 1, :sdv => 0}, _pos)
    if !compare_keys(root.tree_keys(), new_keys)
      root.move_nv_dv(new_keys[:nv], new_keys[:dv], {:ignore_conflict => true})
      root.save!
      root.reload
    end
    root.rekey_children
    _pos += 1
  end
end

#rootsObject



11
12
13
# File 'lib/mongo_mapper/plugins/tree.rb', line 11

def roots
  self.where(tree_parent_id_field => nil).sort(tree_sort_order()).all
end

#tree_sort_orderObject



84
85
86
87
88
89
90
# File 'lib/mongo_mapper/plugins/tree.rb', line 84

def tree_sort_order
  if !tree_use_rational_numbers
    "#{tree_order} #{tree_info_depth_field}" 
  else
    tree_info_nv_div_dv_field.asc
  end
end