Module: PostJson::FinderMethods

Extended by:
ActiveSupport::Concern
Includes:
ArgumentMethods, QueryMethods
Included in:
QueryTranslator
Defined in:
lib/post_json/concerns/finder_methods.rb

Instance Method Summary collapse

Methods included from ArgumentMethods

#assert_valid_indifferent_keys, #flatten_arguments, #join_arguments

Methods included from QueryMethods

#add_query, #except, #except!, #limit, #limit!, #offset, #offset!, #only, #only!, #order, #order!, #page, #page!, #query_clone, #query_tree, #query_tree_renew!, #reorder, #reorder!, #reverse_order, #reverse_order!, #where, #where!

Instance Method Details

#any?Boolean

Returns:

  • (Boolean)

14
15
16
# File 'lib/post_json/concerns/finder_methods.rb', line 14

def any?
  execute { |documents| documents.any? }
end

#blank?Boolean

Returns:

  • (Boolean)

18
19
20
# File 'lib/post_json/concerns/finder_methods.rb', line 18

def blank?
  execute { |documents| documents.blank? }
end

#count(column_name = nil, options = {}) ⇒ Object


22
23
24
25
26
27
28
29
# File 'lib/post_json/concerns/finder_methods.rb', line 22

def count(column_name = nil, options = {})
  selector =  if column_name.present?
                define_selector(column_name)
              else
                column_name
              end
  execute { |documents| documents.count(selector, options) }
end

#delete(id_or_array) ⇒ Object


31
32
33
# File 'lib/post_json/concerns/finder_methods.rb', line 31

def delete(id_or_array)
  where(id: id_or_array).delete_all
end

#delete_all(conditions = nil) ⇒ Object


35
36
37
# File 'lib/post_json/concerns/finder_methods.rb', line 35

def delete_all(conditions = nil)
  where(conditions).execute { |documents| documents.delete_all }
end

#destroy(id) ⇒ Object


39
40
41
42
# File 'lib/post_json/concerns/finder_methods.rb', line 39

def destroy(id)
  value = id ? id.to_s.downcase : nil
  execute { |documents| documents.destroy(value) }
end

#destroy_all(conditions = nil) ⇒ Object


44
45
46
# File 'lib/post_json/concerns/finder_methods.rb', line 44

def destroy_all(conditions = nil)
  where(conditions).execute { |documents| documents.destroy_all }
end

#empty?Boolean

Returns:

  • (Boolean)

48
49
50
# File 'lib/post_json/concerns/finder_methods.rb', line 48

def empty?
  execute { |documents| documents.empty? }
end

#exists?(conditions = nil) ⇒ Boolean

Returns:

  • (Boolean)

52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/post_json/concerns/finder_methods.rb', line 52

def exists?(conditions = nil)
  query = case conditions
          when nil
            self
          when Numeric, String
            where({id: conditions})
          else
            where(conditions)
          end

  query.execute { |documents| documents.exists? }
end

#find(*args) ⇒ Object


65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/post_json/concerns/finder_methods.rb', line 65

def find(*args)
  if args.length == 0
    execute { |documents| documents.find }
  elsif args.length == 1 && args[0].is_a?(Array)
    ids = args[0].map{|id| id ? id.to_s.downcase : nil}
    execute { |documents| documents.find(ids) }
  elsif args.length == 1 && args[0].is_a?(Array) == false
    id = args[0] ? args[0].to_s.downcase : nil
    execute { |documents| documents.find(id) }
  else
    ids = args.map{|id| id ? id.to_s.downcase : nil}
    execute { |documents| documents.find(ids) }
  end
end

#find_by(*args) ⇒ Object


80
81
82
# File 'lib/post_json/concerns/finder_methods.rb', line 80

def find_by(*args)
  where(*args).first
end

#find_by!(*args) ⇒ Object


84
85
86
# File 'lib/post_json/concerns/finder_methods.rb', line 84

def find_by!(*args)
  find_by(*args) or raise ActiveRecord::RecordNotFound
end

#find_each(options = {}) ⇒ Object


88
89
90
# File 'lib/post_json/concerns/finder_methods.rb', line 88

def find_each(options = {})
  execute { |documents| documents.find_each(options) }
end

#find_in_batches(options = {}) ⇒ Object


92
93
94
# File 'lib/post_json/concerns/finder_methods.rb', line 92

def find_in_batches(options = {})
  execute { |documents| documents.find_in_batches(options) }
end

#first(limit = nil) ⇒ Object


96
97
98
99
100
101
102
# File 'lib/post_json/concerns/finder_methods.rb', line 96

def first(limit = nil)
  if limit
    limit(limit).execute { |documents| documents.first }
  else
    execute { |documents| documents.first }
  end
end

#first!Object


104
105
106
# File 'lib/post_json/concerns/finder_methods.rb', line 104

def first!
  execute { |documents| documents.first! }
end

#first_or_create(attributes = {}) ⇒ Object


108
109
110
111
# File 'lib/post_json/concerns/finder_methods.rb', line 108

def first_or_create(attributes = {})
  attributes = where_values_hash.with_indifferent_access.deep_merge(attributes)
  first or create(attributes)
end

#first_or_initialize(attributes = {}) ⇒ Object


113
114
115
116
# File 'lib/post_json/concerns/finder_methods.rb', line 113

def first_or_initialize(attributes = {})
  attributes = where_values_hash.with_indifferent_access.deep_merge(attributes)
  first or model_class.new(attributes)
end

#idsObject


118
119
120
# File 'lib/post_json/concerns/finder_methods.rb', line 118

def ids
  pluck('id')
end

#last(limit = nil) ⇒ Object


122
123
124
# File 'lib/post_json/concerns/finder_methods.rb', line 122

def last(limit = nil)
  reverse_order.first(limit)
end

#last!Object


126
127
128
# File 'lib/post_json/concerns/finder_methods.rb', line 126

def last!
  reverse_order.first!
end

#loadObject


130
131
132
# File 'lib/post_json/concerns/finder_methods.rb', line 130

def load
  execute { |documents| documents.load }
end

#many?Boolean

Returns:

  • (Boolean)

134
135
136
# File 'lib/post_json/concerns/finder_methods.rb', line 134

def many?
  execute { |documents| documents.many? }
end

#pluck(*selectors) ⇒ Object


138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/post_json/concerns/finder_methods.rb', line 138

def pluck(*selectors)
  selectors = join_arguments(*selectors)
  if selectors == ""
    []
  elsif selectors == "*"
    execute { |documents| documents.pluck("\"#{table_name}\".__doc__body") }
  elsif selectors == "id"
    execute { |documents| documents.pluck("\"#{table_name}\".id") }
  else
    result = nil
    execute { |documents| result = documents.pluck("json_selectors('#{selectors}', \"#{table_name}\".__doc__body)") }
    if selectors.include?(",")
      result
    else
      result.flatten(1)
    end
  end
end

#select(*selectors) ⇒ Object


157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/post_json/concerns/finder_methods.rb', line 157

def select(*selectors)
  selectors = selectors.flatten(1)
  if selectors.length == 0
    []
  elsif selectors.length == 1
    selector = selectors[0]
    case selector
    when String, Symbol
      selector = selector.to_s.gsub(/\s+/, '')
      if selector == "*"
        pluck("*").map { |body| body ? Hashie::Mash.new(body) : body }
      else
        selectors = selector.split(",")
        if selectors.length == 1
          select({selector => selector})
        else
          select(selectors)
        end
      end
    when Hash
      flat_hash = selector.flatten_hash
      pluck(flat_hash.values).map do |row|
        flat_body = if flat_hash.keys.length == 1
                      {flat_hash.keys[0] => row}
                    else
                      Hash[flat_hash.keys.zip(row)]
                    end
        deep_hash = flat_body.deepen_hash
        Hashie::Mash.new(deep_hash) if deep_hash
      end
    else
      raise ArgumentError, "Invalid argument(s): #{selectors.inspect}"
    end
  else
    select(Hash[selectors.zip(selectors)])
  end
end

#sizeObject


195
196
197
# File 'lib/post_json/concerns/finder_methods.rb', line 195

def size
  execute { |documents| documents.size }
end

#take(limit = nil) ⇒ Object


199
200
201
# File 'lib/post_json/concerns/finder_methods.rb', line 199

def take(limit = nil)
  execute { |documents| documents.take(limit) }
end

#take!Object


203
204
205
# File 'lib/post_json/concerns/finder_methods.rb', line 203

def take!
  execute { |documents| documents.take! }
end

#to_aObject


207
208
209
# File 'lib/post_json/concerns/finder_methods.rb', line 207

def to_a
  execute { |documents| documents.to_a }
end

#to_sqlObject


211
212
213
# File 'lib/post_json/concerns/finder_methods.rb', line 211

def to_sql
  execute { |documents| documents.to_sql }
end

#where_values_hashObject


215
216
217
218
219
220
221
222
223
# File 'lib/post_json/concerns/finder_methods.rb', line 215

def where_values_hash
  where_equals = query_tree[:where_equal] || []
  values_hash = where_equals.inject({}) do |result, where_equal|
    key = where_equal[:attribute]
    result[key] = where_equal[:argument]
    result
  end
  values_hash.deepen_hash
end