Merge lp:~zorba-coders/zorba/markos-scratch into lp:zorba

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
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-scratch-2013-06-08T06-46-54.906Z is finished. The final status was:

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&amp;"/>
812+ <zorba:param name="planState" type="PlanState&amp;"/>
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&amp;"/>
859+ <zorba:param name="planState" type="PlanState&amp;"/>
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)

Subscribers

People subscribed via source and target branches