base_indexer 4.2.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fb2a56c11c92d29fc7d476b070e1b84409a4a769
4
- data.tar.gz: 1ab90182afa6a8083fe45b7122e06a9f252c8fc3
3
+ metadata.gz: 416cd88ba0ca83c08d9783cebc9af1eb044647c6
4
+ data.tar.gz: bd8aa214f215b69bbd5f553cd2f32a72dabec313
5
5
  SHA512:
6
- metadata.gz: a826e9dd54cb5ddf833c366d90de13333905531c459cd9d7fa95bc1a9e2e458d59fe8ba09e94570120b3771bb71ae5a6f5563a38c4d6fb4a6ed1661afea58ee9
7
- data.tar.gz: fb3ee9d52ba97f730d61076342007f108fd3a396c1281730942f90ee6e83aa922ebc90172c2b83f113be01fe24a5b0749efddef17977708fd5ab8ee2987786c2
6
+ metadata.gz: ad1abf4ebe31cb0caf0199e88086d7da89c52ce3efce64ee9806daa652132ac52313d823facc32fb8fe5be0a59627a811781839893a097afbf27949acfd6b9f9
7
+ data.tar.gz: 2b5db11fd80aedc6b7ec2a7dc1a95e587ac5faa13183b0ec6ad27ab9247d9cd5640086010e7adb416ec61a7ecde408c1a34dd7a4a632f66770a0180bc384bfde
data/.gitignore CHANGED
@@ -38,3 +38,4 @@ build/
38
38
  .internal_test_app
39
39
  /spec/internal
40
40
  ./spec/internal
41
+ /spec/examples.txt
data/Gemfile CHANGED
@@ -14,7 +14,7 @@ gemspec
14
14
  # gem 'debugger'
15
15
 
16
16
  # BEGIN ENGINE_CART BLOCK
17
- # engine_cart: 0.10.0
17
+ # engine_cart: 1.0.1
18
18
  # engine_cart stanza: 0.10.0
19
19
  # the below comes from engine_cart, a gem used to test this Rails engine gem in the context of a Rails app.
20
20
  file = File.expand_path('Gemfile', ENV['ENGINE_CART_DESTINATION'] || ENV['RAILS_ROOT'] || File.expand_path('.internal_test_app', File.dirname(__FILE__)))
@@ -36,14 +36,5 @@ else
36
36
  gem 'rails', ENV['RAILS_VERSION']
37
37
  end
38
38
  end
39
-
40
- case ENV['RAILS_VERSION']
41
- when /^4.2/
42
- gem 'responders', '~> 2.0'
43
- gem 'sass-rails', '>= 5.0'
44
- gem 'coffee-rails', '~> 4.1.0'
45
- when /^4.[01]/
46
- gem 'sass-rails', '< 5.0'
47
- end
48
39
  end
49
40
  # END ENGINE_CART BLOCK
@@ -1,16 +1,4 @@
1
1
  module BaseIndexer
2
2
  class ApplicationController < ActionController::Base
3
-
4
- def remove_prefix(druid)
5
- druid.gsub('druid:', '') # lop off druid prefix if sent
6
- end
7
-
8
- def report_failure(method_symbol, params, e)
9
- "#{method_symbol} #{params}\n\n#{e.inspect}\n#{e.message}\n#{e.backtrace}"
10
- end
11
-
12
- def report_success
13
- 'success'
14
- end
15
3
  end
16
4
  end
@@ -1,22 +1,15 @@
1
- require_dependency 'base_indexer/application_controller'
2
-
3
1
  module BaseIndexer
4
2
  class ItemsController < ApplicationController
5
3
  def update
6
4
  Rails.logger.debug "Receiving indexing #{druid}"
7
5
 
8
- indexer = BaseIndexer.indexer_class.constantize.new
9
6
  indexer.index druid, { subtarget_params => true }
10
7
  head :ok
11
- Rails.logger.debug "Completing indexing #{druid}"
12
- rescue StandardError => e
13
- Rails.logger.error report_failure request.method_symbol, params, e
14
- raise
15
8
  end
16
9
 
17
10
  def destroy
18
11
  Rails.logger.debug "Receiving deleting #{druid}"
19
- indexer = BaseIndexer.indexer_class.constantize.new
12
+
20
13
  # If no subtarget is defined, delete from everywhere
21
14
  if optional_subtarget_params.nil?
22
15
  indexer.delete druid
@@ -26,16 +19,16 @@ module BaseIndexer
26
19
  indexer.index druid, { subtarget_params => false }
27
20
  end
28
21
  head :ok
29
- Rails.logger.debug "Completing deleting #{druid}"
30
- rescue StandardError => e
31
- Rails.logger.error report_failure request.method_symbol, params, e
32
- raise
33
22
  end
34
23
 
35
24
  private
36
25
 
26
+ def indexer
27
+ BaseIndexer.indexer_class.constantize.new
28
+ end
29
+
37
30
  def druid
38
- remove_prefix params.require(:druid)
31
+ params.require(:druid).gsub('druid:', '') # lop off druid prefix if sent
39
32
  end
40
33
 
41
34
  def optional_subtarget_params
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
22
22
  s.add_dependency 'rails', '~> 5'
23
23
  s.add_dependency 'discovery-indexer', '>= 2', '< 4'
24
24
  s.add_dependency 'retries'
25
- s.add_dependency 'dor-fetcher'
25
+ s.add_dependency 'harvestdor-indexer'
26
26
  s.add_dependency 'config'
27
27
 
28
28
  s.add_development_dependency 'sqlite3'
@@ -3,4 +3,3 @@
3
3
  # The engine consumer app should override this class
4
4
  BaseIndexer.indexer_class = 'BaseIndexer::MainIndexerEngine'
5
5
  BaseIndexer.mapper_class_name = 'DiscoveryIndexer::GeneralMapper'
6
- BaseIndexer.solr_writer_class_name = 'BaseIndexer::Solr::Writer'
@@ -10,6 +10,4 @@ BaseIndexer::Engine.routes.draw do
10
10
  delete 'subtargets/:subtarget', action: :destroy
11
11
  end
12
12
  end
13
-
14
- resources :collections, only: :update
15
13
  end
@@ -7,6 +7,4 @@ require 'discovery-indexer'
7
7
  module BaseIndexer
8
8
  mattr_accessor :indexer_class
9
9
  mattr_accessor :mapper_class_name
10
- mattr_accessor :solr_writer_class_name
11
- mattr_accessor :fetcher_class
12
10
  end
@@ -16,29 +16,34 @@ module BaseIndexer
16
16
  # indexer = BaseIndexer::MainIndexerEngine.new
17
17
  # indexer.delete "ab123cd456"
18
18
  class MainIndexerEngine
19
- include DiscoveryIndexer
20
-
21
19
  # It is the main indexing function
22
20
  #
23
21
  # @param druid [String] is the druid for an object e.g., ab123cd4567
24
22
  # @param targets [Array] is an array with the targets list to index towards
25
23
  #
26
24
  # @raise it will raise erros if there is any problems happen in any level
27
- def index(druid, targets = nil)
25
+ def index(druid, targets)
28
26
  # Map the input to solr_doc
29
- solr_doc = BaseIndexer.mapper_class_name.constantize.new(druid).convert_to_solr_doc
27
+ solr_doc = mapper_class.new(druid).convert_to_solr_doc
30
28
 
31
29
  # Get SOLR configuration and write
32
- BaseIndexer.solr_writer_class_name.constantize.new
33
- .process(druid, solr_doc, targets, Settings.SOLR_TARGETS.to_hash.deep_stringify_keys)
30
+ solr_writer.process(druid, solr_doc, targets)
34
31
  end
35
32
 
36
33
  # It deletes an item defined by druid from all registered solr core
37
34
  # @param druid [String] is the druid for an object e.g., ab123cd4567
38
35
  def delete(druid)
39
- BaseIndexer.solr_writer_class_name.constantize.new
40
- .solr_delete_from_all(druid, Settings.SOLR_TARGETS.to_hash.deep_stringify_keys)
36
+ solr_writer.solr_delete_from_all(druid)
41
37
  end
42
38
 
39
+ private
40
+
41
+ def mapper_class
42
+ BaseIndexer.mapper_class_name.constantize
43
+ end
44
+
45
+ def solr_writer
46
+ BaseIndexer::Solr::Writer.new
47
+ end
43
48
  end
44
49
  end
@@ -6,6 +6,12 @@ module BaseIndexer
6
6
  # Processes adds and deletes to the solr core
7
7
  class Client
8
8
  include DiscoveryIndexer::Logging
9
+
10
+ def self.logging_handler(id)
11
+ proc do |exception, attempt_number, _total_delay|
12
+ DiscoveryIndexer::Logging.logger.error "#{exception.class} on attempt #{attempt_number} for #{id}"
13
+ end
14
+ end
9
15
 
10
16
  # Add the document to solr, retry if an error occurs.
11
17
  # See https://github.com/ooyala/retries for docs on with_retries.
@@ -14,7 +20,19 @@ module BaseIndexer
14
20
  # @param solr_connector [RSolr::Client] is an open connection with the solr core
15
21
  # @param max_retries [Integer] the maximum number of tries before fail
16
22
  def self.add(id, solr_doc, solr_connector, max_retries = 10)
17
- process(id, solr_doc, solr_connector, max_retries, false)
23
+ with_retries(max_tries: max_retries, handler: logging_handler(id), base_sleep_seconds: 1, max_sleep_seconds: 5) do |attempt|
24
+ DiscoveryIndexer::Logging.logger.debug "Attempt #{attempt} for #{id}"
25
+
26
+ if allow_update?(solr_connector) && doc_exists?(id, solr_connector)
27
+ update_solr_doc(id, solr_doc, solr_connector)
28
+ DiscoveryIndexer::Logging.logger.info "Updating #{id} on attempt #{attempt}"
29
+ else
30
+ solr_connector.add(solr_doc, :add_attributes => {:commitWithin => 10000})
31
+ DiscoveryIndexer::Logging.logger.info "Indexing #{id} on attempt #{attempt}"
32
+ end
33
+
34
+ DiscoveryIndexer::Logging.logger.info "Completing #{id} successfully on attempt #{attempt}"
35
+ end
18
36
  end
19
37
 
20
38
  # Add the document to solr, retry if an error occurs.
@@ -23,35 +41,11 @@ module BaseIndexer
23
41
  # @param solr_connector[RSolr::Client] is an open connection with the solr core
24
42
  # @param max_retries [Integer] the maximum number of tries before fail
25
43
  def self.delete(id, solr_connector, max_retries = 10)
26
- process(id, {}, solr_connector, max_retries, true)
27
- end
28
-
29
- # It's an internal method that receives all the requests and deal with
30
- # SOLR core. This method can call add, delete, or update
31
- #
32
- # @param id [String] the document id, usually it will be druid.
33
- # @param solr_doc [Hash] is the solr doc in hash format
34
- # @param solr_connector [RSolr::Client] is an open connection with the solr core
35
- # @param max_retries [Integer] the maximum number of tries before fail
36
- def self.process(id, solr_doc, solr_connector, max_retries, is_delete = false)
37
- handler = proc do |exception, attempt_number, _total_delay|
38
- DiscoveryIndexer::Logging.logger.error "#{exception.class} on attempt #{attempt_number} for #{id}"
39
- end
40
-
41
- with_retries(max_tries: max_retries, handler: handler, base_sleep_seconds: 1, max_sleep_seconds: 5) do |attempt|
44
+ with_retries(max_tries: max_retries, handler: logging_handler(id), base_sleep_seconds: 1, max_sleep_seconds: 5) do |attempt|
42
45
  DiscoveryIndexer::Logging.logger.debug "Attempt #{attempt} for #{id}"
43
46
 
44
- if is_delete
45
- solr_connector.delete_by_id(id, :add_attributes => {:commitWithin => 10000})
46
- DiscoveryIndexer::Logging.logger.info "Deleting #{id} on attempt #{attempt}"
47
- elsif allow_update?(solr_connector) && doc_exists?(id, solr_connector)
48
- update_solr_doc(id, solr_doc, solr_connector)
49
- DiscoveryIndexer::Logging.logger.info "Updating #{id} on attempt #{attempt}"
50
- else
51
- solr_connector.add(solr_doc, :add_attributes => {:commitWithin => 10000})
52
- DiscoveryIndexer::Logging.logger.info "Indexing #{id} on attempt #{attempt}"
53
- end
54
- #solr_connector.commit
47
+ solr_connector.delete_by_id(id, :add_attributes => {:commitWithin => 10000})
48
+ DiscoveryIndexer::Logging.logger.info "Deleting #{id} on attempt #{attempt}"
55
49
  DiscoveryIndexer::Logging.logger.info "Completing #{id} successfully on attempt #{attempt}"
56
50
  end
57
51
  end
@@ -66,16 +60,10 @@ module BaseIndexer
66
60
  # @param solr_connector [RSolr::Client] is an open connection with the solr core
67
61
  # @return [Boolean] true if the solr doc defined by this id exists
68
62
  def self.doc_exists?(id, solr_connector)
69
- response = solr_connector.get 'select', params: { q: 'id:"' + id + '"' }
63
+ response = solr_connector.get 'select', params: { q: 'id:"' + id + '"', defType: 'lucene' }
70
64
  response['response']['numFound'] == 1
71
65
  end
72
66
 
73
- # @param solr_connector [RSolr::Client] is an open connection with the solr core
74
- # send hard commit to solr
75
- def self.commit(solr_connector)
76
- RestClient.post self.solr_url(solr_connector), {},:content_type => :json, :accept=>:json
77
- end
78
-
79
67
  # It is an internal method that updates the solr doc instead of adding a new one.
80
68
  # @param id [String] the document id, usually it will be druid.
81
69
  # @param solr_doc [Hash] is the solr doc in hash format
@@ -83,31 +71,12 @@ module BaseIndexer
83
71
  def self.update_solr_doc(id, solr_doc, solr_connector)
84
72
  # update_solr_doc can't used RSolr because updating hash doc is not supported
85
73
  # so we need to build the json input manually
86
- params = "[{\"id\":\"#{id}\","
87
- solr_doc.each do |field_name, new_values|
88
- next if field_name == :id
89
- params += "\"#{field_name}\":"
90
- new_values = [new_values] unless new_values.class == Array
91
- new_values = new_values.map { |s| s.to_s.gsub('\\', '\\\\\\').gsub('"', '\"').strip } # strip leading/trailing spaces and escape quotes for each value
92
- params += "{\"set\":[\"#{new_values.join('","')}\"]},"
74
+ hash = { id: id }
75
+ solr_doc.each do |k,v|
76
+ hash[k] = { set: v } unless k.to_sym == :id
93
77
  end
94
- params.chomp!(',')
95
- params += '}]'
96
- RestClient.post self.solr_url(solr_connector), params, content_type: :json, accept: :json
78
+ solr_connector.update params: { commitWithin: 10000 }, data: Array.wrap(hash).to_json, headers: { 'Content-Type' => 'application/json' }
97
79
  end
98
-
99
- # adjust the solr_url so it works with or without a trailing /
100
- # @param solr_connector [RSolr::Client] is an open connection with the solr core
101
- # @return [String] the solr URL
102
- def self.solr_url(solr_connector)
103
- solr_url = solr_connector.options[:url]
104
- if solr_url.end_with?('/')
105
- "#{solr_url}update?commit=true"
106
- else
107
- "#{solr_url}/update?commit=true"
108
- end
109
- end
110
-
111
80
  end
112
81
  end
113
82
  end
@@ -5,28 +5,30 @@ module BaseIndexer
5
5
  module Solr
6
6
  # Performs writes to solr client based upon true and false release flags
7
7
  class Writer
8
- attr_reader :solr_targets_configs
9
-
10
8
  include DiscoveryIndexer::Logging
11
9
 
12
- def process(id, index_doc, targets, targets_configs)
13
- @solr_targets_configs = targets_configs
10
+ def process(id, index_doc, targets)
14
11
  index_targets = targets.select { |_, b| b }.keys
15
12
  delete_targets = targets.reject { |_, b| b }.keys
16
13
 
17
14
  # get targets with true
18
- solr_index_client(id, index_doc, index_targets) if index_targets.present?
15
+ solr_index_client(id, index_doc, index_targets)
19
16
  # get targets with false
20
- solr_delete_client(id, delete_targets) if delete_targets.present?
17
+ solr_delete_client(id, delete_targets)
21
18
  end
22
19
 
23
- def solr_delete_from_all(id, targets_configs)
20
+ def solr_delete_from_all(id)
24
21
  # Get a list of all registered targets
25
- @solr_targets_configs = targets_configs
26
22
  targets = solr_targets_configs.keys
27
23
  solr_delete_client(id, targets)
28
24
  end
29
25
 
26
+ def get_connector_for_target(solr_target)
27
+ solr_connector_targets[solr_target]
28
+ end
29
+
30
+ private
31
+
30
32
  def solr_index_client(id, index_doc, targets)
31
33
  targets.each do |solr_target|
32
34
  solr_connector = get_connector_for_target(solr_target)
@@ -41,15 +43,16 @@ module BaseIndexer
41
43
  end
42
44
  end
43
45
 
44
- def get_connector_for_target(solr_target)
45
- solr_connector = nil
46
- unless solr_targets_configs.nil?
47
- if solr_targets_configs.keys.include?(solr_target)
48
- config = solr_targets_configs[solr_target]
49
- solr_connector = RSolr.connect(config.deep_symbolize_keys)
46
+ def solr_connector_targets
47
+ @solr_connector_targets ||= begin
48
+ solr_targets_configs.transform_values do |config|
49
+ RSolr.connect(config.deep_symbolize_keys)
50
50
  end
51
51
  end
52
- solr_connector
52
+ end
53
+
54
+ def solr_targets_configs
55
+ Settings.SOLR_TARGETS.to_hash.stringify_keys
53
56
  end
54
57
  end
55
58
  end
@@ -1,3 +1,3 @@
1
1
  module BaseIndexer
2
- VERSION = '4.2.0'
2
+ VERSION = '5.0.0'
3
3
  end
@@ -138,7 +138,7 @@ desc 'Index an entire collection, including the collection itself and all of its
138
138
  #Run me: rake collection_indexer RAILS_ENV=production target=revs_prod collection_druid=oo000oo0001
139
139
  # Examples:
140
140
  task :collection_indexer => :environment do |t, args|
141
-
141
+ require 'harvestdor/indexer'
142
142
  target = ENV['target'] # must pass in the target so specify solr core to index into
143
143
  collection_druid = ENV['collection_druid']
144
144
 
@@ -160,14 +160,14 @@ task :collection_indexer => :environment do |t, args|
160
160
 
161
161
  indexer = BaseIndexer.indexer_class.constantize.new
162
162
 
163
- fetcher = BaseIndexer.fetcher_class.constantize.new(service_url: Rails.application.config.fetcher_url)
163
+ fetcher = Harvestdor::Indexer::PurlFetcher.new(url: Rails.application.config.fetcher_url)
164
164
 
165
165
  collection_druid=collection_druid.gsub('druid:','')
166
166
 
167
167
  indexer.index(collection_druid,{target=>true})
168
168
  log my_logger,"Indexed collection: #{collection_druid}"
169
169
 
170
- druids = fetcher.druid_array(fetcher.get_collection(collection_druid, {}))
170
+ druids = fetcher.druids_from_collection(collection_druid)
171
171
 
172
172
  log my_logger,"** Found #{druids.size} members of the collection"
173
173
 
@@ -1,14 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe BaseIndexer::MainIndexerEngine do
3
+ RSpec.describe BaseIndexer::MainIndexerEngine do
4
4
  before :all do
5
5
  DiscoveryIndexer::PURL_DEFAULT = 'https://purl.stanford.edu'
6
6
  end
7
7
 
8
8
  describe '.delete' do
9
9
  it 'should call solr_delete_from_all for delete call' do
10
- expect_any_instance_of(BaseIndexer::Solr::Writer).to receive(:solr_delete_from_all)
11
- .with('aa111aa1111', 'target1' => { 'url' => 'http://localhost:8983/solr/' }, 'target2' => { 'url' => 'http://localhost:8983/solr/' })
10
+ expect_any_instance_of(BaseIndexer::Solr::Writer).to receive(:solr_delete_from_all).with('aa111aa1111')
12
11
 
13
12
  BaseIndexer::MainIndexerEngine.new.delete 'aa111aa1111'
14
13
  end
@@ -1,47 +1,32 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe BaseIndexer::Solr::Client do
3
+ RSpec.describe BaseIndexer::Solr::Client do
4
4
  let(:druid) { 'cb077vs7846' }
5
- let (:solr_doc) { double('solr_doc', {}) }
6
- let(:max_retries) { 10 }
7
- describe '.solr_url' do
8
- it 'should correctly handle urls with both trailing and leading slashes' do
9
- connectors=[RSolr.connect(url: 'http://localhost:8983/solr/'),RSolr.connect(url: 'http://localhost:8983/solr')]
10
- connectors.each do |connector|
11
- expect(described_class.solr_url(connector)).to eq 'http://localhost:8983/solr/update?commit=true'
12
- end
13
- end
14
- end
5
+ let(:solr_doc) { { a: 1 } }
15
6
 
16
- describe '.process' do
17
- describe 'delete' do
18
- let (:solr_connector) { double('connector', { options: { url: 'http://localhost:8983/solr/' } } ) }
19
- let(:is_delete) { true }
20
- it 'should send a delete_by_id command' do
21
- expect(solr_connector).to receive(:delete_by_id).with(druid, {:add_attributes=>{:commitWithin=>10000}})
22
- BaseIndexer::Solr::Client.process(druid, {}, solr_connector, max_retries, is_delete)
23
- end
7
+ describe 'delete' do
8
+ let (:solr_connector) { double('connector', { options: { url: 'http://localhost:8983/solr/' } } ) }
9
+ it 'should send a delete_by_id command' do
10
+ expect(solr_connector).to receive(:delete_by_id).with(druid, {:add_attributes=>{:commitWithin=>10000}})
11
+ BaseIndexer::Solr::Client.delete(druid, solr_connector)
24
12
  end
25
- describe 'update' do
26
- let(:is_delete) { false }
27
- let(:response) { double({}) }
28
- let (:solr_connector) { double('connector', { options: { url: 'http://localhost:8983/solr/', allow_update: true } } ) }
29
- it 'should send update_solr_doc' do
30
- allow(solr_connector).to receive(:get).with("select", {:params=>{:q=>"id:\"cb077vs7846\""}}).and_return(:response)
31
- allow(BaseIndexer::Solr::Client).to receive(:update_solr_doc).with(druid, solr_doc, solr_connector)
32
- expect(solr_connector).to receive(:add).with(solr_doc, :add_attributes => {:commitWithin => 10000})
33
- BaseIndexer::Solr::Client.process(druid, solr_doc, solr_connector, max_retries, is_delete)
34
- end
13
+ end
14
+ describe 'update' do
15
+ let(:response) { { 'response' => { 'numFound' => 1 } } }
16
+ let (:solr_connector) { double('connector', { options: { url: 'http://localhost:8983/solr/', allow_update: true } } ) }
17
+ it 'should send update_solr_doc' do
18
+ allow(solr_connector).to receive(:get).with("select", {:params=>{ :q=>"id:\"cb077vs7846\"", :defType => 'lucene'}}).and_return(response)
19
+ expect(solr_connector).to receive(:update).with(hash_including(data: [{ id: 'cb077vs7846', a: { set: 1 }}].to_json))
20
+ BaseIndexer::Solr::Client.add(druid, solr_doc, solr_connector)
35
21
  end
36
- describe 'add' do
37
- let(:is_delete) { false }
38
- let(:response) { double({}) }
39
- let (:solr_connector) { double('connector', { options: { url: 'http://localhost:8983/solr/', allow_update: true, commitWithin: '10000'} } ) }
40
- it 'should send an add command' do
41
- allow(solr_connector).to receive(:get).with("select", {:params=>{:q=>"id:\"cb077vs7846\""}}).and_return(:response)
42
- expect(solr_connector).to receive(:add).with(solr_doc, :add_attributes => {:commitWithin => 10000})
43
- BaseIndexer::Solr::Client.process(druid, solr_doc, solr_connector, max_retries, is_delete)
44
- end
22
+ end
23
+ describe 'add' do
24
+ let(:response) { double({}) }
25
+ let (:solr_connector) { double('connector', { options: { url: 'http://localhost:8983/solr/', allow_update: true, commitWithin: '10000'} } ) }
26
+ it 'should send an add command' do
27
+ allow(solr_connector).to receive(:get).with("select", {:params=>{:q=>"id:\"cb077vs7846\"", :defType => 'lucene'}}).and_return(:response)
28
+ expect(solr_connector).to receive(:add).with(solr_doc, :add_attributes => {:commitWithin => 10000})
29
+ BaseIndexer::Solr::Client.add(druid, solr_doc, solr_connector)
45
30
  end
46
31
  end
47
32
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe BaseIndexer::Solr::Writer do
3
+ RSpec.describe BaseIndexer::Solr::Writer do
4
4
  let(:sw_connection) { { url: 'http://solr-core:8983/sw-prod/' } }
5
5
  let(:preview_connection) { { url: 'http://solr-core:8983/sw-preview/' } }
6
6
  let(:mix_targets) { { 'searchworks' => true, 'searchworks:preview' => false } }
@@ -20,17 +20,17 @@ describe BaseIndexer::Solr::Writer do
20
20
  it 'should create two arrays index_targets and delete_targets' do
21
21
  expect(subject).to receive(:solr_index_client).with(id, solr_doc, ['searchworks'])
22
22
  expect(subject).to receive(:solr_delete_client).with(id, ['searchworks:preview'])
23
- subject.process(id, solr_doc, mix_targets, {})
23
+ subject.process(id, solr_doc, mix_targets)
24
24
  end
25
25
  it 'should not send delete messages when there are no delete targets' do
26
26
  expect(subject).to receive(:solr_index_client).with(id, solr_doc, ['searchworks'])
27
- expect(subject).not_to receive(:solr_delete_client)
28
- subject.process(id, solr_doc, index_targets, {})
27
+ expect(BaseIndexer::Solr::Client).not_to receive(:delete)
28
+ subject.process(id, solr_doc, index_targets)
29
29
  end
30
30
  it 'should not send index messages when there are no index targets' do
31
- expect(subject).not_to receive(:solr_index_client)
31
+ expect(BaseIndexer::Solr::Client).not_to receive(:add)
32
32
  expect(subject).to receive(:solr_delete_client).with(id, ['searchworks:preview'])
33
- subject.process(id, solr_doc, delete_targets, {})
33
+ subject.process(id, solr_doc, delete_targets)
34
34
  end
35
35
  end
36
36
 
@@ -38,12 +38,12 @@ describe BaseIndexer::Solr::Writer do
38
38
  it 'should call solr client delete method for each target' do
39
39
  expect(BaseIndexer::Solr::Client).to receive(:delete).with('aa111bb222', an_instance_of(RSolr::Client))
40
40
  expect(BaseIndexer::Solr::Client).to receive(:delete).with('aa111bb222', an_instance_of(RSolr::Client))
41
- subject.solr_delete_client('aa111bb222', ['searchworks', 'searchworks:preview'])
41
+ subject.process('aa111bb222', {}, { 'searchworks' => false, 'searchworks:preview' => false })
42
42
  end
43
43
 
44
44
  it 'should not call solr client delete method when there is no client for the given target' do
45
45
  expect(BaseIndexer::Solr::Client).not_to receive(:delete)
46
- subject.solr_delete_client('aa111bb222', ['blah'])
46
+ subject.process('aa111bb222', {}, { 'blah' => false })
47
47
  end
48
48
  end
49
49
 
@@ -62,11 +62,5 @@ describe BaseIndexer::Solr::Writer do
62
62
  solr_connector = subject.get_connector_for_target('nothing')
63
63
  expect(solr_connector).to be_nil
64
64
  end
65
-
66
- it 'should return nil for a nil solr targets list' do
67
- allow(subject).to receive(:solr_targets_configs).and_return(nil)
68
- solr_connector = subject.get_connector_for_target('searchworks')
69
- expect(solr_connector).to be_nil
70
- end
71
65
  end
72
66
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe BaseIndexer::ItemsController, type: :controller do
3
+ RSpec.describe BaseIndexer::ItemsController, type: :controller do
4
4
  let(:my_instance) { instance_double(BaseIndexer::MainIndexerEngine) }
5
5
  before do
6
6
  allow(BaseIndexer::MainIndexerEngine).to receive(:new).and_return(my_instance)
@@ -65,48 +65,55 @@ RSpec.configure do |config|
65
65
 
66
66
  # The settings below are suggested to provide a good initial experience
67
67
  # with RSpec, but feel free to customize to your heart's content.
68
- # # These two settings work together to allow you to limit a spec run
69
- # # to individual examples or groups you care about by tagging them with
70
- # # `:focus` metadata. When nothing is tagged with `:focus`, all examples
71
- # # get run.
72
- # config.filter_run :focus
73
- # config.run_all_when_everything_filtered = true
74
- #
75
- # # Limits the available syntax to the non-monkey patched syntax that is
76
- # # recommended. For more details, see:
77
- # # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
78
- # # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
79
- # # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
80
- # config.disable_monkey_patching!
81
- #
82
- # # This setting enables warnings. It's recommended, but in some cases may
83
- # # be too noisy due to issues in dependencies.
84
- # config.warnings = true
85
- #
86
- # # Many RSpec users commonly either run the entire suite or an individual
87
- # # file, and it's useful to allow more verbose output when running an
88
- # # individual spec file.
89
- # if config.files_to_run.one?
90
- # # Use the documentation formatter for detailed output,
91
- # # unless a formatter has already been configured
92
- # # (e.g. via a command-line flag).
93
- # config.default_formatter = 'doc'
94
- # end
95
- #
96
- # # Print the 10 slowest examples and example groups at the
97
- # # end of the spec run, to help surface which specs are running
98
- # # particularly slow.
99
- # config.profile_examples = 10
100
- #
101
- # # Run specs in random order to surface order dependencies. If you find an
102
- # # order dependency and want to debug it, you can fix the order by providing
103
- # # the seed, which is printed after each run.
104
- # # --seed 1234
105
- # config.order = :random
106
- #
107
- # # Seed global randomization in this process using the `--seed` CLI option.
108
- # # Setting this allows you to use `--seed` to deterministically reproduce
109
- # # test failures related to randomization by passing the same `--seed` value
110
- # # as the one that triggered the failure.
111
- # Kernel.srand config.seed
68
+ # These two settings work together to allow you to limit a spec run
69
+ # to individual examples or groups you care about by tagging them with
70
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
71
+ # get run.
72
+ config.filter_run :focus
73
+ config.run_all_when_everything_filtered = true
74
+
75
+ # Limits the available syntax to the non-monkey patched syntax that is
76
+ # recommended. For more details, see:
77
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
78
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
79
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
80
+ config.disable_monkey_patching!
81
+
82
+ config.shared_context_metadata_behavior = :apply_to_host_groups
83
+
84
+ # This allows you to limit a spec run to individual examples or groups
85
+ # you care about by tagging them with `:focus` metadata. When nothing
86
+ # is tagged with `:focus`, all examples get run. RSpec also provides
87
+ # aliases for `it`, `describe`, and `context` that include `:focus`
88
+ # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
89
+ config.filter_run_when_matching :focus
90
+
91
+ config.example_status_persistence_file_path = 'spec/examples.txt'
92
+
93
+ # Many RSpec users commonly either run the entire suite or an individual
94
+ # file, and it's useful to allow more verbose output when running an
95
+ # individual spec file.
96
+ if config.files_to_run.one?
97
+ # Use the documentation formatter for detailed output,
98
+ # unless a formatter has already been configured
99
+ # (e.g. via a command-line flag).
100
+ config.default_formatter = 'doc'
101
+ end
102
+
103
+ # Print the 10 slowest examples and example groups at the
104
+ # end of the spec run, to help surface which specs are running
105
+ # particularly slow.
106
+ config.profile_examples = 10
107
+
108
+ # Run specs in random order to surface order dependencies. If you find an
109
+ # order dependency and want to debug it, you can fix the order by providing
110
+ # the seed, which is printed after each run.
111
+ # --seed 1234
112
+ config.order = :random
113
+
114
+ # Seed global randomization in this process using the `--seed` CLI option.
115
+ # Setting this allows you to use `--seed` to deterministically reproduce
116
+ # test failures related to randomization by passing the same `--seed` value
117
+ # as the one that triggered the failure.
118
+ Kernel.srand config.seed
112
119
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: base_indexer
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.0
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ahmed Alsum
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2018-03-08 00:00:00.000000000 Z
12
+ date: 2018-03-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -60,7 +60,7 @@ dependencies:
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  - !ruby/object:Gem::Dependency
63
- name: dor-fetcher
63
+ name: harvestdor-indexer
64
64
  requirement: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
@@ -242,7 +242,6 @@ files:
242
242
  - Rakefile
243
243
  - app/controllers/base_indexer/about_controller.rb
244
244
  - app/controllers/base_indexer/application_controller.rb
245
- - app/controllers/base_indexer/collections_controller.rb
246
245
  - app/controllers/base_indexer/items_controller.rb
247
246
  - app/helpers/base_indexer/application_helper.rb
248
247
  - app/helpers/base_indexer/items_helper.rb
@@ -1,40 +0,0 @@
1
- require_dependency 'base_indexer/application_controller'
2
-
3
- module BaseIndexer
4
- class CollectionsController < ApplicationController
5
- def update
6
- druid = remove_prefix params[:id]
7
-
8
- Rails.logger.debug "Receiving indexing of collection #{druid}"
9
- targets = params[:subtargets]
10
-
11
- # initial collection item itself
12
- indexer = BaseIndexer.indexer_class.constantize.new
13
- indexer.index druid, targets
14
-
15
- # Determine collection item druids
16
- fetcher = BaseIndexer.fetcher_class.constantize.new(service_url: Rails.application.config.fetcher_url)
17
- item_druids = fetcher.druid_array(fetcher.get_collection(druid, {}))
18
-
19
- Rails.logger.debug "Found #{item_druids.size} members of the collection #{druid}"
20
-
21
- counter = 0
22
-
23
- item_druids.each do |idruid|
24
- druid = remove_prefix idruid
25
- counter += 1
26
- indexer.index druid, targets
27
- Rails.logger.debug "#{counter} of #{item_druids.size}: #{druid}"
28
- end
29
-
30
- @status = report_success
31
- head :ok
32
- Rails.logger.debug "Completing indexing of collection #{druid}"
33
-
34
- rescue Exception => e
35
- @status = report_failure request.method_symbol, params, e
36
- Rails.logger.error @status
37
- raise
38
- end
39
- end
40
- end