Module: MongoMapper::Plugins::Tree::ClassMethods
- Defined in:
- lib/mongo_mapper/plugins/tree.rb
Instance Method Summary collapse
-
#ancestor_tree_keys(nv, dv) ⇒ Object
returns ancestor nv, dv, snv, sdv values as hash.
- #compare_keys(key1, key2) ⇒ Object
-
#keys_from_parent_keys_and_position(parent_keys, position) ⇒ Object
get_ancestor_keys(nv,dv).
- #position_from_nv_dv(nv, dv) ⇒ Object
-
#rekey_all! ⇒ Object
force all keys to update.
- #roots ⇒ Object
- #tree_sort_order ⇒ Object
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 |
#roots ⇒ Object
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_order ⇒ Object
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 |