Skip to content

Commit

Permalink
update the browse page to use the ontologies metadata search endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
syphax-bouazzouni committed Mar 9, 2024
1 parent 839d164 commit c61c8e1
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ export default class extends Controller {
value = value.toString().split('/').slice(-1)
}
const regex = new RegExp('\\b' + key + '\\b', 'gi');
string = string.replace(regex, value.toString())
string = string.replace(regex, value?.toString())
})

return new DOMParser().parseFromString(string, "text/html").body.firstElementChild
Expand Down
110 changes: 79 additions & 31 deletions app/controllers/concerns/submission_filter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,34 +10,43 @@ def init_filters(params)
@show_private_only = params[:private_only]&.eql?('true')
@show_retired = params[:show_retired]&.eql?('true')
@selected_format = params[:format]
@selected_sort_by = params[:sort_by].blank? ? 'visits' : params[:sort_by]
@sort_by = params[:sort_by].blank? ? 'visits' : params[:sort_by]
@search = params[:search]
end

def submissions_paginate_filter(params)
request_params = filters_params(params, page: nil)
request_params = filters_params(params, page: params[:page])
filter_params = params.permit(@filters.keys).to_h
init_filters(params)
# pagination disabled because is not supported by 4store,
# see https://github.com/ontoportal-lirmm/ontologies_api/issues/25
# @page = LinkedData::Client::Models::OntologySubmission.all(request_params)
@page = OpenStruct.new(page: 1, next_page: nil)
submissions = LinkedData::Client::Models::OntologySubmission.all(request_params)
@analytics = helpers.ontologies_analytics

@analytics = helpers.ontologies_analytics
@ontologies = LinkedData::Client::Models::Ontology.all(include: 'all', also_include_views: @show_views)
# get fair scores of all ontologies
@fair_scores = fairness_service_enabled? ? get_fair_score('all') : nil
submissions = submissions.reject { |sub| sub.ontology.nil? }.map { |sub| ontology_hash(sub) }

if @selected_sort_by.eql?('visits')
submissions = submissions.sort_by { |x| -x[:popularity] }
elsif @selected_sort_by.eql?('fair')
submissions = submissions.sort_by { |x| -x[:fairScore] }
elsif @selected_sort_by.eql?('notes')
submissions = submissions.sort_by { |x| -x[:note_count] }
elsif @selected_sort_by.eql?('projects')
submissions = submissions.sort_by { |x| -x[:project_count] }
end
submissions
@total_ontologies = @ontologies.size
submissions = helpers.search_ontologies(
query: @search,
status: request_params[:status],
show_views: @show_views,
private_only: @show_private_only,
languages: request_params[:naturalLanguage],
page_size: @total_ontologies + 100,
formality_level: request_params[:hasFormalityLevel],
is_of_type: request_params[:isOfType],
groups: request_params[:group], categories: request_params[:hasDomain],
formats: request_params[:hasOntologyLanguage]
)

submissions = submissions.reject { |sub| sub.ontology.nil? }.map { |sub| ontology_hash(sub, @ontologies) }

submissions = sort_submission_by(submissions, @sort_by) if @search.blank?

@page = paginate_submissions(submissions, request_params[:page].to_i, request_params[:pagesize].to_i)

count = @page.page.eql?(1) ? count_objects(submissions) : {}

[@page.collection, @page.totalCount, count, filter_params]
end

def ontologies_filter_url(filters, page: 1, count: false)
Expand All @@ -46,10 +55,44 @@ def ontologies_filter_url(filters, page: 1, count: false)

private

def paginate_submissions(all_submissions, page, size)
current_page = page
page_size = size

start_index = (current_page - 1) * page_size
end_index = start_index + page_size - 1
next_page = current_page * page_size < all_submissions.size ? current_page + 1 : nil
OpenStruct.new(page: current_page, nextPage: next_page, totalCount: all_submissions.size,
collection: all_submissions[start_index..end_index])
end

def sort_submission_by(submissions, sort_by)
if sort_by.eql?('visits')
submissions = submissions.sort_by { |x| -x[:popularity] }
elsif sort_by.eql?('fair')
submissions = submissions.sort_by { |x| -x[:fairScore] }
elsif sort_by.eql?('notes')
submissions = submissions.sort_by { |x| -x[:note_count] }
elsif sort_by.eql?('projects')
submissions = submissions.sort_by { |x| -x[:project_count] }
elsif sort_by.eql?('metrics_classes')
submissions = submissions.sort_by { |x| -x[:class_count] }
elsif sort_by.eql?('metrics_individuals')
submissions = submissions.sort_by { |x| -x[:individual_count] }
elsif sort_by.eql?('creationDate')
submissions = submissions.sort_by { |x| -x[:creationDate] }
elsif sort_by.eql?('released')
submissions = submissions.sort_by { |x| -x[:released] }
elsif sort_by.eql?('ontology_name')
submissions = submissions.sort_by { |x| -x[:name] }
end
submissions
end

def filters_params(params, includes: BROWSE_ATTRIBUTES.join(','), page: 1, pagesize: 5)
request_params = { display_links: false, display_context: false,
include: includes, include_status: 'RDF' }
request_params.merge!(page: page, pagesize: pagesize) if page
request_params.merge!(page: page.to_i, pagesize: pagesize.to_i) if page
filters_values_map = {
categories: :hasDomain,
groups: :group,
Expand Down Expand Up @@ -93,13 +136,21 @@ def filters_params(params, includes: BROWSE_ATTRIBUTES.join(','), page: 1, pages
end
end

unless params[:sort_by].blank?
@filters[:sort_by] = params[:sort_by]
end

unless params[:search].blank?
@filters[:search] = params[:search]
end

request_params.delete(:order_by) if %w[visits fair].include?(request_params[:sort_by].to_s)
request_params
end

def ontology_hash(sub)
def ontology_hash(sub, ontologies)
o = {}
ont = sub.ontology
ont = ontologies.select { |x| x.acronym.eql?(sub.ontology.acronym) }.first || sub.ontology

add_ontology_attributes(o, ont)
add_submission_attributes(o, sub)
Expand Down Expand Up @@ -144,8 +195,8 @@ def add_submission_attributes(ont_hash, sub)
ont_hash[:hasFormalityLevel] = sub.hasFormalityLevel
ont_hash[:isOfType] = sub.isOfType
ont_hash[:submissionStatusFormatted] = submission_status2string(sub).gsub(/\(|\)/, '')
ont_hash[:format] = sub.hasOntologyLanguage
ont_hash[:contact] = sub.contact.map(&:name).first unless sub.contact.nil?
ont_hash[:format] = sub.hasOntologyLanguage&.split('/').last
ont_hash[:contact] = sub.contact.map { |c| c.is_a?(String) ? c.split('|').first : c.name }.first unless sub.contact.nil?
end

def add_ontology_attributes(ont_hash, ont)
Expand Down Expand Up @@ -244,13 +295,8 @@ def object_filter(objects, object_name, name_key = 'acronym')

def count_objects(ontologies)
objects_count = {}
@categories = Rails.cache.fetch('all_categories') do
LinkedData::Client::Models::Category.all(display_links: false, display_context: false)
end

@groups = Rails.cache.fetch('all_groups') do
LinkedData::Client::Models::Group.all(display_links: false, display_context: false)
end
@categories = LinkedData::Client::Models::Category.all(display_links: false, display_context: false)
@groups = LinkedData::Client::Models::Group.all(display_links: false, display_context: false)

@filters = ontology_filters_init(@categories, @groups)
object_names = @filters.keys
Expand All @@ -265,6 +311,8 @@ def count_objects(ontologies)
object_names.each do |name|
values = Array(ontology[name])
values.each do |v|
v.gsub!('http://data.bioontology.org', rest_url)

objects_count[name] = {} unless objects_count[name]
objects_count[name][v] = (objects_count[name][v] || 0) + 1
end
Expand Down
51 changes: 14 additions & 37 deletions app/controllers/ontologies_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,39 +43,23 @@ def index
end

def ontologies_filter
@ontologies = submissions_paginate_filter(params)
@object_count = count_objects(@ontologies)

update_filters_counts = @object_count.map do |section, values_count|
values_count.map do |value, count|
replace("count_#{section}_#{value}") do
helpers.turbo_frame_tag("count_#{section}_#{value}") do
helpers.content_tag(:span, count.to_s, class: "hide-if-loading #{count.zero? ? 'disabled' : ''}")
@ontologies, @count, @count_objects, @request_params = submissions_paginate_filter(params)
if @page.page.eql?(1)
streams = [prepend("ontologies_list_view-page-#{@page.page}", partial: 'ontologies/browser/ontologies')]
streams += @count_objects.map do |section, values_count|
values_count.map do |value, count|
replace("count_#{section}_#{value}") do
helpers.turbo_frame_tag("count_#{section}_#{value}") do
helpers.content_tag(:span, count.to_s, class: "hide-if-loading #{count.zero? ? 'disabled' : ''}")
end
end
end
end
end.flatten
end.flatten
else
streams = [replace("ontologies_list_view-page-#{@page.page}", partial: 'ontologies/browser/ontologies')]
end

count_streams = [
replace('ontologies_filter_count_request') do
helpers.content_tag(:p, class: "browse-desc-text", style: "margin-bottom: 12px !important;") { "Showing #{@ontologies.size} of #{@analytics.keys.size}" }
end
] + update_filters_counts

streams = if params[:page].nil?
[
prepend('ontologies_list_container', partial: 'ontologies/browser/ontologies'),
prepend('ontologies_list_container') {
helpers.turbo_frame_tag("ontologies_filter_count_request") do
helpers.browser_counter_loader
end
}
]
else
[replace("ontologies_list_view-page-1", partial: 'ontologies/browser/ontologies')]
end

render turbo_stream: streams + count_streams
render turbo_stream: streams
end

def classes
Expand Down Expand Up @@ -504,13 +488,6 @@ def properties_hash_values(properties, sub: @submission_latest, custom_labels: {
properties.map { |x| [x.to_s, [sub.send(x.to_s), custom_labels[x.to_sym]]] }.to_h
end

def get_metrics_hash
metrics_hash = {}
# TODO: Metrics do not return for views on the backend, need to enable include_views param there
@metrics = LinkedData::Client::Models::Metrics.all(include_views: true)
@metrics.each { |m| metrics_hash[m.links['ontology']] = m }
return metrics_hash
end

def determine_layout
case action_name
Expand Down
6 changes: 5 additions & 1 deletion app/views/ontologies/browser/_ontologies.html.haml
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
= render InfiniteScrollComponent.new(id: 'ontologies_list',
collection: @ontologies,
next_url: ontologies_filter_url(@filters, page: @page.nextPage),
next_url: ontologies_filter_url(@request_params, page: @page.nextPage),
current_page: @page.page, next_page: @page.nextPage) do |c|

- if @page.page.eql?(1)
= content_tag(:p, class: "browse-desc-text", style: "margin-bottom: 12px !important;") { "Showing #{@count} of #{@total_ontologies}" }

- ontologies = c.collection
- ontologies.each do |ontology|
= render OntologyBrowseCardComponent.new(ontology: ontology)
Expand Down
13 changes: 4 additions & 9 deletions app/views/ontologies/browser/browse.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
});
});

%div{data: { controller: "turbo-frame history browse-filters" , "turbo-frame-url-value": "/ontologies_filter", action: "change->browse-filters#dispatchFilterEvent changed->history#updateURL changed->turbo-frame#updateFrame"}}
%div{data: { controller: "turbo-frame history browse-filters" , "turbo-frame-url-value": "/ontologies_filter?page=1&#{request.original_url.split('?').last}", action: "change->browse-filters#dispatchFilterEvent changed->history#updateURL changed->turbo-frame#updateFrame"}}

.browse-sub-container
.browse-first-row{data:{controller: "browse-filters", action: "change->browse-filters#dispatchFilterEvent changed->history#updateURL"}}
Expand Down Expand Up @@ -76,15 +76,10 @@
%select#format.browse-format-filter{:name => "format"}
= options_for_select(@formats, @selected_format)
%select#Sort_by.browse-sort-by-filter{:name => "Sort_by"}
= options_for_select(@sorts_options, @selected_sort_by)
= options_for_select(@sorts_options, @sort_by)
.browse-ontologies
= render TurboFrameComponent.new(id:"ontologies_list_container", data:{"turbo-frame-target":"frame", "turbo-frame-url-value": "/ontologies_filter"}) do |container|
= turbo_frame_tag "ontologies_filter_count_request" do
= browser_counter_loader
= render TurboFrameComponent.new(id: "ontologies_list_view-page-1" , src: "/ontologies_filter?page=1&#{request.original_url.split('?').last}") do |list|
- list.loader do
- ontologies_browse_skeleton
- container.loader do
= render TurboFrameComponent.new(id: "ontologies_list_view-page-1" , src: "/ontologies_filter?page=1&#{request.original_url.split('?').last}", data:{"turbo-frame-target":"frame", "turbo-frame-url-value": "/ontologies_filter"}) do |list|
- list.loader do
= browser_counter_loader
- ontologies_browse_skeleton

0 comments on commit c61c8e1

Please sign in to comment.