Class: Searchkick::Relation

Inherits:
Object
  • Object
show all
Defined in:
lib/searchkick/relation.rb

Constant Summary collapse

NO_DEFAULT_VALUE =
Object.new

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model, term = "*", **options) ⇒ Relation

Returns a new instance of Relation.



14
15
16
17
18
19
20
21
# File 'lib/searchkick/relation.rb', line 14

def initialize(model, term = "*", **options)
  @model = model
  @term = term
  @options = options

  # generate query to validate options
  query
end

Instance Attribute Details

#modelObject (readonly) Also known as: klass

Returns the value of attribute model.



11
12
13
# File 'lib/searchkick/relation.rb', line 11

def model
  @model
end

Instance Method Details

#aggs(value = NO_DEFAULT_VALUE) ⇒ Object



30
31
32
33
34
35
36
# File 'lib/searchkick/relation.rb', line 30

def aggs(value = NO_DEFAULT_VALUE)
  if value == NO_DEFAULT_VALUE
    private_execute.aggs
  else
    clone.aggs!(value)
  end
end

#aggs!(value) ⇒ Object



38
39
40
41
42
# File 'lib/searchkick/relation.rb', line 38

def aggs!(value)
  check_loaded
  (@options[:aggs] ||= {}).merge!(value)
  self
end

#body(value = NO_DEFAULT_VALUE) ⇒ Object



44
45
46
47
48
49
50
# File 'lib/searchkick/relation.rb', line 44

def body(value = NO_DEFAULT_VALUE)
  if value == NO_DEFAULT_VALUE
    query.body
  else
    clone.body!(value)
  end
end

#body!(value) ⇒ Object



52
53
54
55
56
# File 'lib/searchkick/relation.rb', line 52

def body!(value)
  check_loaded
  @options[:body] = value
  self
end

#body_options(value) ⇒ Object



58
59
60
# File 'lib/searchkick/relation.rb', line 58

def body_options(value)
  clone.body_options!(value)
end

#body_options!(value) ⇒ Object



62
63
64
65
66
# File 'lib/searchkick/relation.rb', line 62

def body_options!(value)
  check_loaded
  (@options[:body_options] ||= {}).merge!(value)
  self
end

#boost(value) ⇒ Object



68
69
70
# File 'lib/searchkick/relation.rb', line 68

def boost(value)
  clone.boost!(value)
end

#boost!(value) ⇒ Object



72
73
74
75
76
# File 'lib/searchkick/relation.rb', line 72

def boost!(value)
  check_loaded
  @options[:boost] = value
  self
end

#boost_by(value) ⇒ Object



78
79
80
# File 'lib/searchkick/relation.rb', line 78

def boost_by(value)
  clone.boost_by!(value)
end

#boost_by!(value) ⇒ Object



82
83
84
85
86
87
88
89
90
91
# File 'lib/searchkick/relation.rb', line 82

def boost_by!(value)
  check_loaded
  if value.is_a?(Array)
    value = value.to_h { |f| [f, {factor: 1}] }
  elsif !value.is_a?(Hash)
    value = {value => {factor: 1}}
  end
  (@options[:boost_by] ||= {}).merge!(value)
  self
end

#boost_by_distance(value) ⇒ Object



93
94
95
# File 'lib/searchkick/relation.rb', line 93

def boost_by_distance(value)
  clone.boost_by_distance!(value)
end

#boost_by_distance!(value) ⇒ Object



97
98
99
100
101
102
103
# File 'lib/searchkick/relation.rb', line 97

def boost_by_distance!(value)
  check_loaded
  # legacy format
  value = {value[:field] => value.except(:field)} if value[:field]
  (@options[:boost_by_distance] ||= {}).merge!(value)
  self
end

#boost_by_recency(value) ⇒ Object



105
106
107
# File 'lib/searchkick/relation.rb', line 105

def boost_by_recency(value)
  clone.boost_by_recency!(value)
end

#boost_by_recency!(value) ⇒ Object



109
110
111
112
113
# File 'lib/searchkick/relation.rb', line 109

def boost_by_recency!(value)
  check_loaded
  (@options[:boost_by_recency] ||= {}).merge!(value)
  self
end

#boost_where(value) ⇒ Object



115
116
117
# File 'lib/searchkick/relation.rb', line 115

def boost_where(value)
  clone.boost_where!(value)
end

#boost_where!(value) ⇒ Object



119
120
121
122
123
124
# File 'lib/searchkick/relation.rb', line 119

def boost_where!(value)
  check_loaded
  # TODO merge duplicate fields
  (@options[:boost_where] ||= {}).merge!(value)
  self
end

#conversions(value) ⇒ Object



126
127
128
# File 'lib/searchkick/relation.rb', line 126

def conversions(value)
  clone.conversions!(value)
end

#conversions!(value) ⇒ Object



130
131
132
133
134
# File 'lib/searchkick/relation.rb', line 130

def conversions!(value)
  check_loaded
  @options[:conversions] = value
  self
end

#conversions_term(value) ⇒ Object



156
157
158
# File 'lib/searchkick/relation.rb', line 156

def conversions_term(value)
  clone.conversions_term!(value)
end

#conversions_term!(value) ⇒ Object



160
161
162
163
164
# File 'lib/searchkick/relation.rb', line 160

def conversions_term!(value)
  check_loaded
  @options[:conversions_term] = value
  self
end

#conversions_v1(value) ⇒ Object



136
137
138
# File 'lib/searchkick/relation.rb', line 136

def conversions_v1(value)
  clone.conversions_v1!(value)
end

#conversions_v1!(value) ⇒ Object



140
141
142
143
144
# File 'lib/searchkick/relation.rb', line 140

def conversions_v1!(value)
  check_loaded
  @options[:conversions_v1] = value
  self
end

#conversions_v2(value) ⇒ Object



146
147
148
# File 'lib/searchkick/relation.rb', line 146

def conversions_v2(value)
  clone.conversions_v2!(value)
end

#conversions_v2!(value) ⇒ Object



150
151
152
153
154
# File 'lib/searchkick/relation.rb', line 150

def conversions_v2!(value)
  check_loaded
  @options[:conversions_v2] = value
  self
end

#debug(value = true) ⇒ Object



166
167
168
# File 'lib/searchkick/relation.rb', line 166

def debug(value = true)
  clone.debug!(value)
end

#debug!(value = true) ⇒ Object



170
171
172
173
174
# File 'lib/searchkick/relation.rb', line 170

def debug!(value = true)
  check_loaded
  @options[:debug] = value
  self
end

#emoji(value = true) ⇒ Object



176
177
178
# File 'lib/searchkick/relation.rb', line 176

def emoji(value = true)
  clone.emoji!(value)
end

#emoji!(value = true) ⇒ Object



180
181
182
183
184
# File 'lib/searchkick/relation.rb', line 180

def emoji!(value = true)
  check_loaded
  @options[:emoji] = value
  self
end

#except(*keys) ⇒ Object



633
634
635
# File 'lib/searchkick/relation.rb', line 633

def except(*keys)
  Relation.new(@model, @term, **@options.except(*keys))
end

#exclude(*values) ⇒ Object



186
187
188
# File 'lib/searchkick/relation.rb', line 186

def exclude(*values)
  clone.exclude!(*values)
end

#exclude!(*values) ⇒ Object



190
191
192
193
194
# File 'lib/searchkick/relation.rb', line 190

def exclude!(*values)
  check_loaded
  (@options[:exclude] ||= []).concat(values.flatten)
  self
end

#explain(value = true) ⇒ Object



196
197
198
# File 'lib/searchkick/relation.rb', line 196

def explain(value = true)
  clone.explain!(value)
end

#explain!(value = true) ⇒ Object



200
201
202
203
204
# File 'lib/searchkick/relation.rb', line 200

def explain!(value = true)
  check_loaded
  @options[:explain] = value
  self
end

#fields(*values) ⇒ Object



206
207
208
# File 'lib/searchkick/relation.rb', line 206

def fields(*values)
  clone.fields!(*values)
end

#fields!(*values) ⇒ Object



210
211
212
213
214
# File 'lib/searchkick/relation.rb', line 210

def fields!(*values)
  check_loaded
  (@options[:fields] ||= []).concat(values.flatten)
  self
end

#first(value = NO_DEFAULT_VALUE) ⇒ Object



571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
# File 'lib/searchkick/relation.rb', line 571

def first(value = NO_DEFAULT_VALUE)
  result =
    if loaded?
      private_execute
    else
      limit = value == NO_DEFAULT_VALUE ? 1 : value
      previous_limit = (@options[:limit] || @options[:per_page])&.to_i
      if previous_limit && previous_limit < limit
        limit = previous_limit
      end
      limit(limit).load
    end

  if value == NO_DEFAULT_VALUE
    result.first
  else
    result.first(value)
  end
end

#highlight(value) ⇒ Object



216
217
218
# File 'lib/searchkick/relation.rb', line 216

def highlight(value)
  clone.highlight!(value)
end

#highlight!(value) ⇒ Object



220
221
222
223
224
# File 'lib/searchkick/relation.rb', line 220

def highlight!(value)
  check_loaded
  @options[:highlight] = value
  self
end

#includes(*values) ⇒ Object



226
227
228
# File 'lib/searchkick/relation.rb', line 226

def includes(*values)
  clone.includes!(*values)
end

#includes!(*values) ⇒ Object



230
231
232
233
234
# File 'lib/searchkick/relation.rb', line 230

def includes!(*values)
  check_loaded
  (@options[:includes] ||= []).concat(values.flatten)
  self
end

#index_name(*values) ⇒ Object



236
237
238
# File 'lib/searchkick/relation.rb', line 236

def index_name(*values)
  clone.index_name!(*values)
end

#index_name!(*values) ⇒ Object



240
241
242
243
244
245
246
247
248
249
# File 'lib/searchkick/relation.rb', line 240

def index_name!(*values)
  check_loaded
  values = values.flatten
  if values.all? { |v| v.respond_to?(:searchkick_index) }
    models!(*values)
  else
    (@options[:index_name] ||= []).concat(values)
    self
  end
end

#indices_boost(value) ⇒ Object



251
252
253
# File 'lib/searchkick/relation.rb', line 251

def indices_boost(value)
  clone.indices_boost!(value)
end

#indices_boost!(value) ⇒ Object



255
256
257
258
259
# File 'lib/searchkick/relation.rb', line 255

def indices_boost!(value)
  check_loaded
  (@options[:indices_boost] ||= {}).merge!(value)
  self
end

#inspectObject

same as Active Record



24
25
26
27
28
# File 'lib/searchkick/relation.rb', line 24

def inspect
  entries = results.first(11).map!(&:inspect)
  entries[10] = "..." if entries.size == 11
  "#<#{self.class.name} [#{entries.join(', ')}]>"
end

#knn(value) ⇒ Object



261
262
263
# File 'lib/searchkick/relation.rb', line 261

def knn(value)
  clone.knn!(value)
end

#knn!(value) ⇒ Object



265
266
267
268
269
# File 'lib/searchkick/relation.rb', line 265

def knn!(value)
  check_loaded
  @options[:knn] = value
  self
end

#limit(value) ⇒ Object



271
272
273
# File 'lib/searchkick/relation.rb', line 271

def limit(value)
  clone.limit!(value)
end

#limit!(value) ⇒ Object



275
276
277
278
279
# File 'lib/searchkick/relation.rb', line 275

def limit!(value)
  check_loaded
  @options[:limit] = value
  self
end

#load(value = NO_DEFAULT_VALUE) ⇒ Object



281
282
283
284
285
286
287
288
# File 'lib/searchkick/relation.rb', line 281

def load(value = NO_DEFAULT_VALUE)
  if value == NO_DEFAULT_VALUE
    private_execute
    self
  else
    clone.load!(value)
  end
end

#load!(value) ⇒ Object



290
291
292
293
294
# File 'lib/searchkick/relation.rb', line 290

def load!(value)
  check_loaded
  @options[:load] = value
  self
end

#loaded?Boolean

Returns:

  • (Boolean)


637
638
639
# File 'lib/searchkick/relation.rb', line 637

def loaded?
  !@execute.nil?
end

#match(value) ⇒ Object



296
297
298
# File 'lib/searchkick/relation.rb', line 296

def match(value)
  clone.match!(value)
end

#match!(value) ⇒ Object



300
301
302
303
304
# File 'lib/searchkick/relation.rb', line 300

def match!(value)
  check_loaded
  @options[:match] = value
  self
end

#misspellings(value) ⇒ Object



306
307
308
# File 'lib/searchkick/relation.rb', line 306

def misspellings(value)
  clone.misspellings!(value)
end

#misspellings!(value) ⇒ Object



310
311
312
313
314
# File 'lib/searchkick/relation.rb', line 310

def misspellings!(value)
  check_loaded
  @options[:misspellings] = value
  self
end

#model_includes(*values) ⇒ Object



326
327
328
# File 'lib/searchkick/relation.rb', line 326

def model_includes(*values)
  clone.model_includes!(*values)
end

#model_includes!(*values) ⇒ Object



330
331
332
333
334
# File 'lib/searchkick/relation.rb', line 330

def model_includes!(*values)
  check_loaded
  (@options[:model_includes] ||= []).concat(values.flatten)
  self
end

#models(*values) ⇒ Object



316
317
318
# File 'lib/searchkick/relation.rb', line 316

def models(*values)
  clone.models!(*values)
end

#models!(*values) ⇒ Object



320
321
322
323
324
# File 'lib/searchkick/relation.rb', line 320

def models!(*values)
  check_loaded
  (@options[:models] ||= []).concat(values.flatten)
  self
end

#offset(value = NO_DEFAULT_VALUE) ⇒ Object



336
337
338
339
340
341
342
# File 'lib/searchkick/relation.rb', line 336

def offset(value = NO_DEFAULT_VALUE)
  if value == NO_DEFAULT_VALUE
    private_execute.offset
  else
    clone.offset!(value)
  end
end

#offset!(value) ⇒ Object



344
345
346
347
348
# File 'lib/searchkick/relation.rb', line 344

def offset!(value)
  check_loaded
  @options[:offset] = value
  self
end

#only(*keys) ⇒ Object



629
630
631
# File 'lib/searchkick/relation.rb', line 629

def only(*keys)
  Relation.new(@model, @term, **@options.slice(*keys))
end

#opaque_id(value) ⇒ Object



350
351
352
# File 'lib/searchkick/relation.rb', line 350

def opaque_id(value)
  clone.opaque_id!(value)
end

#opaque_id!(value) ⇒ Object



354
355
356
357
358
# File 'lib/searchkick/relation.rb', line 354

def opaque_id!(value)
  check_loaded
  @options[:opaque_id] = value
  self
end

#operator(value) ⇒ Object



360
361
362
# File 'lib/searchkick/relation.rb', line 360

def operator(value)
  clone.operator!(value)
end

#operator!(value) ⇒ Object



364
365
366
367
368
# File 'lib/searchkick/relation.rb', line 364

def operator!(value)
  check_loaded
  @options[:operator] = value
  self
end

#order(*values) ⇒ Object



370
371
372
# File 'lib/searchkick/relation.rb', line 370

def order(*values)
  clone.order!(*values)
end

#order!(*values) ⇒ Object



374
375
376
377
378
# File 'lib/searchkick/relation.rb', line 374

def order!(*values)
  check_loaded
  (@options[:order] ||= []).concat(values.flatten)
  self
end

#padding(value = NO_DEFAULT_VALUE) ⇒ Object



380
381
382
383
384
385
386
# File 'lib/searchkick/relation.rb', line 380

def padding(value = NO_DEFAULT_VALUE)
  if value == NO_DEFAULT_VALUE
    private_execute.padding
  else
    clone.padding!(value)
  end
end

#padding!(value) ⇒ Object



388
389
390
391
392
# File 'lib/searchkick/relation.rb', line 388

def padding!(value)
  check_loaded
  @options[:padding] = value
  self
end

#page(value) ⇒ Object



394
395
396
# File 'lib/searchkick/relation.rb', line 394

def page(value)
  clone.page!(value)
end

#page!(value) ⇒ Object



398
399
400
401
402
# File 'lib/searchkick/relation.rb', line 398

def page!(value)
  check_loaded
  @options[:page] = value
  self
end

#per_page(value = NO_DEFAULT_VALUE) ⇒ Object



404
405
406
407
408
409
410
# File 'lib/searchkick/relation.rb', line 404

def per_page(value = NO_DEFAULT_VALUE)
  if value == NO_DEFAULT_VALUE
    private_execute.per_page
  else
    clone.per_page!(value)
  end
end

#per_page!(value) ⇒ Object



412
413
414
415
416
417
# File 'lib/searchkick/relation.rb', line 412

def per_page!(value)
  check_loaded
  # TODO set limit?
  @options[:per_page] = value
  self
end

#pluck(*keys) ⇒ Object



591
592
593
594
595
596
597
# File 'lib/searchkick/relation.rb', line 591

def pluck(*keys)
  if !loaded? && @options[:load] == false
    select(*keys).send(:private_execute).pluck(*keys)
  else
    private_execute.pluck(*keys)
  end
end

#profile(value = true) ⇒ Object



419
420
421
# File 'lib/searchkick/relation.rb', line 419

def profile(value = true)
  clone.profile!(value)
end

#profile!(value = true) ⇒ Object



423
424
425
426
427
# File 'lib/searchkick/relation.rb', line 423

def profile!(value = true)
  check_loaded
  @options[:profile] = value
  self
end

#reorder(*values) ⇒ Object



599
600
601
# File 'lib/searchkick/relation.rb', line 599

def reorder(*values)
  clone.reorder!(*values)
end

#reorder!(*values) ⇒ Object



603
604
605
606
607
# File 'lib/searchkick/relation.rb', line 603

def reorder!(*values)
  check_loaded
  @options[:order] = values
  self
end

#request_params(value) ⇒ Object



429
430
431
# File 'lib/searchkick/relation.rb', line 429

def request_params(value)
  clone.request_params!(value)
end

#request_params!(value) ⇒ Object



433
434
435
436
437
# File 'lib/searchkick/relation.rb', line 433

def request_params!(value)
  check_loaded
  (@options[:request_params] ||= {}).merge!(value)
  self
end

#reselect(*values) ⇒ Object



609
610
611
# File 'lib/searchkick/relation.rb', line 609

def reselect(*values)
  clone.reselect!(*values)
end

#reselect!(*values) ⇒ Object



613
614
615
616
617
# File 'lib/searchkick/relation.rb', line 613

def reselect!(*values)
  check_loaded
  @options[:select] = values
  self
end

#respond_to_missing?Boolean

Returns:

  • (Boolean)


643
644
645
# File 'lib/searchkick/relation.rb', line 643

def respond_to_missing?(...)
  Results.new(nil, nil, nil).respond_to?(...) || super
end

#rewhere(value) ⇒ Object



619
620
621
# File 'lib/searchkick/relation.rb', line 619

def rewhere(value)
  clone.rewhere!(value)
end

#rewhere!(value) ⇒ Object



623
624
625
626
627
# File 'lib/searchkick/relation.rb', line 623

def rewhere!(value)
  check_loaded
  @options[:where] = ensure_permitted(value)
  self
end

#routing(value) ⇒ Object



439
440
441
# File 'lib/searchkick/relation.rb', line 439

def routing(value)
  clone.routing!(value)
end

#routing!(value) ⇒ Object



443
444
445
446
447
# File 'lib/searchkick/relation.rb', line 443

def routing!(value)
  check_loaded
  @options[:routing] = value
  self
end

#scope_results(value) ⇒ Object



449
450
451
# File 'lib/searchkick/relation.rb', line 449

def scope_results(value)
  clone.scope_results!(value)
end

#scope_results!(value) ⇒ Object



453
454
455
456
457
# File 'lib/searchkick/relation.rb', line 453

def scope_results!(value)
  check_loaded
  @options[:scope_results] = value
  self
end

#scroll(value = NO_DEFAULT_VALUE, &block) ⇒ Object



459
460
461
462
463
464
465
466
467
# File 'lib/searchkick/relation.rb', line 459

def scroll(value = NO_DEFAULT_VALUE, &block)
  if value == NO_DEFAULT_VALUE
    private_execute.scroll(&block)
  elsif block_given?
    clone.scroll!(value).scroll(&block)
  else
    clone.scroll!(value)
  end
end

#scroll!(value) ⇒ Object



469
470
471
472
473
# File 'lib/searchkick/relation.rb', line 469

def scroll!(value)
  check_loaded
  @options[:scroll] = value
  self
end

#select(*values, &block) ⇒ Object



475
476
477
478
479
480
481
# File 'lib/searchkick/relation.rb', line 475

def select(*values, &block)
  if block_given?
    private_execute.select(*values, &block)
  else
    clone.select!(*values)
  end
end

#select!(*values) ⇒ Object



483
484
485
486
487
# File 'lib/searchkick/relation.rb', line 483

def select!(*values)
  check_loaded
  (@options[:select] ||= []).concat(values.flatten)
  self
end

#similar(value = true) ⇒ Object



489
490
491
# File 'lib/searchkick/relation.rb', line 489

def similar(value = true)
  clone.similar!(value)
end

#similar!(value = true) ⇒ Object



493
494
495
496
497
# File 'lib/searchkick/relation.rb', line 493

def similar!(value = true)
  check_loaded
  @options[:similar] = value
  self
end

#smart_aggs(value) ⇒ Object



499
500
501
# File 'lib/searchkick/relation.rb', line 499

def smart_aggs(value)
  clone.smart_aggs!(value)
end

#smart_aggs!(value) ⇒ Object



503
504
505
506
507
# File 'lib/searchkick/relation.rb', line 503

def smart_aggs!(value)
  check_loaded
  @options[:smart_aggs] = value
  self
end

#suggest(value = true) ⇒ Object



509
510
511
# File 'lib/searchkick/relation.rb', line 509

def suggest(value = true)
  clone.suggest!(value)
end

#suggest!(value = true) ⇒ Object



513
514
515
516
517
# File 'lib/searchkick/relation.rb', line 513

def suggest!(value = true)
  check_loaded
  @options[:suggest] = value
  self
end

#to_yamlObject



647
648
649
# File 'lib/searchkick/relation.rb', line 647

def to_yaml
  private_execute.to_a.to_yaml
end

#total_entries(value = NO_DEFAULT_VALUE) ⇒ Object



519
520
521
522
523
524
525
# File 'lib/searchkick/relation.rb', line 519

def total_entries(value = NO_DEFAULT_VALUE)
  if value == NO_DEFAULT_VALUE
    private_execute.total_entries
  else
    clone.total_entries!(value)
  end
end

#total_entries!(value) ⇒ Object



527
528
529
530
531
# File 'lib/searchkick/relation.rb', line 527

def total_entries!(value)
  check_loaded
  @options[:total_entries] = value
  self
end

#track(value = true) ⇒ Object



533
534
535
# File 'lib/searchkick/relation.rb', line 533

def track(value = true)
  clone.track!(value)
end

#track!(value = true) ⇒ Object



537
538
539
540
541
# File 'lib/searchkick/relation.rb', line 537

def track!(value = true)
  check_loaded
  @options[:track] = value
  self
end

#type(*values) ⇒ Object



543
544
545
# File 'lib/searchkick/relation.rb', line 543

def type(*values)
  clone.type!(*values)
end

#type!(*values) ⇒ Object



547
548
549
550
551
# File 'lib/searchkick/relation.rb', line 547

def type!(*values)
  check_loaded
  (@options[:type] ||= []).concat(values.flatten)
  self
end

#where(value = NO_DEFAULT_VALUE) ⇒ Object



553
554
555
556
557
558
559
# File 'lib/searchkick/relation.rb', line 553

def where(value = NO_DEFAULT_VALUE)
  if value == NO_DEFAULT_VALUE
    Where.new(self)
  else
    clone.where!(value)
  end
end

#where!(value) ⇒ Object



561
562
563
564
565
566
567
568
569
# File 'lib/searchkick/relation.rb', line 561

def where!(value)
  check_loaded
  if @options[:where]
    @options[:where] = {_and: [@options[:where], ensure_permitted(value)]}
  else
    @options[:where] = ensure_permitted(value)
  end
  self
end