Class: Dynamoid::Criteria::Chain

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/dynamoid/criteria/chain.rb

Overview

The criteria chain is equivalent to an ActiveRecord relation (and realistically I should change the name from chain to relation). It is a chainable object that builds up a query and eventually executes it by a Query or Scan.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source) ⇒ Chain

Create a new criteria chain.

Parameters:

  • source (Class)

    the class upon which the ultimate query will be performed.



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/dynamoid/criteria/chain.rb', line 14

def initialize(source)
  @query = {}
  @source = source
  @consistent_read = false
  @scan_index_forward = true

  # Honor STI and :type field if it presents
  type = @source.inheritance_field
  if @source.attributes.key?(type)
    @query[:"#{type}.in"] = @source.deep_subclasses.map(&:name) << @source.name
  end
end

Instance Attribute Details

#consistent_readObject

Returns the value of attribute consistent_read.



8
9
10
# File 'lib/dynamoid/criteria/chain.rb', line 8

def consistent_read
  @consistent_read
end

#hash_keyObject (readonly)

Returns the value of attribute hash_key.



9
10
11
# File 'lib/dynamoid/criteria/chain.rb', line 9

def hash_key
  @hash_key
end

#index_nameObject (readonly)

Returns the value of attribute index_name.



9
10
11
# File 'lib/dynamoid/criteria/chain.rb', line 9

def index_name
  @index_name
end

#queryObject

Returns the value of attribute query.



8
9
10
# File 'lib/dynamoid/criteria/chain.rb', line 8

def query
  @query
end

#range_keyObject (readonly)

Returns the value of attribute range_key.



9
10
11
# File 'lib/dynamoid/criteria/chain.rb', line 9

def range_key
  @range_key
end

#sourceObject

Returns the value of attribute source.



8
9
10
# File 'lib/dynamoid/criteria/chain.rb', line 8

def source
  @source
end

#valuesObject

Returns the value of attribute values.



8
9
10
# File 'lib/dynamoid/criteria/chain.rb', line 8

def values
  @values
end

Instance Method Details

#allObject

Returns all the records matching the criteria.

Since:

  • 0.2.0



51
52
53
# File 'lib/dynamoid/criteria/chain.rb', line 51

def all
  records
end

#batch(batch_size) ⇒ Object



109
110
111
112
# File 'lib/dynamoid/criteria/chain.rb', line 109

def batch(batch_size)
  @batch_size = batch_size
  self
end

#consistentObject



43
44
45
46
# File 'lib/dynamoid/criteria/chain.rb', line 43

def consistent
  @consistent_read = true
  self
end

#countObject



55
56
57
58
59
60
61
# File 'lib/dynamoid/criteria/chain.rb', line 55

def count
  if key_present?
    count_via_query
  else
    count_via_scan
  end
end

#delete_allObject Also known as: destroy_all

Destroys all the records matching the criteria.



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/dynamoid/criteria/chain.rb', line 73

def delete_all
  ids = []
  ranges = []

  if key_present?
    Dynamoid.adapter.query(source.table_name, range_query).collect do |hash|
      ids << hash[source.hash_key.to_sym]
      ranges << hash[source.range_key.to_sym] if source.range_key
    end
  else
    Dynamoid.adapter.scan(source.table_name, scan_query, scan_opts).collect do |hash|
      ids << hash[source.hash_key.to_sym]
      ranges << hash[source.range_key.to_sym] if source.range_key
    end
  end

  Dynamoid.adapter.delete(source.table_name, ids, range_key: ranges.presence)
end

#each(&block) ⇒ Object

Allows you to use the results of a search as an enumerable over the results found.

Since:

  • 0.2.0



127
128
129
# File 'lib/dynamoid/criteria/chain.rb', line 127

def each(&block)
  records.each(&block)
end

#lastObject

Returns the last fetched record matched the criteria Enumerable doesn’t implement ‘last`, only `first` So we have to implement it ourselves



67
68
69
# File 'lib/dynamoid/criteria/chain.rb', line 67

def last
  all.to_a.last
end

#record_limit(limit) ⇒ Object

The record limit is the limit of evaluated records returned by the query or scan.



95
96
97
98
# File 'lib/dynamoid/criteria/chain.rb', line 95

def record_limit(limit)
  @record_limit = limit
  self
end

#scan_index_forward(scan_index_forward) ⇒ Object



119
120
121
122
# File 'lib/dynamoid/criteria/chain.rb', line 119

def scan_index_forward(scan_index_forward)
  @scan_index_forward = scan_index_forward
  self
end

#scan_limit(limit) ⇒ Object

The scan limit which is the limit of records that DynamoDB will internally query or scan. This is different from the record limit as with filtering DynamoDB may look at N scanned records but return 0 records if none pass the filter.



104
105
106
107
# File 'lib/dynamoid/criteria/chain.rb', line 104

def scan_limit(limit)
  @scan_limit = limit
  self
end

#start(start) ⇒ Object



114
115
116
117
# File 'lib/dynamoid/criteria/chain.rb', line 114

def start(start)
  @start = start
  self
end

#where(args) ⇒ Object

The workhorse method of the criteria chain. Each key in the passed in hash will become another criteria that the ultimate query must match. A key can either be a symbol or a string, and should be an attribute name or an attribute name with a range operator.

Examples:

A simple criteria

where(:name => 'Josh')

A more complicated criteria

where(:name => 'Josh', 'created_at.gt' => DateTime.now - 1.day)

Since:

  • 0.2.0



38
39
40
41
# File 'lib/dynamoid/criteria/chain.rb', line 38

def where(args)
  query.update(args.dup.symbolize_keys)
  self
end