Module: Europeana::Blacklight::Document::Relations

Included in:
Europeana::Blacklight::Document
Defined in:
app/models/europeana/blacklight/document/relations.rb

Overview

Methods for working with relations between objects in Europeana documents

Instance Attribute Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(m, *args, &b) ⇒ Object



61
62
63
64
65
66
67
68
69
# File 'app/models/europeana/blacklight/document/relations.rb', line 61

def method_missing(m, *args, &b)
  if has_relation?(m)
    relations[m.to_s]
  elsif relation_keys.include?(m)
    []
  else
    super
  end
end

Instance Attribute Details

#relationsObject (readonly)

Returns the value of attribute relations.



9
10
11
# File 'app/models/europeana/blacklight/document/relations.rb', line 9

def relations
  @relations
end

Instance Method Details

#extract_relations(source_doc) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'app/models/europeana/blacklight/document/relations.rb', line 19

def extract_relations(source_doc)
  fields = source_doc.except(relation_keys)

  relations = HashWithIndifferentAccess.new

  relation_keys.each do |k|
    if source_doc.key?(k)
      if source_doc[k].is_a?(Hash)
        relations[k] = self.class.new(source_doc[k], nil, self)
      elsif source_doc[k].is_a?(Array)
        relations[k] = source_doc[k].map { |v| self.class.new(v, nil, self) }
      else
        fail StandardError,
             'Relations should be a collection of objects.'
      end
    end
  end

  [fields, relations]
end

#fetch_through_relation(key, *default) ⇒ Object



11
12
13
14
15
16
17
# File 'app/models/europeana/blacklight/document/relations.rb', line 11

def fetch_through_relation(key, *default)
  field = nested_field_key(key)
  container = nested_field_container(key)
  value = [container].flatten.compact.collect do |target|
    target.fetch(field, *default)
  end.compact.flatten
end

#field_in_relation?(field) ⇒ Boolean

Returns:

  • (Boolean)


40
41
42
43
# File 'app/models/europeana/blacklight/document/relations.rb', line 40

def field_in_relation?(field)
  keys = split_edm_key(field)
  (keys.size > 1) && relations.key?(keys.first)
end

#has?(k, *values) ⇒ Boolean

Returns:

  • (Boolean)


71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'app/models/europeana/blacklight/document/relations.rb', line 71

def has?(k, *values)
  if !key?(k)
    false
  elsif values.empty?
    fetch(k, nil).present?
  else
    Array(values).any? do |expected|
      Array(fetch(k, nil)).any? do |actual|
        case expected
        when Regexp
          actual =~ expected
        else
          actual == expected
        end
      end
    end
  end
end

#has_relation?(name) ⇒ Boolean

Returns:

  • (Boolean)


96
97
98
# File 'app/models/europeana/blacklight/document/relations.rb', line 96

def has_relation?(name)
  relations.key?(name.to_s)
end

#key?(k) ⇒ Boolean

Returns:

  • (Boolean)


90
91
92
93
94
# File 'app/models/europeana/blacklight/document/relations.rb', line 90

def key?(k)
  [nested_field_container(k)].flatten.any? do |container|
    container._source.key?(nested_field_key(k))
  end
end

#nested_field_container(field) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
# File 'app/models/europeana/blacklight/document/relations.rb', line 49

def nested_field_container(field)
  container = self
  if field_in_relation?(field)
    keys = split_edm_key(field)
    field = keys.last
    keys[0..-2].each do |relation_key|
      container = [container].flatten.collect { |d| d.send(relation_key.to_sym) }
    end
  end
  container
end

#nested_field_key(field) ⇒ Object



45
46
47
# File 'app/models/europeana/blacklight/document/relations.rb', line 45

def nested_field_key(field)
  split_edm_key(field).last
end