graphql-searchkick 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +28 -1
- data/Guardfile +42 -0
- data/README.md +58 -5
- data/bin/setup +1 -2
- data/gemfiles/graphql_1.10.gemfile.lock +37 -0
- data/gemfiles/graphql_1.8.gemfile.lock +37 -0
- data/gemfiles/graphql_1.9.gemfile.lock +37 -0
- data/gemfiles/searchkick_3.0.gemfile.lock +37 -0
- data/gemfiles/searchkick_4.0.gemfile.lock +37 -0
- data/graphql-searchkick.gemspec +2 -0
- data/lib/graphql/searchkick/lazy_search.rb +16 -6
- data/lib/graphql/searchkick/result_connection.rb +23 -132
- data/lib/graphql/searchkick/version.rb +1 -1
- metadata +31 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4fee00e8a9d4edbe1018df1d8982027893e187fb27badc7e09e7f73e47d132db
|
4
|
+
data.tar.gz: 901185c3a8834928539f8f2fcb310e9b5653b3e8cc896115dab20bad88f04784
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd780c7d95f84876a8d4d50b6852e34f14d947ce305895fbbd6c953861ec931abbe29d4da721b2760a571d7f4ee4606c7fd5c217fa7f36ad55c49fd940b7e564
|
7
|
+
data.tar.gz: a03fa9e8472e1da6e89af95a12d95d7e3d901d7438cc5cf0fb8f17270216154f582dbc14380acad0023ebff0e9892627a824a5f5c5641d13654bc26d1d79a380
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,6 +1,33 @@
|
|
1
1
|
---
|
2
|
+
dist: bionic
|
2
3
|
language: ruby
|
4
|
+
gemfile:
|
5
|
+
- Gemfile
|
3
6
|
cache: bundler
|
4
7
|
rvm:
|
5
8
|
- 2.5.7
|
6
|
-
|
9
|
+
script: bundle exec rake spec
|
10
|
+
before_install:
|
11
|
+
- gem install bundler -v 2.1.4
|
12
|
+
- sudo apt-get install libsqlite3-dev
|
13
|
+
- bundle install
|
14
|
+
- ./spec/ci/install_elasticsearch.sh
|
15
|
+
cache:
|
16
|
+
directories:
|
17
|
+
- $HOME/elasticsearch
|
18
|
+
jdk: openjdk10
|
19
|
+
env:
|
20
|
+
- ELASTICSEARCH_VERSION=7.6.1
|
21
|
+
jobs:
|
22
|
+
include:
|
23
|
+
- rvm: 2.5
|
24
|
+
gemfile: gemfiles/graphql_1.8.gemfile
|
25
|
+
- rvm: 2.5
|
26
|
+
gemfile: gemfiles/graphql_1.9.gemfile
|
27
|
+
- rvm: 2.5
|
28
|
+
gemfile: gemfiles/graphql_1.10.gemfile
|
29
|
+
- rvm: 2.5
|
30
|
+
gemfile: gemfiles/searchkick_3.0.gemfile
|
31
|
+
env: ELASTICSEARCH_VERSION=6.8.7
|
32
|
+
- rvm: 2.5
|
33
|
+
gemfile: gemfiles/searchkick_4.0.gemfile
|
data/Guardfile
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
## Uncomment and set this to only include directories you want to watch
|
5
|
+
# directories %w(app lib config test spec features) \
|
6
|
+
# .select{|d| Dir.exist?(d) ? d : UI.warning("Directory #{d} does not exist")}
|
7
|
+
|
8
|
+
## Note: if you are using the `directories` clause above and you are not
|
9
|
+
## watching the project directory ('.'), then you will want to move
|
10
|
+
## the Guardfile to a watched dir and symlink it back, e.g.
|
11
|
+
#
|
12
|
+
# $ mkdir config
|
13
|
+
# $ mv Guardfile config/
|
14
|
+
# $ ln -s config/Guardfile .
|
15
|
+
#
|
16
|
+
# and, you'll have to watch "config/Guardfile" instead of "Guardfile"
|
17
|
+
|
18
|
+
# Note: The cmd option is now required due to the increasing number of ways
|
19
|
+
# rspec may be run, below are examples of the most common uses.
|
20
|
+
# * bundler: 'bundle exec rspec'
|
21
|
+
# * bundler binstubs: 'bin/rspec'
|
22
|
+
# * spring: 'bin/rspec' (This will use spring if running and you have
|
23
|
+
# installed the spring binstubs per the docs)
|
24
|
+
# * zeus: 'zeus rspec' (requires the server to be started separately)
|
25
|
+
# * 'just' rspec: 'rspec'
|
26
|
+
|
27
|
+
guard :rspec, cmd: "bundle exec rspec" do
|
28
|
+
require "guard/rspec/dsl"
|
29
|
+
dsl = Guard::RSpec::Dsl.new(self)
|
30
|
+
|
31
|
+
# Feel free to open issues for suggestions and improvements
|
32
|
+
|
33
|
+
# RSpec files
|
34
|
+
rspec = dsl.rspec
|
35
|
+
watch(rspec.spec_helper) { rspec.spec_dir }
|
36
|
+
watch(rspec.spec_support) { rspec.spec_dir }
|
37
|
+
watch(rspec.spec_files)
|
38
|
+
|
39
|
+
# Ruby files
|
40
|
+
ruby = dsl.ruby
|
41
|
+
dsl.watch_spec_files_for(ruby.lib_files)
|
42
|
+
end
|
data/README.md
CHANGED
@@ -1,10 +1,21 @@
|
|
1
1
|
# Graphql::Searchkick
|
2
2
|
|
3
|
+
Integrate Searchkick with GraphQL Connections easily.
|
4
|
+
|
5
|
+
[](https://badge.fury.io/rb/graphql-searchkick)
|
6
|
+
[](https://travis-ci.org/CompanyCam/graphql-searchkick)
|
3
7
|
[](https://codeclimate.com/github/CompanyCam/graphql-searchkick/maintainability)
|
4
8
|
|
5
|
-
|
9
|
+
## Note
|
10
|
+
|
11
|
+
The current version of the gem only works with `GraphQL::Relay::BaseConnection` and descendants. If you need support for `GraphQL::Pagination::Connection` feel free to open an issue or create a PR.
|
12
|
+
|
13
|
+
## Considerations & Limits
|
6
14
|
|
7
|
-
|
15
|
+
- This will run _every_ usage of this field through Searchkick.
|
16
|
+
- The current implementation doesn't support suggestions or aggregations.
|
17
|
+
|
18
|
+
If you find any of these undesirable, open an issue or PR.
|
8
19
|
|
9
20
|
## Installation
|
10
21
|
|
@@ -22,19 +33,61 @@ Or install it yourself as:
|
|
22
33
|
|
23
34
|
$ gem install graphql-searchkick
|
24
35
|
|
36
|
+
## Setup
|
37
|
+
|
38
|
+
Include the field integration into your field class.
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
class BaseField < GraphQL::Schema::Field
|
42
|
+
include GraphQL::Searchkick::FieldIntegration
|
43
|
+
end
|
44
|
+
```
|
45
|
+
|
25
46
|
## Usage
|
26
47
|
|
27
|
-
|
48
|
+
Add `search: ModelClass` to any connection field that you want to allow querying.
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
field :projects, Types::ProjectType.connection_type, null: false, search: Project
|
52
|
+
```
|
53
|
+
|
54
|
+
Your field will now have an optional `query` argument of type `String` as part of it's definition.
|
55
|
+
|
56
|
+
If `query` is `nil?` or `empty?` the default value `'*'` is used.
|
57
|
+
|
58
|
+
### Search Arguments
|
59
|
+
|
60
|
+
If you would like to pass options to the `search` method, override the resolver for the field that returns a `Hash`.
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
def projects(arguments)
|
64
|
+
{
|
65
|
+
where: {
|
66
|
+
active: arguments[:active],
|
67
|
+
coordinates: {
|
68
|
+
near: arguments[:coords],
|
69
|
+
within: '1km'
|
70
|
+
}
|
71
|
+
}
|
72
|
+
}
|
73
|
+
end
|
74
|
+
```
|
75
|
+
|
76
|
+
This will translate into:
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
Project.search('*', where: { active: true, coordinates: { near: { lat: 40.815110, lon: -96.709523 }, within: '1km' } })
|
80
|
+
```
|
28
81
|
|
29
82
|
## Development
|
30
83
|
|
31
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
84
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then run `docker-compose up` to start Elasticsearch. Finally, run `bundle exec appraisal rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
32
85
|
|
33
86
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
34
87
|
|
35
88
|
## Contributing
|
36
89
|
|
37
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
90
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/CompanyCam/graphql-searchkick.
|
38
91
|
|
39
92
|
## License
|
40
93
|
|
data/bin/setup
CHANGED
@@ -25,6 +25,7 @@ GEM
|
|
25
25
|
thor (>= 0.14.0)
|
26
26
|
codeclimate-test-reporter (1.0.9)
|
27
27
|
simplecov (<= 0.13)
|
28
|
+
coderay (1.1.2)
|
28
29
|
concurrent-ruby (1.1.6)
|
29
30
|
diff-lcs (1.3)
|
30
31
|
docile (1.1.5)
|
@@ -38,15 +39,47 @@ GEM
|
|
38
39
|
multi_json
|
39
40
|
faraday (0.17.3)
|
40
41
|
multipart-post (>= 1.2, < 3)
|
42
|
+
ffi (1.12.2)
|
43
|
+
formatador (0.2.5)
|
41
44
|
graphql (1.10.5)
|
45
|
+
guard (2.16.2)
|
46
|
+
formatador (>= 0.2.4)
|
47
|
+
listen (>= 2.7, < 4.0)
|
48
|
+
lumberjack (>= 1.0.12, < 2.0)
|
49
|
+
nenv (~> 0.1)
|
50
|
+
notiffany (~> 0.0)
|
51
|
+
pry (>= 0.9.12)
|
52
|
+
shellany (~> 0.0)
|
53
|
+
thor (>= 0.18.1)
|
54
|
+
guard-compat (1.2.1)
|
55
|
+
guard-rspec (4.7.3)
|
56
|
+
guard (~> 2.1)
|
57
|
+
guard-compat (~> 1.1)
|
58
|
+
rspec (>= 2.99.0, < 4.0)
|
42
59
|
hashie (3.6.0)
|
43
60
|
i18n (1.8.2)
|
44
61
|
concurrent-ruby (~> 1.0)
|
45
62
|
json (2.3.0)
|
63
|
+
listen (3.1.5)
|
64
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
65
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
66
|
+
ruby_dep (~> 1.2)
|
67
|
+
lumberjack (1.2.4)
|
68
|
+
method_source (1.0.0)
|
46
69
|
minitest (5.14.0)
|
47
70
|
multi_json (1.14.1)
|
48
71
|
multipart-post (2.1.1)
|
72
|
+
nenv (0.3.0)
|
73
|
+
notiffany (0.1.3)
|
74
|
+
nenv (~> 0.1)
|
75
|
+
shellany (~> 0.0)
|
76
|
+
pry (0.13.1)
|
77
|
+
coderay (~> 1.1)
|
78
|
+
method_source (~> 1.0)
|
49
79
|
rake (12.3.3)
|
80
|
+
rb-fsevent (0.10.4)
|
81
|
+
rb-inotify (0.10.1)
|
82
|
+
ffi (~> 1.0)
|
50
83
|
rspec (3.8.0)
|
51
84
|
rspec-core (~> 3.8.0)
|
52
85
|
rspec-expectations (~> 3.8.0)
|
@@ -60,10 +93,12 @@ GEM
|
|
60
93
|
diff-lcs (>= 1.2.0, < 2.0)
|
61
94
|
rspec-support (~> 3.8.0)
|
62
95
|
rspec-support (3.8.0)
|
96
|
+
ruby_dep (1.5.0)
|
63
97
|
searchkick (4.3.0)
|
64
98
|
activemodel (>= 5)
|
65
99
|
elasticsearch (>= 6)
|
66
100
|
hashie
|
101
|
+
shellany (0.0.1)
|
67
102
|
simplecov (0.13.0)
|
68
103
|
docile (~> 1.1.0)
|
69
104
|
json (>= 1.8, < 3)
|
@@ -85,6 +120,8 @@ DEPENDENCIES
|
|
85
120
|
codeclimate-test-reporter
|
86
121
|
graphql (~> 1.10)
|
87
122
|
graphql-searchkick!
|
123
|
+
guard
|
124
|
+
guard-rspec
|
88
125
|
rake (~> 12.0)
|
89
126
|
rspec (~> 3.0)
|
90
127
|
sqlite3
|
@@ -25,6 +25,7 @@ GEM
|
|
25
25
|
thor (>= 0.14.0)
|
26
26
|
codeclimate-test-reporter (1.0.9)
|
27
27
|
simplecov (<= 0.13)
|
28
|
+
coderay (1.1.2)
|
28
29
|
concurrent-ruby (1.1.6)
|
29
30
|
diff-lcs (1.3)
|
30
31
|
docile (1.1.5)
|
@@ -38,15 +39,47 @@ GEM
|
|
38
39
|
multi_json
|
39
40
|
faraday (0.17.3)
|
40
41
|
multipart-post (>= 1.2, < 3)
|
42
|
+
ffi (1.12.2)
|
43
|
+
formatador (0.2.5)
|
41
44
|
graphql (1.10.5)
|
45
|
+
guard (2.16.2)
|
46
|
+
formatador (>= 0.2.4)
|
47
|
+
listen (>= 2.7, < 4.0)
|
48
|
+
lumberjack (>= 1.0.12, < 2.0)
|
49
|
+
nenv (~> 0.1)
|
50
|
+
notiffany (~> 0.0)
|
51
|
+
pry (>= 0.9.12)
|
52
|
+
shellany (~> 0.0)
|
53
|
+
thor (>= 0.18.1)
|
54
|
+
guard-compat (1.2.1)
|
55
|
+
guard-rspec (4.7.3)
|
56
|
+
guard (~> 2.1)
|
57
|
+
guard-compat (~> 1.1)
|
58
|
+
rspec (>= 2.99.0, < 4.0)
|
42
59
|
hashie (3.6.0)
|
43
60
|
i18n (1.8.2)
|
44
61
|
concurrent-ruby (~> 1.0)
|
45
62
|
json (2.3.0)
|
63
|
+
listen (3.1.5)
|
64
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
65
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
66
|
+
ruby_dep (~> 1.2)
|
67
|
+
lumberjack (1.2.4)
|
68
|
+
method_source (1.0.0)
|
46
69
|
minitest (5.14.0)
|
47
70
|
multi_json (1.14.1)
|
48
71
|
multipart-post (2.1.1)
|
72
|
+
nenv (0.3.0)
|
73
|
+
notiffany (0.1.3)
|
74
|
+
nenv (~> 0.1)
|
75
|
+
shellany (~> 0.0)
|
76
|
+
pry (0.13.1)
|
77
|
+
coderay (~> 1.1)
|
78
|
+
method_source (~> 1.0)
|
49
79
|
rake (12.3.3)
|
80
|
+
rb-fsevent (0.10.4)
|
81
|
+
rb-inotify (0.10.1)
|
82
|
+
ffi (~> 1.0)
|
50
83
|
rspec (3.8.0)
|
51
84
|
rspec-core (~> 3.8.0)
|
52
85
|
rspec-expectations (~> 3.8.0)
|
@@ -60,10 +93,12 @@ GEM
|
|
60
93
|
diff-lcs (>= 1.2.0, < 2.0)
|
61
94
|
rspec-support (~> 3.8.0)
|
62
95
|
rspec-support (3.8.0)
|
96
|
+
ruby_dep (1.5.0)
|
63
97
|
searchkick (4.3.0)
|
64
98
|
activemodel (>= 5)
|
65
99
|
elasticsearch (>= 6)
|
66
100
|
hashie
|
101
|
+
shellany (0.0.1)
|
67
102
|
simplecov (0.13.0)
|
68
103
|
docile (~> 1.1.0)
|
69
104
|
json (>= 1.8, < 3)
|
@@ -85,6 +120,8 @@ DEPENDENCIES
|
|
85
120
|
codeclimate-test-reporter
|
86
121
|
graphql (~> 1.8)
|
87
122
|
graphql-searchkick!
|
123
|
+
guard
|
124
|
+
guard-rspec
|
88
125
|
rake (~> 12.0)
|
89
126
|
rspec (~> 3.0)
|
90
127
|
sqlite3
|
@@ -25,6 +25,7 @@ GEM
|
|
25
25
|
thor (>= 0.14.0)
|
26
26
|
codeclimate-test-reporter (1.0.9)
|
27
27
|
simplecov (<= 0.13)
|
28
|
+
coderay (1.1.2)
|
28
29
|
concurrent-ruby (1.1.6)
|
29
30
|
diff-lcs (1.3)
|
30
31
|
docile (1.1.5)
|
@@ -38,15 +39,47 @@ GEM
|
|
38
39
|
multi_json
|
39
40
|
faraday (0.17.3)
|
40
41
|
multipart-post (>= 1.2, < 3)
|
42
|
+
ffi (1.12.2)
|
43
|
+
formatador (0.2.5)
|
41
44
|
graphql (1.10.5)
|
45
|
+
guard (2.16.2)
|
46
|
+
formatador (>= 0.2.4)
|
47
|
+
listen (>= 2.7, < 4.0)
|
48
|
+
lumberjack (>= 1.0.12, < 2.0)
|
49
|
+
nenv (~> 0.1)
|
50
|
+
notiffany (~> 0.0)
|
51
|
+
pry (>= 0.9.12)
|
52
|
+
shellany (~> 0.0)
|
53
|
+
thor (>= 0.18.1)
|
54
|
+
guard-compat (1.2.1)
|
55
|
+
guard-rspec (4.7.3)
|
56
|
+
guard (~> 2.1)
|
57
|
+
guard-compat (~> 1.1)
|
58
|
+
rspec (>= 2.99.0, < 4.0)
|
42
59
|
hashie (3.6.0)
|
43
60
|
i18n (1.8.2)
|
44
61
|
concurrent-ruby (~> 1.0)
|
45
62
|
json (2.3.0)
|
63
|
+
listen (3.1.5)
|
64
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
65
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
66
|
+
ruby_dep (~> 1.2)
|
67
|
+
lumberjack (1.2.4)
|
68
|
+
method_source (1.0.0)
|
46
69
|
minitest (5.14.0)
|
47
70
|
multi_json (1.14.1)
|
48
71
|
multipart-post (2.1.1)
|
72
|
+
nenv (0.3.0)
|
73
|
+
notiffany (0.1.3)
|
74
|
+
nenv (~> 0.1)
|
75
|
+
shellany (~> 0.0)
|
76
|
+
pry (0.13.1)
|
77
|
+
coderay (~> 1.1)
|
78
|
+
method_source (~> 1.0)
|
49
79
|
rake (12.3.3)
|
80
|
+
rb-fsevent (0.10.4)
|
81
|
+
rb-inotify (0.10.1)
|
82
|
+
ffi (~> 1.0)
|
50
83
|
rspec (3.8.0)
|
51
84
|
rspec-core (~> 3.8.0)
|
52
85
|
rspec-expectations (~> 3.8.0)
|
@@ -60,10 +93,12 @@ GEM
|
|
60
93
|
diff-lcs (>= 1.2.0, < 2.0)
|
61
94
|
rspec-support (~> 3.8.0)
|
62
95
|
rspec-support (3.8.0)
|
96
|
+
ruby_dep (1.5.0)
|
63
97
|
searchkick (4.3.0)
|
64
98
|
activemodel (>= 5)
|
65
99
|
elasticsearch (>= 6)
|
66
100
|
hashie
|
101
|
+
shellany (0.0.1)
|
67
102
|
simplecov (0.13.0)
|
68
103
|
docile (~> 1.1.0)
|
69
104
|
json (>= 1.8, < 3)
|
@@ -85,6 +120,8 @@ DEPENDENCIES
|
|
85
120
|
codeclimate-test-reporter
|
86
121
|
graphql (~> 1.9)
|
87
122
|
graphql-searchkick!
|
123
|
+
guard
|
124
|
+
guard-rspec
|
88
125
|
rake (~> 12.0)
|
89
126
|
rspec (~> 3.0)
|
90
127
|
sqlite3
|
@@ -25,6 +25,7 @@ GEM
|
|
25
25
|
thor (>= 0.14.0)
|
26
26
|
codeclimate-test-reporter (1.0.9)
|
27
27
|
simplecov (<= 0.13)
|
28
|
+
coderay (1.1.2)
|
28
29
|
concurrent-ruby (1.1.6)
|
29
30
|
diff-lcs (1.3)
|
30
31
|
docile (1.1.5)
|
@@ -38,15 +39,47 @@ GEM
|
|
38
39
|
multi_json
|
39
40
|
faraday (1.0.0)
|
40
41
|
multipart-post (>= 1.2, < 3)
|
42
|
+
ffi (1.12.2)
|
43
|
+
formatador (0.2.5)
|
41
44
|
graphql (1.10.5)
|
45
|
+
guard (2.16.2)
|
46
|
+
formatador (>= 0.2.4)
|
47
|
+
listen (>= 2.7, < 4.0)
|
48
|
+
lumberjack (>= 1.0.12, < 2.0)
|
49
|
+
nenv (~> 0.1)
|
50
|
+
notiffany (~> 0.0)
|
51
|
+
pry (>= 0.9.12)
|
52
|
+
shellany (~> 0.0)
|
53
|
+
thor (>= 0.18.1)
|
54
|
+
guard-compat (1.2.1)
|
55
|
+
guard-rspec (4.7.3)
|
56
|
+
guard (~> 2.1)
|
57
|
+
guard-compat (~> 1.1)
|
58
|
+
rspec (>= 2.99.0, < 4.0)
|
42
59
|
hashie (3.6.0)
|
43
60
|
i18n (1.8.2)
|
44
61
|
concurrent-ruby (~> 1.0)
|
45
62
|
json (2.3.0)
|
63
|
+
listen (3.1.5)
|
64
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
65
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
66
|
+
ruby_dep (~> 1.2)
|
67
|
+
lumberjack (1.2.4)
|
68
|
+
method_source (1.0.0)
|
46
69
|
minitest (5.14.0)
|
47
70
|
multi_json (1.14.1)
|
48
71
|
multipart-post (2.1.1)
|
72
|
+
nenv (0.3.0)
|
73
|
+
notiffany (0.1.3)
|
74
|
+
nenv (~> 0.1)
|
75
|
+
shellany (~> 0.0)
|
76
|
+
pry (0.13.1)
|
77
|
+
coderay (~> 1.1)
|
78
|
+
method_source (~> 1.0)
|
49
79
|
rake (12.3.3)
|
80
|
+
rb-fsevent (0.10.4)
|
81
|
+
rb-inotify (0.10.1)
|
82
|
+
ffi (~> 1.0)
|
50
83
|
rspec (3.8.0)
|
51
84
|
rspec-core (~> 3.8.0)
|
52
85
|
rspec-expectations (~> 3.8.0)
|
@@ -60,10 +93,12 @@ GEM
|
|
60
93
|
diff-lcs (>= 1.2.0, < 2.0)
|
61
94
|
rspec-support (~> 3.8.0)
|
62
95
|
rspec-support (3.8.0)
|
96
|
+
ruby_dep (1.5.0)
|
63
97
|
searchkick (3.0.3)
|
64
98
|
activemodel (>= 4.2)
|
65
99
|
elasticsearch (>= 5)
|
66
100
|
hashie
|
101
|
+
shellany (0.0.1)
|
67
102
|
simplecov (0.13.0)
|
68
103
|
docile (~> 1.1.0)
|
69
104
|
json (>= 1.8, < 3)
|
@@ -85,6 +120,8 @@ DEPENDENCIES
|
|
85
120
|
codeclimate-test-reporter
|
86
121
|
elasticsearch (< 6.0)
|
87
122
|
graphql-searchkick!
|
123
|
+
guard
|
124
|
+
guard-rspec
|
88
125
|
rake (~> 12.0)
|
89
126
|
rspec (~> 3.0)
|
90
127
|
searchkick (~> 3.0)
|
@@ -25,6 +25,7 @@ GEM
|
|
25
25
|
thor (>= 0.14.0)
|
26
26
|
codeclimate-test-reporter (1.0.9)
|
27
27
|
simplecov (<= 0.13)
|
28
|
+
coderay (1.1.2)
|
28
29
|
concurrent-ruby (1.1.6)
|
29
30
|
diff-lcs (1.3)
|
30
31
|
docile (1.1.5)
|
@@ -38,15 +39,47 @@ GEM
|
|
38
39
|
multi_json
|
39
40
|
faraday (0.17.3)
|
40
41
|
multipart-post (>= 1.2, < 3)
|
42
|
+
ffi (1.12.2)
|
43
|
+
formatador (0.2.5)
|
41
44
|
graphql (1.10.5)
|
45
|
+
guard (2.16.2)
|
46
|
+
formatador (>= 0.2.4)
|
47
|
+
listen (>= 2.7, < 4.0)
|
48
|
+
lumberjack (>= 1.0.12, < 2.0)
|
49
|
+
nenv (~> 0.1)
|
50
|
+
notiffany (~> 0.0)
|
51
|
+
pry (>= 0.9.12)
|
52
|
+
shellany (~> 0.0)
|
53
|
+
thor (>= 0.18.1)
|
54
|
+
guard-compat (1.2.1)
|
55
|
+
guard-rspec (4.7.3)
|
56
|
+
guard (~> 2.1)
|
57
|
+
guard-compat (~> 1.1)
|
58
|
+
rspec (>= 2.99.0, < 4.0)
|
42
59
|
hashie (3.6.0)
|
43
60
|
i18n (1.8.2)
|
44
61
|
concurrent-ruby (~> 1.0)
|
45
62
|
json (2.3.0)
|
63
|
+
listen (3.1.5)
|
64
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
65
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
66
|
+
ruby_dep (~> 1.2)
|
67
|
+
lumberjack (1.2.4)
|
68
|
+
method_source (1.0.0)
|
46
69
|
minitest (5.14.0)
|
47
70
|
multi_json (1.14.1)
|
48
71
|
multipart-post (2.1.1)
|
72
|
+
nenv (0.3.0)
|
73
|
+
notiffany (0.1.3)
|
74
|
+
nenv (~> 0.1)
|
75
|
+
shellany (~> 0.0)
|
76
|
+
pry (0.13.1)
|
77
|
+
coderay (~> 1.1)
|
78
|
+
method_source (~> 1.0)
|
49
79
|
rake (12.3.3)
|
80
|
+
rb-fsevent (0.10.4)
|
81
|
+
rb-inotify (0.10.1)
|
82
|
+
ffi (~> 1.0)
|
50
83
|
rspec (3.8.0)
|
51
84
|
rspec-core (~> 3.8.0)
|
52
85
|
rspec-expectations (~> 3.8.0)
|
@@ -60,10 +93,12 @@ GEM
|
|
60
93
|
diff-lcs (>= 1.2.0, < 2.0)
|
61
94
|
rspec-support (~> 3.8.0)
|
62
95
|
rspec-support (3.8.0)
|
96
|
+
ruby_dep (1.5.0)
|
63
97
|
searchkick (4.3.0)
|
64
98
|
activemodel (>= 5)
|
65
99
|
elasticsearch (>= 6)
|
66
100
|
hashie
|
101
|
+
shellany (0.0.1)
|
67
102
|
simplecov (0.13.0)
|
68
103
|
docile (~> 1.1.0)
|
69
104
|
json (>= 1.8, < 3)
|
@@ -84,6 +119,8 @@ DEPENDENCIES
|
|
84
119
|
appraisal
|
85
120
|
codeclimate-test-reporter
|
86
121
|
graphql-searchkick!
|
122
|
+
guard
|
123
|
+
guard-rspec
|
87
124
|
rake (~> 12.0)
|
88
125
|
rspec (~> 3.0)
|
89
126
|
searchkick (~> 4.0)
|
data/graphql-searchkick.gemspec
CHANGED
@@ -24,6 +24,8 @@ Gem::Specification.new do |spec|
|
|
24
24
|
|
25
25
|
spec.add_development_dependency 'appraisal'
|
26
26
|
spec.add_development_dependency 'codeclimate-test-reporter'
|
27
|
+
spec.add_development_dependency 'guard'
|
28
|
+
spec.add_development_dependency 'guard-rspec'
|
27
29
|
spec.add_development_dependency 'rake', '~> 12.0'
|
28
30
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
29
31
|
spec.add_development_dependency 'activerecord', '~> 6.0'
|
@@ -10,7 +10,7 @@ module GraphQL
|
|
10
10
|
|
11
11
|
SEARCH_ALL = '*'.freeze
|
12
12
|
|
13
|
-
|
13
|
+
attr_accessor :query, :model_class, :options, :limit_value, :offset_value
|
14
14
|
|
15
15
|
def_delegators :load, :results, :hits, :took, :error
|
16
16
|
def_delegators :load, :total_count, :current_page, :total_pages
|
@@ -28,7 +28,7 @@ module GraphQL
|
|
28
28
|
@options = options || {}
|
29
29
|
|
30
30
|
if @options.key?(:limit)
|
31
|
-
|
31
|
+
self.limit_value = @options[:limit]
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
@@ -40,12 +40,22 @@ module GraphQL
|
|
40
40
|
@result
|
41
41
|
end
|
42
42
|
|
43
|
-
def limit
|
44
|
-
|
43
|
+
def limit(value)
|
44
|
+
clone.limit!(value)
|
45
45
|
end
|
46
46
|
|
47
|
-
def offset
|
48
|
-
|
47
|
+
def offset(value)
|
48
|
+
clone.offset!(value)
|
49
|
+
end
|
50
|
+
|
51
|
+
def limit!(value)
|
52
|
+
self.limit_value = value
|
53
|
+
self
|
54
|
+
end
|
55
|
+
|
56
|
+
def offset!(value)
|
57
|
+
self.offset_value = value
|
58
|
+
self
|
49
59
|
end
|
50
60
|
end
|
51
61
|
end
|
@@ -4,151 +4,42 @@ require 'graphql'
|
|
4
4
|
|
5
5
|
module GraphQL
|
6
6
|
module Searchkick
|
7
|
-
class ResultConnection < GraphQL::
|
7
|
+
class ResultConnection < GraphQL::Pagination::RelationConnection
|
8
8
|
|
9
|
-
def
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
def execute_search
|
19
|
-
nodes.load
|
20
|
-
end
|
21
|
-
|
22
|
-
# must return a cursor for this object/connection pair
|
23
|
-
def cursor_from_node(item)
|
24
|
-
item_index = paged_nodes.index(item)
|
25
|
-
|
26
|
-
if item_index.nil?
|
27
|
-
raise("Can't generate cursor, item not found in connection: #{item}")
|
28
|
-
else
|
29
|
-
offset = item_index + 1
|
30
|
-
|
31
|
-
if after
|
32
|
-
offset += offset_from_cursor(after)
|
33
|
-
elsif before
|
34
|
-
offset += offset_from_cursor(before) - 1 - search_results.size
|
35
|
-
end
|
36
|
-
|
37
|
-
if first && last && first >= last
|
38
|
-
offset += first - last
|
9
|
+
def has_next_page
|
10
|
+
if @has_next_page.nil?
|
11
|
+
@has_next_page = if @before_offset && @before_offset > 0
|
12
|
+
true
|
13
|
+
elsif first
|
14
|
+
initial_offset = after && offset_from_cursor(after) || 0
|
15
|
+
nodes.total_count > initial_offset + first
|
16
|
+
else
|
17
|
+
false
|
39
18
|
end
|
40
|
-
|
41
|
-
encode(offset.to_s)
|
42
19
|
end
|
20
|
+
@has_next_page
|
43
21
|
end
|
44
22
|
|
45
|
-
def
|
46
|
-
|
23
|
+
def relation_count(relation)
|
24
|
+
relation.total_count
|
47
25
|
end
|
48
26
|
|
49
|
-
def
|
50
|
-
|
51
|
-
initial_offset = after ? offset_from_cursor(after) : 0
|
52
|
-
return search_results.total_count > initial_offset + first
|
53
|
-
end
|
54
|
-
|
55
|
-
if GraphQL::Relay::ConnectionType.bidirectional_pagination && last
|
56
|
-
return search_results.length >= last
|
57
|
-
end
|
58
|
-
false
|
27
|
+
def relation_limit(relation)
|
28
|
+
relation.limit_value
|
59
29
|
end
|
60
30
|
|
61
|
-
def
|
62
|
-
|
63
|
-
search_results.total_count >= last && search_results.size > last
|
64
|
-
elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && after
|
65
|
-
offset_from_cursor(after) > 0
|
66
|
-
else
|
67
|
-
false
|
68
|
-
end
|
31
|
+
def relation_offset(relation)
|
32
|
+
relation.offset_value
|
69
33
|
end
|
70
34
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
if after
|
75
|
-
offset = (search_offset(nodes) || 0) + offset_from_cursor(after)
|
76
|
-
set_offset(nodes, offset)
|
77
|
-
end
|
78
|
-
|
79
|
-
if before && after
|
80
|
-
if offset_from_cursor(after) < offset_from_cursor(before)
|
81
|
-
limit = offset_from_cursor(before) - offset_from_cursor(after) - 1
|
82
|
-
set_limit(nodes, limit)
|
83
|
-
else
|
84
|
-
set_limit(nodes, 0)
|
85
|
-
end
|
86
|
-
elsif before
|
87
|
-
set_limit(nodes, offset_from_cursor(before) - 1)
|
88
|
-
end
|
89
|
-
|
90
|
-
if first
|
91
|
-
if search_limit(nodes).nil? || search_limit(nodes) > first
|
92
|
-
set_limit(nodes, first)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
if last
|
97
|
-
if search_limit(nodes)
|
98
|
-
if last <= search_limit(nodes)
|
99
|
-
offset = (search_offset(nodes) || 0) + (search_limit(nodes) - last)
|
100
|
-
set_offset(nodes, offset)
|
101
|
-
set_limit(nodes, last)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
if max_page_size && !first && !last
|
107
|
-
if search_limit(nodes).nil? || search_limit(nodes) > max_page_size
|
108
|
-
set_limit(nodes, max_page_size)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
# must return nodes for this connection after paging
|
114
|
-
def paged_nodes
|
115
|
-
sliced_nodes
|
116
|
-
end
|
117
|
-
|
118
|
-
# must return all nodes for this connection after chopping off first and last
|
119
|
-
def sliced_nodes
|
120
|
-
search_results
|
121
|
-
end
|
122
|
-
|
123
|
-
def search_limit(lazy_search)
|
124
|
-
lazy_search.limit_value
|
125
|
-
end
|
126
|
-
|
127
|
-
def search_offset(lazy_search)
|
128
|
-
lazy_search.offset_value
|
129
|
-
end
|
130
|
-
|
131
|
-
def set_offset(relation, offset)
|
132
|
-
if offset >= 0
|
133
|
-
relation.offset = offset
|
134
|
-
else
|
135
|
-
relation.offset = 0
|
136
|
-
end
|
137
|
-
end
|
35
|
+
def null_relation(relation)
|
36
|
+
relation.limit(0)
|
37
|
+
end
|
138
38
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
else
|
143
|
-
relation.limit = 0
|
144
|
-
end
|
145
|
-
end
|
39
|
+
def load_nodes
|
40
|
+
@nodes ||= limited_nodes
|
41
|
+
end
|
146
42
|
|
147
|
-
def offset_from_cursor(cursor)
|
148
|
-
decode(cursor).to_i
|
149
|
-
end
|
150
43
|
end
|
151
|
-
|
152
|
-
GraphQL::Relay::BaseConnection.register_connection_implementation(LazySearch, ResultConnection)
|
153
44
|
end
|
154
45
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphql-searchkick
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chad Wilken
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-05-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: appraisal
|
@@ -38,6 +38,34 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: guard
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: guard-rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: rake
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -135,6 +163,7 @@ files:
|
|
135
163
|
- ".travis.yml"
|
136
164
|
- Appraisals
|
137
165
|
- Gemfile
|
166
|
+
- Guardfile
|
138
167
|
- LICENSE.txt
|
139
168
|
- README.md
|
140
169
|
- Rakefile
|