diff --git a/.gitignore b/.gitignore index 4ec91ce12..21e040b68 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ logs/** .tags* cache/** vendor/bundle/* +ontologies_api.iml # YARD artifacts .yardoc diff --git a/controllers/instances_controller.rb b/controllers/instances_controller.rb index f0d257d9a..773dc31b1 100644 --- a/controllers/instances_controller.rb +++ b/controllers/instances_controller.rb @@ -2,24 +2,66 @@ class InstancesController < ApplicationController # Display individuals for a class get '/ontologies/:ontology/classes/:cls/instances' do + ont, sub = get_ontology_and_submission - check_last_modified_segment(LinkedData::Models::Class, [ont.acronym]) + check_last_modified_segment(LinkedData::Models::Instance, [ont.acronym]) cls = get_class(sub) error 404 if cls.nil? - reply LinkedData::InstanceLoader.get_instances_by_class(sub.id, cls.id) + + attributes, page, size, filter_by_label, order_by, bring_unmapped_needed = settings_params + + + + page_data = LinkedData::Models::Instance.where(filter_classes_by(cls.id)) + .in(sub) + .include(attributes) + + page_data.filter(filter_by_label) unless filter_by_label.nil? + page_data.order_by(order_by) unless order_by.nil? + page_data = page_data.page(page,size).all + + bring_unmapped_to page_data , sub if bring_unmapped_needed + + reply page_data end namespace "/ontologies/:ontology/instances" do - # Display individuals for an ontology get do ont, sub = get_ontology_and_submission check_last_modified_segment(LinkedData::Models::Instance, [ont.acronym]) - page, size = page_params - reply LinkedData::InstanceLoader.get_instances_by_ontology(sub.id, page, size) + + attributes, page, size, filter_by_label, order_by, bring_unmapped_needed = settings_params + + + page_data = LinkedData::Models::Instance.where + .in(sub) + .include(attributes) + + page_data.filter(filter_by_label) unless filter_by_label.nil? + page_data.order_by(order_by) unless order_by.nil? + page_data = page_data.page(page,size).all + + bring_unmapped_to page_data , sub if bring_unmapped_needed + + reply page_data end + get '/:inst' do + ont, sub = get_ontology_and_submission + check_last_modified_segment(LinkedData::Models::Instance, [ont.acronym]) + + attributes, page, size, filter_by_label, order_by, bring_unmapped_needed = settings_params + + page_data = LinkedData::Models::Instance.find(@params["inst"]).include(attributes).in(sub).first + + bring_unmapped_to [page_data] , sub if bring_unmapped_needed + + reply page_data + end end + + end diff --git a/helpers/instances_helper.rb b/helpers/instances_helper.rb new file mode 100644 index 000000000..ac9a5608d --- /dev/null +++ b/helpers/instances_helper.rb @@ -0,0 +1,52 @@ +require 'sinatra/base' + +module Sinatra + module Helpers + module InstancesHelper + + # TODO: generalize this to all routes (maybe in application_helper) + def settings_params + page, size = page_params + attributes = get_attributes_to_include(includes_param) + order_by = get_order_by_from(@params) + bring_unmapped = bring_unmapped?(includes_param) + filter_by_label = label_regex_filter + + [attributes, page, size, filter_by_label, order_by, bring_unmapped] + end + + def is_set?(param) + !param.nil? && param != "" + end + + def label_regex_filter + (Goo::Filter.new(:label).regex(@params["search"])) if is_set?(@params["search"]) + end + + def filter_classes_by(class_uri) + class_uri.nil? ? nil :{types: RDF::URI.new(class_uri.to_s)} + end + + def get_order_by_from(params , default_sort = :label , default_order = :asc) + {(params["sortby"] || default_sort).to_sym => params["order"] || default_order} if is_set?(@params["sortby"]) + end + + def get_attributes_to_include(includes_param) + ld = LinkedData::Models::Instance.goo_attrs_to_load(includes_param) + ld.delete(:properties) + ld + end + + def bring_unmapped?(includes_param) + (includes_param && includes_param.include?(:all)) + end + + def bring_unmapped_to(page_data, sub) + LinkedData::Models::Instance.in(sub).models(page_data).include(:unmapped).all + end + + end + end +end + +helpers Sinatra::Helpers::InstancesHelper \ No newline at end of file