parse-stack 1.0.10 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changes.md +8 -0
- data/Gemfile.lock +4 -4
- data/README.md +40 -18
- data/lib/parse/query.rb +10 -1
- data/lib/parse/query/constraint.rb +7 -1
- data/lib/parse/query/constraints.rb +15 -6
- data/lib/parse/stack/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1138b12b68494580dd0ca427544dc4780a52ddd
|
4
|
+
data.tar.gz: f077b1ab3767c747c2257ab5f35539fbab5aa7a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c21522c5712cc64b2d7ec0c7842fb42e5514ef86460a8aee92e61238a926bad5f2cc0e9b27545de98fda0f5dfb700a596fad6847fa6b981cdd0e7b49a55c5f0
|
7
|
+
data.tar.gz: ab980694c184fb24ed72ad8a9440703d189e98f9cef6c8d6c0ca7dba6760fbc8fcddf5846ebe4aeac0915aa0743d0a95e6a527c5519d503236713db8c1a8b22f
|
data/Changes.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Parse-Stack Changes
|
2
2
|
|
3
|
+
1.1
|
4
|
+
-----------
|
5
|
+
- In Query `join` has been renamed to `matches`.
|
6
|
+
- Not In Query `exclude` has been renamed to `excludes` for consistency.
|
7
|
+
- Parse::Query now has a `:key` operation to be usd when passing sub-queries to `select` and `matches`
|
8
|
+
- Improves query supporting `select`, `matches`, `matches` and `excludes`.
|
9
|
+
- Regular expression queries for `like` now send regex options
|
10
|
+
|
3
11
|
1.0.10
|
4
12
|
-----------
|
5
13
|
- Fixes issues with setting default values as dirty when using the builder or before_save hook.
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
parse-stack (1.0
|
4
|
+
parse-stack (1.1.0)
|
5
5
|
active_model_serializers (>= 0.9, < 1)
|
6
6
|
activemodel (>= 4, < 5)
|
7
7
|
activesupport (>= 4, < 5)
|
@@ -14,7 +14,7 @@ PATH
|
|
14
14
|
GEM
|
15
15
|
remote: https://rubygems.org/
|
16
16
|
specs:
|
17
|
-
active_model_serializers (0.9.
|
17
|
+
active_model_serializers (0.9.5)
|
18
18
|
activemodel (>= 3.2)
|
19
19
|
activemodel (4.2.6)
|
20
20
|
activesupport (= 4.2.6)
|
@@ -30,7 +30,7 @@ GEM
|
|
30
30
|
builder (3.2.2)
|
31
31
|
coderay (1.1.1)
|
32
32
|
debug_inspector (0.0.2)
|
33
|
-
dotenv (2.1.
|
33
|
+
dotenv (2.1.1)
|
34
34
|
faraday (0.9.2)
|
35
35
|
multipart-post (>= 1.2, < 3)
|
36
36
|
faraday_middleware (0.10.0)
|
@@ -41,7 +41,7 @@ GEM
|
|
41
41
|
minitest (5.8.4)
|
42
42
|
moneta (0.8.0)
|
43
43
|
multipart-post (2.0.0)
|
44
|
-
parallel (1.
|
44
|
+
parallel (1.8.0)
|
45
45
|
pry (0.10.3)
|
46
46
|
coderay (~> 1.1.0)
|
47
47
|
method_source (~> 0.8.1)
|
data/README.md
CHANGED
@@ -302,7 +302,11 @@ class Post < Parse::Object
|
|
302
302
|
property :comment_count, :integer, default: 0
|
303
303
|
|
304
304
|
# the published date. Maps to "publishDate"
|
305
|
-
property :publish_date, :date, ->{ DateTime.now }
|
305
|
+
property :publish_date, :date, default: ->{ DateTime.now }
|
306
|
+
|
307
|
+
# use lambda to access the instance object.
|
308
|
+
# Set draft_date to the created_at date if empty.
|
309
|
+
property :draft_date, :date, default: lambda { |x| x.created_at }
|
306
310
|
|
307
311
|
# maybe whether it is currently visible
|
308
312
|
property :visible, :boolean
|
@@ -823,11 +827,11 @@ If you only need to know the result count for a query, provide count a non-zero
|
|
823
827
|
|
824
828
|
```ruby
|
825
829
|
# get number of songs with a play_count > 10
|
826
|
-
Song.count
|
830
|
+
Song.count :play_count.gt => 10
|
827
831
|
|
828
832
|
# same
|
829
833
|
query = Parse::Query.new("Song")
|
830
|
-
query.where play_count.gt => 10
|
834
|
+
query.where :play_count.gt => 10
|
831
835
|
query.count
|
832
836
|
|
833
837
|
```
|
@@ -862,7 +866,6 @@ When a query API is made, the results are cached in the query object in case you
|
|
862
866
|
|
863
867
|
```
|
864
868
|
|
865
|
-
|
866
869
|
### Expressions
|
867
870
|
The set of supported expressions based on what is available through the Parse REST API. _For those who don't prefer the DataMapper style syntax, we have provided method accessors for each of the expressions._
|
868
871
|
|
@@ -871,11 +874,11 @@ Specify a field to sort by.
|
|
871
874
|
|
872
875
|
```ruby
|
873
876
|
# order updated_at ascending order
|
874
|
-
Song.all
|
877
|
+
Song.all :order => :updated_at
|
875
878
|
|
876
879
|
# first order by highest like_count, then by ascending name.
|
877
880
|
# Note that ascending is the default if not specified (ex. `:name.asc`)
|
878
|
-
Song.all
|
881
|
+
Song.all :order => [:like_count.desc, :name]
|
879
882
|
```
|
880
883
|
|
881
884
|
##### :keys
|
@@ -883,10 +886,10 @@ Restrict the fields returned by the query. This is useful for larger query resul
|
|
883
886
|
|
884
887
|
```ruby
|
885
888
|
# results only contain :name field
|
886
|
-
Song.all
|
889
|
+
Song.all :keys => :name
|
887
890
|
|
888
891
|
# multiple keys
|
889
|
-
Song.all
|
892
|
+
Song.all :keys => [:name,:artist]
|
890
893
|
```
|
891
894
|
|
892
895
|
##### :includes
|
@@ -900,7 +903,7 @@ Use on Pointer columns to return the full object. You may chain multiple columns
|
|
900
903
|
Song.all(:includes => :artist)
|
901
904
|
|
902
905
|
# Chaining
|
903
|
-
Song.all
|
906
|
+
Song.all :includes => [:artist, 'artist.manager']
|
904
907
|
|
905
908
|
```
|
906
909
|
|
@@ -908,9 +911,9 @@ Use on Pointer columns to return the full object. You may chain multiple columns
|
|
908
911
|
Limit the number of objects returned by the query. The default is 100, with Parse allowing a maximum of 1000. The framework also allows a value of `:max`. Utilizing this will have the framework continually intelligently utilize `:skip` to continue to paginate through results until an empty result set is received or the `:skip` limit is reached (10,000). When utilizing `all()`, `:max` is the default option for `:limit`.
|
909
912
|
|
910
913
|
```ruby
|
911
|
-
Song.all
|
912
|
-
Song.all
|
913
|
-
Song.all
|
914
|
+
Song.all :limit => 1 # same as Song.first
|
915
|
+
Song.all :limit => 1000 # maximum allowed by Parse
|
916
|
+
Song.all :limit => :max # up to 11,000 records (theoretical).
|
914
917
|
```
|
915
918
|
|
916
919
|
##### :skip
|
@@ -918,7 +921,7 @@ Use with limit to paginate through results. Default is 0 with maximum value bein
|
|
918
921
|
|
919
922
|
```ruby
|
920
923
|
# get the next 3 songs after the first 10
|
921
|
-
Song.all
|
924
|
+
Song.all :limit => 3, :skip => 10
|
922
925
|
```
|
923
926
|
|
924
927
|
##### :where
|
@@ -975,18 +978,20 @@ Most of the constraints supported by Parse are available to `Parse::Query`. Assu
|
|
975
978
|
q.where :field.like => /ruby_regex/
|
976
979
|
q.where :field.regex => /abc/ # alias
|
977
980
|
|
978
|
-
# select
|
979
|
-
q.where :field.select => query
|
981
|
+
# select
|
982
|
+
q.where :field.select => query #with key
|
983
|
+
# ex. q.where :city.select => Artist.where(:total_plays.gt => 50, :key => "city")
|
980
984
|
|
981
|
-
# don't select
|
985
|
+
# don't select
|
982
986
|
q.where :field.reject => query
|
983
987
|
|
984
|
-
# matches inQuery
|
985
|
-
q.where :field.
|
988
|
+
# matches inQuery
|
989
|
+
q.where :field.matches => query
|
986
990
|
q.where :field.in_query => query # alias
|
987
991
|
|
988
992
|
# notInQuery (inverse of `join`)
|
989
993
|
q.where :field.excludes => query
|
994
|
+
q.where :field.not_in_query => query # alias
|
990
995
|
|
991
996
|
# near GeoPoint
|
992
997
|
q.where :field.near => geopoint
|
@@ -1004,6 +1009,23 @@ Most of the constraints supported by Parse are available to `Parse::Query`. Assu
|
|
1004
1009
|
or_query = query1 | query2 | query3 ...
|
1005
1010
|
```
|
1006
1011
|
|
1012
|
+
## Select and Matching Queries
|
1013
|
+
Parse-Stack supports sub-select queries. These are referred to in Parse as `$select` and `$dontSelect` for columns that contain values. These are mapped to `select` and `reject` respectively in Parse-Stack. For creating sub-queries where the column field is an object or a pointer, Parse provides `$inQuery` and `$notInQuery`. These are mapped to `matches` and `excludes` respectively in Parse-Stack. To perform these types of sub-query constraints, you pass a different `Parse::Query` instance to the value of the query constraint. Using the example for `$select` from the Parse documentation where you have a class containing sports teams and you store a user's hometown in the user class, you can issue one query to find the list of users whose hometown teams have winning records as follows:
|
1014
|
+
|
1015
|
+
```ruby
|
1016
|
+
# assume Team class with column of `city`
|
1017
|
+
users = Parse::User.all :hometown.select => Team.where(:win_pct.gt => 0.5, :key => :city )
|
1018
|
+
# where={"hometown":{"$select":{"query":{"className":"Team", "limit":100, "where":{"winPct":{"$gt":0.5}}},"key":"city"}}}
|
1019
|
+
# for https://api.parse.com/1/classes/_User
|
1020
|
+
```
|
1021
|
+
|
1022
|
+
Using the `matches` and `excludes`, is similar, but are used when the field is a pointer or object. If you wanted to find all `Song` objects where the song's artist has a `city` of `San Diego` and is `approved`, you could use a `matches` query as follows:
|
1023
|
+
|
1024
|
+
```ruby
|
1025
|
+
songs = Song.all :artist.matches => Artist.where(approved: true, city: "San Diego", limit: 1000)
|
1026
|
+
# where={"artist": {"$inQuery": {"className":"Team", "limit":1000, "where": {"winPct": {"$gt" :0.5 }}}}}
|
1027
|
+
```
|
1028
|
+
|
1007
1029
|
## Hooks and Callbacks
|
1008
1030
|
All `Parse::Object` subclasses extend [`ActiveModel::Callbacks`](http://api.rubyonrails.org/classes/ActiveModel/Callbacks.html) for `#save` and `#destroy` operations. You can setup internal hooks for `before`, `during` and `after`. See
|
1009
1031
|
|
data/lib/parse/query.rb
CHANGED
@@ -23,7 +23,7 @@ module Parse
|
|
23
23
|
# You can modify the default client being used by all Parse::Query objects by setting
|
24
24
|
# Parse::Query.client. You can override individual Parse::Query object clients
|
25
25
|
# by changing their client variable to a different Parse::Client object.
|
26
|
-
attr_accessor :table, :client
|
26
|
+
attr_accessor :table, :client, :key
|
27
27
|
|
28
28
|
# We have a special class method to handle field formatting. This turns
|
29
29
|
# the symbol keys in an operand from one key to another. For example, we can
|
@@ -109,6 +109,8 @@ module Parse
|
|
109
109
|
order value
|
110
110
|
elsif expression == :keys
|
111
111
|
keys value
|
112
|
+
elsif expression == :key
|
113
|
+
@key = value
|
112
114
|
elsif expression == :skip
|
113
115
|
skip value
|
114
116
|
elsif expression == :limit
|
@@ -197,6 +199,13 @@ module Parse
|
|
197
199
|
@where ||= []
|
198
200
|
constraint = Parse::Constraint.create operator, value
|
199
201
|
return unless constraint.is_a?(Parse::Constraint)
|
202
|
+
# to support select queries where you have to pass a `key` parameter for matching
|
203
|
+
# different tables.
|
204
|
+
if constraint.operand == :key || constraint.operand == "key"
|
205
|
+
@key = constraint.value
|
206
|
+
return
|
207
|
+
end
|
208
|
+
|
200
209
|
unless opts[:filter] == false
|
201
210
|
constraint.operand = Query.format_field(constraint.operand)
|
202
211
|
end
|
@@ -118,8 +118,14 @@ module Parse
|
|
118
118
|
d = @value
|
119
119
|
d = { __type: "Date", iso: d.iso8601(3) } if d.respond_to?(:iso8601)
|
120
120
|
d = d.pointer if d.respond_to?(:pointer) #simplified query object
|
121
|
+
d = d.to_s if d.is_a?(Regexp)
|
121
122
|
#d = d.pointer if d.is_a?(Parse::Object) #simplified query object
|
122
|
-
d = d.
|
123
|
+
# d = d.compile
|
124
|
+
if d.is_a?(Parse::Query)
|
125
|
+
compiled = d.compile(false)
|
126
|
+
compiled["className"] = d.table
|
127
|
+
d = compiled
|
128
|
+
end
|
123
129
|
d
|
124
130
|
end
|
125
131
|
|
@@ -109,13 +109,23 @@ module Parse
|
|
109
109
|
#This matches a value for a key in the result of a different query
|
110
110
|
contraint_keyword :$select
|
111
111
|
register :select
|
112
|
+
|
113
|
+
def build
|
114
|
+
select_key = @value.key.present? ? @value.key : @operation.operand
|
115
|
+
select_query = formatted_value
|
116
|
+
{ @operation.operand => { key => { query: select_query, key: select_key } } }
|
117
|
+
end
|
112
118
|
end
|
113
119
|
|
114
120
|
class RejectionConstraint < Constraint
|
115
121
|
#requires that a key's value not match a value for a key in the result of a different query
|
116
122
|
contraint_keyword :$dontSelect
|
117
123
|
register :reject
|
118
|
-
|
124
|
+
def build
|
125
|
+
reject_key = @value.key.present? ? @value.key : @operation.operand
|
126
|
+
reject_query = formatted_value
|
127
|
+
{ @operation.operand => { key => { query: reject_query, key: reject_key } } }
|
128
|
+
end
|
119
129
|
end
|
120
130
|
|
121
131
|
class RegularExpressionConstraint < Constraint
|
@@ -140,16 +150,15 @@ module Parse
|
|
140
150
|
end
|
141
151
|
end
|
142
152
|
|
143
|
-
class
|
153
|
+
class InQueryConstraint < Constraint
|
144
154
|
contraint_keyword :$inQuery
|
145
|
-
register :
|
155
|
+
register :matches
|
146
156
|
register :in_query
|
147
|
-
|
148
157
|
end
|
149
158
|
|
150
|
-
class
|
159
|
+
class NotInQueryConstraint < Constraint
|
151
160
|
contraint_keyword :$notInQuery
|
152
|
-
register :
|
161
|
+
register :excludes
|
153
162
|
register :not_in_query
|
154
163
|
|
155
164
|
end
|
data/lib/parse/stack/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parse-stack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anthony Persaud
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-04-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|