traject 0.9.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -49,33 +49,16 @@ class Traject::Marc4JReader
49
49
  ensure_marc4j_loaded!
50
50
  end
51
51
 
52
- # Loads solrj if not already loaded. By loading all jars found
53
- # in settings["solrj.jar_dir"]
52
+ # Loads solrj unless it appears to already be loaded.
53
+ #
54
+ # Will load from settings['marc4j_reader.jar_dir'] if given, otherwise
55
+ # bundled vendor location.
56
+ #
57
+ # Will java_import MarcPermissiveStreamReader and MarcXmlReader so you
58
+ # have those available as un-namespaced classes.
54
59
  def ensure_marc4j_loaded!
55
- unless defined?(MarcPermissiveStreamReader)
56
- require 'java'
57
-
58
- tries = 0
59
- begin
60
- tries += 1
61
- java_import org.marc4j.MarcPermissiveStreamReader
62
- java_import org.marc4j.MarcXmlReader
63
- rescue NameError => e
64
- # /Users/jrochkind/code/solrj-gem/lib"
65
-
66
- include_jar_dir = File.expand_path("../../vendor/marc4j/lib", File.dirname(__FILE__))
67
-
68
- jardir = settings["marc4j_reader.jar_dir"] || include_jar_dir
69
- Dir.glob("#{jardir}/*.jar") do |x|
70
- require x
71
- end
72
-
73
- if tries > 1
74
- raise LoadError.new("Can not find Marc4J java classes")
75
- else
76
- retry
77
- end
78
- end
60
+ unless defined?(MarcPermissiveStreamReader) && defined?(MarcXmlReader)
61
+ Traject::Util.require_marc4j_jars(settings)
79
62
  end
80
63
  end
81
64
 
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  module Traject
4
2
  # MarcExtractor is a class for extracting lists of strings from a MARC::Record,
5
3
  # according to specifications. See #parse_string_spec for description of string
@@ -8,28 +6,36 @@ module Traject
8
6
  #
9
7
  # Examples:
10
8
  #
11
- # array_of_stuff = MarcExtractor.new(marc_record, "001:245abc:700a").extract
12
- # values = MarcExtractor.new(marc_record, "040a", :seperator => nil).extract
9
+ # array_of_stuff = MarcExtractor.new("001:245abc:700a").extract(marc_record)
10
+ # values = MarcExtractor.new("040a", :seperator => nil).extract(marc_record)
11
+ #
12
+ #
13
+ # == Note on Performance and MarcExtractor creation and reuse
14
+ #
15
+ # A MarcExtractor is somewhat expensive to create, and has been shown in profiling/
16
+ # benchmarking to be a bottleneck if you end up creating one for each marc record
17
+ # processed. Instead, a single MarcExtractor should be created, and re-used
18
+ # per MARC record.
19
+ #
20
+ # If you are creating a traject 'macro' method, here's one way to do that,
21
+ # capturing the MarcExtractor under closure:
13
22
  #
23
+ # def some_macro(spec, other_args, whatever)
24
+ # extractor = MarcExtractor.new( spec )
25
+ # # ...
26
+ # return lambda do |record, accumulator, context|
27
+ # #...
28
+ # accumulator.concat extractor.extract(record)
29
+ # #...
30
+ # end
31
+ # end
32
+ #
33
+ # In other cases, you may find it convenient to improve performance by
34
+ # using the MarcExtractor#cached method, instead of MarcExtractor#new, to
35
+ # lazily create and then re-use a MarcExtractor object with
36
+ # particular initialization arguments.
14
37
  class MarcExtractor
15
- attr_accessor :options, :marc_record, :spec_hash
16
-
17
-
18
- # Convenience method to construct a MarcExtractor object and
19
- # run extract on it.
20
- #
21
- # First arg is a marc record.
22
- #
23
- # Second arg is either a string that will be given to parse_string_spec,
24
- # OR a hash that's the return value of parse_string_spec.
25
- #
26
- # Third arg is an optional options hash that will be passed as
27
- # third arg of MarcExtractor constructor.
28
- def self.extract_by_spec(marc_record, specification, options = {})
29
- (raise ArgumentError, "first argument must not be nil") if marc_record.nil?
30
-
31
- Traject::MarcExtractor.new(marc_record, specification, options).extract
32
- end
38
+ attr_accessor :options, :spec_hash
33
39
 
34
40
  # Take a hash that's the output of #parse_string_spec, return
35
41
  # an array of strings extracted from a marc record accordingly
@@ -47,21 +53,71 @@ module Traject
47
53
  # that match spec. Also:
48
54
  # * false => do not include.
49
55
  # * :only => only include linked 880s, not original
50
- def initialize(marc_record, spec, options = {})
56
+ def initialize(spec, options = {})
51
57
  self.options = {
52
58
  :seperator => ' ',
53
59
  :alternate_script => :include
54
60
  }.merge(options)
55
61
 
56
- self.marc_record = marc_record
57
-
58
62
  self.spec_hash = spec.kind_of?(Hash) ? spec : self.class.parse_string_spec(spec)
63
+
64
+
65
+ # Tags are "interesting" if we have a spec that might cover it
66
+ @interesting_tags_hash = {}
67
+
68
+ # By default, interesting tags are those represented by keys in spec_hash.
69
+ # Add them unless we only care about alternate scripts.
70
+ unless options[:alternate_script] == :only
71
+ self.spec_hash.keys.each {|tag| @interesting_tags_hash[tag] = true}
72
+ end
73
+
74
+ # If we *are* interested in alternate scripts, add the 880
75
+ if options[:alternate_script] != false
76
+ @interesting_tags_hash['880'] = true
77
+ end
78
+ end
79
+
80
+ # Takes the same arguments as MarcExtractor.new, but will re-use an existing
81
+ # cached MarcExtractor already created with given initialization arguments,
82
+ # if available.
83
+ #
84
+ # This can be used to increase performance of indexing routines, as
85
+ # MarcExtractor creation has been shown via profiling/benchmarking
86
+ # to be expensive.
87
+ #
88
+ # Cache is thread-local, so should be thread-safe.
89
+ #
90
+ # You should _not_ modify the state of any MarcExtractor retrieved
91
+ # via cached, as the MarcExtractor will be re-used and shared (possibly
92
+ # between threads even!). We try to use ruby #freeze to keep you from doing so,
93
+ # although if you try hard enough you can surely find a way to do something
94
+ # you shouldn't.
95
+ #
96
+ # extractor = MarcExtractor.cached("245abc:700a", :seperator => nil)
97
+ def self.cached(*args)
98
+ cache = (Thread.current[:marc_extractor_cached] ||= Hash.new)
99
+ extractor = (cache[args] ||= begin
100
+ ex = Traject::MarcExtractor.new(*args).freeze
101
+ ex.options.freeze
102
+ ex.spec_hash.freeze
103
+ ex
104
+ end)
105
+
106
+ return extractor
59
107
  end
60
108
 
109
+ # Check to see if a tag is interesting (meaning it may be covered by a spec
110
+ # and the passed-in options about alternate scripts)
111
+
112
+ def interesting_tag?(tag)
113
+ return @interesting_tags_hash.include?(tag)
114
+ end
115
+
116
+
61
117
  # Converts from a string marc spec like "245abc:700a" to a nested hash used internally
62
118
  # to represent the specification.
63
119
  #
64
- # a String specification is a string of form:
120
+ # a String specification is a string (or array of strings) of form:
65
121
  # {tag}{|indicators|}{subfields} seperated by colons
66
122
  # tag is three chars (usually but not neccesarily numeric),
67
123
  # indicators are optional two chars prefixed by hyphen,
@@ -93,8 +149,9 @@ module Traject
93
149
  # See tests for more examples.
94
150
  def self.parse_string_spec(spec_string)
95
151
  hash = {}
152
+ spec_strings = spec_string.is_a?(Array) ? spec_string.map{|s| s.split(/\s*:\s*/)}.flatten : spec_string.split(/s*:\s*/)
96
153
 
97
- spec_string.split(":").each do |part|
154
+ spec_strings.each do |part|
98
155
  if (part =~ /\A([a-zA-Z0-9]{3})(\|([a-z0-9\ \*]{2})\|)?([a-z0-9]*)?\Z/)
99
156
  # variable field
100
157
  tag, indicators, subfields = $1, $3, $4
@@ -129,10 +186,10 @@ module Traject
129
186
 
130
187
 
131
188
  # Returns array of strings, extracted values. Maybe empty array.
132
- def extract
189
+ def extract(marc_record)
133
190
  results = []
134
191
 
135
- self.each_matching_line do |field, spec|
192
+ self.each_matching_line(marc_record) do |field, spec|
136
193
  if control_field?(field)
137
194
  results << (spec[:bytes] ? field.value.byteslice(spec[:bytes]) : field.value)
138
195
  else
@@ -150,9 +207,17 @@ module Traject
150
207
  #
151
208
  # Third (optional) arg to block is self, the MarcExtractor object, useful for custom
152
209
  # implementations.
153
- def each_matching_line
154
- self.marc_record.each do |field|
155
- if (spec = spec_covering_field(field)) && matches_indicators(field, spec)
210
+ def each_matching_line(marc_record)
211
+ marc_record.fields(@interesting_tags_hash.keys).each do |field|
212
+
213
+ spec = spec_covering_field(field)
214
+
215
+ # Don't have a spec that addresses this field? Move on.
216
+ next unless spec
217
+
218
+ # Make sure it matches indicators too, spec_covering_field
219
+ # doens't check that.
220
+ if matches_indicators(field, spec)
156
221
  yield(field, spec, self)
157
222
  end
158
223
  end
@@ -162,9 +227,9 @@ module Traject
162
227
  # but collects results of block into an array -- flattens any subarrays for you!
163
228
  #
164
229
  # Useful for re-use of this class for custom processing
165
- def collect_matching_lines
230
+ def collect_matching_lines(marc_record)
166
231
  results = []
167
- self.each_matching_line do |field, spec, extractor|
232
+ self.each_matching_line(marc_record) do |field, spec, extractor|
168
233
  results.concat [yield(field, spec, extractor)].flatten
169
234
  end
170
235
  return results
@@ -187,24 +252,32 @@ module Traject
187
252
  return options[:seperator] ? [ subfields.join( options[:seperator]) ] : subfields
188
253
  end
189
254
 
190
- # Is there a spec covering extraction from this field?
191
- # May return true on 880's matching other tags depending
192
- # on value of :alternate_script
193
- # if :alternate_script is :only, will return original spec when field is an 880.
194
- # otherwise will always return nil for 880s, you have to handle :alternate_script :include
195
- # elsewhere, to add in the 880 in the right order
255
+
256
+ # Find a spec, if any, covering extraction from this field
257
+ #
258
+ # When given an 880, will return the spec (if any) for the linked tag iff
259
+ # we have a $6 and we want the alternate script.
260
+ #
261
+ # Returns nil if no matching spec is found
262
+
196
263
  def spec_covering_field(field)
197
- if field.tag == "880" && field['6'] && options[:alternate_script] != false
198
- # pull out the spec for corresponding original marc tag this 880 corresponds to
199
- # Due to bug in jruby https://github.com/jruby/jruby/issues/886 , we need
200
- # to do this weird encode gymnastics, which fixes it for mysterious reasons.
201
- orig_field = field["6"].encode(field["6"].encoding).byteslice(0,3)
202
- field["6"] && self.spec_hash[ orig_field ]
203
- elsif options[:alternate_script] != :only
204
- self.spec_hash[field.tag]
264
+ tag = field.tag
265
+
266
+ # Short-circuit the unintersting stuff
267
+ return nil unless interesting_tag?(tag)
268
+
269
+ # Due to bug in jruby https://github.com/jruby/jruby/issues/886 , we need
270
+ # to do this weird encode gymnastics, which fixes it for mysterious reasons.
271
+
272
+ if tag == "880" && field['6']
273
+ tag = field["6"].encode(field["6"].encoding).byteslice(0,3)
205
274
  end
275
+
276
+ # Take the resulting tag and get the spec from it (or the default nil if there isn't a spec for this tag)
277
+ spec = self.spec_hash[tag]
206
278
  end
207
279
 
280
+
208
281
  def control_field?(field)
209
282
  # should the MARC gem have a more efficient way to do this,
210
283
  # define #control_field? on both ControlField and DataField?
@@ -0,0 +1,87 @@
1
+ # Encoding: utf-8
2
+ require 'marc'
3
+ require 'json'
4
+ module Traject
5
+
6
+ # A mock reader, designed to do almost no work during a run to provide better benchmarking
7
+ #
8
+ # It pulls in 20 records from the end of this file and then just returns
9
+ # them over and over again, up to the specified limit
10
+ #
11
+ # Specify in a config files as follows:
12
+ #
13
+ # require 'traject/mock_writer'
14
+ # require 'traject/mock_reader'
15
+ #
16
+ # settings do
17
+ # store "reader_class_name", "Traject::MockReader"
18
+ # store "writer_class_name", "Traject::MockWriter"
19
+ # store "mock_reader.limit", 4_000 # default is 10_000
20
+ # end
21
+
22
+ class MockReader
23
+
24
+ attr_accessor :limit
25
+
26
+ # @param [Ignored] input_stream (ignored)
27
+ # @param [Hash] settings (looks only for an integer in 'mock_reader.limit')
28
+ def initialize(input_stream, settings = {})
29
+ @records = []
30
+ @limit = settings["mock_reader.limit"] || 10_000
31
+
32
+ this_file_iter = File.open(__FILE__).each_line
33
+
34
+ while true
35
+ line = this_file_iter.next
36
+ break if line =~ /^\_\_END\_\_/
37
+ end
38
+
39
+ begin
40
+ while true
41
+ json = this_file_iter.next
42
+ next unless json =~ /\S/
43
+ @records << MARC::Record.new_from_hash(JSON.parse(json))
44
+ end
45
+ rescue StopIteration
46
+ end
47
+
48
+ end
49
+
50
+
51
+ def each
52
+ unless block_given?
53
+ enum_for(:each)
54
+ else
55
+ size = @records.size
56
+ @limit.times do |i|
57
+ yield @records[i % size]
58
+ end
59
+ end
60
+ end
61
+
62
+
63
+ end
64
+ end
65
+
66
+ __END__
67
+ {"leader":"01195nam a22004331 4500","fields":[{"001":"000001580"},{"003":"MiU"},{"005":"19880715000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715s1970 enk |00100 eng "},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"74120936"}]}},{"015":{"ind1":" ","ind2":" ","subfields":[{"a":"B70-19354"}]}},{"020":{"ind1":" ","ind2":" ","subfields":[{"a":"0631126902"},{"c":"45/-"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0113131-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159819858"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00113131"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"sdr-wu1874523"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"a":"DLC"},{"c":"DLC"},{"d":"MiU"}]}},{"043":{"ind1":" ","ind2":" ","subfields":[{"a":"e-uk---"}]}},{"050":{"ind1":" ","ind2":"4","subfields":[{"a":"HD1491.G7"},{"b":"D521 1970"}]}},{"082":{"ind1":" ","ind2":" ","subfields":[{"a":"334/.683/0917242"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Digby, Margaret,"},{"d":"1902-"}]}},{"245":{"ind1":"1","ind2":"0","subfields":[{"a":"Agricultural co-operation in the Commonwealth."}]}},{"250":{"ind1":" ","ind2":" ","subfields":[{"a":"2nd ed."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"Oxford,"},{"b":"Blackwell,"},{"c":"1970."}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"[1], vii, 222 p."},{"c":"23 cm."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Agriculture, Cooperative"},{"z":"Great Britain"},{"x":"Colonies."}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"BUHR"},{"c":"GRAD"},{"h":"HD1491.G7 D521 1970"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"a":"wu"},{"b":"SDR"},{"c":"WU"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015030215993"},{"r":"ic"},{"d":"20120530"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"wu.89041950478"},{"r":"ic"},{"d":"20120529"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
68
+ {"leader":"01444nam a22004571 4500","fields":[{"001":"000001646"},{"003":"MiU"},{"005":"19880715000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715s1969 onc b 00110 eng "},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"75520445"}]}},{"015":{"ind1":" ","ind2":" ","subfields":[{"a":"C***"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0117360-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159819933"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00117360"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"sdr-nrlf-ucscb16742595x"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"a":"DLC"},{"c":"DLC"},{"d":"MiU"}]}},{"041":{"ind1":"1","ind2":" ","subfields":[{"a":"eng"},{"h":"lat"}]}},{"050":{"ind1":"0","ind2":" ","subfields":[{"a":"PA8395.P36"},{"b":"D513"}]}},{"082":{"ind1":" ","ind2":" ","subfields":[{"a":"398.2/0917/4927"}]}},{"100":{"ind1":"0","ind2":" ","subfields":[{"a":"Petrus Alfonsi,"},{"d":"1062-1110?"}]}},{"240":{"ind1":"1","ind2":"0","subfields":[{"a":"Disciplina Clericalis."},{"l":"English"}]}},{"245":{"ind1":"1","ind2":"4","subfields":[{"a":"The scholar's guide."},{"b":"A translation of the twelfth-century Disciplina Clericalis of Pedro Alfonso,"},{"c":"by Joseph Ramon Jones and John Esten Keller."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"Toronto,"},{"b":"Pontifical Institute of Mediaeval Studies,"},{"c":"1969."}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"117 p."},{"c":"20 cm."}]}},{"504":{"ind1":" ","ind2":" ","subfields":[{"a":"Includes bibliographical references."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"700":{"ind1":"1","ind2":" ","subfields":[{"a":"Jones, Joseph Ramon,"},{"d":"1935-"}]}},{"700":{"ind1":"1","ind2":" ","subfields":[{"a":"Keller, John Esten,"},{"e":"ed."}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"PA8395.P48 D63 1969"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"PA8395.P48 D63 1969"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015005879807"},{"r":"ic"},{"d":"20120530"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015011292607"},{"r":"ic"},{"d":"20120530"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"c":"SEP"},{"s":"9115"}]}}]}
69
+ {"leader":"01217nam a22004331 4500","fields":[{"001":"000001659"},{"003":"MiU"},{"005":"19880715000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715s1969 nyu b 00110 eng "},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"69019912"}]}},{"020":{"ind1":" ","ind2":" ","subfields":[{"a":"0030771153"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0118050-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159819948"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00118050"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"sdr-nrlf.b146119964"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"a":"DLC"},{"c":"DLC"},{"d":"MiU"}]}},{"050":{"ind1":"0","ind2":" ","subfields":[{"a":"P291"},{"b":".C58"}]}},{"082":{"ind1":" ","ind2":" ","subfields":[{"a":"415"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Cook, Walter Anthony,"},{"d":"1922-"}]}},{"245":{"ind1":"1","ind2":"0","subfields":[{"a":"Introduction to tagmemic analysis"},{"c":"[by] Walter A. Cook."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"New York,"},{"b":"Holt, Rinehart and Winston"},{"c":"[1969]"}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"viii, 210 p."},{"c":"23 cm."}]}},{"490":{"ind1":"0","ind2":" ","subfields":[{"a":"Transatlantic series in linguistics"}]}},{"504":{"ind1":" ","ind2":" ","subfields":[{"a":"Bibliography: p. 200-204."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Tagmemics"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"BUHR"},{"c":"GRAD"},{"h":"P 160 .C77 1969"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"P 160 .C77 1969"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015013397750"},{"r":"ic"},{"d":"20120530"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015030740339"},{"r":"ic"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
70
+ {"leader":"00937nam a22003491 4500","fields":[{"001":"000003028"},{"003":"MiU"},{"005":"19880715000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715s1971 nyu |00011 eng "},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"78156496"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0208418-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159821539"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00208418"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"a":"DLC"},{"c":"DLC"},{"d":"MiU"}]}},{"050":{"ind1":"0","ind2":" ","subfields":[{"a":"PZ3.V398"},{"b":"Mo"},{"a":"PS3543.A67"}]}},{"082":{"ind1":" ","ind2":" ","subfields":[{"a":"813/.5/2"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Varandyan, Emmanuel P."}]}},{"245":{"ind1":"1","ind2":"4","subfields":[{"a":"The Moon sails;"},{"b":"a novel,"},{"c":"by Emmanuel P. Varandyan."}]}},{"250":{"ind1":" ","ind2":" ","subfields":[{"a":"[1st ed.]"}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"Delmar, N.Y.,"},{"b":"Pinnacle,"},{"c":"1971."}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"251 p."},{"c":"24 cm."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"852":{"ind1":"1","ind2":" ","subfields":[{"a":"MiU"},{"b":"BUHR"},{"c":"GRAD"},{"h":"828 V288mn, 1971"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015030715380"},{"r":"ic"},{"d":"20120530"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
71
+ {"leader":"01141nam a22004091 4500","fields":[{"001":"000003441"},{"003":"MiU"},{"005":"19880715000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715c19681967pau |00000 eng "},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"68010619"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0237566-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159822019"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00237566"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"sdr-nrlf-ucscb167381271"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"a":"DLC"},{"c":"DLC"},{"d":"MiU"}]}},{"050":{"ind1":"0","ind2":" ","subfields":[{"a":"HE2751"},{"b":".L9"}]}},{"082":{"ind1":" ","ind2":" ","subfields":[{"a":"385/.0973"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Lyon, Peter,"},{"d":"1915-"}]}},{"245":{"ind1":"1","ind2":"0","subfields":[{"a":"To hell in a day coach;"},{"b":"an exasperated look at American railroads."}]}},{"250":{"ind1":" ","ind2":" ","subfields":[{"a":"[1st ed.]"}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"Philadelphia,"},{"b":"Lippincott,"},{"c":"1968 [c1967]"}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"vii, 324 p."},{"c":"22 cm."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Railroads"},{"z":"United States"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"SPEC"},{"c":"RARE"},{"h":"HE 2751 .L98"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"SPEC"},{"c":"THC"},{"h":"HE 2751 .L98"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"a":"uc1"},{"b":"SDR"},{"c":"NRLF"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015023095238"},{"r":"ic"},{"d":"20120530"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"uc1.b4912198"},{"r":"ic"},{"d":"20111204"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
72
+ {"leader":"01692nam a22005291 4500","fields":[{"001":"000003823"},{"003":"MiU"},{"005":"19880715000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715s1967 nyu b 00010 eng "},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"67025457"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0264219-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159822454"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00264219"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"sdr-nrlfGLAD187507-B"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"a":"DLC"},{"c":"DLC"},{"d":"MiU"}]}},{"043":{"ind1":" ","ind2":" ","subfields":[{"a":"n-us---"}]}},{"050":{"ind1":"0","ind2":" ","subfields":[{"a":"HV4194.A3"},{"b":"D3 1967"}]}},{"082":{"ind1":" ","ind2":" ","subfields":[{"a":"362/.9/73"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Davis, Allen Freeman,"},{"d":"1931-"}]}},{"245":{"ind1":"1","ind2":"0","subfields":[{"a":"Spearheads for reform;"},{"b":"the social settlements and the progressive movement, 1890-1914"},{"c":"[by] Allen F. Davis."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"New York,"},{"b":"Oxford University Press,"},{"c":"1967."}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"xviii, 322 p."},{"c":"22 cm."}]}},{"490":{"ind1":"0","ind2":" ","subfields":[{"a":"Urban life in America series"}]}},{"502":{"ind1":" ","ind2":" ","subfields":[{"a":"Issued in microfilm form as thesis, University of Wisconsin, 1960."}]}},{"504":{"ind1":" ","ind2":" ","subfields":[{"a":"\"A note on sources\": p. 247-255. Bibliography: p. 259-304."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Social settlements"}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Progressivism (United States politics)"}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Cities and towns"},{"z":"United States."}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"HV 4194 .D26"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"HV 4194 .D26"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"UGL"},{"h":"HV 4194 .D26"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"HV 4194 .D26"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015002281593"},{"r":"ic"},{"d":"20090807"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015014594108"},{"r":"ic"},{"d":"20090807"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015016230438"},{"r":"ic"},{"d":"20120419"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
73
+ {"leader":"01227nam a22004211 4500","fields":[{"001":"000004152"},{"003":"MiU"},{"005":"19890605000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715|1960||||||| |||||||eng|u"},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"60005725"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0289130-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159822835"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00289130"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"sdr-nrlf.b120345171"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"c":"OWibfC"},{"d":"MiU"},{"d":"CStRLIN"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Lyon, Bryce Dale,"},{"d":"1920-"}]}},{"245":{"ind1":"1","ind2":"2","subfields":[{"a":"A constitutional and legal history of medieval England."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"New York,"},{"b":"Harper"},{"c":"[1960]"}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"671p."},{"b":"illus."},{"c":"25 cm."}]}},{"504":{"ind1":" ","ind2":" ","subfields":[{"a":"Includes bibliography."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Law"},{"z":"Great Britain"},{"x":"History"}]}},{"651":{"ind1":" ","ind2":"0","subfields":[{"a":"Great Britain"},{"x":"Politics and government"},{"y":"To 1485."}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"JN 137 .L98"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"JN 137 .L98"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"a":"uc1"},{"b":"SDR"},{"c":"NRLF"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015004930999"},{"r":"ic"},{"d":"20120530"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015066017214"},{"r":"ic"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"z":"c.3"},{"u":"uc1.b3457094"},{"r":"ic"},{"d":"20100514"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
74
+ {"leader":"01517nam a22004931 4500","fields":[{"001":"000004309"},{"003":"MiU"},{"005":"20120524152322.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715s1964 nyua j 000 1 eng u"},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"64019711"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0301132-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159823014"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00301132"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"c":"ODaWU"},{"d":"InLS"},{"d":"*OCL*"},{"d":"MiU"},{"d":"CStRLIN"},{"d":"EYM"}]}},{"099":{"ind1":" ","ind2":"0","subfields":[{"a":"P Z7 .F5768 H3"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Fitzhugh, Louise."}]}},{"245":{"ind1":"1","ind2":"0","subfields":[{"a":"Harriet, the spy /"},{"c":"written and illustrated by Louise Fitzhugh."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"New York :"},{"b":"Harper & Row,"},{"c":"1964."}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"298 p. :"},{"b":"ill. ;"},{"c":"21 cm."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"590":{"ind1":" ","ind2":" ","subfields":[{"a":"SPEC WLPR: In the Lee Walp Family Juvenile Literature Collection. Gift of the Lee Walp Family."}]}},{"590":{"ind1":" ","ind2":" ","subfields":[{"a":"SPEC WLPR: Lee Walp’s clippings and notes laid in."}]}},{"590":{"ind1":" ","ind2":" ","subfields":[{"a":"SPEC WLPR: In dust jacket."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Friendship"},{"v":"Juvenile fiction."}]}},{"651":{"ind1":" ","ind2":"0","subfields":[{"a":"New York (N.Y.)"},{"v":"Juvenile fiction."}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"UGL"},{"h":"PZ 7 .F555"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"UGL"},{"h":"PZ 7 .F555"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"UGL"},{"c":"CLC"},{"h":"PZ 7 .F555"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"PZ 7 .F555"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"SPEC"},{"c":"WLPR"},{"h":"P Z7 .F5768 H3"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20120524"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015058018790"},{"r":"ic"},{"d":"20120530"}]}},{"997":{"ind1":" ","ind2":" ","subfields":[{"a":"MARS"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
75
+ {"leader":"01122nam a22003851 4500","fields":[{"001":"000004964"},{"003":"MiU"},{"005":"19880715000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715|1965||||||| |||||||eng|u"},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"65023062"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0345135-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159823753"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00345135"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"c":"OUrC"},{"d":"MiU"},{"d":"CStRLIN"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Nussbaum, Allen."}]}},{"245":{"ind1":"1","ind2":"0","subfields":[{"a":"Electromagnetic theory for engineers and scientists."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"Englewood Cliffs, N. J.,"},{"b":"Prentice-Hall"},{"c":"[1965]"}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"xiii, 312 p."},{"b":"illus."}]}},{"490":{"ind1":"0","ind2":" ","subfields":[{"a":"Microwaves and fields series"}]}},{"500":{"ind1":" ","ind2":" ","subfields":[{"a":"Prentice-Hall electrical engineering series."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Electromagnetic theory"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"SCI"},{"c":"BKS"},{"h":"QC 670.N975"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"SCI"},{"c":"BKS"},{"h":"QC 670 .N975"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015017245518"},{"r":"ic"},{"d":"20120530"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015017270458"},{"r":"ic"},{"d":"20100306"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
76
+ {"leader":"00920nam a22003371 4500","fields":[{"001":"000005123"},{"003":"MiU"},{"005":"19880715000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715|1965||||||| |||||||eng|u"},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"65018827"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0358204-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159823931"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00358204"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"c":"ODaWU"},{"d":"MiU"},{"d":"CStRLIN"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Potter, Stephen,"},{"d":"1900-1969."}]}},{"245":{"ind1":"1","ind2":"0","subfields":[{"a":"Coleridge and S.T.C."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"New York,"},{"b":"Russell & Russell,"},{"c":"1965."}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"284 p."}]}},{"504":{"ind1":" ","ind2":" ","subfields":[{"a":"Bibliography: p. 281-282."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"600":{"ind1":"1","ind2":"0","subfields":[{"a":"Coleridge, Samuel Taylor,"},{"d":"1772-1834."}]}},{"852":{"ind1":"1","ind2":" ","subfields":[{"a":"MiU"},{"b":"BUHR"},{"c":"GRAD"},{"h":"828 C693O P87 1965"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015030723566"},{"r":"ic"},{"d":"20120530"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
77
+ {"leader":"00919nam a22003251 4500","fields":[{"001":"000005617"},{"003":"MiU"},{"005":"19880715000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715|1971||||||| |||||||eng|u"},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0400752-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159824485"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00400752"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"c":"OU"},{"d":"MiU"},{"d":"CStRLIN"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Schlesinger, Janet."}]}},{"245":{"ind1":"1","ind2":"0","subfields":[{"a":"Challenge to the urban orchestra;"},{"b":"the case of the Pittsburgh Symphony."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"[Pittsburgh?,"},{"c":"c1971]"}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"163 p."},{"c":"29 cm."}]}},{"504":{"ind1":" ","ind2":" ","subfields":[{"a":"Bibliography: p. 158-163."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"610":{"ind1":"2","ind2":"0","subfields":[{"a":"Pittsburgh Symphony Orchestra."}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"BUHR"},{"c":"MUSI"},{"h":"ML 200.8 .P69 S34"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015007987756"},{"r":"ic"},{"d":"20120525"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
78
+ {"leader":"01356nam a22003851 4500","fields":[{"001":"000005933"},{"003":"MiU"},{"005":"19990430000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715|1957||||||| |||||||eng|u"},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0424414-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159824847"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00424414"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"c":"OWorP"},{"d":"MiU"},{"d":"CStRLIN"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Cunningham, Noble E"}]}},{"245":{"ind1":"1","ind2":"4","subfields":[{"a":"The Jeffersonian Republicans;"},{"b":"the formation of party organization, 1789-1801,"},{"c":"by Noble E. Cunningham."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"Chapel Hill,"},{"b":"Published for the Institute of Early American History and Culture at Williamsburg by the Univ. of N. Car. Pr."},{"c":"[c1957]"}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"x, 279 p."},{"b":"facsims."},{"c":"24 cm."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"610":{"ind1":"2","ind2":"0","subfields":[{"a":"Democratic Party (U.S.)"},{"x":"History."}]}},{"651":{"ind1":" ","ind2":"0","subfields":[{"a":"United States"},{"x":"Politics and government"},{"y":"1789-1809."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Political parties"},{"z":"United States"},{"x":"History."}]}},{"710":{"ind1":"2","ind2":" ","subfields":[{"a":"Institute of Early American History and Culture (Williamsburg, Va.)"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"JK 2316 .C97"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"JK 2316 .C97"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015007045035"},{"r":"ic"},{"d":"20120530"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015066018212"},{"r":"ic"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
79
+ {"leader":"01058nam a22003731 4500","fields":[{"001":"000006347"},{"003":"MiU"},{"005":"19880715000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715|1972||||||| |||||||eng|u"},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0477263-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159825319"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00477263"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"c":"OCX"},{"d":"MiU"},{"d":"CStRLIN"}]}},{"082":{"ind1":" ","ind2":" ","subfields":[{"a":"417/.7"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Cottrell, Leonard."}]}},{"245":{"ind1":"1","ind2":"0","subfields":[{"a":"Reading the past;"},{"b":"the story of deciphering ancient languages"},{"c":"[by] Leonard Cottrell."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"London,"},{"b":"J. M. Dent & Sons"},{"c":"[1972]"}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"viii, 182 p."},{"b":"illus."},{"c":"24 cm."}]}},{"504":{"ind1":" ","ind2":" ","subfields":[{"a":"Bibliography: p. 171-173."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Hieroglyphics."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Cuneiform writing"}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Alphabet."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Writing"},{"x":"History"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"P211 .C84 1972"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015003847020"},{"r":"ic"},{"d":"20120530"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
80
+ {"leader":"01837nam a22004571 4500","fields":[{"001":"000006850"},{"003":"MiU"},{"005":"20010806000000.0"},{"008":"880715s1967 ilu b 00010 eng "},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"66020582"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0513381-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159825875"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00513381"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"sdr-umdb.b10778883"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"a":"DLC"},{"c":"DLC"},{"d":"MiU"}]}},{"041":{"ind1":"1","ind2":" ","subfields":[{"a":"eng"},{"h":"rus"}]}},{"043":{"ind1":" ","ind2":" ","subfields":[{"a":"e-ur---"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Schwarz, Solomon M."}]}},{"240":{"ind1":"1","ind2":"0","subfields":[{"a":"Menʹshevizm i bolʹshevizm v ikh otnoshenii k massovomu rabochemu dvizhenii︠u︡."},{"l":"English"}]}},{"245":{"ind1":"1","ind2":"4","subfields":[{"a":"The Russian Revolution of 1905 :"},{"b":"the workers' movement and the formation of Bolshevism and Menshevism /"},{"c":"[by] Solomon M. Schwarz ; Translated by Gertrude Vakar."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"Chicago :"},{"b":"University of Chicago Press,"},{"c":"[1967]"}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"xxii, 361 p. ;"},{"c":"24 cm."}]}},{"490":{"ind1":"0","ind2":" ","subfields":[{"a":"Hoover Institution publications"}]}},{"490":{"ind1":"0","ind2":" ","subfields":[{"a":"History of Menshevism"}]}},{"500":{"ind1":" ","ind2":" ","subfields":[{"a":"Translation and expansion of Menʹshevizm i bolʹshevizm v ikh otnoshenii k massovomu rabochemu dvizhenii︠u︡."}]}},{"500":{"ind1":" ","ind2":" ","subfields":[{"a":"\"One of a series arising from the work of the Inter-university Project on the History of the Menshevik Movement.\""}]}},{"504":{"ind1":" ","ind2":" ","subfields":[{"a":"Includes bibliographical references."}]}},{"610":{"ind1":"2","ind2":"0","subfields":[{"a":"Rossiĭskai︠a︡ sot︠s︡ial-demokraticheskai︠a︡ rabochai︠a︡ partii︠a︡."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Labor movement"},{"z":"Soviet Union."}]}},{"651":{"ind1":" ","ind2":"0","subfields":[{"a":"Russia"},{"x":"History"},{"y":"Revolution, 1905-1907."}]}},{"710":{"ind1":"2","ind2":" ","subfields":[{"a":"Inter-university Project on the History of the Menshevik Movement."}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"JN6598.R8 S423"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"JN6598.R8 S423"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"SPEC"},{"c":"LABD"},{"h":"JN 6598 .R8 S423"},{"x":"30215341"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9615"}]}}]}
81
+ {"leader":"01209nam a22003851 4500","fields":[{"001":"000008015"},{"003":"MiU"},{"005":"19890306000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715s1973 nyua d |00000 eng "},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"73153601"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0590313-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159827164"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00590313"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"a":"DLC"},{"c":"DLC"},{"d":"MiU"}]}},{"050":{"ind1":"0","ind2":" ","subfields":[{"a":"PE1625"},{"b":".S713 1973"}]}},{"082":{"ind1":" ","ind2":" ","subfields":[{"a":"423"}]}},{"245":{"ind1":"0","ind2":"0","subfields":[{"a":"Funk & Wagnalls standard dictionary of the English language."}]}},{"250":{"ind1":" ","ind2":" ","subfields":[{"a":"International ed.,"},{"b":"with special supplementary features."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"New York,"},{"b":"Funk & Wagnalls"},{"c":"[1973]"}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"2 v. (xx, 1695 p.)"},{"b":"illus. (part col.)"},{"c":"29 cm."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"English language"},{"x":"Dictionaries"}]}},{"740":{"ind1":"0","ind2":" ","subfields":[{"a":"Funk and Wagnalls standard dictionary of the English language."}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"PE 1625 .S785 1973"},{"x":"tr. fr. GLRF 9-5-97"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"DI"},{"b":"Dictionaries"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"z":"v.1"},{"u":"mdp.39015066305270"},{"r":"ic"},{"d":"20120530"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"z":"v.2"},{"u":"mdp.39015066305429"},{"r":"ic"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
82
+ {"leader":"01009nam a22003731 4500","fields":[{"001":"000008105"},{"003":"MiU"},{"005":"20071115093023.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715s1973 nyu |00010 eng "},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"72014035"}]}},{"020":{"ind1":" ","ind2":" ","subfields":[{"a":"0442214707"},{"c":"$5.95"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0595319-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159827258"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00595319"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"sdr-wu88160"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"a":"DLC"},{"c":"DLC"},{"d":"MiU"}]}},{"043":{"ind1":" ","ind2":" ","subfields":[{"a":"n-us---"}]}},{"050":{"ind1":"0","ind2":" ","subfields":[{"a":"HQ536"},{"b":".B86"}]}},{"082":{"ind1":" ","ind2":" ","subfields":[{"a":"301.42/0973"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Burger, Robert E."}]}},{"245":{"ind1":"1","ind2":"4","subfields":[{"a":"The love contract;"},{"b":"handbook for a liberated marriage"},{"c":"[by] Robert E. Burger."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"New York,"},{"b":"Van Nostrand Reinhold"},{"c":"[1973]"}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"ix, 107 p."},{"c":"24 cm."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Marriage"},{"z":"United States"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"a":"wu"},{"b":"SDR"},{"c":"WU"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"wu.89031137284"},{"r":"ic"},{"d":"20120530"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
83
+ {"leader":"01115nam a22003731 4500","fields":[{"001":"000008459"},{"003":"MiU"},{"005":"19880715000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715|1970||||||| |||||||ita|u"},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"76881291"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0615380-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159827651"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00615380"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"sdr-nrlfGLAD17038931-B"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"c":"OCU"},{"d":"MiU"},{"d":"CStRLIN"}]}},{"050":{"ind1":" ","ind2":"4","subfields":[{"a":"PA2402"},{"b":".S21"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Savelli, Angelo,"},{"d":"1930-"}]}},{"245":{"ind1":"1","ind2":"0","subfields":[{"a":"Nuovissime interpretazioni etrusche."},{"b":"Le lamine d'oro di Pyrgi, l'iscrizione estrusco-latina del Lapis Niger, la stele greco-tirrena di Lemno."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"Bologna,"},{"b":"Tip. Accorsi,"},{"c":"1970."}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"78 p."},{"c":"24 cm."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Inscriptions, Etruscan"}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"PA2402 .S21"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"a":"uc1"},{"b":"SDR"},{"c":"NRLF"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015025030563"},{"r":"ic"},{"d":"20120530"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"uc1.b3176758"},{"r":"ic"},{"d":"20090915"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
84
+ {"leader":"01202nam a22004211 4500","fields":[{"001":"000009080"},{"003":"MiU"},{"005":"19880715000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715s1972 enka b |00110 engx "},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"73160987"}]}},{"015":{"ind1":" ","ind2":" ","subfields":[{"a":"B73-00589"}]}},{"020":{"ind1":" ","ind2":" ","subfields":[{"a":"0140806652"},{"c":"£1.25"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0651225-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159828340"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00651225"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"a":"DLC"},{"c":"DLC"},{"d":"MiU"},{"d":"CStRLIN"}]}},{"050":{"ind1":"0","ind2":" ","subfields":[{"a":"P41"},{"b":".P72"}]}},{"082":{"ind1":" ","ind2":" ","subfields":[{"a":"301.2/1"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Pride, J. B. E."}]}},{"245":{"ind1":"1","ind2":"0","subfields":[{"a":"Sociolinguistics: selected readings;"},{"c":"edited by J. B. Pride and Janet Holmes."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"[Harmondsworth,]"},{"b":"Penguin,"},{"c":"[1972]"}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"381 p."},{"b":"illus."},{"c":"20 cm. index."}]}},{"490":{"ind1":"0","ind2":" ","subfields":[{"a":"Penguin education"}]}},{"490":{"ind1":"0","ind2":" ","subfields":[{"a":"Penguin modern linguistics readings"}]}},{"504":{"ind1":" ","ind2":" ","subfields":[{"a":"Bibliography: p. 367-369."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"650":{"ind1":" ","ind2":"0","subfields":[{"a":"Sociolinguistics."}]}},{"700":{"ind1":"1","ind2":" ","subfields":[{"a":"Holmes, Janet."},{"e":"joint comp."}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"P 41 .P946"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015019228280"},{"r":"ic"},{"d":"20120530"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
85
+ {"leader":"01075nam a22003851 4500","fields":[{"001":"000009820"},{"003":"MiU"},{"005":"19880715000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715s1973 nyu b 00010beng "},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"73000507"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0695465-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159829137"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00695465"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"a":"DLC"},{"c":"DLC"},{"d":"MiU"}]}},{"050":{"ind1":"0","ind2":" ","subfields":[{"a":"PS1291"},{"b":".H8"}]}},{"082":{"ind1":" ","ind2":" ","subfields":[{"a":"811/.2"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Hudspeth, Robert N."}]}},{"245":{"ind1":"0","ind2":"0","subfields":[{"a":"Ellery Channing,"},{"c":"by Robert N. Hudspeth."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"New York,"},{"b":"Twayne Publishers"},{"c":"[1973]"}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"182 p."},{"c":"21 cm."}]}},{"490":{"ind1":"0","ind2":" ","subfields":[{"a":"Twayne's United States authors series,"},{"v":"TUSAS 223"}]}},{"504":{"ind1":" ","ind2":" ","subfields":[{"a":"Bibliography: p. 171-177."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"600":{"ind1":"1","ind2":"0","subfields":[{"a":"Channing, William Ellery,"},{"d":"1817-1901."}]}},{"852":{"ind1":"1","ind2":" ","subfields":[{"a":"MiU"},{"b":"BUHR"},{"c":"GRAD"},{"h":"828 C458O H88"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BI"},{"b":"Biography"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015030727799"},{"r":"ic"},{"d":"20120530"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9125"}]}}]}
86
+ {"leader":"01215nam a22004091 4500","fields":[{"001":"000010179"},{"003":"MiU"},{"005":"19880715000000.0"},{"006":"m d "},{"007":"cr bn ---auaua"},{"008":"880715s1962 nyu 00001 eng "},{"010":{"ind1":" ","ind2":" ","subfields":[{"a":"62009606/L/r66"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(RLIN)MIUG0710844-B"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(CaOTULAS)159829527"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"(OCoLC)ocm00710844"}]}},{"035":{"ind1":" ","ind2":" ","subfields":[{"a":"sdr-ucsc.b15850766"}]}},{"040":{"ind1":" ","ind2":" ","subfields":[{"a":"DLC"},{"c":"DLC"},{"d":"MiU"}]}},{"041":{"ind1":"1","ind2":" ","subfields":[{"a":"enggre"}]}},{"050":{"ind1":"0","ind2":" ","subfields":[{"a":"PZ3.K1884"},{"b":"Sai"}]}},{"100":{"ind1":"1","ind2":" ","subfields":[{"a":"Kazantzakis, Nikos,"},{"d":"1883-1957."}]}},{"240":{"ind1":"0","ind2":"3","subfields":[{"a":"Ho phtochoules tou Theou."},{"l":"English"}]}},{"245":{"ind1":"0","ind2":"0","subfields":[{"a":"Saint Francis,"},{"b":"a novel."},{"c":"Translated from the Greek by P. A. Bien."}]}},{"260":{"ind1":" ","ind2":" ","subfields":[{"a":"New York,"},{"b":"Simon and Schuster,"},{"c":"1962."}]}},{"300":{"ind1":" ","ind2":" ","subfields":[{"a":"379 p."},{"c":"22 cm."}]}},{"538":{"ind1":" ","ind2":" ","subfields":[{"a":"Mode of access: Internet."}]}},{"600":{"ind1":"0","ind2":"0","subfields":[{"a":"Francis,"},{"c":"of Assisi, Saint,"},{"d":"1182-1226"},{"x":"Fiction."}]}},{"852":{"ind1":"0","ind2":" ","subfields":[{"a":"MiU"},{"b":"HATCH"},{"c":"GRAD"},{"h":"PA 5610 .K23 P53"}]}},{"852":{"ind1":" ","ind2":" ","subfields":[{"a":"uc1"},{"b":"SDR"},{"c":"UCSC"}]}},{"970":{"ind1":" ","ind2":" ","subfields":[{"a":"BK"},{"b":"Book"}]}},{"971":{"ind1":" ","ind2":" ","subfields":[{"a":"MiU"}]}},{"972":{"ind1":" ","ind2":" ","subfields":[{"c":"20040625"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"HT"},{"b":"avail_ht"}]}},{"973":{"ind1":" ","ind2":" ","subfields":[{"a":"AC"},{"b":"avail_circ"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"mdp.39015002669383"},{"r":"ic"},{"d":"20120530"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"uc1.32106006141748"},{"r":"ic"},{"d":"20100906"}]}},{"974":{"ind1":" ","ind2":" ","subfields":[{"u":"uc1.32106016310622"},{"r":"ic"},{"d":"20100906"}]}},{"998":{"ind1":" ","ind2":" ","subfields":[{"s":"9665"}]}}]}
87
+
@@ -0,0 +1,34 @@
1
+ # A writer for Traject::Indexer, that just writes out
2
+ # all the output as serialized text with #puts.
3
+ #
4
+ # Should be thread-safe (ie, multiple worker threads can be calling #put
5
+ # concurrently), by wrapping write to actual output file in a mutex synchronize.
6
+ # This does not seem to effect performance much, as far as I could tell
7
+ # benchmarking.
8
+ #
9
+ # Output will be sent to settings["output_file"] string path, or else
10
+ # settings["output_stream"] (ruby IO object), or else stdout.
11
+ #
12
+ # This class can be sub-classed to write out different serialized
13
+ # reprentations -- subclasses will just override the #serialize
14
+ # method. For instance, see JsonWriter.
15
+ class Traject::MockWriter
16
+ attr_reader :settings
17
+
18
+ def initialize(argSettings)
19
+ end
20
+
21
+
22
+ def serialize(context)
23
+ # null
24
+ end
25
+
26
+ def put(context)
27
+ # null
28
+ end
29
+
30
+ def close
31
+ # null
32
+ end
33
+
34
+ end
@@ -114,28 +114,7 @@ class Traject::SolrJWriter
114
114
  # in settings["solrj.jar_dir"]
115
115
  def ensure_solrj_loaded!
116
116
  unless defined?(HttpSolrServer) && defined?(SolrInputDocument)
117
- require 'java'
118
-
119
- tries = 0
120
- begin
121
- tries += 1
122
- java_import org.apache.solr.client.solrj.impl.HttpSolrServer
123
- java_import org.apache.solr.common.SolrInputDocument
124
- rescue NameError => e
125
- # /Users/jrochkind/code/solrj-gem/lib"
126
-
127
- included_jar_dir = File.expand_path("../../vendor/solrj/lib", File.dirname(__FILE__))
128
-
129
- jardir = settings["solrj.jar_dir"] || included_jar_dir
130
- Dir.glob("#{jardir}/*.jar") do |x|
131
- require x
132
- end
133
- if tries > 1
134
- raise LoadError.new("Can not find SolrJ java classes")
135
- else
136
- retry
137
- end
138
- end
117
+ Traject::Util.require_solrj_jars(settings)
139
118
  end
140
119
 
141
120
  # And for now, SILENCE SolrJ logging
@@ -21,10 +21,116 @@ module Traject
21
21
  end
22
22
 
23
23
  # From ruby #caller method, you get an array. Pass one line
24
- # of the array here, get just file and line number out.
24
+ # of the array here, get just file and line number out.
25
25
  def self.extract_caller_location(str)
26
26
  str.split(':in `').first
27
27
  end
28
28
 
29
+ # Requires marc4j jar(s) from settings['marc4j.jar_dir'] if given, otherwise
30
+ # uses jars bundled with traject gem in ./vendor
31
+ #
32
+ # Have to pass in a settings arg, so we can check it for specified jar dir.
33
+ #
34
+ # Tries not to do the dirglob and require if marc4j has already been loaded.
35
+ # Will define global constants with classes MarcPermissiveStreamReader and MarcXmlReader
36
+ # if not already defined.
37
+ #
38
+ # This is all a bit janky, maybe there's a better way to do this? We do want
39
+ # a 'require' method defined somewhere utility, so multiple classes can
40
+ # use it, including extra gems. This method IS used by extra gems, so should
41
+ # be considered part of the API -- after it's called, those top-level
42
+ # globals should be available, and marc4j should be loaded.
43
+ def self.require_marc4j_jars(settings)
44
+ jruby_ensure_init!
45
+
46
+ tries = 0
47
+ begin
48
+ tries += 1
49
+
50
+ org.marc4j
51
+
52
+ # java_import which we'd normally use weirdly doesn't work
53
+ # from a class method. https://github.com/jruby/jruby/issues/975
54
+ Object.const_set("MarcPermissiveStreamReader", org.marc4j.MarcPermissiveStreamReader) unless defined? ::MarcPermissiveStreamReader
55
+ Object.const_set("MarcXmlReader", org.marc4j.MarcXmlReader) unless defined? ::MarcXmlReader
56
+ rescue NameError => e
57
+ # /Users/jrochkind/code/solrj-gem/lib"
58
+
59
+ include_jar_dir = File.expand_path("../../vendor/marc4j/lib", File.dirname(__FILE__))
60
+
61
+ jardir = settings["marc4j.jar_dir"] || include_jar_dir
62
+ Dir.glob("#{jardir}/*.jar") do |x|
63
+ require x
64
+ end
65
+
66
+ if tries > 1
67
+ raise LoadError.new("Can not find Marc4J java classes")
68
+ else
69
+ retry
70
+ end
71
+ end
72
+ end
73
+
74
+ # Requires solrj jar(s) from settings['solrj.jar_dir'] if given, otherwise
75
+ # uses jars bundled with traject gem in ./vendor
76
+ #
77
+ # Have to pass in a settings arg, so we can check it for specified jar dir.
78
+ #
79
+ # Tries not to do the dirglob and require if solrj has already been loaded.
80
+ # Will define global constants with classes HttpSolrServer and SolrInputDocument
81
+ # if not already defined.
82
+ #
83
+ # This is all a bit janky, maybe there's a better way to do this? We do want
84
+ # a 'require' method defined somewhere utility, so multiple classes can
85
+ # use it, including extra gems. This method may be used by extra gems, so should
86
+ # be considered part of the API -- after it's called, those top-level
87
+ # globals should be available, and solrj should be loaded.
88
+ def self.require_solrj_jars(settings)
89
+ jruby_ensure_init!
90
+
91
+ tries = 0
92
+ begin
93
+ tries += 1
94
+
95
+ org.apache.solr
96
+ org.apache.solr.client.solrj
97
+
98
+ # java_import which we'd normally use weirdly doesn't work
99
+ # from a class method. https://github.com/jruby/jruby/issues/975
100
+ Object.const_set("HttpSolrServer", org.apache.solr.client.solrj.impl.HttpSolrServer) unless defined? ::HttpSolrServer
101
+ Object.const_set("SolrInputDocument", org.apache.solr.common.SolrInputDocument) unless defined? ::SolrInputDocument
102
+ rescue NameError => e
103
+ # /Users/jrochkind/code/solrj-gem/lib"
104
+
105
+ included_jar_dir = File.expand_path("../../vendor/solrj/lib", File.dirname(__FILE__))
106
+
107
+ jardir = settings["solrj.jar_dir"] || included_jar_dir
108
+ Dir.glob("#{jardir}/*.jar") do |x|
109
+ require x
110
+ end
111
+ if tries > 1
112
+ raise LoadError.new("Can not find SolrJ java classes")
113
+ else
114
+ retry
115
+ end
116
+ end
117
+ end
118
+
119
+ # just does a `require 'java'` but rescues the exception if we
120
+ # aren't jruby, and raises a better error message.
121
+ # Pass in a developer-presentable name of a feature to include in the error
122
+ # message if you want.
123
+ def self.jruby_ensure_init!(feature = nil)
124
+ begin
125
+ require 'java'
126
+ rescue LoadError => e
127
+ feature ||= "A traject feature is in use that"
128
+ msg = if feature
129
+ "#{feature} requires jruby, but you do not appear to be running under jruby. We recommend `chruby` for managing multiple ruby installs."
130
+ end
131
+ raise LoadError.new(msg)
132
+ end
133
+ end
134
+
29
135
  end
30
136
  end