sparkql 1.1.14 → 1.1.15

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MTMwMTA4MTcwZWRiNzFiMzJkOTFmYzgwNmVlYjRhNzQwZTZlOWQ5OA==
4
+ ZWExMjRhNmFjYzM3NTdjYWNkMjdmOWRjYzBhYTJiNGVjMTRjOTViZg==
5
5
  data.tar.gz: !binary |-
6
- OWQ3NWE4ZmQxOTQ3ZTcxMTk1MmE5MDM4OWU5NWNhNWY5NDUwZDUyYg==
6
+ YzhiYTlhMWM0OTRkNWE4ZTFjMTQzYzE4MmNjYzJiZWQ3MDdhMmFiYQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MzY2NGFkZWYxNWM2ZGQyZWMyNjRmZTkzMzU2OTYwZDBmNzk2YjhmMzc4ZjFj
10
- NjdiYTM5MTBjNmY3ZTQxNmVkOWU4YzFjYzY5MjY2NDQzZDI3MzVmZmUxYWQ0
11
- NGZmYzE5MGM3ODlkZmQ1M2M4NGY4M2I2MGE0MzQyYzVkNzcwOTU=
9
+ Mzk5MGUxM2M0ZWQ2M2QxMTQ2ZDM3MTMxNTEwODVhZTc0NzJlZWJhYzkzODA4
10
+ NDIxZTUxNzE4OTYxYmI3MTJiNzkxMGU1MzVjMGQ3ZDdkMzIzZDQ5OGExMmI5
11
+ YmM1NDU2M2IzM2JhMWU2OTY3Y2NhYzM5MDNiMjllNmVkYjA2NDM=
12
12
  data.tar.gz: !binary |-
13
- NDVmYjg0NjJkYTI1OGJkNjI1MDYxMzc4OGNkNzkyZmFkNjM1ZmU1NmE1OGJl
14
- ODcyOTRiYzcyYjcxNWJhMTk2NWM2ODc2YjQyZTg5YjgwMjBkNzk2NzczODAx
15
- OTc4ZmVmZDBiY2I5ZDc0YWE3YmQyMDAwNTFlZTJkZTg4Yjg2Mjc=
13
+ MTRjZDEyN2U5N2IwZTA5NGEwZjZjMmEyMzM5ZTA4YWUwMDcxNWEwZTZjODli
14
+ OWNmZDBjNmU0YzNiNWZiNjc3MWRkYmRjNjc1ZTg4MjNlNWVlNzAzYTVhY2Uz
15
+ NzU2OTg2NzAzZTA4ZjdmMDFkZDdhMzY3NTU4ZTQxNTRhODkyNDQ=
@@ -1,3 +1,7 @@
1
+ v1.1.15, 2018-07-12
2
+ -------------------
3
+ * [IMPROVEMENT] New Functions: ceiling(), floor()
4
+
1
5
  v1.1.14, 2018-07-12
2
6
  -------------------
3
7
  * [IMPROVEMENT] Allow Negation for integer and decimal literals
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.14
1
+ 1.1.15
@@ -74,6 +74,16 @@ class Sparkql::FunctionResolver
74
74
  :resolve_for_type => true,
75
75
  :return_type => :integer
76
76
  },
77
+ :ceiling => {
78
+ :args => [[:field, :decimal]],
79
+ :resolve_for_type => true,
80
+ :return_type => :integer
81
+ },
82
+ :floor => {
83
+ :args => [[:field, :decimal]],
84
+ :resolve_for_type => true,
85
+ :return_type => :integer
86
+ },
77
87
  :startswith => {
78
88
  :args => [:character],
79
89
  :return_type => :startswith
@@ -468,6 +478,36 @@ class Sparkql::FunctionResolver
468
478
  }
469
479
  end
470
480
 
481
+ def floor_decimal(arg)
482
+ {
483
+ :type => :integer,
484
+ :value => arg.floor.to_s
485
+ }
486
+ end
487
+
488
+ def floor_field(arg)
489
+ {
490
+ :type => :function,
491
+ :value => "floor",
492
+ :args => [arg]
493
+ }
494
+ end
495
+
496
+ def ceiling_decimal(arg)
497
+ {
498
+ :type => :integer,
499
+ :value => arg.ceil.to_s
500
+ }
501
+ end
502
+
503
+ def ceiling_field(arg)
504
+ {
505
+ :type => :function,
506
+ :value => "ceiling",
507
+ :args => [arg]
508
+ }
509
+ end
510
+
471
511
  def round_decimal(arg)
472
512
  {
473
513
  :type => :integer,
@@ -239,6 +239,46 @@ class FunctionResolverTest < Test::Unit::TestCase
239
239
  assert_equal '9999-12-31T23:59:59+00:00', value[:value]
240
240
  end
241
241
 
242
+ test "floor(float)" do
243
+ f = FunctionResolver.new('floor', [{:type => :decimal, :value => 0.5}])
244
+ f.validate
245
+ assert !f.errors?, "Errors #{f.errors.inspect}"
246
+ value = f.call
247
+ assert_equal :integer, value[:type]
248
+ assert_equal '0', value[:value]
249
+ end
250
+
251
+ test "floor(Field)" do
252
+ f = FunctionResolver.new('floor', [{:type => :field, :value => 'ListPrice'}])
253
+ f.validate
254
+ assert !f.errors?, "Errors #{f.errors.inspect}"
255
+ value = f.call
256
+
257
+ assert_equal :function, value[:type]
258
+ assert_equal 'floor', value[:value]
259
+ assert_equal "ListPrice", value[:args].first
260
+ end
261
+
262
+ test "ceiling(float)" do
263
+ f = FunctionResolver.new('ceiling', [{:type => :decimal, :value => 0.5}])
264
+ f.validate
265
+ assert !f.errors?, "Errors #{f.errors.inspect}"
266
+ value = f.call
267
+ assert_equal :integer, value[:type]
268
+ assert_equal '1', value[:value]
269
+ end
270
+
271
+ test "ceiling(Field)" do
272
+ f = FunctionResolver.new('ceiling', [{:type => :field, :value => 'ListPrice'}])
273
+ f.validate
274
+ assert !f.errors?, "Errors #{f.errors.inspect}"
275
+ value = f.call
276
+
277
+ assert_equal :function, value[:type]
278
+ assert_equal 'ceiling', value[:value]
279
+ assert_equal "ListPrice", value[:args].first
280
+ end
281
+
242
282
  test "days()" do
243
283
  d = Date.new(2012,10,20)
244
284
  Date.expects(:today).returns(d)
@@ -695,6 +695,64 @@ class ParserTest < Test::Unit::TestCase
695
695
  assert_equal(["FieldName"], expression[:function_parameters])
696
696
  end
697
697
 
698
+ def test_ceiling_with_literal
699
+ filter = "ListPrice Eq ceiling(0.5)"
700
+ @parser = Parser.new
701
+ expression = @parser.parse(filter).first
702
+ assert !@parser.errors?, "Filter '#{filter}' failed: #{@parser.errors.first.inspect}"
703
+
704
+ assert_equal :integer, expression[:type]
705
+ assert_equal "1", expression[:value]
706
+
707
+ filter = "ListPrice Eq ceiling(-0.5)"
708
+ @parser = Parser.new
709
+ expression = @parser.parse(filter).first
710
+ assert !@parser.errors?, "Filter '#{filter}' failed: #{@parser.errors.first.inspect}"
711
+
712
+ assert_equal :integer, expression[:type]
713
+ assert_equal "0", expression[:value]
714
+ end
715
+
716
+ def test_ceiling_with_field
717
+ filter = "ListPrice Eq ceiling(FieldName)"
718
+ @parser = Parser.new
719
+ expression = @parser.parse(filter).first
720
+ assert !@parser.errors?, "Filter '#{filter}' failed: #{@parser.errors.first.inspect}"
721
+
722
+ assert_equal 'ceiling', expression[:function_name]
723
+ assert_equal 'ceiling(FieldName)', expression[:condition]
724
+ assert_equal(["FieldName"], expression[:function_parameters])
725
+ end
726
+
727
+ def test_floor_with_literal
728
+ filter = "ListPrice Eq floor(0.5)"
729
+ @parser = Parser.new
730
+ expression = @parser.parse(filter).first
731
+ assert !@parser.errors?, "Filter '#{filter}' failed: #{@parser.errors.first.inspect}"
732
+
733
+ assert_equal :integer, expression[:type]
734
+ assert_equal "0", expression[:value]
735
+
736
+ filter = "ListPrice Eq floor(-0.5)"
737
+ @parser = Parser.new
738
+ expression = @parser.parse(filter).first
739
+ assert !@parser.errors?, "Filter '#{filter}' failed: #{@parser.errors.first.inspect}"
740
+
741
+ assert_equal :integer, expression[:type]
742
+ assert_equal "-1", expression[:value]
743
+ end
744
+
745
+ def test_floor_with_field
746
+ filter = "ListPrice Eq floor(FieldName)"
747
+ @parser = Parser.new
748
+ expression = @parser.parse(filter).first
749
+ assert !@parser.errors?, "Filter '#{filter}' failed: #{@parser.errors.first.inspect}"
750
+
751
+ assert_equal 'floor', expression[:function_name]
752
+ assert_equal 'floor(FieldName)', expression[:condition]
753
+ assert_equal(["FieldName"], expression[:function_parameters])
754
+ end
755
+
698
756
  private
699
757
 
700
758
  def parser_errors(filter)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sparkql
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.14
4
+ version: 1.1.15
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-07-13 00:00:00.000000000 Z
11
+ date: 2018-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: georuby