Class: Inflectional::Base

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/inflectional/base.rb

Constant Summary collapse

MAPPINGS =
{
  :de => {
    :"50"	=> ["A", "EN", "AS"],
    :"51"	=> [".", "S", "ES", "ER", "ERN"],
    :"52"	=> [".", "S", "N", "E", "EN"],
    :"61"	=> [".", "ES"],
    :"62"	=> [".", "S", "ES"],
    :"71"	=> [".", "ER"],
    :"73"	=> [".", "E", "EM", "EN", "ER", "ES", "M", "N", "S"],
    :"74"	=> [".", "R", "S"],
    :"75"	=> ["A", "EN"],
    :"77"	=> ["EN", "E", "EST", "ET", "T", "TE", "TEN", "TET"],
    :"78"	=> [".", "T"],
    :"7B"	=> [".", "N", "E", "EN", "EST", "ET", "ST", "T"],
    :"80"	=> [".", "S", "E", "EN"],
    :"95"	=> [".", "E", "ES", "ER", "ERN"],
    :"9E"	=> [".", "ENS"],
    :"9F"	=> [".", "SE", "SES", "SEN"],
    :"A0"	=> [".", "EN", "E", "EST", "ET", "ST", "T", "TE", "TEN", "TET"],
    :"A1"	=> [".", "EN", "E", "EST", "ET", "T", "TE", "TEN", "TET"],
    :"A2"	=> [".", "N", "E", "ST", "T", "TE", "TEN", "TET"],
    :"A3"	=> [".", "N", "ST", "T", "TE", "TEN", "TET"],
    :"AB"	=> [".", "EN", "E", "EST", "ET", "ST", "T"],
    :"AC"	=> [".", "EN", "E", "EST", "ET", "T"],
    :"AD"	=> [".", "N", "ST", "T"],
    :"AE"	=> [".", "N", "T"],
    :"AX"	=> ["E", "N", "ST", "T", "TE", "TEN", "TET"],
    :"AY"	=> ["E", "EN", "EST", "ET", "ST", "T", "TE", "TEN", "TET"],
    :"AZ"	=> ["E", "N", "ST", "T", "TE", "TEN", "TET"],
    :"B0"	=> [".", "EN", "EST", "ET", "ST", "T"],
    :"B5"	=> ["T", "ST", "TEN", "TE", "TET"],
    :"BA"	=> [".", "EN", "EST", "ET", "T"],
    :"BB"	=> [".", "E", "EN", "EST", "ET", "ST"],
    :"BC"	=> [".", "EN", "EST", "ET", "ST"],
    :"BD"	=> [".", "EN", "EST", "ET"],
    :"BF"	=> ["E", "EN", "EST", "ET"],
    :"C0"	=> [".", "ST", "T"],
    :"C1"	=> [".", "E", "ST", "T"],
    :"C3"	=> ["ST", "T"],
    :"C4"	=> [".", "ST"],
    :"C7"	=> [".", "D", "DE", "DEM", "DEN", "DER", "DES"],
    :"C8"	=> [".", "T", "TE", "TEN", "TET"],
    :"C9"	=> [".", "D", "DE", "DEM", "DEN", "DER", "DES", "S"],
    :"CA"	=> [".", "E", "EN", "ES", "S"],
    :"CB"	=> [".", "EN", "ES"],
    :"CC"	=> [".", "E", "EN", "ES"],
    :"CD"	=> [".", "SE", "SEN"],
    :"CE"	=> [".", "E", "ER", "ERN", "ES", "S"],
    :"CF"	=> [".", "EN", "S"],
    :"CG"	=> [".", "EN", "ES", "S"],
    :"D0"	=> [".", "EN"],
    :"D1"	=> [".", "NEN"],
    :"D2"	=> [".", "R", "N"],
    :"D3"	=> [".", "N"],
    :"D4"	=> [".", "N", "NS"],
    :"D5"	=> [".", "E", "ES", "S"],
    :"D6"	=> [".", "E", "ES"],
    :"D7"	=> [".", "S"],
    :"D8"	=> [".", "EN", "ENS"],
    :"D9"	=> [".", "N", "S"],
    :"DA"	=> ["A", "AS", "ATA", "EN"],
    :"DB"	=> ["A", "AS", "ATA", "ATE"],
    :"DD"	=> ["UM", "EN", "UMS"],
    :"DE"	=> ["UM", "A", "EN", "UMS"],
    :"DF"	=> ["US", "EN"],
    :"E0"	=> ["US", "EEN"],
    :"E2"	=> ["US", "I"],
    :"E3"	=> ["S", "SSES", "NTEN", "SSE", "SSEN"],
    :"E4"	=> ["S", "DEN"],
    :"E5"	=> ["S", "ZIEN"],
    :"E6"	=> ["EX", "EXEN", "EXE", "ICES", "IZES"],
    :"E7"	=> ["X", "CES", "ZES", "ZEN"],
    :"E9"	=> ["O", "OS", "EN"],
    :"EA"	=> ["ON", "A", "EN", "ONS"],
    :"EB"	=> ["OS", "EN"],
    :"EC"	=> ["IS", "EN"],
    :"ED"	=> ["I", "IS", "EN", "E"],
    :"EE"	=> ["Y", "IES", "YS"],
    :"EF"	=> ["EN", "ENS", "INA"],
    :"F0"	=> [".", "S", "E", "IEN"],
    :"F1"	=> [".", "S", "ER"],
    :"F3"	=> [".", "M", "N", "R", "S", "RE", "REM", "REN", "RER", "RES"],
    :"F4"	=> [".", "M", "N", "R", "S"],
    :"F5"	=> [".", "E", "EM", "EN", "ER", "ES", "ERE", "EREM", "EREN", "ERER", "ERES", "EST", "ESTE", "ESTEM", "ESTEN", "ESTER", "ESTES"],
    :"F6"	=> [".", "E", "EM", "EN", "ER", "ES", "ERE", "EREM", "EREN", "ERER", "ERES", "ST", "STE", "STEM", "STEN", "STER", "STES"],
    :"F7"	=> [".", "E", "EM", "EN", "ER", "ES"],
    :"FC"	=> [".", "ER", "EN", "T", "TER", "TEN", "TES", "TEM", "TENS"],
    :"FE"	=> [".", "E", "EM", "EN", "ER", "ES", "S"],
    :"FF"	=> ["."],
    :"FG"	=> [".", "EN", "ER"],
    :"FH"	=> ["E", "EM", "EN", "ER", "ES", "S"],
    :"G7"	=> [".", "E", "EM", "EN", "ES"],
    :"N2"	=> ["Y", "IES"],
    :"N3"	=> ["F", "VES"],
    :"N9"	=> ["US", "I", "USES"],
    :"NA"	=> ["A", "AE"],
    :"NB"	=> ["UM", "A"],
    :"NC"	=> ["UM", "A", "UMS"],
    :"ND"	=> ["O", "I"],
    :"NE"	=> ["O", "I", "OS"],
    :"NF"	=> ["ON", "A"],
    :"NI"	=> ["IS", "ES", "ISES"],
    :"NL"	=> ["EX", "ICES"],
    :"NQ"	=> [".", "TA", "S"],
    :"T0"	=> [".", "E"],
    :"TA"	=> [".", "E", "S"],
    :"TF"	=> [".", "E", "EN"],
    :"TK"	=> ["LE", "LER", "LES", "EL", "LEN", "LEM"],
    :"U2"	=> ["A", "AS", "ATA"],
    :"U3"	=> [".", "EN", "ST"],
    :"U5"	=> [".", "EN", "N"],
    :"U6"	=> [".", "EN", "T"],
    :"U7"	=> [".", "E", "T"],
    :"UA"	=> [".", "EN", "ST", "T"],
    :"UB"	=> [".", "E", "ER", "ES"],
    :"UC"	=> [".", "S", "ER", "ES"],
    :"UD"	=> [".", "E", "EN", "ST"],
    :"UE"	=> [".", "E", "EN", "T"],
    :"UG"	=> [".", "S", "ES", "TEN"],
    :"UI"	=> ["E", "EN", "T"],
    :"UL"	=> [".", "ER", "ES"],
    :"UM"	=> ["E", "EN", "EST", "ET", "T"],
    :"XC"	=> ["N", "ST", "T", "TE", "TEN", "TET"],
    :"XK"	=> ["E", "EN", "EST"],
    :"XM"	=> ["E", "ST", "T", "EN", "EST", "ET"],
    :"XO"	=> ["EN", "ST", "T"],
    :"XT"	=> [".", "E", "N", "ST", "T", "TE", "TEN", "TES", "TET", "TEM", "TER"],
    :"XU"	=> [".", "ST", "T", "TE", "TEM", "TEN", "TER", "TES", "TET"],
    :"XV"	=> ["ST", "T", "TE", "TEM", "TEN", "TER", "TET", "TES"],
    :"XW"	=> ["EN", "E", "EST", "ET", "ST", "T", "TE", "TEM", "TEN", "TER", "TES", "TET"],
    :"Y0"	=> ["ES", "ER", "ERN"],
    :"Y3"	=> [".", "E", "EN", "EST", "ET"],
    :"Y4"	=> ["EN", "EST", "ET"],
    :"YA"	=> [".", "EN", "E", "EST", "ET", "ST", "T", "TE", "TEM", "TEN", "TER", "TES", "TET"],
    :"YB"	=> [".", "EN", "E", "EST", "ET", "T", "TE", "TEN", "TET", "ES"],
    :"YC"	=> [".", "N", "E", "ST", "T", "TE", "TEN", "TE", "TET", "TEM", "TER", "TES"],
    :"YD"	=> [".", "EN", "E", "EST", "ET", "TE", "TEN", "TET"],
    :"YE"	=> ["E", "EN", "ST", "T", "TE", "TEN", "TEM", "TER", "TES"],
    :"YF"	=> ["E", "N", "ST", "T", "TE", "TEN", "TEM", "TER", "TES", "TET"],
    :"YL"	=> ["E", "T"],
    :"YS"	=> ["ST", "N", "T"],
    :"YW"	=> ["E", "N", "ES", "EN"],
    :"Z1"	=> [".", "S", "N", "IN", "INNEN"],
    :"Z2"	=> [".", "EN", "IN", "INNEN"],
    :"Z4"	=> ["E", "ER", "EN", "IN", "INNEN"],
    :"Z5"	=> [".", "S", "EN", "IN", "INNEN"],
    :"Z6"	=> [".", "TER", "TEM", "TES", "TEN", "TE"],
    :"Z7"	=> [".", "E", "EN", "IN", "INNEN", "S"],
    :"Z8"	=> [".", "EN", "IN", "N", "INNEN"],
    :"ZZ"	=> ["E", "EN", "IN", "INNEN"]
  },

  :en => {
    :"D0" =>	[".", "EN"],
    :"D7" =>	[".", "S"],
    :"E2" =>	["US", "I"],
    :"EE" =>	["Y", "IES", "YS"],
    :"FF" =>	["."],
    :"N1" =>	[".", "ES"],
    :"N2" =>	["Y", "IES"],
    :"N3" =>	["F", "VES"],
    :"N5" =>	["F", "FS", "VES"],
    :"N7" =>	[".", "REN"],
    :"N8" =>	["US", "I"],
    :"NA" =>	["A", "AE"],
    :"NB" =>	["UM", "A"],
    :"NC" =>	["UM", "A", "UMS"],
    :"ND" =>	["O", "I"],
    :"NE" =>	["O", "I", "OS"],
    :"NF" =>	["ON", "A"],
    :"NG" =>	["ON", "A", "ONS"],
    :"NH" =>	["IS", "ES"],
    :"NM" =>	["EX", "ICES", "EXES"],
    :"NO" =>	["X", "CES", "XES"],
    :"R0" =>	["R", "ST"],
    :"R1" =>	[".", "R", "ST"],
    :"R2" =>	[".", "R", "ST", "LY"],
    :"R3" =>	[".", "ER", "EST"],
    :"R4" =>	["Y", "IER", "IEST"],
    :"R5" =>	[".", "LY"],
    :"R6" =>	[".", "ER", "EST", "LY"],
    :"R7" =>	["Y", "IER", "IEST", "ILY"],
    :"R8" =>	["E", "ER", "EST", "LY"],
    :"R9" =>	["LE", "LY"],
    :"RA" =>	["Y", "ILY"],
    :"U2"	=> ["A", "AS", "ATA"],
    :"V0" =>	[".", "S", "D"],
    :"V1" =>	[".", "S", "ED"],
    :"V2" =>	[".", "ED"],
    :"V3" =>	[".", "ES", "ED"],
    :"V4" =>	["ED", "ING"],
    :"V5" =>	["E", "ES", "ING"],
    :"V7" =>	[".", "S", "ED", "ING"],
    :"V8" =>	[".", "ES", "ED", "ING"],
    :"V9" =>	["E", "ES", "ED", "ING"],
    :"VA" =>	[".", "S", "LED", "LING"],
    :"VB" =>	[".", "Y", "IES", "IED", "YING"],
    :"VC" =>	[".", "S", "ING"],
    :"VD" =>	[".", "ING"],
    :"VE" =>	[".", "ED", "ING"],
    :"VF" =>	[".", "S", "NED", "NING"],
    :"VG" =>	[".", "S", "PED", "PING"],
    :"VH" =>	[".", "S", "RED", "RING"],
    :"VI" =>	[".", "S", "TED", "TING"],
    :"VJ" =>	[".", "ES", "ING"],
    :"VK" =>	[".", "S", "BED", "BING"],
    :"VM" =>	[".", "S", "D", "ING"],
    :"VN" =>	[".", "S", "DED", "DING"],
    :"VP" =>	[".", "S", "EN", "ING"],
    :"VQ" =>	[".", "S", "GED", "GING"],
    :"VR" =>	[".", "S", "MED", "MING"],
    :"VS" =>	[".", "S", "SED", "SING"],
    :"VT" =>	["US", "USSE", "USSEN", "EN"]
  }
}

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.build_from_rdf(subject, predicate, object) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'app/models/inflectional/base.rb', line 25

def self.build_from_rdf(subject, predicate, object)
  unless object =~ RDFAPI::LITERAL_REGEXP
    raise InvalidStringLiteralError, "#{self.name}#build_from_rdf: Object (#{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

  where(:label => subject, :value => value).first_or_create
end

.by_query_value(query) ⇒ Object



40
41
42
# File 'app/models/inflectional/base.rb', line 40

def self.by_query_value(query)
  where(["LOWER(#{table_name}.value) LIKE ?", query.to_s.downcase])
end

.candidates_for(base_form, language, inflectional_code) ⇒ Object



279
280
281
282
283
284
285
286
287
# File 'app/models/inflectional/base.rb', line 279

def self.candidates_for(base_form, language, inflectional_code)
  return [] if language.blank? || inflectional_code.blank? || base_form.blank?

  endings = for_language_and_code(language, inflectional_code)

  endings.map do |ending|
    ending == '.' ? base_form : (base_form + ending.downcase)
  end
end

.codes_for_language(lang) ⇒ Object



260
261
262
263
# File 'app/models/inflectional/base.rb', line 260

def self.codes_for_language(lang)
  return [] if lang.blank? || !mappings.has_key?(lang.to_sym)
  mappings[lang.to_sym].keys.sort {|a,b| a.to_s <=> b.to_s }
end

.deep_cloning_relationsObject



321
322
323
# File 'app/models/inflectional/base.rb', line 321

def self.deep_cloning_relations
  self.name.to_relation_name
end

.edit_partial_name(obj) ⇒ Object



337
338
339
# File 'app/models/inflectional/base.rb', line 337

def self.edit_partial_name(obj)
  "partials/inflectional/edit_base"
end

.for_language_and_code(lang, code) ⇒ Object



265
266
267
268
# File 'app/models/inflectional/base.rb', line 265

def self.for_language_and_code(lang, code)
  return [] if lang.blank? || code.blank? || !mappings.has_key?(lang.to_sym) || !mappings[lang.to_sym].has_key?(code.to_sym)
  mappings[lang.to_sym][code.to_sym]
end

.forces_multi_query?Boolean

Returns:

  • (Boolean)


289
290
291
# File 'app/models/inflectional/base.rb', line 289

def self.forces_multi_query?
  true
end

.mappingsObject



275
276
277
# File 'app/models/inflectional/base.rb', line 275

def self.mappings
  MAPPINGS
end

.mappings_for_language(lang) ⇒ Object



270
271
272
273
# File 'app/models/inflectional/base.rb', line 270

def self.mappings_for_language(lang)
  return [] if lang.blank? || !mappings.has_key?(lang.to_sym)
  mappings[lang.to_sym].map.sort {|a,b| a.first.to_s <=> b.first.to_s }
end

.normalize(str) ⇒ Object



345
346
347
# File 'app/models/inflectional/base.rb', line 345

def self.normalize(str)
  Digest::MD5.hexdigest(str.to_s.mb_chars.downcase)
end

.partial_name(obj) ⇒ Object



333
334
335
# File 'app/models/inflectional/base.rb', line 333

def self.partial_name(obj)
  "partials/inflectional/base"
end

.referenced_by(label_class) ⇒ Object



316
317
318
319
# File 'app/models/inflectional/base.rb', line 316

def self.referenced_by(label_class)
  # To something with the label class
  label_class.send(:include, Inflectionable)
end

.search_result_partial_nameObject

def self.single_query(params = {})

query_str = build_query_string(params)

Label::UMT::Base.select("DISTINCT #{Label::UMT::Base.table_name}.*").
                 joins(:inflectionals).
                 where(Inflectional::Base.by_query_value(query_str)).
                 by_language(params[:languages].to_a).
                 published.
                 order("LOWER(#{Inflectional::Base.table_name}.value)")

end



312
313
314
# File 'app/models/inflectional/base.rb', line 312

def self.search_result_partial_name
  'partials/inflectional/search_result'
end

.single_query(params = {}) ⇒ Object



293
294
295
296
297
298
299
# File 'app/models/inflectional/base.rb', line 293

def self.single_query(params = {})
  query_str = build_query_string(params)

  scope = by_query_value(query_str).includes(:label)
  scope = scope.references(:labels).merge(Iqvoc::XLLabel.base_class.by_language(params[:languages].to_a).published.order("LOWER(#{Label::Base.table_name}.value)"))
  scope.map { |result| SearchResult.new(result) }
end

.view_section(obj) ⇒ Object



325
326
327
# File 'app/models/inflectional/base.rb', line 325

def self.view_section(obj)
  "inflectionals"
end

.view_section_sort_key(obj) ⇒ Object



329
330
331
# File 'app/models/inflectional/base.rb', line 329

def self.view_section_sort_key(obj)
  200
end

Instance Method Details

#==(other) ⇒ Object



349
350
351
# File 'app/models/inflectional/base.rb', line 349

def ==(other)
  self.normal_hash == other.try(:normal_hash)
end

#build_rdf(document, subject) ⇒ Object



341
342
343
# File 'app/models/inflectional/base.rb', line 341

def build_rdf(document, subject)
  subject.send(rdf_namespace).send(rdf_predicate, value, :lang => label.language)
end

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


353
354
355
# File 'app/models/inflectional/base.rb', line 353

def eql?(other)
  self == other
end

#value=(str) ⇒ Object



18
19
20
21
22
23
# File 'app/models/inflectional/base.rb', line 18

def value=(str)
  write_attribute(:value, str)

  value_hash = self.class.normalize(str)
  write_attribute(:normal_hash, value_hash)
end