Skip to content

Commit

Permalink
update ontologies browse to use API or Index
Browse files Browse the repository at this point in the history
  • Loading branch information
syphax-bouazzouni committed Apr 10, 2024
1 parent e554b9d commit 3a0855d
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 134 deletions.
96 changes: 63 additions & 33 deletions app/controllers/concerns/submission_filter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,34 +10,56 @@ 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], pagesize: 10)
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 = Rails.cache.fetch("ontologies_analytics-#{Time.now.year}-#{Time.now.month}") do
helpers.ontologies_analytics
end
@ontologies = LinkedData::Client::Models::Ontology.all(include: 'notes,projects', also_include_views: @show_views, display_links: false, display_context: false)

# 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] }
@total_ontologies = @ontologies.size
search_backend = params[:search_backend]
params = { query: @search,
status: request_params[:status],
show_views: @show_views,
private_only: @show_private_only,
languages: request_params[:naturalLanguage],
page_size: @total_ontologies,
formality_level: request_params[:hasFormalityLevel],
is_of_type: request_params[:isOfType],
groups: request_params[:group], categories: request_params[:hasDomain],
formats: request_params[:hasOntologyLanguage] }
submissions = []

@time = Benchmark.realtime do
if search_backend.eql?('api') || search_backend.eql?('0')
submissions = filter_using_data(**params)
else
submissions = filter_using_index(**params)
end
end
submissions

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 @@ -63,7 +85,7 @@ def filter_using_index(query:, status:, show_views:, private_only:, languages:,
end

def filter_using_data(query:, status:, show_views:, private_only:, languages:, page_size:, formality_level:, is_of_type:, groups:, categories:, formats:)
submissions = LinkedData::Client::Models::OntologySubmission.all(include: BROWSE_ATTRIBUTES.join(','), also_include_views: show_views, display_links: false, display_context: false)
submissions = LinkedData::Client::Models::OntologySubmission.all(include: 'all', also_include_views: show_views, display_links: false, display_context: false)
submissions.select do |s|
out = !s.ontology.nil?
out = out && ((s.ontology.viewingRestriction.eql?('public') && !private_only) || private_only && s.ontology.viewingRestriction.eql?('private'))
Expand Down Expand Up @@ -116,7 +138,7 @@ def sort_submission_by(submissions, sort_by)
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 @@ -150,7 +172,6 @@ def filters_params(params, includes: BROWSE_ATTRIBUTES.join(','), page: 1, pages
@filters[:show_retired] = 'true'
end


filters_values_map.each do |filter, api_key|
next if params[filter].nil? || params[filter].empty?

Expand All @@ -160,13 +181,23 @@ 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.notes = ontologies.select { |x| x.acronym.eql?(sub.ontology.acronym) }.first&.notes || []
ont.projects = ontologies.select { |x| x.acronym.eql?(sub.ontology.acronym) }.first&.projects || []

add_ontology_attributes(o, ont)
add_submission_attributes(o, sub)
Expand Down Expand Up @@ -211,12 +242,12 @@ 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)
return if ont.nil?
return if ont.nil?

ont_hash[:id] = ont.id
ont_hash[:type] = ont.viewOf.nil? ? 'ontology' : 'ontology_view'
Expand Down Expand Up @@ -249,7 +280,7 @@ def ontology_filters_init(categories, groups)
end

@formalityLevel = submission_metadata.select { |x| x['@id']['hasFormalityLevel'] }.first['enforcedValues'].map do |id, name|
{ 'id' => id, 'name' => name, 'acronym' => name.camelize(:lower), 'value' => name.delete(' ')}
{ 'id' => id, 'name' => name, 'acronym' => name.camelize(:lower), 'value' => name.delete(' ') }
end

@isOfType = submission_metadata.select { |x| x['@id']['isOfType'] }.first['enforcedValues'].map do |id, name|
Expand Down Expand Up @@ -284,10 +315,10 @@ def ontology_filters_init(categories, groups)
{
categories: object_filter(categories, :categories),
groups: object_filter(groups, :groups),
naturalLanguage: object_filter(@languages, :naturalLanguage),
naturalLanguage: object_filter(@languages, :naturalLanguage, "value"),
hasFormalityLevel: object_filter(@formalityLevel, :hasFormalityLevel),
isOfType: object_filter(@isOfType, :isOfType),
#missingStatus: object_filter(@missingStatus, :missingStatus)
# missingStatus: object_filter(@missingStatus, :missingStatus)
}
end

Expand All @@ -296,12 +327,9 @@ def check_id(name_value, objects, name_key)
selected_category.first && selected_category.first['id']
end

def object_checks(key)
params[key]&.split(',')
end

def object_filter(objects, object_name, name_key = 'acronym')
checks = object_checks(object_name) || []
checks = params[object_name]&.split(',') || []
checks = checks.map { |x| check_id(x, objects, name_key) }.compact

ids = objects.map { |x| x['id'] }
Expand All @@ -313,10 +341,10 @@ def count_objects(ontologies)
objects_count = {}
@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


@filters.each do |filter, values|
objects = values.first
objects_count[filter] = objects.map { |v| [v['id'], 0] }.to_h
Expand All @@ -326,6 +354,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
110 changes: 24 additions & 86 deletions app/controllers/ontologies_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,47 +30,37 @@ class OntologiesController < ApplicationController

# GET /ontologies
def index
@categories = LinkedData::Client::Models::Category.all(display_links: false, display_context: false)
@groups = LinkedData::Client::Models::Group.all(display_links: false, display_context: false)
@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

@filters = ontology_filters_init(@categories, @groups)
init_filters(params)
render 'ontologies/browser/browse'
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;") { t("ontologies.showing_ontologies_size", ontologies_size: @ontologies.size, analytics_size: @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 @@ -447,56 +437,11 @@ def metrics_evolution
render partial: 'ontologies/sections/metadata/metrics_evolution_graph', locals: { data: data }
end

def ontologies_selector
def selector
@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)
@select_id = params[:id]
render 'ontologies/ontologies_selector/ontologies_selector', layout: false
end

def ontologies_selector_results
@ontologies = LinkedData::Client::Models::Ontology.all(include_views: params[:showOntologyViews])
@total_ontologies_number = @ontologies.length
@input = params[:input] || ''
@ontologies = @ontologies.select { |ontology| ontology.name.downcase.include?(@input.downcase) || ontology.acronym.downcase.include?(@input.downcase) }

if params[:groups]
@ontologies = @ontologies.select do |ontology|
(ontology.group & params[:groups]).any?
end
end

if params[:categories]
@ontologies = @ontologies.select do |ontology|
(ontology.hasDomain & params[:categories]).any?
end
end

if params[:formats] || params[:naturalLanguage] || params[:formalityLevel] || params[:isOfType] || params[:showRetiredOntologies]
submissions = LinkedData::Client::Models::OntologySubmission.all({ also_include_views: 'true' })
if params[:formats]
submissions = submissions.select { |submission| params[:formats].include?(submission.hasOntologyLanguage) }
end
if params[:naturalLanguage]
submissions = submissions.select do |submission|
(submission.naturalLanguage & params[:naturalLanguage]).any?
end
end
if params[:formalityLevel]
submissions = submissions.select { |submission| params[:formalityLevel].include?(submission.hasFormalityLevel) }
end
if params[:isOfType]
submissions = submissions.select { |submission| params[:isOfType].include?(submission.isOfType) }
end
if params[:showRetiredOntologies]
submissions = submissions.reject { |submission| submission.status.eql?('retired') }
end
@ontologies = @ontologies.select do |ontology|
submissions.any? { |submission| submission.ontology.id == ontology.id }
end
end
render 'ontologies/ontologies_selector/ontologies_selector_results'
@ontologies = LinkedData::Client::Models::Ontology.all
end

private
Expand Down Expand Up @@ -553,13 +498,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
12 changes: 8 additions & 4 deletions app/javascript/controllers/browse_filters_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,14 @@ export default class extends Controller {
}

dispatchInputEvent(event) {
if (event.target.name !== "search") {
return
let value
if (event.target instanceof HTMLSelectElement) {
value = Array.from(event.target.selectedOptions).map(x => x.value)
} else {
value = [event.target.value]
}
this.#dispatchEvent("search", [event.target.value])

this.#dispatchEvent(event.target.name, value)
}

dispatchFilterEvent(event) {
Expand Down Expand Up @@ -43,7 +47,7 @@ export default class extends Controller {
break;
default:
checks = this.#getSelectedChecks().map(x => x.value)
filter = this.element.id.split("_")[0]
filter = event.target.name
}

this.#dispatchEvent(filter, checks)
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} (#{sprintf("%.2f", @time)}s)" }

- ontologies = c.collection
- ontologies.each do |ontology|
= render OntologyBrowseCardComponent.new(ontology: ontology)
Expand Down
Loading

0 comments on commit 3a0855d

Please sign in to comment.