rubyang 0.1.2.1 → 0.1.3
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 +5 -5
- data/.gitignore +3 -0
- data/.rspec +1 -0
- data/.travis.yml +6 -3
- data/lib/rubyang.rb +5 -6
- data/lib/rubyang/cli.rb +114 -114
- data/lib/rubyang/cli/parser.rb +56 -56
- data/lib/rubyang/compat.rb +14 -0
- data/lib/rubyang/component/base.rb +21 -21
- data/lib/rubyang/component/example.rb +8 -7
- data/lib/rubyang/database.rb +45 -34
- data/lib/rubyang/database/component_manager.rb +64 -64
- data/lib/rubyang/database/data_tree.rb +1110 -1077
- data/lib/rubyang/database/helper.rb +31 -30
- data/lib/rubyang/database/logger.rb +58 -0
- data/lib/rubyang/database/schema_tree.rb +1198 -1298
- data/lib/rubyang/model.rb +1139 -923
- data/lib/rubyang/model/logger.rb +58 -0
- data/lib/rubyang/model/parser.rb +197 -195
- data/lib/rubyang/model/parser/parser.tab.rb +1373 -1263
- data/lib/rubyang/model/parser/parser.y +393 -215
- data/lib/rubyang/restapi.rb +4 -3
- data/lib/rubyang/restapi/app.rb +52 -53
- data/lib/rubyang/server.rb +4 -3
- data/lib/rubyang/server/base.rb +20 -20
- data/lib/rubyang/server/example.rb +2 -1
- data/lib/rubyang/version.rb +4 -1
- data/lib/rubyang/webui.rb +4 -3
- data/lib/rubyang/webui/app.rb +62 -63
- data/lib/rubyang/webui/make_json_schema.rb +49 -48
- data/lib/rubyang/xpath.rb +458 -456
- data/lib/rubyang/xpath/logger.rb +58 -0
- data/lib/rubyang/xpath/parser.rb +134 -144
- data/lib/rubyang/xpath/parser/parser.tab.rb +373 -616
- data/lib/rubyang/xpath/parser/parser.y +249 -492
- data/rubyang.gemspec +11 -15
- metadata +49 -32
- data/lib/rubyang/logger.rb +0 -19
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
|
-
|
4
|
-
|
4
|
+
require 'rubyang/xpath/logger'
|
5
|
+
require 'rubyang/xpath/parser'
|
6
|
+
require 'rubyang/database/data_tree'
|
5
7
|
|
6
8
|
module Rubyang
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
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
|