app/models/labeling/skos/base.rb
# encoding: UTF-8
# Copyright 2011-2013 innoQ Deutschland GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
class Labeling::SKOS::Base < Labeling::Base
self.rdf_namespace = 'skos'
# ********** Associations
belongs_to :target, class_name: 'Label::Base', dependent: :destroy # the destroy is new
# ********** Scopes
def self.by_label_with_language(label, language)
includes(:target).merge(self.label_class.where(value: label, language: language))
end
# ********** Methods
def self.label_class
Iqvoc::Label.base_class
end
def self.partial_name(obj)
'partials/labeling/skos/base'
end
def self.edit_partial_name(obj)
'partials/labeling/skos/edit_base'
end
def self.single_query(params = {})
query_str = build_query_string(params)
scope = includes(:target).order(Arel.sql("LENGTH(#{Label::Base.table_name}.value), #{Label::Base.table_name}.value ASC"))
languages = Array(params[:languages])
if params[:query].present?
scope = scope.
merge(Label::Base.by_query_value(query_str).by_language(languages).published).
references(:labels)
else
scope = scope.merge(Label::Base.by_language(languages).published).
references(:labels)
end
if params[:collection_origin].present?
collection = Iqvoc::Collection.base_class.where(origin: params[:collection_origin]).last
if collection
scope = scope.includes(owner: :collection_members)
scope = scope.where("#{Collection::Member::Base.table_name}.collection_id" => collection.id)
scope = scope.references(:collection_members)
else
raise "Collection with Origin #{params[:collection_origin]} not found!"
end
end
scope = scope.includes(:owner)
scope = case params[:for]
when 'concept'
scope.merge(Iqvoc::Concept.base_class.published)
when 'collection'
scope.merge(Iqvoc::Collection.base_class.published)
else
# no additional conditions
scope
end
scope = if params[:include_expired]
scope.merge(Concept::Base.not_expired).or(scope.merge(Concept::Base.expired))
else
scope.merge(Concept::Base.not_expired)
end
if params[:change_note_date_from].present? || params[:change_note_date_to].present?
change_note_relation = Iqvoc.change_note_class_name.to_relation_name
concepts = Concept::Base.base_class.published
.includes(change_note_relation.to_sym => :annotations)
.references(change_note_relation)
.references('note_annotations')
# change note type filtering
concepts = case params[:change_note_type]
when 'created'
concepts.where('note_annotations.predicate = ?', 'created')
when 'modified'
concepts.where('note_annotations.predicate = ?', 'modified')
else
concepts.where('note_annotations.predicate = ? OR note_annotations.predicate = ?', 'created', 'modified')
end
if params[:change_note_date_from].present?
begin
DateTime.parse(params[:change_note_date_from])
date_from = params[:change_note_date_from]
concepts = concepts.where('note_annotations.value >= ?', date_from)
rescue ArgumentError
Rails.logger.error "Invalid date was entered for search"
end
end
if params[:change_note_date_to].present?
begin
date_to = DateTime.parse(params[:change_note_date_to]).end_of_day.to_s
concepts = concepts.where('note_annotations.value <= ?', date_to)
rescue ArgumentError
Rails.logger.error "Invalid date was entered for search"
end
end
scope = scope.includes(:owner).merge(concepts)
end
scope = yield(scope) if block_given?
scope.map { |result| SearchResult.new(result) }
end
def self.search_result_partial_name
'partials/labeling/skos/search_result'
end
def self.build_from_rdf(rdf_subject, rdf_predicate, rdf_object)
unless rdf_subject.is_a?(Concept::Base)
raise "#{self.name}#build_from_rdf: Subject (#{rdf_subject}) must be a Concept."
end
unless rdf_object =~ RDFAPI::LITERAL_REGEXP
raise InvalidStringLiteralError, "#{self.name}#build_from_rdf: Object (#{rdf_object}) must be a string literal"
end
lang = $3
value = begin
JSON.parse(%Q{["#{$1}"]})[0].gsub('\\n', "\n") # Trick to decode \uHHHHH chars
rescue JSON::ParserError
$1
end
predicate_class = RDFAPI::PREDICATE_DICTIONARY[rdf_predicate] || self
predicate_class.new(target: self.label_class.new(value: value, language: lang)).tap do |labeling|
rdf_subject.send(predicate_class.name.to_relation_name) << labeling
end
end
def build_rdf(document, subject)
subject.send(self.rdf_namespace.camelcase).send(self.rdf_predicate, target.value.to_s, lang: target.language)
end
def build_search_result_rdf(document, result)
result.Sdc::link(IqRdf.build_uri(owner.origin))
build_rdf(document, result)
end
end