stretchy-model 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +45 -0
- data/lib/stretchy/open_search_compatibility.rb +86 -0
- data/lib/stretchy/version.rb +1 -1
- data/lib/stretchy.rb +18 -1
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a85f7bffcc11c54366d4cae7fec47b91341425e06b7f1c8a6269e0b23d4e649b
|
4
|
+
data.tar.gz: cd0b9314fa734aa7af7179f12ed00626a17bc869186f82088158bfca87c8d915
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e193c837695100177eac9888841b14243596dfc9694515696ab1a9934174287c821cf52b2ca165e3f3eda04de9ba16c7c7330cb187641d71229d322c06674977
|
7
|
+
data.tar.gz: 21ace7b64f85d505a05b61b89b5b85d9d2af34941b57672da45f70e6c8736e8b9451c59891fef7d0795f8b54076cffd88bfc141fcd4da1c1f8ffaddcf8276697
|
data/README.md
CHANGED
@@ -118,6 +118,32 @@ If bundler is not being used to manage dependencies, install the gem by executin
|
|
118
118
|
|
119
119
|
$ gem install stretchy-model
|
120
120
|
|
121
|
+
<details>
|
122
|
+
<summary>Rails Configuration</summary>
|
123
|
+
|
124
|
+
|
125
|
+
|
126
|
+
```sh
|
127
|
+
rails credentials:edit
|
128
|
+
```
|
129
|
+
|
130
|
+
#### Add elasticsearch credentials
|
131
|
+
```yaml
|
132
|
+
elasticsearch:
|
133
|
+
url: localhost:9200
|
134
|
+
```
|
135
|
+
|
136
|
+
#### Create an initializer
|
137
|
+
<p><sub><em>config/initializers/stretchy.rb</em></sub></p>
|
138
|
+
|
139
|
+
```ruby {file=config/initializers/stretchy.rb}
|
140
|
+
Stretchy.configure do |config|
|
141
|
+
config.client = Elasticsearch::Client.new url: Rails.application.credentials.elasticsearch.url, log: true
|
142
|
+
end
|
143
|
+
```
|
144
|
+
</details>
|
145
|
+
|
146
|
+
|
121
147
|
## Development
|
122
148
|
|
123
149
|
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -128,6 +154,10 @@ After checking out the repo, run `bin/setup` to install dependencies. You can al
|
|
128
154
|
> Full documentation on [Elasticsearch Query DSL and Aggregation options](https://github.com/elastic/elasticsearch-rails/tree/main/elasticsearch-persistence)
|
129
155
|
|
130
156
|
## Testing
|
157
|
+
<details>
|
158
|
+
<summary>Elasticsearch</summary>
|
159
|
+
|
160
|
+
|
131
161
|
```
|
132
162
|
docker-compose up elasticsearch
|
133
163
|
```
|
@@ -136,6 +166,21 @@ docker-compose up elasticsearch
|
|
136
166
|
bundle exec rspec
|
137
167
|
```
|
138
168
|
|
169
|
+
</details>
|
170
|
+
|
171
|
+
<details>
|
172
|
+
<summary>Opensearch</summary>
|
173
|
+
|
174
|
+
|
175
|
+
```
|
176
|
+
docker-compose up opensearch
|
177
|
+
```
|
178
|
+
|
179
|
+
```
|
180
|
+
ENV['BACKEND']=opensearch bundle rspec
|
181
|
+
```
|
182
|
+
</details>
|
183
|
+
|
139
184
|
## Contributing
|
140
185
|
|
141
186
|
Bug reports and pull requests are welcome on GitHub at https://github.com/theablefew/stretchy. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/theablefew/stretchy/blob/master/CODE_OF_CONDUCT.md).
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Stretchy
|
2
|
+
module OpenSearchCompatibility
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
# Patches the Elasticsearch::Persistence::Repository::Search module to remove the
|
6
|
+
# document type from the request for compatability with OpenSearch
|
7
|
+
def self.opensearch_patch!
|
8
|
+
patch = Module.new do
|
9
|
+
def search(query_or_definition, options={})
|
10
|
+
request = { index: index_name }
|
11
|
+
|
12
|
+
if query_or_definition.respond_to?(:to_hash)
|
13
|
+
request[:body] = query_or_definition.to_hash
|
14
|
+
elsif query_or_definition.is_a?(String)
|
15
|
+
request[:q] = query_or_definition
|
16
|
+
else
|
17
|
+
raise ArgumentError, "[!] Pass the search definition as a Hash-like object or pass the query as a String" +
|
18
|
+
" -- #{query_or_definition.class} given."
|
19
|
+
end
|
20
|
+
|
21
|
+
Elasticsearch::Persistence::Repository::Response::Results.new(self, client.search(request.merge(options)))
|
22
|
+
end
|
23
|
+
|
24
|
+
def count(query_or_definition=nil, options={})
|
25
|
+
query_or_definition ||= { query: { match_all: {} } }
|
26
|
+
request = { index: index_name}
|
27
|
+
|
28
|
+
if query_or_definition.respond_to?(:to_hash)
|
29
|
+
request[:body] = query_or_definition.to_hash
|
30
|
+
elsif query_or_definition.is_a?(String)
|
31
|
+
request[:q] = query_or_definition
|
32
|
+
else
|
33
|
+
raise ArgumentError, "[!] Pass the search definition as a Hash-like object or pass the query as a String" +
|
34
|
+
" -- #{query_or_definition.class} given."
|
35
|
+
end
|
36
|
+
|
37
|
+
client.count(request.merge(options))['count']
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
store = Module.new do
|
42
|
+
def save(document, options={})
|
43
|
+
serialized = serialize(document)
|
44
|
+
id = __get_id_from_document(serialized)
|
45
|
+
request = { index: index_name,
|
46
|
+
id: id,
|
47
|
+
body: serialized }
|
48
|
+
client.index(request.merge(options))
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def update(document_or_id, options = {})
|
53
|
+
if document_or_id.is_a?(String) || document_or_id.is_a?(Integer)
|
54
|
+
id = document_or_id
|
55
|
+
body = options
|
56
|
+
else
|
57
|
+
document = serialize(document_or_id)
|
58
|
+
id = __extract_id_from_document(document)
|
59
|
+
if options[:script]
|
60
|
+
body = options
|
61
|
+
else
|
62
|
+
body = { doc: document }.merge(options)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
client.update(index: index_name, id: id, body: body)
|
66
|
+
end
|
67
|
+
|
68
|
+
def delete(document_or_id, options = {})
|
69
|
+
if document_or_id.is_a?(String) || document_or_id.is_a?(Integer)
|
70
|
+
id = document_or_id
|
71
|
+
else
|
72
|
+
serialized = serialize(document_or_id)
|
73
|
+
id = __get_id_from_document(serialized)
|
74
|
+
end
|
75
|
+
client.delete({ index: index_name, id: id }.merge(options))
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
::Elasticsearch::Persistence::Repository.send(:include, patch)
|
81
|
+
::Elasticsearch::Persistence::Repository.send(:include, store)
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
data/lib/stretchy/version.rb
CHANGED
data/lib/stretchy.rb
CHANGED
@@ -24,9 +24,25 @@ module Stretchy
|
|
24
24
|
class Configuration
|
25
25
|
|
26
26
|
attr_accessor :client
|
27
|
+
attr_accessor :opensearch
|
27
28
|
|
28
29
|
def initialize
|
29
30
|
@client = Elasticsearch::Client.new url: 'http://localhost:9200'
|
31
|
+
@opensearch = false
|
32
|
+
end
|
33
|
+
|
34
|
+
def client=(client)
|
35
|
+
@client = client
|
36
|
+
self.opensearch = true if @client.class.name =~ /OpenSearch/
|
37
|
+
end
|
38
|
+
|
39
|
+
def opensearch=(bool)
|
40
|
+
@opensearch = bool
|
41
|
+
OpenSearchCompatibility.opensearch_patch! if bool
|
42
|
+
end
|
43
|
+
|
44
|
+
def opensearch?
|
45
|
+
@opensearch
|
30
46
|
end
|
31
47
|
|
32
48
|
end
|
@@ -45,9 +61,10 @@ module Stretchy
|
|
45
61
|
end
|
46
62
|
end
|
47
63
|
|
48
|
-
|
49
64
|
end
|
50
65
|
|
66
|
+
|
67
|
+
|
51
68
|
loader = Zeitwerk::Loader.new
|
52
69
|
loader.tag = File.basename(__FILE__, ".rb")
|
53
70
|
loader.inflector = Zeitwerk::GemInflector.new(__FILE__)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stretchy-model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Spencer Markowski
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-03-
|
11
|
+
date: 2024-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: zeitwerk
|
@@ -164,6 +164,20 @@ dependencies:
|
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: 0.9.36
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: opensearch-ruby
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '3.0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '3.0'
|
167
181
|
description: Provides a familiar ActiveRecord-like interface for working with Elasticsearch
|
168
182
|
email:
|
169
183
|
- spencer.markowski@theablefew.com
|
@@ -197,6 +211,7 @@ files:
|
|
197
211
|
- lib/stretchy/model/callbacks.rb
|
198
212
|
- lib/stretchy/model/serialization.rb
|
199
213
|
- lib/stretchy/null_relation.rb
|
214
|
+
- lib/stretchy/open_search_compatibility.rb
|
200
215
|
- lib/stretchy/persistence.rb
|
201
216
|
- lib/stretchy/querying.rb
|
202
217
|
- lib/stretchy/record.rb
|