sparkql 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -177,6 +177,80 @@ class ParserTest < Test::Unit::TestCase
177
177
  assert_equal ['City', '4131800000000'], expression[:field_manipulations][:args].map {|v| v[:value]}
178
178
  end
179
179
 
180
+ test 'add' do
181
+ @parser = Parser.new
182
+ filter = "Baths Add 2 Eq 1"
183
+ expressions = @parser.parse(filter)
184
+ assert !@parser.errors?, @parser.errors.inspect
185
+
186
+ field_manipulations = expressions.first[:field_manipulations]
187
+ assert_equal :arithmetic, field_manipulations[:type]
188
+ assert_equal 'Add', field_manipulations[:op]
189
+ end
190
+
191
+ test 'Sub' do
192
+ @parser = Parser.new
193
+ filter = "Baths Sub 2 Eq 1"
194
+ expressions = @parser.parse(filter)
195
+ assert !@parser.errors?, @parser.errors.inspect
196
+
197
+ field_manipulations = expressions.first[:field_manipulations]
198
+ assert_equal :arithmetic, field_manipulations[:type]
199
+ assert_equal 'Sub', field_manipulations[:op]
200
+ end
201
+
202
+ test 'Mul' do
203
+ @parser = Parser.new
204
+ filter = "Baths Mul 2 Eq 1"
205
+ expressions = @parser.parse(filter)
206
+ assert !@parser.errors?, @parser.errors.inspect
207
+
208
+ field_manipulations = expressions.first[:field_manipulations]
209
+ assert_equal :arithmetic, field_manipulations[:type]
210
+ assert_equal 'Mul', field_manipulations[:op]
211
+ end
212
+
213
+ test 'Div' do
214
+ @parser = Parser.new
215
+ filter = "Baths Div 2 Eq 1"
216
+ expressions = @parser.parse(filter)
217
+ assert !@parser.errors?, @parser.errors.inspect
218
+
219
+ field_manipulations = expressions.first[:field_manipulations]
220
+ assert_equal :arithmetic, field_manipulations[:type]
221
+ assert_equal 'Div', field_manipulations[:op]
222
+ end
223
+
224
+ test 'Mod' do
225
+ @parser = Parser.new
226
+ filter = "Baths Mod 2 Eq 1"
227
+ expressions = @parser.parse(filter)
228
+ assert !@parser.errors?, @parser.errors.inspect
229
+
230
+ field_manipulations = expressions.first[:field_manipulations]
231
+ assert_equal :arithmetic, field_manipulations[:type]
232
+ assert_equal 'Mod', field_manipulations[:op]
233
+ end
234
+
235
+ test 'arithmetic with field function' do
236
+ @parser = Parser.new
237
+ filter = "floor(Baths) Add 2 Eq 1"
238
+ expressions = @parser.parse(filter)
239
+ assert !@parser.errors?, @parser.errors.inspect
240
+
241
+ field_manipulations = expressions.first[:field_manipulations]
242
+ assert_equal :arithmetic, field_manipulations[:type]
243
+ assert_equal 'Add', field_manipulations[:op]
244
+ assert_equal :function, field_manipulations[:lhs][:type]
245
+ end
246
+
247
+ test 'Bad type function with arithmetic' do
248
+ @parser = Parser.new
249
+ filter = "trim(Baths) Add 2 Eq 1"
250
+ @parser.parse(filter)
251
+ assert @parser.errors?
252
+ end
253
+
180
254
  test "function data preserved in expression" do
181
255
  filter = "OriginalEntryTimestamp Ge days(-7)"
182
256
  @parser = Parser.new
@@ -806,6 +880,185 @@ class ParserTest < Test::Unit::TestCase
806
880
  parser_errors("ListPrice Eq cast('10', 'bogus')")
807
881
  end
808
882
 
883
+ test 'arithmetic literals with functions' do
884
+ @parser = Parser.new
885
+ filter = "Baths Eq 1 Add floor(2.3)"
886
+ expressions = @parser.parse(filter)
887
+ assert !@parser.errors?, @parser.errors.inspect
888
+
889
+ assert_equal '3', expressions.first[:value]
890
+ assert_equal :integer, expressions.first[:type]
891
+
892
+ @parser = Parser.new
893
+ filter = "Baths Eq 1 Add length('asdf')"
894
+ expressions = @parser.parse(filter)
895
+ assert !@parser.errors?, @parser.errors.inspect
896
+
897
+ assert_equal '5', expressions.first[:value]
898
+ assert_equal :integer, expressions.first[:type]
899
+ end
900
+
901
+ test 'arithmetic literals with invalid type' do
902
+ @parser = Parser.new
903
+ filter = "Baths Eq 1 Add '2.3'"
904
+ @parser.parse(filter)
905
+ assert @parser.errors?
906
+ end
907
+
908
+ test 'arithmetic literals with invalid function type' do
909
+ @parser = Parser.new
910
+ filter = "Baths Eq 1 Add trim('2.3')"
911
+ @parser.parse(filter)
912
+ assert @parser.errors?
913
+ end
914
+
915
+ test 'Add literals' do
916
+ @parser = Parser.new
917
+ filter = "Baths Eq 1 Add 2"
918
+ expressions = @parser.parse(filter)
919
+ assert !@parser.errors?, @parser.errors.inspect
920
+
921
+ assert_equal '3', expressions.first[:value]
922
+ assert_equal :integer, expressions.first[:type]
923
+
924
+ @parser = Parser.new
925
+ filter = "Baths Eq 1 Add 2 Add 3"
926
+ expressions = @parser.parse(filter)
927
+ assert !@parser.errors?, @parser.errors.inspect
928
+
929
+ assert_equal '6', expressions.first[:value]
930
+ assert_equal :integer, expressions.first[:type]
931
+ end
932
+
933
+ test 'subtract literals' do
934
+ @parser = Parser.new
935
+ filter = "Baths Eq 10 sub 2"
936
+ expressions = @parser.parse(filter)
937
+ assert !@parser.errors?, @parser.errors.inspect
938
+
939
+ assert_equal '8', expressions.first[:value]
940
+ assert_equal :integer, expressions.first[:type]
941
+
942
+ @parser = Parser.new
943
+ filter = "Baths Eq 10 sub 2 sub 3"
944
+ expressions = @parser.parse(filter)
945
+ assert !@parser.errors?, @parser.errors.inspect
946
+
947
+ assert_equal '5', expressions.first[:value]
948
+ assert_equal :integer, expressions.first[:type]
949
+
950
+ @parser = Parser.new
951
+ filter = "Baths Eq 10 sub 2.0 sub 3"
952
+ expressions = @parser.parse(filter)
953
+ assert !@parser.errors?, @parser.errors.inspect
954
+
955
+ assert_equal '5.0', expressions.first[:value]
956
+ assert_equal :decimal, expressions.first[:type]
957
+ end
958
+
959
+ test 'add and subtract' do
960
+ @parser = Parser.new
961
+ filter = "Baths Eq 10 add 2 sub 2"
962
+ expressions = @parser.parse(filter)
963
+ assert !@parser.errors?, @parser.errors.inspect
964
+
965
+ assert_equal '10', expressions.first[:value]
966
+ assert_equal :integer, expressions.first[:type]
967
+
968
+ @parser = Parser.new
969
+ filter = "Baths Eq 10 add 2 sub 2.0"
970
+ expressions = @parser.parse(filter)
971
+ assert !@parser.errors?, @parser.errors.inspect
972
+
973
+ assert_equal '10.0', expressions.first[:value]
974
+ assert_equal :decimal, expressions.first[:type]
975
+ end
976
+
977
+ test 'mul' do
978
+ @parser = Parser.new
979
+ filter = "Baths Eq 5 mul 5"
980
+ expressions = @parser.parse(filter)
981
+ assert !@parser.errors?, @parser.errors.inspect
982
+
983
+ assert_equal '25', expressions.first[:value]
984
+ assert_equal :integer, expressions.first[:type]
985
+
986
+ @parser = Parser.new
987
+ filter = "Baths Eq 5 mul 5 mul 2"
988
+ expressions = @parser.parse(filter)
989
+ assert !@parser.errors?, @parser.errors.inspect
990
+
991
+ assert_equal '50', expressions.first[:value]
992
+ assert_equal :integer, expressions.first[:type]
993
+
994
+ @parser = Parser.new
995
+ filter = "Baths Eq 5.0 mul 5 mul 2"
996
+ expressions = @parser.parse(filter)
997
+ assert !@parser.errors?, @parser.errors.inspect
998
+
999
+ assert_equal '50.0', expressions.first[:value]
1000
+ assert_equal :decimal, expressions.first[:type]
1001
+ end
1002
+
1003
+ test 'field operator precedence' do
1004
+ @parser = Parser.new
1005
+ filter = "Baths add 5 mul 5 Eq 50"
1006
+ expressions = @parser.parse(filter)
1007
+ assert !@parser.errors?, @parser.errors.inspect
1008
+
1009
+ assert_equal 'Add', expressions.first[:field_manipulations][:op]
1010
+ assert_equal 'Mul', expressions.first[:field_manipulations][:rhs][:op]
1011
+ end
1012
+
1013
+ test 'operator precedence' do
1014
+ @parser = Parser.new
1015
+ filter = "Baths Eq 50 add 5 mul 5"
1016
+ expressions = @parser.parse(filter)
1017
+ assert !@parser.errors?, @parser.errors.inspect
1018
+
1019
+ assert_equal '75', expressions.first[:value]
1020
+ assert_equal :integer, expressions.first[:type]
1021
+
1022
+ @parser = Parser.new
1023
+ filter = "Baths Eq 5 mul 5 add 50"
1024
+ expressions = @parser.parse(filter)
1025
+ assert !@parser.errors?, @parser.errors.inspect
1026
+
1027
+ assert_equal '75', expressions.first[:value]
1028
+ assert_equal :integer, expressions.first[:type]
1029
+
1030
+ @parser = Parser.new
1031
+ filter = "Baths Eq 50 add 5 div 5"
1032
+ expressions = @parser.parse(filter)
1033
+ assert !@parser.errors?, @parser.errors.inspect
1034
+
1035
+ assert_equal '51', expressions.first[:value]
1036
+ assert_equal :integer, expressions.first[:type]
1037
+ end
1038
+
1039
+ test 'modulo' do
1040
+ @parser = Parser.new
1041
+ filter = "Baths Eq 5 mod 5"
1042
+ expressions = @parser.parse(filter)
1043
+ assert !@parser.errors?, @parser.errors.inspect
1044
+
1045
+ assert_equal '0', expressions.first[:value]
1046
+ assert_equal :integer, expressions.first[:type]
1047
+
1048
+ @parser = Parser.new
1049
+ filter = "Baths Eq 5.0 mod 5"
1050
+ expressions = @parser.parse(filter)
1051
+ assert !@parser.errors?, @parser.errors.inspect
1052
+
1053
+ assert_equal '0.0', expressions.first[:value]
1054
+ assert_equal :decimal, expressions.first[:type]
1055
+ end
1056
+
1057
+ test 'division by zero' do
1058
+ parser_errors('Baths Eq 5 mod 0')
1059
+ parser_errors('Baths Eq 5 div 0')
1060
+ end
1061
+
809
1062
  test 'nested functions on field side' do
810
1063
  @parser = Parser.new
811
1064
  filter = "tolower(toupper(City)) Eq 'Fargo'"
@@ -839,6 +1092,11 @@ class ParserTest < Test::Unit::TestCase
839
1092
  assert_equal({:type=>:field, :value=>"City"}, function2[:args].first)
840
1093
  end
841
1094
 
1095
+ test 'parse error with no field' do
1096
+ parser_errors("1 Eq 1")
1097
+ parser_errors("1 Add 1 Eq 2")
1098
+ end
1099
+
842
1100
  private
843
1101
 
844
1102
  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.2.1
4
+ version: 1.2.2
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-10-09 00:00:00.000000000 Z
11
+ date: 2018-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: georuby