traject 0.9.1 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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