diff --git a/marc_to_solr/lib/princeton_marc.rb b/marc_to_solr/lib/princeton_marc.rb index 664d70c3..b84f33b1 100644 --- a/marc_to_solr/lib/princeton_marc.rb +++ b/marc_to_solr/lib/princeton_marc.rb @@ -700,15 +700,16 @@ def process_holdings(record) all_holdings = {} holdings_helpers = ProcessHoldingsHelpers.new(record:) holdings_helpers.fields_852_alma_or_scsb.each do |field_852| + next if holdings_helpers.includes_only_private_scsb_items?(field_852) holding_id = holdings_helpers.holding_id(field_852) # Calculate the permanent holding holding = holdings_helpers.build_holding(field_852, permanent: true) - items_by_holding_id = holdings_helpers.items_by_holding_id(holding_id) + items_by_holding = holdings_helpers.items_by_852(field_852) group_866_867_868_fields = holdings_helpers.group_866_867_868_on_holding_perm_id(holding_id, field_852) # if there are items (876 fields) - if items_by_holding_id.present? - add_permanent_items_to_holdings(items_by_holding_id, field_852, holdings_helpers, all_holdings, holding) - add_temporary_items_to_holdings(items_by_holding_id, field_852, holdings_helpers, all_holdings) + if items_by_holding.present? + add_permanent_items_to_holdings(items_by_holding, field_852, holdings_helpers, all_holdings, holding) + add_temporary_items_to_holdings(items_by_holding, field_852, holdings_helpers, all_holdings) else # if there are no items (876 fields), create the holding by using the 852 field all_holdings[holding_id] = remove_empty_call_number_fields(holding) unless holding_id.nil? || invalid_location?(holding['location_code']) @@ -718,8 +719,8 @@ def process_holdings(record) all_holdings end -def add_permanent_items_to_holdings(items_by_holding_id, field_852, holdings_helpers, all_holdings, holding) - locations = holdings_helpers.select_permanent_location_876(items_by_holding_id, field_852) +def add_permanent_items_to_holdings(items_by_holding, field_852, holdings_helpers, all_holdings, holding) + locations = holdings_helpers.select_permanent_location_876(items_by_holding, field_852) locations.each do |field_876| holding_key = holdings_helpers.holding_id(field_852) @@ -727,10 +728,12 @@ def add_permanent_items_to_holdings(items_by_holding_id, field_852, holdings_hel end end -def add_temporary_items_to_holdings(items_by_holding_id, field_852, holdings_helpers, all_holdings) - locations = holdings_helpers.select_temporary_location_876(items_by_holding_id, field_852) +def add_temporary_items_to_holdings(items_by_holding, field_852, holdings_helpers, all_holdings) + locations = holdings_helpers.select_temporary_location_876(items_by_holding, field_852) locations.each do |field_876| + next if holdings_helpers.includes_only_private_scsb_items?(field_852) + if holdings_helpers.current_location_code(field_876) == 'RES_SHARE$IN_RS_REQ' holding = holdings_helpers.build_holding(field_852, permanent: true) holding_key = holdings_helpers.holding_id(field_852) diff --git a/marc_to_solr/lib/process_holdings_helpers.rb b/marc_to_solr/lib/process_holdings_helpers.rb index 9e622d08..bb762a70 100644 --- a/marc_to_solr/lib/process_holdings_helpers.rb +++ b/marc_to_solr/lib/process_holdings_helpers.rb @@ -29,8 +29,14 @@ def group_866_867_868_on_holding_perm_id(holding_perm_id, field_852) end end - def items_by_holding_id(holding_id) - record.fields("876").select { |f| f["0"] == holding_id } + def items_by_852(field_852) + holding_id = holding_id(field_852) + items = record.fields("876").select { |f| f["0"] == holding_id } + items.map { |item| item unless private_scsb_item?(item, field_852) }.compact + end + + def private_scsb_item?(field_876, field_852) + field_876['x'] == 'Private' && scsb?(field_852) end # Select 852 fields from an Alma or SCSB record @@ -84,6 +90,12 @@ def build_call_number(field_852) call_number.present? ? call_number.join(' ').strip : [] end + def includes_only_private_scsb_items?(field_852) + return false unless scsb?(field_852) + + items_by_852(field_852).empty? + end + # Builds the holding, without any item-specific information # @returns [Hash] def build_holding(field_852, field_876 = nil, permanent:) diff --git a/marc_to_solr/lib/traject_config.rb b/marc_to_solr/lib/traject_config.rb index bab6c3ce..20dbb9a2 100644 --- a/marc_to_solr/lib/traject_config.rb +++ b/marc_to_solr/lib/traject_config.rb @@ -1242,6 +1242,16 @@ accumulator[0] = all_holdings.to_json.to_s unless all_holdings.empty? end +# Skip SCSB records that include only private items +each_record do |record, context| + recap_notes = process_recap_notes(record) + next if recap_notes.empty? + next if recap_notes.map { |note| note.include?("P") }.include?(false) + + id = id_extractor.extract(record).first + context.skip!("Skipped #{id} because record includes only private items.") +end + ## for recap notes to_field 'recap_notes_display' do |record, accumulator| recap_notes = process_recap_notes(record) diff --git a/spec/fixtures/marc_to_solr/scsb_harvard_multiple.mrx b/spec/fixtures/marc_to_solr/scsb_harvard_multiple.mrx new file mode 100644 index 00000000..ae78370d --- /dev/null +++ b/spec/fixtures/marc_to_solr/scsb_harvard_multiple.mrx @@ -0,0 +1,151 @@ + + + 01793cam a2200289Ma 4500 + SCSB-9879609 + 20210108133627.0 + 080503s2007 ua 000 0 ara d + 990115251640203941 + + (OCoLC)227281073 + + + LEILA + eng + LEILA + HVL + OCLCF + OCLCQ + OCLCO + OCLCA + HUL + + + f-ua--- + + + KRM2754 + .B36 2007x + + + 880-01 + Bannā, Maḥmūd ʻāṭif. + + + 100-01//r + بنا، محمود عاطف. + + + 880-02 + al-ʻUqūd al-idārīyah / + Maḥmūd ʻāṭif al-Bannā. + + + 245-02//r + العقود الادارية / + محمود عاطف البنا. + + + 880-03 + al-Ṭabʻah 1. + + + 250-03//r + الطبعة 1. + + + 880-04 + Madīnat Naṣr, al-Qāhirah : + Dār al-Fikr al-ʻArabī, + 2007. + + + 260-04//r + مدينة نصر، القاهرة : + دار الفكر العربي، + 2007. + + + 375 pages ; + 24 cm + + + text + txt + rdacontent + + + unmediated + n + rdamedia + + + volume + nc + rdacarrier + + + Public contracts + Egypt. + + + Public contracts + fast + (OCoLC)fst01082170 + + + Egypt + fast + (OCoLC)fst01208755 + + + committed to retain + 20181001 + in perpetuity + ReCAP Shared Collection + HUL + 222123425660003941 + + + HD + KRM2754 + .B36 2007x + 222123425660003941 + 10615482 + scsbhl + + + 10615482 + + 16302174 + + Available + LAW + 32044123007148 + + Private + HL + HD + + + HD + KRM2754 + .B36 2007x + 222123425660003941 + 10615483 + scsbhl + + + 10615483 + + 16302175 + + Available + LAW + 32044123007149 + + Open + HL + HD + + + diff --git a/spec/marc_to_solr/lib/config_spec.rb b/spec/marc_to_solr/lib/config_spec.rb index a077b8b2..fe1cbc70 100644 --- a/spec/marc_to_solr/lib/config_spec.rb +++ b/spec/marc_to_solr/lib/config_spec.rb @@ -52,6 +52,7 @@ def fixture_record(fixture_name, indexer: @indexer) @scsb_nypl = @indexer.map_record(fixture_record('SCSB-8157262')) @scsb_alt_title = @indexer.map_record(fixture_record('scsb_cul_alt_title')) @scsb_private = @indexer.map_record(fixture_record('scsb_harvard_private')) + @scsb_multiple = @indexer.map_record(fixture_record('scsb_harvard_multiple')) @scsb_committed = @indexer.map_record(fixture_record('scsb_harvard_committed')) @scsb_uncommittable = @indexer.map_record(fixture_record('scsb_harvard_uncommittable')) @recap_record = @indexer.map_record(fixture_record('994081873506421')) @@ -1259,13 +1260,22 @@ def fixture_record(fixture_name, indexer: @indexer) end end + describe 'private recap items' do + it "skips indexing record if only item is private" do + expect(@scsb_private).to be nil + end + it "skips indexing private items" do + expect(@scsb_multiple).to be + holdings = JSON.parse(@scsb_multiple["holdings_1display"].first) + public_holding_id = "10615483" + expect(holdings.keys).to match_array([public_holding_id]) + end + end + describe 'recap_notes_display' do it "skips indexing for Princeton Recap records" do expect(@recap_record["recap_notes_display"]).to be nil end - it "Indexes H - P, if a private SCSB record" do - expect(@scsb_private["recap_notes_display"]).to eq ["H - P"] - end it "Indexes C - S, if a shared SCSB record" do expect(@scsb_alt_title["recap_notes_display"]).to eq ["C - S"] end diff --git a/spec/marc_to_solr/lib/princeton_marc_spec.rb b/spec/marc_to_solr/lib/princeton_marc_spec.rb index fd4cfe1b..6d1e8235 100644 --- a/spec/marc_to_solr/lib/princeton_marc_spec.rb +++ b/spec/marc_to_solr/lib/princeton_marc_spec.rb @@ -770,6 +770,10 @@ def fixture_record(fixture_name) @holdings_scsb_hl = JSON.parse(@record_scsb_hl["holdings_1display"][0]) @holding_id_scsb_hl = "10615189" @holdings_scsb_hl_block = @holdings_scsb_hl[@holding_id_scsb_hl] + + @record_scsb_mixed = @indexer.map_record(fixture_record('scsb_harvard_multiple')) + @holdings_scsb_mixed = JSON.parse(@record_scsb_mixed["holdings_1display"][0]) + @holding_id_scsb_mixed_public = "10615483" end it 'indexes location if it exists' do @@ -848,6 +852,12 @@ def fixture_record(fixture_name) it "indexes 876$l for scsb" do expect(@holdings_scsb_hl_block['items'][0]['storage_location']).to eq("HD") end + + context 'with a record with both public and private holdings' do + it 'indexes only public items for SCSB' do + expect(@holdings_scsb_mixed.keys).to match_array([@holding_id_scsb_mixed_public]) + end + end end end end