rgviz 0.34 → 0.35

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.
data/lib/rgviz/nodes.rb CHANGED
@@ -203,9 +203,33 @@ module Rgviz
203
203
  end
204
204
 
205
205
  end
206
+
207
+ class LogicalExpression
208
+ And = Token::And
209
+ Or = Token::Or
210
+
211
+ attr_accessor :operator
212
+ attr_accessor :operands
213
+
214
+ def initialize(operator, operands)
215
+ @operator = operator
216
+ @operands = operands
217
+ end
218
+
219
+ def accept(visitor)
220
+ if visitor.visit_logical_expression(self)
221
+ operands.each{|x| x.accept visitor}
222
+ end
223
+ visitor.end_visit_logical_expression self
224
+ end
225
+
226
+ def to_s
227
+ operands.map(&:to_s).join(" #{operator} ")
228
+ end
229
+
230
+ end
206
231
 
207
232
  class BinaryExpression
208
- And = Token::And
209
233
  Contains = Token::Contains
210
234
  EndsWith = :'ends with'
211
235
  Eq = Token::EQ
@@ -216,7 +240,7 @@ module Rgviz
216
240
  Lte = Token::LTE
217
241
  Matches = Token::Matches
218
242
  Neq = Token::NEQ
219
- Or = Token::Or
243
+
220
244
  StartsWith = :'starts with'
221
245
 
222
246
  attr_accessor :operator
data/lib/rgviz/parser.rb CHANGED
@@ -196,24 +196,28 @@ module Rgviz
196
196
 
197
197
  def parse_or_expression
198
198
  left = parse_and_expression
199
+ return left unless token_is? Token::Or
200
+
201
+ operands = [left]
199
202
  while true
200
203
  if token_is! Token::Or
201
- right = parse_and_expression
202
- left = BinaryExpression.new left, BinaryExpression::Or, right
204
+ operands << parse_and_expression
203
205
  else
204
- return left
206
+ return LogicalExpression.new(LogicalExpression::Or, operands)
205
207
  end
206
208
  end
207
209
  end
208
210
 
209
211
  def parse_and_expression
210
212
  left = parse_not_expression
213
+ return left unless token_is? Token::And
214
+
215
+ operands = [left]
211
216
  while true
212
217
  if token_is! Token::And
213
- right = parse_not_expression
214
- left = BinaryExpression.new left, BinaryExpression::And, right
218
+ operands << parse_not_expression
215
219
  else
216
- return left
220
+ return LogicalExpression.new(LogicalExpression::And, operands)
217
221
  end
218
222
  end
219
223
  end
data/lib/rgviz/visitor.rb CHANGED
@@ -2,7 +2,7 @@ module Rgviz
2
2
  class Visitor
3
3
  ['query', 'select', 'group_by', 'pivot', 'order_by',
4
4
  'sort', 'where', 'label', 'format',
5
- 'binary_expression', 'unary_expression',
5
+ 'logical_expression', 'binary_expression', 'unary_expression',
6
6
  'id_column', 'number_column', 'string_column',
7
7
  'boolean_column', 'date_column', 'date_time_column',
8
8
  'time_of_day_column', 'scalar_function_column', 'aggregate_column'].each do |name|
@@ -331,12 +331,18 @@ describe Parser do
331
331
  options.no_format.should be_true
332
332
  end
333
333
 
334
- it "parses where with two ands" do
335
- parse "where 1 = 1 and 1 = 1 and 1 = 1"
336
- end
337
-
338
- it "parses where with two ors" do
339
- parse "where 1 = 1 or 1 = 1 or 1 = 1"
334
+ [
335
+ ['and', LogicalExpression::And],
336
+ ['or', LogicalExpression::Or]
337
+ ].each do |str, op|
338
+ it "parses where with two #{str}" do
339
+ query = parse "where 1 = 1 #{str} 1 = 2 #{str} 1 = 3"
340
+ exp = query.where.expression
341
+
342
+ exp.should be_a_kind_of LogicalExpression
343
+ exp.operator.should == op
344
+ exp.operands.length.should == 3
345
+ end
340
346
  end
341
347
 
342
348
  ['+', '-', '*', '/'].each do |op|
metadata CHANGED
@@ -1,12 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rgviz
3
3
  version: !ruby/object:Gem::Version
4
- hash: 79
4
+ hash: 77
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 34
9
- version: "0.34"
8
+ - 35
9
+ version: "0.35"
10
10
  platform: ruby
11
11
  authors:
12
12
  - Ary Borenszweig