sparkql 1.2.2 → 1.2.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -565,4 +565,19 @@ class ParserCompatabilityTest < Test::Unit::TestCase
565
565
  assert parser.send(:check_type!, expression, :datetime)
566
566
  assert_equal '3', parser.escape_value(expression)
567
567
  end
568
+
569
+ test "function with field and arithmetic" do
570
+ filter = "year(CloseDate) add 1 Eq 2017"
571
+ parser = Parser.new
572
+ expression = parser.tokenize(filter).first
573
+ assert parser.send(:check_type!, expression, :datetime)
574
+ end
575
+
576
+ test "Cannot perform arithmetic on a String field" do
577
+ filter = "City Add 3.0 Eq 'Fargo'"
578
+ parser = Parser.new
579
+ expression = parser.tokenize(filter).first
580
+ # Type mismatch
581
+ assert !parser.send(:check_type!, expression, :datetime)
582
+ end
568
583
  end
@@ -125,19 +125,23 @@ class ParserTest < Test::Unit::TestCase
125
125
  end
126
126
 
127
127
  def test_function_days
128
- d = Date.today
129
- start = Time.utc(d.year,d.month,d.day,0,0,0)
130
- filter = "OriginalEntryTimestamp Ge days(-7)"
128
+ dt = DateTime.new(2021, 2, 22, 0, 0, 0, 0)
129
+ DateTime.expects(:now).returns(dt)
131
130
  @parser = Parser.new
132
- expressions = @parser.parse(filter)
133
- assert !@parser.errors?, "errors #{@parser.errors.inspect}"
134
- assert_equal 'days(-7)', expressions.first[:condition]
135
-
136
- vals = expressions.first[:value].split('-')
131
+ expressions = @parser.parse "ExpirationDate Gt days(10)"
132
+ assert !@parser.errors?
133
+ assert_equal "2021-03-04", expressions.first[:value]
134
+ assert_equal 'days(10)', expressions.first[:condition]
135
+ end
137
136
 
138
- test_time = Time.utc(vals[0].to_i, vals[1].to_i, vals[2].to_i)
139
-
140
- assert (-605000 < test_time - start && -604000 > test_time - start), "Time range off by more than five seconds #{test_time - start} '#{test_time} - #{start}'"
137
+ def test_function_weekdays
138
+ dt = DateTime.new(2021, 2, 22, 0, 0, 0, 0)
139
+ DateTime.expects(:now).returns(dt)
140
+ @parser = Parser.new
141
+ expressions = @parser.parse "ExpirationDate Gt weekdays(10)"
142
+ assert !@parser.errors?
143
+ assert_equal "2021-03-08", expressions.first[:value]
144
+ assert_equal 'weekdays(10)', expressions.first[:condition]
141
145
  end
142
146
 
143
147
  def test_function_now
@@ -232,6 +236,54 @@ class ParserTest < Test::Unit::TestCase
232
236
  assert_equal 'Mod', field_manipulations[:op]
233
237
  end
234
238
 
239
+ test 'Mod returns decimal precision' do
240
+ @parser = Parser.new
241
+ filter = "Baths Eq 32.7 Mod 20.7"
242
+ expressions = @parser.parse(filter)
243
+ assert !@parser.errors?, @parser.errors.inspect
244
+ assert_equal '12.0', expressions.first[:value]
245
+ end
246
+
247
+ test 'Adding returns decimal precision' do
248
+ @parser = Parser.new
249
+ filter = "Baths Eq 0.1 Add 0.2"
250
+ expressions = @parser.parse(filter)
251
+ assert !@parser.errors?, @parser.errors.inspect
252
+ assert_equal '0.3', expressions.first[:value]
253
+ end
254
+
255
+ test 'Subtracting returns decimal precision' do
256
+ @parser = Parser.new
257
+ filter = "Baths Eq 0.3 Sub 0.1"
258
+ expressions = @parser.parse(filter)
259
+ assert !@parser.errors?, @parser.errors.inspect
260
+ assert_equal '0.2', expressions.first[:value]
261
+ end
262
+
263
+ test 'Division returns decimal precision' do
264
+ @parser = Parser.new
265
+ filter = "Baths Eq 0.6 Div 0.2"
266
+ expressions = @parser.parse(filter)
267
+ assert !@parser.errors?, @parser.errors.inspect
268
+ assert_equal '3.0', expressions.first[:value]
269
+ end
270
+
271
+ test 'Arithmetic rounds to 20 decimal places' do
272
+ @parser = Parser.new
273
+ filter = "Baths Eq 7 Div 10.1"
274
+ expressions = @parser.parse(filter)
275
+ assert !@parser.errors?, @parser.errors.inspect
276
+ assert_equal '0.69306930693069306931', expressions.first[:value]
277
+ end
278
+
279
+ test 'Multiplication returns decimal precision' do
280
+ @parser = Parser.new
281
+ filter = "Baths Eq 7 Mul 0.1"
282
+ expressions = @parser.parse(filter)
283
+ assert !@parser.errors?, @parser.errors.inspect
284
+ assert_equal '0.7', expressions.first[:value]
285
+ end
286
+
235
287
  test 'arithmetic with field function' do
236
288
  @parser = Parser.new
237
289
  filter = "floor(Baths) Add 2 Eq 1"
@@ -340,10 +392,40 @@ class ParserTest < Test::Unit::TestCase
340
392
  test "invalid regex" do
341
393
  filter = "ParcelNumber Eq regex('[1234', '')"
342
394
  @parser = Parser.new
343
- expressions = @parser.parse(filter)
395
+ @parser.parse(filter)
344
396
  assert @parser.errors?, "Parser error expected due to invalid regex"
345
397
  end
346
398
 
399
+ test "dayofyear function parses" do
400
+ filter = "dayofyear(DatetimeField) Eq 2012"
401
+ @parser = Parser.new
402
+ expressions = @parser.parse(filter)
403
+ assert !@parser.errors?, @parser.errors.inspect
404
+ function = expressions.first[:field_manipulations]
405
+ assert_equal 'dayofyear', function[:function_name]
406
+ assert_equal 'DatetimeField', function[:function_parameters].first
407
+ end
408
+
409
+ test "dayofweek function parses" do
410
+ filter = "dayofweek(DatetimeField) Eq 7"
411
+ @parser = Parser.new
412
+ expressions = @parser.parse(filter)
413
+ assert !@parser.errors?, @parser.errors.inspect
414
+ function = expressions.first[:field_manipulations]
415
+ assert_equal 'dayofweek', function[:function_name]
416
+ assert_equal 'DatetimeField', function[:function_parameters].first
417
+ end
418
+
419
+ test "weekdays function resolves" do
420
+ filter = "DatetimeField Eq weekdays(10)"
421
+ @parser = Parser.new
422
+ expressions = @parser.parse(filter)
423
+ assert !@parser.errors?, @parser.errors.inspect
424
+ function = expressions.first
425
+ assert_equal 'weekdays', function[:function_name]
426
+ assert_equal 10, function[:function_parameters].first
427
+ end
428
+
347
429
  test "allow timezone offsets" do
348
430
  values = [
349
431
  "2013-07-26",
@@ -370,7 +452,7 @@ class ParserTest < Test::Unit::TestCase
370
452
  assert_equal expressions.first[:value], value, "#{value} failed"
371
453
  end
372
454
  end
373
-
455
+
374
456
  test "Location Eq polygon()" do
375
457
  filter = "Location Eq polygon('35.12 -68.33, 35.13 -68.33, 35.13 -68.32, 35.12 -68.32')"
376
458
  @parser = Parser.new
@@ -732,6 +814,16 @@ class ParserTest < Test::Unit::TestCase
732
814
  parser_errors("Field Eq -'Stringval'")
733
815
  end
734
816
 
817
+
818
+ test "field negation" do
819
+ @parser = Parser.new
820
+ expressions = @parser.parse('-Test Eq 10')
821
+ assert !@parser.errors?
822
+
823
+ assert_equal 'Negation', expressions.first[:field_manipulations][:op]
824
+ assert_equal 'Test', expressions.first[:field]
825
+ end
826
+
735
827
  def test_substring
736
828
  filter = "Name Eq substring('Andy', 1)"
737
829
  @parser = Parser.new
@@ -1097,6 +1189,49 @@ class ParserTest < Test::Unit::TestCase
1097
1189
  parser_errors("1 Add 1 Eq 2")
1098
1190
  end
1099
1191
 
1192
+ test "field grouping" do
1193
+ @parser = Parser.new
1194
+ expressions = @parser.parse('(Test) Eq 10')
1195
+ assert !@parser.errors?
1196
+
1197
+ assert_equal 'Group', expressions.first[:field_manipulations][:op]
1198
+ end
1199
+
1200
+ test "grouping arithmetic" do
1201
+ @parser = Parser.new
1202
+ expressions = @parser.parse('(Test mul 10) sub 2 Eq 10')
1203
+ assert !@parser.errors?
1204
+
1205
+ assert_equal 'Sub', expressions.first[:field_manipulations][:op]
1206
+ assert_equal 'Group', expressions.first[:field_manipulations][:lhs][:op]
1207
+ end
1208
+
1209
+ test "grouping literal" do
1210
+ @parser = Parser.new
1211
+ expressions = @parser.parse('Test Eq (5 sub 5) mul 5 ')
1212
+ assert !@parser.errors?
1213
+
1214
+ assert_equal '0', expressions.first[:value]
1215
+ end
1216
+
1217
+ test 'Arithmetic grouping should not influence expression grouping' do
1218
+ filter = "(BathroomsTotalDecimal add (5 mul 5)) Eq ((3.4 add 2.6) mul (1 add 1))"
1219
+ @parser = Parser.new
1220
+ expressions = @parser.parse(filter)
1221
+ assert !@parser.errors?
1222
+ assert_equal 0, expressions.first[:level]
1223
+ assert_equal 0, expressions.first[:block_group]
1224
+
1225
+ filter = "((BathroomsTotalDecimal add (5 mul 5)) Eq ((3.4 add 2.6) mul (1 add 1))) And BathroomsTotalDecimal Eq 5"
1226
+ @parser = Parser.new
1227
+ expressions = @parser.parse(filter)
1228
+ assert !@parser.errors?
1229
+ assert_equal 1, expressions.first[:level]
1230
+ assert_equal 1, expressions.first[:block_group]
1231
+ assert_equal 0, expressions.last[:level]
1232
+ assert_equal 0, expressions.last[:block_group]
1233
+ end
1234
+
1100
1235
  private
1101
1236
 
1102
1237
  def parser_errors(filter)
metadata CHANGED
@@ -1,99 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sparkql
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wade McEwen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-28 00:00:00.000000000 Z
11
+ date: 2021-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: georuby
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '2.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: racc
28
+ name: ci_reporter
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.4.8
33
+ version: '1.6'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.4.8
40
+ version: '1.6'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rake
42
+ name: mocha
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.9.2
47
+ version: 0.12.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.9.2
54
+ version: 0.12.0
55
55
  - !ruby/object:Gem::Dependency
56
- name: test-unit
56
+ name: racc
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 2.1.0
61
+ version: 1.4.8
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 2.1.0
68
+ version: 1.4.8
69
69
  - !ruby/object:Gem::Dependency
70
- name: ci_reporter
70
+ name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ~>
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '1.6'
75
+ version: 0.9.2
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '1.6'
82
+ version: 0.9.2
83
83
  - !ruby/object:Gem::Dependency
84
- name: mocha
84
+ name: test-unit
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ~>
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.12.0
89
+ version: 2.1.0
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ~>
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.12.0
96
+ version: 2.1.0
97
97
  description: Specification and base implementation of the Spark API parsing system.
98
98
  email:
99
99
  - wade@fbsdata.com
@@ -101,8 +101,7 @@ executables: []
101
101
  extensions: []
102
102
  extra_rdoc_files: []
103
103
  files:
104
- - .gitignore
105
- - .ruby-version
104
+ - ".gitignore"
106
105
  - CHANGELOG.md
107
106
  - GRAMMAR.md
108
107
  - Gemfile
@@ -149,17 +148,17 @@ require_paths:
149
148
  - lib
150
149
  required_ruby_version: !ruby/object:Gem::Requirement
151
150
  requirements:
152
- - - ! '>='
151
+ - - ">="
153
152
  - !ruby/object:Gem::Version
154
- version: '0'
153
+ version: '2.3'
155
154
  required_rubygems_version: !ruby/object:Gem::Requirement
156
155
  requirements:
157
- - - ! '>='
156
+ - - ">="
158
157
  - !ruby/object:Gem::Version
159
158
  version: '0'
160
159
  requirements: []
161
160
  rubyforge_project: sparkql
162
- rubygems_version: 2.2.5
161
+ rubygems_version: 2.7.6
163
162
  signing_key:
164
163
  specification_version: 4
165
164
  summary: API Parser engine for filter searching
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 1.9.3