Class: MARCSpec::SolrFieldSpec

Inherits:
Object
  • Object
show all
Includes:
Logback::Simple
Defined in:
lib/marcspec/solrfieldspec.rb,
lib/marcspec/dsl.rb

Overview

The basic Solr Field spec – a specification object that knows how to extract data from a MARC record.

Direct Known Subclasses

ConstantSolrSpec, CustomSolrSpec

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opts) ⇒ SolrFieldSpec

Get a new object



18
19
20
21
22
23
24
25
26
# File 'lib/marcspec/solrfieldspec.rb', line 18

def initialize(opts)
  @solrField  = opts[:solrField]
  @first = opts[:firstOnly] || false      
  @defaultValue = opts[:default] || nil
  @map = opts[:map] || nil
  @noMapKeyDefault = opts[:noMapKeyDefault] || nil
  @arity = 1
  @marcfieldspecs = []
end

Instance Attribute Details

#_mapnameObject

Returns the value of attribute _mapname.



13
14
15
# File 'lib/marcspec/solrfieldspec.rb', line 13

def _mapname
  @_mapname
end

#arityObject (readonly)

Returns the value of attribute arity.



14
15
16
# File 'lib/marcspec/solrfieldspec.rb', line 14

def arity
  @arity
end

#defaultValueObject

Returns the value of attribute defaultValue.



13
14
15
# File 'lib/marcspec/solrfieldspec.rb', line 13

def defaultValue
  @defaultValue
end

#firstObject

Returns the value of attribute first.



13
14
15
# File 'lib/marcspec/solrfieldspec.rb', line 13

def first
  @first
end

#mapObject

Returns the value of attribute map.



13
14
15
# File 'lib/marcspec/solrfieldspec.rb', line 13

def map
  @map
end

#marcfieldspecsObject

Returns the value of attribute marcfieldspecs.



13
14
15
# File 'lib/marcspec/solrfieldspec.rb', line 13

def marcfieldspecs
  @marcfieldspecs
end

#noMapKeyDefaultObject

Returns the value of attribute noMapKeyDefault.



13
14
15
# File 'lib/marcspec/solrfieldspec.rb', line 13

def noMapKeyDefault
  @noMapKeyDefault
end

#solrFieldObject

Returns the value of attribute solrField.



13
14
15
# File 'lib/marcspec/solrfieldspec.rb', line 13

def solrField
  @solrField
end

Class Method Details

.fromHash(h) ⇒ Object

Deprecated.

Use the DSL

Build an object from an eval’d asPPString string



112
113
114
115
116
117
118
119
120
121
122
# File 'lib/marcspec/solrfieldspec.rb', line 112

def self.fromHash h
  sfs = self.new(h)
  h[:specs].each do |s|
    if MARC4J4R::ControlField.control_tag? s[0]
      sfs << MARCSpec::ControlFieldSpec.new(*s)
    else
      sfs << MARCSpec::VariableFieldSpec.new(s[0], s[1], s[2])
    end
  end
  return sfs
end

.fromPPString(str) ⇒ Object

Deprecated.

Use the DSL

Build an object from a asPPString string



105
106
107
# File 'lib/marcspec/solrfieldspec.rb', line 105

def self.fromPPString str
  return self.fromHash eval(str)
end

Instance Method Details

#<<(tagspec) ⇒ Object

Add a new tag specification

Parameters:



31
32
33
# File 'lib/marcspec/solrfieldspec.rb', line 31

def << tagspec
  @marcfieldspecs << tagspec
end

#==(other) ⇒ Boolean

Basic equality

Parameters:

Returns:

  • (Boolean)

    whether it’s the same



94
95
96
97
98
99
100
101
# File 'lib/marcspec/solrfieldspec.rb', line 94

def == other
  return ((other.solrField == self.solrField) and
         (other.first == self.first) and
         (other.map == self.map) and
         (other.defaultValue == self.defaultValue) and
         (other.noMapKeyDefault == self.noMapKeyDefault) and
         (other.marcfieldspecs == self.marcfieldspecs))
end

#asDSLStringString

Create a string representation suitable for inclusion in a DSL file

Returns:

  • (String)

    a DSL snippet



133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/marcspec/solrfieldspec.rb', line 133

def asDSLString
  s = StringIO.new
  s.puts "field('#{@solrField}') do"
  s.puts "  firstOnly" if @first
  if @defaultValue
    s.puts "  default " + 
    PP.singleline_pp(@defaultValue + "\n", s)
  end
  if @map
    s.print "  mapname "
    PP.pp(@map.mapname, s)
  end
  if @noMapKeyDefault
    s.print("  mapMissDefault ")
    PP.singleline_pp(@noMapKeyDefault, s)
    s.print("\n ")
  end
  @marcfieldspecs.each do |spec|
    s.puts "  " + spec.asDSLString
  end
  s.puts "end"
  return s.string
end

#asPPStringObject

Deprecated.

Use the DSL

Output as a string representation of a ruby hash



161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# File 'lib/marcspec/solrfieldspec.rb', line 161

def asPPString
  s = StringIO.new
  s.print "{\n :solrField=> "
  PP.singleline_pp(@solrField, s)
  s.print(",\n ")
  s.print ":firstOnly => true,\n " if @first
  if @defaultValue
    s.print(":default => ")
    PP.singleline_pp(@defaultValue, s)
    s.print(",\n ")
  end
  if @map
    s.print(":mapname => ")
    PP.singleline_pp(@map.mapname, s)
    s.print(",\n ")
  end
  if @noMapKeyDefault
    s.print(":noMapKeyDefault => ")
    PP.singleline_pp(@noMapKeyDefault, s)
    s.print(",\n ")
  end
  s.print(":specs => [\n")
  @marcfieldspecs.each do |ts|
    s.print '  '
    PP.singleline_pp(ts, s)
    s.print(",\n")
  end
  s.print " ]\n}"
  return  s.string
end

#default(val) ⇒ Object



101
102
103
# File 'lib/marcspec/dsl.rb', line 101

def default val
  @defaultValue = val
end

#firstOnly(val = true) ⇒ Object



97
98
99
# File 'lib/marcspec/dsl.rb', line 97

def firstOnly val=true
  @first = val
end

#mapMissDefault(str) ⇒ Object



109
110
111
# File 'lib/marcspec/dsl.rb', line 109

def mapMissDefault str
  @noMapKeyDefault = str
end

#mapname(str) ⇒ Object



105
106
107
# File 'lib/marcspec/dsl.rb', line 105

def mapname str
  @_mapname = str
end

#marc_values(r, doc = {}) ⇒ Array

Get the values from the MARC, provide a default or mapping as necessary

Parameters:

  • r (MARC4J4R::Record)

    The record

  • doc (Hash, SolrInputDocument) (defaults to: {})

    The hash-like object that contains previously-generated content

Returns:

  • (Array)

    an array of values from the MARC record after mapping/default/mapMissDefault/firstOnly



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/marcspec/solrfieldspec.rb', line 55

def marc_values r, doc = {}
  vals = raw_marc_values r, doc
  return vals if @arity > 1
  unless vals.is_a? Array
    vals = [vals]
  end
  
  if @first
    vals = [vals.compact.first].compact
  end

  # If we got nothing, just return either nothing or the defualt,
  # if there is one. Don't screw around with mapping.
  if vals.size == 0
    if @defaultValue.nil? # unless there's a default value, just return nothing
      return []
    else
      return [@defaultValue]
    end
  end
  
  # If we've got a map, map it.

  if (@map)
    vals.map! {|v| @map[v, @noMapKeyDefault]}
  end
  
  # Flatten it all out
  
  vals.flatten!
  vals.uniq!
  vals.compact!
  return vals
end

#pretty_print(pp) ⇒ Object

Deprecated.

Use the DSL

Output as a ruby hash



127
128
129
# File 'lib/marcspec/solrfieldspec.rb', line 127

def pretty_print pp
  pp.pp eval(self.asPPString)
end

#raw_marc_values(r, doc) ⇒ Array

Get raw (not translated by a map or anything) values from the MARC

Parameters:

  • r (MARC4J4R::Record)

    The record

  • doc (Hash, SolrInputDocument)

    The hash-like object that contains previously-generated content

Returns:

  • (Array)

    an array of values from the MARC record



41
42
43
44
45
46
47
# File 'lib/marcspec/solrfieldspec.rb', line 41

def raw_marc_values r, doc
  vals = []
  @marcfieldspecs.each do |ts|
    vals.concat ts.marc_values(r)
  end
  return vals
end

#spec(tag, &blk) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/marcspec/dsl.rb', line 47

def spec(tag, &blk)
  
  subs = nil
  if tag =~ /^(...)(.+)$/
    tag = $1
    subs = $2
  end
  
  if tag.to_i == tag
    tag = '%03d' % tag
  end
  
  marcfieldspec = nil
  
  if tag == 'LDR'
    marcfieldspec = MARCSpec::LeaderSpec.new('LDR')
  elsif MARC4J4R::ControlField.control_tag? tag
    marcfieldspec = MARCSpec::ControlFieldSpec.new(tag)
  else
    marcfieldspec = MARCSpec::VariableFieldSpec.new(tag)
  end
  
  # Did we get subs? If so, add them now.
  if subs
    marcfieldspec.codes = subs
  end
  
  marcfieldspec.instance_eval(&blk) if block_given?
  
  # If we had multiple sub calls, get them from the codehistory
  if marcfieldspec.is_a? MARCSpec::VariableFieldSpec
    marcfieldspec.codehistory.uniq.compact.each do |c|
      newmfs = marcfieldspec.clone
      newmfs.codes = c
      self << newmfs
    end
  end
  
  if marcfieldspec.is_a? MARCSpec::ControlFieldSpec
    marcfieldspec.rangehistory.uniq.compact.each do |r|
      newcfs = marcfieldspec.clone
      newcfs.range = r
      self << newcfs
    end
  end
  
  self << marcfieldspec
  return marcfieldspec
end