fertile_forest 1.1.1 → 1.2.0
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f605105d5db7a7769a308ee81c2f2643840f9ef
|
4
|
+
data.tar.gz: 915263e1161b69364dc04b0e31ff3399d5dab13a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8eb476e94442c5525097baac81878594cfe7a280bfe99e12b656d816db113641d907421880600e96038dc6888ddc91a8b4fe4bc82857336a21f6f58fbec4255
|
7
|
+
data.tar.gz: 0f7fa37321ebc48a02837f450fa0749412cadfa4e50a1dd50fb72b5cd464b89929e3acaaae7d2ceceee8ed4442c2b3325818f82988fd159511abfda0fd88e0b2
|
@@ -188,6 +188,7 @@ module StewEucen
|
|
188
188
|
self.class.grandchildren(self, columns)
|
189
189
|
end
|
190
190
|
|
191
|
+
# @since 1.1.0
|
191
192
|
def kinships(
|
192
193
|
next_branch = KINSHIPS_AS_SIBLING,
|
193
194
|
level_offset = KINSHIPS_SAME_LEVEL,
|
@@ -200,14 +201,17 @@ module StewEucen
|
|
200
201
|
self.class.siblings(self, columns)
|
201
202
|
end
|
202
203
|
|
204
|
+
# @since 1.1.0
|
203
205
|
def cousins(columns = nil)
|
204
206
|
self.class.cousins(self, columns)
|
205
207
|
end
|
206
208
|
|
209
|
+
# @since 1.1.0
|
207
210
|
def niblings(columns = nil)
|
208
211
|
self.class.niblings(self, columns)
|
209
212
|
end
|
210
213
|
|
214
|
+
# @since 1.1.0
|
211
215
|
def piblings(columns = nil)
|
212
216
|
self.class.piblings(self, columns)
|
213
217
|
end
|
@@ -146,6 +146,67 @@ module StewEucen
|
|
146
146
|
trunk_query.first
|
147
147
|
end
|
148
148
|
|
149
|
+
#
|
150
|
+
# Find cenancestor nodes of given nodes from base node.
|
151
|
+
#
|
152
|
+
# @param objects [Array] Array of base nodes|ids to find.
|
153
|
+
# @param columns [Array] Columns for SELECT clause.
|
154
|
+
# @return [Entity] Grandparent node.
|
155
|
+
# @return [nil] No grandparent node.
|
156
|
+
# @since 1.2.0
|
157
|
+
def cenancestors(objects, columns = nil)
|
158
|
+
base_nodes = ff_resolve_nodes(objects)
|
159
|
+
return nil if base_nodes.blank?
|
160
|
+
|
161
|
+
entities = base_nodes.values
|
162
|
+
|
163
|
+
# if bases include null, can not find.
|
164
|
+
return nil if entities.include? nil
|
165
|
+
|
166
|
+
# check same grove.
|
167
|
+
if has_grove?
|
168
|
+
groves = entities.map {|n| n.ff_grove }
|
169
|
+
return nil if groves.min != groves.max
|
170
|
+
end
|
171
|
+
|
172
|
+
eldist_node = entities.first;
|
173
|
+
aim_grove = eldist_node.ff_grove # When no grove, nil
|
174
|
+
|
175
|
+
ffqq = arel_table[@_ff_queue]
|
176
|
+
ffdd = arel_table[@_ff_depth]
|
177
|
+
ffgg = arel_table[@_ff_grove]
|
178
|
+
|
179
|
+
queues = entities.map {|n| n.ff_queue }
|
180
|
+
head_queue = queues.min
|
181
|
+
tail_queue = queues.max
|
182
|
+
|
183
|
+
# create subquery to find top-depth in range of head-tail.
|
184
|
+
top_depth_subquery = ff_usual_projection(aim_grove)
|
185
|
+
.project(ffdd.minimum.as('top_depth'))
|
186
|
+
.where(ffqq.gteq(head_queue))
|
187
|
+
.where(ffqq.lteq(tail_queue))
|
188
|
+
|
189
|
+
# create subquery to find queues of ancestors.
|
190
|
+
aim_group = [ffdd]
|
191
|
+
aim_group.unshift(ffgg) if has_grove?
|
192
|
+
|
193
|
+
cenancestor_nodes_subquery = ff_usual_projection(aim_grove)
|
194
|
+
.project(ffqq.maximum.as('ancestor_queue'))
|
195
|
+
.where(ffqq.lt(head_queue))
|
196
|
+
.where(ffdd.lt(top_depth_subquery))
|
197
|
+
.group(aim_group)
|
198
|
+
|
199
|
+
# find nodes by ancestor queues
|
200
|
+
# must use IN(), because trunk() is for general purpose to find ancestors
|
201
|
+
# When one row, can use "=". When plural, can not use "=".
|
202
|
+
# Error: SQLSTATE[21000]: Cardinality violation: 1242 Subquery returns more than 1 row
|
203
|
+
ff_required_columns_scope()
|
204
|
+
.ff_usual_conditions_scope(aim_grove)
|
205
|
+
.ff_usual_order_scope()
|
206
|
+
.where(ffqq.in(cenancestor_nodes_subquery))
|
207
|
+
.select(ff_all_optional_columns(columns))
|
208
|
+
end
|
209
|
+
|
149
210
|
######################################################################
|
150
211
|
|
151
212
|
#
|
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.
|
4
|
+
version: 1.2.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-
|
11
|
+
date: 2015-11-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|