fertile_forest 1.0.1 → 1.1.0
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc9b8f30c16e4ad778708dc87db3da5b24425ad5
|
4
|
+
data.tar.gz: 84f89968f7d3eaa000e664a7307c808c3b62ed42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c866ba297d69444e4a3a94f3e9fa94d0e2a88ec77a121b82ddcef0ecb2a7511d296749316f8b2a8f8e0538d37f1478bee0e8e82f5a115abb42e8b8c77be4391c
|
7
|
+
data.tar.gz: 42f61d1ac7b4a923732b7dc929bfba9dbd0839112a9d4df3847b58bac409dd43dafb32bb513861489f6b7ea27b7f30b1ba441f56020381a4dc157118f02675a4
|
@@ -292,17 +292,123 @@ module StewEucen
|
|
292
292
|
.where(@_ff_depth => base_node.ff_depth + grand_number)
|
293
293
|
end
|
294
294
|
|
295
|
+
#
|
296
|
+
# Find any kind of kinship from base node.
|
297
|
+
#
|
298
|
+
# @param base_obj [Entity|Integer] Base node|id to find.
|
299
|
+
# @param next_branch [Integer] Branch distance of finding nodes from base nodes.
|
300
|
+
# @param level_offset [Integer] Offset of kinship level of finding nodes from base nodes.
|
301
|
+
# @param columns [Array] Columns for SELECT clause.
|
302
|
+
# @return [ActiveRecord::Relation] Basic query for finding kinship nodes.
|
303
|
+
# @return [nil] No kinship nodes.
|
304
|
+
# @since 1.1.0
|
305
|
+
#
|
306
|
+
def kinships(
|
307
|
+
base_obj,
|
308
|
+
next_branch = KINSHIPS_AS_SIBLING,
|
309
|
+
level_offset = KINSHIPS_SAME_LEVEL,
|
310
|
+
columns = nil
|
311
|
+
)
|
312
|
+
base_node = ff_resolve_nodes(base_obj)
|
313
|
+
return nil if base_node.blank?
|
314
|
+
|
315
|
+
aim_queue = base_node.ff_queue
|
316
|
+
aim_depth = base_node.ff_depth
|
317
|
+
aim_grove = base_node.ff_grove # When no grove, nil
|
318
|
+
|
319
|
+
top_depth = aim_depth - next_branch
|
320
|
+
|
321
|
+
# Impossible to find.
|
322
|
+
return nil if top_depth < ROOT_DEPTH
|
323
|
+
|
324
|
+
ffqq = arel_table[@_ff_queue]
|
325
|
+
ffdd = arel_table[@_ff_depth]
|
326
|
+
ffgg = arel_table[@_ff_grove]
|
327
|
+
|
328
|
+
# create subquery
|
329
|
+
before_nodes_subquery = ff_usual_projection(aim_grove)
|
330
|
+
.project(ffqq.maximum.to_sql + " + 1 AS head_queue")
|
331
|
+
.where(ffqq.lt(aim_queue))
|
332
|
+
.where(ffdd.lt(top_depth))
|
333
|
+
|
334
|
+
after_nodes_subquery = ff_usual_projection(aim_grove)
|
335
|
+
.project(ffqq.minimum.to_sql + " - 1 AS tail_queue")
|
336
|
+
.where(ffqq.gt(aim_queue))
|
337
|
+
.where(ffdd.lt(top_depth))
|
338
|
+
|
339
|
+
func_maker = Arel::Nodes::NamedFunction
|
340
|
+
|
341
|
+
before_coalesce_condition = func_maker.new(
|
342
|
+
'COALESCE',
|
343
|
+
[before_nodes_subquery, 0]
|
344
|
+
)
|
345
|
+
|
346
|
+
after_coalesce_condition = func_maker.new(
|
347
|
+
'COALESCE',
|
348
|
+
[after_nodes_subquery, QUEUE_MAX_VALUE]
|
349
|
+
)
|
350
|
+
|
351
|
+
# find nodes by ancestor queues
|
352
|
+
ff_required_columns_scope()
|
353
|
+
.ff_usual_conditions_scope(aim_grove)
|
354
|
+
.ff_usual_order_scope()
|
355
|
+
.where(ffdd.eq(aim_depth + level_offset))
|
356
|
+
.where(ffqq.gteq(before_coalesce_condition))
|
357
|
+
.where(ffqq.lteq(after_coalesce_condition))
|
358
|
+
.select(ff_all_optional_columns(columns))
|
359
|
+
end
|
360
|
+
|
295
361
|
#
|
296
362
|
# Find sibling nodes from base node.
|
363
|
+
# Note: Results includes base node.
|
297
364
|
#
|
298
365
|
# @param base_obj [Entity|Integer] Base node|id to find.
|
299
366
|
# @param columns [Array] Columns for SELECT clause.
|
300
367
|
# @return [ActiveRecord::Relation] Basic query for finding sibling nodes.
|
301
368
|
# @return [nil] No sibling nodes.
|
369
|
+
# @version 1.1.0 Replace to use kinships()
|
302
370
|
#
|
303
371
|
def siblings(base_obj, columns = nil)
|
304
|
-
|
305
|
-
|
372
|
+
kinships(base_obj, KINSHIPS_AS_SIBLING, KINSHIPS_SAME_LEVEL, columns)
|
373
|
+
end
|
374
|
+
|
375
|
+
#
|
376
|
+
# Find cousin nodes from base node.
|
377
|
+
# Note: Results includes siblngs nodes.
|
378
|
+
#
|
379
|
+
# @param base_obj [Entity|Integer] Base node|id to find.
|
380
|
+
# @param columns [Array] Columns for SELECT clause.
|
381
|
+
# @return [ActiveRecord::Relation] Basic query for finding cousin nodes.
|
382
|
+
# @return [nil] No cousin nodes.
|
383
|
+
# @since 1.1.0
|
384
|
+
def cousins(base_obj, columns = nil)
|
385
|
+
kinships(base_obj, KINSHIPS_AS_COUSIN, KINSHIPS_SAME_LEVEL, columns)
|
386
|
+
end
|
387
|
+
|
388
|
+
#
|
389
|
+
# Find aunt|uncle nodes from base node.
|
390
|
+
# Note: Results includes siblngs nodes.
|
391
|
+
# @param base_obj [Entity|Integer] Base node|id to find.
|
392
|
+
# @param columns [Array] Columns for SELECT clause.
|
393
|
+
# @return [ActiveRecord::Relation] Basic query for finding aunt|uncle nodes.
|
394
|
+
# @return [nil] No aunt|uncle nodes.
|
395
|
+
# @since 1.1.0
|
396
|
+
#
|
397
|
+
def piblings(base_obj, columns = nil)
|
398
|
+
kinships(base_obj, KINSHIPS_AS_COUSIN, KINSHIPS_PARENT_LEVEL, columns)
|
399
|
+
end
|
400
|
+
|
401
|
+
#
|
402
|
+
# Find nibling nodes from base node.
|
403
|
+
# Note: Results includes siblngs nodes.
|
404
|
+
# @param base_obj [Entity|Integer] Base node|id to find.
|
405
|
+
# @param columns [Array] Columns for SELECT clause.
|
406
|
+
# @return [ActiveRecord::Relation] Basic query for finding nibling nodes.
|
407
|
+
# @return [nil] No nibling nodes.
|
408
|
+
# @since 1.1.0
|
409
|
+
#
|
410
|
+
def niblings(base_obj, columns = nil)
|
411
|
+
kinships(base_obj, KINSHIPS_AS_SIBLING, KINSHIPS_CHILD_LEVEL, columns)
|
306
412
|
end
|
307
413
|
|
308
414
|
#
|
@@ -729,6 +835,18 @@ module StewEucen
|
|
729
835
|
:ff_queue_sorted_nodes,
|
730
836
|
|
731
837
|
:ff_sort_with_queue!
|
838
|
+
|
839
|
+
alias superiors ancestors
|
840
|
+
alias forebears ancestors
|
841
|
+
alias inferiors descendants
|
842
|
+
alias afterbears descendants
|
843
|
+
alias externals leaves
|
844
|
+
alias terminals leaves
|
845
|
+
alias nephews niblings
|
846
|
+
alias nieces niblings
|
847
|
+
alias auncles piblings
|
848
|
+
alias aunts piblings
|
849
|
+
alias uncles piblings
|
732
850
|
end
|
733
851
|
end
|
734
852
|
end
|
@@ -444,7 +444,7 @@ module StewEucen
|
|
444
444
|
aim_node = ff_resolve_nodes(node_obj)
|
445
445
|
return false if aim_node.blank?
|
446
446
|
|
447
|
-
siblings_query =
|
447
|
+
siblings_query = siblings(aim_node, [@_id])
|
448
448
|
return false if siblings_query.blank?
|
449
449
|
sibling_nodes = siblings_query.all
|
450
450
|
|
@@ -25,7 +25,7 @@ module StewEucen
|
|
25
25
|
|
26
26
|
# get id hash by nested information
|
27
27
|
eldest_node = sibling_nodes.values.first
|
28
|
-
full_sibling_nodes =
|
28
|
+
full_sibling_nodes = siblings(eldest_node, [@_id]).all
|
29
29
|
|
30
30
|
child_hash = {}
|
31
31
|
bingo_count = sibling_nodes.length
|
@@ -37,12 +37,19 @@ module StewEucen
|
|
37
37
|
DESCENDANTS_ALL = 0
|
38
38
|
DESCENDANTS_ONLY_CHILD = 1
|
39
39
|
|
40
|
-
PRUNE_DESCENDANTS_ONLY = false
|
41
|
-
PRUNE_WITH_TOP_NODE = true
|
42
|
-
|
43
40
|
SUBTREE_WITHOUT_TOP_NODE = false
|
44
41
|
SUBTREE_WITH_TOP_NODE = true
|
45
42
|
|
43
|
+
KINSHIPS_AS_SIBLING = 0 # Distance for finding sibling nodes In kinships().
|
44
|
+
KINSHIPS_AS_COUSIN = 1 # Distance for finding cousin nodes In kinships().
|
45
|
+
|
46
|
+
KINSHIPS_SAME_LEVEL = 0 # Same level to find kinships. (such as siblings, cousins.)
|
47
|
+
KINSHIPS_PARENT_LEVEL = -1 # Upper level to find kinships. (such as aunts|uncles)
|
48
|
+
KINSHIPS_CHILD_LEVEL = 1 # Lower level to find kinships. (such as niblings.)
|
49
|
+
|
50
|
+
PRUNE_DESCENDANTS_ONLY = false
|
51
|
+
PRUNE_WITH_TOP_NODE = true
|
52
|
+
|
46
53
|
ORDER_BY_QUEUE_INDEX = false
|
47
54
|
ORDER_BY_DEPTH_INDEX = true
|
48
55
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fertile_forest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stew Eucen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -25,9 +25,8 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.2'
|
27
27
|
description: Fertile Forest is the new model to store hierarchical data in a database.
|
28
|
-
Conventional models are "adjacency list", "
|
29
|
-
|
30
|
-
model.
|
28
|
+
Conventional models are "adjacency list", "path enumeration", "nested set" and "closure
|
29
|
+
table". Fertile Forest has some excellent features than each conventional model.
|
31
30
|
email:
|
32
31
|
- stew.eucen@gmail.com
|
33
32
|
executables: []
|
@@ -70,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
70
69
|
version: '0'
|
71
70
|
requirements: []
|
72
71
|
rubyforge_project:
|
73
|
-
rubygems_version: 2.
|
72
|
+
rubygems_version: 2.4.8
|
74
73
|
signing_key:
|
75
74
|
specification_version: 4
|
76
75
|
summary: The new model to store hierarchical data in a database.
|