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 +4 -4
- data/README.md +17 -0
- data/lib/fast_tree/model.rb +78 -14
- data/lib/fast_tree/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7ad496b93e43daf87291d74fe77ca656f69da04
|
4
|
+
data.tar.gz: ea272ac4a8e05a1c65d666bf7bb1d60c92fb81a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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:
|
data/lib/fast_tree/model.rb
CHANGED
@@ -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.
|
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
|
-
|
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.
|
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,
|
data/lib/fast_tree/version.rb
CHANGED
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.
|
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-
|
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.
|
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
|