solrj_wrapper 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +25 -0
- data/.gitmodules +3 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.rdoc +40 -0
- data/Rakefile +22 -0
- data/lib/config/settings.yml +23 -0
- data/lib/solrj_wrapper/settings.rb +45 -0
- data/lib/solrj_wrapper/version.rb +3 -0
- data/lib/solrj_wrapper.rb +124 -0
- data/lib/tasks/ci.rake +9 -0
- data/lib/tasks/doc.rake +23 -0
- data/lib/tasks/jetty.rake +38 -0
- data/lib/tasks/solrmarc.rake +17 -0
- data/lib/tasks/spec.rake +26 -0
- data/solrj_wrapper.gemspec +32 -0
- data/spec/solr/solr.xml +12 -0
- data/spec/solrj_wrapper_spec.rb +188 -0
- data/spec/spec_helper.rb +24 -0
- metadata +153 -0
data/.gitignore
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
## PROJECT
|
2
|
+
.bundle
|
3
|
+
rdoc
|
4
|
+
doc
|
5
|
+
.yardoc
|
6
|
+
*.lock
|
7
|
+
solrmarc.log*
|
8
|
+
|
9
|
+
## vim
|
10
|
+
*.swp
|
11
|
+
|
12
|
+
## rcov
|
13
|
+
coverage.data
|
14
|
+
coverage
|
15
|
+
|
16
|
+
## MAC OS
|
17
|
+
.DS_Store
|
18
|
+
|
19
|
+
## TextMate
|
20
|
+
*.tmproj
|
21
|
+
tmtags
|
22
|
+
|
23
|
+
## Rubymine
|
24
|
+
.idea/*
|
25
|
+
|
data/.gitmodules
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use jruby-1.6.7@solrj_wrapper --create
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Naomi Dushay
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
= SolrjWrapper
|
2
|
+
|
3
|
+
Ruby wrapper for interacting with Solrj objects, such as org.apache.solr.client.solrj.impl.StreamingUpdateSolrServer.
|
4
|
+
|
5
|
+
== Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'solrj_wrapper'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install solrj_wrapper
|
18
|
+
|
19
|
+
== Usage
|
20
|
+
|
21
|
+
This gem must be run under JRuby, and also requires a directory containing Solrj jar files and solr url (see config/settings.yml)
|
22
|
+
|
23
|
+
Here are some examples of use cribbed from the specs:
|
24
|
+
|
25
|
+
sjw = SolrjWrapper.new(solrj_jar_dir, solr_url, solrj_queue_size, solrj_num_threads)
|
26
|
+
sjw.get_query_result_docs(q).should be_an_instance_of(Java::OrgApacheSolrCommon::SolrDocumentList)
|
27
|
+
sjw.streaming_update_server.should be_an_instance_of(Java::OrgApacheSolrClientSolrjImpl::StreamingUpdateSolrServer)
|
28
|
+
sid = Java::OrgApacheSolrCommon::SolrInputDocument.new
|
29
|
+
sjw.add_vals_to_fld(sid, "single", ["val"])
|
30
|
+
|
31
|
+
|
32
|
+
== Contributing
|
33
|
+
|
34
|
+
See also the wiki page for committers: https://github.com/sul-dlss/solrj_wrapper/wiki/For-Committers
|
35
|
+
|
36
|
+
1. Fork it
|
37
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
38
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
39
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
40
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require 'bundler/setup'
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
|
5
|
+
require 'rake'
|
6
|
+
require 'bundler'
|
7
|
+
|
8
|
+
begin
|
9
|
+
Bundler.setup(:default, :development)
|
10
|
+
rescue Bundler::BundlerError => e
|
11
|
+
$stderr.puts e.message
|
12
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
13
|
+
exit e.status_code
|
14
|
+
end
|
15
|
+
|
16
|
+
Dir.glob('lib/tasks/*.rake').each { |r| import r }
|
17
|
+
|
18
|
+
namespace :sj_wrap do
|
19
|
+
task :default => :ci
|
20
|
+
task :rspec => :rspec_plain
|
21
|
+
task :spec => :rspec_plain
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# settings for production
|
2
|
+
prod:
|
3
|
+
solr_url: your_production_solr_url
|
4
|
+
solrj_jar_dir: your_solrj_jar_dir
|
5
|
+
solrj_queue_size: 20
|
6
|
+
solrj_num_threads: 1
|
7
|
+
log_level: error
|
8
|
+
|
9
|
+
# settings for local development
|
10
|
+
dev:
|
11
|
+
solr_url: http://127.0.0.1:8985/solr/dev
|
12
|
+
solrj_jar_dir: solrmarc/dist/lib
|
13
|
+
solrj_queue_size: 20
|
14
|
+
solrj_num_threads: 1
|
15
|
+
log_level: info
|
16
|
+
|
17
|
+
# settings for continuous integration
|
18
|
+
ci:
|
19
|
+
solr_url: http://127.0.0.1:8985/solr/test
|
20
|
+
solrj_jar_dir: solrmarc/dist/lib
|
21
|
+
solrj_queue_size: 20
|
22
|
+
solrj_num_threads: 1
|
23
|
+
log_level: info
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
# Read the .yml file containing the configuration values
|
4
|
+
class Settings
|
5
|
+
|
6
|
+
attr_reader :solr_url, :solrj_jar_dir, :solrj_queue_size, :solrj_num_threads, :log_level, :log_file
|
7
|
+
|
8
|
+
def initialize(settings_group)
|
9
|
+
yml = YAML.load_file('lib/config/settings.yml')[settings_group]
|
10
|
+
@solr_url = yml["solr_url"]
|
11
|
+
@solrj_jar_dir = yml["solrj_jar_dir"]
|
12
|
+
@solrj_queue_size = yml["solrj_queue_size"]
|
13
|
+
@solrj_num_threads = yml["solrj_num_threads"]
|
14
|
+
@log_level = yml["log_level"]
|
15
|
+
@log_file = yml["log_file"]
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return the attributes of this class as a Hash
|
19
|
+
def as_hash
|
20
|
+
{:solr_url => @solr_url,
|
21
|
+
:solrj_jar_dir => @solrj_jar_dir,
|
22
|
+
:solrj_queue_size => @solrj_queue_size,
|
23
|
+
:solrj_num_threads => @solrj_num_threads,
|
24
|
+
:log_level => get_log_level,
|
25
|
+
:log_file => @log_file
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_log_level
|
30
|
+
case (@log_level)
|
31
|
+
when "debug"
|
32
|
+
logger_level = Logger::DEBUG
|
33
|
+
when "warn"
|
34
|
+
logger_level = Logger::WARN
|
35
|
+
when "error"
|
36
|
+
logger_level = Logger::ERROR
|
37
|
+
when "fatal"
|
38
|
+
logger_level = Logger::FATAL
|
39
|
+
else
|
40
|
+
logger_level = Logger::INFO
|
41
|
+
end
|
42
|
+
logger_level
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
include Java
|
2
|
+
|
3
|
+
require "solrj_wrapper/version"
|
4
|
+
require 'logger'
|
5
|
+
|
6
|
+
# Methods required to interact with SolrJ objects, such as org.apache.solr.client.solrj.impl.StreamingUpdateSolrServer
|
7
|
+
class SolrjWrapper
|
8
|
+
|
9
|
+
attr_reader :streaming_update_server, :query_server
|
10
|
+
attr_accessor :query
|
11
|
+
|
12
|
+
# @param solrj_jar_dir the location of Solrj jars needed to use SolrJ here
|
13
|
+
# @param solr_url base url of the solr instance
|
14
|
+
# @param queue_size the number of Solr documents to buffer before writing to Solr
|
15
|
+
# @param num_threads the number of threads to use when writing to Solr (should not be more than the number of cpu cores avail)
|
16
|
+
# @param log_level level of Logger messages to output; defaults to Logger::INFO
|
17
|
+
# @param log_file file to receive Logger output; defaults to STDERR
|
18
|
+
def initialize(solrj_jar_dir, solr_url, queue_size, num_threads, log_level=Logger::INFO, log_file=STDERR)
|
19
|
+
if not defined? JRUBY_VERSION
|
20
|
+
raise "SolrjWrapper only runs under jruby"
|
21
|
+
end
|
22
|
+
@logger = Logger.new(log_file)
|
23
|
+
@logger.level = log_level
|
24
|
+
load_solrj(solrj_jar_dir)
|
25
|
+
@query_server = org.apache.solr.client.solrj.impl.CommonsHttpSolrServer.new(solr_url)
|
26
|
+
@streaming_update_server = org.apache.solr.client.solrj.impl.StreamingUpdateSolrServer.new(solr_url, queue_size, num_threads)
|
27
|
+
useJavabin!
|
28
|
+
end
|
29
|
+
|
30
|
+
# send the query to Solr and get the SolrDocumentList from the response
|
31
|
+
# @param org.apache.solr.client.solrj.SolrQuery object populated with query information to send to Solr
|
32
|
+
# @return Java::OrgApacheSolrCommon::SolrDocumentList per the query. The list size will be the number of rows in the Solr response
|
33
|
+
def get_query_result_docs(query_obj)
|
34
|
+
response = @query_server.query(query_obj)
|
35
|
+
response.getResults
|
36
|
+
end
|
37
|
+
|
38
|
+
# Send requests using the Javabin binary format instead of serializing to XML
|
39
|
+
# Requires /update/javabin to be defined in solrconfig.xml as
|
40
|
+
# <requestHandler name="/update/javabin" class="solr.BinaryUpdateRequestHandler" />
|
41
|
+
def useJavabin!
|
42
|
+
@streaming_update_server.setRequestWriter Java::org.apache.solr.client.solrj.impl.BinaryRequestWriter.new
|
43
|
+
end
|
44
|
+
|
45
|
+
# given a SolrInputDocument, add the field and/or the values. This will not add empty values, and it will not add duplicate values
|
46
|
+
# @param solr_input_doc - the SolrInputDocument object receiving a new field value
|
47
|
+
# @param fld_name - the name of the Solr field
|
48
|
+
# @param val_array - an array of values for the Solr field
|
49
|
+
def add_vals_to_fld(solr_input_doc, fld_name, val_array)
|
50
|
+
unless val_array.nil? || solr_input_doc.nil? || fld_name.nil?
|
51
|
+
val_array.each { |value|
|
52
|
+
add_val_to_fld(solr_input_doc, fld_name, value)
|
53
|
+
}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# given a SolrInputDocument, add the field and/or the value. This will not add empty values, and it will not add duplicate values
|
58
|
+
# @param solr_input_doc - the SolrInputDocument object receiving a new field value
|
59
|
+
# @param fld_name - the name of the Solr field
|
60
|
+
# @param value - the value to add to the Solr field
|
61
|
+
def add_val_to_fld(solr_input_doc, fld_name, value)
|
62
|
+
if !solr_input_doc.nil? && !fld_name.nil? && fld_name.size > 0 && !value.nil? && value.size > 0
|
63
|
+
if !solr_input_doc[fld_name].nil? && solr_input_doc
|
64
|
+
existing_vals = solr_input_doc[fld_name].getValues
|
65
|
+
end
|
66
|
+
if existing_vals.nil? || !existing_vals.contains(value)
|
67
|
+
solr_input_doc.addField(fld_name, value, 1.0)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# given a SolrInputDocument, replace all the values of the field with the new values.
|
73
|
+
# If the values to be added are an empty array, the field will be removed.
|
74
|
+
# If the field doesn't exist in the document, then it will be created (if the value array isn't empty)
|
75
|
+
# @param solr_input_doc - the SolrInputDocument object receiving a new field value
|
76
|
+
# @param fld_name - the name of the Solr field
|
77
|
+
# @param value - an array of values for the Solr field
|
78
|
+
def replace_field_values(solr_input_doc, fld_name, val_array)
|
79
|
+
solr_input_doc.removeField(fld_name)
|
80
|
+
add_vals_to_fld(solr_input_doc, fld_name, val_array)
|
81
|
+
end
|
82
|
+
|
83
|
+
# add the doc to Solr by calling add on the Solrj StreamingUpdateServer object
|
84
|
+
# @param solr_input_doc - the SolrInputDocument to be added to the Solr index
|
85
|
+
# @param id - the id of the Solr document, used for log messages
|
86
|
+
def add_doc_to_ix(solr_input_doc, id)
|
87
|
+
unless solr_input_doc.nil?
|
88
|
+
begin
|
89
|
+
@streaming_update_server.add(solr_input_doc)
|
90
|
+
@logger.info("updating Solr document #{id}")
|
91
|
+
rescue org.apache.solr.common.SolrException => e
|
92
|
+
@logger.error("SolrException while indexing document #{id}")
|
93
|
+
@logger.error("#{e.message}")
|
94
|
+
@logger.error("#{e.backtrace}")
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# send a commit to the Solrj StreamingUpdateServer object
|
100
|
+
def commit
|
101
|
+
begin
|
102
|
+
update_response = @streaming_update_server.commit
|
103
|
+
rescue org.apache.solr.common.SolrException => e
|
104
|
+
@logger.error("SolrException while committing updates")
|
105
|
+
@logger.error("#{e.message}")
|
106
|
+
@logger.error("#{e.backtrace}")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
# remove all docs from the Solr index. Assumes default request handler has type dismax
|
111
|
+
def empty_ix
|
112
|
+
delete_response = @streaming_update_server.deleteByQuery("*:*")
|
113
|
+
commit
|
114
|
+
end
|
115
|
+
|
116
|
+
|
117
|
+
protected
|
118
|
+
|
119
|
+
# require all the necessary jars to use Solrj classes
|
120
|
+
def load_solrj(solrj_jar_dir)
|
121
|
+
Dir["#{solrj_jar_dir}/*.jar"].each {|jar_file| require jar_file }
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
data/lib/tasks/ci.rake
ADDED
data/lib/tasks/doc.rake
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'yard'
|
2
|
+
require 'yard/rake/yardoc_task'
|
3
|
+
|
4
|
+
namespace :sj_wrap do
|
5
|
+
|
6
|
+
# Use yard to build docs
|
7
|
+
begin
|
8
|
+
project_root = File.expand_path(File.dirname(__FILE__) + "/../..")
|
9
|
+
doc_dest_dir = File.join(project_root, 'doc')
|
10
|
+
|
11
|
+
YARD::Rake::YardocTask.new(:doc) do |yt|
|
12
|
+
yt.files = Dir.glob(File.join(project_root, 'lib', '**', '*.rb')) +
|
13
|
+
[ File.join(project_root, 'README.rdoc') ]
|
14
|
+
yt.options = ['--output-dir', doc_dest_dir, '--readme', 'README.rdoc', '--title', 'SolrJ_Wrapper Documentation']
|
15
|
+
end
|
16
|
+
rescue LoadError
|
17
|
+
desc "Generate YARD Documentation"
|
18
|
+
task :doc do
|
19
|
+
abort "Please install the YARD gem to generate rdoc."
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'jettywrapper'
|
2
|
+
|
3
|
+
namespace :sj_wrap do
|
4
|
+
namespace :jetty do
|
5
|
+
|
6
|
+
desc "Modify test jetty solr to be multicore"
|
7
|
+
task :config => ['sj_wrap:solrmarc:setup_test_jetty'] do
|
8
|
+
|
9
|
+
# copy the solr.xml file for multi-core to test jetty solr
|
10
|
+
jetty_solr_dir = "solrmarc/test/jetty/solr"
|
11
|
+
cp('spec/solr/solr.xml', jetty_solr_dir, :verbose => true)
|
12
|
+
|
13
|
+
# set up solr dev and test conf directories
|
14
|
+
dev_conf_dir = "#{jetty_solr_dir}/dev/conf"
|
15
|
+
test_conf_dir = "#{jetty_solr_dir}/test/conf"
|
16
|
+
mkdir_p(dev_conf_dir) unless Dir.exists?(dev_conf_dir)
|
17
|
+
mkdir_p(test_conf_dir) unless Dir.exists?(test_conf_dir)
|
18
|
+
single_core_conf_dir = "#{jetty_solr_dir}/conf"
|
19
|
+
Dir["#{single_core_conf_dir}/*"].each { |f|
|
20
|
+
cp_r(f, dev_conf_dir, :verbose => true)
|
21
|
+
cp_r(f, test_conf_dir, :verbose => true)
|
22
|
+
}
|
23
|
+
|
24
|
+
require 'fileutils'
|
25
|
+
# remove single core conf directory
|
26
|
+
FileUtils.rm_rf("#{jetty_solr_dir}/conf/.", :verbose => true)
|
27
|
+
Dir.foreach(jetty_solr_dir + "/conf") { |f|
|
28
|
+
fn = File.join(jetty_solr_dir, f)
|
29
|
+
File.delete(fn) if f != '.' && f != '..'
|
30
|
+
}
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "Copies the SOLR config files and starts up the test-jetty instance"
|
35
|
+
task :load => [:config, 'jetty:start']
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
namespace :sj_wrap do
|
2
|
+
namespace :solrmarc do
|
3
|
+
require 'ant'
|
4
|
+
|
5
|
+
desc "run ant dist_site target in solrmarc"
|
6
|
+
task :ant_dist_site do
|
7
|
+
ant '-f solrmarc/build.xml dist_site'
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "run ant target to set up testing jetty per straight solrmarc"
|
11
|
+
task :setup_test_jetty do
|
12
|
+
ant '-f solrmarc/build.xml test_clean_site'
|
13
|
+
ant '-f solrmarc/build.xml site_setup_test_jetty'
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
data/lib/tasks/spec.rake
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rspec/core/rake_task'
|
2
|
+
|
3
|
+
namespace :sj_wrap do
|
4
|
+
|
5
|
+
desc "Run all specs, with jetty instance running"
|
6
|
+
task :rspec_wrapped => ['sj_wrap:solrmarc:ant_dist_site', 'sj_wrap:jetty:config'] do
|
7
|
+
test_jetty_dir = File.expand_path(File.dirname(__FILE__) + '../../../solrmarc/test/jetty')
|
8
|
+
require 'jettywrapper'
|
9
|
+
jetty_params = Jettywrapper.load_config.merge({
|
10
|
+
:jetty_home => test_jetty_dir,
|
11
|
+
:solr_home => test_jetty_dir + '/solr',
|
12
|
+
:java_opts => "-Dsolr.data.dir=" + test_jetty_dir + "/solr/test/data",
|
13
|
+
:jetty_port => 8985,
|
14
|
+
:startup_wait => 25
|
15
|
+
})
|
16
|
+
error = Jettywrapper.wrap(jetty_params) do
|
17
|
+
Rake::Task['sj_wrap:rspec_plain'].invoke
|
18
|
+
end
|
19
|
+
raise "TEST FAILURES: #{error}" if error
|
20
|
+
end
|
21
|
+
|
22
|
+
RSpec::Core::RakeTask.new(:rspec_plain) do |spec|
|
23
|
+
spec.rspec_opts = ["-c", "-f progress", "-r ./spec/spec_helper.rb"]
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.join(File.dirname(__FILE__), 'lib/solrj_wrapper/version')
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = "solrj_wrapper"
|
6
|
+
gem.version = SolrjWrapper::VERSION
|
7
|
+
gem.authors = ["Naomi Dushay"]
|
8
|
+
gem.email = ["ndushay@stanford.edu"]
|
9
|
+
gem.summary = "Ruby wrapper for interacting with Solrj objects"
|
10
|
+
gem.description = "Ruby wrapper for interacting with Solrj objects, such as org.apache.solr.client.solrj.impl.StreamingUpdateSolrServer"
|
11
|
+
gem.summary = "This gem must be run under JRuby, and also requires a directory containing SolrJ jars and solr url (see config/settings.yml)"
|
12
|
+
|
13
|
+
gem.files = `git ls-files`.split($\)
|
14
|
+
# gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
15
|
+
gem.test_files = gem.files.grep(%r{^(spec|features)/})
|
16
|
+
gem.require_paths = ["lib"]
|
17
|
+
|
18
|
+
# No Runtime dependencies
|
19
|
+
|
20
|
+
# Bundler will install these gems too if you've checked out solrjwrapper source from git and run 'bundle install'
|
21
|
+
# It will not add these as dependencies if you require solrj_wrapper for other projects
|
22
|
+
gem.add_development_dependency "rake"
|
23
|
+
# docs
|
24
|
+
gem.add_development_dependency "rdoc"
|
25
|
+
gem.add_development_dependency "yard"
|
26
|
+
# tests
|
27
|
+
gem.add_development_dependency 'rspec'
|
28
|
+
gem.add_development_dependency 'simplecov'
|
29
|
+
gem.add_development_dependency 'simplecov-rcov'
|
30
|
+
gem.add_development_dependency "jettywrapper"
|
31
|
+
|
32
|
+
end
|
data/spec/solr/solr.xml
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
2
|
+
<!--
|
3
|
+
All (relative) paths are relative to the installation path
|
4
|
+
persistent: Save changes made via the API to this file
|
5
|
+
sharedLib: path to a lib directory that will be shared across all cores
|
6
|
+
-->
|
7
|
+
<solr persistent="false" sharedLib="lib">
|
8
|
+
<cores adminPath="/admin/cores" shareSchema="true">
|
9
|
+
<core name="dev" instanceDir="dev" />
|
10
|
+
<core name="test" instanceDir="test" />
|
11
|
+
</cores>
|
12
|
+
</solr>
|
@@ -0,0 +1,188 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
require 'solrj_wrapper'
|
3
|
+
|
4
|
+
describe SolrjWrapper do
|
5
|
+
|
6
|
+
before(:all) do
|
7
|
+
@solrj_wrapper = SolrjWrapper.new(@@settings.solrj_jar_dir, @@settings.solr_url, @@settings.solrj_queue_size, @@settings.solrj_num_threads, @@settings.log_level, @@settings.log_file)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should initialize a query_server object" do
|
11
|
+
@solrj_wrapper.query_server.should be_an_instance_of(Java::OrgApacheSolrClientSolrjImpl::CommonsHttpSolrServer)
|
12
|
+
end
|
13
|
+
|
14
|
+
context "get_query_result_docs" do
|
15
|
+
it "should return a SolrDocumentList object" do
|
16
|
+
q = org.apache.solr.client.solrj.SolrQuery.new
|
17
|
+
@solrj_wrapper.get_query_result_docs(q).should be_an_instance_of(Java::OrgApacheSolrCommon::SolrDocumentList)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should return an object of size 0 when there are no hits" do
|
21
|
+
q = org.apache.solr.client.solrj.SolrQuery.new
|
22
|
+
q.setQuery("zzzzzznohitszzzzzzzz")
|
23
|
+
@solrj_wrapper.get_query_result_docs(q).size.should == 0
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should return an object of size 0 when rows = 0" do
|
27
|
+
q = org.apache.solr.client.solrj.SolrQuery.new
|
28
|
+
q.setRows(0)
|
29
|
+
@solrj_wrapper.get_query_result_docs(q).size.should == 0
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should return an object of size > 1 when there are hits and rows is > 0" do
|
33
|
+
sid = Java::OrgApacheSolrCommon::SolrInputDocument.new
|
34
|
+
@solrj_wrapper.add_val_to_fld(sid, "id", "test_rec")
|
35
|
+
@solrj_wrapper.add_doc_to_ix(sid, "test_rec")
|
36
|
+
@solrj_wrapper.commit
|
37
|
+
q = org.apache.solr.client.solrj.SolrQuery.new
|
38
|
+
@solrj_wrapper.get_query_result_docs(q).size.should_not == 0
|
39
|
+
@solrj_wrapper.empty_ix
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should initialize a streaming_update_server object" do
|
44
|
+
@solrj_wrapper.streaming_update_server.should be_an_instance_of(Java::OrgApacheSolrClientSolrjImpl::StreamingUpdateSolrServer)
|
45
|
+
end
|
46
|
+
|
47
|
+
context "add_vals_to_fld" do
|
48
|
+
it "should do nothing if the field name or value is nil or of size 0" do
|
49
|
+
sid = Java::OrgApacheSolrCommon::SolrInputDocument.new
|
50
|
+
@solrj_wrapper.add_vals_to_fld(sid, nil, ["val"])
|
51
|
+
sid.isEmpty.should be_true
|
52
|
+
@solrj_wrapper.add_vals_to_fld(sid, "", ["val"])
|
53
|
+
sid.isEmpty.should be_true
|
54
|
+
@solrj_wrapper.add_vals_to_fld(sid, "fldname", nil)
|
55
|
+
sid.isEmpty.should be_true
|
56
|
+
@solrj_wrapper.add_vals_to_fld(sid, "fldname", [])
|
57
|
+
sid.isEmpty.should be_true
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should create a new field when none exists" do
|
61
|
+
sid = Java::OrgApacheSolrCommon::SolrInputDocument.new
|
62
|
+
@solrj_wrapper.add_vals_to_fld(sid, "single", ["val"])
|
63
|
+
vals = sid["single"].getValues
|
64
|
+
vals.size.should == 1
|
65
|
+
vals[0].should == "val"
|
66
|
+
@solrj_wrapper.add_vals_to_fld(sid, "mult", ["val1", "val2"])
|
67
|
+
vals = sid["mult"].getValues
|
68
|
+
vals.size.should == 2
|
69
|
+
vals[0].should == "val1"
|
70
|
+
vals[1].should == "val2"
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should keep the existing values when it adds a value to a field" do
|
74
|
+
sid = Java::OrgApacheSolrCommon::SolrInputDocument.new
|
75
|
+
@solrj_wrapper.add_vals_to_fld(sid, "fld", ["val"])
|
76
|
+
vals = sid["fld"].getValues
|
77
|
+
vals.size.should == 1
|
78
|
+
vals[0].should == "val"
|
79
|
+
@solrj_wrapper.add_vals_to_fld(sid, "fld", ["val1", "val2"])
|
80
|
+
vals = sid["fld"].getValues
|
81
|
+
vals.size.should == 3
|
82
|
+
vals.contains("val").should_not be_nil
|
83
|
+
vals.contains("val1").should_not be_nil
|
84
|
+
vals.contains("val2").should_not be_nil
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should add all values, except those already present" do
|
88
|
+
sid = Java::OrgApacheSolrCommon::SolrInputDocument.new
|
89
|
+
@solrj_wrapper.add_vals_to_fld(sid, "fld", ["val"])
|
90
|
+
vals = sid["fld"].getValues
|
91
|
+
vals.size.should == 1
|
92
|
+
vals[0].should == "val"
|
93
|
+
@solrj_wrapper.add_vals_to_fld(sid, "fld", ["val1", "val2", "val"])
|
94
|
+
vals = sid["fld"].getValues
|
95
|
+
vals.size.should == 3
|
96
|
+
vals.contains("val").should_not be_nil
|
97
|
+
vals.contains("val1").should_not be_nil
|
98
|
+
vals.contains("val2").should_not be_nil
|
99
|
+
end
|
100
|
+
end # context add_vals_to_fld
|
101
|
+
|
102
|
+
context "add_val_to_fld" do
|
103
|
+
it "should do nothing if the field name or value is nil or of size 0" do
|
104
|
+
sid = Java::OrgApacheSolrCommon::SolrInputDocument.new
|
105
|
+
@solrj_wrapper.add_val_to_fld(sid, nil, "val")
|
106
|
+
sid.isEmpty.should be_true
|
107
|
+
@solrj_wrapper.add_val_to_fld(sid, "", "val")
|
108
|
+
sid.isEmpty.should be_true
|
109
|
+
@solrj_wrapper.add_val_to_fld(sid, "fldname", nil)
|
110
|
+
sid.isEmpty.should be_true
|
111
|
+
@solrj_wrapper.add_val_to_fld(sid, "fldname", [])
|
112
|
+
sid.isEmpty.should be_true
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should create a new field when none exists" do
|
116
|
+
sid = Java::OrgApacheSolrCommon::SolrInputDocument.new
|
117
|
+
@solrj_wrapper.add_val_to_fld(sid, "single", "val")
|
118
|
+
vals = sid["single"].getValues
|
119
|
+
vals.size.should == 1
|
120
|
+
vals[0].should == "val"
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should keep the existing values when it adds a value to a field" do
|
124
|
+
sid = Java::OrgApacheSolrCommon::SolrInputDocument.new
|
125
|
+
@solrj_wrapper.add_vals_to_fld(sid, "fld", ["val1", "val2"])
|
126
|
+
@solrj_wrapper.add_val_to_fld(sid, "fld", "val")
|
127
|
+
vals = sid["fld"].getValues
|
128
|
+
vals.size.should == 3
|
129
|
+
vals.contains("val").should_not be_nil
|
130
|
+
vals.contains("val1").should_not be_nil
|
131
|
+
vals.contains("val2").should_not be_nil
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should add all values, except those already present" do
|
135
|
+
sid = Java::OrgApacheSolrCommon::SolrInputDocument.new
|
136
|
+
@solrj_wrapper.add_vals_to_fld(sid, "fld", ["val1", "val2", "val"])
|
137
|
+
@solrj_wrapper.add_val_to_fld(sid, "fld", "val")
|
138
|
+
vals = sid["fld"].getValues
|
139
|
+
vals.size.should == 3
|
140
|
+
vals.contains("val").should_not be_nil
|
141
|
+
vals.contains("val1").should_not be_nil
|
142
|
+
vals.contains("val2").should_not be_nil
|
143
|
+
end
|
144
|
+
end # context add_vals_to_fld
|
145
|
+
|
146
|
+
context "replace_field_values" do
|
147
|
+
it "should work for disjoint sets of field values" do
|
148
|
+
sid = Java::OrgApacheSolrCommon::SolrInputDocument.new
|
149
|
+
@solrj_wrapper.add_vals_to_fld(sid, "fld", ["val1", "val2", "val3"])
|
150
|
+
@solrj_wrapper.replace_field_values(sid, "fld", ["val4", "val5"])
|
151
|
+
vals = sid["fld"].getValues
|
152
|
+
vals.size.should == 2
|
153
|
+
vals.contains("val1").should be_false
|
154
|
+
vals.contains("val2").should be_false
|
155
|
+
vals.contains("val3").should be_false
|
156
|
+
vals.contains("val4").should be_true
|
157
|
+
vals.contains("val5").should be_true
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should retain unchanged values" do
|
161
|
+
sid = Java::OrgApacheSolrCommon::SolrInputDocument.new
|
162
|
+
@solrj_wrapper.add_vals_to_fld(sid, "fld", ["val1", "val2"])
|
163
|
+
@solrj_wrapper.replace_field_values(sid, "fld", ["val2", "val3"])
|
164
|
+
vals = sid["fld"].getValues
|
165
|
+
vals.size.should == 2
|
166
|
+
vals.contains("val1").should be_false
|
167
|
+
vals.contains("val2").should be_true
|
168
|
+
vals.contains("val3").should be_true
|
169
|
+
end
|
170
|
+
|
171
|
+
it "should create a field when none existed before" do
|
172
|
+
sid = Java::OrgApacheSolrCommon::SolrInputDocument.new
|
173
|
+
sid["fld"].should be_nil
|
174
|
+
@solrj_wrapper.replace_field_values(sid, "fld", ["val1"])
|
175
|
+
vals = sid["fld"].getValues
|
176
|
+
vals.size.should == 1
|
177
|
+
vals.contains("val1").should be_true
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should remove a field if there are no values to add" do
|
181
|
+
sid = Java::OrgApacheSolrCommon::SolrInputDocument.new
|
182
|
+
@solrj_wrapper.add_vals_to_fld(sid, "fld", ["val1", "val2"])
|
183
|
+
@solrj_wrapper.replace_field_values(sid, "fld", [])
|
184
|
+
sid["fld"].should be_nil
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# for test coverage
|
2
|
+
require 'simplecov'
|
3
|
+
require 'simplecov-rcov'
|
4
|
+
class SimpleCov::Formatter::MergedFormatter
|
5
|
+
def format(result)
|
6
|
+
SimpleCov::Formatter::HTMLFormatter.new.format(result)
|
7
|
+
SimpleCov::Formatter::RcovFormatter.new.format(result)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
SimpleCov.formatter = SimpleCov::Formatter::MergedFormatter
|
11
|
+
SimpleCov.start do
|
12
|
+
add_filter "/spec/"
|
13
|
+
add_filter "/lib/config/"
|
14
|
+
end
|
15
|
+
|
16
|
+
require 'solrj_wrapper/settings'
|
17
|
+
|
18
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
19
|
+
|
20
|
+
RSpec.configure do |config|
|
21
|
+
# Set up the environment for testing and make all variables available to the specs
|
22
|
+
settings_env = ENV["SETTINGS"] ||= 'dev'
|
23
|
+
@@settings = Settings.new(settings_env)
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,153 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: solrj_wrapper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.1
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Naomi Dushay
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-04-18 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
version_requirements: &3808 !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ! '>='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
none: false
|
22
|
+
requirement: *3808
|
23
|
+
prerelease: false
|
24
|
+
type: :development
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rdoc
|
27
|
+
version_requirements: &3826 !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ! '>='
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: '0'
|
32
|
+
none: false
|
33
|
+
requirement: *3826
|
34
|
+
prerelease: false
|
35
|
+
type: :development
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: yard
|
38
|
+
version_requirements: &3842 !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ! '>='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
none: false
|
44
|
+
requirement: *3842
|
45
|
+
prerelease: false
|
46
|
+
type: :development
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rspec
|
49
|
+
version_requirements: &3858 !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
none: false
|
55
|
+
requirement: *3858
|
56
|
+
prerelease: false
|
57
|
+
type: :development
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: simplecov
|
60
|
+
version_requirements: &3874 !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
none: false
|
66
|
+
requirement: *3874
|
67
|
+
prerelease: false
|
68
|
+
type: :development
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov-rcov
|
71
|
+
version_requirements: &3890 !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
none: false
|
77
|
+
requirement: *3890
|
78
|
+
prerelease: false
|
79
|
+
type: :development
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: jettywrapper
|
82
|
+
version_requirements: &3906 !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
none: false
|
88
|
+
requirement: *3906
|
89
|
+
prerelease: false
|
90
|
+
type: :development
|
91
|
+
description: Ruby wrapper for interacting with Solrj objects, such as org.apache.solr.client.solrj.impl.StreamingUpdateSolrServer
|
92
|
+
email:
|
93
|
+
- ndushay@stanford.edu
|
94
|
+
executables: []
|
95
|
+
extensions: []
|
96
|
+
extra_rdoc_files: []
|
97
|
+
files:
|
98
|
+
- .gitignore
|
99
|
+
- .gitmodules
|
100
|
+
- .rvmrc
|
101
|
+
- Gemfile
|
102
|
+
- LICENSE
|
103
|
+
- README.rdoc
|
104
|
+
- Rakefile
|
105
|
+
- lib/config/settings.yml
|
106
|
+
- lib/solrj_wrapper.rb
|
107
|
+
- lib/solrj_wrapper/settings.rb
|
108
|
+
- lib/solrj_wrapper/version.rb
|
109
|
+
- lib/tasks/ci.rake
|
110
|
+
- lib/tasks/doc.rake
|
111
|
+
- lib/tasks/jetty.rake
|
112
|
+
- lib/tasks/solrmarc.rake
|
113
|
+
- lib/tasks/spec.rake
|
114
|
+
- solrj_wrapper.gemspec
|
115
|
+
- spec/solr/solr.xml
|
116
|
+
- spec/solrj_wrapper_spec.rb
|
117
|
+
- spec/spec_helper.rb
|
118
|
+
homepage:
|
119
|
+
licenses: []
|
120
|
+
post_install_message:
|
121
|
+
rdoc_options: []
|
122
|
+
require_paths:
|
123
|
+
- lib
|
124
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
125
|
+
requirements:
|
126
|
+
- - ! '>='
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
segments:
|
129
|
+
- 0
|
130
|
+
hash: 2
|
131
|
+
version: '0'
|
132
|
+
none: false
|
133
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ! '>='
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
segments:
|
138
|
+
- 0
|
139
|
+
hash: 2
|
140
|
+
version: '0'
|
141
|
+
none: false
|
142
|
+
requirements: []
|
143
|
+
rubyforge_project:
|
144
|
+
rubygems_version: 1.8.15
|
145
|
+
signing_key:
|
146
|
+
specification_version: 3
|
147
|
+
summary: This gem must be run under JRuby, and also requires a directory containing SolrJ jars and solr url (see config/settings.yml)
|
148
|
+
test_files:
|
149
|
+
- spec/solr/solr.xml
|
150
|
+
- spec/solrj_wrapper_spec.rb
|
151
|
+
- spec/spec_helper.rb
|
152
|
+
has_rdoc:
|
153
|
+
...
|