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.

Constant Summary collapse

TYPES_TO_DUMP_FOR_QUERY =

TODO: Should we transform any other types of query values?

[:string, :integer, :boolean]

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.



15
16
17
18
19
20
# File 'lib/dynamoid/criteria/chain.rb', line 15

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

Instance Attribute Details

#consistent_readObject

Returns the value of attribute consistent_read.



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

def consistent_read
  @consistent_read
end

#queryObject

Returns the value of attribute query.



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

def query
  @query
end

#sourceObject

Returns the value of attribute source.



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

def source
  @source
end

#valuesObject

Returns the value of attribute values.



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

def values
  @values
end

Instance Method Details

#allObject

Returns all the records matching the criteria.

Since:

  • 0.2.0



53
54
55
# File 'lib/dynamoid/criteria/chain.rb', line 53

def all
  records
end

#batch(batch_size) ⇒ Object



84
85
86
87
# File 'lib/dynamoid/criteria/chain.rb', line 84

def batch(batch_size)
  @batch_size = batch_size
  self
end

#consistentObject



45
46
47
48
# File 'lib/dynamoid/criteria/chain.rb', line 45

def consistent
  @consistent_read = true
  self
end

#consistent_optsObject



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

def consistent_opts
  { :consistent_read => consistent_read }
end

#destroy_allObject

Destroys all the records matching the criteria.



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/dynamoid/criteria/chain.rb', line 59

def destroy_all
  ids = []

  if key_present?
    ranges = []
    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]
    end

    Dynamoid.adapter.delete(source.table_name, ids,{:range_key => ranges})
  else
    Dynamoid.adapter.scan(source.table_name, query, scan_opts).collect do |hash|
      ids << hash[source.hash_key.to_sym]
    end

    Dynamoid.adapter.delete(source.table_name, ids)
  end
end

#each(&block) ⇒ Object

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

Since:

  • 0.2.0



102
103
104
# File 'lib/dynamoid/criteria/chain.rb', line 102

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

#eval_limit(limit) ⇒ Object



79
80
81
82
# File 'lib/dynamoid/criteria/chain.rb', line 79

def eval_limit(limit)
  @eval_limit = limit
  self
end

#scan_index_forward(scan_index_forward) ⇒ Object



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

def scan_index_forward(scan_index_forward)
  @scan_index_forward = scan_index_forward
  self
end

#start(start) ⇒ Object



89
90
91
92
# File 'lib/dynamoid/criteria/chain.rb', line 89

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



33
34
35
36
37
38
39
40
41
42
43
# File 'lib/dynamoid/criteria/chain.rb', line 33

def where(args)
  args.each do |k, v|
    sym = k.to_sym
    query[sym] = if (field_options = source.attributes[sym]) && (type = field_options[:type]) && TYPES_TO_DUMP_FOR_QUERY.include?(type)
                   source.dump_field(v, field_options)
                 else
                   v
                 end
  end
  self
end