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 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