solrbee 0.3.0 → 0.4.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 (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
@@ -0,0 +1,56 @@
1
+ require 'delegate'
2
+
3
+ module ROM
4
+ module Solr
5
+ #
6
+ # Wraps a DocumentsDataset to provide pagination with a cursor.
7
+ #
8
+ class SelectCursor < SimpleDelegator
9
+
10
+ def initialize(dataset)
11
+ params = { cursorMark: '*' }
12
+
13
+ # Sort must include a sort on unique key (id).
14
+ sort = dataset.params[:sort]
15
+ unless /\bid\b/ =~ sort
16
+ params[:sort] = Array.wrap(sort).append('id ASC').join(',')
17
+ end
18
+
19
+ super dataset.add_params(params)
20
+ end
21
+
22
+ def each(&block)
23
+ return to_enum unless block_given?
24
+
25
+ while true
26
+ __getobj__.each(&block)
27
+
28
+ break if last_page?
29
+
30
+ move_cursor
31
+ end
32
+ end
33
+
34
+ def cursor_mark
35
+ params[:cursorMark]
36
+ end
37
+
38
+ def next_cursor_mark
39
+ response[:nextCursorMark]
40
+ end
41
+
42
+ def last_page?
43
+ cursor_mark == next_cursor_mark
44
+ end
45
+
46
+ def move_cursor
47
+ __setobj__(next_page)
48
+ end
49
+
50
+ def next_page
51
+ __getobj__.add_params(cursorMark: next_cursor_mark)
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -1,39 +1,28 @@
1
1
  require "solrbee/version"
2
- require "solrbee/array"
2
+
3
3
  require "rom/solr"
4
4
 
5
5
  module Solrbee
6
6
 
7
- # Factory method
8
- #
9
- # @return [ROM::Solr::Gateway] a gateway instance
10
- def self.gateway
11
- ROM::Gateway.setup(:solr)
12
- end
7
+ DEFAULT_URI = ENV.fetch('SOLR_URL', 'http://localhost:8983/solr').freeze
13
8
 
14
- # Factory method
15
- #
16
- # @return [Solrbee::Documents] a ROM relation for searching
17
9
  def self.documents
18
- container.relations[:search]
10
+ ROM::Solr::DocumentRepo.new(container)
19
11
  end
20
12
 
21
- def self.schema
22
- container.relations[:schema_info]
13
+ def self.schema_info
14
+ ROM::Solr::SchemaInfoRepo.new(container)
23
15
  end
24
16
 
25
- # @return [ROM::Configuration] configuration
26
- def self.config
27
- @config ||= ROM::Configuration.new(:solr) do |config|
28
- config.register_relation(
29
- ROM::Solr::SelectRelation,
30
- ROM::Solr::SchemaRelation
17
+ def self.container(uri: DEFAULT_URI)
18
+ ROM.container(:solr, uri: uri) do |config|
19
+ config.auto_registration(
20
+ File.expand_path('../rom/solr/', __FILE__),
21
+ namespace: 'ROM::Solr'
31
22
  )
32
- end
33
- end
34
23
 
35
- def self.container
36
- ROM.container(config)
24
+ yield config if block_given?
25
+ end
37
26
  end
38
27
 
39
28
  end
@@ -1,3 +1,3 @@
1
1
  module Solrbee
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -22,7 +22,6 @@ 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"
26
25
  spec.add_dependency "rom"
27
26
  spec.add_dependency "rom-http"
28
27
 
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,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solrbee
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.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-18 00:00:00.000000000 Z
11
+ date: 2020-12-31 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: hashie
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
13
  - !ruby/object:Gem::Dependency
28
14
  name: rom
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -126,21 +112,30 @@ files:
126
112
  - bin/setup
127
113
  - config/api.yml
128
114
  - lib/rom/solr.rb
115
+ - lib/rom/solr/array.rb
116
+ - lib/rom/solr/commands.rb
117
+ - lib/rom/solr/commands/create_documents.rb
118
+ - lib/rom/solr/commands/delete_documents.rb
119
+ - lib/rom/solr/commands/delete_documents_by_query.rb
120
+ - lib/rom/solr/commands/update_documents.rb
129
121
  - lib/rom/solr/dataset.rb
130
- - lib/rom/solr/datasets/select_dataset.rb
122
+ - lib/rom/solr/document_repo.rb
123
+ - lib/rom/solr/documents_dataset.rb
131
124
  - lib/rom/solr/gateway.rb
132
- - lib/rom/solr/paginated_dataset.rb
133
125
  - lib/rom/solr/relation.rb
134
- - lib/rom/solr/relations/schema_relation.rb
135
- - lib/rom/solr/relations/select_relation.rb
136
- - lib/rom/solr/request.rb
137
- - lib/rom/solr/response.rb
126
+ - lib/rom/solr/relations/documents_relation.rb
127
+ - lib/rom/solr/relations/schema_info_relation.rb
128
+ - lib/rom/solr/repository.rb
129
+ - lib/rom/solr/request_handler.rb
130
+ - lib/rom/solr/response_handler.rb
138
131
  - lib/rom/solr/schema.rb
139
- - lib/rom/solr/schemaless.rb
132
+ - lib/rom/solr/schema_info_dataset.rb
133
+ - lib/rom/solr/schema_info_repo.rb
134
+ - lib/rom/solr/select_cursor.rb
140
135
  - lib/solrbee.rb
141
- - lib/solrbee/array.rb
142
136
  - lib/solrbee/version.rb
143
137
  - solrbee.gemspec
138
+ - test.sh
144
139
  homepage: https://github.com/dchandekstark/solrbee
145
140
  licenses:
146
141
  - MIT
@@ -1,53 +0,0 @@
1
- module ROM
2
- module Solr
3
- class SelectDataset < Dataset
4
-
5
- config.default_enum_on = [ 'response', 'docs' ]
6
- config.default_params = { q: '*:*', start: 0, rows: 20, cursorMark: '*', sort: 'id ASC' }
7
-
8
- # @override
9
- def each
10
- while true
11
- enumerable_response.each { |doc| yield(doc) }
12
- break if last_page?
13
- update_cursor_mark
14
- end
15
- end
16
-
17
- def num_found
18
- response.dig('response', 'numFound')
19
- end
20
-
21
- def cursor_mark
22
- params[:cursorMark]
23
- end
24
-
25
- def next_cursor_mark
26
- response['nextCursorMark']
27
- end
28
-
29
- def page_size
30
- params[:rows]
31
- end
32
-
33
- def last_cursor?
34
- cursor_mark == next_cursor_mark
35
- end
36
-
37
- def one_page?
38
- num_found <= page_size
39
- end
40
-
41
- def last_page?
42
- one_page? || last_cursor?
43
- end
44
-
45
- private
46
-
47
- def update_cursor_mark
48
- add_params(cursorMark: next_cursor_mark)
49
- end
50
-
51
- end
52
- end
53
- end
@@ -1,62 +0,0 @@
1
- module ROM
2
- module Solr
3
- class PaginatedDataset
4
-
5
- attr_reader :dataset
6
-
7
- def initialize(dataset)
8
- ds = dataset
9
- .default_params(rows: 20)
10
- .remove_params(:start)
11
- .add_params(cursorMark: '*')
12
-
13
- if ds.param?(:sort)
14
- unless ds.params[:sort] =~ /\bid\b/
15
- ds = ds.sort('%{sort},id ASC' % ds.params)
16
- end
17
- else
18
- ds = ds.sort('id ASC')
19
- end
20
-
21
- @dataset = ds
22
- end
23
-
24
- def each
25
- while true
26
- yield dataset
27
- break if last_page?
28
- @dataset = dataset.add_params(cursorMark: next_cursor_mark)
29
- end
30
- end
31
-
32
- def cursor_mark
33
- dataset.params[:cursorMark]
34
- end
35
-
36
- def next_cursor_mark
37
- dataset.response['nextCursorMark']
38
- end
39
-
40
- def page_size
41
- dataset.params[:rows]
42
- end
43
-
44
- def total_size
45
- dataset.num_found
46
- end
47
-
48
- def last_cursor?
49
- cursor_mark == next_cursor_mark
50
- end
51
-
52
- def one_page?
53
- total_size <= page_size
54
- end
55
-
56
- def last_page?
57
- one_page? || last_cursor?
58
- end
59
-
60
- end
61
- end
62
- end
@@ -1,75 +0,0 @@
1
- module ROM
2
- module Solr
3
- class SchemaRelation < Relation
4
-
5
- schemaless(:schema, as: :schema_info)
6
-
7
- # GET /schema
8
- def info
9
- fetch('schema')
10
- end
11
-
12
- def schema_name
13
- with_path(:name).fetch(:name)
14
- end
15
-
16
- def version
17
- with_path('version').fetch('version')
18
- end
19
-
20
- def unique_key
21
- with_path('uniquekey').fetch('uniqueKey')
22
- end
23
-
24
- def similarity
25
- with_path('similarity').fetch('similarity')
26
- end
27
-
28
- # @param opts [Hash]
29
- def fields(**opts)
30
- default_opts = { showDefaults: true }
31
- with_path('fields')
32
- .with_enum_on('fields')
33
- .add_params(default_opts.merge(opts))
34
- end
35
-
36
- # @param name [String, Symbol] field name
37
- # @param opts [Hash]
38
- def field(name, **opts)
39
- with_path('fields', name)
40
- .add_params(opts)
41
- .fetch('field')
42
- end
43
-
44
- # @param opts [Hash]
45
- def field_types(**opts)
46
- with_path('fieldtypes')
47
- .with_enum_on('fieldTypes')
48
- .add_params(opts)
49
- end
50
-
51
- # @param name [String, Symbol] field type name
52
- # @param opts [Hash]
53
- def field_type(name, **opts)
54
- with_path('fieldtypes', name).add_params(opts).fetch('fieldType')
55
- end
56
-
57
- # @param opts [Hash]
58
- def dynamic_fields(**opts)
59
- with_path('dynamicfields').with_enum_on('dynamicFields').add_params(opts)
60
- end
61
-
62
- # @param name [String, Symbol] dynamic field name
63
- # @param opts [Hash]
64
- def dynamic_field(name, **opts)
65
- with_path('dynamicfields', name).add_params(opts).fetch('dynamicField')
66
- end
67
-
68
- # @param opts [Hash]
69
- def copy_fields(**opts)
70
- with_path('copyfields').with_enum_on('copyFields').add_params(opts)
71
- end
72
-
73
- end
74
- end
75
- end
@@ -1,43 +0,0 @@
1
- module ROM
2
- module Solr
3
- class SelectRelation < Relation
4
-
5
- schemaless :select, as: :search
6
-
7
- def filter(*fq)
8
- add_param_values(:fq, fq)
9
- end
10
- alias_method :fq, :filter
11
-
12
- def query(q)
13
- add_params(q: q)
14
- end
15
- alias_method :q, :query
16
-
17
- def fields(*fl)
18
- add_params(fl: fl)
19
- end
20
- alias_method :fl, :fields
21
-
22
- def start(offset)
23
- add_params(start: offset.to_i)
24
- end
25
- alias_method :offset, :start
26
-
27
- def rows(limit)
28
- add_params(rows: limit.to_i)
29
- end
30
- alias_method :limit, :rows
31
-
32
- def sort(crit)
33
- add_params(sort: crit)
34
- end
35
-
36
- # @override Don't have to enumerate to get count (may not be exact)
37
- def count
38
- dataset.num_found
39
- end
40
-
41
- end
42
- end
43
- end