ontology_search.rb revision eaa281e9832b7c9147f91d42e32c9bd24c6a95ae
2875N/Arequire 'json'
2875N/A
2875N/A#
2875N/A# Beware! This is not tested well.
2875N/A#
2875N/Aclass OntologySearch
2875N/A
2875N/A class Response < Struct.new(:page,:ontologiesPerPage,:ontologiesInSet,:ontologies)
2875N/A end
2875N/A
2875N/A def initialize
2875N/A @limit = 20
2875N/A end
2875N/A
2875N/A def make_filters_map_json()
2875N/A JSON.generate(make_filters_map())
2875N/A end
2875N/A
2875N/A def make_repository_keyword_list_json(repository, prefix)
2875N/A JSON.generate(make_repository_keyword_list(repository, prefix))
2875N/A end
2875N/A
3158N/A def make_global_keyword_list_json(prefix)
2875N/A JSON.generate(make_global_keyword_list(prefix))
2875N/A end
2875N/A
2875N/A def make_filters_map()
2875N/A types = OntologyType.select([:name, :id]).order(:name).all.map {|type| {"name" => type.name.sub(/Ontology/, "ontologies"), "value" => type.id.to_s} }
2875N/A repositories = Repository.select([:name, :id]).order(:name).all.map {|repository| {"name" => "in " + repository.name, "value" => repository.id.to_s} }
2875N/A projects = Project.select([:name, :id]).order(:name).all.map {|project| {"name" => "from " + project.name, "value" => project.id.to_s} }
3025N/A formalities = FormalityLevel.select([:name, :id]).order(:name).all.map {|formality| {"name" => "in " + formality.name, "value" => formality.id.to_s} }
2875N/A licenses = LicenseModel.select([:name, :id]).order(:name).all.map {|license| {"name" => "under " + license.name, "value" => license.id.to_s} }
2875N/A tasks = Task.select([:name, :id]).order(:name).all.map {|task| {"name" => "for " + task.name[0..-5].from_titlecase_to_spacedlowercase, "value" => task.id.to_s} }
2875N/A filters_map = {
2875N/A 'OntologyType' => [
2875N/A { "name" => 'Ontologies', "value" => nil },
2875N/A *types
2875N/A ],
2875N/A 'Repository' => [
2875N/A { "name" => 'in all repositories', "value" => nil },
2875N/A *repositories
2875N/A ],
2875N/A 'Project' => [
2875N/A { "name" => 'from all projects', "value" => nil },
2875N/A *projects
2875N/A ],
2875N/A 'FormalityLevel' => [
3025N/A { "name" => 'in any formality', "value" => nil },
2875N/A *formalities
2875N/A ],
2875N/A 'LicenseModel' => [
2875N/A { "name" => 'under any license', "value" => nil },
2875N/A *licenses
2875N/A ],
2875N/A 'Task' => [
2875N/A { "name" => 'for any purpose', "value" => nil },
2875N/A *tasks
2875N/A ]
3025N/A }
3025N/A end
3025N/A
3025N/A def make_repository_keyword_list(repository, prefix)
3025N/A text_list = Set.new
2875N/A
2875N/A #unless repository.ontologies.where("name = :prefix", prefix: prefix, repository_id: repository).empty?
2875N/A # text_list.add(prefix)
2875N/A #end
2875N/A
2875N/A repository.ontologies.select(:name).where("name ILIKE :prefix", prefix: "#{prefix}%").limit(25).group("name").limit(5).each do |ontology|
2875N/A text_list.add(ontology.name)
2875N/A end
2875N/A
2875N/A Entity.collect_keywords(prefix, repository).each do |symbol|
2875N/A text_list.add(symbol.display_name) if symbol.display_name
2875N/A text_list.add(symbol.name) if symbol.name
2875N/A text_list.add(symbol.text) if symbol.text
2875N/A end
2875N/A
2875N/A ontology_ids = Set.new
2875N/A repository.ontologies.select(:id).each do |ontology|
2875N/A ontology_ids.add(ontology.id)
2875N/A end
2875N/A
2875N/A Logic.where("name ILIKE :prefix", prefix: "#{prefix}%").limit(5).each do |logic|
2875N/A logic_ontology_ids = Set.new
2875N/A logic.ontologies.each do |ontology|
3014N/A logic_ontology_ids.add(ontology.id)
3014N/A end
3110N/A if (ontology_ids & logic_ontology_ids).size != 0
2875N/A text_list.add(logic.name)
2875N/A end
2875N/A end
2875N/A
2875N/A text_list.to_a.sort.map { |x| {text: x} }
2875N/A end
2875N/A
2875N/A def make_global_keyword_list(prefix)
2875N/A text_list = Set.new
2875N/A text_list.add(prefix)
2875N/A text_list.to_a.sort.map { |x| {text: x} }
2875N/A end
2875N/A
2875N/A def make_bean_list_json(repository, keyword_list, page)
2875N/A JSON.generate(make_bean_list_response(repository, keyword_list, page))
2875N/A end
2875N/A
2875N/A def select_item_list(keyword_list, type_name)
2875N/A item_list = Array.new
2875N/A keyword_list.each do |keyword|
2875N/A if keyword["type"] == type_name
2875N/A item_list.push keyword["item"]
2875N/A end
2875N/A end
2875N/A item_list
2875N/A end
2875N/A
2875N/A def select_item(keyword_list, type_name, type)
2875N/A keyword_list.each do |keyword|
2875N/A if keyword["type"] == type_name
2875N/A if keyword["item"].nil?
2875N/A return nil
2875N/A else
2875N/A return type.find_by_id(keyword["item"].to_i)
2875N/A end
2875N/A end
2875N/A end
2875N/A nil
2875N/A end
2875N/A
2875N/A def make_bean_list_response(repository, keyword_list, page)
2875N/A mixed_list = select_item_list(keyword_list, 'Mixed')
2875N/A qualifiers = Hash.new
2875N/A qualifiers[:repository] = repository
2875N/A qualifiers[:ontology_type] = select_item(keyword_list, 'OntologyType', OntologyType)
2875N/A qualifiers[:project] = select_item(keyword_list, 'Project', Project)
2875N/A qualifiers[:formality_level] = select_item(keyword_list, 'FormalityLevel', FormalityLevel)
2875N/A qualifiers[:license_model] = select_item(keyword_list, 'LicenseModel', LicenseModel)
2875N/A qualifiers[:task] = select_item(keyword_list, 'Task', Task)
2875N/A
2875N/A bean_list_factory = OntologyBeanListFactory.new
2875N/A search = Ontology.search_by_keywords(mixed_list, page, qualifiers)
2875N/A search.results.each do |ontology|
2875N/A bean_list_factory.add_small_bean(ontology)
2875N/A end
2875N/A
2875N/A Response.new(page, @limit, search.total, bean_list_factory.bean_list)
2875N/A end
2875N/A
2875N/Aend
2875N/A