sparkql 0.3.22 → 0.3.23
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 +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
|