ontology.rb revision 85740b8f9c770963a1fe3a993c1745fb4f4f5ea8
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenclass Ontology < ActiveRecord::Base
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen # Ontohub Library Includes
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Commentable
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Metadatable
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde # Ontology Model Includes
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Ontology::Import
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Ontology::Scopes
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Ontology::States
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde include Ontology::Versions
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde include Ontology::Entities
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Ontology::Sentences
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Ontology::Links
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Ontology::Distributed
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Ontology::Categories
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Ontology::Oops
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Ontology::Projects
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Ontology::Tools
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Ontology::Tasks
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Ontology::LicenseModels
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Ontology::FileExtensions
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Ontology::Searching
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include GraphStructures::SpecificFetchers::Links
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen # Multiple Class Features
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen include Aggregatable
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen class DeleteError < StandardError; end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
f1743785713e7632459d623d5df2108f4b93accbTimo Sirainen belongs_to :language
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen belongs_to :logic, counter_cache: true
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen belongs_to :ontology_type
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen belongs_to :repository
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen has_many :alternative_iris, dependent: :destroy
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen has_many :source_links, class_name: 'Link', foreign_key: 'source_id', dependent: :destroy
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen has_many :target_links, class_name: 'Link', foreign_key: 'target_id', dependent: :destroy
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen has_and_belongs_to_many :formality_levels
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen attr_accessible :iri, :name, :description, :acronym, :documentation,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen :logic_id,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen :category_ids,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen :acronym,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen :file_extension,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen :projects,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen :present,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen :alternative_iris,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen :ontology_type_id,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen :formality_level_ids
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen validates_uniqueness_of :iri, :if => :iri_changed?
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen validates_format_of :iri, :with => URI::regexp(Settings.allowed_iri_schemes)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen validates :documentation,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen allow_blank: true,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen format: { with: URI::regexp(Settings.allowed_iri_schemes) }
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen validates_presence_of :basepath
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen delegate :permission?, to: :repository
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen strip_attributes :only => [:name, :iri]
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen scope :list, includes(:logic).order('ontologies.state asc, ontologies.entities_count desc')
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen scope :find_with_path, ->(path) do
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen where "ontologies.basepath = :basepath AND ontologies.file_extension = :file_extension",
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen basepath: File.basepath(path),
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen file_extension: File.extname(path)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen scope :parents_first, order('(CASE WHEN ontologies.parent_id IS NULL THEN 1 ELSE 0 END) DESC, ontologies.parent_id asc')
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen def generate_name(name)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen match = name.match(%r{
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen \A
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen .+?
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen :// # A uri has a separation between schema and hierarchy
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen .+
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen (?:/|\#)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen (?<filename>[^/]+) # Match filename after a slash/hash
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen \z
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen }x)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen if match
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen filename = match[:filename].sub(/\.[\w\d]+\z/, '')
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen capitalized_name = filename.split(/[_ ]/).map(&:capitalize).join(' ')
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen else
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen name
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen def iri_for_child(child_name)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen child_name = child_name[1..-2] if child_name[0] == '<'
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen child_name.include?("://") ? child_name : "#{iri}?#{child_name}"
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen def is?(logic_name)
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde self.logic ? (self.logic.name == logic_name) : false
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde end
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde def owl?
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde self.is?('OWL') || self.is?('OWL2')
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde end
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde def path
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde "#{basepath}#{file_extension}"
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde end
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde def symbols
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde entities
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde end
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde def symbols_count
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde entities_count
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde end
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde def to_s
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde name? ? name : iri
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde end
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde # Title for links
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde def title
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde name? ? iri : nil
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde end
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde def self.find_by_file(file)
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde s_find_by_file(file).first
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde end
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde def self.find_with_iri(iri)
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde ontology = self.find_by_iri(iri)
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde if ontology.nil?
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde ontology = AlternativeIri.find_by_iri(iri).try(:ontology)
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde end
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde ontology
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde end
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde def is_imported?
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen import_links.present?
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen def imported_by
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen import_links.map(&:source)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen def destroy_with_parent(user)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen if parent
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen repository.delete_file(parent.path, user, "Delete ontology #{parent}") do
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde parent.destroy
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen else
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen repository.delete_file(path, user, "Delete ontology #{self}") do
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen destroy
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen def destroy
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen raise DeleteError if is_imported?
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen super
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen def imported_ontologies
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen fetch_links_by_kind(self, 'import')
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen def contains_logic_translations?
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen query, args = contains_logic_translations_query(self)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen pluck_select([query, *args], :logically_translated).size > 1
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen def direct_imported_ontologies
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ontology_ids = Link.where(target_id: self, kind: 'import').
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen pluck(:source_id)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen Ontology.where(id: ontology_ids)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen def combined_sentences
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen affected_ontology_ids = [self.id] + imported_ontologies.pluck(:id)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen Sentence.where(ontology_id: affected_ontology_ids)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen # list all sentences defined on this ontology,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen # those who are self defined and those which
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen # are imported (ImpAxioms)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen def all_sentences
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen Sentence.unscoped.
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen where(ontology_id: self).
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen where('imported = ? OR imported = ?', true, false)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen def imported_sentences
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen Sentence.unscoped.
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen where(ontology_id: self).
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen where('imported = ?', true)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen end
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen protected
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen scope :s_find_by_file, ->(file) do
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen where "ontologies.basepath = :basepath AND ontologies.file_extension = :file_extension AND ontologies.parent_id IS NULL",
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen basepath: File.basepath(file),
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen file_extension: File.extname(file)
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde end
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde def import_links
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde Link.where(source_id: self.id, kind: "import")
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde end
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenend
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen