• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pulibrary / bibdata / b3c4a532-5da0-46f8-9c20-20018605a028

21 Mar 2025 08:11PM UTC coverage: 42.257% (-49.9%) from 92.185%
b3c4a532-5da0-46f8-9c20-20018605a028

push

circleci

sandbergja
Move various gems from the default Gemfile group to a more appropriate group

1599 of 3784 relevant lines covered (42.26%)

2.56 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

24.39
/marc_to_solr/lib/solr_deleter.rb
1
require 'net/http'
1✔
2
require 'json'
1✔
3

4
# This class allow us to delete Solr records with our current
5
# version of Traject. Once we upgrade to Traject version 3.1
6
# or later we could use Traject's native delete feature
7
# (see https://github.com/traject/traject/commit/c731d09c6cb15fbe572e4a294a7a127b525b7277)
8
# but keep in mind that Traject's implementation is still in experimental mode
9
# and it does not (yet) support batches.
10
class SolrDeleter
1✔
11
  def initialize(solr_url, logger = nil)
1✔
12
    @solr_url = solr_url
×
13
    @logger = logger
×
14
  end
15

16
  def delete(ids, batch_size = 100)
1✔
17
    ids.each_slice(batch_size) do |batch|
×
18
      delete_batch(batch)
×
19
    end
20
  end
21

22
  private
1✔
23

24
    # content_type = "text/xml"
25
    # request payload is XML (even if the response is in JSON via the wt=json param)
26
    def request_deletion(uri:, body:, content_type: 'text/xml')
1✔
27
      @logger&.info "Deleting #{body}"
×
28
      start_time = Time.now
×
29
      response = Faraday.post(uri) do |req|
×
30
        req.headers = { 'Content-Type' => content_type }
×
31
        req.body = body
×
32
        req.options.open_timeout = 60
×
33
        req.options.read_timeout = 60
×
34
        req.options.write_timeout = 60
×
35
      end
36
      @logger&.info("Delete completed in #{Time.now - start_time} seconds. URL: #{uri}")
×
37
      response
×
38
    rescue Faraday::TimeoutError
39
      @logger&.warn("Delete timed out after #{Time.now - start_time} seconds. URL: #{uri} : #{body}")
×
40
      nil
×
41
    end
42

43
    def build_request_body(ids:)
1✔
44
      output = ['<delete>']
×
45
      ids.each do |id|
×
46
        output << "<id>#{id}</id>"
×
47
      end
48

49
      output << '</delete>'
×
50
      output.join
×
51
    end
52

53
    def valid_response?(response)
1✔
54
      return false if response.nil?
×
55

56
      response.status == 200
×
57
    end
58

59
    def delete_batch(batch)
1✔
60
      uri = "#{@solr_url}/update?waitSearcher=false&wt=json"
×
61
      body = build_request_body(ids: batch)
×
62

63
      response = request_deletion(uri:, body:)
×
64
      return if valid_response?(response)
×
65

66
      # Only retry once
67
      retry_response = request_deletion(uri:, body:)
×
68
      return if valid_response?(retry_response)
×
69

70
      unless retry_response.nil?
×
71
        Honeybadger.notify("Error deleting Solr documents. IDs: #{batch.join(', ')}. Status: #{retry_response.status}. Body: #{retry_response.body}")
×
72
      end
73
    end
74
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc