solrbee 0.1.2 → 0.5.0

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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/Makefile +1 -4
  4. data/README.md +1 -11
  5. data/config/api.yml +22 -0
  6. data/lib/rom/solr.rb +56 -0
  7. data/lib/rom/solr/array.rb +10 -0
  8. data/lib/rom/solr/commands.rb +17 -0
  9. data/lib/rom/solr/commands/create_documents.rb +15 -0
  10. data/lib/rom/solr/commands/delete_documents.rb +15 -0
  11. data/lib/rom/solr/commands/delete_documents_by_query.rb +15 -0
  12. data/lib/rom/solr/commands/update_documents.rb +15 -0
  13. data/lib/rom/solr/dataset.rb +68 -0
  14. data/lib/rom/solr/document_repo.rb +45 -0
  15. data/lib/rom/solr/documents_dataset.rb +62 -0
  16. data/lib/rom/solr/documents_paginator.rb +21 -0
  17. data/lib/rom/solr/gateway.rb +14 -0
  18. data/lib/rom/solr/query.rb +135 -0
  19. data/lib/rom/solr/query_builder.rb +36 -0
  20. data/lib/rom/solr/query_templates.rb +34 -0
  21. data/lib/rom/solr/relation.rb +39 -0
  22. data/lib/rom/solr/relations/documents_relation.rb +215 -0
  23. data/lib/rom/solr/relations/schema_info_relation.rb +78 -0
  24. data/lib/rom/solr/repository.rb +9 -0
  25. data/lib/rom/solr/request_handler.rb +52 -0
  26. data/lib/rom/solr/response_handler.rb +12 -0
  27. data/lib/rom/solr/schema.rb +7 -0
  28. data/lib/rom/solr/schema_info_dataset.rb +19 -0
  29. data/lib/rom/solr/schema_info_repo.rb +29 -0
  30. data/lib/rom/solr/utils.rb +36 -0
  31. data/lib/solrbee.rb +22 -28
  32. data/lib/solrbee/version.rb +1 -1
  33. data/solrbee.gemspec +3 -1
  34. data/test.sh +14 -0
  35. metadata +58 -9
  36. data/lib/solrbee/api_methods.rb +0 -94
  37. data/lib/solrbee/client.rb +0 -31
  38. data/lib/solrbee/cursor.rb +0 -37
  39. data/lib/solrbee/query.rb +0 -35
  40. data/lib/solrbee/request.rb +0 -45
  41. data/lib/solrbee/response.rb +0 -25
@@ -0,0 +1,12 @@
1
+ module ROM
2
+ module Solr
3
+ class ResponseHandler
4
+
5
+ # @return [Hash] Parsed JSON object from Solr response body
6
+ def self.call(response, dataset)
7
+ JSON.parse(response.body, symbolize_names: true)
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ module ROM
2
+ module Solr
3
+ class Schema < ROM::Schema
4
+
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ module ROM
2
+ module Solr
3
+ class SchemaInfoDataset < Dataset
4
+
5
+ configure do |config|
6
+ config.default_base_path = 'schema'
7
+
8
+ config.default_response_handler = Proc.new do |*args|
9
+ ResponseHandler.call(*args).values.flatten
10
+ end
11
+
12
+ config.default_request_handler = Proc.new do |dataset|
13
+ RequestHandler.call(dataset.add_params(omitHeader: true))
14
+ end
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,29 @@
1
+ require 'forwardable'
2
+
3
+ module ROM
4
+ module Solr
5
+ class SchemaInfoRepo < Repository[:schema_info]
6
+ extend Forwardable
7
+
8
+ auto_struct false
9
+
10
+ VALUES = %i[ schema_name
11
+ similarity
12
+ unique_key
13
+ version
14
+ info
15
+ field
16
+ field_type
17
+ dynamic_field
18
+ copy_field
19
+ ]
20
+
21
+ def_delegators :schema_info, :fields, :field_types, :dynamic_fields, :copy_fields
22
+
23
+ VALUES.each do |name|
24
+ define_method name, proc { |*args| schema_info.send(name, *args).one! }
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,36 @@
1
+ require 'date'
2
+ require 'time'
3
+
4
+ module ROM
5
+ module Solr
6
+ module Utils
7
+
8
+ def phrase(value)
9
+ if value.match?(/ /)
10
+ '"%s"' % value.gsub(/"/, '\"')
11
+ else
12
+ value
13
+ end
14
+ end
15
+
16
+ # Escape a Solr query value
17
+ #
18
+ # @param value [String] raw value
19
+ # @return [String] escaped value
20
+ def escape(value)
21
+ value
22
+ .gsub(ESCAPE_CHARS, '\\1')
23
+ .gsub(DOUBLE_AMPERSAND, '\&\&')
24
+ .gsub(DOUBLE_PIPE, '\|\|')
25
+ end
26
+
27
+ # Formats a value as a Solr date.
28
+ def solr_date(value)
29
+ DateTime.parse(value.to_s).to_time.utc.iso8601
30
+ end
31
+
32
+ extend self
33
+
34
+ end
35
+ end
36
+ end
@@ -1,39 +1,33 @@
1
- require "json"
2
- require "net/http"
3
- require "uri"
1
+ require 'solrbee/version'
4
2
 
5
- require "hashie"
6
-
7
- require "solrbee/version"
8
- require "solrbee/response"
9
- require "solrbee/request"
10
- require "solrbee/query"
11
- require "solrbee/client"
12
- require "solrbee/cursor"
3
+ require 'dry-types'
4
+ require 'rom/solr'
13
5
 
14
6
  module Solrbee
15
7
 
16
- class Error < StandardError; end
8
+ DEFAULT_URI = ENV.fetch('SOLR_URL', 'http://localhost:8983/solr').freeze
17
9
 
18
- API_VERSION = 'V1'
10
+ def self.documents
11
+ ROM::Solr::DocumentRepo.new(container)
12
+ end
19
13
 
20
- # Single-valued field types
21
- STRING = "string"
22
- LONG = "plong"
23
- INT = "pint"
24
- DATE = "pdate"
25
- BOOLEAN = "boolean"
14
+ def self.schema_info
15
+ ROM::Solr::SchemaInfoRepo.new(container)
16
+ end
26
17
 
27
- # Multi-valued field types
28
- MSTRING = "strings"
29
- MLONG = "plongs"
30
- MINT = "pints"
31
- MDATE = "pdates"
32
- MBOOLEAN = "booleans"
18
+ def self.container(uri: DEFAULT_URI)
19
+ ROM.container(:solr, uri: uri) do |config|
20
+ config.auto_registration(
21
+ File.expand_path('../rom/solr/', __FILE__),
22
+ namespace: 'ROM::Solr'
23
+ )
24
+
25
+ yield config if block_given?
26
+ end
27
+ end
33
28
 
34
- # Base URL
35
- def self.solr_url
36
- ENV.fetch('SOLR_URL', 'http://localhost:8983/solr').sub(/\/\z/, '')
29
+ module Types
30
+ include Dry.Types()
37
31
  end
38
32
 
39
33
  end
@@ -1,3 +1,3 @@
1
1
  module Solrbee
2
- VERSION = "0.1.2"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -22,7 +22,9 @@ Gem::Specification.new do |spec|
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ["lib"]
24
24
 
25
- spec.add_dependency "hashie"
25
+ spec.add_dependency "rom"
26
+ spec.add_dependency "rom-http"
27
+ spec.add_dependency "dry-types"
26
28
 
27
29
  spec.add_development_dependency "bundler"
28
30
  spec.add_development_dependency "rake"
data/test.sh ADDED
@@ -0,0 +1,14 @@
1
+ #!/bin/bash
2
+
3
+ docker run --rm -d -p 8983:8983 --name solrbee-test solr:8 solr-precreate solrbee
4
+
5
+ while ! curl -fs http://localhost:8983/solr/solrbee/admin/ping 2>/dev/null ;
6
+ do sleep 1
7
+ done
8
+
9
+ SOLR_URL=http://localhost:8983/solr/solrbee bundle exec rake
10
+ code=$?
11
+
12
+ docker stop solrbee-test
13
+
14
+ exit $code
metadata CHANGED
@@ -1,17 +1,45 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solrbee
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Chandek-Stark
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-05 00:00:00.000000000 Z
11
+ date: 2021-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: hashie
14
+ name: rom
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rom-http
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: dry-types
15
43
  requirement: !ruby/object:Gem::Requirement
16
44
  requirements:
17
45
  - - ">="
@@ -96,15 +124,36 @@ files:
96
124
  - Rakefile
97
125
  - bin/console
98
126
  - bin/setup
127
+ - config/api.yml
128
+ - lib/rom/solr.rb
129
+ - lib/rom/solr/array.rb
130
+ - lib/rom/solr/commands.rb
131
+ - lib/rom/solr/commands/create_documents.rb
132
+ - lib/rom/solr/commands/delete_documents.rb
133
+ - lib/rom/solr/commands/delete_documents_by_query.rb
134
+ - lib/rom/solr/commands/update_documents.rb
135
+ - lib/rom/solr/dataset.rb
136
+ - lib/rom/solr/document_repo.rb
137
+ - lib/rom/solr/documents_dataset.rb
138
+ - lib/rom/solr/documents_paginator.rb
139
+ - lib/rom/solr/gateway.rb
140
+ - lib/rom/solr/query.rb
141
+ - lib/rom/solr/query_builder.rb
142
+ - lib/rom/solr/query_templates.rb
143
+ - lib/rom/solr/relation.rb
144
+ - lib/rom/solr/relations/documents_relation.rb
145
+ - lib/rom/solr/relations/schema_info_relation.rb
146
+ - lib/rom/solr/repository.rb
147
+ - lib/rom/solr/request_handler.rb
148
+ - lib/rom/solr/response_handler.rb
149
+ - lib/rom/solr/schema.rb
150
+ - lib/rom/solr/schema_info_dataset.rb
151
+ - lib/rom/solr/schema_info_repo.rb
152
+ - lib/rom/solr/utils.rb
99
153
  - lib/solrbee.rb
100
- - lib/solrbee/api_methods.rb
101
- - lib/solrbee/client.rb
102
- - lib/solrbee/cursor.rb
103
- - lib/solrbee/query.rb
104
- - lib/solrbee/request.rb
105
- - lib/solrbee/response.rb
106
154
  - lib/solrbee/version.rb
107
155
  - solrbee.gemspec
156
+ - test.sh
108
157
  homepage: https://github.com/dchandekstark/solrbee
109
158
  licenses:
110
159
  - MIT
@@ -1,94 +0,0 @@
1
- module Solrbee
2
- module ApiMethods
3
-
4
- def ping
5
- response = Request.execute(self, '/admin/ping')
6
- response.status
7
- end
8
-
9
- def schema
10
- response = Request.execute(self, '/schema')
11
- response.schema
12
- end
13
-
14
- def schema_name
15
- response = Request.execute(self, '/schema/name')
16
- response.name
17
- end
18
-
19
- def schema_version
20
- response = Request.execute(self, '/schema/version')
21
- response.version
22
- end
23
-
24
- def fields(**params)
25
- response = Request.execute(self, '/schema/fields', params: params)
26
- response.fields
27
- end
28
-
29
- def field(field_name, **params)
30
- response = Request.execute(self, '/schema/fields/%s' % field_name, params: params)
31
- response.field
32
- end
33
-
34
- def unique_key
35
- @unique_key ||= Request.execute(self, '/schema/uniquekey').uniqueKey
36
- end
37
-
38
- def field_types(**params)
39
- response = Request.execute(self, '/schema/fieldtypes', params: params)
40
- response.fieldTypes
41
- end
42
-
43
- def field_type(field_name, **params)
44
- response = Request.execute(self, '/schema/fieldtypes/%s' % field_name, params: params)
45
- response.fieldType
46
- end
47
-
48
- def field_names
49
- fields.map(&:name)
50
- end
51
-
52
- def field_type_names
53
- field_types.map(&:name)
54
- end
55
-
56
- def modify_schema(commands)
57
- Request.execute(self, '/schema', data: commands)
58
- end
59
-
60
- def add_field(field)
61
- modify_schema("add-field"=>field)
62
- end
63
-
64
- def delete_field(field_name)
65
- modify_schema("delete-field"=>{"name"=>field_name})
66
- end
67
-
68
- def replace_field(field)
69
- modify_schema("replace-field"=>field)
70
- end
71
-
72
- # "real-time get"
73
- # Note: Using POST here for simpler params.
74
- def get_by_id(*ids)
75
- response = Request.execute(self, '/get', params: { id: ids.join(',') })
76
- response.doc || response.docs
77
- end
78
-
79
- def index(*docs, **params)
80
- Request.execute(self, '/update/json/docs', data: docs, params: params)
81
- end
82
- alias_method :add, :index
83
- alias_method :update, :index
84
-
85
- def delete(*ids)
86
- Request.execute(self, '/update', data: { delete: ids })
87
- end
88
-
89
- def query(params)
90
- Request.execute(self, '/query', data: Query.new(params))
91
- end
92
-
93
- end
94
- end
@@ -1,31 +0,0 @@
1
- require "net/http"
2
- require "uri"
3
- require "json"
4
-
5
- require "solrbee/api_methods"
6
-
7
- module Solrbee
8
- class Client
9
- include ApiMethods
10
-
11
- attr_reader :collection, :uri
12
-
13
- def initialize(collection)
14
- @collection = collection
15
- @uri = URI(Solrbee.solr_url).tap do |u|
16
- u.path += '/%s' % URI.encode_www_form_component(collection)
17
- end
18
- end
19
-
20
- def connection
21
- Net::HTTP.new(uri.host, uri.port).tap do |http|
22
- http.use_ssl = true if uri.scheme == 'https'
23
- end
24
- end
25
-
26
- def cursor
27
- Cursor.new(self)
28
- end
29
-
30
- end
31
- end
@@ -1,37 +0,0 @@
1
- module Solrbee
2
- #
3
- # Summary
4
- #
5
- # > client = Solrbee::Client.new('mycollection'))
6
- # > cursor = Solrbee::Cursor.new(client)
7
- # > query = { query: 'foo:bar', sort: 'title ASC', limit: 10 }
8
- # > results = cursor.execute(query)
9
- # > results.each do |doc|
10
- # ...
11
- # > end
12
- #
13
- class Cursor
14
-
15
- attr_reader :client
16
-
17
- def initialize(client)
18
- @client = client
19
- end
20
-
21
- # @return [Enumerator] an enumerator of query results
22
- def execute(query)
23
- Enumerator.new do |yielder|
24
- q = Query.cursor(query, client.unique_key)
25
-
26
- while true
27
- response = client.query(q)
28
- break if response.num_found == 0
29
- break if response.nextCursorMark == q.params.cursorMark
30
- response.docs.each { |doc| yielder << doc }
31
- q.params.cursorMark = response.nextCursorMark
32
- end
33
- end
34
- end
35
-
36
- end
37
- end