parse-stack 1.5.3 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.github/parse-ruby-sdk.png +0 -0
  3. data/Changes.md +25 -1
  4. data/Gemfile.lock +4 -4
  5. data/README.md +37 -31
  6. data/bin/console +3 -0
  7. data/lib/parse/api/all.rb +2 -1
  8. data/lib/parse/api/apps.rb +12 -0
  9. data/lib/parse/api/config.rb +5 -1
  10. data/lib/parse/api/files.rb +1 -0
  11. data/lib/parse/api/hooks.rb +1 -0
  12. data/lib/parse/api/objects.rb +4 -1
  13. data/lib/parse/api/push.rb +1 -0
  14. data/lib/parse/api/{schemas.rb → schema.rb} +7 -0
  15. data/lib/parse/api/server.rb +44 -0
  16. data/lib/parse/api/sessions.rb +1 -0
  17. data/lib/parse/api/users.rb +4 -1
  18. data/lib/parse/client.rb +109 -73
  19. data/lib/parse/client/authentication.rb +2 -1
  20. data/lib/parse/client/batch.rb +9 -1
  21. data/lib/parse/client/body_builder.rb +16 -1
  22. data/lib/parse/client/caching.rb +15 -13
  23. data/lib/parse/client/protocol.rb +27 -15
  24. data/lib/parse/client/response.rb +26 -8
  25. data/lib/parse/model/acl.rb +1 -1
  26. data/lib/parse/model/associations/belongs_to.rb +18 -19
  27. data/lib/parse/model/associations/collection_proxy.rb +6 -0
  28. data/lib/parse/model/associations/has_many.rb +5 -6
  29. data/lib/parse/model/bytes.rb +4 -1
  30. data/lib/parse/model/classes/user.rb +46 -44
  31. data/lib/parse/model/core/actions.rb +508 -460
  32. data/lib/parse/model/core/builder.rb +75 -0
  33. data/lib/parse/model/core/errors.rb +9 -0
  34. data/lib/parse/model/core/fetching.rb +42 -38
  35. data/lib/parse/model/core/properties.rb +46 -27
  36. data/lib/parse/model/core/querying.rb +231 -228
  37. data/lib/parse/model/core/schema.rb +76 -74
  38. data/lib/parse/model/date.rb +10 -2
  39. data/lib/parse/model/file.rb +16 -2
  40. data/lib/parse/model/geopoint.rb +9 -2
  41. data/lib/parse/model/model.rb +38 -7
  42. data/lib/parse/model/object.rb +60 -19
  43. data/lib/parse/model/pointer.rb +22 -1
  44. data/lib/parse/model/push.rb +6 -2
  45. data/lib/parse/query.rb +57 -11
  46. data/lib/parse/query/constraint.rb +5 -2
  47. data/lib/parse/query/constraints.rb +588 -589
  48. data/lib/parse/query/ordering.rb +2 -2
  49. data/lib/parse/stack.rb +1 -0
  50. data/lib/parse/stack/version.rb +1 -1
  51. data/lib/parse/webhooks.rb +30 -29
  52. data/lib/parse/webhooks/payload.rb +181 -168
  53. data/lib/parse/webhooks/registration.rb +1 -1
  54. data/parse-stack.gemspec +9 -9
  55. metadata +9 -12
@@ -65,7 +65,7 @@ module Parse
65
65
  #
66
66
  # @see Parse::Object
67
67
  class Pointer < Model
68
- # Attributes of a Pointer.
68
+ # The default attributes in a Parse Pointer hash.
69
69
  ATTRIBUTES = { __type: :string, className: :string, objectId: :string}.freeze
70
70
  # @return [String] the name of the Parse class for this pointer.
71
71
  attr_accessor :parse_class
@@ -155,6 +155,27 @@ module Parse
155
155
  def present?
156
156
  parse_class.present? && @id.present?
157
157
  end
158
+
159
+ # Access the pointer properties through hash accessor. This is done for
160
+ # compatibility with the hash access of a Parse::Object. This method
161
+ # returns nil if the key is not one of: :id, :objectId, or :className.
162
+ # @param key [String] the name of the property.
163
+ # @return [Object] the value for this key.
164
+ def [](key)
165
+ return nil unless [:id,:objectId,:className].include?(key.to_sym)
166
+ send(key)
167
+ end
168
+
169
+ # Set the pointer properties through hash accessor. This is done for
170
+ # compatibility with the hash access of a Parse::Object. This method
171
+ # does nothing if the key is not one of: :id, :objectId, or :className.
172
+ # @param key (see #[])
173
+ # @return [Object]
174
+ def []=(key,value)
175
+ return unless [:id,:objectId,:className].include?(key.to_sym)
176
+ send("#{key}=",value)
177
+ end
178
+
158
179
  end
159
180
 
160
181
  end
@@ -89,12 +89,16 @@ module Parse
89
89
  @query ||= Parse::Query.new(Parse::Model::CLASS_INSTALLATION)
90
90
  end
91
91
 
92
- # @!attribute [rw] where
93
- # @return [Hash] a hash of 'where' query constraints
92
+ # Set a hash of conditions for this push query.
93
+ # @return [Parse::Query]
94
94
  def where=(where_clausees)
95
95
  query.where where_clauses
96
96
  end
97
97
 
98
+ # Apply a set of constraints.
99
+ # @param constraints [Hash] the set of {Parse::Query} cosntraints
100
+ # @return [Hash] if no constraints were passed, returns a compiled query.
101
+ # @return [Parse::Query] if constraints were passed, returns the chainable query.
98
102
  def where(constraints = nil)
99
103
  return query.compile_where unless constraints.is_a?(Hash)
100
104
  query.where constraints
data/lib/parse/query.rb CHANGED
@@ -150,13 +150,24 @@ module Parse
150
150
  # if you do not want any field formatting to be performed.
151
151
 
152
152
  @field_formatter = :columnize
153
+ @allow_scope_introspection = false
153
154
  class << self
155
+
156
+ # @!attribute allow_scope_introspection
157
+ # The attribute will prevent automatically fetching results of a scope when
158
+ # using the console. This is useful when you want to see the queries of scopes
159
+ # instead of automatically returning the results.
160
+ # @return [Boolean] true to have scopes return query objects instead of results when
161
+ # running in the console.
162
+
163
+ # @!attribute field_formatter
154
164
  # The method to use when converting field names to Parse column names. Default is {String#columnize}.
155
165
  # By convention Parse uses lowercase-first camelcase syntax for field/column names, but ruby
156
166
  # uses snakecase. To support this methodology we process all field constraints through the method
157
167
  # defined by the field formatter. You may set this to nil to turn off this functionality.
158
168
  # @return [Symbol] The filter method to process column and field names. Default {String#columnize}.
159
- attr_accessor :field_formatter
169
+
170
+ attr_accessor :field_formatter, :allow_scope_introspection
160
171
 
161
172
  # @param str [String] the string to format
162
173
  # @return [String] formatted string using {Parse::Query.field_formatter}.
@@ -196,6 +207,16 @@ module Parse
196
207
  end
197
208
  end
198
209
 
210
+ # Applies special singleton methods to a query instance in order to
211
+ # automatically fetch results when using any ruby console.
212
+ # @!visibility private
213
+ def apply_auto_introspection!(query)
214
+ unless @allow_scope_introspection
215
+ query.define_singleton_method(:to_s) { self.results.to_s }
216
+ query.define_singleton_method(:inspect) { self.results.to_a.inspect }
217
+ end
218
+ end
219
+
199
220
  end
200
221
 
201
222
  # @!attribute [r] client
@@ -269,7 +290,10 @@ module Parse
269
290
  end # initialize
270
291
 
271
292
  # Add a set of query expressions and constraints.
272
- # @param expressions
293
+ # @example
294
+ # query.conditions({:field.gt => value})
295
+ # @param expressions [Hash] containing key value pairs of Parse::Operations
296
+ # and their value.
273
297
  # @return [self]
274
298
  def conditions(expressions = {})
275
299
  expressions.each do |expression, value|
@@ -390,7 +414,7 @@ module Parse
390
414
  # to get as many as 11_000 records with the aid if skipping.
391
415
  # @return [self]
392
416
  def limit(count)
393
- if count == :max || count == :all
417
+ if count == :max
394
418
  @limit = 11_000
395
419
  elsif count.is_a?(Numeric)
396
420
  @limit = [ 0, count.to_i, 11_000].sort[1]
@@ -475,10 +499,19 @@ module Parse
475
499
  self #chaining
476
500
  end
477
501
 
478
- # @return [Array<Parse::Constraint>] an array of constraints
502
+ # @param raw [Boolean] whether to return the hash form of the constraints.
503
+ # @return [Array<Parse::Constraint>] if raw is false, an array of constraints
479
504
  # composing the :where clause for this query.
480
- def constraints
481
- @where
505
+ # @return [Hash] if raw i strue, an hash representing the constraints.
506
+ def constraints(raw = false)
507
+ raw ? where_constraints : @where
508
+ end
509
+
510
+ # Formats the current set of Parse::Constraint instances in the where clause
511
+ # as an expression hash.
512
+ # @return [Hash] the set of constraints
513
+ def where_constraints
514
+ @where.reduce({}) { |memo, constraint| memo[constraint.operation] = constraint.value; memo }
482
515
  end
483
516
 
484
517
  # Add additional query constraints to the `where` clause. The `where` clause
@@ -527,17 +560,17 @@ module Parse
527
560
  return self if where_clauses.blank?
528
561
  # we can only have one compound query constraint. If we need to add another OR clause
529
562
  # let's find the one we have (if any)
530
- compound = @where.find { |f| f.is_a?(Parse::CompoundQueryConstraint) }
563
+ compound = @where.find { |f| f.is_a?(Parse::Constraint::CompoundQueryConstraint) }
531
564
  # create a set of clauses that are not an OR clause.
532
- remaining_clauses = @where.select { |f| f.is_a?(Parse::CompoundQueryConstraint) == false }
565
+ remaining_clauses = @where.select { |f| f.is_a?(Parse::Constraint::CompoundQueryConstraint) == false }
533
566
  # if we don't have a OR clause to reuse, then create a new one with then
534
567
  # current set of constraints
535
568
  if compound.blank?
536
- compound = Parse::CompoundQueryConstraint.new :or, [ Parse::Query.compile_where(remaining_clauses) ]
569
+ compound = Parse::Constraint::CompoundQueryConstraint.new :or, [ Parse::Query.compile_where(remaining_clauses) ]
537
570
  end
538
571
  # then take the where clauses from the second query and append them.
539
572
  compound.value.push Parse::Query.compile_where(where_clauses)
540
- #compound = Parse::CompoundQueryConstraint.new :or, [remaining_clauses, or_where_query.where]
573
+ #compound = Parse::Constraint::CompoundQueryConstraint.new :or, [remaining_clauses, or_where_query.where]
541
574
  @where = [compound]
542
575
  self #chaining
543
576
  end
@@ -705,6 +738,19 @@ module Parse
705
738
  end
706
739
  alias_method :result, :results
707
740
 
741
+ # Similar to {#results} but takes an additional set of conditions to apply. This
742
+ # method helps support the use of class and instance level scopes.
743
+ # @param expressions (see #conditions)
744
+ # @yield (see #results)
745
+ # @return [Array<Hash>] if raw is set to true, a set of Parse JSON hashes.
746
+ # @return [Array<Parse::Object>] if raw is set to false, a list of matching Parse::Object subclasses.
747
+ # @see #results
748
+ def all(expressions = {limit: :max})
749
+ conditions(expressions)
750
+ return results(&Proc.new) if block_given?
751
+ results
752
+ end
753
+
708
754
  # Builds objects based on the set of Parse JSON hashes in an array.
709
755
  # @param list [Array<Hash>] a list of Parse JSON hashes
710
756
  # @return [Array<Parse::Object>] an array of Parse::Object subclasses.
@@ -734,7 +780,7 @@ module Parse
734
780
  def compile(encode: true, includeClassName: false)
735
781
  run_callbacks :prepare do
736
782
  q = {} #query
737
- q[:limit] = 11_000 if @limit == :max || @limit == :all
783
+ q[:limit] = 11_000 if @limit == :max
738
784
  q[:limit] = @limit if @limit.is_a?(Numeric) && @limit > 0
739
785
  q[:skip] = @skip if @skip > 0
740
786
 
@@ -12,6 +12,7 @@ module Parse
12
12
  # be combined by merging different constraints (since they are multiple hashes)
13
13
  # and some constraints may have higher precedence than others (ex. equality is higher
14
14
  # precedence than an "in" query).
15
+ #
15
16
  # All constraints should inherit from Parse::Constraint and should
16
17
  # register their specific Operation method (ex. :eq or :lte)
17
18
  # For more information about the query design pattern from DataMapper
@@ -102,8 +103,8 @@ module Parse
102
103
  # @return [Object] a formatted value based on the data type.
103
104
  def formatted_value(value)
104
105
  d = value
105
- d = { __type: "Date", iso: d.utc.iso8601(3) } if d.respond_to?(:utc)
106
- d = { __type: "Date", iso: d.iso8601(3) } if d.respond_to?(:iso8601)
106
+ d = { __type: Parse::Model::TYPE_DATE, iso: d.utc.iso8601(3) } if d.respond_to?(:utc)
107
+ d = { __type: Parse::Model::TYPE_DATE, iso: d.iso8601(3) } if d.respond_to?(:iso8601)
107
108
  d = d.pointer if d.respond_to?(:pointer) #simplified query object
108
109
  d = d.to_s if d.is_a?(Regexp)
109
110
  #d = d.pointer if d.is_a?(Parse::Object) #simplified query object
@@ -162,6 +163,8 @@ module Parse
162
163
  # Builds the JSON hash representation of this constraint for a Parse query.
163
164
  # This method should be overriden by subclasses. The default implementation
164
165
  # implements buildling the equality constraint.
166
+ # @raise ArgumentError if the constraint could be be build due to a bad parameter.
167
+ # This will be different depending on the constraint subclass.
165
168
  # @return [Hash]
166
169
  def build
167
170
  return { @operation.operand => formatted_value } if @operation.operator == :eq || key.nil?
@@ -12,656 +12,655 @@ require_relative 'constraint'
12
12
  # that inspired this, see http://datamapper.org/docs/find.html
13
13
 
14
14
  module Parse
15
- # Error for when there is a problem with the input passed to a constraint.
16
- class ConstraintError < StandardError; end;
17
-
18
- # A constraint for matching by a specific objectId value.
19
- #
20
- # # where this Parse object equals the object in the column `field`.
21
- # q.where :field => Parse::Pointer("Field", "someObjectId")
22
- # # alias, shorthand when we infer `:field` maps to `Field` parse class.
23
- # q.where :field.id => "someObjectId"
24
- # # "field":{"__type":"Pointer","className":"Field","objectId":"someObjectId"}}
25
- #
26
- # class Artist < Parse::Object
27
- # end
28
- #
29
- # class Song < Parse::Object
30
- # belongs_to :artist
31
- # end
32
- #
33
- # artist = Artist.first # get any artist
34
- # artist_id = artist.id # ex. artist.id
35
- #
36
- # # find all songs for this artist object
37
- # Song.all :artist => artist
38
- # In some cases, you do not have the Parse object, but you have its `objectId`.
39
- # You can use the objectId in the query as follows:
40
- #
41
- # # shorthand if you are using convention. Will infer class `Artist`
42
- # Song.all :artist.id => artist_id
43
- #
44
- # # other approaches, same result
45
- # Song.all :artist => Artist.pointer(artist_id)
46
- # Song.all :artist => Parse::Pointer.new("Artist", artist_id)
47
- #
48
- class ObjectIdConstraint < Constraint
49
- # @!method id
50
- # A registered method on a symbol to create the constraint.
51
- # @example
15
+ class Constraint
16
+ # A constraint for matching by a specific objectId value.
17
+ #
18
+ # # where this Parse object equals the object in the column `field`.
19
+ # q.where :field => Parse::Pointer("Field", "someObjectId")
20
+ # # alias, shorthand when we infer `:field` maps to `Field` parse class.
52
21
  # q.where :field.id => "someObjectId"
53
- # @return [ObjectIdConstraint]
54
- register :id
55
-
56
- # @return [Hash] the compiled constraint.
57
- def build
58
- className = operand.to_parse_class
59
- value = formatted_value
60
- begin
61
- klass = className.constantize
62
- rescue NameError => e
63
- klass = Parse::Model.find_class className
64
- end
22
+ # # "field":{"__type":"Pointer","className":"Field","objectId":"someObjectId"}}
23
+ #
24
+ # class Artist < Parse::Object
25
+ # end
26
+ #
27
+ # class Song < Parse::Object
28
+ # belongs_to :artist
29
+ # end
30
+ #
31
+ # artist = Artist.first # get any artist
32
+ # artist_id = artist.id # ex. artist.id
33
+ #
34
+ # # find all songs for this artist object
35
+ # Song.all :artist => artist
36
+ # In some cases, you do not have the Parse object, but you have its `objectId`.
37
+ # You can use the objectId in the query as follows:
38
+ #
39
+ # # shorthand if you are using convention. Will infer class `Artist`
40
+ # Song.all :artist.id => artist_id
41
+ #
42
+ # # other approaches, same result
43
+ # Song.all :artist => Artist.pointer(artist_id)
44
+ # Song.all :artist => Parse::Pointer.new("Artist", artist_id)
45
+ #
46
+ class ObjectIdConstraint < Constraint
47
+ # @!method id
48
+ # A registered method on a symbol to create the constraint.
49
+ # @example
50
+ # q.where :field.id => "someObjectId"
51
+ # @return [ObjectIdConstraint]
52
+ register :id
53
+
54
+ # @return [Hash] the compiled constraint.
55
+ def build
56
+ className = operand.to_parse_class
57
+ value = formatted_value
58
+ begin
59
+ klass = className.constantize
60
+ rescue NameError => e
61
+ klass = Parse::Model.find_class className
62
+ end
65
63
 
66
- unless klass.present? && klass.is_a?(Parse::Object) == false
67
- raise ConstraintError, "#{self.class}: No Parse class defined for #{operand} as '#{className}'"
68
- end
64
+ unless klass.present? && klass.is_a?(Parse::Object) == false
65
+ raise ArgumentError, "#{self.class}: No Parse class defined for #{operand} as '#{className}'"
66
+ end
69
67
 
70
- # allow symbols
71
- value = value.to_s if value.is_a?(Symbol)
68
+ # allow symbols
69
+ value = value.to_s if value.is_a?(Symbol)
72
70
 
73
- unless value.is_a?(String) && value.strip.present?
74
- raise ConstraintError, "#{self.class}: value must be of string type representing a Parse object id."
71
+ unless value.is_a?(String) && value.strip.present?
72
+ raise ArgumentError, "#{self.class}: value must be of string type representing a Parse object id."
73
+ end
74
+ value.strip!
75
+ return { @operation.operand => klass.pointer(value) }
75
76
  end
76
- value.strip!
77
- return { @operation.operand => klass.pointer(value) }
77
+
78
78
  end
79
79
 
80
- end
80
+ # Equivalent to the `$or` Parse query operation. This is useful if you want to
81
+ # find objects that match several queries. We overload the `|` operator in
82
+ # order to have a clean syntax for joining these `or` operations.
83
+ # or_query = query1 | query2 | query3
84
+ # query = Player.where(:wins.gt => 150) | Player.where(:wins.lt => 5)
85
+ #
86
+ # query.or_where :field => value
87
+ #
88
+ class CompoundQueryConstraint < Constraint
89
+ contraint_keyword :$or
90
+ register :or
91
+
92
+ # @return [Hash] the compiled constraint.
93
+ def build
94
+ or_clauses = formatted_value
95
+ return { :$or => Array.wrap(or_clauses) }
96
+ end
81
97
 
82
- # Equivalent to the `$or` Parse query operation. This is useful if you want to
83
- # find objects that match several queries. We overload the `|` operator in
84
- # order to have a clean syntax for joining these `or` operations.
85
- # or_query = query1 | query2 | query3
86
- # query = Player.where(:wins.gt => 150) | Player.where(:wins.lt => 5)
87
- #
88
- # query.or_where :field => value
89
- #
90
- class CompoundQueryConstraint < Constraint
91
- contraint_keyword :$or
92
- register :or
93
-
94
- # @return [Hash] the compiled constraint.
95
- def build
96
- or_clauses = formatted_value
97
- return { :$or => Array.wrap(or_clauses) }
98
98
  end
99
99
 
100
- end
101
-
102
- # Equivalent to the `$lte` Parse query operation. The alias `on_or_before` is provided for readability.
103
- # q.where :field.lte => value
104
- # q.where :field.on_or_before => date
105
- #
106
- # q.where :created_at.on_or_before => DateTime.now
107
- # @see LessThanConstraint
108
- class LessThanOrEqualConstraint < Constraint
109
- # @!method lte
110
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$lte".
111
- # @example
100
+ # Equivalent to the `$lte` Parse query operation. The alias `on_or_before` is provided for readability.
112
101
  # q.where :field.lte => value
113
- # @return [LessThanOrEqualConstraint]
114
-
115
- # @!method less_than_or_equal
116
- # Alias for {lte}
117
- # @return [LessThanOrEqualConstraint]
118
-
119
- # @!method on_or_before
120
- # Alias for {lte} that provides better readability when constraining dates.
121
- # @return [LessThanOrEqualConstraint]
122
- contraint_keyword :$lte
123
- register :lte
124
- register :less_than_or_equal
125
- register :on_or_before
126
- end
102
+ # q.where :field.on_or_before => date
103
+ #
104
+ # q.where :created_at.on_or_before => DateTime.now
105
+ # @see LessThanConstraint
106
+ class LessThanOrEqualConstraint < Constraint
107
+ # @!method lte
108
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$lte".
109
+ # @example
110
+ # q.where :field.lte => value
111
+ # @return [LessThanOrEqualConstraint]
112
+
113
+ # @!method less_than_or_equal
114
+ # Alias for {lte}
115
+ # @return [LessThanOrEqualConstraint]
116
+
117
+ # @!method on_or_before
118
+ # Alias for {lte} that provides better readability when constraining dates.
119
+ # @return [LessThanOrEqualConstraint]
120
+ contraint_keyword :$lte
121
+ register :lte
122
+ register :less_than_or_equal
123
+ register :on_or_before
124
+ end
127
125
 
128
- # Equivalent to the `$lt` Parse query operation. The alias `before` is provided for readability.
129
- # q.where :field.lt => value
130
- # q.where :field.before => date
131
- #
132
- # q.where :created_at.before => DateTime.now
133
- class LessThanConstraint < Constraint
134
- # @!method lt
135
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$lt".
136
- # @example
126
+ # Equivalent to the `$lt` Parse query operation. The alias `before` is provided for readability.
137
127
  # q.where :field.lt => value
138
- # @return [LessThanConstraint]
139
-
140
- # @!method less_than
141
- # # Alias for {lt}.
142
- # @return [LessThanConstraint]
143
-
144
- # @!method before
145
- # Alias for {lt} that provides better readability when constraining dates.
146
- # @return [LessThanConstraint]
147
- contraint_keyword :$lt
148
- register :lt
149
- register :less_than
150
- register :before
151
- end
152
- # Equivalent to the `$gt` Parse query operation. The alias `after` is provided for readability.
153
- # q.where :field.gt => value
154
- # q.where :field.after => date
155
- #
156
- # q.where :created_at.after => DateTime.now
157
- # @see GreaterThanOrEqualConstraint
158
- class GreaterThanConstraint < Constraint
159
- # @!method gt
160
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$gt".
161
- # @example
128
+ # q.where :field.before => date
129
+ #
130
+ # q.where :created_at.before => DateTime.now
131
+ class LessThanConstraint < Constraint
132
+ # @!method lt
133
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$lt".
134
+ # @example
135
+ # q.where :field.lt => value
136
+ # @return [LessThanConstraint]
137
+
138
+ # @!method less_than
139
+ # # Alias for {lt}.
140
+ # @return [LessThanConstraint]
141
+
142
+ # @!method before
143
+ # Alias for {lt} that provides better readability when constraining dates.
144
+ # @return [LessThanConstraint]
145
+ contraint_keyword :$lt
146
+ register :lt
147
+ register :less_than
148
+ register :before
149
+ end
150
+ # Equivalent to the `$gt` Parse query operation. The alias `after` is provided for readability.
162
151
  # q.where :field.gt => value
163
- # @return [GreaterThanConstraint]
164
-
165
- # @!method greater_than
166
- # # Alias for {gt}.
167
- # @return [GreaterThanConstraint]
168
-
169
- # @!method after
170
- # Alias for {gt} that provides better readability when constraining dates.
171
- # @return [GreaterThanConstraint]
172
- contraint_keyword :$gt
173
- register :gt
174
- register :greater_than
175
- register :after
176
- end
152
+ # q.where :field.after => date
153
+ #
154
+ # q.where :created_at.after => DateTime.now
155
+ # @see GreaterThanOrEqualConstraint
156
+ class GreaterThanConstraint < Constraint
157
+ # @!method gt
158
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$gt".
159
+ # @example
160
+ # q.where :field.gt => value
161
+ # @return [GreaterThanConstraint]
162
+
163
+ # @!method greater_than
164
+ # # Alias for {gt}.
165
+ # @return [GreaterThanConstraint]
166
+
167
+ # @!method after
168
+ # Alias for {gt} that provides better readability when constraining dates.
169
+ # @return [GreaterThanConstraint]
170
+ contraint_keyword :$gt
171
+ register :gt
172
+ register :greater_than
173
+ register :after
174
+ end
177
175
 
178
- # Equivalent to the `$gte` Parse query operation. The alias `on_or_after` is provided for readability.
179
- # q.where :field.gte => value
180
- # q.where :field.on_or_after => date
181
- #
182
- # q.where :created_at.on_or_after => DateTime.now
183
- # @see GreaterThanConstraint
184
- class GreaterThanOrEqualConstraint < Constraint
185
- # @!method gte
186
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$gte".
187
- # @example
176
+ # Equivalent to the `$gte` Parse query operation. The alias `on_or_after` is provided for readability.
188
177
  # q.where :field.gte => value
189
- # @return [GreaterThanOrEqualConstraint]
190
-
191
- # @!method greater_than_or_equal
192
- # # Alias for {gte}.
193
- # @return [GreaterThanOrEqualConstraint]
194
-
195
- # @!method on_or_after
196
- # Alias for {gte} that provides better readability when constraining dates.
197
- # @return [GreaterThanOrEqualConstraint]
198
- contraint_keyword :$gte
199
- register :gte
200
- register :greater_than_or_equal
201
- register :on_or_after
202
- end
178
+ # q.where :field.on_or_after => date
179
+ #
180
+ # q.where :created_at.on_or_after => DateTime.now
181
+ # @see GreaterThanConstraint
182
+ class GreaterThanOrEqualConstraint < Constraint
183
+ # @!method gte
184
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$gte".
185
+ # @example
186
+ # q.where :field.gte => value
187
+ # @return [GreaterThanOrEqualConstraint]
188
+
189
+ # @!method greater_than_or_equal
190
+ # # Alias for {gte}.
191
+ # @return [GreaterThanOrEqualConstraint]
192
+
193
+ # @!method on_or_after
194
+ # Alias for {gte} that provides better readability when constraining dates.
195
+ # @return [GreaterThanOrEqualConstraint]
196
+ contraint_keyword :$gte
197
+ register :gte
198
+ register :greater_than_or_equal
199
+ register :on_or_after
200
+ end
203
201
 
204
- # Equivalent to the `$ne` Parse query operation. Where a particular field is not equal to value.
205
- # q.where :field.not => value
206
- class NotEqualConstraint < Constraint
207
- # @!method not
208
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$ne".
209
- # @example
202
+ # Equivalent to the `$ne` Parse query operation. Where a particular field is not equal to value.
210
203
  # q.where :field.not => value
211
- # @return [NotEqualConstraint]
212
-
213
- # @!method ne
214
- # # Alias for {not}.
215
- # @return [NotEqualConstraint]
216
- contraint_keyword :$ne
217
- register :not
218
- register :ne
219
- end
204
+ class NotEqualConstraint < Constraint
205
+ # @!method not
206
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$ne".
207
+ # @example
208
+ # q.where :field.not => value
209
+ # @return [NotEqualConstraint]
210
+
211
+ # @!method ne
212
+ # # Alias for {not}.
213
+ # @return [NotEqualConstraint]
214
+ contraint_keyword :$ne
215
+ register :not
216
+ register :ne
217
+ end
220
218
 
221
- # Provides a mechanism using the equality operator to check for `(undefined)` values.
222
- # Nullabiliity constraint maps the `$exists` Parse clause to enable checking for
223
- # existance in a column when performing geoqueries due to a Parse limitation.
224
- # q.where :field.null => false
225
- # @note Parse currently has a bug that if you select items near a location
226
- # and want to make sure a different column has a value, you need to
227
- # search where the column does not contanin a null/undefined value.
228
- # Therefore we override the build method to change the operation to a
229
- # {NotEqualConstraint}.
230
- # @see ExistsConstraint
231
- class NullabilityConstraint < Constraint
232
- # @!method null
233
- # A registered method on a symbol to create the constraint.
234
- # @example
235
- # q.where :field.null => true
236
- # @return [NullabilityConstraint]
237
- contraint_keyword :$exists
238
- register :null
239
-
240
- # @return [Hash] the compiled constraint.
241
- def build
242
- # if nullability is equal true, then $exists should be set to false
243
-
244
- value = formatted_value
245
- unless value == true || value == false
246
- raise ConstraintError, "#{self.class}: Non-Boolean value passed, it must be either `true` or `false`"
247
- end
219
+ # Provides a mechanism using the equality operator to check for `(undefined)` values.
220
+ # Nullabiliity constraint maps the `$exists` Parse clause to enable checking for
221
+ # existance in a column when performing geoqueries due to a Parse limitation.
222
+ # q.where :field.null => false
223
+ # @note Parse currently has a bug that if you select items near a location
224
+ # and want to make sure a different column has a value, you need to
225
+ # search where the column does not contanin a null/undefined value.
226
+ # Therefore we override the build method to change the operation to a
227
+ # {NotEqualConstraint}.
228
+ # @see ExistsConstraint
229
+ class NullabilityConstraint < Constraint
230
+ # @!method null
231
+ # A registered method on a symbol to create the constraint.
232
+ # @example
233
+ # q.where :field.null => true
234
+ # @return [NullabilityConstraint]
235
+ contraint_keyword :$exists
236
+ register :null
237
+
238
+ # @return [Hash] the compiled constraint.
239
+ def build
240
+ # if nullability is equal true, then $exists should be set to false
241
+
242
+ value = formatted_value
243
+ unless value == true || value == false
244
+ raise ArgumentError, "#{self.class}: Non-Boolean value passed, it must be either `true` or `false`"
245
+ end
248
246
 
249
- if value == true
250
- return { @operation.operand => { key => false} }
251
- else
252
- #current bug in parse where if you want exists => true with geo queries
253
- # we should map it to a "not equal to null" constraint
254
- return { @operation.operand => { Parse::NotEqualConstraint.key => nil } }
255
- end
247
+ if value == true
248
+ return { @operation.operand => { key => false} }
249
+ else
250
+ #current bug in parse where if you want exists => true with geo queries
251
+ # we should map it to a "not equal to null" constraint
252
+ return { @operation.operand => { Parse::Constraint::NotEqualConstraint.key => nil } }
253
+ end
256
254
 
255
+ end
257
256
  end
258
- end
259
257
 
260
- # Equivalent to the `#exists` Parse query operation. Checks whether a value is
261
- # set for key. The difference between this operation and the nullability check
262
- # is when using compound queries with location.
263
- # q.where :field.exists => true
264
- #
265
- # @see NullabilityConstraint
266
- class ExistsConstraint < Constraint
267
- # @!method exists
268
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$exists".
269
- # @example
258
+ # Equivalent to the `#exists` Parse query operation. Checks whether a value is
259
+ # set for key. The difference between this operation and the nullability check
260
+ # is when using compound queries with location.
270
261
  # q.where :field.exists => true
271
- # @return [ExistsConstraint]
272
- contraint_keyword :$exists
273
- register :exists
274
-
275
- # @return [Hash] the compiled constraint.
276
- def build
277
- # if nullability is equal true, then $exists should be set to false
278
- value = formatted_value
262
+ #
263
+ # @see NullabilityConstraint
264
+ class ExistsConstraint < Constraint
265
+ # @!method exists
266
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$exists".
267
+ # @example
268
+ # q.where :field.exists => true
269
+ # @return [ExistsConstraint]
270
+ contraint_keyword :$exists
271
+ register :exists
272
+
273
+ # @return [Hash] the compiled constraint.
274
+ def build
275
+ # if nullability is equal true, then $exists should be set to false
276
+ value = formatted_value
277
+
278
+ unless value == true || value == false
279
+ raise ArgumentError, "#{self.class}: Non-Boolean value passed, it must be either `true` or `false`"
280
+ end
279
281
 
280
- unless value == true || value == false
281
- raise ConstraintError, "#{self.class}: Non-Boolean value passed, it must be either `true` or `false`"
282
+ return { @operation.operand => { key => value } }
282
283
  end
283
-
284
- return { @operation.operand => { key => value } }
285
284
  end
286
- end
287
285
 
288
- # Equivalent to the `$in` Parse query operation. Checks whether the value in the
289
- # column field is contained in the set of values in the target array. If the
290
- # field is an array data type, it checks whether at least one value in the
291
- # field array is contained in the set of values in the target array.
292
- # q.where :field.in => array
293
- # q.where :score.in => [1,3,5,7,9]
294
- #
295
- # @see ContainsAllConstraint
296
- # @see NotContainedInConstraint
297
- class ContainedInConstraint < Constraint
298
- # @!method in
299
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$in".
300
- # @example
286
+ # Equivalent to the `$in` Parse query operation. Checks whether the value in the
287
+ # column field is contained in the set of values in the target array. If the
288
+ # field is an array data type, it checks whether at least one value in the
289
+ # field array is contained in the set of values in the target array.
301
290
  # q.where :field.in => array
302
- # @return [ContainedInConstraint]
303
-
304
- # @!method contained_in
305
- # Alias for {in}
306
- # @return [ContainedInConstraint]
307
- contraint_keyword :$in
308
- register :in
309
- register :contained_in
310
-
311
- # @return [Hash] the compiled constraint.
312
- def build
313
- val = formatted_value
314
- val = [val].compact unless val.is_a?(Array)
315
- { @operation.operand => { key => val } }
316
- end
291
+ # q.where :score.in => [1,3,5,7,9]
292
+ #
293
+ # @see ContainsAllConstraint
294
+ # @see NotContainedInConstraint
295
+ class ContainedInConstraint < Constraint
296
+ # @!method in
297
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$in".
298
+ # @example
299
+ # q.where :field.in => array
300
+ # @return [ContainedInConstraint]
301
+
302
+ # @!method contained_in
303
+ # Alias for {in}
304
+ # @return [ContainedInConstraint]
305
+ contraint_keyword :$in
306
+ register :in
307
+ register :contained_in
308
+
309
+ # @return [Hash] the compiled constraint.
310
+ def build
311
+ val = formatted_value
312
+ val = [val].compact unless val.is_a?(Array)
313
+ { @operation.operand => { key => val } }
314
+ end
317
315
 
318
- end
316
+ end
319
317
 
320
- # Equivalent to the `$nin` Parse query operation. Checks whether the value in
321
- # the column field is *not* contained in the set of values in the target
322
- # array. If the field is an array data type, it checks whether at least one
323
- # value in the field array is *not* contained in the set of values in the
324
- # target array.
325
- #
326
- # q.where :field.not_in => array
327
- # q.where :player_name.not_in => ["Jonathan", "Dario", "Shawn"]
328
- # @see ContainedInConstraint
329
- # @see ContainsAllConstraint
330
- class NotContainedInConstraint < Constraint
331
- # @!method not_in
332
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$nin".
333
- # @example
318
+ # Equivalent to the `$nin` Parse query operation. Checks whether the value in
319
+ # the column field is *not* contained in the set of values in the target
320
+ # array. If the field is an array data type, it checks whether at least one
321
+ # value in the field array is *not* contained in the set of values in the
322
+ # target array.
323
+ #
334
324
  # q.where :field.not_in => array
335
- # @return [NotContainedInConstraint]
336
-
337
- # @!method nin
338
- # Alias for {not_in}
339
- # @return [NotContainedInConstraint]
340
-
341
- # @!method not_contained_in
342
- # Alias for {not_in}
343
- # @return [NotContainedInConstraint]
344
- contraint_keyword :$nin
345
- register :not_in
346
- register :nin
347
- register :not_contained_in
348
-
349
- # @return [Hash] the compiled constraint.
350
- def build
351
- val = formatted_value
352
- val = [val].compact unless val.is_a?(Array)
353
- { @operation.operand => { key => val } }
354
- end
325
+ # q.where :player_name.not_in => ["Jonathan", "Dario", "Shawn"]
326
+ # @see ContainedInConstraint
327
+ # @see ContainsAllConstraint
328
+ class NotContainedInConstraint < Constraint
329
+ # @!method not_in
330
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$nin".
331
+ # @example
332
+ # q.where :field.not_in => array
333
+ # @return [NotContainedInConstraint]
334
+
335
+ # @!method nin
336
+ # Alias for {not_in}
337
+ # @return [NotContainedInConstraint]
338
+
339
+ # @!method not_contained_in
340
+ # Alias for {not_in}
341
+ # @return [NotContainedInConstraint]
342
+ contraint_keyword :$nin
343
+ register :not_in
344
+ register :nin
345
+ register :not_contained_in
346
+
347
+ # @return [Hash] the compiled constraint.
348
+ def build
349
+ val = formatted_value
350
+ val = [val].compact unless val.is_a?(Array)
351
+ { @operation.operand => { key => val } }
352
+ end
355
353
 
356
- end
354
+ end
357
355
 
358
- # Equivalent to the $all Parse query operation. Checks whether the value in
359
- # the column field contains all of the given values provided in the array. Note
360
- # that the field column should be of type {Array} in your Parse class.
361
- #
362
- # q.where :field.all => array
363
- # q.where :array_key.all => [2,3,4]
364
- #
365
- # @see ContainedInConstraint
366
- # @see NotContainedInConstraint
367
- class ContainsAllConstraint < Constraint
368
- # @!method all
369
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$all".
370
- # @example
356
+ # Equivalent to the $all Parse query operation. Checks whether the value in
357
+ # the column field contains all of the given values provided in the array. Note
358
+ # that the field column should be of type {Array} in your Parse class.
359
+ #
371
360
  # q.where :field.all => array
372
- # @return [ContainsAllConstraint]
373
-
374
- # @!method contains_all
375
- # Alias for {all}
376
- # @return [ContainsAllConstraint]
377
- contraint_keyword :$all
378
- register :all
379
- register :contains_all
380
-
381
- # @return [Hash] the compiled constraint.
382
- def build
383
- val = formatted_value
384
- val = [val].compact unless val.is_a?(Array)
385
- { @operation.operand => { key => val } }
361
+ # q.where :array_key.all => [2,3,4]
362
+ #
363
+ # @see ContainedInConstraint
364
+ # @see NotContainedInConstraint
365
+ class ContainsAllConstraint < Constraint
366
+ # @!method all
367
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$all".
368
+ # @example
369
+ # q.where :field.all => array
370
+ # @return [ContainsAllConstraint]
371
+
372
+ # @!method contains_all
373
+ # Alias for {all}
374
+ # @return [ContainsAllConstraint]
375
+ contraint_keyword :$all
376
+ register :all
377
+ register :contains_all
378
+
379
+ # @return [Hash] the compiled constraint.
380
+ def build
381
+ val = formatted_value
382
+ val = [val].compact unless val.is_a?(Array)
383
+ { @operation.operand => { key => val } }
384
+ end
386
385
  end
387
- end
388
386
 
389
- # Equivalent to the `$select` Parse query operation. This matches a value for a
390
- # key in the result of a different query.
391
- # q.where :field.select => { key: "field", query: query }
392
- #
393
- # # example
394
- # value = { key: 'city', query: Artist.where(:fan_count.gt => 50) }
395
- # q.where :hometown.select => value
396
- #
397
- # # if the local field is the same name as the foreign table field, you can omit hash
398
- # # assumes key: 'city'
399
- # q.where :city.select => Artist.where(:fan_count.gt => 50)
400
- #
401
- class SelectionConstraint < Constraint
402
- # @!method select
403
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$select".
404
- # @return [SelectionConstraint]
405
- contraint_keyword :$select
406
- register :select
407
-
408
- # @return [Hash] the compiled constraint.
409
- def build
410
-
411
- # if it's a hash, then it should be {:key=>"objectId", :query=>[]}
412
- remote_field_name = @operation.operand
413
- query = nil
414
- if @value.is_a?(Hash)
415
- res = @value.symbolize_keys
416
- remote_field_name = res[:key] || remote_field_name
417
- query = res[:query]
418
- unless query.is_a?(Parse::Query)
419
- raise ConstraintError, "Invalid Parse::Query object provided in :query field of value: #{@operation.operand}.#{$dontSelect} => #{@value}"
387
+ # Equivalent to the `$select` Parse query operation. This matches a value for a
388
+ # key in the result of a different query.
389
+ # q.where :field.select => { key: "field", query: query }
390
+ #
391
+ # # example
392
+ # value = { key: 'city', query: Artist.where(:fan_count.gt => 50) }
393
+ # q.where :hometown.select => value
394
+ #
395
+ # # if the local field is the same name as the foreign table field, you can omit hash
396
+ # # assumes key: 'city'
397
+ # q.where :city.select => Artist.where(:fan_count.gt => 50)
398
+ #
399
+ class SelectionConstraint < Constraint
400
+ # @!method select
401
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$select".
402
+ # @return [SelectionConstraint]
403
+ contraint_keyword :$select
404
+ register :select
405
+
406
+ # @return [Hash] the compiled constraint.
407
+ def build
408
+
409
+ # if it's a hash, then it should be {:key=>"objectId", :query=>[]}
410
+ remote_field_name = @operation.operand
411
+ query = nil
412
+ if @value.is_a?(Hash)
413
+ res = @value.symbolize_keys
414
+ remote_field_name = res[:key] || remote_field_name
415
+ query = res[:query]
416
+ unless query.is_a?(Parse::Query)
417
+ raise ArgumentError, "Invalid Parse::Query object provided in :query field of value: #{@operation.operand}.#{$dontSelect} => #{@value}"
418
+ end
419
+ query = query.compile(encode: false, includeClassName: true)
420
+ elsif @value.is_a?(Parse::Query)
421
+ # if its a query, then assume dontSelect key is the same name as operand.
422
+ query = @value.compile(encode: false, includeClassName: true)
423
+ else
424
+ raise ArgumentError, "Invalid `:select` query constraint. It should follow the format: :field.select => { key: 'key', query: '<Parse::Query>' }"
420
425
  end
421
- query = query.compile(encode: false, includeClassName: true)
422
- elsif @value.is_a?(Parse::Query)
423
- # if its a query, then assume dontSelect key is the same name as operand.
424
- query = @value.compile(encode: false, includeClassName: true)
425
- else
426
- raise ConstraintError, "Invalid `:select` query constraint. It should follow the format: :field.select => { key: 'key', query: '<Parse::Query>' }"
426
+ { @operation.operand => { :$select => { key: remote_field_name, query: query } } }
427
427
  end
428
- { @operation.operand => { :$select => { key: remote_field_name, query: query } } }
429
428
  end
430
- end
431
429
 
432
- # Equivalent to the `$dontSelect` Parse query operation. Requires that a field's
433
- # value not match a value for a key in the result of a different query.
434
- #
435
- # q.where :field.reject => { key: :other_field, query: query }
436
- #
437
- # value = { key: 'city', query: Artist.where(:fan_count.gt => 50) }
438
- # q.where :hometown.reject => value
439
- #
440
- # # if the local field is the same name as the foreign table field, you can omit hash
441
- # # assumes key: 'city'
442
- # q.where :city.reject => Artist.where(:fan_count.gt => 50)
443
- #
444
- # @see SelectionConstraint
445
- class RejectionConstraint < Constraint
446
-
447
- # @!method dont_select
448
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$dontSelect".
449
- # @example
430
+ # Equivalent to the `$dontSelect` Parse query operation. Requires that a field's
431
+ # value not match a value for a key in the result of a different query.
432
+ #
450
433
  # q.where :field.reject => { key: :other_field, query: query }
451
- # @return [RejectionConstraint]
452
-
453
- # @!method reject
454
- # Alias for {dont_select}
455
- # @return [RejectionConstraint]
456
- contraint_keyword :$dontSelect
457
- register :reject
458
- register :dont_select
459
-
460
- # @return [Hash] the compiled constraint.
461
- def build
462
-
463
- # if it's a hash, then it should be {:key=>"objectId", :query=>[]}
464
- remote_field_name = @operation.operand
465
- query = nil
466
- if @value.is_a?(Hash)
467
- res = @value.symbolize_keys
468
- remote_field_name = res[:key] || remote_field_name
469
- query = res[:query]
470
- unless query.is_a?(Parse::Query)
471
- raise ConstraintError, "Invalid Parse::Query object provided in :query field of value: #{@operation.operand}.#{$dontSelect} => #{@value}"
434
+ #
435
+ # value = { key: 'city', query: Artist.where(:fan_count.gt => 50) }
436
+ # q.where :hometown.reject => value
437
+ #
438
+ # # if the local field is the same name as the foreign table field, you can omit hash
439
+ # # assumes key: 'city'
440
+ # q.where :city.reject => Artist.where(:fan_count.gt => 50)
441
+ #
442
+ # @see SelectionConstraint
443
+ class RejectionConstraint < Constraint
444
+
445
+ # @!method dont_select
446
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$dontSelect".
447
+ # @example
448
+ # q.where :field.reject => { key: :other_field, query: query }
449
+ # @return [RejectionConstraint]
450
+
451
+ # @!method reject
452
+ # Alias for {dont_select}
453
+ # @return [RejectionConstraint]
454
+ contraint_keyword :$dontSelect
455
+ register :reject
456
+ register :dont_select
457
+
458
+ # @return [Hash] the compiled constraint.
459
+ def build
460
+
461
+ # if it's a hash, then it should be {:key=>"objectId", :query=>[]}
462
+ remote_field_name = @operation.operand
463
+ query = nil
464
+ if @value.is_a?(Hash)
465
+ res = @value.symbolize_keys
466
+ remote_field_name = res[:key] || remote_field_name
467
+ query = res[:query]
468
+ unless query.is_a?(Parse::Query)
469
+ raise ArgumentError, "Invalid Parse::Query object provided in :query field of value: #{@operation.operand}.#{$dontSelect} => #{@value}"
470
+ end
471
+ query = query.compile(encode: false, includeClassName: true)
472
+ elsif @value.is_a?(Parse::Query)
473
+ # if its a query, then assume dontSelect key is the same name as operand.
474
+ query = @value.compile(encode: false, includeClassName: true)
475
+ else
476
+ raise ArgumentError, "Invalid `:reject` query constraint. It should follow the format: :field.reject => { key: 'key', query: '<Parse::Query>' }"
472
477
  end
473
- query = query.compile(encode: false, includeClassName: true)
474
- elsif @value.is_a?(Parse::Query)
475
- # if its a query, then assume dontSelect key is the same name as operand.
476
- query = @value.compile(encode: false, includeClassName: true)
477
- else
478
- raise ConstraintError, "Invalid `:reject` query constraint. It should follow the format: :field.reject => { key: 'key', query: '<Parse::Query>' }"
478
+ { @operation.operand => { :$dontSelect => { key: remote_field_name, query: query } } }
479
479
  end
480
- { @operation.operand => { :$dontSelect => { key: remote_field_name, query: query } } }
481
480
  end
482
- end
483
481
 
484
- # Equivalent to the `$regex` Parse query operation. Requires that a field value
485
- # match a regular expression.
486
- #
487
- # q.where :field.like => /ruby_regex/i
488
- # :name.like => /Bob/i
489
- #
490
- class RegularExpressionConstraint < Constraint
491
- #Requires that a key's value match a regular expression
492
-
493
- # @!method like
494
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$regex".
495
- # @example
482
+ # Equivalent to the `$regex` Parse query operation. Requires that a field value
483
+ # match a regular expression.
484
+ #
496
485
  # q.where :field.like => /ruby_regex/i
497
- # @return [RegularExpressionConstraint]
498
-
499
- # @!method regex
500
- # Alias for {like}
501
- # @return [RegularExpressionConstraint]
502
- contraint_keyword :$regex
503
- register :like
504
- register :regex
505
- end
486
+ # :name.like => /Bob/i
487
+ #
488
+ class RegularExpressionConstraint < Constraint
489
+ #Requires that a key's value match a regular expression
490
+
491
+ # @!method like
492
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$regex".
493
+ # @example
494
+ # q.where :field.like => /ruby_regex/i
495
+ # @return [RegularExpressionConstraint]
496
+
497
+ # @!method regex
498
+ # Alias for {like}
499
+ # @return [RegularExpressionConstraint]
500
+ contraint_keyword :$regex
501
+ register :like
502
+ register :regex
503
+ end
506
504
 
507
- # Equivalent to the `$relatedTo` Parse query operation. If you want to
508
- # retrieve objects that are members of a `Relation` field in your Parse class.
509
- #
510
- # q.where :field.related_to => pointer
511
- #
512
- # # find all Users who have liked this post object
513
- # post = Post.first
514
- # users = Parse::User.all :likes.related_to => post
515
- #
516
- class RelationQueryConstraint < Constraint
517
- # @!method related_to
518
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$relatedTo".
519
- # @example
520
- # q.where :field.related_to => pointer
521
- # @return [RelationQueryConstraint]
522
-
523
- # @!method rel
524
- # Alias for {related_to}
525
- # @return [RelationQueryConstraint]
526
- contraint_keyword :$relatedTo
527
- register :related_to
528
- register :rel
529
-
530
- # @return [Hash] the compiled constraint.
531
- def build
532
- # pointer = formatted_value
533
- # unless pointer.is_a?(Parse::Pointer)
534
- # raise "Invalid Parse::Pointer passed to :related(#{@operation.operand}) constraint : #{pointer}"
535
- # end
536
- { :$relatedTo => { object: formatted_value, key: @operation.operand } }
505
+ # Equivalent to the `$relatedTo` Parse query operation. If you want to
506
+ # retrieve objects that are members of a `Relation` field in your Parse class.
507
+ #
508
+ # q.where :field.related_to => pointer
509
+ #
510
+ # # find all Users who have liked this post object
511
+ # post = Post.first
512
+ # users = Parse::User.all :likes.related_to => post
513
+ #
514
+ class RelationQueryConstraint < Constraint
515
+ # @!method related_to
516
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$relatedTo".
517
+ # @example
518
+ # q.where :field.related_to => pointer
519
+ # @return [RelationQueryConstraint]
520
+
521
+ # @!method rel
522
+ # Alias for {related_to}
523
+ # @return [RelationQueryConstraint]
524
+ contraint_keyword :$relatedTo
525
+ register :related_to
526
+ register :rel
527
+
528
+ # @return [Hash] the compiled constraint.
529
+ def build
530
+ # pointer = formatted_value
531
+ # unless pointer.is_a?(Parse::Pointer)
532
+ # raise "Invalid Parse::Pointer passed to :related(#{@operation.operand}) constraint : #{pointer}"
533
+ # end
534
+ { :$relatedTo => { object: formatted_value, key: @operation.operand } }
535
+ end
537
536
  end
538
- end
539
537
 
540
- # Equivalent to the `$inQuery` Parse query operation. Useful if you want to
541
- # retrieve objects where a field contains an object that matches another query.
542
- #
543
- # q.where :field.matches => query
544
- # # assume Post class has an image column.
545
- # q.where :post.matches => Post.where(:image.exists => true )
546
- #
547
- class InQueryConstraint < Constraint
548
- # @!method matches
549
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$inQuery".
550
- # @example
538
+ # Equivalent to the `$inQuery` Parse query operation. Useful if you want to
539
+ # retrieve objects where a field contains an object that matches another query.
540
+ #
551
541
  # q.where :field.matches => query
552
- # @return [InQueryConstraint]
553
-
554
- # @!method in_query
555
- # Alias for {matches}
556
- # @return [InQueryConstraint]
557
- contraint_keyword :$inQuery
558
- register :matches
559
- register :in_query
560
- end
542
+ # # assume Post class has an image column.
543
+ # q.where :post.matches => Post.where(:image.exists => true )
544
+ #
545
+ class InQueryConstraint < Constraint
546
+ # @!method matches
547
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$inQuery".
548
+ # @example
549
+ # q.where :field.matches => query
550
+ # @return [InQueryConstraint]
551
+
552
+ # @!method in_query
553
+ # Alias for {matches}
554
+ # @return [InQueryConstraint]
555
+ contraint_keyword :$inQuery
556
+ register :matches
557
+ register :in_query
558
+ end
561
559
 
562
- # Equivalent to the `$notInQuery` Parse query operation. Useful if you want to
563
- # retrieve objects where a field contains an object that does not match another query.
564
- # This is the inverse of the {InQueryConstraint}.
565
- #
566
- # q.where :field.excludes => query
567
- #
568
- # q.where :post.excludes => Post.where(:image.exists => true
569
- #
570
- class NotInQueryConstraint < Constraint
571
- # @!method excludes
572
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$notInQuery".
573
- # @example
574
- # q.where :field.excludes => query
575
- # @return [NotInQueryConstraint]
576
-
577
- # @!method not_in_query
578
- # Alias for {excludes}
579
- # @return [NotInQueryConstraint]
580
- contraint_keyword :$notInQuery
581
- register :excludes
582
- register :not_in_query
560
+ # Equivalent to the `$notInQuery` Parse query operation. Useful if you want to
561
+ # retrieve objects where a field contains an object that does not match another query.
562
+ # This is the inverse of the {InQueryConstraint}.
563
+ #
564
+ # q.where :field.excludes => query
565
+ #
566
+ # q.where :post.excludes => Post.where(:image.exists => true
567
+ #
568
+ class NotInQueryConstraint < Constraint
569
+ # @!method excludes
570
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$notInQuery".
571
+ # @example
572
+ # q.where :field.excludes => query
573
+ # @return [NotInQueryConstraint]
574
+
575
+ # @!method not_in_query
576
+ # Alias for {excludes}
577
+ # @return [NotInQueryConstraint]
578
+ contraint_keyword :$notInQuery
579
+ register :excludes
580
+ register :not_in_query
583
581
 
584
- end
582
+ end
585
583
 
586
- # Equivalent to the `$nearSphere` Parse query operation. This is only applicable
587
- # if the field is of type `GeoPoint`. This will query Parse and return a list of
588
- # results ordered by distance with the nearest object being first.
589
- #
590
- # q.where :field.near => geopoint
591
- #
592
- # geopoint = Parse::GeoPoint.new(30.0, -20.0)
593
- # PlaceObject.all :location.near => geopoint
594
- # If you wish to constrain the geospatial query to a maximum number of _miles_,
595
- # you can utilize the `max_miles` method on a `Parse::GeoPoint` object. This
596
- # is equivalent to the `$maxDistanceInMiles` constraint used with `$nearSphere`.
597
- #
598
- # q.where :field.near => geopoint.max_miles(distance)
599
- # # or provide a triplet includes max miles constraint
600
- # q.where :field.near => [lat, lng, miles]
601
- #
602
- # geopoint = Parse::GeoPoint.new(30.0, -20.0)
603
- # PlaceObject.all :location.near => geopoint.max_miles(10)
604
- #
605
- # @todo Add support $maxDistanceInKilometers (for kms) and $maxDistanceInRadians (for radian angle).
606
- class NearSphereQueryConstraint < Constraint
607
- # @!method near
608
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$nearSphere".
609
- # @example
584
+ # Equivalent to the `$nearSphere` Parse query operation. This is only applicable
585
+ # if the field is of type `GeoPoint`. This will query Parse and return a list of
586
+ # results ordered by distance with the nearest object being first.
587
+ #
610
588
  # q.where :field.near => geopoint
589
+ #
590
+ # geopoint = Parse::GeoPoint.new(30.0, -20.0)
591
+ # PlaceObject.all :location.near => geopoint
592
+ # If you wish to constrain the geospatial query to a maximum number of _miles_,
593
+ # you can utilize the `max_miles` method on a `Parse::GeoPoint` object. This
594
+ # is equivalent to the `$maxDistanceInMiles` constraint used with `$nearSphere`.
595
+ #
611
596
  # q.where :field.near => geopoint.max_miles(distance)
612
- # @return [NearSphereQueryConstraint]
613
- contraint_keyword :$nearSphere
614
- register :near
615
-
616
- # @return [Hash] the compiled constraint.
617
- def build
618
- point = formatted_value
619
- max_miles = nil
620
- if point.is_a?(Array) && point.count > 1
621
- max_miles = point[2] if point.count == 3
622
- point = { __type: "GeoPoint", latitude: point[0], longitude: point[1] }
623
- end
624
- if max_miles.present? && max_miles > 0
625
- return { @operation.operand => { key => point, :$maxDistanceInMiles => max_miles.to_f } }
597
+ # # or provide a triplet includes max miles constraint
598
+ # q.where :field.near => [lat, lng, miles]
599
+ #
600
+ # geopoint = Parse::GeoPoint.new(30.0, -20.0)
601
+ # PlaceObject.all :location.near => geopoint.max_miles(10)
602
+ #
603
+ # @todo Add support $maxDistanceInKilometers (for kms) and $maxDistanceInRadians (for radian angle).
604
+ class NearSphereQueryConstraint < Constraint
605
+ # @!method near
606
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$nearSphere".
607
+ # @example
608
+ # q.where :field.near => geopoint
609
+ # q.where :field.near => geopoint.max_miles(distance)
610
+ # @return [NearSphereQueryConstraint]
611
+ contraint_keyword :$nearSphere
612
+ register :near
613
+
614
+ # @return [Hash] the compiled constraint.
615
+ def build
616
+ point = formatted_value
617
+ max_miles = nil
618
+ if point.is_a?(Array) && point.count > 1
619
+ max_miles = point[2] if point.count == 3
620
+ point = { __type: "GeoPoint", latitude: point[0], longitude: point[1] }
621
+ end
622
+ if max_miles.present? && max_miles > 0
623
+ return { @operation.operand => { key => point, :$maxDistanceInMiles => max_miles.to_f } }
624
+ end
625
+ { @operation.operand => { key => point } }
626
626
  end
627
- { @operation.operand => { key => point } }
628
- end
629
627
 
630
- end
628
+ end
631
629
 
632
- # Equivalent to the `$within` Parse query operation and `$box` geopoint
633
- # constraint. The rectangular bounding box is defined by a southwest point as
634
- # the first parameter, followed by the a northeast point. Please note that Geo
635
- # box queries that cross the international date lines are not currently
636
- # supported by Parse.
637
- #
638
- # q.where :field.within_box => [soutwestGeoPoint, northeastGeoPoint]
639
- #
640
- # sw = Parse::GeoPoint.new 32.82, -117.23 # San Diego
641
- # ne = Parse::GeoPoint.new 36.12, -115.31 # Las Vegas
642
- #
643
- # # get all PlaceObjects inside this bounding box
644
- # PlaceObject.all :location.within_box => [sw,ne]
645
- #
646
- class WithinGeoBoxQueryConstraint < Constraint
647
- # @!method within_box
648
- # A registered method on a symbol to create the constraint. Maps to Parse operator "$within".
649
- # @example
630
+ # Equivalent to the `$within` Parse query operation and `$box` geopoint
631
+ # constraint. The rectangular bounding box is defined by a southwest point as
632
+ # the first parameter, followed by the a northeast point. Please note that Geo
633
+ # box queries that cross the international date lines are not currently
634
+ # supported by Parse.
635
+ #
650
636
  # q.where :field.within_box => [soutwestGeoPoint, northeastGeoPoint]
651
- # @return [WithinGeoBoxQueryConstraint]
652
- contraint_keyword :$within
653
- register :within_box
654
-
655
- # @return [Hash] the compiled constraint.
656
- def build
657
- geopoint_values = formatted_value
658
- unless geopoint_values.is_a?(Array) && geopoint_values.count == 2 &&
659
- geopoint_values.first.is_a?(Parse::GeoPoint) && geopoint_values.last.is_a?(Parse::GeoPoint)
660
- raise(ConstraintError, '[Parse::Query] Invalid query value parameter passed to `within_box` constraint. ' +
661
- 'Values in array must be `Parse::GeoPoint` objects and ' +
662
- 'it should be in an array format: [southwestPoint, northeastPoint]' )
637
+ #
638
+ # sw = Parse::GeoPoint.new 32.82, -117.23 # San Diego
639
+ # ne = Parse::GeoPoint.new 36.12, -115.31 # Las Vegas
640
+ #
641
+ # # get all PlaceObjects inside this bounding box
642
+ # PlaceObject.all :location.within_box => [sw,ne]
643
+ #
644
+ class WithinGeoBoxQueryConstraint < Constraint
645
+ # @!method within_box
646
+ # A registered method on a symbol to create the constraint. Maps to Parse operator "$within".
647
+ # @example
648
+ # q.where :field.within_box => [soutwestGeoPoint, northeastGeoPoint]
649
+ # @return [WithinGeoBoxQueryConstraint]
650
+ contraint_keyword :$within
651
+ register :within_box
652
+
653
+ # @return [Hash] the compiled constraint.
654
+ def build
655
+ geopoint_values = formatted_value
656
+ unless geopoint_values.is_a?(Array) && geopoint_values.count == 2 &&
657
+ geopoint_values.first.is_a?(Parse::GeoPoint) && geopoint_values.last.is_a?(Parse::GeoPoint)
658
+ raise(ArgumentError, '[Parse::Query] Invalid query value parameter passed to `within_box` constraint. ' +
659
+ 'Values in array must be `Parse::GeoPoint` objects and ' +
660
+ 'it should be in an array format: [southwestPoint, northeastPoint]' )
661
+ end
662
+ { @operation.operand => { :$within => { :$box => geopoint_values } } }
663
663
  end
664
- { @operation.operand => { :$within => { :$box => geopoint_values } } }
665
664
  end
666
665
 
667
666
  end