greglu-solr-ruby 0.0.7

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.
Files changed (103) hide show
  1. data/CHANGES.yml +50 -0
  2. data/LICENSE.txt +201 -0
  3. data/README +56 -0
  4. data/Rakefile +190 -0
  5. data/examples/delicious_library/dl_importer.rb +60 -0
  6. data/examples/delicious_library/sample_export.txt +164 -0
  7. data/examples/marc/marc_importer.rb +106 -0
  8. data/examples/tang/tang_importer.rb +58 -0
  9. data/lib/solr.rb +21 -0
  10. data/lib/solr/connection.rb +179 -0
  11. data/lib/solr/document.rb +73 -0
  12. data/lib/solr/exception.rb +13 -0
  13. data/lib/solr/field.rb +39 -0
  14. data/lib/solr/importer.rb +19 -0
  15. data/lib/solr/importer/array_mapper.rb +26 -0
  16. data/lib/solr/importer/delimited_file_source.rb +38 -0
  17. data/lib/solr/importer/hpricot_mapper.rb +27 -0
  18. data/lib/solr/importer/mapper.rb +51 -0
  19. data/lib/solr/importer/solr_source.rb +43 -0
  20. data/lib/solr/importer/xpath_mapper.rb +35 -0
  21. data/lib/solr/indexer.rb +52 -0
  22. data/lib/solr/request.rb +26 -0
  23. data/lib/solr/request/add_document.rb +63 -0
  24. data/lib/solr/request/base.rb +36 -0
  25. data/lib/solr/request/commit.rb +31 -0
  26. data/lib/solr/request/delete.rb +50 -0
  27. data/lib/solr/request/dismax.rb +46 -0
  28. data/lib/solr/request/index_info.rb +22 -0
  29. data/lib/solr/request/modify_document.rb +51 -0
  30. data/lib/solr/request/optimize.rb +21 -0
  31. data/lib/solr/request/ping.rb +36 -0
  32. data/lib/solr/request/select.rb +56 -0
  33. data/lib/solr/request/spellcheck.rb +30 -0
  34. data/lib/solr/request/standard.rb +374 -0
  35. data/lib/solr/request/update.rb +23 -0
  36. data/lib/solr/response.rb +27 -0
  37. data/lib/solr/response/add_document.rb +17 -0
  38. data/lib/solr/response/base.rb +42 -0
  39. data/lib/solr/response/commit.rb +17 -0
  40. data/lib/solr/response/delete.rb +13 -0
  41. data/lib/solr/response/dismax.rb +20 -0
  42. data/lib/solr/response/index_info.rb +26 -0
  43. data/lib/solr/response/modify_document.rb +17 -0
  44. data/lib/solr/response/optimize.rb +14 -0
  45. data/lib/solr/response/ping.rb +28 -0
  46. data/lib/solr/response/ruby.rb +42 -0
  47. data/lib/solr/response/select.rb +17 -0
  48. data/lib/solr/response/spellcheck.rb +20 -0
  49. data/lib/solr/response/standard.rb +60 -0
  50. data/lib/solr/response/xml.rb +42 -0
  51. data/lib/solr/solrtasks.rb +27 -0
  52. data/lib/solr/util.rb +32 -0
  53. data/lib/solr/xml.rb +47 -0
  54. data/script/setup.rb +14 -0
  55. data/script/solrshell +18 -0
  56. data/solr-ruby.gemspec +26 -0
  57. data/solr/conf/admin-extra.html +31 -0
  58. data/solr/conf/protwords.txt +21 -0
  59. data/solr/conf/schema.xml +221 -0
  60. data/solr/conf/scripts.conf +24 -0
  61. data/solr/conf/solrconfig.xml +394 -0
  62. data/solr/conf/stopwords.txt +58 -0
  63. data/solr/conf/synonyms.txt +31 -0
  64. data/solr/conf/xslt/example.xsl +132 -0
  65. data/test/conf/admin-extra.html +31 -0
  66. data/test/conf/protwords.txt +21 -0
  67. data/test/conf/schema.xml +237 -0
  68. data/test/conf/scripts.conf +24 -0
  69. data/test/conf/solrconfig.xml +376 -0
  70. data/test/conf/stopwords.txt +58 -0
  71. data/test/conf/synonyms.txt +31 -0
  72. data/test/functional/server_test.rb +218 -0
  73. data/test/functional/test_solr_server.rb +104 -0
  74. data/test/unit/add_document_test.rb +40 -0
  75. data/test/unit/array_mapper_test.rb +37 -0
  76. data/test/unit/changes_yaml_test.rb +21 -0
  77. data/test/unit/commit_test.rb +41 -0
  78. data/test/unit/connection_test.rb +55 -0
  79. data/test/unit/data_mapper_test.rb +75 -0
  80. data/test/unit/delete_test.rb +56 -0
  81. data/test/unit/delimited_file_source_test.rb +29 -0
  82. data/test/unit/dismax_request_test.rb +26 -0
  83. data/test/unit/document_test.rb +69 -0
  84. data/test/unit/field_test.rb +48 -0
  85. data/test/unit/hpricot_mapper_test.rb +44 -0
  86. data/test/unit/hpricot_test_file.xml +26 -0
  87. data/test/unit/indexer_test.rb +57 -0
  88. data/test/unit/modify_document_test.rb +24 -0
  89. data/test/unit/ping_test.rb +51 -0
  90. data/test/unit/request_test.rb +61 -0
  91. data/test/unit/response_test.rb +43 -0
  92. data/test/unit/select_test.rb +25 -0
  93. data/test/unit/solr_mock_base.rb +40 -0
  94. data/test/unit/spellcheck_response_test.rb +26 -0
  95. data/test/unit/spellchecker_request_test.rb +27 -0
  96. data/test/unit/standard_request_test.rb +324 -0
  97. data/test/unit/standard_response_test.rb +174 -0
  98. data/test/unit/suite.rb +16 -0
  99. data/test/unit/tab_delimited.txt +2 -0
  100. data/test/unit/util_test.rb +24 -0
  101. data/test/unit/xpath_mapper_test.rb +38 -0
  102. data/test/unit/xpath_test_file.xml +25 -0
  103. metadata +173 -0
@@ -0,0 +1,63 @@
1
+ # The ASF licenses this file to You under the Apache License, Version 2.0
2
+ # (the "License"); you may not use this file except in compliance with
3
+ # the License. You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ require 'solr/xml'
14
+ require 'solr/request/base'
15
+ require 'solr/document'
16
+ require 'solr/request/update'
17
+
18
+ class Solr::Request::AddDocument < Solr::Request::Update
19
+
20
+ # create the request, optionally passing in a Solr::Document
21
+ #
22
+ # request = Solr::Request::AddDocument.new doc
23
+ #
24
+ # as a short cut you can pass in a Hash instead:
25
+ #
26
+ # request = Solr::Request::AddDocument.new :creator => 'Jorge Luis Borges'
27
+ #
28
+ # or an array, to add multiple documents at the same time:
29
+ #
30
+ # request = Solr::Request::AddDocument.new([doc1, doc2, doc3])
31
+
32
+ def initialize(doc={})
33
+ @docs = []
34
+ if doc.is_a?(Array)
35
+ doc.each { |d| add_doc(d) }
36
+ else
37
+ add_doc(doc)
38
+ end
39
+ end
40
+
41
+ # returns the request as a string suitable for posting
42
+
43
+ def to_s
44
+ e = Solr::XML::Element.new 'add'
45
+ for doc in @docs
46
+ e.add_element doc.to_xml
47
+ end
48
+ return e.to_s
49
+ end
50
+
51
+ private
52
+ def add_doc(doc)
53
+ case doc
54
+ when Hash
55
+ @docs << Solr::Document.new(doc)
56
+ when Solr::Document
57
+ @docs << doc
58
+ else
59
+ raise "must pass in Solr::Document or Hash"
60
+ end
61
+ end
62
+
63
+ end
@@ -0,0 +1,36 @@
1
+ # The ASF licenses this file to You under the Apache License, Version 2.0
2
+ # (the "License"); you may not use this file except in compliance with
3
+ # the License. You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ class Solr::Request::Base
14
+
15
+
16
+ #TODO : Add base support for the debugQuery flag, and such that the response provides debug output easily
17
+
18
+ # returns either :xml or :ruby depending on what the
19
+ # response type is for a given request
20
+
21
+ def response_format
22
+ raise "unknown request type: #{self.class}"
23
+ end
24
+
25
+ def content_type
26
+ 'text/xml; charset=utf-8'
27
+ end
28
+
29
+ # returns the solr handler or url fragment that can
30
+ # respond to this type of request
31
+
32
+ def handler
33
+ raise "unknown request type: #{self.class}"
34
+ end
35
+
36
+ end
@@ -0,0 +1,31 @@
1
+ # The ASF licenses this file to You under the Apache License, Version 2.0
2
+ # (the "License"); you may not use this file except in compliance with
3
+ # the License. You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ require 'solr/xml'
14
+
15
+ class Solr::Request::Commit < Solr::Request::Update
16
+
17
+ def initialize(options={})
18
+ @wait_searcher = options[:wait_searcher] || true
19
+ @wait_flush = options[:wait_flush] || true
20
+ end
21
+
22
+
23
+ def to_s
24
+ e = Solr::XML::Element.new('commit')
25
+ e.attributes['waitSearcher'] = @wait_searcher ? 'true' : 'false'
26
+ e.attributes['waitFlush'] = @wait_flush ? 'true' : 'false'
27
+
28
+ e.to_s
29
+ end
30
+
31
+ end
@@ -0,0 +1,50 @@
1
+ # The ASF licenses this file to You under the Apache License, Version 2.0
2
+ # (the "License"); you may not use this file except in compliance with
3
+ # the License. You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ require 'solr/xml'
14
+
15
+ class Solr::Request::Delete < Solr::Request::Update
16
+
17
+ # A delete request can be for a specific document id
18
+ #
19
+ # request = Solr::Request::Delete.new(:id => 1234)
20
+ #
21
+ # or by query:
22
+ #
23
+ # request = Solr::Request::Delete.new(:query =>
24
+ #
25
+ def initialize(options)
26
+ unless options.kind_of?(Hash) and (options[:id] or options[:query])
27
+ raise Solr::Exception.new("must pass in :id or :query")
28
+ end
29
+ if options[:id] and options[:query]
30
+ raise Solr::Exception.new("can't pass in both :id and :query")
31
+ end
32
+ @document_id = options[:id]
33
+ @query = options[:query]
34
+ end
35
+
36
+ def to_s
37
+ delete_element = Solr::XML::Element.new('delete')
38
+ if @document_id
39
+ id_element = Solr::XML::Element.new('id')
40
+ id_element.text = @document_id
41
+ delete_element.add_element(id_element)
42
+ elsif @query
43
+ query = Solr::XML::Element.new('query')
44
+ query.text = @query
45
+ delete_element.add_element(query)
46
+ end
47
+ delete_element.to_s
48
+ end
49
+ end
50
+
@@ -0,0 +1,46 @@
1
+ # The ASF licenses this file to You under the Apache License, Version 2.0
2
+ # (the "License"); you may not use this file except in compliance with
3
+ # the License. You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ class Solr::Request::Dismax < Solr::Request::Standard
14
+
15
+ VALID_PARAMS.replace(VALID_PARAMS + [:tie_breaker, :query_fields, :minimum_match, :phrase_fields, :phrase_slop,
16
+ :boost_query, :boost_functions])
17
+
18
+ def initialize(params)
19
+ @alternate_query = params.delete(:alternate_query)
20
+ @sort_values = params.delete(:sort)
21
+
22
+ super
23
+
24
+ @query_type = "dismax"
25
+ end
26
+
27
+ def to_hash
28
+ hash = super
29
+ hash[:tie] = @params[:tie_breaker]
30
+ hash[:mm] = @params[:minimum_match]
31
+ hash[:qf] = @params[:query_fields]
32
+ hash[:pf] = @params[:phrase_fields]
33
+ hash[:ps] = @params[:phrase_slop]
34
+ hash[:bq] = @params[:boost_query]
35
+ hash[:bf] = @params[:boost_functions]
36
+ hash["q.alt"] = @alternate_query
37
+ # FIXME: 2007-02-13 <coda.hale@gmail.com> -- This code is duplicated in
38
+ # Solr::Request::Standard. It should be refactored into a single location.
39
+ hash[:sort] = @sort_values.collect do |sort|
40
+ key = sort.keys[0]
41
+ "#{key.to_s} #{sort[key] == :descending ? 'desc' : 'asc'}"
42
+ end.join(',') if @sort_values
43
+ return hash
44
+ end
45
+
46
+ end
@@ -0,0 +1,22 @@
1
+ # The ASF licenses this file to You under the Apache License, Version 2.0
2
+ # (the "License"); you may not use this file except in compliance with
3
+ # the License. You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ class Solr::Request::IndexInfo < Solr::Request::Select
14
+
15
+ def handler
16
+ 'admin/luke'
17
+ end
18
+
19
+ def to_hash
20
+ {:numTerms => 0}.merge(super.to_hash)
21
+ end
22
+ end
@@ -0,0 +1,51 @@
1
+ # The ASF licenses this file to You under the Apache License, Version 2.0
2
+ # (the "License"); you may not use this file except in compliance with
3
+ # the License. You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ require 'solr/xml'
14
+ require 'solr/request/base'
15
+ require 'solr/document'
16
+ require 'solr/request/update'
17
+
18
+ class Solr::Request::ModifyDocument < Solr::Request::Update
19
+
20
+ # Example: ModifyDocument.new(:id => 10, :overwrite => {:field_name => "new value"})
21
+ def initialize(update_data)
22
+ modes = []
23
+ @doc = {}
24
+ [:overwrite, :append, :distinct, :increment, :delete].each do |mode|
25
+ field_data = update_data[mode]
26
+ if field_data
27
+ field_data.each do |field_name, field_value|
28
+ modes << "#{field_name}:#{mode.to_s.upcase}"
29
+ @doc[field_name] = field_value if field_value # if value is nil, omit so it can be removed
30
+ end
31
+ update_data.delete mode
32
+ end
33
+ end
34
+ @mode = modes.join(",")
35
+
36
+ # only one key should be left over, the id
37
+ @doc[update_data.keys[0].to_s] = update_data.values[0]
38
+ end
39
+
40
+ # returns the request as a string suitable for posting
41
+ def to_s
42
+ e = Solr::XML::Element.new 'add'
43
+ e.add_element(Solr::Document.new(@doc).to_xml)
44
+ return e.to_s
45
+ end
46
+
47
+ def handler
48
+ "update?mode=#{@mode}"
49
+ end
50
+
51
+ end
@@ -0,0 +1,21 @@
1
+ # The ASF licenses this file to You under the Apache License, Version 2.0
2
+ # (the "License"); you may not use this file except in compliance with
3
+ # the License. You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ require 'solr/xml'
14
+
15
+ class Solr::Request::Optimize < Solr::Request::Update
16
+
17
+ def to_s
18
+ Solr::XML::Element.new('optimize').to_s
19
+ end
20
+
21
+ end
@@ -0,0 +1,36 @@
1
+ # The ASF licenses this file to You under the Apache License, Version 2.0
2
+ # (the "License"); you may not use this file except in compliance with
3
+ # the License. You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ # TODO: Consider something lazy like this?
14
+ # Solr::Request::Ping = Solr::Request.simple_request :format=>:xml, :handler=>'admin/ping'
15
+ # class Solr::Request
16
+ # def self.simple_request(options)
17
+ # Class.new do
18
+ # def response_format
19
+ # options[:format]
20
+ # end
21
+ # def handler
22
+ # options[:handler]
23
+ # end
24
+ # end
25
+ # end
26
+ # end
27
+
28
+ class Solr::Request::Ping < Solr::Request::Base
29
+ def response_format
30
+ :xml
31
+ end
32
+
33
+ def handler
34
+ 'admin/ping'
35
+ end
36
+ end
@@ -0,0 +1,56 @@
1
+ # The ASF licenses this file to You under the Apache License, Version 2.0
2
+ # (the "License"); you may not use this file except in compliance with
3
+ # the License. You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ require 'erb'
14
+
15
+ # "Abstract" base class, only useful with subclasses that add parameters
16
+ class Solr::Request::Select < Solr::Request::Base
17
+
18
+ attr_reader :query_type
19
+
20
+ def initialize(qt=nil, params={})
21
+ @query_type = qt
22
+ @select_params = params
23
+ end
24
+
25
+ def response_format
26
+ :ruby
27
+ end
28
+
29
+ def handler
30
+ 'select'
31
+ end
32
+
33
+ def content_type
34
+ 'application/x-www-form-urlencoded; charset=utf-8'
35
+ end
36
+
37
+ def to_hash
38
+ return {:qt => query_type, :wt => 'ruby'}.merge(@select_params)
39
+ end
40
+
41
+ def to_s
42
+ raw_params = self.to_hash
43
+
44
+ http_params = []
45
+ raw_params.each do |key,value|
46
+ if value.respond_to?(:each) && !value.is_a?(String)
47
+ value.each { |v| http_params << "#{key}=#{ERB::Util::url_encode(v)}" unless v.nil?}
48
+ else
49
+ http_params << "#{key}=#{ERB::Util::url_encode(value)}" unless value.nil?
50
+ end
51
+ end
52
+
53
+ http_params.join("&")
54
+ end
55
+
56
+ end
@@ -0,0 +1,30 @@
1
+ # The ASF licenses this file to You under the Apache License, Version 2.0
2
+ # (the "License"); you may not use this file except in compliance with
3
+ # the License. You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ class Solr::Request::Spellcheck < Solr::Request::Select
14
+
15
+ def initialize(params)
16
+ super('spellchecker')
17
+ @params = params
18
+ end
19
+
20
+ def to_hash
21
+ hash = super
22
+ hash[:q] = @params[:query]
23
+ hash[:suggestionCount] = @params[:suggestion_count]
24
+ hash[:accuracy] = @params[:accuracy]
25
+ hash[:onlyMorePopular] = @params[:only_more_popular]
26
+ hash[:cmd] = @params[:command]
27
+ return hash
28
+ end
29
+
30
+ end