sparkql 1.2.1 → 1.2.2
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 +8 -8
- data/CHANGELOG.md +4 -0
- data/GRAMMAR.md +63 -38
- data/VERSION +1 -1
- data/lib/sparkql/lexer.rb +11 -1
- data/lib/sparkql/parser.rb +318 -181
- data/lib/sparkql/parser.y +93 -64
- data/lib/sparkql/parser_tools.rb +122 -10
- data/lib/sparkql/token.rb +8 -1
- data/test/unit/parser_test.rb +258 -0
- metadata +2 -2
data/test/unit/parser_test.rb
CHANGED
@@ -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.
|
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-
|
11
|
+
date: 2018-11-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: georuby
|