Merge lp:~zorba-coders/zorba/markos-scratch into lp:zorba
- markos-scratch
- Merge into trunk
Proposed by
Markos Zaharioudakis
Status: | Merged |
---|---|
Approved by: | Markos Zaharioudakis |
Approved revision: | 11136 |
Merged at revision: | 11497 |
Proposed branch: | lp:~zorba-coders/zorba/markos-scratch |
Merge into: | lp:zorba |
Diff against target: |
1044 lines (+576/-64) 22 files modified
ChangeLog (+8/-2) modules/org/jsoniq/www/functions.xq (+2/-2) src/compiler/translator/translator.cpp (+16/-2) src/functions/func_jsoniq_functions_impl.cpp (+33/-3) src/functions/pregenerated/func_jsoniq_functions.cpp (+32/-6) src/functions/pregenerated/func_jsoniq_functions.h (+42/-0) src/functions/pregenerated/function_enum.h (+2/-0) src/runtime/json/jsoniq_functions_impl.cpp (+148/-41) src/runtime/json/pregenerated/jsoniq_functions.cpp (+72/-0) src/runtime/json/pregenerated/jsoniq_functions.h (+90/-0) src/runtime/pregenerated/iterator_enum.h (+2/-0) src/runtime/spec/json/jsoniq_functions.xml (+72/-4) src/runtime/visitors/pregenerated/planiter_visitor.h (+10/-0) src/runtime/visitors/pregenerated/printer_visitor.cpp (+28/-0) src/runtime/visitors/pregenerated/printer_visitor.h (+6/-0) test/rbkt/ExpQueryResults/zorba/jsoniq/keys_02.xml.res (+1/-1) test/rbkt/ExpQueryResults/zorba/jsoniq/members_02.xml.res (+1/-1) test/rbkt/ExpQueryResults/zorba/jsoniq/members_04.xml.res (+1/-0) test/rbkt/Queries/zorba/jsoniq/keys_01.xq (+1/-1) test/rbkt/Queries/zorba/jsoniq/keys_02.xq (+4/-1) test/rbkt/Queries/zorba/jsoniq/members_02.xq (+3/-0) test/rbkt/Queries/zorba/jsoniq/members_04.xq (+2/-0) |
To merge this branch: | bzr merge lp:~zorba-coders/zorba/markos-scratch |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Markos Zaharioudakis | Approve | ||
Review via email: mp+168232@code.launchpad.net |
Commit message
allow item()* as the input of jn:keys and jn:members functions
Description of the change
allow item()* as the input of jn:keys and jn:members functions
To post a comment you must log in.
- 11136. By Markos Zaharioudakis
-
allow item()* as the input of jn:keys and jn:members functions
Revision history for this message
Markos Zaharioudakis (markos-za) : | # |
review:
Approve
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote : | # |
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote : | # |
Validation queue job markos-
All tests succeeded!
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'ChangeLog' |
2 | --- ChangeLog 2013-06-06 18:33:17 +0000 |
3 | +++ ChangeLog 2013-06-08 06:43:29 +0000 |
4 | @@ -4,7 +4,7 @@ |
5 | version 3.0 |
6 | |
7 | New Features: |
8 | - |
9 | + |
10 | Optimizations: |
11 | * Implemented hoisting optimization for general FLWOR. |
12 | * Implemented flwor-merge optimization for general FLWOR. |
13 | @@ -25,7 +25,13 @@ |
14 | * Fixed bug #1188100 (regex issues with 'q' flag in fn:tokenize) |
15 | * Fixed invalid memory access error occuring during sequence type matching |
16 | for user-defined types. |
17 | - |
18 | + * jn:members function takes item()* as aparameter (instead of item()) |
19 | + * jn:keys function takes item()* as aparameter (instead of item()) |
20 | + * Object/array navigation allows item()* as the type of the input sequence |
21 | + (doing implicit iteration over the input sequence and skipping items |
22 | + that are not objects/arrays). |
23 | + * Bug fix: selector value in object/array navigation is always cast to |
24 | + string/integer |
25 | |
26 | version 2.9 |
27 | |
28 | |
29 | === modified file 'modules/org/jsoniq/www/functions.xq' |
30 | --- modules/org/jsoniq/www/functions.xq 2013-06-05 00:37:35 +0000 |
31 | +++ modules/org/jsoniq/www/functions.xq 2013-06-08 06:43:29 +0000 |
32 | @@ -193,7 +193,7 @@ |
33 | : @param $o A JSON Object. |
34 | : @return The names of pairs in the object. |
35 | :) |
36 | -declare function jn:keys($o as item()) as xs:string* external; |
37 | +declare function jn:keys($o as item()*) as xs:string* external; |
38 | |
39 | |
40 | (:~ |
41 | @@ -248,7 +248,7 @@ |
42 | : @param $a A JSON Array. |
43 | : @return The members of the specified array. |
44 | :) |
45 | -declare function jn:members($o as item()) as item()* external; |
46 | +declare function jn:members($o as item()*) as item()* external; |
47 | |
48 | |
49 | (:~ |
50 | |
51 | === modified file 'src/compiler/translator/translator.cpp' |
52 | --- src/compiler/translator/translator.cpp 2013-06-05 07:26:13 +0000 |
53 | +++ src/compiler/translator/translator.cpp 2013-06-08 06:43:29 +0000 |
54 | @@ -12093,6 +12093,20 @@ |
55 | |
56 | break; |
57 | } |
58 | + case FunctionConsts::FN_JSONIQ_KEYS_1: |
59 | + { |
60 | + if (arguments[0]->get_return_type()->max_card() <= 1) |
61 | + f = BUILTIN_FUNC(OP_ZORBA_KEYS_1); |
62 | + |
63 | + break; |
64 | + } |
65 | + case FunctionConsts::FN_JSONIQ_MEMBERS_1: |
66 | + { |
67 | + if (arguments[0]->get_return_type()->max_card() <= 1) |
68 | + f = BUILTIN_FUNC(OP_ZORBA_MEMBERS_1); |
69 | + |
70 | + break; |
71 | + } |
72 | case FunctionConsts::FN_CONCAT_N: |
73 | { |
74 | if (numArgs < 2) |
75 | @@ -12380,11 +12394,11 @@ |
76 | { |
77 | if (TypeOps::is_subtype(tm, *srcType, *theRTM.JSON_ARRAY_TYPE_STAR)) |
78 | { |
79 | - func = BUILTIN_FUNC(FN_JSONIQ_MEMBERS_1); |
80 | + func = BUILTIN_FUNC(OP_ZORBA_MEMBERS_1); |
81 | } |
82 | else if (TypeOps::is_subtype(tm, *srcType, *theRTM.JSON_OBJECT_TYPE_STAR)) |
83 | { |
84 | - func = BUILTIN_FUNC(FN_JSONIQ_KEYS_1); |
85 | + func = BUILTIN_FUNC(OP_ZORBA_KEYS_1); |
86 | } |
87 | else |
88 | { |
89 | |
90 | === modified file 'src/functions/func_jsoniq_functions_impl.cpp' |
91 | --- src/functions/func_jsoniq_functions_impl.cpp 2013-02-07 17:24:36 +0000 |
92 | +++ src/functions/func_jsoniq_functions_impl.cpp 2013-06-08 06:43:29 +0000 |
93 | @@ -31,7 +31,39 @@ |
94 | namespace zorba |
95 | { |
96 | |
97 | -#ifdef ZORBA_WITH_JSON |
98 | + |
99 | +/******************************************************************************* |
100 | + |
101 | +********************************************************************************/ |
102 | +PlanIter_t fn_jsoniq_keys::codegen( |
103 | + CompilerCB*, |
104 | + static_context* sctx, |
105 | + const QueryLoc& loc, |
106 | + std::vector<PlanIter_t>& argv, |
107 | + expr& arg) const |
108 | +{ |
109 | + if (arg.get_return_type()->max_card() <= 1) |
110 | + return new SingleObjectNamesIterator(sctx, loc, argv[0]); |
111 | + |
112 | + return new JSONObjectNamesIterator(sctx, loc, argv[0]); |
113 | +} |
114 | + |
115 | + |
116 | +/******************************************************************************* |
117 | + |
118 | +********************************************************************************/ |
119 | +PlanIter_t fn_jsoniq_members::codegen( |
120 | + CompilerCB*, |
121 | + static_context* sctx, |
122 | + const QueryLoc& loc, |
123 | + std::vector<PlanIter_t>& argv, |
124 | + expr& arg) const |
125 | +{ |
126 | + if (arg.get_return_type()->max_card() <= 1) |
127 | + return new SingleArrayMembersIterator(sctx, loc, argv[0]); |
128 | + |
129 | + return new JSONArrayMembersIterator(sctx, loc, argv[0]); |
130 | +} |
131 | |
132 | |
133 | /******************************************************************************* |
134 | @@ -174,8 +206,6 @@ |
135 | } |
136 | |
137 | |
138 | -#endif // ZORBA_WITH_JSON |
139 | - |
140 | } /* namespace zorba */ |
141 | |
142 | /* vim:set et sw=2 ts=2: */ |
143 | |
144 | === modified file 'src/functions/pregenerated/func_jsoniq_functions.cpp' |
145 | --- src/functions/pregenerated/func_jsoniq_functions.cpp 2013-06-05 00:37:35 +0000 |
146 | +++ src/functions/pregenerated/func_jsoniq_functions.cpp 2013-06-08 06:43:29 +0000 |
147 | @@ -72,14 +72,15 @@ |
148 | return new JSONItemAccessorIterator(sctx, loc, argv); |
149 | } |
150 | |
151 | -PlanIter_t fn_jsoniq_keys::codegen( |
152 | + |
153 | +PlanIter_t op_zorba_keys::codegen( |
154 | CompilerCB*, |
155 | static_context* sctx, |
156 | const QueryLoc& loc, |
157 | std::vector<PlanIter_t>& argv, |
158 | expr& ann) const |
159 | { |
160 | - return new JSONObjectNamesIterator(sctx, loc, argv[0]); |
161 | + return new SingleObjectNamesIterator(sctx, loc, argv[0]); |
162 | } |
163 | |
164 | PlanIter_t fn_jsoniq_value::codegen( |
165 | @@ -112,14 +113,15 @@ |
166 | return new JSONArrayMemberIterator(sctx, loc, argv[0], argv[1]); |
167 | } |
168 | |
169 | -PlanIter_t fn_jsoniq_members::codegen( |
170 | + |
171 | +PlanIter_t op_zorba_members::codegen( |
172 | CompilerCB*, |
173 | static_context* sctx, |
174 | const QueryLoc& loc, |
175 | std::vector<PlanIter_t>& argv, |
176 | expr& ann) const |
177 | { |
178 | - return new JSONArrayMembersIterator(sctx, loc, argv[0]); |
179 | + return new SingleArrayMembersIterator(sctx, loc, argv[0]); |
180 | } |
181 | |
182 | PlanIter_t fn_jsoniq_size::codegen( |
183 | @@ -342,7 +344,7 @@ |
184 | { |
185 | DECL_WITH_KIND(sctx, fn_jsoniq_keys, |
186 | (createQName("http://jsoniq.org/functions","","keys"), |
187 | - GENV_TYPESYSTEM.ITEM_TYPE_ONE, |
188 | + GENV_TYPESYSTEM.ITEM_TYPE_STAR, |
189 | GENV_TYPESYSTEM.STRING_TYPE_STAR), |
190 | FunctionConsts::FN_JSONIQ_KEYS_1); |
191 | |
192 | @@ -352,6 +354,18 @@ |
193 | |
194 | |
195 | { |
196 | + DECL_WITH_KIND(sctx, op_zorba_keys, |
197 | + (createQName("http://www.zorba-xquery.com/internal/zorba-ops","","keys"), |
198 | + GENV_TYPESYSTEM.ITEM_TYPE_QUESTION, |
199 | + GENV_TYPESYSTEM.STRING_TYPE_STAR), |
200 | + FunctionConsts::OP_ZORBA_KEYS_1); |
201 | + |
202 | + } |
203 | + |
204 | + |
205 | + |
206 | + |
207 | + { |
208 | DECL_WITH_KIND(sctx, fn_jsoniq_value, |
209 | (createQName("http://jsoniq.org/functions","","value"), |
210 | GENV_TYPESYSTEM.ITEM_TYPE_ONE, |
211 | @@ -393,7 +407,7 @@ |
212 | { |
213 | DECL_WITH_KIND(sctx, fn_jsoniq_members, |
214 | (createQName("http://jsoniq.org/functions","","members"), |
215 | - GENV_TYPESYSTEM.ITEM_TYPE_ONE, |
216 | + GENV_TYPESYSTEM.ITEM_TYPE_STAR, |
217 | GENV_TYPESYSTEM.ITEM_TYPE_STAR), |
218 | FunctionConsts::FN_JSONIQ_MEMBERS_1); |
219 | |
220 | @@ -403,6 +417,18 @@ |
221 | |
222 | |
223 | { |
224 | + DECL_WITH_KIND(sctx, op_zorba_members, |
225 | + (createQName("http://www.zorba-xquery.com/internal/zorba-ops","","members"), |
226 | + GENV_TYPESYSTEM.ITEM_TYPE_QUESTION, |
227 | + GENV_TYPESYSTEM.ITEM_TYPE_STAR), |
228 | + FunctionConsts::OP_ZORBA_MEMBERS_1); |
229 | + |
230 | + } |
231 | + |
232 | + |
233 | + |
234 | + |
235 | + { |
236 | DECL_WITH_KIND(sctx, fn_jsoniq_size, |
237 | (createQName("http://jsoniq.org/functions","","size"), |
238 | GENV_TYPESYSTEM.JSON_ARRAY_TYPE_ONE, |
239 | |
240 | === modified file 'src/functions/pregenerated/func_jsoniq_functions.h' |
241 | --- src/functions/pregenerated/func_jsoniq_functions.h 2013-06-05 00:37:35 +0000 |
242 | +++ src/functions/pregenerated/func_jsoniq_functions.h 2013-06-08 06:43:29 +0000 |
243 | @@ -148,6 +148,27 @@ |
244 | |
245 | bool mustCopyInputNodes(expr* fo, csize producer) const { return false; } |
246 | |
247 | + bool isMap(csize producer) const { return producer == 0; } |
248 | + |
249 | + CODEGEN_DECL(); |
250 | +}; |
251 | + |
252 | + |
253 | +//op-zorba:keys |
254 | +class op_zorba_keys : public function |
255 | +{ |
256 | +public: |
257 | + op_zorba_keys(const signature& sig, FunctionConsts::FunctionKind kind) |
258 | + : |
259 | + function(sig, kind) |
260 | + { |
261 | + |
262 | + } |
263 | + |
264 | + bool propagatesInputNodes(expr* fo, csize producer) const { return false; } |
265 | + |
266 | + bool mustCopyInputNodes(expr* fo, csize producer) const { return false; } |
267 | + |
268 | CODEGEN_DECL(); |
269 | }; |
270 | |
271 | @@ -224,6 +245,27 @@ |
272 | |
273 | bool mustCopyInputNodes(expr* fo, csize producer) const { return false; } |
274 | |
275 | + bool isMap(csize producer) const { return producer == 0; } |
276 | + |
277 | + CODEGEN_DECL(); |
278 | +}; |
279 | + |
280 | + |
281 | +//op-zorba:members |
282 | +class op_zorba_members : public function |
283 | +{ |
284 | +public: |
285 | + op_zorba_members(const signature& sig, FunctionConsts::FunctionKind kind) |
286 | + : |
287 | + function(sig, kind) |
288 | + { |
289 | + |
290 | + } |
291 | + |
292 | + bool propagatesInputNodes(expr* fo, csize producer) const { return producer == 0; } |
293 | + |
294 | + bool mustCopyInputNodes(expr* fo, csize producer) const { return false; } |
295 | + |
296 | CODEGEN_DECL(); |
297 | }; |
298 | |
299 | |
300 | === modified file 'src/functions/pregenerated/function_enum.h' |
301 | --- src/functions/pregenerated/function_enum.h 2013-06-05 07:26:13 +0000 |
302 | +++ src/functions/pregenerated/function_enum.h 2013-06-08 06:43:29 +0000 |
303 | @@ -255,10 +255,12 @@ |
304 | OP_ZORBA_JSON_ITEM_ACCESSOR_1, |
305 | OP_ZORBA_JSON_ITEM_ACCESSOR_2, |
306 | FN_JSONIQ_KEYS_1, |
307 | + OP_ZORBA_KEYS_1, |
308 | FN_JSONIQ_VALUE_2, |
309 | FN_JSONIQ_PROJECT_2, |
310 | FN_JSONIQ_MEMBER_2, |
311 | FN_JSONIQ_MEMBERS_1, |
312 | + OP_ZORBA_MEMBERS_1, |
313 | FN_JSONIQ_SIZE_1, |
314 | FN_JSONIQ_FLATTEN_1, |
315 | FN_JSONIQ_NULL_0, |
316 | |
317 | === modified file 'src/runtime/json/jsoniq_functions_impl.cpp' |
318 | --- src/runtime/json/jsoniq_functions_impl.cpp 2013-06-05 00:37:35 +0000 |
319 | +++ src/runtime/json/jsoniq_functions_impl.cpp 2013-06-08 06:43:29 +0000 |
320 | @@ -1072,7 +1072,61 @@ |
321 | |
322 | |
323 | /******************************************************************************* |
324 | - json:names($o as item()) as xs:string* |
325 | + op-zorba:names($o as item()) as xs:string* |
326 | +********************************************************************************/ |
327 | +bool SingleObjectNamesIterator::nextImpl( |
328 | + store::Item_t& result, |
329 | + PlanState& planState) const |
330 | +{ |
331 | + store::Item_t input; |
332 | + |
333 | + SingleObjectNamesIteratorState* state; |
334 | + DEFAULT_STACK_INIT(SingleObjectNamesIteratorState, state, planState); |
335 | + |
336 | + if (consumeNext(input, theChild.getp(), planState)) |
337 | + { |
338 | + if (input->isObject()) |
339 | + { |
340 | + state->theNames = input->getObjectKeys(); |
341 | + state->theNames->open(); |
342 | + |
343 | + while (state->theNames->next(result)) |
344 | + { |
345 | + STACK_PUSH (true, state); |
346 | + } |
347 | + state->theNames = NULL; |
348 | + } |
349 | + } |
350 | + |
351 | + STACK_END(state); |
352 | +} |
353 | + |
354 | + |
355 | +bool SingleObjectNamesIterator::count( |
356 | + store::Item_t& result, |
357 | + PlanState& planState) const |
358 | +{ |
359 | + store::Item_t obj; |
360 | + xs_integer count(0); |
361 | + |
362 | + SingleObjectNamesIteratorState* state; |
363 | + DEFAULT_STACK_INIT(SingleObjectNamesIteratorState, state, planState); |
364 | + |
365 | + if (consumeNext(obj, theChild.getp(), planState)) |
366 | + { |
367 | + if (obj->isObject()) |
368 | + { |
369 | + count = obj->getNumObjectPairs(); |
370 | + } |
371 | + } |
372 | + |
373 | + STACK_PUSH(GENV_ITEMFACTORY->createInteger(result, count), state); |
374 | + STACK_END(state); |
375 | +} |
376 | + |
377 | + |
378 | +/******************************************************************************* |
379 | + jn:names($o as item()*) as xs:string* |
380 | ********************************************************************************/ |
381 | bool JSONObjectNamesIterator::nextImpl( |
382 | store::Item_t& result, |
383 | @@ -1083,18 +1137,19 @@ |
384 | JSONObjectNamesIteratorState* state; |
385 | DEFAULT_STACK_INIT(JSONObjectNamesIteratorState, state, planState); |
386 | |
387 | - consumeNext(input, theChild.getp(), planState); |
388 | - |
389 | - if (input->isObject()) |
390 | + while (consumeNext(input, theChild.getp(), planState)) |
391 | { |
392 | - state->theNames = input->getObjectKeys(); |
393 | - state->theNames->open(); |
394 | - |
395 | - while (state->theNames->next(result)) |
396 | + if (input->isObject()) |
397 | { |
398 | - STACK_PUSH (true, state); |
399 | + state->theNames = input->getObjectKeys(); |
400 | + state->theNames->open(); |
401 | + |
402 | + while (state->theNames->next(result)) |
403 | + { |
404 | + STACK_PUSH (true, state); |
405 | + } |
406 | + state->theNames = NULL; |
407 | } |
408 | - state->theNames = NULL; |
409 | } |
410 | |
411 | STACK_END(state); |
412 | @@ -1106,20 +1161,17 @@ |
413 | PlanState& planState) const |
414 | { |
415 | store::Item_t obj; |
416 | - xs_integer count; |
417 | + xs_integer count(0); |
418 | |
419 | JSONObjectNamesIteratorState* state; |
420 | DEFAULT_STACK_INIT(JSONObjectNamesIteratorState, state, planState); |
421 | |
422 | - ZORBA_ASSERT(consumeNext(obj, theChild.getp(), planState)); |
423 | - |
424 | - if (obj->isObject()) |
425 | - { |
426 | - count = obj->getNumObjectPairs(); |
427 | - } |
428 | - else |
429 | - { |
430 | - count = 0; |
431 | + while (consumeNext(obj, theChild.getp(), planState)) |
432 | + { |
433 | + if (obj->isObject()) |
434 | + { |
435 | + count += obj->getNumObjectPairs(); |
436 | + } |
437 | } |
438 | |
439 | STACK_PUSH(GENV_ITEMFACTORY->createInteger(result, count), state); |
440 | @@ -1278,7 +1330,62 @@ |
441 | |
442 | |
443 | /******************************************************************************* |
444 | - json:members($a as item()) as item()* |
445 | + op-zorba:members($a as item()?) as item()* |
446 | +********************************************************************************/ |
447 | +bool SingleArrayMembersIterator::nextImpl( |
448 | + store::Item_t& result, |
449 | + PlanState& planState) const |
450 | +{ |
451 | + store::Item_t array; |
452 | + |
453 | + JSONArrayMembersIteratorState* state; |
454 | + DEFAULT_STACK_INIT(JSONArrayMembersIteratorState, state, planState); |
455 | + |
456 | + if (consumeNext(array, theChild.getp(), planState)) |
457 | + { |
458 | + if (array->isArray()) |
459 | + { |
460 | + state->theMembers = array->getArrayValues(); |
461 | + |
462 | + state->theMembers->open(); |
463 | + while (state->theMembers->next(result)) |
464 | + { |
465 | + STACK_PUSH(true, state); |
466 | + } |
467 | + state->theMembers->close(); |
468 | + } |
469 | + } |
470 | + |
471 | + STACK_END(state); |
472 | +} |
473 | + |
474 | + |
475 | +bool SingleArrayMembersIterator::count( |
476 | + store::Item_t& result, |
477 | + PlanState& planState) const |
478 | +{ |
479 | + store::Item_t array; |
480 | + xs_integer count(0); |
481 | + |
482 | + JSONArrayMembersIteratorState* state; |
483 | + DEFAULT_STACK_INIT(JSONArrayMembersIteratorState, state, planState); |
484 | + |
485 | + if (consumeNext(array, theChild.getp(), planState)) |
486 | + { |
487 | + if (array->isArray()) |
488 | + { |
489 | + count = array->getArraySize(); |
490 | + } |
491 | + } |
492 | + |
493 | + STACK_PUSH(GENV_ITEMFACTORY->createInteger(result, count), state); |
494 | + |
495 | + STACK_END(state); |
496 | +} |
497 | + |
498 | + |
499 | +/******************************************************************************* |
500 | + jn:members($a as item()*) as item()* |
501 | ********************************************************************************/ |
502 | bool JSONArrayMembersIterator::nextImpl( |
503 | store::Item_t& result, |
504 | @@ -1289,18 +1396,19 @@ |
505 | JSONArrayMembersIteratorState* state; |
506 | DEFAULT_STACK_INIT(JSONArrayMembersIteratorState, state, planState); |
507 | |
508 | - consumeNext(array, theChild.getp(), planState); |
509 | - |
510 | - if (array->isArray()) |
511 | + while (consumeNext(array, theChild.getp(), planState)) |
512 | { |
513 | - state->theMembers = array->getArrayValues(); |
514 | - |
515 | - state->theMembers->open(); |
516 | - while (state->theMembers->next(result)) |
517 | + if (array->isArray()) |
518 | { |
519 | - STACK_PUSH(true, state); |
520 | + state->theMembers = array->getArrayValues(); |
521 | + |
522 | + state->theMembers->open(); |
523 | + while (state->theMembers->next(result)) |
524 | + { |
525 | + STACK_PUSH(true, state); |
526 | + } |
527 | + state->theMembers->close(); |
528 | } |
529 | - state->theMembers->close(); |
530 | } |
531 | |
532 | STACK_END(state); |
533 | @@ -1312,21 +1420,20 @@ |
534 | PlanState& planState) const |
535 | { |
536 | store::Item_t array; |
537 | + xs_integer count(0); |
538 | |
539 | JSONArrayMembersIteratorState* state; |
540 | DEFAULT_STACK_INIT(JSONArrayMembersIteratorState, state, planState); |
541 | |
542 | - ZORBA_ASSERT(consumeNext(array, theChild.getp(), planState)); |
543 | - |
544 | - if (array->isArray()) |
545 | - { |
546 | - STACK_PUSH(GENV_ITEMFACTORY->createInteger(result, array->getArraySize()), state); |
547 | - } |
548 | - else |
549 | - { |
550 | - STACK_PUSH(GENV_ITEMFACTORY->createInteger(result, xs_integer(0)), state); |
551 | - } |
552 | - |
553 | + while (consumeNext(array, theChild.getp(), planState)) |
554 | + { |
555 | + if (array->isArray()) |
556 | + { |
557 | + count += array->getArraySize(); |
558 | + } |
559 | + } |
560 | + |
561 | + STACK_PUSH(GENV_ITEMFACTORY->createInteger(result, count), state); |
562 | STACK_END(state); |
563 | } |
564 | |
565 | |
566 | === modified file 'src/runtime/json/pregenerated/jsoniq_functions.cpp' |
567 | --- src/runtime/json/pregenerated/jsoniq_functions.cpp 2013-06-05 00:37:35 +0000 |
568 | +++ src/runtime/json/pregenerated/jsoniq_functions.cpp 2013-06-08 06:43:29 +0000 |
569 | @@ -250,6 +250,42 @@ |
570 | // </JSONObjectNamesIterator> |
571 | |
572 | |
573 | +// <SingleObjectNamesIterator> |
574 | +SERIALIZABLE_CLASS_VERSIONS(SingleObjectNamesIterator) |
575 | + |
576 | +void SingleObjectNamesIterator::serialize(::zorba::serialization::Archiver& ar) |
577 | +{ |
578 | + serialize_baseclass(ar, |
579 | + (UnaryBaseIterator<SingleObjectNamesIterator, SingleObjectNamesIteratorState>*)this); |
580 | +} |
581 | + |
582 | + |
583 | +void SingleObjectNamesIterator::accept(PlanIterVisitor& v) const |
584 | +{ |
585 | + v.beginVisit(*this); |
586 | + |
587 | + theChild->accept(v); |
588 | + |
589 | + v.endVisit(*this); |
590 | +} |
591 | + |
592 | +SingleObjectNamesIterator::~SingleObjectNamesIterator() {} |
593 | + |
594 | +SingleObjectNamesIteratorState::SingleObjectNamesIteratorState() {} |
595 | + |
596 | +SingleObjectNamesIteratorState::~SingleObjectNamesIteratorState() {} |
597 | + |
598 | + |
599 | +void SingleObjectNamesIteratorState::init(PlanState& planState) { |
600 | + PlanIteratorState::init(planState); |
601 | +} |
602 | + |
603 | +void SingleObjectNamesIteratorState::reset(PlanState& planState) { |
604 | + PlanIteratorState::reset(planState); |
605 | +} |
606 | +// </SingleObjectNamesIterator> |
607 | + |
608 | + |
609 | // <JSONObjectValueIterator> |
610 | SERIALIZABLE_CLASS_VERSIONS(JSONObjectValueIterator) |
611 | |
612 | @@ -361,6 +397,42 @@ |
613 | // </JSONArrayMembersIterator> |
614 | |
615 | |
616 | +// <SingleArrayMembersIterator> |
617 | +SERIALIZABLE_CLASS_VERSIONS(SingleArrayMembersIterator) |
618 | + |
619 | +void SingleArrayMembersIterator::serialize(::zorba::serialization::Archiver& ar) |
620 | +{ |
621 | + serialize_baseclass(ar, |
622 | + (UnaryBaseIterator<SingleArrayMembersIterator, SingleArrayMembersIteratorState>*)this); |
623 | +} |
624 | + |
625 | + |
626 | +void SingleArrayMembersIterator::accept(PlanIterVisitor& v) const |
627 | +{ |
628 | + v.beginVisit(*this); |
629 | + |
630 | + theChild->accept(v); |
631 | + |
632 | + v.endVisit(*this); |
633 | +} |
634 | + |
635 | +SingleArrayMembersIterator::~SingleArrayMembersIterator() {} |
636 | + |
637 | +SingleArrayMembersIteratorState::SingleArrayMembersIteratorState() {} |
638 | + |
639 | +SingleArrayMembersIteratorState::~SingleArrayMembersIteratorState() {} |
640 | + |
641 | + |
642 | +void SingleArrayMembersIteratorState::init(PlanState& planState) { |
643 | + PlanIteratorState::init(planState); |
644 | +} |
645 | + |
646 | +void SingleArrayMembersIteratorState::reset(PlanState& planState) { |
647 | + PlanIteratorState::reset(planState); |
648 | +} |
649 | +// </SingleArrayMembersIterator> |
650 | + |
651 | + |
652 | // <JSONArraySizeIterator> |
653 | SERIALIZABLE_CLASS_VERSIONS(JSONArraySizeIterator) |
654 | |
655 | |
656 | === modified file 'src/runtime/json/pregenerated/jsoniq_functions.h' |
657 | --- src/runtime/json/pregenerated/jsoniq_functions.h 2013-06-05 00:37:35 +0000 |
658 | +++ src/runtime/json/pregenerated/jsoniq_functions.h 2013-06-08 06:43:29 +0000 |
659 | @@ -327,6 +327,51 @@ |
660 | * |
661 | * Author: |
662 | */ |
663 | +class SingleObjectNamesIteratorState : public PlanIteratorState |
664 | +{ |
665 | +public: |
666 | + store::Iterator_t theNames; // |
667 | + |
668 | + SingleObjectNamesIteratorState(); |
669 | + |
670 | + ~SingleObjectNamesIteratorState(); |
671 | + |
672 | + void init(PlanState&); |
673 | + void reset(PlanState&); |
674 | +}; |
675 | + |
676 | +class SingleObjectNamesIterator : public UnaryBaseIterator<SingleObjectNamesIterator, SingleObjectNamesIteratorState> |
677 | +{ |
678 | +public: |
679 | + SERIALIZABLE_CLASS(SingleObjectNamesIterator); |
680 | + |
681 | + SERIALIZABLE_CLASS_CONSTRUCTOR2T(SingleObjectNamesIterator, |
682 | + UnaryBaseIterator<SingleObjectNamesIterator, SingleObjectNamesIteratorState>); |
683 | + |
684 | + void serialize( ::zorba::serialization::Archiver& ar); |
685 | + |
686 | + SingleObjectNamesIterator( |
687 | + static_context* sctx, |
688 | + const QueryLoc& loc, |
689 | + PlanIter_t& child) |
690 | + : |
691 | + UnaryBaseIterator<SingleObjectNamesIterator, SingleObjectNamesIteratorState>(sctx, loc, child) |
692 | + {} |
693 | + |
694 | + virtual ~SingleObjectNamesIterator(); |
695 | + |
696 | +public: |
697 | + bool count(store::Item_t& result, PlanState& planState) const; |
698 | + void accept(PlanIterVisitor& v) const; |
699 | + |
700 | + bool nextImpl(store::Item_t& result, PlanState& aPlanState) const; |
701 | +}; |
702 | + |
703 | + |
704 | +/** |
705 | + * |
706 | + * Author: |
707 | + */ |
708 | class JSONObjectValueIterator : public BinaryBaseIterator<JSONObjectValueIterator, PlanIteratorState> |
709 | { |
710 | public: |
711 | @@ -462,6 +507,51 @@ |
712 | * |
713 | * Author: |
714 | */ |
715 | +class SingleArrayMembersIteratorState : public PlanIteratorState |
716 | +{ |
717 | +public: |
718 | + store::Iterator_t theMembers; // |
719 | + |
720 | + SingleArrayMembersIteratorState(); |
721 | + |
722 | + ~SingleArrayMembersIteratorState(); |
723 | + |
724 | + void init(PlanState&); |
725 | + void reset(PlanState&); |
726 | +}; |
727 | + |
728 | +class SingleArrayMembersIterator : public UnaryBaseIterator<SingleArrayMembersIterator, SingleArrayMembersIteratorState> |
729 | +{ |
730 | +public: |
731 | + SERIALIZABLE_CLASS(SingleArrayMembersIterator); |
732 | + |
733 | + SERIALIZABLE_CLASS_CONSTRUCTOR2T(SingleArrayMembersIterator, |
734 | + UnaryBaseIterator<SingleArrayMembersIterator, SingleArrayMembersIteratorState>); |
735 | + |
736 | + void serialize( ::zorba::serialization::Archiver& ar); |
737 | + |
738 | + SingleArrayMembersIterator( |
739 | + static_context* sctx, |
740 | + const QueryLoc& loc, |
741 | + PlanIter_t& child) |
742 | + : |
743 | + UnaryBaseIterator<SingleArrayMembersIterator, SingleArrayMembersIteratorState>(sctx, loc, child) |
744 | + {} |
745 | + |
746 | + virtual ~SingleArrayMembersIterator(); |
747 | + |
748 | +public: |
749 | + bool count(store::Item_t& result, PlanState& planState) const; |
750 | + void accept(PlanIterVisitor& v) const; |
751 | + |
752 | + bool nextImpl(store::Item_t& result, PlanState& aPlanState) const; |
753 | +}; |
754 | + |
755 | + |
756 | +/** |
757 | + * |
758 | + * Author: |
759 | + */ |
760 | class JSONArraySizeIterator : public UnaryBaseIterator<JSONArraySizeIterator, PlanIteratorState> |
761 | { |
762 | public: |
763 | |
764 | === modified file 'src/runtime/pregenerated/iterator_enum.h' |
765 | --- src/runtime/pregenerated/iterator_enum.h 2013-06-05 07:26:13 +0000 |
766 | +++ src/runtime/pregenerated/iterator_enum.h 2013-06-08 06:43:29 +0000 |
767 | @@ -170,10 +170,12 @@ |
768 | TYPE_JSONDocIterator, |
769 | TYPE_JSONItemAccessorIterator, |
770 | TYPE_JSONObjectNamesIterator, |
771 | + TYPE_SingleObjectNamesIterator, |
772 | TYPE_JSONObjectValueIterator, |
773 | TYPE_JSONObjectProjectIterator, |
774 | TYPE_JSONArrayMemberIterator, |
775 | TYPE_JSONArrayMembersIterator, |
776 | + TYPE_SingleArrayMembersIterator, |
777 | TYPE_JSONArraySizeIterator, |
778 | TYPE_JSONArrayFlattenIterator, |
779 | TYPE_JSONNullIterator, |
780 | |
781 | === modified file 'src/runtime/spec/json/jsoniq_functions.xml' |
782 | --- src/runtime/spec/json/jsoniq_functions.xml 2013-06-05 00:37:35 +0000 |
783 | +++ src/runtime/spec/json/jsoniq_functions.xml 2013-06-08 06:43:29 +0000 |
784 | @@ -269,10 +269,44 @@ |
785 | --> |
786 | <zorba:iterator name="JSONObjectNamesIterator" arity="unary"> |
787 | |
788 | - <zorba:function isDeterministic="true"> |
789 | + <zorba:function isDeterministic="true" |
790 | + generateCodegen="false"> |
791 | |
792 | <zorba:signature localname="keys" prefix="fn-jsoniq"> |
793 | - <zorba:param>item()</zorba:param> |
794 | + <zorba:param>item()*</zorba:param> |
795 | + <zorba:output>xs:string*</zorba:output> |
796 | + </zorba:signature> |
797 | + |
798 | + <zorba:methods> |
799 | + <zorba:propagatesInputNodes value="false"/> |
800 | + <zorba:mustCopyInputNodes value="false"/> |
801 | + <zorba:isMap producer="0"/> |
802 | + </zorba:methods> |
803 | + |
804 | + </zorba:function> |
805 | + |
806 | + <zorba:state> |
807 | + <zorba:member type="store::Iterator_t" name="theNames" brief=""/> |
808 | + </zorba:state> |
809 | + |
810 | + <zorba:method name="count" const="true" return="bool"> |
811 | + <zorba:param name="result" type="store::Item_t&"/> |
812 | + <zorba:param name="planState" type="PlanState&"/> |
813 | + </zorba:method> |
814 | + |
815 | +</zorba:iterator> |
816 | + |
817 | + |
818 | +<!-- |
819 | +/******************************************************************************* |
820 | +********************************************************************************/ |
821 | +--> |
822 | +<zorba:iterator name="SingleObjectNamesIterator" arity="unary"> |
823 | + |
824 | + <zorba:function isDeterministic="true"> |
825 | + |
826 | + <zorba:signature localname="keys" prefix="op-zorba"> |
827 | + <zorba:param>item()?</zorba:param> |
828 | <zorba:output>xs:string*</zorba:output> |
829 | </zorba:signature> |
830 | |
831 | @@ -373,10 +407,44 @@ |
832 | --> |
833 | <zorba:iterator name="JSONArrayMembersIterator" arity="unary"> |
834 | |
835 | - <zorba:function isDeterministic="true"> |
836 | + <zorba:function isDeterministic="true" |
837 | + generateCodegen="false"> |
838 | |
839 | <zorba:signature localname="members" prefix="fn-jsoniq"> |
840 | - <zorba:param>item()</zorba:param> |
841 | + <zorba:param>item()*</zorba:param> |
842 | + <zorba:output>item()*</zorba:output> |
843 | + </zorba:signature> |
844 | + |
845 | + <zorba:methods> |
846 | + <zorba:propagatesInputNodes producer="0"/> |
847 | + <zorba:mustCopyInputNodes value="false"/> |
848 | + <zorba:isMap producer="0"/> |
849 | + </zorba:methods> |
850 | + |
851 | + </zorba:function> |
852 | + |
853 | + <zorba:state> |
854 | + <zorba:member type="store::Iterator_t" name="theMembers" brief=""/> |
855 | + </zorba:state> |
856 | + |
857 | + <zorba:method name="count" const="true" return="bool"> |
858 | + <zorba:param name="result" type="store::Item_t&"/> |
859 | + <zorba:param name="planState" type="PlanState&"/> |
860 | + </zorba:method> |
861 | + |
862 | +</zorba:iterator> |
863 | + |
864 | + |
865 | +<!-- |
866 | +/******************************************************************************* |
867 | +********************************************************************************/ |
868 | +--> |
869 | +<zorba:iterator name="SingleArrayMembersIterator" arity="unary"> |
870 | + |
871 | + <zorba:function isDeterministic="true"> |
872 | + |
873 | + <zorba:signature localname="members" prefix="op-zorba"> |
874 | + <zorba:param>item()?</zorba:param> |
875 | <zorba:output>item()*</zorba:output> |
876 | </zorba:signature> |
877 | |
878 | |
879 | === modified file 'src/runtime/visitors/pregenerated/planiter_visitor.h' |
880 | --- src/runtime/visitors/pregenerated/planiter_visitor.h 2013-06-05 07:26:13 +0000 |
881 | +++ src/runtime/visitors/pregenerated/planiter_visitor.h 2013-06-08 06:43:29 +0000 |
882 | @@ -346,6 +346,8 @@ |
883 | |
884 | class JSONObjectNamesIterator; |
885 | |
886 | + class SingleObjectNamesIterator; |
887 | + |
888 | class JSONObjectValueIterator; |
889 | |
890 | class JSONObjectProjectIterator; |
891 | @@ -354,6 +356,8 @@ |
892 | |
893 | class JSONArrayMembersIterator; |
894 | |
895 | + class SingleArrayMembersIterator; |
896 | + |
897 | class JSONArraySizeIterator; |
898 | |
899 | class JSONArrayFlattenIterator; |
900 | @@ -1227,6 +1231,9 @@ |
901 | virtual void beginVisit ( const JSONObjectNamesIterator& ) = 0; |
902 | virtual void endVisit ( const JSONObjectNamesIterator& ) = 0; |
903 | |
904 | + virtual void beginVisit ( const SingleObjectNamesIterator& ) = 0; |
905 | + virtual void endVisit ( const SingleObjectNamesIterator& ) = 0; |
906 | + |
907 | virtual void beginVisit ( const JSONObjectValueIterator& ) = 0; |
908 | virtual void endVisit ( const JSONObjectValueIterator& ) = 0; |
909 | |
910 | @@ -1239,6 +1246,9 @@ |
911 | virtual void beginVisit ( const JSONArrayMembersIterator& ) = 0; |
912 | virtual void endVisit ( const JSONArrayMembersIterator& ) = 0; |
913 | |
914 | + virtual void beginVisit ( const SingleArrayMembersIterator& ) = 0; |
915 | + virtual void endVisit ( const SingleArrayMembersIterator& ) = 0; |
916 | + |
917 | virtual void beginVisit ( const JSONArraySizeIterator& ) = 0; |
918 | virtual void endVisit ( const JSONArraySizeIterator& ) = 0; |
919 | |
920 | |
921 | === modified file 'src/runtime/visitors/pregenerated/printer_visitor.cpp' |
922 | --- src/runtime/visitors/pregenerated/printer_visitor.cpp 2013-06-05 07:26:13 +0000 |
923 | +++ src/runtime/visitors/pregenerated/printer_visitor.cpp 2013-06-08 06:43:29 +0000 |
924 | @@ -2097,6 +2097,20 @@ |
925 | // </JSONObjectNamesIterator> |
926 | |
927 | |
928 | +// <SingleObjectNamesIterator> |
929 | +void PrinterVisitor::beginVisit ( const SingleObjectNamesIterator& a) { |
930 | + thePrinter.startBeginVisit("SingleObjectNamesIterator", ++theId); |
931 | + printCommons( &a, theId ); |
932 | + thePrinter.endBeginVisit( theId ); |
933 | +} |
934 | + |
935 | +void PrinterVisitor::endVisit ( const SingleObjectNamesIterator& ) { |
936 | + thePrinter.startEndVisit(); |
937 | + thePrinter.endEndVisit(); |
938 | +} |
939 | +// </SingleObjectNamesIterator> |
940 | + |
941 | + |
942 | // <JSONObjectValueIterator> |
943 | void PrinterVisitor::beginVisit ( const JSONObjectValueIterator& a) { |
944 | thePrinter.startBeginVisit("JSONObjectValueIterator", ++theId); |
945 | @@ -2153,6 +2167,20 @@ |
946 | // </JSONArrayMembersIterator> |
947 | |
948 | |
949 | +// <SingleArrayMembersIterator> |
950 | +void PrinterVisitor::beginVisit ( const SingleArrayMembersIterator& a) { |
951 | + thePrinter.startBeginVisit("SingleArrayMembersIterator", ++theId); |
952 | + printCommons( &a, theId ); |
953 | + thePrinter.endBeginVisit( theId ); |
954 | +} |
955 | + |
956 | +void PrinterVisitor::endVisit ( const SingleArrayMembersIterator& ) { |
957 | + thePrinter.startEndVisit(); |
958 | + thePrinter.endEndVisit(); |
959 | +} |
960 | +// </SingleArrayMembersIterator> |
961 | + |
962 | + |
963 | // <JSONArraySizeIterator> |
964 | void PrinterVisitor::beginVisit ( const JSONArraySizeIterator& a) { |
965 | thePrinter.startBeginVisit("JSONArraySizeIterator", ++theId); |
966 | |
967 | === modified file 'src/runtime/visitors/pregenerated/printer_visitor.h' |
968 | --- src/runtime/visitors/pregenerated/printer_visitor.h 2013-06-05 07:26:13 +0000 |
969 | +++ src/runtime/visitors/pregenerated/printer_visitor.h 2013-06-08 06:43:29 +0000 |
970 | @@ -529,6 +529,9 @@ |
971 | void beginVisit( const JSONObjectNamesIterator& ); |
972 | void endVisit ( const JSONObjectNamesIterator& ); |
973 | |
974 | + void beginVisit( const SingleObjectNamesIterator& ); |
975 | + void endVisit ( const SingleObjectNamesIterator& ); |
976 | + |
977 | void beginVisit( const JSONObjectValueIterator& ); |
978 | void endVisit ( const JSONObjectValueIterator& ); |
979 | |
980 | @@ -541,6 +544,9 @@ |
981 | void beginVisit( const JSONArrayMembersIterator& ); |
982 | void endVisit ( const JSONArrayMembersIterator& ); |
983 | |
984 | + void beginVisit( const SingleArrayMembersIterator& ); |
985 | + void endVisit ( const SingleArrayMembersIterator& ); |
986 | + |
987 | void beginVisit( const JSONArraySizeIterator& ); |
988 | void endVisit ( const JSONArraySizeIterator& ); |
989 | |
990 | |
991 | === modified file 'test/rbkt/ExpQueryResults/zorba/jsoniq/keys_02.xml.res' |
992 | --- test/rbkt/ExpQueryResults/zorba/jsoniq/keys_02.xml.res 2013-03-15 19:28:34 +0000 |
993 | +++ test/rbkt/ExpQueryResults/zorba/jsoniq/keys_02.xml.res 2013-06-08 06:43:29 +0000 |
994 | @@ -1,1 +1,1 @@ |
995 | -true |
996 | +true true |
997 | |
998 | === modified file 'test/rbkt/ExpQueryResults/zorba/jsoniq/members_02.xml.res' |
999 | --- test/rbkt/ExpQueryResults/zorba/jsoniq/members_02.xml.res 2013-03-15 19:28:34 +0000 |
1000 | +++ test/rbkt/ExpQueryResults/zorba/jsoniq/members_02.xml.res 2013-06-08 06:43:29 +0000 |
1001 | @@ -1,1 +1,1 @@ |
1002 | -true |
1003 | +true true |
1004 | |
1005 | === added file 'test/rbkt/ExpQueryResults/zorba/jsoniq/members_04.xml.res' |
1006 | --- test/rbkt/ExpQueryResults/zorba/jsoniq/members_04.xml.res 1970-01-01 00:00:00 +0000 |
1007 | +++ test/rbkt/ExpQueryResults/zorba/jsoniq/members_04.xml.res 2013-06-08 06:43:29 +0000 |
1008 | @@ -0,0 +1,1 @@ |
1009 | +foo1 bar1 foo2 bar2 foo3 bar3 foo4 bar4 foo5 bar5 foo6 bar6 foo7 bar7 foo8 bar8 foo9 bar9 foo10 bar10 |
1010 | |
1011 | === modified file 'test/rbkt/Queries/zorba/jsoniq/keys_01.xq' |
1012 | --- test/rbkt/Queries/zorba/jsoniq/keys_01.xq 2013-03-15 19:28:34 +0000 |
1013 | +++ test/rbkt/Queries/zorba/jsoniq/keys_01.xq 2013-06-08 06:43:29 +0000 |
1014 | @@ -1,3 +1,3 @@ |
1015 | let $a := for $i in 1 to 10 return { "foo" || $i : "bar" || $i } |
1016 | -return $a() |
1017 | +return jn:keys($a) |
1018 | |
1019 | |
1020 | === modified file 'test/rbkt/Queries/zorba/jsoniq/keys_02.xq' |
1021 | --- test/rbkt/Queries/zorba/jsoniq/keys_02.xq 2013-03-15 19:28:34 +0000 |
1022 | +++ test/rbkt/Queries/zorba/jsoniq/keys_02.xq 2013-06-08 06:43:29 +0000 |
1023 | @@ -1,1 +1,4 @@ |
1024 | -empty({| |}()) |
1025 | +empty({| |}()), |
1026 | + |
1027 | +empty(jn:keys(())) |
1028 | + |
1029 | |
1030 | === modified file 'test/rbkt/Queries/zorba/jsoniq/members_02.xq' |
1031 | --- test/rbkt/Queries/zorba/jsoniq/members_02.xq 2013-03-15 19:28:34 +0000 |
1032 | +++ test/rbkt/Queries/zorba/jsoniq/members_02.xq 2013-06-08 06:43:29 +0000 |
1033 | @@ -1,1 +1,4 @@ |
1034 | empty([]()) |
1035 | +, |
1036 | +empty(jn:members(())) |
1037 | + |
1038 | |
1039 | === added file 'test/rbkt/Queries/zorba/jsoniq/members_04.xq' |
1040 | --- test/rbkt/Queries/zorba/jsoniq/members_04.xq 1970-01-01 00:00:00 +0000 |
1041 | +++ test/rbkt/Queries/zorba/jsoniq/members_04.xq 2013-06-08 06:43:29 +0000 |
1042 | @@ -0,0 +1,2 @@ |
1043 | +let $a := for $i in 1 to 10 return [ "foo" || $i, "bar" || $i] |
1044 | +return jn:members($a) |
Validation queue starting for merge proposal. zorbatest. lambda. nu:8080/ remotequeue/ markos- scratch- 2013-06- 08T06-46- 54.906Z/ log.html
Log at: http://