solrbee 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -1
  3. data/Makefile +1 -6
  4. data/README.md +1 -11
  5. data/config/api.yml +22 -45
  6. data/lib/rom/solr.rb +40 -11
  7. data/lib/{solrbee → rom/solr}/array.rb +0 -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 +33 -54
  14. data/lib/rom/solr/document_repo.rb +33 -0
  15. data/lib/rom/solr/documents_dataset.rb +12 -0
  16. data/lib/rom/solr/gateway.rb +2 -13
  17. data/lib/rom/solr/relation.rb +22 -8
  18. data/lib/rom/solr/relations/documents_relation.rb +160 -0
  19. data/lib/rom/solr/relations/schema_info_relation.rb +100 -0
  20. data/lib/rom/solr/repository.rb +9 -0
  21. data/lib/rom/solr/request_handler.rb +52 -0
  22. data/lib/rom/solr/{response.rb → response_handler.rb} +2 -2
  23. data/lib/rom/solr/schema.rb +1 -3
  24. data/lib/rom/solr/schema_info_dataset.rb +11 -0
  25. data/lib/rom/solr/schema_info_repo.rb +45 -0
  26. data/lib/rom/solr/select_cursor.rb +56 -0
  27. data/lib/solrbee.rb +12 -23
  28. data/lib/solrbee/version.rb +1 -1
  29. data/solrbee.gemspec +0 -1
  30. data/test.sh +14 -0
  31. metadata +19 -24
  32. data/lib/rom/solr/datasets/select_dataset.rb +0 -53
  33. data/lib/rom/solr/paginated_dataset.rb +0 -62
  34. data/lib/rom/solr/relations/schema_relation.rb +0 -75
  35. data/lib/rom/solr/relations/select_relation.rb +0 -43
  36. data/lib/rom/solr/request.rb +0 -24
  37. data/lib/rom/solr/schemaless.rb +0 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 77e7ebc45077bb8016d699124b9d4de397adba4d6166e0b3f64bb07693c51a3f
4
- data.tar.gz: 846ea941962ac61ac49195bc0a05ef4356fbc0937a96055af43320c833b41b5d
3
+ metadata.gz: 11deb067a219ff325c0aa6dfaeb14422674cfd2a30338d14a1f00fa3f2081550
4
+ data.tar.gz: b6566f900e8a437feb379dba1e7f8de64e9c5a4b821cc501256ce0ee58da52e1
5
5
  SHA512:
6
- metadata.gz: 278f91339f713389ab9858471f35f8a72d07ae1e00083e931cade7af50aee540ba8abf1bd42a79f1a1ffa11ab3b081f8a3231035642ff61091abc7f8f3306da5
7
- data.tar.gz: a143efa02fed4ee7e10c063bf4c4db6df6df5f9bbf40ba820c004c4961e206545d980ed615f566b99c996f30db184a49fce7a005d990ebbca4b9028cddadaebf
6
+ metadata.gz: aa65e21c6552dc4d4276ecfdc1a4089e69d3625af84d014cb6353183a9e145ed8adf34158b180e2c70d1718d211e35b32fbd545438bd13753d171484b1577010
7
+ data.tar.gz: 78fd833f50640f5f875be47160a87642f2b612c90906e3d349e68042f5d267b4b375727babcc8c2512c90006e7e858535e2382ecfc638d7dff333822f20e04c4
data/Gemfile CHANGED
@@ -2,4 +2,5 @@ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
- gem "rom-http", git: "https://github.com/rom-rb/rom-http.git"
5
+ gem 'rom', '5.2.4'
6
+ gem 'rom-http', git: 'https://github.com/rom-rb/rom-http.git'
data/Makefile CHANGED
@@ -1,10 +1,5 @@
1
1
  SHELL = /bin/bash
2
2
 
3
- SOLR_URL = http://localhost:8983/solr/solrbee
4
-
5
3
  .PHONY : test
6
4
  test:
7
- docker run --rm -d -p 8983:8983 --name solrbee-test solr:8 solr-precreate solrbee
8
- while ! curl -fs http://localhost:8983/solr/solrbee/admin/ping 2>/dev/null ; do sleep 1 ; done
9
- SOLR_URL=$(SOLR_URL) bundle exec rake
10
- docker stop solrbee-test
5
+ ./test.sh
data/README.md CHANGED
@@ -25,17 +25,7 @@ Or install it yourself as:
25
25
 
26
26
  ## Usage
27
27
 
28
- ```
29
- $ bundle console
30
- irb(main):001:0> client = Solrbee::Client.new('solrbee')
31
- => #<Solrbee::Client:0x00007fd3410d7c50 @collection="solrbee", @uri=#<URI::HTTP http://localhost:8983/solr/solrbee>>
32
- irb(main):002:0> client.unique_key
33
- => "id"
34
- irb(main):003:0> client.schema_version
35
- => 1.6
36
- irb(main):004:0> client.schema_name
37
- => "default-config"
38
- ```
28
+ TODO
39
29
 
40
30
  ## Development
41
31
 
@@ -1,45 +1,22 @@
1
- v1:
2
- ping:
3
- path: /admin/ping
4
- response_key: status
5
-
6
- schema:
7
- path: /schema
8
- response_key: schema
9
-
10
- schema_name:
11
- path: /schema/name
12
- response_key: name
13
-
14
- schema_version:
15
- path: /schema/version
16
- response_key: version
17
-
18
- fields:
19
- path: /schema/fields
20
- response_key: fields
21
-
22
- field:
23
- path: /schema/fields/%{name}
24
- response_key: field
25
-
26
- unique_key:
27
- path: /schema/uniquekey
28
- response_key: uniqueKey
29
-
30
- field_types:
31
- path: /schema/fieldtypes
32
- response_key: fieldTypes
33
-
34
- field_type:
35
- path: /schema/fieldtypes/%{name}
36
- response_key: fieldType
37
-
38
- update:
39
- path: /update
40
-
41
- update_json:
42
- path: /update/json
43
-
44
- update_json_docs:
45
- path: /update/json/docs
1
+ field_types:
2
+ path: fieldtypes
3
+ key: fieldTypes
4
+ field_type:
5
+ desc: GET /schema/fieldtype/[name]
6
+ path: fieldtypes/%{name}
7
+ args:
8
+ - name
9
+ key: fieldType
10
+ dynamic_fields:
11
+ desc: GET /schema/dynamicfields
12
+ path: dynamicfields
13
+ key: dynamicFields
14
+ dynamic_field:
15
+ desc: GET /schema/dynamicfields/[name]
16
+ args:
17
+ - name
18
+ path: dynamicfields/%{name}
19
+ key: dynamicField
20
+ copy_fields:
21
+ path: copyfields
22
+ key: copyFields
@@ -1,22 +1,51 @@
1
1
  require 'rom-http'
2
+ require 'securerandom'
2
3
 
3
- require_relative 'solr/request'
4
- require_relative 'solr/response'
4
+ module ROM
5
+ module Solr
6
+
7
+ def self.dataset_class(name)
8
+ prefix = name.to_s.split(/[_\/]/).map(&:capitalize).join('')
9
+ const_name = "#{prefix}Dataset"
10
+ const_defined?(const_name, false) ? const_get(const_name, false) : Dataset
11
+ end
12
+
13
+ module Types
14
+ include ROM::HTTP::Types
15
+ end
16
+
17
+ UUID = Types::String.default { SecureRandom.uuid }
18
+
19
+ end
20
+ end
5
21
 
22
+ # Utilities
23
+ require_relative 'solr/array'
24
+
25
+ # Handlers
26
+ require_relative 'solr/request_handler'
27
+ require_relative 'solr/response_handler'
28
+
29
+ # Datasets
6
30
  require_relative 'solr/dataset'
7
- require_relative 'solr/datasets/select_dataset'
31
+ require_relative 'solr/documents_dataset'
32
+ require_relative 'solr/schema_info_dataset'
8
33
 
34
+ # Gateway
9
35
  require_relative 'solr/gateway'
10
36
 
11
- require_relative 'solr/schemaless'
37
+ # Schemas
38
+ require_relative 'solr/schema'
12
39
 
40
+ # Relations
13
41
  require_relative 'solr/relation'
14
- require_relative 'solr/relations/schema_relation'
15
- require_relative 'solr/relations/select_relation'
16
42
 
17
- module ROM
18
- module Solr
19
- end
43
+ # Repositories
44
+ require_relative 'solr/repository'
45
+ require_relative 'solr/schema_info_repo'
46
+ require_relative 'solr/document_repo'
20
47
 
21
- register_adapter(:solr, ROM::Solr)
22
- end
48
+ # Commands
49
+ require_relative 'solr/commands'
50
+
51
+ ROM.register_adapter(:solr, ROM::Solr)
File without changes
@@ -0,0 +1,17 @@
1
+ module ROM
2
+ module Solr
3
+ module Commands
4
+ class Create < ROM::Commands::Create
5
+ adapter :solr
6
+ end
7
+
8
+ class Update < ROM::Commands::Update
9
+ adapter :solr
10
+ end
11
+
12
+ class Delete < ROM::Commands::Delete
13
+ adapter :solr
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ module ROM
2
+ module Solr
3
+ module Commands
4
+ class CreateDocuments < Create
5
+
6
+ relation :documents
7
+
8
+ def execute(docs)
9
+ relation.insert(docs)
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module ROM
2
+ module Solr
3
+ module Commands
4
+ class DeleteDocuments < Delete
5
+
6
+ relation :documents
7
+
8
+ def execute(docs)
9
+ relation.delete(docs)
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module ROM
2
+ module Solr
3
+ module Commands
4
+ class DeleteDocumentsByQuery < Delete
5
+
6
+ relation :documents
7
+
8
+ def execute(query)
9
+ relation.delete_by_query(query).response
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module ROM
2
+ module Solr
3
+ module Commands
4
+ class UpdateDocuments < Update
5
+
6
+ relation :documents
7
+
8
+ def execute(docs)
9
+ relation.update(docs)
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+ end
@@ -2,60 +2,42 @@ module ROM
2
2
  module Solr
3
3
  class Dataset < ROM::HTTP::Dataset
4
4
 
5
- # Key or array of keys to pass to response.dig(*keys)
6
- # for enumeration of the dataset values.
7
- setting :default_enum_on, reader: true
8
- option :enum_on, default: ->{ self.class.default_enum_on }
9
-
10
- # Default query parameters
11
- setting :default_params, EMPTY_HASH, reader: true
12
- option :params, type: Types::Hash, default: ->{ self.class.default_params }
13
-
14
- # Request and response handlers
15
- config.default_response_handler = Response
16
- config.default_request_handler = Request
17
-
18
- # @override Handles multiple path segments and nils
19
- def with_path(segments)
20
- s = Array.wrap(segments)
21
- return self if s.empty?
22
- with_options(path: s.compact.join('/'))
23
- end
5
+ setting :default_response_key, reader: true
6
+ setting :default_content_type, reader: true
7
+ setting :default_base_path, reader: true
24
8
 
25
- def with_enum_on(keys)
26
- k = Array.wrap(keys)
27
- return self if k.empty?
28
- with_options(enum_on: k)
9
+ configure do |config|
10
+ config.default_response_handler = ResponseHandler
11
+ config.default_request_handler = RequestHandler
29
12
  end
30
13
 
31
- # Coerce param value to an Array and set new value
32
- # to set union with other Array of values.
33
- def add_param_values(key, val)
34
- new_val = Array.wrap(params[key]) | Array.wrap(val)
35
- add_params(key => new_val)
14
+ option :response_key, default: proc { self.class.default_response_key }
15
+ option :request_data, type: Types::String, default: proc { EMPTY_STRING }
16
+ option :content_type, type: Types::String, default: proc { self.class.default_content_type }
17
+ option :base_path, type: Types::Path, default: proc { self.class.default_base_path || EMPTY_STRING }
18
+
19
+ # @override Query parameters are valid with POST, too.
20
+ def uri
21
+ uri_s = [options[:uri], path].compact.reject(&:empty?).join('/')
22
+
23
+ URI(uri_s).tap do |u|
24
+ u.query = param_encoder.call(params) if has_params?
25
+ end
36
26
  end
37
27
 
38
28
  # @override
39
- def add_params(new_params = {})
40
- return self if new_params.nil? || new_params.empty?
41
- with_params params.merge(new_params).compact
42
- end
29
+ def each(&block)
30
+ return to_enum unless block_given?
43
31
 
44
- def default_params(defaults = {})
45
- with_params defaults.merge(params)
32
+ enumerable_data.each(&block)
46
33
  end
47
34
 
48
- # @override Seems good to have no-op when params not changed?
49
- def with_params(new_params)
50
- if params == new_params
51
- self
52
- else
53
- with_options(params: new_params)
54
- end
35
+ def with_request_data(data)
36
+ with_options(request_data: data)
55
37
  end
56
38
 
57
- def param?(key)
58
- params.key?(key)
39
+ def with_response_key(*path)
40
+ with_options(response_key: path)
59
41
  end
60
42
 
61
43
  # Copies and makes private superclass #response method
@@ -67,23 +49,20 @@ module ROM
67
49
  cache.fetch_or_store(:response) { __response__ }
68
50
  end
69
51
 
70
- # @override
71
- def each(&block)
72
- return to_enum unless block_given?
73
- enumerable_response.each(&block)
52
+ def has_request_data?
53
+ !request_data.nil? && !request_data.empty?
74
54
  end
75
55
 
76
- def enumerable_response
77
- if options[:enum_on].nil?
78
- Array.wrap(response)
79
- else
80
- keys = Array.wrap options[:enum_on]
81
- Array.wrap response.dig(*keys)
82
- end
56
+ def has_params?
57
+ params.any?
83
58
  end
84
59
 
85
60
  private
86
61
 
62
+ def enumerable_data
63
+ Array.wrap(response_key ? response.dig(*response_key) : response)
64
+ end
65
+
87
66
  def cache
88
67
  @cache ||= Concurrent::Map.new
89
68
  end
@@ -0,0 +1,33 @@
1
+ module ROM
2
+ module Solr
3
+ class DocumentRepo < Repository[:documents]
4
+
5
+ auto_struct false
6
+
7
+ def find(id)
8
+ documents.by_unique_key(id).one!
9
+ end
10
+
11
+ def search
12
+ documents
13
+ end
14
+
15
+ def all
16
+ documents.all
17
+ end
18
+
19
+ def create(docs)
20
+ documents.command(:create_documents).call(docs)
21
+ end
22
+
23
+ def delete(docs)
24
+ documents.command(:delete_documents).call(docs)
25
+ end
26
+
27
+ def update(docs)
28
+ documents.command(:update_documents).call(docs)
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,12 @@
1
+ module ROM
2
+ module Solr
3
+ class DocumentsDataset < Dataset
4
+
5
+ configure do |config|
6
+ config.default_response_key = [:response, :docs]
7
+ config.default_base_path = 'select'
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -4,20 +4,9 @@ module ROM
4
4
 
5
5
  adapter :solr
6
6
 
7
- def initialize(config = {})
8
- config[:uri] ||= ENV.fetch('SOLR_URL', 'http://localhost:8983/solr')
9
- config[:headers] ||= { Accept: 'application/json' }
10
- super
11
- end
12
-
7
+ # @override
13
8
  def dataset(name)
14
- dataset_class(name).new config.merge(base_path: name)
15
- end
16
-
17
- def dataset_class(name)
18
- prefix = name.to_s.split(/_/).map(&:capitalize).join('')
19
- const_name = "#{prefix}Dataset"
20
- ROM::Solr.const_defined?(const_name, false) ? ROM::Solr.const_get(const_name, false) : Dataset
9
+ ROM::Solr.dataset_class(name).new(config)
21
10
  end
22
11
 
23
12
  end