solr4r 0.2.0 → 0.3.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: 9ced727a63a4c77e523f0ba3e3ba2f963969af13
4
- data.tar.gz: 652f439816c4998089d16f715ad9cf5838d564a2
3
+ metadata.gz: 7622780508966d197a2ea3101266d7aa886102c1
4
+ data.tar.gz: 6082b84092d225e23467b28b90a780c5c8d00b01
5
5
  SHA512:
6
- metadata.gz: 52668f7763f45cb4d3ff9f1fb6369e17877109bfc3d5b5a59c786d05299441b39d21960b8b6d4c5f68c4c29b8d641d5cd790b0118e83de952583862d6737f9a7
7
- data.tar.gz: 6a034823bc56d31121bdf52b96564f8fb65dee4a9e7d9ad458093247788315924c3b07f73d21371e414f84840a46edd6a23304d4bdfe62595e9fd8c71a41fa0f
6
+ metadata.gz: 27012fe1c76d4dd9d52599c41375ae71bde7929548a84dc781a48d8dd27f508709c0a1a5c55007cd11da7a2fb1ce2a79d2e5223d9d74024444cd37277becf399
7
+ data.tar.gz: 004c2706c97fd115fe2300ea265c353ac2aca0b878eea57af8ea14a6aae23523bb744bdb8e97d6416fe21568ab7d1238532bc8e50ff7ef509a7f72e7fe7a4045
data/ChangeLog CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  = Revision history for solr4r
4
4
 
5
+ == 0.3.0 [2016-03-23]
6
+
7
+ * Extended Solr4R::Result for
8
+ debugging[https://wiki.apache.org/solr/CommonQueryParameters#Debugging].
9
+ * Extended Solr4R::Result for
10
+ highlighting[https://wiki.apache.org/solr/HighlightingParameters].
11
+ * Extended Solr4R::Result for
12
+ spellchecking[https://wiki.apache.org/solr/SpellCheckComponent].
13
+ * Added support for date-/time objects and ranges.
14
+ * Refactored Solr4R::Client, Solr4R::Builder, Solr4R::Document,
15
+ Solr4R::Result.
16
+
5
17
  == 0.2.0 [2015-12-14]
6
18
 
7
19
  * Updated Solr4R::Client::Query#more_like_this_q for Solr 5.4.0.
data/README CHANGED
@@ -2,12 +2,12 @@
2
2
 
3
3
  == VERSION
4
4
 
5
- This documentation refers to solr4r version 0.2.0
5
+ This documentation refers to solr4r version 0.3.0
6
6
 
7
7
 
8
8
  == DESCRIPTION
9
9
 
10
- TODO
10
+ Access the {Apache Solr}[http://lucene.apache.org/solr/] search server from Ruby.
11
11
 
12
12
 
13
13
  == LINKS
@@ -25,7 +25,7 @@ Travis CI:: https://travis-ci.org/blackwinter/solr4r
25
25
 
26
26
  == LICENSE AND COPYRIGHT
27
27
 
28
- Copyright (C) 2014-2015 Jens Wille
28
+ Copyright (C) 2014-2016 Jens Wille
29
29
 
30
30
  solr4r is free software: you can redistribute it and/or modify it
31
31
  under the terms of the GNU Affero General Public License as published by
data/Rakefile CHANGED
@@ -16,7 +16,7 @@ begin
16
16
 
17
17
  dependencies: { nokogiri: '~> 1.6', 'nuggets' => '~> 1.4' },
18
18
 
19
- development_dependencies: { vcr: '~> 2.9', webmock: '~> 1.22' },
19
+ development_dependencies: { vcr: '~> 3.0', webmock: '~> 1.24' },
20
20
 
21
21
  required_ruby_version: '>= 2.0'
22
22
  }
@@ -0,0 +1,89 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ ###############################################################################
5
+ # #
6
+ # solr4r -- A Ruby client for Apache Solr #
7
+ # #
8
+ # Copyright (C) 2014-2016 Jens Wille #
9
+ # #
10
+ # solr4r is free software: you can redistribute it and/or modify it under the #
11
+ # terms of the GNU Affero General Public License as published by the Free #
12
+ # Software Foundation, either version 3 of the License, or (at your option) #
13
+ # any later version. #
14
+ # #
15
+ # solr4r is distributed in the hope that it will be useful, but WITHOUT ANY #
16
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
17
+ # FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
18
+ # more details. #
19
+ # #
20
+ # You should have received a copy of the GNU Affero General Public License #
21
+ # along with solr4r. If not, see <http://www.gnu.org/licenses/>. #
22
+ # #
23
+ ###############################################################################
24
+ #++
25
+
26
+ module Solr4R
27
+
28
+ class Batch
29
+
30
+ STEP = 10
31
+
32
+ DEFAULT_SIZE = STEP ** 3
33
+
34
+ def initialize(client, attributes = {},
35
+ params = {}, options = {}, size = DEFAULT_SIZE, &block)
36
+ @client, @args, @size, @block =
37
+ client, [attributes, params, options], size, block
38
+
39
+ reset
40
+ end
41
+
42
+ attr_reader :client
43
+
44
+ attr_accessor :size
45
+
46
+ def reset
47
+ @batch, @failed = [], []
48
+ end
49
+
50
+ def clear
51
+ @batch.clear
52
+ end
53
+
54
+ def add(*docs)
55
+ batch(docs)
56
+ end
57
+
58
+ alias_method :<<, :add
59
+
60
+ def batch(docs)
61
+ flush unless @batch.concat(docs).size < size
62
+ end
63
+
64
+ def flush
65
+ process
66
+ clear
67
+ @failed
68
+ end
69
+
70
+ def inspect
71
+ '#<%s:0x%x @size=%p, @count=%p, @failed=%p>' % [
72
+ self.class, object_id, size, @batch.size, @failed.size
73
+ ]
74
+ end
75
+
76
+ private
77
+
78
+ def process(docs = @batch, size = size())
79
+ next_size = size.fdiv(STEP).ceil
80
+
81
+ docs.each_slice(size) { |batch|
82
+ client.add(batch, *@args, &@block).success? ? nil :
83
+ size > 1 ? process(batch, next_size) : @failed.concat(batch)
84
+ }
85
+ end
86
+
87
+ end
88
+
89
+ end
@@ -5,7 +5,7 @@
5
5
  # #
6
6
  # solr4r -- A Ruby client for Apache Solr #
7
7
  # #
8
- # Copyright (C) 2014-2015 Jens Wille #
8
+ # Copyright (C) 2014-2016 Jens Wille #
9
9
  # #
10
10
  # solr4r is free software: you can redistribute it and/or modify it under the #
11
11
  # terms of the GNU Affero General Public License as published by the Free #
@@ -24,6 +24,7 @@
24
24
  #++
25
25
 
26
26
  require 'nokogiri'
27
+ require 'time'
27
28
 
28
29
  module Solr4R
29
30
 
@@ -43,95 +44,129 @@ module Solr4R
43
44
 
44
45
  ILLEGAL_CHAR_RE = /[\x00-\x08\x0B\x0C\x0E-\x1F]/
45
46
 
46
- def initialize(client, options = client.options)
47
+ class << self
48
+
49
+ def convert_value(value)
50
+ case value
51
+ when Time then value.getutc.xmlschema
52
+ when DateTime then convert_value(value.to_time)
53
+ when Date then convert_value(value.to_datetime)
54
+ else value
55
+ end
56
+ end
57
+
58
+ end
59
+
60
+ def initialize(client = Client, options = nil)
47
61
  raise ArgumentError,
48
62
  'block argument not supported, use options hash instead' if block_given?
49
63
 
50
64
  @client = client
51
65
 
52
- @solr4r_opt = DEFAULT_OPTIONS.merge(options)
53
- @solr4r_doc = Document.new; d = @solr4r_doc.document
66
+ @solr4r_doc = doc = Document.new
67
+ @solr4r_opt = opt = DEFAULT_OPTIONS.dup
68
+
69
+ options ||= client.respond_to?(:options) ? client.options : {}
70
+ options.each { |k, v| opt[k.to_sym] = v if doc.respond_to?("#{k}=") }
54
71
 
55
- super(@solr4r_opt.delete_if { |k,| !d.respond_to?("#{k}=") }, @solr4r_doc)
72
+ super(@solr4r_opt, @solr4r_doc)
56
73
  end
57
74
 
58
75
  attr_reader :client
59
76
 
60
- # See Schema[http://wiki.apache.org/solr/UpdateXmlMessages#add.2Freplace_documents].
77
+ # See Schema[https://wiki.apache.org/solr/UpdateXmlMessages#add.2Freplace_documents].
61
78
  #
62
- # Examples:
79
+ # ==== Examples:
80
+ #
81
+ # ===== Single document
63
82
  #
64
- # # single document
65
83
  # add(employeeId: '05991', office: 'Bridgewater', skills: %w[Perl Java])
66
84
  #
67
- # <?xml version="1.0" encoding="UTF-8"?>
68
- # <add>
69
- # <doc>
70
- # <field name="employeeId">05991</field>
71
- # <field name="office">Bridgewater</field>
72
- # <field name="skills">Perl</field>
73
- # <field name="skills">Java</field>
74
- # </doc>
75
- # </add>
76
- #
77
- # # multiple documents
85
+ # Result:
86
+ #
87
+ # <?xml version="1.0" encoding="UTF-8"?>
88
+ # <add>
89
+ # <doc>
90
+ # <field name="employeeId">05991</field>
91
+ # <field name="office">Bridgewater</field>
92
+ # <field name="skills">Perl</field>
93
+ # <field name="skills">Java</field>
94
+ # </doc>
95
+ # </add>
96
+ #
97
+ # ===== Multiple documents
98
+ #
78
99
  # add([{ employeeId: '05992', office: 'Blackwater' }, { employeeId: '05993', skills: 'Ruby' }])
79
100
  #
80
- # <?xml version="1.0" encoding="UTF-8"?>
81
- # <add>
82
- # <doc>
83
- # <field name="employeeId">05992</field>
84
- # <field name="office">Blackwater</field>
85
- # </doc>
86
- # <doc>
87
- # <field name="employeeId">05993</field>
88
- # <field name="skills">Ruby</field>
89
- # </doc>
90
- # </add>
91
- #
92
- # # add attributes
101
+ # Result:
102
+ #
103
+ # <?xml version="1.0" encoding="UTF-8"?>
104
+ # <add>
105
+ # <doc>
106
+ # <field name="employeeId">05992</field>
107
+ # <field name="office">Blackwater</field>
108
+ # </doc>
109
+ # <doc>
110
+ # <field name="employeeId">05993</field>
111
+ # <field name="skills">Ruby</field>
112
+ # </doc>
113
+ # </add>
114
+ #
115
+ # ===== Add attributes
116
+ #
93
117
  # add([id: 42, text: 'blah'], commitWithin: 23)
94
118
  #
95
- # <?xml version="1.0" encoding="UTF-8"?>
96
- # <add commitWithin="23">
97
- # <doc>
98
- # <field name="id">42</field>
99
- # <field name="text">blah</field>
100
- # </doc>
101
- # </add>
119
+ # Result:
120
+ #
121
+ # <?xml version="1.0" encoding="UTF-8"?>
122
+ # <add commitWithin="23">
123
+ # <doc>
124
+ # <field name="id">42</field>
125
+ # <field name="text">blah</field>
126
+ # </doc>
127
+ # </add>
128
+ #
129
+ # ===== Document attributes
102
130
  #
103
- # # document attributes
104
131
  # add([[{ id: 42, text: 'blah' }, boost: 10.0]])
105
132
  #
106
- # <?xml version="1.0" encoding="UTF-8"?>
107
- # <add>
108
- # <doc boost="10.0">
109
- # <field name="id">42</field>
110
- # <field name="text">blah</field>
111
- # </doc>
112
- # </add>
133
+ # Result:
134
+ #
135
+ # <?xml version="1.0" encoding="UTF-8"?>
136
+ # <add>
137
+ # <doc boost="10.0">
138
+ # <field name="id">42</field>
139
+ # <field name="text">blah</field>
140
+ # </doc>
141
+ # </add>
142
+ #
143
+ # ===== Field attributes
113
144
  #
114
- # # field attributes
115
145
  # add(id: 42, text: ['blah', boost: 2.0])
116
146
  #
117
- # <?xml version="1.0" encoding="UTF-8"?>
118
- # <add>
119
- # <doc>
120
- # <field name="id">42</field>
121
- # <field name="text" boost="2.0">blah</field>
122
- # </doc>
123
- # </add>
147
+ # Result:
148
+ #
149
+ # <?xml version="1.0" encoding="UTF-8"?>
150
+ # <add>
151
+ # <doc>
152
+ # <field name="id">42</field>
153
+ # <field name="text" boost="2.0">blah</field>
154
+ # </doc>
155
+ # </add>
156
+ #
157
+ # ===== All attributes together
124
158
  #
125
- # # all attributes together
126
159
  # add([[{ id: 42, text: ['blah', boost: 2.0] }, boost: 10.0]], commitWithin: 23)
127
160
  #
128
- # <?xml version="1.0" encoding="UTF-8"?>
129
- # <add commitWithin="23">
130
- # <doc boost="10.0">
131
- # <field name="id">42</field>
132
- # <field name="text" boost="2.0">blah</field>
133
- # </doc>
134
- # </add>
161
+ # Result:
162
+ #
163
+ # <?xml version="1.0" encoding="UTF-8"?>
164
+ # <add commitWithin="23">
165
+ # <doc boost="10.0">
166
+ # <field name="id">42</field>
167
+ # <field name="text" boost="2.0">blah</field>
168
+ # </doc>
169
+ # </add>
135
170
  def add(doc, attributes = {})
136
171
  to_xml(:add, attributes) { |add_node| _each(doc) { |hash, doc_attributes|
137
172
  add_node.doc_(doc_attributes) { |doc_node| hash.each { |key, values|
@@ -141,137 +176,179 @@ module Solr4R
141
176
  field_attributes.update((values = values.dup).pop)
142
177
  end
143
178
 
144
- _each(values) { |value| doc_node.field_(value, field_attributes) }
179
+ _each_value(values) { |value| doc_node.field_(value, field_attributes) }
145
180
  } }
146
181
  } }
147
182
  end
148
183
 
149
184
  alias_method :doc, :add
150
185
 
151
- # See Schema[http://wiki.apache.org/solr/UpdateXmlMessages#A.22commit.22_and_.22optimize.22].
186
+ # See Schema[https://wiki.apache.org/solr/UpdateXmlMessages#A.22commit.22_and_.22optimize.22].
187
+ #
188
+ # ==== Examples:
152
189
  #
153
- # Examples:
190
+ # ===== Without options
154
191
  #
155
192
  # commit
156
193
  #
157
- # <?xml version="1.0" encoding="UTF-8"?>
158
- # <commit/>
194
+ # Result:
195
+ #
196
+ # <?xml version="1.0" encoding="UTF-8"?>
197
+ # <commit/>
198
+ #
199
+ # ===== With options
159
200
  #
160
201
  # commit(softCommit: true)
161
202
  #
162
- # <?xml version="1.0" encoding="UTF-8"?>
163
- # <commit softCommit="true"/>
203
+ # Result:
204
+ #
205
+ # <?xml version="1.0" encoding="UTF-8"?>
206
+ # <commit softCommit="true"/>
164
207
  def commit(attributes = {})
165
208
  to_xml(:commit, attributes)
166
209
  end
167
210
 
168
- # See Schema[http://wiki.apache.org/solr/UpdateXmlMessages#A.22commit.22_and_.22optimize.22].
211
+ # See Schema[https://wiki.apache.org/solr/UpdateXmlMessages#A.22commit.22_and_.22optimize.22].
169
212
  #
170
- # Examples:
213
+ # ==== Examples:
214
+ #
215
+ # ===== Without options
171
216
  #
172
217
  # optimize
173
218
  #
174
- # <?xml version="1.0" encoding="UTF-8"?>
175
- # <optimize/>
219
+ # Result:
220
+ #
221
+ # <?xml version="1.0" encoding="UTF-8"?>
222
+ # <optimize/>
223
+ #
224
+ # ===== With options
176
225
  #
177
226
  # optimize(maxSegments: 42)
178
227
  #
179
- # <?xml version="1.0" encoding="UTF-8"?>
180
- # <optimize maxSegments="42"/>
228
+ # Result:
229
+ #
230
+ # <?xml version="1.0" encoding="UTF-8"?>
231
+ # <optimize maxSegments="42"/>
181
232
  def optimize(attributes = {})
182
233
  to_xml(:optimize, attributes)
183
234
  end
184
235
 
185
- # See Schema[http://wiki.apache.org/solr/UpdateXmlMessages#A.22rollback.22].
236
+ # See Schema[https://wiki.apache.org/solr/UpdateXmlMessages#A.22rollback.22].
186
237
  #
187
- # Example:
238
+ # ==== Example:
188
239
  #
189
240
  # rollback
190
241
  #
191
- # <?xml version="1.0" encoding="UTF-8"?>
192
- # <rollback/>
242
+ # Result:
243
+ #
244
+ # <?xml version="1.0" encoding="UTF-8"?>
245
+ # <rollback/>
193
246
  def rollback
194
247
  to_xml(:rollback)
195
248
  end
196
249
 
197
- # See Schema[http://wiki.apache.org/solr/UpdateXmlMessages#A.22delete.22_documents_by_ID_and_by_Query].
250
+ # See Schema[https://wiki.apache.org/solr/UpdateXmlMessages#A.22delete.22_documents_by_ID_and_by_Query].
251
+ #
252
+ # See Query#query_string for handling of query hashes (via +client.query_string+).
198
253
  #
199
- # See Client.query_string for handling of query hashes.
254
+ # ==== Examples:
200
255
  #
201
- # Examples:
256
+ # ===== Single ID
202
257
  #
203
- # # single ID
204
258
  # delete(id: '05991')
205
259
  #
206
- # <?xml version="1.0" encoding="UTF-8"?>
207
- # <delete>
208
- # <id>05991</id>
209
- # </delete>
260
+ # Result:
261
+ #
262
+ # <?xml version="1.0" encoding="UTF-8"?>
263
+ # <delete>
264
+ # <id>05991</id>
265
+ # </delete>
266
+ #
267
+ # ===== Multiple IDs
210
268
  #
211
- # # multiple IDs
212
269
  # delete(id: %w[05991 06000])
213
270
  #
214
- # <?xml version="1.0" encoding="UTF-8"?>
215
- # <delete>
216
- # <id>05991</id>
217
- # <id>06000</id>
218
- # </delete>
271
+ # Result:
272
+ #
273
+ # <?xml version="1.0" encoding="UTF-8"?>
274
+ # <delete>
275
+ # <id>05991</id>
276
+ # <id>06000</id>
277
+ # </delete>
278
+ #
279
+ # ===== Single query
219
280
  #
220
- # # single query
221
281
  # delete(query: 'office:Bridgewater')
222
282
  #
223
- # <?xml version="1.0" encoding="UTF-8"?>
224
- # <delete>
225
- # <query>office:Bridgewater</query>
226
- # </delete>
283
+ # Result:
284
+ #
285
+ # <?xml version="1.0" encoding="UTF-8"?>
286
+ # <delete>
287
+ # <query>office:Bridgewater</query>
288
+ # </delete>
289
+ #
290
+ # ===== Multiple queries
227
291
  #
228
- # # multiple queries
229
292
  # delete(query: %w[office:Bridgewater office:Osaka])
230
293
  #
231
- # <?xml version="1.0" encoding="UTF-8"?>
232
- # <delete>
233
- # <query>office:Bridgewater</query>
234
- # <query>office:Osaka</query>
235
- # </delete>
294
+ # Result:
295
+ #
296
+ # <?xml version="1.0" encoding="UTF-8"?>
297
+ # <delete>
298
+ # <query>office:Bridgewater</query>
299
+ # <query>office:Osaka</query>
300
+ # </delete>
301
+ #
302
+ # ===== Query hash
236
303
  #
237
- # # query hash
238
304
  # delete(query: { office: 'Bridgewater', skills: 'Perl' })
239
305
  #
240
- # <?xml version="1.0" encoding="UTF-8"?>
241
- # <delete>
242
- # <query>office:Bridgewater skills:Perl</query>
243
- # </delete>
306
+ # Result:
307
+ #
308
+ # <?xml version="1.0" encoding="UTF-8"?>
309
+ # <delete>
310
+ # <query>office:Bridgewater skills:Perl</query>
311
+ # </delete>
312
+ #
313
+ # ===== Query hash with array
244
314
  #
245
- # # query hash with array
246
315
  # delete(query: { office: %w[Bridgewater Osaka] })
247
316
  #
248
- # <?xml version="1.0" encoding="UTF-8"?>
249
- # <delete>
250
- # <query>office:Bridgewater office:Osaka</query>
251
- # </delete>
317
+ # Result:
318
+ #
319
+ # <?xml version="1.0" encoding="UTF-8"?>
320
+ # <delete>
321
+ # <query>office:Bridgewater office:Osaka</query>
322
+ # </delete>
323
+ #
324
+ # ===== Query hash with LocalParams[https://wiki.apache.org/solr/LocalParams]
252
325
  #
253
- # # query hash with LocalParams
254
326
  # delete(query: { office: 'Bridgewater', _: { type: :edismax } })
255
327
  #
256
- # <?xml version="1.0" encoding="UTF-8"?>
257
- # <delete>
258
- # <query>{!type=edismax}office:Bridgewater</query>
259
- # </delete>
328
+ # Result:
329
+ #
330
+ # <?xml version="1.0" encoding="UTF-8"?>
331
+ # <delete>
332
+ # <query>{!type=edismax}office:Bridgewater</query>
333
+ # </delete>
334
+ #
335
+ # ===== Both IDs and queries
260
336
  #
261
- # # both IDs and queries
262
337
  # delete(id: %w[05991 06000], query: { office: %w[Bridgewater Osaka] })
263
338
  #
264
- # <?xml version="1.0" encoding="UTF-8"?>
265
- # <delete>
266
- # <id>05991</id>
267
- # <id>06000</id>
268
- # <query>office:Bridgewater office:Osaka</query>
269
- # </delete>
339
+ # Result:
340
+ #
341
+ # <?xml version="1.0" encoding="UTF-8"?>
342
+ # <delete>
343
+ # <id>05991</id>
344
+ # <id>06000</id>
345
+ # <query>office:Bridgewater office:Osaka</query>
346
+ # </delete>
270
347
  def delete(hash)
271
348
  to_xml(:delete) { |delete_node| hash.each { |key, values|
272
349
  case key.to_s
273
- when 'id' then _each(values) { |value| delete_node.id_(value) }
274
- when 'query' then _each(values) { |value| delete_node.query_(
350
+ when 'id' then _each_value(values) { |value| delete_node.id_(value) }
351
+ when 'query' then _each_value(values) { |value| delete_node.query_(
275
352
  client.query_string(value, false)) }
276
353
  else raise ArgumentError, "`id' or `query' expected, got %p" % key
277
354
  end
@@ -295,7 +372,15 @@ module Solr4R
295
372
  end
296
373
 
297
374
  def _each(values, &block)
298
- (values.is_a?(Array) ? values : [values]).each(&block)
375
+ (values.respond_to?(:to_ary) ? values : [values]).each(&block)
376
+ end
377
+
378
+ def _each_value(values)
379
+ _each(values) { |value| yield convert_value(value) }
380
+ end
381
+
382
+ def convert_value(value)
383
+ self.class.convert_value(value)
299
384
  end
300
385
 
301
386
  end
@@ -5,7 +5,7 @@
5
5
  # #
6
6
  # solr4r -- A Ruby client for Apache Solr #
7
7
  # #
8
- # Copyright (C) 2014-2015 Jens Wille #
8
+ # Copyright (C) 2014-2016 Jens Wille #
9
9
  # #
10
10
  # solr4r is free software: you can redistribute it and/or modify it under the #
11
11
  # terms of the GNU Affero General Public License as published by the Free #
@@ -34,7 +34,7 @@ module Solr4R
34
34
  DEFAULT_ANALYZE_DOCUMENT_PATH = 'analysis/document'
35
35
  DEFAULT_ANALYZE_FIELD_PATH = 'analysis/field'
36
36
 
37
- module Admin
37
+ module AdminMixin
38
38
 
39
39
  def solr_version(type = :spec,
40
40
  params = {}, options = {}, path = DEFAULT_SYSTEM_PATH, &block)
@@ -77,7 +77,7 @@ module Solr4R
77
77
 
78
78
  end
79
79
 
80
- include Admin
80
+ include AdminMixin
81
81
 
82
82
  end
83
83