sparkql 0.3.22 → 0.3.23
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/CHANGELOG.md +5 -0
- data/VERSION +1 -1
- data/lib/sparkql/function_resolver.rb +49 -3
- data/test/unit/parser_test.rb +26 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OGVjOGRmNGJjOWNmNTFiNDkzZDNmY2FhZTcwNzQwOGE5YjQ4NGJhNg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZWI1NGU5OGVhYTRkNDZkY2EwYTlhYjdiYjY1ZTZkMzc5ODBhZmMzOA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YWI4ZjMwOWNkYTIxMmJmNmY1N2Q5NTQwMzY3NzRiZTdlZDNkNmNlMzIwNGE3
|
10
|
+
MDE2ZmZjZGUzODc5ZGE0M2ZhOTllOTFmODEwNjdiMzI1YzM1YjllNGI3YWI4
|
11
|
+
NjE5ODliZTY1NmNmODM5MjNmM2UzMDdiNDU5MTEzZTFhYzAwYTk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
Mjk5MjhkODQ3Yjc0NmIzNDlmZjU5MDY5N2JhOGU3NWFlZDlhODkyN2Q1MzZj
|
14
|
+
ZDU2YTEzNjdmZWU2NWVhY2JkODE4MDNhYzM5NGE2MmJiMTUwNWFjYzg3Y2Qz
|
15
|
+
ZjhhZTBiZGJlODBlY2Q2MDg1MTRmODg5YTA5OTNjMmI3MjE1ZTA=
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
v0.3.23, 2015-10-09 ([changes](https://github.com/sparkapi/sparkql/compare/v0.3.22...v0.3.23))
|
2
|
+
-------------------
|
3
|
+
|
4
|
+
* [IMPROVEMENT] Add regex function for character types
|
5
|
+
|
1
6
|
v0.3.22, 2015-10-09 ([changes](https://github.com/sparkapi/sparkql/compare/v0.3.21...v0.3.22))
|
2
7
|
-------------------
|
3
8
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.23
|
@@ -12,6 +12,7 @@ class Sparkql::FunctionResolver
|
|
12
12
|
SECONDS_IN_DAY = 60 * 60 * 24
|
13
13
|
STRFTIME_FORMAT = '%Y-%m-%d'
|
14
14
|
|
15
|
+
VALID_REGEX_FLAGS = ["", "i"]
|
15
16
|
SUPPORTED_FUNCTIONS = {
|
16
17
|
:polygon => {
|
17
18
|
:args => [:character],
|
@@ -25,6 +26,14 @@ class Sparkql::FunctionResolver
|
|
25
26
|
:args => [:character, :decimal],
|
26
27
|
:return_type => :shape
|
27
28
|
},
|
29
|
+
:regex => {
|
30
|
+
:args => [:character],
|
31
|
+
:opt_args => [{
|
32
|
+
:type => :character,
|
33
|
+
:default => ''
|
34
|
+
}],
|
35
|
+
:return_type => :character
|
36
|
+
},
|
28
37
|
:linestring => {
|
29
38
|
:args => [:character],
|
30
39
|
:return_type => :shape
|
@@ -67,8 +76,11 @@ class Sparkql::FunctionResolver
|
|
67
76
|
:status => :fatal )
|
68
77
|
return
|
69
78
|
end
|
79
|
+
|
70
80
|
required_args = support[name][:args]
|
71
|
-
|
81
|
+
total_args = required_args + Array(support[name][:opt_args]).collect {|args| args[:type]}
|
82
|
+
|
83
|
+
if @args.size < required_args.size || @args.size > total_args.size
|
72
84
|
@errors << Sparkql::ParserError.new(:token => @name,
|
73
85
|
:message => "Function call '#{@name}' requires #{required_args.size} arguments",
|
74
86
|
:status => :fatal )
|
@@ -77,7 +89,7 @@ class Sparkql::FunctionResolver
|
|
77
89
|
|
78
90
|
count = 0
|
79
91
|
@args.each do |arg|
|
80
|
-
unless arg[:type] ==
|
92
|
+
unless arg[:type] == total_args[count]
|
81
93
|
@errors << Sparkql::ParserError.new(:token => @name,
|
82
94
|
:message => "Function call '#{@name}' has an invalid argument at #{arg[:value]}",
|
83
95
|
:status => :fatal )
|
@@ -105,7 +117,17 @@ class Sparkql::FunctionResolver
|
|
105
117
|
# Execute the function
|
106
118
|
def call()
|
107
119
|
real_vals = @args.map { |i| i[:value]}
|
108
|
-
|
120
|
+
name = @name.to_sym
|
121
|
+
|
122
|
+
required_args = support[name][:args]
|
123
|
+
total_args = required_args + Array(support[name][:opt_args]).collect {|args| args[:default]}
|
124
|
+
fill_in_optional_args = total_args.drop(real_vals.length)
|
125
|
+
|
126
|
+
fill_in_optional_args.each do |default|
|
127
|
+
real_vals << default
|
128
|
+
end
|
129
|
+
|
130
|
+
v = self.send(name, *real_vals)
|
109
131
|
|
110
132
|
unless v.nil?
|
111
133
|
v[:function_name] = @name
|
@@ -118,6 +140,30 @@ class Sparkql::FunctionResolver
|
|
118
140
|
protected
|
119
141
|
|
120
142
|
# Supported function calls
|
143
|
+
|
144
|
+
def regex(regular_expression, flags)
|
145
|
+
|
146
|
+
unless (flags.chars.to_a - VALID_REGEX_FLAGS).empty?
|
147
|
+
@errors << Sparkql::ParserError.new(:token => regular_expression,
|
148
|
+
:message => "Invalid Regexp",
|
149
|
+
:status => :fatal)
|
150
|
+
return
|
151
|
+
end
|
152
|
+
|
153
|
+
begin
|
154
|
+
Regexp.new(regular_expression)
|
155
|
+
rescue => e
|
156
|
+
@errors << Sparkql::ParserError.new(:token => regular_expression,
|
157
|
+
:message => "Invalid Regexp",
|
158
|
+
:status => :fatal)
|
159
|
+
return
|
160
|
+
end
|
161
|
+
|
162
|
+
{
|
163
|
+
:type => :character,
|
164
|
+
:value => regular_expression
|
165
|
+
}
|
166
|
+
end
|
121
167
|
|
122
168
|
# Offset the current timestamp by a number of days
|
123
169
|
def days(num)
|
data/test/unit/parser_test.rb
CHANGED
@@ -147,15 +147,16 @@ class ParserTest < Test::Unit::TestCase
|
|
147
147
|
|
148
148
|
def test_function_days
|
149
149
|
d = Date.today
|
150
|
-
|
151
|
-
start = Time.parse(dt.to_s)
|
150
|
+
start = Time.utc(d.year,d.month,d.day,0,0,0)
|
152
151
|
filter = "OriginalEntryTimestamp Ge days(-7)"
|
153
152
|
@parser = Parser.new
|
154
153
|
expressions = @parser.parse(filter)
|
155
154
|
assert !@parser.errors?, "errors #{@parser.errors.inspect}"
|
156
155
|
assert_equal 'days(-7)', expressions.first[:condition]
|
157
156
|
|
158
|
-
|
157
|
+
vals = expressions.first[:value].split('-')
|
158
|
+
|
159
|
+
test_time = Time.utc(vals[0].to_i, vals[1].to_i, vals[2].to_i)
|
159
160
|
|
160
161
|
assert (-605000 < test_time - start && -604000 > test_time - start), "Time range off by more than five seconds #{test_time - start} '#{test_time} - #{start}'"
|
161
162
|
end
|
@@ -217,6 +218,28 @@ class ParserTest < Test::Unit::TestCase
|
|
217
218
|
assert_equal '2014,days(-7)', expressions.first[:condition]
|
218
219
|
end
|
219
220
|
|
221
|
+
test "regex function parses without second param" do
|
222
|
+
filter = "ParcelNumber Eq regex('^[0-9]{3}-[0-9]{2}-[0-9]{3}$')"
|
223
|
+
@parser = Parser.new
|
224
|
+
expression = @parser.parse(filter).first
|
225
|
+
assert_equal '', expression[:function_parameters][1]
|
226
|
+
assert_equal '^[0-9]{3}-[0-9]{2}-[0-9]{3}$', expression[:function_parameters][0]
|
227
|
+
end
|
228
|
+
|
229
|
+
test "regex function parses with case-insensitive flag" do
|
230
|
+
filter = "ParcelNumber Eq regex('^[0-9]{3}-[0-9]{2}-[0-9]{3}$', 'i')"
|
231
|
+
@parser = Parser.new
|
232
|
+
expression = @parser.parse(filter).first
|
233
|
+
assert_equal 'i', expression[:function_parameters][1]
|
234
|
+
assert_equal '^[0-9]{3}-[0-9]{2}-[0-9]{3}$', expression[:function_parameters][0]
|
235
|
+
end
|
236
|
+
|
237
|
+
test "invalid regex" do
|
238
|
+
filter = "ParcelNumber Eq regex('[1234', '')"
|
239
|
+
@parser = Parser.new
|
240
|
+
expressions = @parser.parse(filter)
|
241
|
+
assert @parser.errors?, "Parser error expected due to invalid regex"
|
242
|
+
end
|
220
243
|
|
221
244
|
test "allow timezone offsets" do
|
222
245
|
values = [
|
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: 0.3.
|
4
|
+
version: 0.3.23
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wade McEwen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: georuby
|
@@ -169,7 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
169
|
version: '0'
|
170
170
|
requirements: []
|
171
171
|
rubyforge_project: sparkql
|
172
|
-
rubygems_version: 2.2.
|
172
|
+
rubygems_version: 2.2.5
|
173
173
|
signing_key:
|
174
174
|
specification_version: 4
|
175
175
|
summary: API Parser engine for filter searching
|