simple_solr_client 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,20 +6,20 @@ describe SimpleSolrClient::Client do
6
6
  @client = TestClient.instance.client
7
7
  end
8
8
  it "creates a new object" do
9
- @client.base_url.must_equal 'http://localhost:8983/solr'
9
+ @client.base_url.must_equal ENV['TEST_SOLR_URL']
10
10
  end
11
11
 
12
12
  it "strips off a trailing slash for base_url" do
13
- c = SimpleSolrClient::Client.new('http://localhost:8983/solr/')
14
- c.base_url.must_equal 'http://localhost:8983/solr'
13
+ c = SimpleSolrClient::Client.new( ENV['TEST_SOLR_URL'])
14
+ c.base_url.must_equal ENV['TEST_SOLR_URL']
15
15
  end
16
16
 
17
17
  it "constructs a url with no args" do
18
- @client.url.must_equal 'http://localhost:8983/solr'
18
+ @client.url.must_equal ENV['TEST_SOLR_URL']
19
19
  end
20
20
 
21
21
  it "constructs a URL with args" do
22
- @client.url('admin', 'ping').must_equal 'http://localhost:8983/solr/admin/ping'
22
+ @client.url('admin', 'ping').must_equal "#{ENV['TEST_SOLR_URL']}/admin/ping"
23
23
  end
24
24
 
25
25
 
@@ -0,0 +1,21 @@
1
+ require 'minitest_helper'
2
+
3
+ describe SimpleSolrClient::Core do
4
+
5
+ before do
6
+ @core = TempCore.instance.core('core_basics')
7
+ end
8
+ it "creates a new object" do
9
+ @core.base_url.must_equal ENV['TEST_SOLR_URL']
10
+ end
11
+
12
+ it "constructs a url with no args" do
13
+ @core.url.must_equal "#{ENV['TEST_SOLR_URL']}/#{@core.name}"
14
+ end
15
+
16
+ it "constructs a URL with args" do
17
+ @core.url('admin', 'ping').must_equal "#{ENV['TEST_SOLR_URL']}/#{@core.name}/admin/ping"
18
+ end
19
+
20
+
21
+ end
@@ -1,21 +1,24 @@
1
1
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
2
  require 'simple_solr_client'
3
+
4
+
3
5
  require 'minitest/spec'
4
6
  require 'minitest/autorun'
5
7
  require "minitest/reporters"
8
+
6
9
  Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
7
10
 
8
11
  require 'singleton'
9
12
 
10
13
  ENV['TEST_SOLR_URL'] ||= 'http://localhost:8983/solr'
11
- ENV['TEST_SOLR_CORE_NAME'] ||= 'core1'
14
+ #ENV['TEST_SOLR_CORE_NAME'] ||= 'core1'
12
15
 
13
16
  class TestClient
14
17
  include Singleton
15
- attr_reader :client, :core
18
+ attr_reader :client #, :core
16
19
  def initialize
17
20
  @client = SimpleSolrClient::Client.new ENV['TEST_SOLR_URL']
18
- @core = @client.core ENV['TEST_SOLR_CORE_NAME'] || 'simple_solr_test'
21
+ # @core = @client.core ENV['TEST_SOLR_CORE_NAME'] || 'simple_solr_test'
19
22
  end
20
23
  end
21
24
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_solr_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bill Dueber
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-27 00:00:00.000000000 Z
11
+ date: 2019-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httpclient
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: nokogiri
28
+ name: pry
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -42,32 +42,18 @@ dependencies:
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.7'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.7'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '10.0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '10.0'
69
- - !ruby/object:Gem::Dependency
70
- name: minitest
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - ">="
@@ -81,7 +67,7 @@ dependencies:
81
67
  - !ruby/object:Gem::Version
82
68
  version: '0'
83
69
  - !ruby/object:Gem::Dependency
84
- name: minitest-reporters
70
+ name: minitest
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
73
  - - ">="
@@ -95,13 +81,13 @@ dependencies:
95
81
  - !ruby/object:Gem::Version
96
82
  version: '0'
97
83
  - !ruby/object:Gem::Dependency
98
- name: pry
84
+ name: minitest-reporters
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
87
  - - ">="
102
88
  - !ruby/object:Gem::Version
103
89
  version: '0'
104
- type: :runtime
90
+ type: :development
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
@@ -134,14 +120,6 @@ files:
134
120
  - lib/simple_solr_client/response/document.rb
135
121
  - lib/simple_solr_client/response/generic_response.rb
136
122
  - lib/simple_solr_client/response/query_response.rb
137
- - lib/simple_solr_client/schema.rb
138
- - lib/simple_solr_client/schema/analysis.rb
139
- - lib/simple_solr_client/schema/copyfield.rb
140
- - lib/simple_solr_client/schema/dynamic_field.rb
141
- - lib/simple_solr_client/schema/field.rb
142
- - lib/simple_solr_client/schema/field_or_type.rb
143
- - lib/simple_solr_client/schema/field_type.rb
144
- - lib/simple_solr_client/schema/matcher.rb
145
123
  - lib/simple_solr_client/version.rb
146
124
  - simple_solr_client.gemspec
147
125
  - solr_sample_core/conf/_schema_analysis_stopwords_english.json
@@ -248,11 +226,10 @@ files:
248
226
  - solr_sample_core/conf/xslt/updateXml.xsl
249
227
  - spec/client_basics_spec.rb
250
228
  - spec/connect_spec.rb
251
- - spec/core_basics.rb
229
+ - spec/core_basics_spec.rb
252
230
  - spec/index_spec.rb
253
231
  - spec/load_spec.rb
254
232
  - spec/minitest_helper.rb
255
- - spec/schema_spec.rb
256
233
  homepage: https://github.com/billdueber/simple_solr
257
234
  licenses:
258
235
  - MIT
@@ -272,16 +249,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
272
249
  - !ruby/object:Gem::Version
273
250
  version: '0'
274
251
  requirements: []
275
- rubyforge_project:
276
- rubygems_version: 2.6.13
252
+ rubygems_version: 3.0.1
277
253
  signing_key:
278
254
  specification_version: 4
279
255
  summary: Interact with a Solr API via JSON
280
256
  test_files:
281
257
  - spec/client_basics_spec.rb
282
258
  - spec/connect_spec.rb
283
- - spec/core_basics.rb
259
+ - spec/core_basics_spec.rb
284
260
  - spec/index_spec.rb
285
261
  - spec/load_spec.rb
286
262
  - spec/minitest_helper.rb
287
- - spec/schema_spec.rb
@@ -1,217 +0,0 @@
1
- require 'nokogiri'
2
-
3
- require 'simple_solr_client/schema/matcher'
4
- require 'simple_solr_client/schema/copyfield'
5
- require 'simple_solr_client/schema/field'
6
- require 'simple_solr_client/schema/dynamic_field'
7
- require 'simple_solr_client/schema/field_type'
8
-
9
- class SimpleSolrClient::Schema
10
- # A simplistic representation of a schema
11
-
12
-
13
- def initialize(core)
14
- @core = core
15
- @fields = {}
16
- @dynamic_fields = {}
17
- @copy_fields = Hash.new { |h, k| h[k] = [] }
18
- @field_types = {}
19
- self.load
20
- end
21
-
22
-
23
- def fields
24
- @fields.values.map { |x| x.resolve_type(self) }
25
- end
26
-
27
- def field(n)
28
- @fields[n].resolve_type(self)
29
- end
30
-
31
- def dynamic_fields
32
- @dynamic_fields.values.map { |x| x.resolve_type(self) }
33
- end
34
-
35
- def dynamic_field(n)
36
- @dynamic_fields[n].resolve_type(self)
37
- end
38
-
39
- def copy_fields_for(n)
40
- @copy_fields[n]
41
- end
42
-
43
- def copy_fields
44
- @copy_fields.values.flatten
45
- end
46
-
47
- def add_field(f)
48
- @fields[f.name] = f
49
- field(f.name)
50
- end
51
-
52
- def drop_field(str)
53
- @fields.delete(str)
54
- self
55
- end
56
-
57
-
58
- def field_types
59
- @field_types.values
60
- end
61
-
62
- def field_type(k)
63
- @field_types[k]
64
- end
65
-
66
-
67
- # When we add dynamic fields, we need to keep them sorted by
68
- # length of the key, since that's how they match
69
- def add_dynamic_field(f)
70
- raise "Dynamic field should be dynamic and have a '*' in it somewhere; '#{f.name}' does not" unless f.name =~ /\*/
71
- @dynamic_fields[f.name] = f
72
-
73
- @dynamic_fields = @dynamic_fields.sort { |a, b| b[0].size <=> a[0].size }.to_h
74
-
75
- end
76
-
77
- def drop_dynamic_field(str)
78
- @dynamic_fields.delete(str)
79
- self
80
- end
81
-
82
- def add_copy_field(f)
83
- cf = @copy_fields[f.source]
84
- cf << f
85
- end
86
-
87
- def drop_copy_field(str)
88
- @copy_fields.delete(str)
89
- self
90
- end
91
-
92
- def add_field_type(ft)
93
- ft.core = @core
94
- @field_types[ft.name] = ft
95
- end
96
-
97
- def drop_field_type(str)
98
- @field_types.delete(str)
99
- self
100
- end
101
-
102
-
103
- # For loading, we get the information about the fields via the API,
104
- def load
105
- load_explicit_fields
106
- load_dynamic_fields
107
- load_copy_fields
108
- load_field_types
109
- end
110
-
111
-
112
- def load_explicit_fields
113
- @fields = {}
114
- @core.get('schema/fields')['fields'].each do |field_hash|
115
- add_field(Field.new_from_solr_hash(field_hash))
116
- end
117
- end
118
-
119
- def load_dynamic_fields
120
- @dynamic_fields = {}
121
- @core.get('schema/dynamicfields')['dynamicFields'].each do |field_hash|
122
- f = DynamicField.new_from_solr_hash(field_hash)
123
- if @dynamic_fields[f.name]
124
- raise "Dynamic field '#{f.name}' defined more than once"
125
- end
126
- add_dynamic_field(f)
127
- end
128
- end
129
-
130
- def load_copy_fields
131
- @copy_fields = Hash.new { |h, k| h[k] = [] }
132
- @core.get('schema/copyfields')['copyFields'].each do |cfield_hash|
133
- add_copy_field(CopyField.new(cfield_hash['source'], cfield_hash['dest']))
134
- end
135
- end
136
-
137
- def load_field_types
138
- @field_types = {}
139
- @core.get('schema/fieldtypes')['fieldTypes'].each do |fthash|
140
- ft = FieldType.new_from_solr_hash(fthash)
141
- add_field_type(ft)
142
- end
143
- end
144
-
145
- def reload
146
- @core.reload
147
- end
148
-
149
-
150
- # Figuring out which fields are actually produced can be hard:
151
- # * If a non-dynamic field name matches, no dynamic_fields will match
152
- # * The result of a copyField may match another dynamicField, but the
153
- # result of *that* will not match more copyFields
154
- # * dynamicFields are matched longest to shortest
155
- #
156
- # Suppose I have the following:
157
- # dynamic *_ts => string
158
- # dynamic *_t => string
159
- # dynamic *_s => string
160
- # dynamic *_ddd => string
161
- #
162
- # copy *_ts => *_t
163
- # copy *_ts => *_s
164
- # copy *_s => *_ddd
165
- #
166
- # You might expect:
167
- # name_ts => string
168
- # name_ts copied to name_t => string
169
- # name_ts copied to name_s => string
170
- # name_s copied to name_ddd => string
171
- #
172
- # ...giving us name_ts, name_t, name_s, and name_ddd
173
- #
174
- # What you'll find is that we don't get name_ddd, since
175
- # name_s was generated by a wildcard-enabled copyField
176
- # and that's where things stop.
177
- #
178
- # However, if you explicitly add a field called
179
- # name_s, it *will* get copied to name_ddd.
180
- #
181
- # Yeah. It's confusing.
182
-
183
-
184
- def first_matching_field(str)
185
- f = fields.find { |x| x.matches str } or first_matching_dfield(str)
186
- end
187
-
188
- def first_matching_dfield(str)
189
- df = dynamic_fields.find { |x| x.matches str }
190
- if df
191
- f = Field.new(df.to_h)
192
- f[:name] = df.dynamic_name str
193
- end
194
- f
195
-
196
- end
197
-
198
- def resulting_fields(str)
199
- rv = []
200
- f = first_matching_field(str)
201
- rv << f
202
- copy_fields.each do |cf|
203
- if cf.matches(f.name)
204
- dname = cf.dynamic_name(f.name)
205
- fmf = Field.new(first_matching_field(dname).to_h)
206
- fmf[:name] = dname
207
- rv << fmf
208
- end
209
- end
210
- rv.uniq
211
- end
212
-
213
- end
214
-
215
-
216
-
217
-
@@ -1,79 +0,0 @@
1
- # Figure out how the field type will parse out tokens
2
- # and change them in the analysis chain. Just calls the
3
- # provided solr analysis endpoints
4
- #
5
- # To be mixed into FieldType
6
-
7
- class SimpleSolrClient::Schema
8
-
9
- class InvalidTokenError < RuntimeError
10
- attr_accessor :resp
11
-
12
-
13
- def initialize(msg, resp)
14
- super(msg)
15
- @resp = resp
16
- end
17
- end
18
-
19
- module Analysis
20
-
21
- #https://lucene.apache.org/solr/4_1_0/solr-core/org/apache/solr/handler/FieldAnalysisRequestHandler.html
22
- def fieldtype_tokens(val, type)
23
- target = 'analysis/field'
24
- h = {'analysis.fieldtype' => name,
25
- 'analysis.fieldvalue' => val,
26
- 'analysis.query' => val,
27
- }
28
- resp = @core.get(target, h)
29
-
30
- ftdata = resp['analysis']['field_types'][name][type]
31
- rv = []
32
- ftdata.last.each do |t|
33
- pos = t['position'] - 1
34
- text = t['text']
35
- if rv[pos]
36
- rv[pos] = Array[rv[pos]] << text
37
- else
38
- rv[pos] = text
39
- end
40
- end
41
- rv
42
- end
43
-
44
-
45
- private :fieldtype_tokens
46
-
47
- # Get an array of tokens as analyzed/transformed at index time
48
- # Note that you may have multiple values at each token position if
49
- # you use a synonym filter or a stemmer
50
- # @param [String] ft the name of the fieldType (*not* the field)
51
- # @param [String] val the search string to parse
52
- # @return [Array] An array of tokens as produced by that index analysis chain
53
- #
54
- # @example Results when there's a stemmer
55
- # c.fieldtype_index_tokens 'text', "That's Life"
56
- # => [["that's", "that"], "life"]
57
- #
58
- def index_tokens(val)
59
- fieldtype_tokens(val, 'index')
60
- end
61
-
62
-
63
- def index_input_valid?(val)
64
- index_tokens(val)
65
- rescue SimpleSolrClient::Schema::InvalidTokenError, RuntimeError => e
66
- puts "IN HERE"
67
- require 'pry'; binding.pry
68
- end
69
-
70
-
71
- # Get an array of tokens as analyzed/transformed at query time
72
- # See #fieldtype_index_tokens
73
- def query_tokens(val)
74
- fieldtype_tokens(val, 'query')
75
- end
76
-
77
-
78
- end
79
- end