chewie 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +117 -113
  4. data/lib/chewie/version.rb +1 -1
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 55fb78fd0112450194bd8b4df9f4788b8d7a9dd84a1a7d66d01f3e9cbe3bc2ad
4
- data.tar.gz: 0ded9a3d1dd071de99bd0a9be969127ad380bea0f2b5a3e4aabe67a2f7bd8da2
3
+ metadata.gz: 87efde82129dae245a02a880e4b843c9a640140ce2eee57aca0c6ed5ab3f1bdb
4
+ data.tar.gz: 1329723440602fdee2b6c7d1ff11d7907b5f6464f392d807690dfba8d45a101f
5
5
  SHA512:
6
- metadata.gz: 413dc96d727a9d8574ccfbcfeee93eaf8aafd0e0f9fcc74dbac20a449f3315a961a485b9042d855155d6e8a7a001c9fb059296efbfc14a7e98858ff4e64f116e
7
- data.tar.gz: a639a6a1007f7f29ba1a1a3414b603f83dbf7c7602e0a3fbd09cba17b9332b5c566bdd7170f24576623d59a929bfa628a925c126c5e6e279e276a9418e8a3329
6
+ metadata.gz: 49934eea3792c825ca77cdd38e32472aef70abb28673021fa6dfeedda08338b68e6a4a035843a8a731492b50e5a9d8c63a99ad6e472f29ed4342652e26096009
7
+ data.tar.gz: b0d75849ad471dd71826643a3fe2b6da041ffbf89fe2f6dd619b8ca551a349e28a58c0b79ee135e8e5bd2741ae450130e255af0895f26eb1274cd530194dc6d8
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- chewie (0.2.0)
4
+ chewie (0.2.2)
5
5
  activesupport (>= 5.1.6)
6
6
  pry
7
7
 
data/README.md CHANGED
@@ -45,13 +45,13 @@ Define a `Chewie` class:
45
45
  # app/chewies/school_chewie.rb
46
46
 
47
47
  class SchoolChewie
48
- extend Chewie
49
-
50
- term :name
51
- range :age
52
- match :description
53
-
54
- filter_by :governances, with: :terms
48
+ extend Chewie
49
+
50
+ term :name
51
+ range :age
52
+ match :description
53
+
54
+ filter_by :governances, with: :terms
55
55
  end
56
56
  ```
57
57
 
@@ -61,11 +61,11 @@ Pass filter parameters to the `#build` method:
61
61
  # app/**/*.rb
62
62
 
63
63
  params = {
64
- query: "Park School"
65
- filters: {
66
- age: { 'gte': 20, 'lte': 10 },
67
- governances: ['Charter', 'Alop']
68
- }
64
+ query: "Park School"
65
+ filters: {
66
+ age: { 'gte': 20, 'lte': 10 },
67
+ governances: ['Charter', 'Alop']
68
+ }
69
69
  }
70
70
 
71
71
  query = params[:query]
@@ -75,7 +75,7 @@ query = SchoolChewie.build(query: query, filters: filters)
75
75
 
76
76
  puts query
77
77
  # =>
78
- # {
78
+ # {
79
79
  # query: {
80
80
  # term: {
81
81
  # name: { value: 'Park School' }
@@ -97,7 +97,7 @@ puts query
97
97
  # }
98
98
  ```
99
99
 
100
- Chewie expects incoming parameter attributes to match the attributes defined in your Chewie class, in order to pull the correct value and build the query
100
+ Chewie expects incoming parameter attributes to match the attributes defined in your Chewie class, in order to pull the correct value and build the query.
101
101
 
102
102
  ```ruby
103
103
  # definition
@@ -127,102 +127,106 @@ term :name
127
127
 
128
128
  ## Filtering by Associations
129
129
 
130
- Depending on how you build your index, some fields might store values from multiple attributes.
130
+ Depending on how you build your index, some fields might store values from multiple tables.
131
131
 
132
132
  A simple case is if you'd like to filter records through an association.
133
133
 
134
134
  ```ruby
135
135
  class School
136
- has_many :school_disciplines
137
- has_many :disciplines, through: :school_disciplines
136
+ has_many :school_disciplines
137
+ has_many :disciplines, through: :school_disciplines
138
138
  end
139
139
 
140
140
  class Discipline
141
- has_many :school_disciplines
142
- has_many :schools, through: :school_disciplines
141
+ has_many :school_disciplines
142
+ has_many :schools, through: :school_disciplines
143
143
  end
144
144
 
145
145
  class SchoolDiscipline
146
- belongs_to :school
147
- belongs_to :discipline
146
+ belongs_to :school
147
+ belongs_to :discipline
148
148
  end
149
149
  ```
150
150
 
151
- We might imagine a search engine that helps users find schools in their area and allow them to filter schools by various criteria. Some schools might offer discipline specific programs, therefore a school will have many disciplines. Disciplines is a standard collection that schools can associate with in our application.
151
+ We can imagine a search engine that helps users find schools in their area and allow them to filter schools by various criteria.
152
+
153
+ Some schools might offer discipline specific programs, therefore a school will have many disciplines.
154
+
155
+ Disciplines is a non-user populated collection that schools can associate with in the application.
152
156
 
153
- In our search UI, we might provide a `disciplines` filter and allow users to filter by disciplines via dropdown.
157
+ In the search UI, we might provide a `disciplines` filter and allow users to filter by disciplines via dropdown.
154
158
 
155
159
  We provide the search UI with `ids` of disciplines we'd like to filter by.
156
160
 
157
161
  ```json
158
162
  {
159
- filters: {
160
- disciplines: [1, 2, 3, 4]
161
- }
163
+ filters: {
164
+ disciplines: [1, 2, 3, 4]
165
+ }
162
166
  }
163
167
  ```
164
168
 
165
- Our idex consists of school records, therefore we won't have access to every discipline each school is associated to by default.
169
+ The idex consists of school records, therefore we won't have access to every discipline each school is associated to by default.
166
170
 
167
- Instead, we need to define custom index attributes for our school records to capture those relationships.
171
+ Instead, we need to define custom index attributes for school records to capture those relationships.
168
172
 
169
173
  We can do that by defining model methods on `School` that collects associated id values and returns a collection of strings to be indexed.
170
174
 
171
175
  ```ruby
172
176
  class School
173
- def disciplines_index
174
- discipline_ids = disciplines.pluck(:id)
175
- discipline_ids.map do |discipline_id|
176
- "discipline_#{discipline_id}"
177
- end
178
- end
179
-
180
- # Method Elasticsearch can use to populate the index
181
- def search_data
182
- {
183
- name: name,
184
- disciplines: disciplines_index
185
- }
186
- end
177
+ def disciplines_index
178
+ discipline_ids = disciplines.pluck(:id)
179
+ discipline_ids.map do |discipline_id|
180
+ "discipline_#{discipline_id}"
181
+ end
182
+ end
183
+
184
+ # Method Elasticsearch can use to populate the index
185
+ def search_data
186
+ {
187
+ name: name,
188
+ disciplines: disciplines_index
189
+ }
190
+ end
187
191
  end
188
192
  ```
189
193
 
190
194
  When Elasticsearch indexes `School` records, each record will now have knowledge of which disciplines it is associated to.
191
195
 
192
196
  ```json
193
- {
194
- name: 'Park School',
195
- disciplines: [
196
- "discipline_1",
197
- "discipline_2",
198
- "discipline_3"
199
- ]
200
- }
197
+ {
198
+ name: 'Park School',
199
+ disciplines: [
200
+ "discipline_1",
201
+ "discipline_2",
202
+ "discipline_3"
203
+ ]
204
+ }
201
205
  ```
202
206
 
203
207
  ### Format
204
- At this point, our index is ready to return associated `School` records when given a collection of `Discipline` ids.
208
+ At this point, the index is ready to return associated `School` records when given a collection of `Discipline` ids.
205
209
 
206
210
  The caveat is the stored values of `:disciplines` is in a format that contains both the `School` and `Discipline` id.
207
211
 
208
- We'll need to do a little extra work at search time to ensure our `id` filter values are transformed into the appropriate string format.
212
+ We'll need to do a little extra work at search time to ensure the `id` filter values are transformed into the appropriate string format.
209
213
 
210
214
  To address this, `bool` query methods have a `:format` option that takes a lambda and exposes attribute values given.
211
215
 
212
216
  ```ruby
213
217
  class SchoolChewie
214
- disciplines_format = lambda do |id|
215
- "discipline_#{id}"
216
- end
218
+ disciplines_format = lambda do |id|
219
+ "discipline_#{id}"
220
+ end
217
221
 
218
- filter_by :disciplines, with: :terms, format: disciplines_format
222
+ filter_by :disciplines, with: :terms, format: disciplines_format
219
223
  end
220
224
 
221
225
  params = {
222
- query: '',
223
- filters: {
224
- disciplines: [1, 4]
225
- }
226
+ query: '',
227
+ filters: {
228
+ disciplines: [1, 4]
229
+ }
226
230
  }
227
231
 
228
232
  result = SchoolChewie.build(query: params[:query], filters: params[:filters])
@@ -245,7 +249,7 @@ puts result
245
249
  # }
246
250
  ```
247
251
 
248
- Now that our query output for `disciplines` matches values stored in the index, Elasticsearch will find `School` records where `disciplines` match to either `"discipline_1"` or `"discipline_4"`; allowing us to find schools by their associated disciplines.
252
+ Now that the query for `disciplines` matches values stored in the index, Elasticsearch will find `School` records where `disciplines` match to either `"discipline_1"` or `"discipline_4"`; allowing us to find schools by their associated disciplines.
249
253
 
250
254
  ### Combine
251
255
 
@@ -255,65 +259,65 @@ Continuing with the previous example, let's say we want to filter schools by dis
255
259
 
256
260
  `"active"` might be a boolean attribute found on `SchoolDiscipline`.
257
261
 
258
- We can re-write our `discipline_index` method to pull the discipline `id` and `active` attributes from `SchoolDiscipline` join records.
262
+ We can re-write `#discipline_index` to pull the discipline `id` and `active` attributes from `SchoolDiscipline` join records.
259
263
 
260
264
  ```ruby
261
265
  class School
262
- def disciplines_index
263
- school_disciplines.map do |school_discipline|
264
- discipline_id = school_discipline.id
265
- active = school_discipline.active
266
-
267
- "discipline_#{discipline_id}_active_#{active}"
268
- end
269
- end
270
-
271
- # Method Elasticsearch can use to populate the index
272
- def search_data
273
- {
274
- name: name,
275
- disciplines: disciplines_index
276
- }
277
- end
266
+ def disciplines_index
267
+ school_disciplines.map do |school_discipline|
268
+ discipline_id = school_discipline.id
269
+ active = school_discipline.active
270
+
271
+ "discipline_#{discipline_id}_active_#{active}"
272
+ end
273
+ end
274
+
275
+ # Method Elasticsearch can use to populate the index
276
+ def search_data
277
+ {
278
+ name: name,
279
+ disciplines: disciplines_index
280
+ }
281
+ end
278
282
  end
279
283
  ```
280
284
 
281
- Which changes our index to:
285
+ Which changes the index to:
282
286
 
283
287
  ```json
284
- {
285
- name: 'Park School',
286
- disciplines: [
287
- "discipline_1_active_true",
288
- "discipline_2_active_false",
289
- "discipline_3_active_false"
290
- ]
291
- }
288
+ {
289
+ name: 'Park School',
290
+ disciplines: [
291
+ "discipline_1_active_true",
292
+ "discipline_2_active_false",
293
+ "discipline_3_active_false"
294
+ ]
295
+ }
292
296
  ```
293
297
 
294
- We can now imagine there is a `active` toggle in the search UI, which expands our filter parameters.
298
+ We can now imagine there is a `active` toggle in the search UI, which expands the filter parameters.
295
299
 
296
300
  ```ruby
297
301
  params = {
298
- query: '',
299
- filters: {
300
- disciplines: [1, 4],
301
- active: true
302
- }
302
+ query: '',
303
+ filters: {
304
+ disciplines: [1, 4],
305
+ active: true
306
+ }
303
307
  }
304
308
  ```
305
309
 
306
- Now, at search time we not only need to format with the `disciplines` collection, but combine those values with the `active` attribute.
310
+ At search time we not only need to format with the `disciplines` collection, but combine those values with the `active` attribute.
307
311
 
308
- Let's update our Chewie to take this new criteria into account.
312
+ Let's update `SchoolChewie` to take this new criteria into account.
309
313
 
310
314
  ```ruby
311
315
  class SchoolChewie
312
- disciplines_format = lambda do |id, combine|
313
- "discipline_#{id}_active_#{combine.first}"
314
- end
316
+ disciplines_format = lambda do |id, combine|
317
+ "discipline_#{id}_active_#{combine.first}"
318
+ end
315
319
 
316
- filter_by :disciplines, with: :terms, combine: [:active], format: disciplines_format
320
+ filter_by :disciplines, with: :terms, combine: [:active], format: disciplines_format
317
321
  end
318
322
  ```
319
323
 
@@ -325,13 +329,13 @@ The order of the values matches the order defined in the method call.
325
329
  combine: [:active, :governances, :age]
326
330
 
327
331
  lambda do |id, combine|
328
- combine[0] #=> :active value
329
- combine[1] #=> :governances value
330
- combine[2] #=> :age value
332
+ combine[0] #=> :active value
333
+ combine[1] #=> :governances value
334
+ combine[2] #=> :age value
331
335
  end
332
336
  ```
333
337
 
334
- The output becomes:
338
+ The new output:
335
339
 
336
340
  ```ruby
337
341
  result = SchoolChewie.build(query: params[:query], filters: params[:filters])
@@ -358,22 +362,22 @@ puts result
358
362
  ### [Compound Queries](https://www.elastic.co/guide/en/elasticsearch/reference/current/full-text-queries.html)
359
363
  #### [Bool](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html)
360
364
 
361
- * filter (#filter_by)
362
- * should (#should_include)
363
- * must (#must_include)
364
- * must_not (#must_not_include)
365
+ * [filter (#filter_by)](https://www.rubydoc.info/gems/chewie/0.2.2/Chewie/Interface/Bool)
366
+ * [should (#should_include)](https://www.rubydoc.info/gems/chewie/0.2.2/Chewie/Interface/Bool)
367
+ * [must (#must_include)](https://www.rubydoc.info/gems/chewie/0.2.2/Chewie/Interface/Bool)
368
+ * [must_not (#must_not_include)](https://www.rubydoc.info/gems/chewie/0.2.2/Chewie/Interface/Bool)
365
369
 
366
370
  ### [Term Level Queries](https://www.elastic.co/guide/en/elasticsearch/reference/current/term-level-queries.html)
367
371
 
368
- * term (#term)
369
- * terms (#terms)
370
- * range (#range)
371
- * fuzzy (#fuzzy)
372
+ * [term (#term)](https://www.rubydoc.info/gems/chewie/0.2.2/Chewie/Interface/TermLevel)
373
+ * [terms (#terms)](https://www.rubydoc.info/gems/chewie/0.2.2/Chewie/Interface/TermLevel)
374
+ * [range (#range)](https://www.rubydoc.info/gems/chewie/0.2.2/Chewie/Interface/TermLevel)
375
+ * [fuzzy (#fuzzy)](https://www.rubydoc.info/gems/chewie/0.2.2/Chewie/Interface/TermLevel)
372
376
 
373
377
  ### [Full Text Queries](https://www.elastic.co/guide/en/elasticsearch/reference/current/full-text-queries.html)
374
378
 
375
- * match (#match)
376
- * multi-match (#multimatch)
379
+ * [match (#match)](https://www.rubydoc.info/gems/chewie/0.2.2/Chewie/Interface/FullText)
380
+ * [multi-match (#multimatch)](https://www.rubydoc.info/gems/chewie/0.2.2/Chewie/Interface/FullText)
377
381
 
378
382
  ## Development
379
383
 
@@ -1,3 +1,3 @@
1
1
  module Chewie
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chewie
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - mrjonesbot
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-13 00:00:00.000000000 Z
11
+ date: 2019-12-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler