Skip to content

Commit 6409971

Browse files
authored
Merge pull request #309 from ncbo/perf/batch-skos-root-loading
Perf: Batch load SKOS root classes
2 parents d3796b5 + b67edaf commit 6409971

4 files changed

Lines changed: 52 additions & 14 deletions

File tree

Gemfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ GIT
88

99
GIT
1010
remote: https://github.com/ncbo/goo.git
11-
revision: cc806c845c79b707e7a10f44e4959caa15939b8b
11+
revision: 752fb6b3fe2ec0ba9417397f3283baeac7a9abfc
1212
branch: development
1313
specs:
1414
goo (0.0.2)

lib/ontologies_linked_data/concerns/ontology_submissions/skos/skos_submission_roots.rb

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,12 @@ module Models
33
module SKOS
44
module RootsFetcher
55

6-
def skos_roots(concept_schemes, page, paged, pagesize)
7-
classes = []
6+
def skos_root_ids(concept_schemes, page, paged, pagesize)
87
class_ids, count = roots_by_has_top_concept(concept_schemes, page, paged, pagesize)
98

109
class_ids, count = roots_by_top_concept_of(concept_schemes, page, paged, pagesize) if class_ids.empty?
1110

12-
class_ids.each do |id|
13-
classes << LinkedData::Models::Class.find(id).in(self).disable_rules.first
14-
end
15-
16-
classes = Goo::Base::Page.new(page, pagesize, count, classes) if paged
17-
classes
11+
[class_ids, count]
1812
end
1913

2014
private

lib/ontologies_linked_data/models/ontology_submission.rb

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -711,9 +711,11 @@ def roots(extra_include = [], page = nil, pagesize = nil, concept_schemes: [], c
711711

712712
skos = self.skos?
713713
classes = []
714+
class_ids = []
715+
root_count = 0
714716

715717
if skos
716-
classes = skos_roots(concept_schemes, page, paged, pagesize)
718+
class_ids, root_count = skos_root_ids(concept_schemes, page, paged, pagesize)
717719
extra_include += LinkedData::Models::Class.concept_is_in_attributes
718720
else
719721
self.ontology.bring(:flat)
@@ -744,7 +746,12 @@ def roots(extra_include = [], page = nil, pagesize = nil, concept_schemes: [], c
744746
end
745747
end
746748

747-
where = LinkedData::Models::Class.in(self).models(classes).include(:prefLabel, :definition, :synonym, :obsolete)
749+
where = if skos
750+
LinkedData::Models::Class.in(self).ids(class_ids) unless class_ids.empty?
751+
else
752+
LinkedData::Models::Class.in(self).models(classes)
753+
end
754+
where.include(:prefLabel, :definition, :synonym, :obsolete) if where
748755

749756
if extra_include
750757
%i[prefLabel definition synonym obsolete childrenCount].each do |x|
@@ -767,9 +774,13 @@ def roots(extra_include = [], page = nil, pagesize = nil, concept_schemes: [], c
767774
load_children = [:children]
768775
end
769776

770-
where.include(extra_include) if extra_include.length > 0
777+
where.include(extra_include) if where && extra_include.length > 0
771778
end
772-
where.all
779+
if where
780+
loaded_classes = where.all
781+
classes = loaded_classes if skos
782+
end
783+
classes = Goo::Base::Page.new(page, pagesize, root_count, classes) if skos && paged
773784

774785
LinkedData::Models::Class.partially_load_children(classes, 99, self) if load_children.length > 0
775786

test/models/test_skos_submission.rb

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,40 @@ def test_roots_of_multiple_scheme
104104
'http://www.ebi.ac.uk/efo/EFO_0000324'].sort
105105
end
106106

107+
def test_roots_batch_loads_skos_classes
108+
sub = before_suite
109+
concept_schemes = ['http://www.ebi.ac.uk/efo/skos/EFO_GWAS_view_2',
110+
'http://www.ebi.ac.uk/efo/skos/EFO_GWAS_view']
111+
112+
roots = nil
113+
queries = count_sparql_queries do
114+
roots = sub.roots(concept_schemes: concept_schemes)
115+
end
116+
117+
assert_equal 6, roots.length
118+
assert_operator queries, :<=, 3,
119+
"loading #{roots.length} SKOS roots issued #{queries} SPARQL queries -- " \
120+
'looks like per-root class hydration'
121+
end
122+
123+
def test_roots_batch_load_preserves_skos_pagination
124+
sub = before_suite
125+
concept_scheme = 'http://www.ebi.ac.uk/efo/skos/EFO_GWAS_view'
126+
127+
roots = sub.roots([], 1, 2, concept_schemes: [concept_scheme])
128+
129+
assert_instance_of Goo::Base::Page, roots
130+
assert_equal 2, roots.length
131+
assert_equal 2, roots.total_pages
132+
end
133+
134+
def test_roots_with_no_skos_ids_returns_empty
135+
sub = before_suite
136+
roots = sub.roots(concept_schemes: ['http://example.org/missing-scheme'])
137+
138+
assert_empty roots
139+
end
140+
107141
def test_roots_of_scheme_collection
108142
sub = before_suite
109143

@@ -241,4 +275,3 @@ def test_concept_schemes_query_memoized_per_submission
241275
'submission instance -- per-submission memoization (#302/#303) regressed'
242276
end
243277
end
244-

0 commit comments

Comments
 (0)