rubyang 0.1.2.1 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/lib/rubyang/xpath.rb CHANGED
@@ -1,461 +1,463 @@
1
1
  # coding utf-8
2
+ # vim: et ts=2 sw=2
2
3
 
3
- require_relative 'xpath/parser'
4
- require_relative 'database/data_tree'
4
+ require 'rubyang/xpath/logger'
5
+ require 'rubyang/xpath/parser'
6
+ require 'rubyang/database/data_tree'
5
7
 
6
8
  module Rubyang
7
- module Xpath
8
- module BasicType
9
- class NodeSet
10
- include Enumerable
11
-
12
- attr_reader :value
13
- def initialize value=[]
14
- raise "#{self.class} argument must be Array but #{value.class}" unless Array === value
15
- value.each{ |v|
16
- unless Rubyang::Database::DataTree::Node === v
17
- raise "#{self.class} argument must be Rubyang::Database::DataTree::Node but #{v.class}"
18
- end
19
- }
20
- @value = value
21
- end
22
-
23
- def each
24
- @value.each do |v|
25
- yield v
26
- end
27
- end
28
-
29
- def to_boolean
30
- value = if @value == [] then false else true end
31
- Boolean.new value
32
- end
33
-
34
- def == right
35
- @value.each{ |v|
36
- unless Rubyang::Database::DataTree::Leaf === v
37
- raise "#{self.class} argument must be Rubyang::Database::DataTree::Leaf but #{v.class}"
38
- end
39
- }
40
- case right
41
- when NodeSet
42
- right.value.each{ |v|
43
- unless Rubyang::Database::DataTree::Leaf === v
44
- raise "#{right.class} argument must be Rubyang::Database::DataTree::Leaf but #{v.class}"
45
- end
46
- }
47
- value = if (@value.map{ |v| v.value } & right.value.map{ |v| v.value }).size > 0 then true else false end
48
- Boolean.new value
49
- when Boolean
50
- value = if @value.size > 0
51
- if right.value then true else false end
52
- else
53
- if right.value then false else true end
54
- end
55
- Boolean.new value
56
- when Number
57
- value = @value.any?{ |v| Float(v.value) == right.value rescue false }
58
- Boolean.new value
59
- when String
60
- value = @value.any?{ |v| v.value == right.value }
61
- Boolean.new value
62
- end
63
- end
64
-
65
- def != right
66
- value = ! (self == right).value
67
- Boolean.new value
68
- end
69
- end
70
-
71
- class Boolean
72
- attr_reader :value
73
- def initialize value
74
- raise "#{self.class} argument must be true or false but #{value.class}" unless [true, false].include?( value )
75
- @value = value
76
- end
77
-
78
- def to_boolean
79
- self
80
- end
81
-
82
- def and right
83
- value = (@value and right.to_boolean.value)
84
- Boolean.new value
85
- end
86
-
87
- def or right
88
- value = (@value or right.to_boolean.value)
89
- Boolean.new value
90
- end
91
- end
92
-
93
- class Number
94
- attr_reader :value
95
- def initialize value
96
- @value = Float(value)
97
- end
98
-
99
- def to_boolean
100
- value = if @value == Float(0) then false else true end
101
- Boolean.new value
102
- end
103
-
104
- def -@
105
- value = (- @value)
106
- Number.new value
107
- end
108
-
109
- def + right
110
- case right
111
- when Number
112
- value = (@value + right.value)
113
- Number.new value
114
- else
115
- raise
116
- end
117
- end
118
-
119
- def - right
120
- case right
121
- when Number
122
- value = (@value - right.value)
123
- Number.new value
124
- else
125
- raise
126
- end
127
- end
128
-
129
- def * right
130
- case right
131
- when Number
132
- value = (@value * right.value)
133
- Number.new value
134
- else
135
- raise
136
- end
137
- end
138
-
139
- def / right
140
- case right
141
- when Number
142
- value = (@value / right.value)
143
- Number.new value
144
- else
145
- raise
146
- end
147
- end
148
-
149
- def == right
150
- case right
151
- when Number
152
- value = (@value == right.value)
153
- Boolean.new value
154
- else
155
- raise
156
- end
157
- end
158
-
159
- def != right
160
- case right
161
- when Number
162
- value = (@value != right.value)
163
- Boolean.new value
164
- else
165
- raise
166
- end
167
- end
168
- end
169
-
170
- class String
171
- attr_reader :value
172
- def initialize value
173
- @value = value
174
- end
175
-
176
- def to_boolean
177
- value = if @value == '' then false else true end
178
- Boolean.new value
179
- end
180
-
181
- def == right
182
- case right
183
- when String
184
- value = (@value == right.value)
185
- Boolean.new value
186
- else
187
- raise
188
- end
189
- end
190
-
191
- def != right
192
- case right
193
- when String
194
- value = (@value != right.value)
195
- Boolean.new value
196
- else
197
- raise
198
- end
199
- end
200
- end
201
- end
202
-
203
- class Expr
204
- attr_reader :op
205
- def initialize op
206
- @op = op
207
- end
208
- end
209
-
210
- class LocationPath
211
- attr_reader :location_step_sequence
212
- def initialize *location_step_sequence
213
- @location_step_sequence = location_step_sequence
214
- end
215
- def add *location_step_sequence
216
- @location_step_sequence.push *location_step_sequence
217
- self
218
- end
219
- end
220
-
221
- class LocationStep
222
- attr_reader :axis, :node_test, :predicates
223
-
224
- def initialize axis, node_test, predicates
225
- @axis = axis
226
- @node_test = node_test
227
- @predicates = predicates
228
- end
229
- end
230
-
231
- class Axis
232
- ANCESTOR ||= 'ancestor'
233
- ANCESTOR_OR_SELF ||= 'ancestor-or-self'
234
- ATTRIBUTE ||= 'attribute'
235
- CHILD ||= 'child'
236
- DESCENDANT ||= 'descendant'
237
- DESCENDANT_OR_SELF ||= 'descendant-or-self'
238
- FOLLOWING ||= 'following'
239
- FOLLOWING_SIBLING ||= 'following-sibling'
240
- NAMESPACE ||= 'namespace'
241
- PARENT ||= 'parent'
242
- PRECEDING ||= 'preceding'
243
- PRECEDING_SIBLING ||= 'preceding-sibling'
244
- SELF ||= 'self'
245
-
246
- attr_reader :name
247
-
248
- def initialize name
249
- @name = name
250
- end
251
- end
252
-
253
- class NodeTest
254
- module NodeTestType
255
- NAME_TEST ||= 'name-test'
256
- NODE_TYPE ||= 'node-type'
257
- PROCESSING_INSTRUCTION ||= 'processing-instruction'
258
- end
259
-
260
- class NameTest
261
- attr_reader :name
262
-
263
- def initialize name
264
- @name = name
265
- end
266
- end
267
-
268
- module NodeType
269
- COMMENT ||= 'comment'
270
- TEXT ||= 'text'
271
- NODE ||= 'node'
272
- end
273
-
274
- class ProcessingInstruction
275
- attr_reader :literal
276
-
277
- def initialize literal
278
- @literal = literal
279
- end
280
- end
281
-
282
- attr_reader :node_test_type, :node_test
283
-
284
- def initialize node_test_type, node_test
285
- @node_test_type = node_test_type
286
- @node_test = node_test
287
- end
288
- end
289
-
290
- class Predicates < Array
291
- def initialize *predicates
292
- self.push *predicates
293
- end
294
- end
295
-
296
- class Predicate
297
- attr_reader :expr
298
- def initialize expr
299
- @expr = expr
300
- end
301
- end
302
-
303
- class OrExpr
304
- attr_reader :op1, :op2
305
- def initialize op1, op2=nil
306
- @op1 = op1
307
- @op2 = op2
308
- end
309
- end
310
-
311
- class AndExpr
312
- attr_reader :op1, :op2
313
- def initialize op1, op2=nil
314
- @op1 = op1
315
- @op2 = op2
316
- end
317
- end
318
-
319
- class EqualityExpr
320
- attr_reader :op1, :operator, :op2
321
- def initialize op1, operator=nil, op2=nil
322
- @op1 = op1
323
- @operator = operator
324
- @op2 = op2
325
- end
326
- end
327
-
328
- class RelationalExpr
329
- attr_reader :op1, :operator, :op2
330
- def initialize op1, operator=nil, op2=nil
331
- @op1 = op1
332
- @operator = operator
333
- @op2 = op2
334
- end
335
- end
336
-
337
- class AdditiveExpr
338
- attr_reader :op1, :operator, :op2
339
- def initialize op1, operator=nil, op2=nil
340
- @op1 = op1
341
- @operator = operator
342
- @op2 = op2
343
- end
344
- end
345
-
346
- class MultiplicativeExpr
347
- attr_reader :op1, :operator, :op2
348
- def initialize op1, operator=nil, op2=nil
349
- @op1 = op1
350
- @operator = operator
351
- @op2 = op2
352
- end
353
- end
354
-
355
- class UnaryExpr
356
- attr_reader :op1, :operator
357
- def initialize op1, operator=nil
358
- @op1 = op1
359
- @operator = operator
360
- end
361
- end
362
-
363
- class UnionExpr
364
- attr_reader :op1, :operator, :op2
365
- def initialize op1, operator=nil, op2=nil
366
- @op1 = op1
367
- @operator = operator
368
- @op2 = op2
369
- end
370
- end
371
-
372
- class PathExpr
373
- attr_reader :op1, :operator, :op2
374
- def initialize op1, operator=nil, op2=nil
375
- @op1 = op1
376
- @operator = operator
377
- @op2 = op2
378
- end
379
- end
380
-
381
- class FilterExpr
382
- attr_reader :op1, :op2
383
- def initialize op1, op2=nil
384
- @op1 = op1
385
- @op2 = op2
386
- end
387
- end
388
-
389
- class PrimaryExpr
390
- attr_reader :op1
391
- def initialize op1
392
- @op1 = op1
393
- end
394
- end
395
-
396
- class VariableReference
397
- attr_reader :name
398
- def initialize name
399
- @name = name
400
- end
401
- end
402
-
403
- class Literal
404
- attr_reader :value
405
- def initialize value
406
- @value = case value
407
- when /^"(?:[^"])*"/
408
- value.gsub(/^"/,'').gsub(/"$/,'').gsub(/\\n/,"\n").gsub(/\\t/,"\t").gsub(/\\"/,"\"").gsub(/\\\\/,"\\")
409
- when /^'(?:[^'])*'/
410
- value.gsub(/^'/,'').gsub(/'$/,'')
411
- else
412
- value
413
- end
414
- end
415
- end
416
-
417
- class Number
418
- attr_reader :value
419
- def initialize value
420
- @value = value.to_f.to_s
421
- end
422
- end
423
-
424
- class FunctionCall
425
- CURRENT ||= :current
426
- LAST ||= :last
427
- POSITION ||= 'position'
428
- COUNT ||= 'count'
429
- ID ||= 'id'
430
- LOCAL_NAME ||= 'local-name'
431
- NAMESPACE_URI ||= 'namespace-uri'
432
- NAME ||= 'name'
433
- STRING ||= 'string'
434
- CONCAT ||= 'concat'
435
- STARTS_WITH ||= 'starts-with'
436
- CONTAINS ||= 'contains'
437
- SUBSTRING_BEFORE ||= 'substring-before'
438
- SUBSTRING_AFTER ||= 'substring-after'
439
- SUBSTRING ||= 'substring'
440
- STRING_LENGTH ||= 'string-length'
441
- NORMALIZE_SPACE ||= 'normalize-space'
442
- TRANSLATE ||= 'translate'
443
- BOOLEAN ||= 'boolean'
444
- NOT ||= 'not'
445
- TRUE ||= 'true'
446
- FALSE ||= 'false'
447
- LANG ||= 'lang'
448
- NUMBER ||= 'number'
449
- SUM ||= 'sum'
450
- FLOOR ||= 'floor'
451
- CEILING ||= 'ceiling'
452
- ROUND ||= 'round'
453
-
454
- attr_reader :name, :args
455
- def initialize name, args=[]
456
- @name = name
457
- @args = args
458
- end
459
- end
460
- end
9
+ module Xpath
10
+ module BasicType
11
+ class NodeSet
12
+ include Enumerable
13
+
14
+ attr_reader :value
15
+ def initialize value=[]
16
+ raise "#{self.class} argument must be Array but #{value.class}" unless Array === value
17
+ value.each{ |v|
18
+ unless Rubyang::Database::DataTree::Node === v
19
+ raise "#{self.class} argument must be Rubyang::Database::DataTree::Node but #{v.class}"
20
+ end
21
+ }
22
+ @value = value
23
+ end
24
+
25
+ def each
26
+ @value.each do |v|
27
+ yield v
28
+ end
29
+ end
30
+
31
+ def to_boolean
32
+ value = if @value == [] then false else true end
33
+ Boolean.new value
34
+ end
35
+
36
+ def == right
37
+ @value.each{ |v|
38
+ unless Rubyang::Database::DataTree::Leaf === v
39
+ raise "#{self.class} argument must be Rubyang::Database::DataTree::Leaf but #{v.class}"
40
+ end
41
+ }
42
+ case right
43
+ when NodeSet
44
+ right.value.each{ |v|
45
+ unless Rubyang::Database::DataTree::Leaf === v
46
+ raise "#{right.class} argument must be Rubyang::Database::DataTree::Leaf but #{v.class}"
47
+ end
48
+ }
49
+ value = if (@value.map{ |v| v.value } & right.value.map{ |v| v.value }).size > 0 then true else false end
50
+ Boolean.new value
51
+ when Boolean
52
+ value = if @value.size > 0
53
+ if right.value then true else false end
54
+ else
55
+ if right.value then false else true end
56
+ end
57
+ Boolean.new value
58
+ when Number
59
+ value = @value.any?{ |v| Float(v.value) == right.value rescue false }
60
+ Boolean.new value
61
+ when String
62
+ value = @value.any?{ |v| v.value == right.value }
63
+ Boolean.new value
64
+ end
65
+ end
66
+
67
+ def != right
68
+ value = ! (self == right).value
69
+ Boolean.new value
70
+ end
71
+ end
72
+
73
+ class Boolean
74
+ attr_reader :value
75
+ def initialize value
76
+ raise "#{self.class} argument must be true or false but #{value.class}" unless [true, false].include?( value )
77
+ @value = value
78
+ end
79
+
80
+ def to_boolean
81
+ self
82
+ end
83
+
84
+ def and right
85
+ value = (@value and right.to_boolean.value)
86
+ Boolean.new value
87
+ end
88
+
89
+ def or right
90
+ value = (@value or right.to_boolean.value)
91
+ Boolean.new value
92
+ end
93
+ end
94
+
95
+ class Number
96
+ attr_reader :value
97
+ def initialize value
98
+ @value = Float(value)
99
+ end
100
+
101
+ def to_boolean
102
+ value = if @value == Float(0) then false else true end
103
+ Boolean.new value
104
+ end
105
+
106
+ def -@
107
+ value = (- @value)
108
+ Number.new value
109
+ end
110
+
111
+ def + right
112
+ case right
113
+ when Number
114
+ value = (@value + right.value)
115
+ Number.new value
116
+ else
117
+ raise
118
+ end
119
+ end
120
+
121
+ def - right
122
+ case right
123
+ when Number
124
+ value = (@value - right.value)
125
+ Number.new value
126
+ else
127
+ raise
128
+ end
129
+ end
130
+
131
+ def * right
132
+ case right
133
+ when Number
134
+ value = (@value * right.value)
135
+ Number.new value
136
+ else
137
+ raise
138
+ end
139
+ end
140
+
141
+ def / right
142
+ case right
143
+ when Number
144
+ value = (@value / right.value)
145
+ Number.new value
146
+ else
147
+ raise
148
+ end
149
+ end
150
+
151
+ def == right
152
+ case right
153
+ when Number
154
+ value = (@value == right.value)
155
+ Boolean.new value
156
+ else
157
+ raise
158
+ end
159
+ end
160
+
161
+ def != right
162
+ case right
163
+ when Number
164
+ value = (@value != right.value)
165
+ Boolean.new value
166
+ else
167
+ raise
168
+ end
169
+ end
170
+ end
171
+
172
+ class String
173
+ attr_reader :value
174
+ def initialize value
175
+ @value = value
176
+ end
177
+
178
+ def to_boolean
179
+ value = if @value == '' then false else true end
180
+ Boolean.new value
181
+ end
182
+
183
+ def == right
184
+ case right
185
+ when String
186
+ value = (@value == right.value)
187
+ Boolean.new value
188
+ else
189
+ raise
190
+ end
191
+ end
192
+
193
+ def != right
194
+ case right
195
+ when String
196
+ value = (@value != right.value)
197
+ Boolean.new value
198
+ else
199
+ raise
200
+ end
201
+ end
202
+ end
203
+ end
204
+
205
+ class Expr
206
+ attr_reader :op
207
+ def initialize op
208
+ @op = op
209
+ end
210
+ end
211
+
212
+ class LocationPath
213
+ attr_reader :location_step_sequence
214
+ def initialize *location_step_sequence
215
+ @location_step_sequence = location_step_sequence
216
+ end
217
+ def add *location_step_sequence
218
+ @location_step_sequence.push *location_step_sequence
219
+ self
220
+ end
221
+ end
222
+
223
+ class LocationStep
224
+ attr_reader :axis, :node_test, :predicates
225
+
226
+ def initialize axis, node_test, predicates
227
+ @axis = axis
228
+ @node_test = node_test
229
+ @predicates = predicates
230
+ end
231
+ end
232
+
233
+ class Axis
234
+ ANCESTOR ||= 'ancestor'
235
+ ANCESTOR_OR_SELF ||= 'ancestor-or-self'
236
+ ATTRIBUTE ||= 'attribute'
237
+ CHILD ||= 'child'
238
+ DESCENDANT ||= 'descendant'
239
+ DESCENDANT_OR_SELF ||= 'descendant-or-self'
240
+ FOLLOWING ||= 'following'
241
+ FOLLOWING_SIBLING ||= 'following-sibling'
242
+ NAMESPACE ||= 'namespace'
243
+ PARENT ||= 'parent'
244
+ PRECEDING ||= 'preceding'
245
+ PRECEDING_SIBLING ||= 'preceding-sibling'
246
+ SELF ||= 'self'
247
+
248
+ attr_reader :name
249
+
250
+ def initialize name
251
+ @name = name
252
+ end
253
+ end
254
+
255
+ class NodeTest
256
+ module NodeTestType
257
+ NAME_TEST ||= 'name-test'
258
+ NODE_TYPE ||= 'node-type'
259
+ PROCESSING_INSTRUCTION ||= 'processing-instruction'
260
+ end
261
+
262
+ class NameTest
263
+ attr_reader :name
264
+
265
+ def initialize name
266
+ @name = name
267
+ end
268
+ end
269
+
270
+ module NodeType
271
+ COMMENT ||= 'comment'
272
+ TEXT ||= 'text'
273
+ NODE ||= 'node'
274
+ end
275
+
276
+ class ProcessingInstruction
277
+ attr_reader :literal
278
+
279
+ def initialize literal
280
+ @literal = literal
281
+ end
282
+ end
283
+
284
+ attr_reader :node_test_type, :node_test
285
+
286
+ def initialize node_test_type, node_test
287
+ @node_test_type = node_test_type
288
+ @node_test = node_test
289
+ end
290
+ end
291
+
292
+ class Predicates < Array
293
+ def initialize *predicates
294
+ self.push *predicates
295
+ end
296
+ end
297
+
298
+ class Predicate
299
+ attr_reader :expr
300
+ def initialize expr
301
+ @expr = expr
302
+ end
303
+ end
304
+
305
+ class OrExpr
306
+ attr_reader :op1, :op2
307
+ def initialize op1, op2=nil
308
+ @op1 = op1
309
+ @op2 = op2
310
+ end
311
+ end
312
+
313
+ class AndExpr
314
+ attr_reader :op1, :op2
315
+ def initialize op1, op2=nil
316
+ @op1 = op1
317
+ @op2 = op2
318
+ end
319
+ end
320
+
321
+ class EqualityExpr
322
+ attr_reader :op1, :operator, :op2
323
+ def initialize op1, operator=nil, op2=nil
324
+ @op1 = op1
325
+ @operator = operator
326
+ @op2 = op2
327
+ end
328
+ end
329
+
330
+ class RelationalExpr
331
+ attr_reader :op1, :operator, :op2
332
+ def initialize op1, operator=nil, op2=nil
333
+ @op1 = op1
334
+ @operator = operator
335
+ @op2 = op2
336
+ end
337
+ end
338
+
339
+ class AdditiveExpr
340
+ attr_reader :op1, :operator, :op2
341
+ def initialize op1, operator=nil, op2=nil
342
+ @op1 = op1
343
+ @operator = operator
344
+ @op2 = op2
345
+ end
346
+ end
347
+
348
+ class MultiplicativeExpr
349
+ attr_reader :op1, :operator, :op2
350
+ def initialize op1, operator=nil, op2=nil
351
+ @op1 = op1
352
+ @operator = operator
353
+ @op2 = op2
354
+ end
355
+ end
356
+
357
+ class UnaryExpr
358
+ attr_reader :op1, :operator
359
+ def initialize op1, operator=nil
360
+ @op1 = op1
361
+ @operator = operator
362
+ end
363
+ end
364
+
365
+ class UnionExpr
366
+ attr_reader :op1, :operator, :op2
367
+ def initialize op1, operator=nil, op2=nil
368
+ @op1 = op1
369
+ @operator = operator
370
+ @op2 = op2
371
+ end
372
+ end
373
+
374
+ class PathExpr
375
+ attr_reader :op1, :operator, :op2
376
+ def initialize op1, operator=nil, op2=nil
377
+ @op1 = op1
378
+ @operator = operator
379
+ @op2 = op2
380
+ end
381
+ end
382
+
383
+ class FilterExpr
384
+ attr_reader :op1, :op2
385
+ def initialize op1, op2=nil
386
+ @op1 = op1
387
+ @op2 = op2
388
+ end
389
+ end
390
+
391
+ class PrimaryExpr
392
+ attr_reader :op1
393
+ def initialize op1
394
+ @op1 = op1
395
+ end
396
+ end
397
+
398
+ class VariableReference
399
+ attr_reader :name
400
+ def initialize name
401
+ @name = name
402
+ end
403
+ end
404
+
405
+ class Literal
406
+ attr_reader :value
407
+ def initialize value
408
+ @value = case value
409
+ when /^"(?:[^"])*"/
410
+ value.gsub(/^"/,'').gsub(/"$/,'').gsub(/\\n/,"\n").gsub(/\\t/,"\t").gsub(/\\"/,"\"").gsub(/\\\\/,"\\")
411
+ when /^'(?:[^'])*'/
412
+ value.gsub(/^'/,'').gsub(/'$/,'')
413
+ else
414
+ value
415
+ end
416
+ end
417
+ end
418
+
419
+ class Number
420
+ attr_reader :value
421
+ def initialize value
422
+ @value = value.to_f.to_s
423
+ end
424
+ end
425
+
426
+ class FunctionCall
427
+ CURRENT = :current
428
+ LAST = :last
429
+ POSITION = 'position'
430
+ COUNT = 'count'
431
+ ID = 'id'
432
+ LOCAL_NAME = 'local-name'
433
+ NAMESPACE_URI = 'namespace-uri'
434
+ NAME = 'name'
435
+ STRING = 'string'
436
+ CONCAT = 'concat'
437
+ STARTS_WITH = 'starts-with'
438
+ CONTAINS = 'contains'
439
+ SUBSTRING_BEFORE = 'substring-before'
440
+ SUBSTRING_AFTER = 'substring-after'
441
+ SUBSTRING = 'substring'
442
+ STRING_LENGTH = 'string-length'
443
+ NORMALIZE_SPACE = 'normalize-space'
444
+ TRANSLATE = 'translate'
445
+ BOOLEAN = 'boolean'
446
+ NOT = 'not'
447
+ TRUE = 'true'
448
+ FALSE = 'false'
449
+ LANG = 'lang'
450
+ NUMBER = 'number'
451
+ SUM = 'sum'
452
+ FLOOR = 'floor'
453
+ CEILING = 'ceiling'
454
+ ROUND = 'round'
455
+
456
+ attr_reader :name, :args
457
+ def initialize name, args=[]
458
+ @name = name
459
+ @args = args
460
+ end
461
+ end
462
+ end
461
463
  end