sparkql 1.1.14 → 1.1.15

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.
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