fast_tree 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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