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 +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
|