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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MGVjNGQ3MGY3YjczYzYzNTUwZGU4M2Y3MDU5ZDZhNGExOTU4MDI4OA==
4
+ OGVjOGRmNGJjOWNmNTFiNDkzZDNmY2FhZTcwNzQwOGE5YjQ4NGJhNg==
5
5
  data.tar.gz: !binary |-
6
- ZGVlZWI0NWVmZDVhNmRjY2ZkOTJlMzNmMTY5MmVkMzZjMzJhZTMyZA==
6
+ ZWI1NGU5OGVhYTRkNDZkY2EwYTlhYjdiYjY1ZTZkMzc5ODBhZmMzOA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MGZkYzE2ZDA3ODI4ODVlMDgwYTBkMzEyOGNmNTMwNzBhOTZhYjMwYzk5YzZl
10
- ZDdhNzBjMTgxNzk4MTY3YWM3YjQyYTJhZDQ2NzkzMTc2OTVlMzYyN2I2Mzlk
11
- ZThhNjU0NzEwYTBlMjVmNDkwMDg0MzgxOTdjMTRjOTdlOGZjOWE=
9
+ YWI4ZjMwOWNkYTIxMmJmNmY1N2Q5NTQwMzY3NzRiZTdlZDNkNmNlMzIwNGE3
10
+ MDE2ZmZjZGUzODc5ZGE0M2ZhOTllOTFmODEwNjdiMzI1YzM1YjllNGI3YWI4
11
+ NjE5ODliZTY1NmNmODM5MjNmM2UzMDdiNDU5MTEzZTFhYzAwYTk=
12
12
  data.tar.gz: !binary |-
13
- MTc2OTUzMjc2MDBjYzFjOTBmMTFiZjk0NDI1Y2EzMDk5ODRlN2RlMjFiMjY2
14
- ZmJiZThiOGI2MGY5NTM4NTdhZGE5YjA5OTI1OWIwNjc4MzM3ZGY1OWVjYmM2
15
- YmRhOGM3OGI0M2NlNTI2YTBlM2EwYTg0ZTVlYzQxMjA1NzI1NmY=
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.22
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
- unless required_args.size == @args.size
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] == required_args[count]
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
- v = self.send(@name.to_sym, *real_vals)
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)
@@ -147,15 +147,16 @@ class ParserTest < Test::Unit::TestCase
147
147
 
148
148
  def test_function_days
149
149
  d = Date.today
150
- dt = DateTime.new(d.year, d.month,d.day, 0,0,0, DateTime.now.offset)
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
- test_time = Time.parse(expressions.first[:value])
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.22
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-10-09 00:00:00.000000000 Z
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.1
172
+ rubygems_version: 2.2.5
173
173
  signing_key:
174
174
  specification_version: 4
175
175
  summary: API Parser engine for filter searching