fast_tree 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1a2408d73a49d03de109154c5bc8897bfcbeadaf
4
- data.tar.gz: 48bda26709f050ccc1b56ac535220aaf89169696
3
+ metadata.gz: d7ad496b93e43daf87291d74fe77ca656f69da04
4
+ data.tar.gz: ea272ac4a8e05a1c65d666bf7bb1d60c92fb81a2
5
5
  SHA512:
6
- metadata.gz: 59bd83c3ee0bb38e65dfe8ce9152619a18c65b06eddedfb65b765581e7afd354fc4687f82d25d86058c4d12894e20ad278c8eaa48802eafd4d2e4f30c78ee74f
7
- data.tar.gz: c89f948f54b279fc8a857764995353abac0bf56e0bbb38e1ba6ef5afcb6e952757df66db150a1ce5c92211a813f2cd77feecb115d7036100c4baf7e71a210796
6
+ metadata.gz: 65c311ec95d820c844dc04fb8b2322bc1a675eb081e8e637ff2ca9e0c28b2333d08cf39008d50f0e3b60064287a8f6e0d6971356344305e3dc47ca282be531ab
7
+ data.tar.gz: f2a89aed4d7837dd4fc206ad40d2fe6589d02af90cd5000eecf09727720c15529f6b22739bf6a7537dd64c87b0a10176f3665061b3bfca8b8924d27fa318b577
data/README.md CHANGED
@@ -197,6 +197,23 @@ root.subtree.bfs.each do |node|
197
197
  end
198
198
  ```
199
199
 
200
+ ### Parent and children
201
+
202
+ To get a parent node,
203
+
204
+ ```ruby
205
+ node = YOUR_MODEL_NAME.take
206
+ node.parent
207
+ ```
208
+
209
+ or child nodes,
210
+
211
+ ```ruby
212
+ node = YOUR_MODEL_NAME.take
213
+ node.children
214
+ ```
215
+
216
+
200
217
  ### Boolean methods
201
218
 
202
219
  `fast_tree` provides several boolean methods, such as:
@@ -168,14 +168,16 @@ UPDATE #{self.to_s.underscore.pluralize}
168
168
  end
169
169
 
170
170
  def copy_to(node)
171
- subtree = self.class.find_subtree_by_root(self)
172
-
173
171
  # create empty space into which subtree embedded
174
- _update_nodes(node.l_ptr, node.r_ptr, "r_ptr >= #{r_ptr}", width + 1)
172
+ _update_nodes(node.l_ptr, node.r_ptr, "r_ptr >= #{node.r_ptr}", width + 1)
173
+
174
+ # self and node may be updated by shifting
175
+ self.reload
176
+ node.reload
175
177
 
176
- bias = node.l_ptr + 1 - l_ptr
178
+ bias = node.r_ptr - r_ptr - 1
177
179
  base_depth = depth
178
- subtree.each do |st_node|
180
+ self.subtree.each do |st_node|
179
181
  attributes = st_node.attributes.to_h
180
182
  attributes.delete("id")
181
183
  attributes["l_ptr"] += bias
@@ -190,25 +192,31 @@ UPDATE #{self.to_s.underscore.pluralize}
190
192
  # copy_to and remove change node ids
191
193
  # move operation should change nothing but left and right pointers
192
194
 
193
- # bind subtree to a variable
194
- subtree = self.class.find_subtree_by_root(self)
195
-
196
- # fill (virtual) empty spaces that will be created by moving subtree
197
- _update_nodes(l_ptr, r_ptr, "l_ptr > #{r_ptr}", - (width + 1))
198
-
199
195
  # create empty spaces under the node
196
+ _update_nodes(node.r_ptr, node.r_ptr, "r_ptr >= #{node.r_ptr}", width + 1)
197
+
198
+ self.reload
200
199
  node.reload
201
- _update_nodes(node.l_ptr, node.r_ptr, "l_ptr >= #{node.l_ptr} AND r_ptr <= #{node.r_ptr}", width + 1)
200
+
201
+ # remember where the node were
202
+ empty_space_left = self.l_ptr
203
+ empty_space_right = self.r_ptr
202
204
 
203
205
  # move subtree under the given node
204
- bias = node.l_ptr + 1 - l_ptr
206
+ bias = node.r_ptr - r_ptr - 1
205
207
  base_depth = depth
206
- subtree.each do |st_node|
208
+ self.subtree.each do |st_node|
207
209
  st_node.l_ptr += bias
208
210
  st_node.r_ptr += bias
209
211
  st_node.depth += node.depth - base_depth + 1
210
212
  st_node.save
211
213
  end
214
+
215
+ self.reload
216
+ node.reload
217
+
218
+ # fill (virtual) empty spaces that will be created by moving subtree
219
+ _update_nodes(empty_space_left, empty_space_right, "r_ptr > #{empty_space_right}", - (width + 1))
212
220
  end
213
221
 
214
222
  def remove
@@ -253,10 +261,66 @@ UPDATE #{self.to_s.underscore.pluralize}
253
261
  l_ptr != r_ptr - 1
254
262
  end
255
263
 
264
+ #
265
+ # Getter Methods
266
+ #
267
+
268
+ def parent
269
+ self.class.where(self.class.arel_table[:l_ptr].lt(l_ptr))
270
+ .where(self.class.arel_table[:r_ptr].gt(r_ptr))
271
+ .where(depth: depth - 1)
272
+ .try(:first)
273
+ end
274
+
275
+ def children
276
+ self.class.where(self.class.arel_table[:l_ptr].gt(l_ptr))
277
+ .where(self.class.arel_table[:r_ptr].lt(r_ptr))
278
+ .where(depth: depth + 1)
279
+ end
280
+
256
281
 
257
282
  protected
258
283
 
259
284
  def _update_nodes(left, right, condition, diff = 2)
285
+ #
286
+ # Possible patterns
287
+ #
288
+ # left right
289
+ # --------------------------
290
+ # <---> | | ... 1.
291
+ # <-----> | ... 2.
292
+ # | <-----> | ... 3.
293
+ # | <-----> ... 4.
294
+ # | | <----> ... 5.
295
+ # <-------------------> ... 6.
296
+ # | |
297
+ #
298
+ #
299
+ # 1: do nothing
300
+ # l_ptr <- l_ptr
301
+ # r_ptr <- r_ptr
302
+ #
303
+ # 2: do nothing (illegal node)
304
+ # l_ptr <- l_ptr
305
+ # r_ptr <- r_ptr
306
+ #
307
+ # 3: move diff - 1 to the right
308
+ # l_ptr <- l_ptr + diff - 1
309
+ # r_ptr <- r_ptr + diff - 1
310
+ #
311
+ # 4: do nothing (illegal node)
312
+ # l_ptr <- l_ptr
313
+ # r_ptr <- r_ptr
314
+ #
315
+ # 5: move diff to the right
316
+ # l_ptr <- l_ptr + diff
317
+ # r_ptr <- r_ptr + diff
318
+ #
319
+ # 6: move right endpoint by diff to the right
320
+ # l_ptr <- l_ptr
321
+ # r_ptr <- r_ptr + diff
322
+ #
323
+
260
324
  #
261
325
  # NOTE:
262
326
  # Due to performance reason,
@@ -1,3 +1,3 @@
1
1
  module FastTree
2
- VERSION = '0.2.0'
2
+ VERSION = '0.2.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chisato Hasegawa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-08 00:00:00.000000000 Z
11
+ date: 2017-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -92,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
92
  version: '0'
93
93
  requirements: []
94
94
  rubyforge_project:
95
- rubygems_version: 2.5.2
95
+ rubygems_version: 2.5.1
96
96
  signing_key:
97
97
  specification_version: 4
98
98
  summary: '["Rails plugin for Fast Tree Structure", "fast_tree is an implementation