ontology_search.rb revision f0e9611d8ae43b50fb6cec75a79f1a1a9562f8e6
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornbergerrequire 'json'
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger# Beware! This is not tested well.
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornbergerclass OntologySearch
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger class Response < Struct.new(:page, :ontologiesPerPage, :ontologiesInSet, :ontologies)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def initialize
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger @limit = 20
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def make_filters_map_json
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger JSON.generate make_filters_map
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def make_repository_restrictions_json(repository, prefix)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger JSON.generate make_repository_restrictions(repository, prefix)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def make_global_restrictions_json(prefix)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger JSON.generate({text: prefix})
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def make_filters_map
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger filters_map = {
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger 'OntologyType' => [
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger {'name' => 'Ontologies', 'value' => nil, 'count' => 0},
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger *types
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ],
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger 'Repository' => [
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger {'name' => 'in all repositories', 'value' => nil, 'count' => 0},
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger *repositories
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ],
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger 'Project' => [
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger {'name' => 'from all projects', 'value' => nil, 'count' => 0},
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger *projects
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ],
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger 'FormalityLevel' => [
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger {'name' => 'in any formality', 'value' => nil, 'count' => 0},
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger *formalities
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ],
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger 'LicenseModel' => [
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger {'name' => 'under any license', 'value' => nil, 'count' => 0},
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger *licenses
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ],
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger 'Task' => [
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger {'name' => 'for any purpose', 'value' => nil, 'count' => 0},
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger *tasks
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ]
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger }
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def make_repository_restrictions(repository, prefix)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger text_list = []
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ontology_names = repository.ontologies
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger .select(:name)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger .where('name ilike ?', "#{prefix}%")
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger .group(:name)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger .limit(5)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger .pluck(:name)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ontology_names.map { |name| text_list << name }
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger Entity.collect_restrictions(prefix, repository).each do |symbol|
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger %i[display_name name text].each do |method|
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger value = symbol.call method
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger text_list << value if value
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ontology_ids = repository.ontologies.pluck(:id)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger logics = Logic.where('name ILIKE ?', "#{prefix}%").limit(5)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger logics.each do |logic|
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ids = logic.ontologies.pluck(:id)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger text_list << logic.name unless (ontology_ids & ids).empty?
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger text_list.sort.map { |x| {text: x} }
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def check_restrictions(restrictions)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger restrictions.each do |restriction|
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger unless restriction.is_a?(Hash)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger raise ArgumentError, 'a restriction was not a hash'
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger if restriction['type'].nil?
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger raise ArgumentError, 'a restriction had no specified type'
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def make_bean_list_json(repository, restrictions, page)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger check_restrictions(restrictions)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger JSON.generate(make_bean_list_response(repository, restrictions, page))
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def select_items(restrictions, type_name)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger items = Array.new
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger restrictions.each do |restriction|
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger if restriction['type'] == type_name
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger items.push restriction['item']
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger items
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def select_item(restrictions, type_name, type)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger restrictions.each do |restriction|
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger if restriction['type'] == type_name
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger if restriction['item'].nil?
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger return nil
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger else
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger return type.find_by_id(restriction['item'].to_i)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger nil
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def make_bean_list_response(repository, restrictions, page)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger identifiers = select_items(restrictions, 'Mixed')
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger properties = Hash.new
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger properties[:repository] = repository
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger properties[:ontology_type] = select_item(restrictions, 'OntologyType', OntologyType)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger properties[:project] = select_item(restrictions, 'Project', Project)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger properties[:formality_level] = select_item(restrictions, 'FormalityLevel', FormalityLevel)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger properties[:license_model] = select_item(restrictions, 'LicenseModel', LicenseModel)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger properties[:task] = select_item(restrictions, 'Task', Task)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger bean_list_factory = OntologyBeanListFactory.new
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger search = Ontology.search_by_keywords(identifiers, page, properties)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger search.results.each do |ontology|
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger bean_list_factory.add_small_bean(ontology)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger Response.new(page, @limit, search.total, bean_list_factory.bean_list)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger private
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def model_to_filters_map(model, name_proc)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger model
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger .select([:name, :id])
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger .order(:name)
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger .all
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger .map do |item|
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger {
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger 'name' => name_proc.call(item),
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger 'value' => item.id.to_s,
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger 'count' => item.ontologies.count
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger }
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def types
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger model_to_filters_map OntologyType,
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ->(x) {x.name.sub(/Ontology/, 'ontologies')}
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def repositories
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger model_to_filters_map Repository,
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ->(x) {'in ' + x.name}
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def projects
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger model_to_filters_map Project,
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ->(x) {'from ' + x.display_name }
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def formalities
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger model_to_filters_map FormalityLevel,
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ->(x) {'in ' + x.name}
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def licenses
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger model_to_filters_map LicenseModel,
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ->(x) {'under ' + x.name}
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger def tasks
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger model_to_filters_map Task,
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger ->(x) {'for ' + x.name[0..-5].from_titlecase_to_spacedlowercase}
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger end
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornbergerend
2a9b45dd7d8aa23908850179cde8426fbcd3ce60Julian Kornberger