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

Proposed by Markos Zaharioudakis
Status: Merged
Merged at revision: 11600
Proposed branch: lp:~zorba-coders/zorba/markos-scratch
Merge into: lp:zorba
Diff against target: 4429 lines (+1851/-1239)
43 files modified
modules/org/jsoniq/www/function-library.xq (+22/-22)
modules/org/jsoniq/www/functions.xq (+1/-1)
src/api/staticcontextimpl.cpp (+20/-8)
src/compiler/codegen/plan_visitor.cpp (+6/-3)
src/compiler/expression/expr_type.cpp (+6/-1)
src/compiler/expression/function_item_expr.h (+1/-1)
src/compiler/rewriter/rules/type_rules.cpp (+75/-3)
src/compiler/rewriter/tools/expr_tools.cpp (+1/-1)
src/compiler/translator/translator.cpp (+104/-155)
src/functions/func_jsoniq_functions_impl.cpp (+72/-33)
src/functions/pregenerated/func_jsoniq_functions.cpp (+57/-64)
src/functions/pregenerated/func_jsoniq_functions.h (+70/-47)
src/functions/pregenerated/function_enum.h (+4/-4)
src/runtime/base/plan_iterator.h (+5/-2)
src/runtime/hof/dynamic_fncall_iterator.cpp (+262/-53)
src/runtime/hof/dynamic_fncall_iterator.h (+82/-15)
src/runtime/hof/function_item.cpp (+31/-0)
src/runtime/hof/function_item.h (+2/-0)
src/runtime/json/jsoniq_functions_impl.cpp (+240/-185)
src/runtime/json/pregenerated/jsoniq_functions.cpp (+207/-173)
src/runtime/json/pregenerated/jsoniq_functions.h (+222/-178)
src/runtime/pregenerated/iterator_enum.h (+7/-6)
src/runtime/spec/json/jsoniq_functions.xml (+96/-68)
src/runtime/visitors/planiter_visitor_impl_code.h (+2/-1)
src/runtime/visitors/planiter_visitor_impl_include.h (+2/-1)
src/runtime/visitors/pregenerated/planiter_visitor.h (+31/-26)
src/runtime/visitors/pregenerated/printer_visitor.cpp (+94/-80)
src/runtime/visitors/pregenerated/printer_visitor.h (+19/-16)
src/runtime/visitors/printer_visitor_impl.cpp (+2/-1)
src/runtime/visitors/printer_visitor_impl.h (+2/-1)
src/zorbaserialization/archiver_consts.h (+2/-1)
test/fots/CMakeLists.txt (+2/-1)
test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_veq_08b.iter (+22/-22)
test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_veq_09.iter (+22/-22)
test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_veq_10.iter (+26/-26)
test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_vrange_04.iter (+2/-2)
test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_vrange_05.iter (+4/-4)
test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_vrange_06.iter (+6/-6)
test/rbkt/ExpCompilerResults/IterPlan/zorba/jsoniq/member_01.iter (+6/-6)
test/rbkt/ExpQueryResults/zorba/jsoniq/keys_06.xml.res (+1/-0)
test/rbkt/ExpQueryResults/zorba/jsoniq/keys_07.xml.res (+1/-0)
test/rbkt/Queries/zorba/jsoniq/keys_06.xq (+6/-0)
test/rbkt/Queries/zorba/jsoniq/keys_07.xq (+6/-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+180553@code.launchpad.net

Commit message

made $objects() equivalent to jn:keys($objects) + optimized jsoniq navigation

Description of the change

made $objects() equivalent to jn:keys($objects) + optimized jsoniq navigation

To post a comment you must log in.
Revision history for this message
Markos Zaharioudakis (markos-za) :
review: Approve
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :

Validation queue starting for the following merge proposals:
https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/180553

Progress dashboard at http://jenkins.lambda.nu/view/ValidationQueue

Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :

Validation queue result for https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/180553

Stage "TestZorbaUbuntu" failed.
7 tests failed (8403 total tests run).

Check test results at http://jenkins.lambda.nu/job/TestZorbaUbuntu/223/testReport/ to view the results.

11211. By Markos Zaharioudakis

fixed ruby test

Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :

Validation queue starting for the following merge proposals:
https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/180553

Progress dashboard at http://jenkins.lambda.nu/view/ValidationQueue

Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :

Validation queue result for https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/180553

Stage "TestZorbaUbuntu" failed.
1 tests failed (8403 total tests run).

Check test results at http://jenkins.lambda.nu/job/TestZorbaUbuntu/224/testReport/ to view the results.

11212. By Markos Zaharioudakis

made () equivalent to jn:keys() + optimized jsoniq navigation

Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :

Validation queue starting for the following merge proposals:
https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/180553

Progress dashboard at http://jenkins.lambda.nu/view/ValidationQueue

Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :

Validation queue succeeded - proposal merged!

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'modules/org/jsoniq/www/function-library.xq'
2--- modules/org/jsoniq/www/function-library.xq 2013-08-14 16:32:41 +0000
3+++ modules/org/jsoniq/www/function-library.xq 2013-08-16 17:18:24 +0000
4@@ -46,7 +46,7 @@
5 : accumulated into a single object.
6 : @return The accumulated object.
7 :)
8-declare function libjn:accumulate($items as item()*) as object()
9+declare function libjn:accumulate($items as item*) as object
10 {
11 {[ $items ]}
12 };
13@@ -58,7 +58,7 @@
14 : @param $items A sequence of items.
15 : @return The descendant arrays of the input sequence.
16 :)
17-declare function libjn:descendant-arrays($items as item()*) as array()*
18+declare function libjn:descendant-arrays($items as item*) as array*
19 {
20 for $i in $items
21 return libjn:descendant-arrays-priv($i)
22@@ -71,20 +71,20 @@
23 : @param $i An item
24 : @return The descendant arrays of the item
25 :)
26-declare %private function libjn:descendant-arrays-priv($i as item()) as array()*
27+declare %private function libjn:descendant-arrays-priv($i as item) as array*
28 {
29 typeswitch ($i)
30
31- case object() return
32+ case object return
33 for $v in libjn:values($i)
34- where $v instance of json-item()
35+ where $v instance of json-item
36 return libjn:descendant-arrays-priv($v)
37
38- case array() return
39+ case array return
40 (
41 $i,
42 for $v in $i[]
43- where $v instance of json-item()
44+ where $v instance of json-item
45 return libjn:descendant-arrays-priv($v)
46 )
47
48@@ -99,7 +99,7 @@
49 : @param $items A sequence of items.
50 : @return The descendant objects of the input sequence.
51 :)
52-declare function libjn:descendant-objects($items as item()*) as object()*
53+declare function libjn:descendant-objects($items as item*) as object*
54 {
55 for $i in $items
56 return libjn:descendant-objects-priv($i)
57@@ -112,21 +112,21 @@
58 : @param $i An item
59 : @return The descendant objects of the item
60 :)
61-declare %private function libjn:descendant-objects-priv($i as item()) as object()*
62+declare %private function libjn:descendant-objects-priv($i as item) as object*
63 {
64- if ($i instance of object())
65+ if ($i instance of object)
66 then
67 (
68 $i,
69 for $v in libjn:values($i)
70- where $v instance of json-item()
71+ where $v instance of json-item
72 return libjn:descendant-objects-priv($v)
73 )
74- else if ($i instance of array())
75+ else if ($i instance of array)
76 then
77 (
78 for $v in $i[]
79- where $v instance of json-item()
80+ where $v instance of json-item
81 return libjn:descendant-objects-priv($v)
82 )
83 else
84@@ -140,7 +140,7 @@
85 : @param $o An object.
86 : @return All direct and indirect descendant pairs.
87 :)
88-declare function libjn:descendant-pairs($items as item()*) as object()*
89+declare function libjn:descendant-pairs($items as item*) as object*
90 {
91 for $i in $items
92 return libjn:descendant-pairs-priv($i)
93@@ -153,11 +153,11 @@
94 : @param $i An item
95 : @return The descendant pairs of the item
96 :)
97-declare function libjn:descendant-pairs-priv($i as item()) as object()*
98+declare function libjn:descendant-pairs-priv($i as item) as object*
99 {
100 typeswitch ($i)
101
102- case $o as object() return
103+ case $o as object return
104 for $k in jn:keys($o)
105 return
106 (
107@@ -165,9 +165,9 @@
108 libjn:descendant-pairs-priv($o($k))
109 )
110
111- case $a as array() return
112+ case $a as array return
113 for $i in $a[]
114- where $i instance of json-item()
115+ where $i instance of json-item
116 return libjn:descendant-pairs-priv($i)
117
118 default return
119@@ -183,10 +183,10 @@
120 : @param $items A sequence of items.
121 : @return The insersection of the objects contained in $items.
122 :)
123-declare function libjn:intersect($items as item()*) as object()
124+declare function libjn:intersect($items as item*) as object
125 {
126 {|
127- let $objects := $items[$$ instance of object()]
128+ let $objects := $items[$$ instance of object]
129 for $key in keys(head($objects))
130 where every $o in tail($objects)
131 satisfies exists(index-of(keys($o), $key))
132@@ -201,10 +201,10 @@
133 : @param $items A sequence of items.
134 : @return The values inside the objects of the sequence.
135 :)
136-declare function libjn:values($items as item()*) as item()*
137+declare function libjn:values($items as item*) as item*
138 {
139 for $i in $items
140 for $k in jn:keys($i)
141- return ($i treat as object())($k)
142+ return ($i treat as object)($k)
143 };
144
145
146=== modified file 'modules/org/jsoniq/www/functions.xq'
147--- modules/org/jsoniq/www/functions.xq 2013-08-14 15:16:42 +0000
148+++ modules/org/jsoniq/www/functions.xq 2013-08-16 17:18:24 +0000
149@@ -174,7 +174,7 @@
150 : if jsoniq-multiple-top-level-items is false and there is additional
151 : content after the first JSON Object or Array.
152 : @error jerr:JNTY0020 if the value for the option
153- : jsoniq-multiple-top-level-items is not of type xs:boolean.
154+ : jsoniq-multiple-top-level-items is not of type boolean.
155 :
156 : @return a sequence of JSON Object or Array item.
157 :)
158
159=== modified file 'src/api/staticcontextimpl.cpp'
160--- src/api/staticcontextimpl.cpp 2013-08-06 08:41:26 +0000
161+++ src/api/staticcontextimpl.cpp 2013-08-16 17:18:24 +0000
162@@ -452,12 +452,19 @@
163 ********************************************************************************/
164 xquery_version_t StaticContextImpl::getXQueryVersion() const
165 {
166- try {
167- return theCtx->xquery_version()==StaticContextConsts::xquery_version_1_0?
168- xquery_version_1_0:xquery_version_3_0;
169- } catch (ZorbaException const& e) {
170+ try
171+ {
172+ return
173+ (theCtx->xquery_version() == StaticContextConsts::xquery_version_1_0 ?
174+ xquery_version_1_0 :
175+ xquery_version_3_0);
176+ }
177+ catch (ZorbaException const& e)
178+ {
179 ZorbaImpl::notifyError(theDiagnosticHandler, e);
180- } catch (std::exception const& e) {
181+ }
182+ catch (std::exception const& e)
183+ {
184 ZorbaImpl::notifyError(theDiagnosticHandler, e.what());
185 }
186 return xquery_version_1_0;
187@@ -469,14 +476,19 @@
188 ********************************************************************************/
189 jsoniq_version_t StaticContextImpl::getJSONiqVersion() const
190 {
191- try {
192+ try
193+ {
194 if (theCtx->language_kind() != StaticContextConsts::language_kind_jsoniq)
195 return jsoniq_version_undefined;
196 return theCtx->jsoniq_version()==StaticContextConsts::jsoniq_version_1_0?
197 jsoniq_version_1_0:jsoniq_version_undefined;
198- } catch (ZorbaException const& e) {
199+ }
200+ catch (ZorbaException const& e)
201+ {
202 ZorbaImpl::notifyError(theDiagnosticHandler, e);
203- } catch (std::exception const& e) {
204+ }
205+ catch (std::exception const& e)
206+ {
207 ZorbaImpl::notifyError(theDiagnosticHandler, e.what());
208 }
209 return jsoniq_version_undefined;
210
211=== modified file 'src/compiler/codegen/plan_visitor.cpp'
212--- src/compiler/codegen/plan_visitor.cpp 2013-07-01 18:59:06 +0000
213+++ src/compiler/codegen/plan_visitor.cpp 2013-08-16 17:18:24 +0000
214@@ -516,13 +516,13 @@
215 {
216 CODEGEN_TRACE_OUT("");
217
218- csize numArgs = v.get_args().size() + 1;
219+ csize numArgs = v.get_args().size();
220
221 std::vector<PlanIter_t> argIters;
222
223 bool isPartialApply = false;
224
225- for (csize i = 0; i < numArgs-1; ++i)
226+ for (csize i = 0; i < numArgs; ++i)
227 {
228 if (v.get_args()[i]->get_expr_kind() == argument_placeholder_expr_kind)
229 isPartialApply = true;
230@@ -534,7 +534,10 @@
231
232 std::reverse(argIters.begin(), argIters.end());
233
234- push_itstack(new DynamicFnCallIterator(sctx, qloc, argIters, isPartialApply));
235+ if (numArgs > 0 || v.get_input()->get_return_type()->max_card() <= 1)
236+ push_itstack(new SingleDynamicFnCallIterator(sctx, qloc, argIters, isPartialApply));
237+ else
238+ push_itstack(new MultiDynamicFnCallIterator(sctx, qloc, argIters[0]));
239 }
240
241
242
243=== modified file 'src/compiler/expression/expr_type.cpp'
244--- src/compiler/expression/expr_type.cpp 2013-06-15 02:57:08 +0000
245+++ src/compiler/expression/expr_type.cpp 2013-08-16 17:18:24 +0000
246@@ -638,7 +638,12 @@
247 static_cast<dynamic_function_invocation_expr*>(this);
248
249 xqtref_t fiType = e->theExpr->get_return_type();
250- if (fiType->type_kind() == XQType::FUNCTION_TYPE_KIND)
251+
252+ if (fiType->max_card() == 0)
253+ {
254+ newType = rtm.EMPTY_TYPE;
255+ }
256+ else if (fiType->type_kind() == XQType::FUNCTION_TYPE_KIND)
257 {
258 const FunctionXQType* funcType = static_cast<const FunctionXQType*>(fiType.getp());
259 newType = funcType->get_return_type();
260
261=== modified file 'src/compiler/expression/function_item_expr.h'
262--- src/compiler/expression/function_item_expr.h 2013-07-02 21:32:23 +0000
263+++ src/compiler/expression/function_item_expr.h 2013-08-16 17:18:24 +0000
264@@ -95,7 +95,7 @@
265 const std::vector<expr*>& args);
266
267 public:
268- expr* get_function() const { return theExpr; }
269+ expr* get_input() const { return theExpr; }
270
271 const std::vector<expr*>& get_args() const { return theArgs; }
272
273
274=== modified file 'src/compiler/rewriter/rules/type_rules.cpp'
275--- src/compiler/rewriter/rules/type_rules.cpp 2013-06-27 15:54:27 +0000
276+++ src/compiler/rewriter/rules/type_rules.cpp 2013-08-16 17:18:24 +0000
277@@ -108,7 +108,9 @@
278 {
279 fo_expr* fo = static_cast<fo_expr *>(node);
280
281- if (fo->get_func()->getKind() == FunctionConsts::FN_BOOLEAN_1)
282+ switch (fo->get_func()->getKind())
283+ {
284+ case FunctionConsts::FN_BOOLEAN_1:
285 {
286 expr* arg = fo->get_arg(0);
287 xqtref_t arg_type = arg->get_return_type();
288@@ -118,7 +120,7 @@
289 return NULL;
290 }
291
292- if (fo->get_func()->getKind() == FunctionConsts::FN_DATA_1)
293+ case FunctionConsts::FN_DATA_1:
294 {
295 expr* arg = fo->get_arg(0);
296 xqtref_t arg_type = arg->get_return_type();
297@@ -128,7 +130,7 @@
298 return NULL;
299 }
300
301- if (fo->get_func()->getKind() == FunctionConsts::OP_ZORBA_JSON_BOX_1)
302+ case FunctionConsts::OP_ZORBA_JSON_BOX_1:
303 {
304 expr* arg = fo->get_arg(0);
305 xqtref_t arg_type = arg->get_return_type();
306@@ -147,6 +149,76 @@
307 return NULL;
308 }
309
310+ case FunctionConsts::FN_JSONIQ_KEYS_1:
311+ {
312+ expr* arg = fo->get_arg(0);
313+ xqtref_t arg_type = arg->get_return_type();
314+
315+ if (arg_type->max_card() <= 1)
316+ {
317+ return rCtx.theEM->
318+ create_fo_expr(sctx, fo->get_udf(), fo->get_loc(),
319+ BUILTIN_FUNC(OP_ZORBA_KEYS_1),
320+ arg);
321+ }
322+
323+ return NULL;
324+ }
325+
326+ case FunctionConsts::OP_ZORBA_MULTI_OBJECT_LOOKUP_2:
327+ {
328+ expr* arg = fo->get_arg(0);
329+ xqtref_t arg_type = arg->get_return_type();
330+
331+ if (arg_type->max_card() <= 1)
332+ {
333+ return rCtx.theEM->
334+ create_fo_expr(sctx, fo->get_udf(), fo->get_loc(),
335+ BUILTIN_FUNC(OP_ZORBA_SINGLE_OBJECT_LOOKUP_2),
336+ arg, fo->get_arg(1));
337+ }
338+
339+ return NULL;
340+ }
341+
342+ case FunctionConsts::FN_JSONIQ_MEMBERS_1:
343+ {
344+ expr* arg = fo->get_arg(0);
345+ xqtref_t arg_type = arg->get_return_type();
346+
347+ if (arg_type->max_card() <= 1)
348+ {
349+ return rCtx.theEM->
350+ create_fo_expr(sctx, fo->get_udf(), fo->get_loc(),
351+ BUILTIN_FUNC(OP_ZORBA_MEMBERS_1),
352+ arg);
353+ }
354+
355+ return NULL;
356+ }
357+
358+ case FunctionConsts::OP_ZORBA_MULTI_ARRAY_LOOKUP_2:
359+ {
360+ expr* arg = fo->get_arg(0);
361+ xqtref_t arg_type = arg->get_return_type();
362+
363+ if (arg_type->max_card() <= 1)
364+ {
365+ return rCtx.theEM->
366+ create_fo_expr(sctx, fo->get_udf(), fo->get_loc(),
367+ BUILTIN_FUNC(OP_ZORBA_SINGLE_ARRAY_LOOKUP_2),
368+ arg, fo->get_arg(1));
369+ }
370+
371+ return NULL;
372+ }
373+
374+ default:
375+ {
376+ break;
377+ }
378+ }
379+
380 break;
381 }
382 case cast_expr_kind:
383
384=== modified file 'src/compiler/rewriter/tools/expr_tools.cpp'
385--- src/compiler/rewriter/tools/expr_tools.cpp 2013-05-24 16:34:11 +0000
386+++ src/compiler/rewriter/tools/expr_tools.cpp 2013-08-16 17:18:24 +0000
387@@ -394,7 +394,7 @@
388 const dynamic_function_invocation_expr* ve =
389 static_cast<const dynamic_function_invocation_expr*>(view);
390
391- if (!match_exact(qe->get_function(), ve->get_function(), subst))
392+ if (!match_exact(qe->get_input(), ve->get_input(), subst))
393 return false;
394
395 if (qe->get_args().size() != ve->get_args().size())
396
397=== modified file 'src/compiler/translator/translator.cpp'
398--- src/compiler/translator/translator.cpp 2013-08-12 09:28:02 +0000
399+++ src/compiler/translator/translator.cpp 2013-08-16 17:18:24 +0000
400@@ -10835,38 +10835,29 @@
401
402 expr* arrayExpr = sourceClause->get_expr();
403 expr* selectorExpr = static_cast<json_array_expr*>(predExpr)->get_expr();
404+ expr* accessorExpr;
405
406 xqtref_t domainType = arrayExpr->get_return_type();
407
408+ std::vector<expr*> args(2);
409+ args[0] = arrayExpr;
410+ args[1] = selectorExpr;
411+
412 if (domainType->max_card() > 1)
413 {
414- expr* flworVarExpr =
415- CREATE(wrapper)(theRootSctx, theUDF, loc, sourceClause->get_var());
416-
417- std::vector<expr*> args(2);
418- args[0] = flworVarExpr;
419- args[1] = selectorExpr;
420-
421- expr* accessorExpr =
422- generate_fn_body(BUILTIN_FUNC(OP_ZORBA_ARRAY_MEMBER_2), args, loc);
423-
424- flworExpr->set_return_expr(accessorExpr);
425-
426- push_nodestack(flworExpr);
427+ accessorExpr =
428+ generate_fn_body(BUILTIN_FUNC(OP_ZORBA_MULTI_ARRAY_LOOKUP_2), args, loc);
429+
430 pop_scope();
431 }
432 else
433 {
434- std::vector<expr*> args(2);
435- args[0] = arrayExpr;
436- args[1] = selectorExpr;
437-
438- expr* accessorExpr =
439- generate_fn_body(BUILTIN_FUNC(OP_ZORBA_ARRAY_MEMBER_2), args, loc);
440-
441- push_nodestack(accessorExpr);
442+ accessorExpr =
443+ generate_fn_body(BUILTIN_FUNC(OP_ZORBA_SINGLE_ARRAY_LOOKUP_2), args, loc);
444 }
445
446+ push_nodestack(accessorExpr);
447+
448 return;
449 }
450
451@@ -10896,23 +10887,22 @@
452 {
453 expr* sourceExpr = sourceClause->get_expr();
454
455- if (sourceExpr->get_function_kind() == FunctionConsts::FN_JSONIQ_MEMBERS_1)
456+ FunctionConsts::FunctionKind fkind = sourceExpr->get_function_kind();
457+
458+ if (fkind == FunctionConsts::OP_ZORBA_MEMBERS_1)
459 {
460 expr* arrayExpr = static_cast<fo_expr*>(sourceExpr)->get_arg(0);
461
462- if (arrayExpr->get_return_type()->max_card() <= 1)
463- {
464- fo_expr* pointExpr =
465- CREATE(fo)(sourceExpr->get_sctx(), theUDF, sourceExpr->get_loc(),
466- BUILTIN_FUNC(OP_ZORBA_ARRAY_MEMBER_2),
467- arrayExpr,
468- predExpr);
469+ fo_expr* pointExpr =
470+ CREATE(fo)(sourceExpr->get_sctx(), theUDF, sourceExpr->get_loc(),
471+ BUILTIN_FUNC(OP_ZORBA_SINGLE_ARRAY_LOOKUP_2),
472+ arrayExpr,
473+ predExpr);
474
475- push_nodestack(pointExpr);
476- pop_scope();
477+ push_nodestack(pointExpr);
478+ pop_scope();
479
480- return;
481- }
482+ return;
483 }
484
485 fo_expr* pointExpr =
486@@ -11084,45 +11074,20 @@
487
488 expr* selectExpr = pop_nodestack();
489 expr* objectExpr = pop_nodestack();
490+ expr* accessorExpr;
491
492 assert(selectExpr && objectExpr);
493
494 xqtref_t domainType = objectExpr->get_return_type();
495
496- if (domainType->max_card() > 1)
497- {
498- flwor_expr* flworExpr = wrap_expr_in_flwor(objectExpr, false);
499-
500- for_clause* fc = static_cast<for_clause*>(flworExpr->get_clause(0));
501-
502- expr* flworVarExpr = CREATE(wrapper)(theRootSctx, theUDF, loc, fc->get_var());
503-
504- std::vector<expr*> args(2);
505- args[0] = flworVarExpr;
506- args[1] = selectExpr;
507-
508- expr* accessorExpr =
509- generate_fn_body(BUILTIN_FUNC(OP_ZORBA_OBJECT_VALUE_2), args, loc);
510-
511- assert(accessorExpr->get_expr_kind() == fo_expr_kind);
512-
513- flworExpr->set_return_expr(accessorExpr);
514-
515- pop_scope();
516-
517- push_nodestack(flworExpr);
518- }
519- else
520- {
521- std::vector<expr*> args(2);
522- args[0] = objectExpr;
523- args[1] = selectExpr;
524-
525- expr* accessorExpr =
526- generate_fn_body(BUILTIN_FUNC(OP_ZORBA_OBJECT_VALUE_2), args, loc);
527-
528- push_nodestack(accessorExpr);
529- }
530+ std::vector<expr*> args(2);
531+ args[0] = objectExpr;
532+ args[1] = selectExpr;
533+
534+ accessorExpr =
535+ generate_fn_body(BUILTIN_FUNC(OP_ZORBA_MULTI_OBJECT_LOOKUP_2), args, loc);
536+
537+ push_nodestack(accessorExpr);
538 }
539
540
541@@ -12221,26 +12186,34 @@
542
543 break;
544 }
545- case FunctionConsts::OP_ZORBA_OBJECT_VALUE_2:
546+ case FunctionConsts::OP_ZORBA_MULTI_OBJECT_LOOKUP_2:
547+ {
548+ if (arguments[0]->get_return_type()->max_card() <= 1)
549+ f = BUILTIN_FUNC(OP_ZORBA_SINGLE_OBJECT_LOOKUP_2);
550+
551+ // fall through
552+ }
553+ case FunctionConsts::OP_ZORBA_SINGLE_OBJECT_LOOKUP_2:
554 {
555 arguments[1] =
556 create_cast_expr(loc, arguments[1], theRTM.STRING_TYPE_ONE, true, true);
557
558 break;
559 }
560- case FunctionConsts::OP_ZORBA_ARRAY_MEMBER_2:
561+ case FunctionConsts::OP_ZORBA_MULTI_ARRAY_LOOKUP_2:
562+ {
563+ if (arguments[0]->get_return_type()->max_card() <= 1)
564+ f = BUILTIN_FUNC(OP_ZORBA_SINGLE_ARRAY_LOOKUP_2);
565+
566+ // fall through
567+ }
568+ case FunctionConsts::OP_ZORBA_SINGLE_ARRAY_LOOKUP_2:
569 {
570 arguments[1] =
571 create_cast_expr(loc, arguments[1], theRTM.INTEGER_TYPE_ONE, true, true);
572
573 break;
574 }
575- case FunctionConsts::OP_ZORBA_JSON_ITEM_ACCESSOR_2:
576- {
577- arguments[1] = wrap_in_atomization(arguments[1]);
578-
579- break;
580- }
581 case FunctionConsts::FN_JSONIQ_KEYS_1:
582 {
583 if (arguments[0]->get_return_type()->max_card() <= 1)
584@@ -12513,79 +12486,64 @@
585 }
586 }
587
588- bool isJSON =
589- (TypeOps::is_subtype(tm, *srcType, *theRTM.JSON_ITEM_TYPE_STAR) && numArgs <= 1);
590-
591- bool implicitIter =
592- (srcType->get_quantifier() != TypeConstants::QUANT_ONE &&
593- (srcType->max_card() > 1 || !isJSON));
594-
595- flwor_expr* flworExpr;
596-
597- // Implementing implicit iteration over the sequence returned by the source expr
598- if (implicitIter)
599- {
600- flworExpr = wrap_expr_in_flwor(sourceExpr, false);
601-
602- for_clause* fc = static_cast<for_clause*>(flworExpr->get_clause(0));
603-
604- sourceExpr = CREATE(wrapper)(theRootSctx, theUDF, loc, fc->get_var());
605- }
606+ function* func;
607+ expr* accessorExpr;
608
609 // Note: if numArgs > 1 and the input contains a json item, DynamicFnCallIterator
610 // will raise an error. However, no error will be raised if the input is empty.
611- if (isJSON)
612- {
613- function* func;
614- expr* accessorExpr;
615-
616- if (numArgs == 1)
617- {
618- if (TypeOps::is_subtype(tm, *srcType, *theRTM.JSON_ARRAY_TYPE_STAR))
619- {
620- func = BUILTIN_FUNC(OP_ZORBA_ARRAY_MEMBER_2);
621- }
622- else if (TypeOps::is_subtype(tm, *srcType, *theRTM.JSON_OBJECT_TYPE_STAR))
623- {
624- func = BUILTIN_FUNC(OP_ZORBA_OBJECT_VALUE_2);
625- }
626- else
627- {
628- func = BUILTIN_FUNC(OP_ZORBA_JSON_ITEM_ACCESSOR_2);
629- }
630- }
631- else
632- {
633- if (TypeOps::is_subtype(tm, *srcType, *theRTM.JSON_ARRAY_TYPE_STAR))
634- {
635- func = BUILTIN_FUNC(OP_ZORBA_MEMBERS_1);
636- }
637- else if (TypeOps::is_subtype(tm, *srcType, *theRTM.JSON_OBJECT_TYPE_STAR))
638- {
639- func = BUILTIN_FUNC(OP_ZORBA_KEYS_1);
640- }
641- else
642- {
643- func = BUILTIN_FUNC(OP_ZORBA_JSON_ITEM_ACCESSOR_1);
644- }
645- }
646-
647- arguments.insert(arguments.begin(), sourceExpr);
648-
649- accessorExpr = generate_fn_body(func, arguments, loc);
650-
651- if (implicitIter)
652- {
653- flworExpr->set_return_expr(accessorExpr);
654-
655- pop_scope();
656-
657- push_nodestack(flworExpr);
658- }
659- else
660- {
661- push_nodestack(accessorExpr);
662- }
663+
664+ if (TypeOps::is_subtype(tm, *srcType, *theRTM.JSON_ARRAY_TYPE_STAR) &&
665+ numArgs <= 1)
666+ {
667+ arguments.insert(arguments.begin(), sourceExpr);
668+
669+ if (numArgs == 1)
670+ {
671+ func = BUILTIN_FUNC(OP_ZORBA_MULTI_ARRAY_LOOKUP_2);
672+ }
673+ else // numArgs == 0
674+ {
675+ func = BUILTIN_FUNC(FN_JSONIQ_MEMBERS_1);
676+ }
677+
678+ accessorExpr = generate_fn_body(func, arguments, loc);
679+
680+ push_nodestack(accessorExpr);
681+ }
682+ else if (TypeOps::is_subtype(tm, *srcType, *theRTM.JSON_OBJECT_TYPE_STAR) &&
683+ numArgs <= 1)
684+ {
685+ arguments.insert(arguments.begin(), sourceExpr);
686+
687+ if (numArgs == 1)
688+ {
689+ func = BUILTIN_FUNC(OP_ZORBA_MULTI_OBJECT_LOOKUP_2);
690+ }
691+ else
692+ {
693+ func = BUILTIN_FUNC(FN_JSONIQ_KEYS_1);
694+ }
695+
696+ accessorExpr = generate_fn_body(func, arguments, loc);
697+
698+ push_nodestack(accessorExpr);
699+ }
700+ else if (numArgs > 0)
701+ {
702+ flwor_expr* flworExpr = wrap_expr_in_flwor(sourceExpr, false);
703+
704+ for_clause* fc = static_cast<for_clause*>(flworExpr->get_clause(0));
705+
706+ sourceExpr = CREATE(wrapper)(theRootSctx, theUDF, loc, fc->get_var());
707+
708+ expr* dynFuncInvocation =
709+ CREATE(dynamic_function_invocation)(theRootSctx, theUDF, loc,
710+ sourceExpr,
711+ arguments);
712+
713+ flworExpr->set_return_expr(dynFuncInvocation);
714+ pop_scope();
715+ push_nodestack(flworExpr);
716 }
717 else
718 {
719@@ -12593,16 +12551,7 @@
720 CREATE(dynamic_function_invocation)(theRootSctx, theUDF, loc,
721 sourceExpr,
722 arguments);
723- if (implicitIter)
724- {
725- flworExpr->set_return_expr(dynFuncInvocation);
726- pop_scope();
727- push_nodestack(flworExpr);
728- }
729- else
730- {
731- push_nodestack(dynFuncInvocation);
732- }
733+ push_nodestack(dynFuncInvocation);
734 }
735 }
736
737
738=== modified file 'src/functions/func_jsoniq_functions_impl.cpp'
739--- src/functions/func_jsoniq_functions_impl.cpp 2013-08-14 15:16:42 +0000
740+++ src/functions/func_jsoniq_functions_impl.cpp 2013-08-16 17:18:24 +0000
741@@ -58,19 +58,33 @@
742 /*******************************************************************************
743
744 ********************************************************************************/
745-xqtref_t op_zorba_json_item_accessor::getReturnType(const fo_expr* caller) const
746-{
747- if (caller->get_arg(0)->get_return_type()->max_card() == 0)
748- return GENV_TYPESYSTEM.EMPTY_TYPE;
749-
750- return theSignature.returnType();
751-}
752-
753-
754-/*******************************************************************************
755-
756-********************************************************************************/
757 PlanIter_t fn_jsoniq_keys::codegen(
758+ CompilerCB*,
759+ static_context* sctx,
760+ const QueryLoc& loc,
761+ std::vector<PlanIter_t>& argv,
762+ expr& arg) const
763+{
764+ if (arg.get_return_type()->max_card() <= 1)
765+ return new SingleObjectKeysIterator(sctx, loc, argv[0]);
766+
767+ return new MultiObjectKeysIterator(sctx, loc, argv[0]);
768+}
769+
770+
771+/*******************************************************************************
772+
773+********************************************************************************/
774+xqtref_t op_zorba_multi_object_lookup::getReturnType(const fo_expr* caller) const
775+{
776+ if (caller->get_arg(0)->get_return_type()->max_card() == 0)
777+ return GENV_TYPESYSTEM.EMPTY_TYPE;
778+
779+ return theSignature.returnType();
780+}
781+
782+
783+PlanIter_t op_zorba_multi_object_lookup::codegen(
784 CompilerCB*,
785 static_context* sctx,
786 const QueryLoc& loc,
787@@ -78,16 +92,16 @@
788 expr& arg) const
789 {
790 if (arg.get_return_type()->max_card() <= 1)
791- return new SingleObjectNamesIterator(sctx, loc, argv[0]);
792+ return new SingleArrayLookupIterator(sctx, loc, argv[0], argv[1]);
793
794- return new JSONObjectNamesIterator(sctx, loc, argv[0]);
795+ return new MultiObjectLookupIterator(sctx, loc, argv[0], argv[1]);
796 }
797
798
799 /*******************************************************************************
800
801 ********************************************************************************/
802-xqtref_t op_zorba_object_value::getReturnType(const fo_expr* caller) const
803+xqtref_t op_zorba_single_object_lookup::getReturnType(const fo_expr* caller) const
804 {
805 if (caller->get_arg(0)->get_return_type()->max_card() == 0)
806 return GENV_TYPESYSTEM.EMPTY_TYPE;
807@@ -117,7 +131,49 @@
808 /*******************************************************************************
809
810 ********************************************************************************/
811-xqtref_t op_zorba_array_member::getReturnType(const fo_expr* caller) const
812+PlanIter_t fn_jsoniq_members::codegen(
813+ CompilerCB*,
814+ static_context* sctx,
815+ const QueryLoc& loc,
816+ std::vector<PlanIter_t>& argv,
817+ expr& arg) const
818+{
819+ if (arg.get_return_type()->max_card() <= 1)
820+ return new SingleArrayMembersIterator(sctx, loc, argv[0]);
821+
822+ return new MultiArrayMembersIterator(sctx, loc, argv[0]);
823+}
824+
825+
826+/*******************************************************************************
827+
828+********************************************************************************/
829+xqtref_t op_zorba_multi_array_lookup::getReturnType(const fo_expr* caller) const
830+{
831+ if (caller->get_arg(0)->get_return_type()->max_card() == 0)
832+ return GENV_TYPESYSTEM.EMPTY_TYPE;
833+
834+ return theSignature.returnType();
835+}
836+
837+
838+PlanIter_t op_zorba_multi_array_lookup::codegen(
839+ CompilerCB*,
840+ static_context* sctx,
841+ const QueryLoc& loc,
842+ std::vector<PlanIter_t>& argv,
843+ expr& arg) const
844+{
845+ if (arg.get_return_type()->max_card() <= 1)
846+ return new SingleArrayLookupIterator(sctx, loc, argv[0], argv[1]);
847+
848+ return new MultiArrayLookupIterator(sctx, loc, argv[0], argv[1]);
849+}
850+
851+/*******************************************************************************
852+
853+********************************************************************************/
854+xqtref_t op_zorba_single_array_lookup::getReturnType(const fo_expr* caller) const
855 {
856 if (caller->get_arg(0)->get_return_type()->max_card() == 0)
857 return GENV_TYPESYSTEM.EMPTY_TYPE;
858@@ -141,23 +197,6 @@
859 /*******************************************************************************
860
861 ********************************************************************************/
862-PlanIter_t fn_jsoniq_members::codegen(
863- CompilerCB*,
864- static_context* sctx,
865- const QueryLoc& loc,
866- std::vector<PlanIter_t>& argv,
867- expr& arg) const
868-{
869- if (arg.get_return_type()->max_card() <= 1)
870- return new SingleArrayMembersIterator(sctx, loc, argv[0]);
871-
872- return new JSONArrayMembersIterator(sctx, loc, argv[0]);
873-}
874-
875-
876-/*******************************************************************************
877-
878-********************************************************************************/
879 bool op_zorba_json_array_insert::mustCopyInputNodes(expr* fo, csize producer) const
880 {
881 static_context* sctx = fo->get_sctx();
882
883=== modified file 'src/functions/pregenerated/func_jsoniq_functions.cpp'
884--- src/functions/pregenerated/func_jsoniq_functions.cpp 2013-08-14 15:16:42 +0000
885+++ src/functions/pregenerated/func_jsoniq_functions.cpp 2013-08-16 17:18:24 +0000
886@@ -52,16 +52,6 @@
887 }
888
889
890-PlanIter_t op_zorba_json_item_accessor::codegen(
891- CompilerCB*,
892- static_context* sctx,
893- const QueryLoc& loc,
894- std::vector<PlanIter_t>& argv,
895- expr& ann) const
896-{
897- return new JSONItemAccessorIterator(sctx, loc, argv);
898-}
899-
900
901 PlanIter_t op_zorba_keys::codegen(
902 CompilerCB*,
903@@ -70,17 +60,18 @@
904 std::vector<PlanIter_t>& argv,
905 expr& ann) const
906 {
907- return new SingleObjectNamesIterator(sctx, loc, argv[0]);
908+ return new SingleObjectKeysIterator(sctx, loc, argv[0]);
909 }
910
911-PlanIter_t op_zorba_object_value::codegen(
912+
913+PlanIter_t op_zorba_single_object_lookup::codegen(
914 CompilerCB*,
915 static_context* sctx,
916 const QueryLoc& loc,
917 std::vector<PlanIter_t>& argv,
918 expr& ann) const
919 {
920- return new JSONObjectValueIterator(sctx, loc, argv[0], argv[1]);
921+ return new SingleObjectLookupIterator(sctx, loc, argv[0], argv[1]);
922 }
923
924 PlanIter_t fn_jsoniq_project::codegen(
925@@ -103,16 +94,6 @@
926 return new JSONObjectTrimIterator(sctx, loc, argv[0], argv[1]);
927 }
928
929-PlanIter_t op_zorba_array_member::codegen(
930- CompilerCB*,
931- static_context* sctx,
932- const QueryLoc& loc,
933- std::vector<PlanIter_t>& argv,
934- expr& ann) const
935-{
936- return new JSONArrayMemberIterator(sctx, loc, argv[0], argv[1]);
937-}
938-
939
940 PlanIter_t op_zorba_members::codegen(
941 CompilerCB*,
942@@ -124,6 +105,17 @@
943 return new SingleArrayMembersIterator(sctx, loc, argv[0]);
944 }
945
946+
947+PlanIter_t op_zorba_single_array_lookup::codegen(
948+ CompilerCB*,
949+ static_context* sctx,
950+ const QueryLoc& loc,
951+ std::vector<PlanIter_t>& argv,
952+ expr& ann) const
953+{
954+ return new SingleArrayLookupIterator(sctx, loc, argv[0], argv[1]);
955+}
956+
957 PlanIter_t fn_jsoniq_size::codegen(
958 CompilerCB*,
959 static_context* sctx,
960@@ -295,31 +287,6 @@
961
962
963 {
964- DECL_WITH_KIND(sctx, op_zorba_json_item_accessor,
965- (createQName("http://zorba.io/internal/zorba-ops","","json-item-accessor"),
966- GENV_TYPESYSTEM.ITEM_TYPE_QUESTION,
967- GENV_TYPESYSTEM.ITEM_TYPE_STAR),
968- FunctionConsts::OP_ZORBA_JSON_ITEM_ACCESSOR_1);
969-
970- }
971-
972-
973-
974-
975- {
976- DECL_WITH_KIND(sctx, op_zorba_json_item_accessor,
977- (createQName("http://zorba.io/internal/zorba-ops","","json-item-accessor"),
978- GENV_TYPESYSTEM.ITEM_TYPE_QUESTION,
979- GENV_TYPESYSTEM.ITEM_TYPE_QUESTION,
980- GENV_TYPESYSTEM.ITEM_TYPE_QUESTION),
981- FunctionConsts::OP_ZORBA_JSON_ITEM_ACCESSOR_2);
982-
983- }
984-
985-
986-
987-
988- {
989 DECL_WITH_KIND(sctx, fn_jsoniq_keys,
990 (createQName("http://jsoniq.org/functions","","keys"),
991 GENV_TYPESYSTEM.ITEM_TYPE_STAR,
992@@ -344,12 +311,25 @@
993
994
995 {
996- DECL_WITH_KIND(sctx, op_zorba_object_value,
997- (createQName("http://zorba.io/internal/zorba-ops","","object-value"),
998+ DECL_WITH_KIND(sctx, op_zorba_multi_object_lookup,
999+ (createQName("http://zorba.io/internal/zorba-ops","","multi-object-lookup"),
1000+ GENV_TYPESYSTEM.ITEM_TYPE_STAR,
1001+ GENV_TYPESYSTEM.ITEM_TYPE_QUESTION,
1002+ GENV_TYPESYSTEM.ITEM_TYPE_STAR),
1003+ FunctionConsts::OP_ZORBA_MULTI_OBJECT_LOOKUP_2);
1004+
1005+ }
1006+
1007+
1008+
1009+
1010+ {
1011+ DECL_WITH_KIND(sctx, op_zorba_single_object_lookup,
1012+ (createQName("http://zorba.io/internal/zorba-ops","","single-object-lookup"),
1013 GENV_TYPESYSTEM.ITEM_TYPE_QUESTION,
1014 GENV_TYPESYSTEM.ITEM_TYPE_QUESTION,
1015 GENV_TYPESYSTEM.ITEM_TYPE_QUESTION),
1016- FunctionConsts::OP_ZORBA_OBJECT_VALUE_2);
1017+ FunctionConsts::OP_ZORBA_SINGLE_OBJECT_LOOKUP_2);
1018
1019 }
1020
1021@@ -383,19 +363,6 @@
1022
1023
1024 {
1025- DECL_WITH_KIND(sctx, op_zorba_array_member,
1026- (createQName("http://zorba.io/internal/zorba-ops","","array-member"),
1027- GENV_TYPESYSTEM.ITEM_TYPE_QUESTION,
1028- GENV_TYPESYSTEM.ITEM_TYPE_QUESTION,
1029- GENV_TYPESYSTEM.ITEM_TYPE_QUESTION),
1030- FunctionConsts::OP_ZORBA_ARRAY_MEMBER_2);
1031-
1032- }
1033-
1034-
1035-
1036-
1037- {
1038 DECL_WITH_KIND(sctx, fn_jsoniq_members,
1039 (createQName("http://jsoniq.org/functions","","members"),
1040 GENV_TYPESYSTEM.ITEM_TYPE_STAR,
1041@@ -420,6 +387,32 @@
1042
1043
1044 {
1045+ DECL_WITH_KIND(sctx, op_zorba_multi_array_lookup,
1046+ (createQName("http://zorba.io/internal/zorba-ops","","multi-array-lookup"),
1047+ GENV_TYPESYSTEM.ITEM_TYPE_STAR,
1048+ GENV_TYPESYSTEM.ITEM_TYPE_QUESTION,
1049+ GENV_TYPESYSTEM.ITEM_TYPE_STAR),
1050+ FunctionConsts::OP_ZORBA_MULTI_ARRAY_LOOKUP_2);
1051+
1052+ }
1053+
1054+
1055+
1056+
1057+ {
1058+ DECL_WITH_KIND(sctx, op_zorba_single_array_lookup,
1059+ (createQName("http://zorba.io/internal/zorba-ops","","single-array-lookup"),
1060+ GENV_TYPESYSTEM.ITEM_TYPE_QUESTION,
1061+ GENV_TYPESYSTEM.ITEM_TYPE_QUESTION,
1062+ GENV_TYPESYSTEM.ITEM_TYPE_QUESTION),
1063+ FunctionConsts::OP_ZORBA_SINGLE_ARRAY_LOOKUP_2);
1064+
1065+ }
1066+
1067+
1068+
1069+
1070+ {
1071 DECL_WITH_KIND(sctx, fn_jsoniq_size,
1072 (createQName("http://jsoniq.org/functions","","size"),
1073 GENV_TYPESYSTEM.JSON_ARRAY_TYPE_QUESTION,
1074
1075=== modified file 'src/functions/pregenerated/func_jsoniq_functions.h'
1076--- src/functions/pregenerated/func_jsoniq_functions.h 2013-08-14 15:16:42 +0000
1077+++ src/functions/pregenerated/func_jsoniq_functions.h 2013-08-16 17:18:24 +0000
1078@@ -95,27 +95,6 @@
1079 };
1080
1081
1082-//op-zorba:json-item-accessor
1083-class op_zorba_json_item_accessor : public function
1084-{
1085-public:
1086- op_zorba_json_item_accessor(const signature& sig, FunctionConsts::FunctionKind kind)
1087- :
1088- function(sig, kind)
1089- {
1090-
1091- }
1092-
1093- xqtref_t getReturnType(const fo_expr* caller) const;
1094-
1095- bool propagatesInputNodes(expr* fo, csize producer) const { return producer == 0; }
1096-
1097- bool mustCopyInputNodes(expr* fo, csize producer) const { return false; }
1098-
1099- CODEGEN_DECL();
1100-};
1101-
1102-
1103 //fn-jsoniq:keys
1104 class fn_jsoniq_keys : public function
1105 {
1106@@ -156,11 +135,32 @@
1107 };
1108
1109
1110-//op-zorba:object-value
1111-class op_zorba_object_value : public function
1112-{
1113-public:
1114- op_zorba_object_value(const signature& sig, FunctionConsts::FunctionKind kind)
1115+//op-zorba:multi-object-lookup
1116+class op_zorba_multi_object_lookup : public function
1117+{
1118+public:
1119+ op_zorba_multi_object_lookup(const signature& sig, FunctionConsts::FunctionKind kind)
1120+ :
1121+ function(sig, kind)
1122+ {
1123+
1124+ }
1125+
1126+ xqtref_t getReturnType(const fo_expr* caller) const;
1127+
1128+ bool propagatesInputNodes(expr* fo, csize producer) const { return producer == 0; }
1129+
1130+ bool mustCopyInputNodes(expr* fo, csize producer) const { return false; }
1131+
1132+ CODEGEN_DECL();
1133+};
1134+
1135+
1136+//op-zorba:single-object-lookup
1137+class op_zorba_single_object_lookup : public function
1138+{
1139+public:
1140+ op_zorba_single_object_lookup(const signature& sig, FunctionConsts::FunctionKind kind)
1141 :
1142 function(sig, kind)
1143 {
1144@@ -223,27 +223,6 @@
1145 };
1146
1147
1148-//op-zorba:array-member
1149-class op_zorba_array_member : public function
1150-{
1151-public:
1152- op_zorba_array_member(const signature& sig, FunctionConsts::FunctionKind kind)
1153- :
1154- function(sig, kind)
1155- {
1156-
1157- }
1158-
1159- xqtref_t getReturnType(const fo_expr* caller) const;
1160-
1161- bool propagatesInputNodes(expr* fo, csize producer) const { return producer == 0; }
1162-
1163- bool mustCopyInputNodes(expr* fo, csize producer) const { return false; }
1164-
1165- CODEGEN_DECL();
1166-};
1167-
1168-
1169 //fn-jsoniq:members
1170 class fn_jsoniq_members : public function
1171 {
1172@@ -284,6 +263,50 @@
1173 };
1174
1175
1176+//op-zorba:multi-array-lookup
1177+class op_zorba_multi_array_lookup : public function
1178+{
1179+public:
1180+ op_zorba_multi_array_lookup(const signature& sig, FunctionConsts::FunctionKind kind)
1181+ :
1182+ function(sig, kind)
1183+ {
1184+
1185+ }
1186+
1187+ xqtref_t getReturnType(const fo_expr* caller) const;
1188+
1189+ bool propagatesInputNodes(expr* fo, csize producer) const { return producer == 0; }
1190+
1191+ bool mustCopyInputNodes(expr* fo, csize producer) const { return false; }
1192+
1193+ bool isMap(csize producer) const { return producer == 0; }
1194+
1195+ CODEGEN_DECL();
1196+};
1197+
1198+
1199+//op-zorba:single-array-lookup
1200+class op_zorba_single_array_lookup : public function
1201+{
1202+public:
1203+ op_zorba_single_array_lookup(const signature& sig, FunctionConsts::FunctionKind kind)
1204+ :
1205+ function(sig, kind)
1206+ {
1207+
1208+ }
1209+
1210+ xqtref_t getReturnType(const fo_expr* caller) const;
1211+
1212+ bool propagatesInputNodes(expr* fo, csize producer) const { return producer == 0; }
1213+
1214+ bool mustCopyInputNodes(expr* fo, csize producer) const { return false; }
1215+
1216+ CODEGEN_DECL();
1217+};
1218+
1219+
1220 //fn-jsoniq:size
1221 class fn_jsoniq_size : public function
1222 {
1223
1224=== modified file 'src/functions/pregenerated/function_enum.h'
1225--- src/functions/pregenerated/function_enum.h 2013-08-14 15:16:42 +0000
1226+++ src/functions/pregenerated/function_enum.h 2013-08-16 17:18:24 +0000
1227@@ -258,16 +258,16 @@
1228 FN_JSONIQ_ENCODE_FOR_ROUNDTRIP_2,
1229 FN_JSONIQ_PARSE_JSON_1,
1230 FN_JSONIQ_PARSE_JSON_2,
1231- OP_ZORBA_JSON_ITEM_ACCESSOR_1,
1232- OP_ZORBA_JSON_ITEM_ACCESSOR_2,
1233 FN_JSONIQ_KEYS_1,
1234 OP_ZORBA_KEYS_1,
1235- OP_ZORBA_OBJECT_VALUE_2,
1236+ OP_ZORBA_MULTI_OBJECT_LOOKUP_2,
1237+ OP_ZORBA_SINGLE_OBJECT_LOOKUP_2,
1238 FN_JSONIQ_PROJECT_2,
1239 FN_JSONIQ_TRIM_2,
1240- OP_ZORBA_ARRAY_MEMBER_2,
1241 FN_JSONIQ_MEMBERS_1,
1242 OP_ZORBA_MEMBERS_1,
1243+ OP_ZORBA_MULTI_ARRAY_LOOKUP_2,
1244+ OP_ZORBA_SINGLE_ARRAY_LOOKUP_2,
1245 FN_JSONIQ_SIZE_1,
1246 FN_JSONIQ_FLATTEN_1,
1247 FN_JSONIQ_NULL_0,
1248
1249=== modified file 'src/runtime/base/plan_iterator.h'
1250--- src/runtime/base/plan_iterator.h 2013-07-15 10:32:25 +0000
1251+++ src/runtime/base/plan_iterator.h 2013-08-16 17:18:24 +0000
1252@@ -178,13 +178,16 @@
1253 {
1254 }
1255
1256+ /*
1257+ * It is invoked by the closeImpl() method of each iterator.
1258+ */
1259 ~PlanIteratorState() {}
1260
1261 void setDuffsLine(uint32_t v) { theDuffsLine = v; }
1262
1263 uint32_t getDuffsLine() const { return theDuffsLine; }
1264
1265- /**
1266+ /*
1267 * Initialize the current state object.
1268 *
1269 * This method is invoked be the openImpl() method of the associated iterator
1270@@ -201,7 +204,7 @@
1271 theDuffsLine = DUFFS_ALLOCATE_RESOURCES;
1272 }
1273
1274- /**
1275+ /*
1276 * Reset the current state object.
1277 *
1278 * This method is invoked by the resetImpl() method of the associated iterator.
1279
1280=== modified file 'src/runtime/hof/dynamic_fncall_iterator.cpp'
1281--- src/runtime/hof/dynamic_fncall_iterator.cpp 2013-06-05 07:00:21 +0000
1282+++ src/runtime/hof/dynamic_fncall_iterator.cpp 2013-08-16 17:18:24 +0000
1283@@ -47,13 +47,15 @@
1284
1285 NOARY_ACCEPT(ArgumentPlaceholderIterator)
1286
1287-SERIALIZABLE_CLASS_VERSIONS(DynamicFnCallIterator)
1288+SERIALIZABLE_CLASS_VERSIONS(SingleDynamicFnCallIterator)
1289+
1290+SERIALIZABLE_CLASS_VERSIONS(MultiDynamicFnCallIterator)
1291
1292
1293 /*******************************************************************************
1294
1295 ********************************************************************************/
1296-DynamicFnCallIteratorState::DynamicFnCallIteratorState()
1297+SingleDynamicFnCallIteratorState::SingleDynamicFnCallIteratorState()
1298 {
1299 }
1300
1301@@ -61,7 +63,7 @@
1302 /*******************************************************************************
1303
1304 ********************************************************************************/
1305-DynamicFnCallIteratorState::~DynamicFnCallIteratorState()
1306+SingleDynamicFnCallIteratorState::~SingleDynamicFnCallIteratorState()
1307 {
1308 if (theIsOpen)
1309 {
1310@@ -73,7 +75,7 @@
1311 /*******************************************************************************
1312
1313 ********************************************************************************/
1314-void DynamicFnCallIteratorState::init(PlanState& planState)
1315+void SingleDynamicFnCallIteratorState::init(PlanState& planState)
1316 {
1317 PlanIteratorState::init(planState);
1318 thePlanState = &planState;
1319@@ -85,12 +87,13 @@
1320 /*******************************************************************************
1321
1322 ********************************************************************************/
1323-void DynamicFnCallIteratorState::reset(PlanState& planState)
1324+void SingleDynamicFnCallIteratorState::reset(PlanState& planState)
1325 {
1326 PlanIteratorState::reset(planState);
1327 if (theIsOpen)
1328 {
1329- thePlan->reset(planState);
1330+ thePlan->close(planState);
1331+ theIsOpen = false;
1332 }
1333 }
1334
1335@@ -98,10 +101,11 @@
1336 /*******************************************************************************
1337
1338 ********************************************************************************/
1339-void DynamicFnCallIterator::serialize(::zorba::serialization::Archiver& ar)
1340+void SingleDynamicFnCallIterator::serialize(::zorba::serialization::Archiver& ar)
1341 {
1342 serialize_baseclass(ar,
1343- (NaryBaseIterator<DynamicFnCallIterator, DynamicFnCallIteratorState>*)this);
1344+ (NaryBaseIterator<SingleDynamicFnCallIterator,
1345+ SingleDynamicFnCallIteratorState>*)this);
1346
1347 ar & theIsPartialApply;
1348 }
1349@@ -110,10 +114,11 @@
1350 /*******************************************************************************
1351
1352 ********************************************************************************/
1353-uint32_t DynamicFnCallIterator::getStateSizeOfSubtree() const
1354+uint32_t SingleDynamicFnCallIterator::getStateSizeOfSubtree() const
1355 {
1356- uint32_t size = NaryBaseIterator<DynamicFnCallIterator, DynamicFnCallIteratorState>::
1357- getStateSizeOfSubtree();
1358+ uint32_t size =
1359+ NaryBaseIterator<SingleDynamicFnCallIterator, SingleDynamicFnCallIteratorState>::
1360+ getStateSizeOfSubtree();
1361
1362 return size + sizeof(UDFunctionCallIteratorState);
1363 }
1364@@ -122,16 +127,16 @@
1365 /*******************************************************************************
1366
1367 ********************************************************************************/
1368-void DynamicFnCallIterator::openImpl(PlanState& planState, uint32_t& offset)
1369+void SingleDynamicFnCallIterator::openImpl(PlanState& planState, uint32_t& offset)
1370 {
1371- StateTraitsImpl<DynamicFnCallIteratorState>::
1372+ StateTraitsImpl<SingleDynamicFnCallIteratorState>::
1373 createState(planState, theStateOffset, offset);
1374
1375- StateTraitsImpl<DynamicFnCallIteratorState>::
1376+ StateTraitsImpl<SingleDynamicFnCallIteratorState>::
1377 initState(planState, theStateOffset);
1378
1379- DynamicFnCallIteratorState* state =
1380- StateTraitsImpl<DynamicFnCallIteratorState>::
1381+ SingleDynamicFnCallIteratorState* state =
1382+ StateTraitsImpl<SingleDynamicFnCallIteratorState>::
1383 getState(planState, theStateOffset);
1384
1385 state->theUDFStateOffset = offset;
1386@@ -150,27 +155,7 @@
1387 /*******************************************************************************
1388
1389 ********************************************************************************/
1390-void DynamicFnCallIterator::resetImpl(PlanState& planState) const
1391-{
1392- DynamicFnCallIteratorState* state =
1393- StateTraitsImpl<DynamicFnCallIteratorState>::
1394- getState(planState, theStateOffset);
1395-
1396- if (state->theIsOpen)
1397- {
1398- state->thePlan->close(planState);
1399- state->theIsOpen = false;
1400- }
1401-
1402- NaryBaseIterator<DynamicFnCallIterator, DynamicFnCallIteratorState>::
1403- resetImpl(planState);
1404-}
1405-
1406-
1407-/*******************************************************************************
1408-
1409-********************************************************************************/
1410-bool DynamicFnCallIterator::nextImpl(
1411+bool SingleDynamicFnCallIterator::nextImpl(
1412 store::Item_t& result,
1413 PlanState& planState) const
1414 {
1415@@ -181,11 +166,9 @@
1416 store::Item_t selectorItem2;
1417 store::Item_t selectorItem3;
1418
1419- TypeManager* tm = theSctx->get_typemanager();
1420-
1421- DynamicFnCallIteratorState* state;
1422-
1423- DEFAULT_STACK_INIT(DynamicFnCallIteratorState, state, planState);
1424+ SingleDynamicFnCallIteratorState* state;
1425+
1426+ DEFAULT_STACK_INIT(SingleDynamicFnCallIteratorState, state, planState);
1427
1428 // first child must return exactly one item which is a function item
1429 // otherwise XPTY0004 is raised
1430@@ -238,7 +221,9 @@
1431 fnItem->setArgumentValue(pos, value);
1432 }
1433 else
1434- pos++;
1435+ {
1436+ ++pos;
1437+ }
1438 }
1439
1440 result = fnItem;
1441@@ -371,24 +356,248 @@
1442 state->theIterator->close();
1443 }
1444 }
1445+#if 0
1446 else if (theSctx->language_kind() == StaticContextConsts::language_kind_xquery)
1447 {
1448- xqtref_t type = tm->create_value_type(targetItem);
1449+ xqtref_t type = theSctx->get_typemanager()->create_value_type(targetItem);
1450
1451 RAISE_ERROR(err::XPTY0004, loc,
1452 ERROR_PARAMS(ZED(XPTY0004_NoTypePromote_23),
1453 type->toSchemaString(),
1454 GENV_TYPESYSTEM.ANY_FUNCTION_TYPE_ONE->toSchemaString()));
1455 }
1456-
1457- STACK_END(state);
1458-};
1459-
1460-
1461-/*******************************************************************************
1462-
1463-********************************************************************************/
1464-NARY_ACCEPT(DynamicFnCallIterator)
1465+#endif
1466+
1467+ STACK_END(state);
1468+};
1469+
1470+
1471+/*******************************************************************************
1472+
1473+********************************************************************************/
1474+NARY_ACCEPT(SingleDynamicFnCallIterator)
1475+
1476+
1477+/*******************************************************************************
1478+
1479+********************************************************************************/
1480+MultiDynamicFnCallIteratorState::MultiDynamicFnCallIteratorState()
1481+{
1482+}
1483+
1484+
1485+/*******************************************************************************
1486+
1487+********************************************************************************/
1488+MultiDynamicFnCallIteratorState::~MultiDynamicFnCallIteratorState()
1489+{
1490+ if (theIsOpen)
1491+ {
1492+ thePlan->close(*thePlanState);
1493+ }
1494+}
1495+
1496+
1497+/*******************************************************************************
1498+
1499+********************************************************************************/
1500+void MultiDynamicFnCallIteratorState::init(PlanState& planState)
1501+{
1502+ PlanIteratorState::init(planState);
1503+ thePlanState = &planState;
1504+ thePlan = NULL;
1505+ theIsOpen = false;
1506+}
1507+
1508+
1509+/*******************************************************************************
1510+
1511+********************************************************************************/
1512+void MultiDynamicFnCallIteratorState::reset(PlanState& planState)
1513+{
1514+ PlanIteratorState::reset(planState);
1515+
1516+ if (theIsOpen)
1517+ {
1518+ thePlan->reset(planState);
1519+ }
1520+
1521+ if (theKeysSet.get())
1522+ {
1523+ theKeysSet->clear();
1524+ }
1525+}
1526+
1527+
1528+/*******************************************************************************
1529+
1530+********************************************************************************/
1531+void MultiDynamicFnCallIterator::serialize(::zorba::serialization::Archiver& ar)
1532+{
1533+ serialize_baseclass(ar,
1534+ (UnaryBaseIterator<MultiDynamicFnCallIterator, MultiDynamicFnCallIteratorState>*)this);
1535+}
1536+
1537+
1538+/*******************************************************************************
1539+
1540+********************************************************************************/
1541+uint32_t MultiDynamicFnCallIterator::getStateSizeOfSubtree() const
1542+{
1543+ uint32_t size =
1544+ UnaryBaseIterator<MultiDynamicFnCallIterator, MultiDynamicFnCallIteratorState>::
1545+ getStateSizeOfSubtree();
1546+
1547+ return size + sizeof(UDFunctionCallIteratorState);
1548+}
1549+
1550+
1551+/*******************************************************************************
1552+
1553+********************************************************************************/
1554+void MultiDynamicFnCallIterator::openImpl(PlanState& planState, uint32_t& offset)
1555+{
1556+ StateTraitsImpl<MultiDynamicFnCallIteratorState>::
1557+ createState(planState, theStateOffset, offset);
1558+
1559+ StateTraitsImpl<MultiDynamicFnCallIteratorState>::
1560+ initState(planState, theStateOffset);
1561+
1562+ MultiDynamicFnCallIteratorState* state =
1563+ StateTraitsImpl<MultiDynamicFnCallIteratorState>::
1564+ getState(planState, theStateOffset);
1565+
1566+ state->theUDFStateOffset = offset;
1567+
1568+ offset += sizeof(UDFunctionCallIteratorState);
1569+
1570+ theChild->open(planState, offset);
1571+}
1572+
1573+
1574+/*******************************************************************************
1575+
1576+********************************************************************************/
1577+void MultiDynamicFnCallIterator::resetImpl(PlanState& planState) const
1578+{
1579+ MultiDynamicFnCallIteratorState* state =
1580+ StateTraitsImpl<MultiDynamicFnCallIteratorState>::
1581+ getState(planState, theStateOffset);
1582+
1583+ if (state->theIsOpen)
1584+ {
1585+ state->thePlan->close(planState);
1586+ state->theIsOpen = false;
1587+ }
1588+
1589+ UnaryBaseIterator<MultiDynamicFnCallIterator, MultiDynamicFnCallIteratorState>::
1590+ resetImpl(planState);
1591+}
1592+
1593+
1594+/*******************************************************************************
1595+
1596+********************************************************************************/
1597+bool MultiDynamicFnCallIterator::nextImpl(
1598+ store::Item_t& result,
1599+ PlanState& planState) const
1600+{
1601+ store::Item_t item;
1602+ store::Item_t targetItem;
1603+ FunctionItem* fnItem;
1604+ zstring key;
1605+
1606+ MultiDynamicFnCallIteratorState* state;
1607+
1608+ DEFAULT_STACK_INIT(MultiDynamicFnCallIteratorState, state, planState);
1609+
1610+ while (consumeNext(targetItem, theChild, planState))
1611+ {
1612+ if (targetItem->isFunction())
1613+ {
1614+ fnItem = static_cast<FunctionItem*>(targetItem.getp());
1615+
1616+ if (fnItem->getArity() != 0)
1617+ {
1618+ RAISE_ERROR(err::XPTY0004, loc,
1619+ ERROR_PARAMS("dynamic function invoked with incorrect number of arguments"));
1620+ }
1621+
1622+ state->thePlan = fnItem->getImplementation(planState.theCompilerCB);
1623+
1624+ // must be opened after vars and params are set
1625+ state->thePlan->open(planState, state->theUDFStateOffset);
1626+ state->theIsOpen = true;
1627+
1628+ while (consumeNext(result, state->thePlan, planState))
1629+ {
1630+ STACK_PUSH(true, state);
1631+ }
1632+
1633+ // Need to close here early in case the plan is completely consumed.
1634+ // Otherwise, the plan would still be opened if destroyed from the
1635+ // state's destructor.
1636+ state->thePlan->close(planState);
1637+ state->theIsOpen = false;
1638+ } // if (targetItem->isFunction())
1639+
1640+ else if (targetItem->isJSONItem())
1641+ {
1642+ if (targetItem->isObject())
1643+ {
1644+ if (!state->theKeysSet.get())
1645+ state->theKeysSet.reset(new HashSet<zstring, HashMapZStringCmp>(64, false));
1646+
1647+ state->theIterator = targetItem->getObjectKeys();
1648+
1649+ state->theIterator->open();
1650+
1651+ while (state->theIterator->next(result))
1652+ {
1653+ key = result->getStringValue();
1654+
1655+ if (!state->theKeysSet->exists(key))
1656+ {
1657+ state->theKeysSet->insert(key);
1658+ STACK_PUSH(true, state);
1659+ }
1660+ }
1661+ }
1662+ else
1663+ {
1664+ state->theIterator = targetItem->getArrayValues();
1665+
1666+ state->theIterator->open();
1667+
1668+ while (state->theIterator->next(result))
1669+ {
1670+ STACK_PUSH(true, state);
1671+ }
1672+ }
1673+
1674+ state->theIterator->close();
1675+ } // jsoniq item
1676+#if 0
1677+ else if (theSctx->language_kind() == StaticContextConsts::language_kind_xquery)
1678+ {
1679+ xqtref_t type = theSctx->get_typemanager()->create_value_type(targetItem);
1680+
1681+ RAISE_ERROR(err::XPTY0004, loc,
1682+ ERROR_PARAMS(ZED(XPTY0004_NoTypePromote_23),
1683+ type->toSchemaString(),
1684+ GENV_TYPESYSTEM.ANY_FUNCTION_TYPE_ONE->toSchemaString()));
1685+ }
1686+#endif
1687+ }
1688+
1689+ STACK_END(state);
1690+};
1691+
1692+
1693+/*******************************************************************************
1694+
1695+********************************************************************************/
1696+UNARY_ACCEPT(MultiDynamicFnCallIterator)
1697
1698
1699 }//zorba namespace
1700
1701=== modified file 'src/runtime/hof/dynamic_fncall_iterator.h'
1702--- src/runtime/hof/dynamic_fncall_iterator.h 2013-06-15 02:57:08 +0000
1703+++ src/runtime/hof/dynamic_fncall_iterator.h 2013-08-16 17:18:24 +0000
1704@@ -20,9 +20,12 @@
1705 #include "common/shared_types.h"
1706
1707 #include "runtime/base/narybase.h"
1708-
1709+#include "runtime/base/unarybase.h"
1710 #include "runtime/base/noarybase.h"
1711
1712+#include "zorbautils/hashset.h"
1713+#include "zorbautils/hashmap_zstring.h"
1714+
1715
1716 namespace zorba
1717 {
1718@@ -60,7 +63,7 @@
1719 /*******************************************************************************
1720
1721 ********************************************************************************/
1722-class DynamicFnCallIteratorState : public PlanIteratorState
1723+class SingleDynamicFnCallIteratorState : public PlanIteratorState
1724 {
1725 public:
1726 PlanState * thePlanState;
1727@@ -71,9 +74,9 @@
1728
1729 store::Iterator_t theIterator;
1730
1731- DynamicFnCallIteratorState();
1732+ SingleDynamicFnCallIteratorState();
1733
1734- ~DynamicFnCallIteratorState();
1735+ ~SingleDynamicFnCallIteratorState();
1736
1737 void init(PlanState&);
1738 void reset(PlanState&);
1739@@ -84,29 +87,30 @@
1740 The 1st child iterator returns the functionItem obj to invoke. The rest of
1741 the child iterators compute the args to pass to the invocation.
1742 ********************************************************************************/
1743-class DynamicFnCallIterator : public NaryBaseIterator<DynamicFnCallIterator,
1744- DynamicFnCallIteratorState>
1745+class SingleDynamicFnCallIterator :
1746+public NaryBaseIterator<SingleDynamicFnCallIterator, SingleDynamicFnCallIteratorState>
1747 {
1748 protected:
1749- bool theIsPartialApply;
1750+ bool theIsPartialApply;
1751
1752 public:
1753- SERIALIZABLE_CLASS(DynamicFnCallIterator);
1754-
1755- SERIALIZABLE_CLASS_CONSTRUCTOR2T(DynamicFnCallIterator,
1756- NaryBaseIterator<DynamicFnCallIterator, DynamicFnCallIteratorState>);
1757-
1758- void serialize( ::zorba::serialization::Archiver& ar);
1759+ SERIALIZABLE_CLASS(SingleDynamicFnCallIterator);
1760+
1761+ SERIALIZABLE_CLASS_CONSTRUCTOR2T(SingleDynamicFnCallIterator,
1762+ NaryBaseIterator<SingleDynamicFnCallIterator, SingleDynamicFnCallIteratorState>);
1763+
1764+ void serialize(::zorba::serialization::Archiver& ar);
1765
1766 public:
1767- DynamicFnCallIterator(
1768+ SingleDynamicFnCallIterator(
1769 static_context* sctx,
1770 const QueryLoc& loc,
1771 std::vector<PlanIter_t>& args,
1772 bool isPartialApply,
1773 xqtref_t coercionTargetType = NULL)
1774 :
1775- NaryBaseIterator<DynamicFnCallIterator, DynamicFnCallIteratorState>(sctx, loc, args),
1776+ NaryBaseIterator<SingleDynamicFnCallIterator,
1777+ SingleDynamicFnCallIteratorState>(sctx, loc, args),
1778 theIsPartialApply(isPartialApply)
1779 {
1780 }
1781@@ -118,6 +122,69 @@
1782 void openImpl(PlanState& planState, uint32_t& offset);
1783
1784 bool nextImpl(store::Item_t& result, PlanState& aPlanState) const;
1785+};
1786+
1787+
1788+/*******************************************************************************
1789+
1790+********************************************************************************/
1791+class MultiDynamicFnCallIteratorState : public PlanIteratorState
1792+{
1793+public:
1794+ PlanState * thePlanState;
1795+ PlanIter_t thePlan;
1796+ bool theIsOpen;
1797+
1798+ uint32_t theUDFStateOffset;
1799+
1800+ store::Iterator_t theIterator;
1801+
1802+ std::unique_ptr<HashSet<zstring, HashMapZStringCmp> > theKeysSet;
1803+
1804+public:
1805+ MultiDynamicFnCallIteratorState();
1806+
1807+ ~MultiDynamicFnCallIteratorState();
1808+
1809+ void init(PlanState&);
1810+ void reset(PlanState&);
1811+};
1812+
1813+
1814+/*******************************************************************************
1815+ The 1st child iterator returns the functionItem obj to invoke. The rest of
1816+ the child iterators compute the args to pass to the invocation.
1817+********************************************************************************/
1818+class MultiDynamicFnCallIterator :
1819+public UnaryBaseIterator<MultiDynamicFnCallIterator,
1820+ MultiDynamicFnCallIteratorState>
1821+{
1822+public:
1823+ SERIALIZABLE_CLASS(MultiDynamicFnCallIterator);
1824+
1825+ SERIALIZABLE_CLASS_CONSTRUCTOR2T(MultiDynamicFnCallIterator,
1826+ UnaryBaseIterator<MultiDynamicFnCallIterator, MultiDynamicFnCallIteratorState>);
1827+
1828+ void serialize(::zorba::serialization::Archiver& ar);
1829+
1830+public:
1831+ MultiDynamicFnCallIterator(
1832+ static_context* sctx,
1833+ const QueryLoc& loc,
1834+ const PlanIter_t& arg)
1835+ :
1836+ UnaryBaseIterator<MultiDynamicFnCallIterator,
1837+ MultiDynamicFnCallIteratorState>(sctx, loc, arg)
1838+ {
1839+ }
1840+
1841+ void accept(PlanIterVisitor& v) const;
1842+
1843+ uint32_t getStateSizeOfSubtree() const;
1844+
1845+ void openImpl(PlanState& planState, uint32_t& offset);
1846+
1847+ bool nextImpl(store::Item_t& result, PlanState& aPlanState) const;
1848
1849 void resetImpl(PlanState& planState) const;
1850 };
1851
1852=== modified file 'src/runtime/hof/function_item.cpp'
1853--- src/runtime/hof/function_item.cpp 2013-07-02 21:32:23 +0000
1854+++ src/runtime/hof/function_item.cpp 2013-08-16 17:18:24 +0000
1855@@ -362,6 +362,37 @@
1856 /*******************************************************************************
1857
1858 ********************************************************************************/
1859+PlanIter_t FunctionItem::getImplementation(CompilerCB* ccb)
1860+{
1861+ std::vector<PlanIter_t> args;
1862+
1863+ expr* dummy = ccb->theEM->
1864+ create_function_item_expr(NULL,
1865+ NULL,
1866+ theFunctionItemInfo->theLoc,
1867+ false,
1868+ false);
1869+
1870+ PlanIter_t udfCallIterator = theFunctionItemInfo->theFunction->
1871+ codegen(ccb,
1872+ theFunctionItemInfo->theClosureSctx,
1873+ theFunctionItemInfo->theLoc,
1874+ args,
1875+ *dummy);
1876+
1877+ UDFunctionCallIterator* udfIter =
1878+ static_cast<UDFunctionCallIterator*>(udfCallIterator.getp());
1879+
1880+ udfIter->setDynamic();
1881+ udfIter->setFunctionItem(this);
1882+
1883+ return udfCallIterator;
1884+}
1885+
1886+
1887+/*******************************************************************************
1888+
1889+********************************************************************************/
1890 zstring FunctionItem::show() const
1891 {
1892 std::ostringstream lRes;
1893
1894=== modified file 'src/runtime/hof/function_item.h'
1895--- src/runtime/hof/function_item.h 2013-07-02 21:32:23 +0000
1896+++ src/runtime/hof/function_item.h 2013-08-16 17:18:24 +0000
1897@@ -230,6 +230,8 @@
1898 const std::vector<PlanIter_t>& argValues,
1899 CompilerCB* ccb);
1900
1901+ PlanIter_t getImplementation(CompilerCB* ccb);
1902+
1903 zstring show() const;
1904 };
1905
1906
1907=== modified file 'src/runtime/json/jsoniq_functions_impl.cpp'
1908--- src/runtime/json/jsoniq_functions_impl.cpp 2013-08-14 15:16:42 +0000
1909+++ src/runtime/json/jsoniq_functions_impl.cpp 2013-08-16 17:18:24 +0000
1910@@ -866,7 +866,8 @@
1911 *state->theInputStream, true, lStripTopLevelArray
1912 );
1913
1914- if ( state->theInput == NULL && theRelativeLocation ) {
1915+ if ( state->theInput == NULL && theRelativeLocation )
1916+ {
1917 // pass the query location of the StringLiteral to the JSON
1918 // parser such that it can give better error locations.
1919 state->loader_->set_loc(
1920@@ -875,11 +876,14 @@
1921 theRelativeLocation.getColumnBegin()
1922 );
1923 }
1924+
1925 if ( stream_uri )
1926 state->loader_->set_loc( stream_uri, 1, 1 );
1927
1928- while ( state->loader_->next( &result ) ) {
1929- if ( !state->theAllowMultiple && state->theGotOne ) {
1930+ while ( state->loader_->next( &result ) )
1931+ {
1932+ if ( !state->theAllowMultiple && state->theGotOne )
1933+ {
1934 throw XQUERY_EXCEPTION(
1935 jerr::JNDY0021,
1936 ERROR_PARAMS( ZED( JNDY0021_UnexpectedExtraContent ) ),
1937@@ -895,84 +899,121 @@
1938
1939
1940 /*******************************************************************************
1941- op_zorba:json-item-accessor($i as item()?, $sel as item()?) as item()?
1942-
1943- op_zorba:json-item-accessor($i as item()?) as item()*
1944-
1945- These two are zorba internal functions that are introduced by the translator
1946- when translating a dynamic function invocation (DFI) expr and we know statically
1947- that the source of the DFI is a json item, but we don't know if it's going to
1948- be an object or an array.
1949-
1950- Note: the translator always wraps the $sel param to with fn:data(), so we can
1951- assume here that the selector item is atomic.
1952+ jn:keys($o as item()*) as xs:string*
1953 ********************************************************************************/
1954-bool JSONItemAccessorIterator::nextImpl(
1955+void MultiObjectKeysIteratorState::init(PlanState& planState)
1956+{
1957+ theUniqueKeys.reset(new HashSet<zstring, HashMapZStringCmp>(64, false));
1958+}
1959+
1960+
1961+void MultiObjectKeysIteratorState::reset(PlanState& planState)
1962+{
1963+ PlanIteratorState::reset(planState);
1964+ theUniqueKeys->clear();
1965+}
1966+
1967+
1968+bool MultiObjectKeysIterator::nextImpl(
1969 store::Item_t& result,
1970 PlanState& planState) const
1971 {
1972- store::Item_t input;
1973- store::Item_t selector;
1974- store::Item_t selector2;
1975-
1976- JSONItemAccessorIteratorState* state;
1977- DEFAULT_STACK_INIT(JSONItemAccessorIteratorState, state, planState);
1978-
1979- if (consumeNext(input, theChildren[0].getp(), planState))
1980- {
1981- if (input->isArray())
1982- {
1983- if (theChildren.size() == 2 &&
1984- consumeNext(selector, theChildren[1].getp(), planState))
1985- {
1986- GenericCast::castToBuiltinAtomic(selector2,
1987- selector,
1988- store::XS_INTEGER,
1989- NULL,
1990- loc);
1991-
1992- result = input->getArrayValue(selector2->getIntegerValue());
1993-
1994- STACK_PUSH(result != 0, state);
1995- }
1996- else
1997- {
1998- state->theIterator = input->getArrayValues();
1999-
2000- state->theIterator->open();
2001- while (state->theIterator->next(result))
2002- {
2003- STACK_PUSH(true, state);
2004- }
2005- state->theIterator->close();
2006- }
2007- }
2008- else if (input->isObject())
2009- {
2010- if (theChildren.size() == 2 &&
2011- consumeNext(selector, theChildren[1].getp(), planState))
2012- {
2013- GenericCast::castToBuiltinAtomic(selector2,
2014- selector,
2015- store::XS_STRING,
2016- NULL,
2017- loc);
2018-
2019- result = input->getObjectValue(selector2);
2020-
2021- STACK_PUSH(result != 0, state);
2022- }
2023- else
2024- {
2025- state->theIterator = input->getObjectKeys();
2026-
2027- state->theIterator->open();
2028- while (state->theIterator->next(result))
2029- {
2030- STACK_PUSH(true, state);
2031- }
2032- state->theIterator->close();
2033- }
2034+ store::Item_t item;
2035+ store::Item_t obj1;
2036+ store::Item_t obj2;
2037+ zstring key;
2038+
2039+ MultiObjectKeysIteratorState* state;
2040+ DEFAULT_STACK_INIT(MultiObjectKeysIteratorState, state, planState);
2041+
2042+ // skip non-objects
2043+ while (consumeNext(item, theChild.getp(), planState))
2044+ {
2045+ if (item->isObject())
2046+ {
2047+ obj1.transfer(item);
2048+ break;
2049+ }
2050+ }
2051+
2052+ if (obj1)
2053+ {
2054+ // skip non-objects
2055+ while (consumeNext(item, theChild.getp(), planState))
2056+ {
2057+ if (item->isObject())
2058+ {
2059+ obj2.transfer(item);
2060+ break;
2061+ }
2062+ }
2063+
2064+ if (obj2)
2065+ {
2066+ state->theSecondObj.transfer(obj2);
2067+
2068+ // Return and record the keys of the 1st obj
2069+ state->theObjKeysIte = obj1->getObjectKeys();
2070+ state->theObjKeysIte->open();
2071+
2072+ while (state->theObjKeysIte->next(result))
2073+ {
2074+ key = result->getStringValue();
2075+ state->theUniqueKeys->insert(key);
2076+ STACK_PUSH(true, state);
2077+ }
2078+
2079+ // Conditionally return and record the keys of the 2nd obj
2080+ state->theObjKeysIte = state->theSecondObj->getObjectKeys();
2081+ state->theObjKeysIte->open();
2082+
2083+ while (state->theObjKeysIte->next(result))
2084+ {
2085+ key = result->getStringValue();
2086+
2087+ if (!state->theUniqueKeys->exists(key))
2088+ {
2089+ state->theUniqueKeys->insert(key);
2090+ STACK_PUSH(true, state);
2091+ }
2092+ }
2093+
2094+ state->theObjKeysIte = NULL;
2095+
2096+ // Conditionally return and record the keys of the subsequent objs, if any
2097+ while (consumeNext(item, theChild.getp(), planState))
2098+ {
2099+ if (item->isObject())
2100+ {
2101+ state->theObjKeysIte = item->getObjectKeys();
2102+ state->theObjKeysIte->open();
2103+
2104+ while (state->theObjKeysIte->next(result))
2105+ {
2106+ key = result->getStringValue();
2107+
2108+ if (!state->theUniqueKeys->exists(key))
2109+ {
2110+ state->theUniqueKeys->insert(key);
2111+ STACK_PUSH(true, state);
2112+ }
2113+ }
2114+
2115+ state->theObjKeysIte = NULL;
2116+ }
2117+ }
2118+ }
2119+ else
2120+ {
2121+ state->theObjKeysIte = obj1->getObjectKeys();
2122+ state->theObjKeysIte->open();
2123+
2124+ while (state->theObjKeysIte->next(result))
2125+ {
2126+ STACK_PUSH(true, state);
2127+ }
2128+
2129+ state->theObjKeysIte = NULL;
2130 }
2131 }
2132
2133@@ -981,29 +1022,29 @@
2134
2135
2136 /*******************************************************************************
2137- op-zorba:keys($o as item()) as xs:string*
2138+ op-zorba:keys($o as item()?) as xs:string*
2139 ********************************************************************************/
2140-bool SingleObjectNamesIterator::nextImpl(
2141+bool SingleObjectKeysIterator::nextImpl(
2142 store::Item_t& result,
2143 PlanState& planState) const
2144 {
2145 store::Item_t input;
2146
2147- SingleObjectNamesIteratorState* state;
2148- DEFAULT_STACK_INIT(SingleObjectNamesIteratorState, state, planState);
2149+ SingleObjectKeysIteratorState* state;
2150+ DEFAULT_STACK_INIT(SingleObjectKeysIteratorState, state, planState);
2151
2152 if (consumeNext(input, theChild.getp(), planState))
2153 {
2154 if (input->isObject())
2155 {
2156- state->theNames = input->getObjectKeys();
2157- state->theNames->open();
2158+ state->theObjKeysIte = input->getObjectKeys();
2159+ state->theObjKeysIte->open();
2160
2161- while (state->theNames->next(result))
2162+ while (state->theObjKeysIte->next(result))
2163 {
2164 STACK_PUSH (true, state);
2165 }
2166- state->theNames = NULL;
2167+ state->theObjKeysIte = NULL;
2168 }
2169 }
2170
2171@@ -1011,15 +1052,15 @@
2172 }
2173
2174
2175-bool SingleObjectNamesIterator::count(
2176+bool SingleObjectKeysIterator::count(
2177 store::Item_t& result,
2178 PlanState& planState) const
2179 {
2180 store::Item_t obj;
2181 xs_integer count(0);
2182
2183- SingleObjectNamesIteratorState* state;
2184- DEFAULT_STACK_INIT(SingleObjectNamesIteratorState, state, planState);
2185+ SingleObjectKeysIteratorState* state;
2186+ DEFAULT_STACK_INIT(SingleObjectKeysIteratorState, state, planState);
2187
2188 if (consumeNext(obj, theChild.getp(), planState))
2189 {
2190@@ -1035,51 +1076,31 @@
2191
2192
2193 /*******************************************************************************
2194- jn:keys($o as item()*) as xs:string*
2195+ op-zorba:multi-object-lookup($o as item()*, $name as item()?) as item()*
2196+
2197+ Note: the translator always wraps the $name param to a [cast as xs:string?]
2198+ expr, so we don's have to check the type of the selector item here.
2199 ********************************************************************************/
2200-
2201-void JSONObjectNamesIteratorState::init(PlanState& planState)
2202-{
2203- theNamesSet.reset(new HashSet<zstring, HashMapZStringCmp>(64, false));
2204-}
2205-
2206-
2207-void JSONObjectNamesIteratorState::reset(PlanState& planState)
2208-{
2209- PlanIteratorState::reset(planState);
2210- theNamesSet->clear();
2211-}
2212-
2213-
2214-bool JSONObjectNamesIterator::nextImpl(
2215+bool MultiObjectLookupIterator::nextImpl(
2216 store::Item_t& result,
2217 PlanState& planState) const
2218 {
2219 store::Item_t input;
2220- zstring name;
2221-
2222- JSONObjectNamesIteratorState* state;
2223- DEFAULT_STACK_INIT(JSONObjectNamesIteratorState, state, planState);
2224-
2225- while (consumeNext(input, theChild.getp(), planState))
2226+
2227+ MultiObjectLookupIteratorState* state;
2228+ DEFAULT_STACK_INIT(MultiObjectLookupIteratorState, state, planState);
2229+
2230+ if (consumeNext(state->theKey, theChild1.getp(), planState))
2231 {
2232- if (input->isObject())
2233+ while (consumeNext(input, theChild0.getp(), planState))
2234 {
2235- state->theNames = input->getObjectKeys();
2236- state->theNames->open();
2237-
2238- while (state->theNames->next(result))
2239+ if (input->isObject())
2240 {
2241- name = result->getStringValue();
2242-
2243- if (!state->theNamesSet->exists(name))
2244- {
2245- state->theNamesSet->insert(name);
2246+ result = input->getObjectValue(state->theKey);
2247+
2248+ if (result)
2249 STACK_PUSH(true, state);
2250- }
2251 }
2252-
2253- state->theNames = NULL;
2254 }
2255 }
2256
2257@@ -1088,14 +1109,14 @@
2258
2259
2260 /*******************************************************************************
2261- op-zorba:object-value($o as item()?, $name as item()?) as item()?
2262+ op-zorba:single-object-lookup($o as item()?, $name as item()?) as item()?
2263
2264 Note: the translator always wraps the $name param to a [cast as xs:string?]
2265 expr, so we don's have to check the type of the selector item here.
2266 ********************************************************************************/
2267-bool JSONObjectValueIterator::nextImpl(
2268- store::Item_t& result,
2269- PlanState& planState) const
2270+bool SingleObjectLookupIterator::nextImpl(
2271+ store::Item_t& result,
2272+ PlanState& planState) const
2273 {
2274 store::Item_t input;
2275 store::Item_t name;
2276@@ -1258,35 +1279,57 @@
2277 }
2278
2279
2280+
2281 /*******************************************************************************
2282- op-zorba:member($a as item()?, $pos as item()?) as item()?
2283-
2284- Note: the translator always wraps the $pos param to a [cast as xs:integer?]
2285- expr, so we don's have to check the type of the selector item here.
2286+ jn:members($a as item()*) as item()*
2287 ********************************************************************************/
2288-bool JSONArrayMemberIterator::nextImpl(
2289+bool MultiArrayMembersIterator::nextImpl(
2290 store::Item_t& result,
2291 PlanState& planState) const
2292 {
2293- store::Item_t input;
2294- store::Item_t position;
2295-
2296- PlanIteratorState* state;
2297- DEFAULT_STACK_INIT(PlanIteratorState, state, planState);
2298-
2299- if (consumeNext(input, theChild0.getp(), planState))
2300+ store::Item_t array;
2301+
2302+ MultiArrayMembersIteratorState* state;
2303+ DEFAULT_STACK_INIT(MultiArrayMembersIteratorState, state, planState);
2304+
2305+ while (consumeNext(array, theChild.getp(), planState))
2306 {
2307- if (input->isArray())
2308+ if (array->isArray())
2309 {
2310- if (consumeNext(position, theChild1.getp(), planState))
2311+ state->theMembers = array->getArrayValues();
2312+
2313+ state->theMembers->open();
2314+ while (state->theMembers->next(result))
2315 {
2316- result = input->getArrayValue(position->getIntegerValue());
2317-
2318- STACK_PUSH(result != 0, state);
2319+ STACK_PUSH(true, state);
2320 }
2321- }
2322- }
2323-
2324+ state->theMembers->close();
2325+ }
2326+ }
2327+
2328+ STACK_END(state);
2329+}
2330+
2331+
2332+bool MultiArrayMembersIterator::count(
2333+ store::Item_t& result,
2334+ PlanState& planState) const
2335+{
2336+ store::Item_t array;
2337+ xs_integer count(0);
2338+
2339+ MultiArrayMembersIteratorState* state;
2340+ DEFAULT_STACK_INIT(MultiArrayMembersIteratorState, state, planState);
2341+
2342+ while (consumeNext(array, theChild.getp(), planState))
2343+ {
2344+ if (array->isArray())
2345+ {
2346+ count += array->getArraySize();
2347+ }
2348+ }
2349+
2350+ STACK_PUSH(GENV_ITEMFACTORY->createInteger(result, count), state);
2351 STACK_END(state);
2352 }
2353
2354@@ -1295,13 +1338,13 @@
2355 op-zorba:members($a as item()?) as item()*
2356 ********************************************************************************/
2357 bool SingleArrayMembersIterator::nextImpl(
2358- store::Item_t& result,
2359- PlanState& planState) const
2360+ store::Item_t& result,
2361+ PlanState& planState) const
2362 {
2363 store::Item_t array;
2364
2365- JSONArrayMembersIteratorState* state;
2366- DEFAULT_STACK_INIT(JSONArrayMembersIteratorState, state, planState);
2367+ SingleArrayMembersIteratorState* state;
2368+ DEFAULT_STACK_INIT(SingleArrayMembersIteratorState, state, planState);
2369
2370 if (consumeNext(array, theChild.getp(), planState))
2371 {
2372@@ -1323,14 +1366,14 @@
2373
2374
2375 bool SingleArrayMembersIterator::count(
2376- store::Item_t& result,
2377- PlanState& planState) const
2378+ store::Item_t& result,
2379+ PlanState& planState) const
2380 {
2381 store::Item_t array;
2382 xs_integer count(0);
2383
2384- JSONArrayMembersIteratorState* state;
2385- DEFAULT_STACK_INIT(JSONArrayMembersIteratorState, state, planState);
2386+ SingleArrayMembersIteratorState* state;
2387+ DEFAULT_STACK_INIT(SingleArrayMembersIteratorState, state, planState);
2388
2389 if (consumeNext(array, theChild.getp(), planState))
2390 {
2391@@ -1347,29 +1390,31 @@
2392
2393
2394 /*******************************************************************************
2395- jn:members($a as item()*) as item()*
2396+ op-zorba:mutli-array-lookup($a as item()*, $pos as item()?) as item()*
2397+
2398+ Note: the translator always wraps the $pos param to a [cast as xs:integer?]
2399+ expr, so we don's have to check the type of the selector item here.
2400 ********************************************************************************/
2401-bool JSONArrayMembersIterator::nextImpl(
2402- store::Item_t& result,
2403- PlanState& planState) const
2404+bool MultiArrayLookupIterator::nextImpl(
2405+ store::Item_t& result,
2406+ PlanState& planState) const
2407 {
2408- store::Item_t array;
2409-
2410- JSONArrayMembersIteratorState* state;
2411- DEFAULT_STACK_INIT(JSONArrayMembersIteratorState, state, planState);
2412-
2413- while (consumeNext(array, theChild.getp(), planState))
2414+ store::Item_t input;
2415+
2416+ MultiArrayLookupIteratorState* state;
2417+ DEFAULT_STACK_INIT(MultiArrayLookupIteratorState, state, planState);
2418+
2419+ if (consumeNext(state->thePosition, theChild1.getp(), planState))
2420 {
2421- if (array->isArray())
2422+ while (consumeNext(input, theChild0.getp(), planState))
2423 {
2424- state->theMembers = array->getArrayValues();
2425-
2426- state->theMembers->open();
2427- while (state->theMembers->next(result))
2428+ if (input->isArray())
2429 {
2430- STACK_PUSH(true, state);
2431+ result = input->getArrayValue(state->thePosition->getIntegerValue());
2432+
2433+ if (result)
2434+ STACK_PUSH(true, state);
2435 }
2436- state->theMembers->close();
2437 }
2438 }
2439
2440@@ -1377,25 +1422,35 @@
2441 }
2442
2443
2444-bool JSONArrayMembersIterator::count(
2445- store::Item_t& result,
2446- PlanState& planState) const
2447+/*******************************************************************************
2448+ op-zorba:single-array-lookup($a as item()?, $pos as item()?) as item()?
2449+
2450+ Note: the translator always wraps the $pos param to a [cast as xs:integer?]
2451+ expr, so we don's have to check the type of the selector item here.
2452+********************************************************************************/
2453+bool SingleArrayLookupIterator::nextImpl(
2454+ store::Item_t& result,
2455+ PlanState& planState) const
2456 {
2457- store::Item_t array;
2458- xs_integer count(0);
2459-
2460- JSONArrayMembersIteratorState* state;
2461- DEFAULT_STACK_INIT(JSONArrayMembersIteratorState, state, planState);
2462-
2463- while (consumeNext(array, theChild.getp(), planState))
2464+ store::Item_t input;
2465+ store::Item_t position;
2466+
2467+ PlanIteratorState* state;
2468+ DEFAULT_STACK_INIT(PlanIteratorState, state, planState);
2469+
2470+ if (consumeNext(input, theChild0.getp(), planState))
2471 {
2472- if (array->isArray())
2473+ if (input->isArray())
2474 {
2475- count += array->getArraySize();
2476+ if (consumeNext(position, theChild1.getp(), planState))
2477+ {
2478+ result = input->getArrayValue(position->getIntegerValue());
2479+
2480+ STACK_PUSH(result != 0, state);
2481+ }
2482 }
2483 }
2484
2485- STACK_PUSH(GENV_ITEMFACTORY->createInteger(result, count), state);
2486 STACK_END(state);
2487 }
2488
2489
2490=== modified file 'src/runtime/json/pregenerated/jsoniq_functions.cpp'
2491--- src/runtime/json/pregenerated/jsoniq_functions.cpp 2013-08-14 15:16:42 +0000
2492+++ src/runtime/json/pregenerated/jsoniq_functions.cpp 2013-08-16 17:18:24 +0000
2493@@ -144,133 +144,130 @@
2494 // </JSONParseIterator>
2495
2496
2497-// <JSONItemAccessorIterator>
2498-SERIALIZABLE_CLASS_VERSIONS(JSONItemAccessorIterator)
2499-
2500-void JSONItemAccessorIterator::serialize(::zorba::serialization::Archiver& ar)
2501-{
2502- serialize_baseclass(ar,
2503- (NaryBaseIterator<JSONItemAccessorIterator, JSONItemAccessorIteratorState>*)this);
2504-}
2505-
2506-
2507-void JSONItemAccessorIterator::accept(PlanIterVisitor& v) const
2508-{
2509- v.beginVisit(*this);
2510-
2511- std::vector<PlanIter_t>::const_iterator lIter = theChildren.begin();
2512- std::vector<PlanIter_t>::const_iterator lEnd = theChildren.end();
2513- for ( ; lIter != lEnd; ++lIter ){
2514- (*lIter)->accept(v);
2515- }
2516-
2517- v.endVisit(*this);
2518-}
2519-
2520-JSONItemAccessorIterator::~JSONItemAccessorIterator() {}
2521-
2522-JSONItemAccessorIteratorState::JSONItemAccessorIteratorState() {}
2523-
2524-JSONItemAccessorIteratorState::~JSONItemAccessorIteratorState() {}
2525-
2526-
2527-void JSONItemAccessorIteratorState::init(PlanState& planState) {
2528- PlanIteratorState::init(planState);
2529-}
2530-
2531-void JSONItemAccessorIteratorState::reset(PlanState& planState) {
2532- PlanIteratorState::reset(planState);
2533-}
2534-// </JSONItemAccessorIterator>
2535-
2536-
2537-// <JSONObjectNamesIterator>
2538-SERIALIZABLE_CLASS_VERSIONS(JSONObjectNamesIterator)
2539-
2540-void JSONObjectNamesIterator::serialize(::zorba::serialization::Archiver& ar)
2541-{
2542- serialize_baseclass(ar,
2543- (UnaryBaseIterator<JSONObjectNamesIterator, JSONObjectNamesIteratorState>*)this);
2544-}
2545-
2546-
2547-void JSONObjectNamesIterator::accept(PlanIterVisitor& v) const
2548-{
2549- v.beginVisit(*this);
2550-
2551- theChild->accept(v);
2552-
2553- v.endVisit(*this);
2554-}
2555-
2556-JSONObjectNamesIterator::~JSONObjectNamesIterator() {}
2557-
2558-JSONObjectNamesIteratorState::JSONObjectNamesIteratorState() {}
2559-
2560-JSONObjectNamesIteratorState::~JSONObjectNamesIteratorState() {}
2561-
2562-// </JSONObjectNamesIterator>
2563-
2564-
2565-// <SingleObjectNamesIterator>
2566-SERIALIZABLE_CLASS_VERSIONS(SingleObjectNamesIterator)
2567-
2568-void SingleObjectNamesIterator::serialize(::zorba::serialization::Archiver& ar)
2569-{
2570- serialize_baseclass(ar,
2571- (UnaryBaseIterator<SingleObjectNamesIterator, SingleObjectNamesIteratorState>*)this);
2572-}
2573-
2574-
2575-void SingleObjectNamesIterator::accept(PlanIterVisitor& v) const
2576-{
2577- v.beginVisit(*this);
2578-
2579- theChild->accept(v);
2580-
2581- v.endVisit(*this);
2582-}
2583-
2584-SingleObjectNamesIterator::~SingleObjectNamesIterator() {}
2585-
2586-SingleObjectNamesIteratorState::SingleObjectNamesIteratorState() {}
2587-
2588-SingleObjectNamesIteratorState::~SingleObjectNamesIteratorState() {}
2589-
2590-
2591-void SingleObjectNamesIteratorState::init(PlanState& planState) {
2592- PlanIteratorState::init(planState);
2593-}
2594-
2595-void SingleObjectNamesIteratorState::reset(PlanState& planState) {
2596- PlanIteratorState::reset(planState);
2597-}
2598-// </SingleObjectNamesIterator>
2599-
2600-
2601-// <JSONObjectValueIterator>
2602-SERIALIZABLE_CLASS_VERSIONS(JSONObjectValueIterator)
2603-
2604-void JSONObjectValueIterator::serialize(::zorba::serialization::Archiver& ar)
2605-{
2606- serialize_baseclass(ar,
2607- (BinaryBaseIterator<JSONObjectValueIterator, PlanIteratorState>*)this);
2608-}
2609-
2610-
2611-void JSONObjectValueIterator::accept(PlanIterVisitor& v) const
2612-{
2613- v.beginVisit(*this);
2614-
2615- theChild0->accept(v);
2616-theChild1->accept(v);
2617-
2618- v.endVisit(*this);
2619-}
2620-
2621-JSONObjectValueIterator::~JSONObjectValueIterator() {}
2622-
2623-// </JSONObjectValueIterator>
2624+// <MultiObjectKeysIterator>
2625+SERIALIZABLE_CLASS_VERSIONS(MultiObjectKeysIterator)
2626+
2627+void MultiObjectKeysIterator::serialize(::zorba::serialization::Archiver& ar)
2628+{
2629+ serialize_baseclass(ar,
2630+ (UnaryBaseIterator<MultiObjectKeysIterator, MultiObjectKeysIteratorState>*)this);
2631+}
2632+
2633+
2634+void MultiObjectKeysIterator::accept(PlanIterVisitor& v) const
2635+{
2636+ v.beginVisit(*this);
2637+
2638+ theChild->accept(v);
2639+
2640+ v.endVisit(*this);
2641+}
2642+
2643+MultiObjectKeysIterator::~MultiObjectKeysIterator() {}
2644+
2645+MultiObjectKeysIteratorState::MultiObjectKeysIteratorState() {}
2646+
2647+MultiObjectKeysIteratorState::~MultiObjectKeysIteratorState() {}
2648+
2649+// </MultiObjectKeysIterator>
2650+
2651+
2652+// <SingleObjectKeysIterator>
2653+SERIALIZABLE_CLASS_VERSIONS(SingleObjectKeysIterator)
2654+
2655+void SingleObjectKeysIterator::serialize(::zorba::serialization::Archiver& ar)
2656+{
2657+ serialize_baseclass(ar,
2658+ (UnaryBaseIterator<SingleObjectKeysIterator, SingleObjectKeysIteratorState>*)this);
2659+}
2660+
2661+
2662+void SingleObjectKeysIterator::accept(PlanIterVisitor& v) const
2663+{
2664+ v.beginVisit(*this);
2665+
2666+ theChild->accept(v);
2667+
2668+ v.endVisit(*this);
2669+}
2670+
2671+SingleObjectKeysIterator::~SingleObjectKeysIterator() {}
2672+
2673+SingleObjectKeysIteratorState::SingleObjectKeysIteratorState() {}
2674+
2675+SingleObjectKeysIteratorState::~SingleObjectKeysIteratorState() {}
2676+
2677+
2678+void SingleObjectKeysIteratorState::init(PlanState& planState) {
2679+ PlanIteratorState::init(planState);
2680+}
2681+
2682+void SingleObjectKeysIteratorState::reset(PlanState& planState) {
2683+ PlanIteratorState::reset(planState);
2684+}
2685+// </SingleObjectKeysIterator>
2686+
2687+
2688+// <MultiObjectLookupIterator>
2689+SERIALIZABLE_CLASS_VERSIONS(MultiObjectLookupIterator)
2690+
2691+void MultiObjectLookupIterator::serialize(::zorba::serialization::Archiver& ar)
2692+{
2693+ serialize_baseclass(ar,
2694+ (BinaryBaseIterator<MultiObjectLookupIterator, MultiObjectLookupIteratorState>*)this);
2695+}
2696+
2697+
2698+void MultiObjectLookupIterator::accept(PlanIterVisitor& v) const
2699+{
2700+ v.beginVisit(*this);
2701+
2702+ theChild0->accept(v);
2703+theChild1->accept(v);
2704+
2705+ v.endVisit(*this);
2706+}
2707+
2708+MultiObjectLookupIterator::~MultiObjectLookupIterator() {}
2709+
2710+MultiObjectLookupIteratorState::MultiObjectLookupIteratorState() {}
2711+
2712+MultiObjectLookupIteratorState::~MultiObjectLookupIteratorState() {}
2713+
2714+
2715+void MultiObjectLookupIteratorState::init(PlanState& planState) {
2716+ PlanIteratorState::init(planState);
2717+}
2718+
2719+void MultiObjectLookupIteratorState::reset(PlanState& planState) {
2720+ PlanIteratorState::reset(planState);
2721+}
2722+// </MultiObjectLookupIterator>
2723+
2724+
2725+// <SingleObjectLookupIterator>
2726+SERIALIZABLE_CLASS_VERSIONS(SingleObjectLookupIterator)
2727+
2728+void SingleObjectLookupIterator::serialize(::zorba::serialization::Archiver& ar)
2729+{
2730+ serialize_baseclass(ar,
2731+ (BinaryBaseIterator<SingleObjectLookupIterator, PlanIteratorState>*)this);
2732+}
2733+
2734+
2735+void SingleObjectLookupIterator::accept(PlanIterVisitor& v) const
2736+{
2737+ v.beginVisit(*this);
2738+
2739+ theChild0->accept(v);
2740+theChild1->accept(v);
2741+
2742+ v.endVisit(*this);
2743+}
2744+
2745+SingleObjectLookupIterator::~SingleObjectLookupIterator() {}
2746+
2747+// </SingleObjectLookupIterator>
2748
2749
2750 // <JSONObjectProjectIterator>
2751@@ -347,42 +344,17 @@
2752 // </JSONObjectTrimIterator>
2753
2754
2755-// <JSONArrayMemberIterator>
2756-SERIALIZABLE_CLASS_VERSIONS(JSONArrayMemberIterator)
2757-
2758-void JSONArrayMemberIterator::serialize(::zorba::serialization::Archiver& ar)
2759-{
2760- serialize_baseclass(ar,
2761- (BinaryBaseIterator<JSONArrayMemberIterator, PlanIteratorState>*)this);
2762-}
2763-
2764-
2765-void JSONArrayMemberIterator::accept(PlanIterVisitor& v) const
2766-{
2767- v.beginVisit(*this);
2768-
2769- theChild0->accept(v);
2770-theChild1->accept(v);
2771-
2772- v.endVisit(*this);
2773-}
2774-
2775-JSONArrayMemberIterator::~JSONArrayMemberIterator() {}
2776-
2777-// </JSONArrayMemberIterator>
2778-
2779-
2780-// <JSONArrayMembersIterator>
2781-SERIALIZABLE_CLASS_VERSIONS(JSONArrayMembersIterator)
2782-
2783-void JSONArrayMembersIterator::serialize(::zorba::serialization::Archiver& ar)
2784-{
2785- serialize_baseclass(ar,
2786- (UnaryBaseIterator<JSONArrayMembersIterator, JSONArrayMembersIteratorState>*)this);
2787-}
2788-
2789-
2790-void JSONArrayMembersIterator::accept(PlanIterVisitor& v) const
2791+// <MultiArrayMembersIterator>
2792+SERIALIZABLE_CLASS_VERSIONS(MultiArrayMembersIterator)
2793+
2794+void MultiArrayMembersIterator::serialize(::zorba::serialization::Archiver& ar)
2795+{
2796+ serialize_baseclass(ar,
2797+ (UnaryBaseIterator<MultiArrayMembersIterator, MultiArrayMembersIteratorState>*)this);
2798+}
2799+
2800+
2801+void MultiArrayMembersIterator::accept(PlanIterVisitor& v) const
2802 {
2803 v.beginVisit(*this);
2804
2805@@ -391,21 +363,21 @@
2806 v.endVisit(*this);
2807 }
2808
2809-JSONArrayMembersIterator::~JSONArrayMembersIterator() {}
2810-
2811-JSONArrayMembersIteratorState::JSONArrayMembersIteratorState() {}
2812-
2813-JSONArrayMembersIteratorState::~JSONArrayMembersIteratorState() {}
2814-
2815-
2816-void JSONArrayMembersIteratorState::init(PlanState& planState) {
2817+MultiArrayMembersIterator::~MultiArrayMembersIterator() {}
2818+
2819+MultiArrayMembersIteratorState::MultiArrayMembersIteratorState() {}
2820+
2821+MultiArrayMembersIteratorState::~MultiArrayMembersIteratorState() {}
2822+
2823+
2824+void MultiArrayMembersIteratorState::init(PlanState& planState) {
2825 PlanIteratorState::init(planState);
2826 }
2827
2828-void JSONArrayMembersIteratorState::reset(PlanState& planState) {
2829+void MultiArrayMembersIteratorState::reset(PlanState& planState) {
2830 PlanIteratorState::reset(planState);
2831 }
2832-// </JSONArrayMembersIterator>
2833+// </MultiArrayMembersIterator>
2834
2835
2836 // <SingleArrayMembersIterator>
2837@@ -444,6 +416,68 @@
2838 // </SingleArrayMembersIterator>
2839
2840
2841+// <MultiArrayLookupIterator>
2842+SERIALIZABLE_CLASS_VERSIONS(MultiArrayLookupIterator)
2843+
2844+void MultiArrayLookupIterator::serialize(::zorba::serialization::Archiver& ar)
2845+{
2846+ serialize_baseclass(ar,
2847+ (BinaryBaseIterator<MultiArrayLookupIterator, MultiArrayLookupIteratorState>*)this);
2848+}
2849+
2850+
2851+void MultiArrayLookupIterator::accept(PlanIterVisitor& v) const
2852+{
2853+ v.beginVisit(*this);
2854+
2855+ theChild0->accept(v);
2856+theChild1->accept(v);
2857+
2858+ v.endVisit(*this);
2859+}
2860+
2861+MultiArrayLookupIterator::~MultiArrayLookupIterator() {}
2862+
2863+MultiArrayLookupIteratorState::MultiArrayLookupIteratorState() {}
2864+
2865+MultiArrayLookupIteratorState::~MultiArrayLookupIteratorState() {}
2866+
2867+
2868+void MultiArrayLookupIteratorState::init(PlanState& planState) {
2869+ PlanIteratorState::init(planState);
2870+}
2871+
2872+void MultiArrayLookupIteratorState::reset(PlanState& planState) {
2873+ PlanIteratorState::reset(planState);
2874+}
2875+// </MultiArrayLookupIterator>
2876+
2877+
2878+// <SingleArrayLookupIterator>
2879+SERIALIZABLE_CLASS_VERSIONS(SingleArrayLookupIterator)
2880+
2881+void SingleArrayLookupIterator::serialize(::zorba::serialization::Archiver& ar)
2882+{
2883+ serialize_baseclass(ar,
2884+ (BinaryBaseIterator<SingleArrayLookupIterator, PlanIteratorState>*)this);
2885+}
2886+
2887+
2888+void SingleArrayLookupIterator::accept(PlanIterVisitor& v) const
2889+{
2890+ v.beginVisit(*this);
2891+
2892+ theChild0->accept(v);
2893+theChild1->accept(v);
2894+
2895+ v.endVisit(*this);
2896+}
2897+
2898+SingleArrayLookupIterator::~SingleArrayLookupIterator() {}
2899+
2900+// </SingleArrayLookupIterator>
2901+
2902+
2903 // <JSONArraySizeIterator>
2904 SERIALIZABLE_CLASS_VERSIONS(JSONArraySizeIterator)
2905
2906
2907=== modified file 'src/runtime/json/pregenerated/jsoniq_functions.h'
2908--- src/runtime/json/pregenerated/jsoniq_functions.h 2013-08-14 15:16:42 +0000
2909+++ src/runtime/json/pregenerated/jsoniq_functions.h 2013-08-16 17:18:24 +0000
2910@@ -195,125 +195,83 @@
2911 *
2912 * Author:
2913 */
2914-class JSONItemAccessorIteratorState : public PlanIteratorState
2915-{
2916-public:
2917- store::Iterator_t theIterator; //
2918-
2919- JSONItemAccessorIteratorState();
2920-
2921- ~JSONItemAccessorIteratorState();
2922-
2923- void init(PlanState&);
2924- void reset(PlanState&);
2925-};
2926-
2927-class JSONItemAccessorIterator : public NaryBaseIterator<JSONItemAccessorIterator, JSONItemAccessorIteratorState>
2928-{
2929-public:
2930- SERIALIZABLE_CLASS(JSONItemAccessorIterator);
2931-
2932- SERIALIZABLE_CLASS_CONSTRUCTOR2T(JSONItemAccessorIterator,
2933- NaryBaseIterator<JSONItemAccessorIterator, JSONItemAccessorIteratorState>);
2934-
2935- void serialize( ::zorba::serialization::Archiver& ar);
2936-
2937- JSONItemAccessorIterator(
2938- static_context* sctx,
2939- const QueryLoc& loc,
2940- std::vector<PlanIter_t>& children)
2941- :
2942- NaryBaseIterator<JSONItemAccessorIterator, JSONItemAccessorIteratorState>(sctx, loc, children)
2943- {}
2944-
2945- virtual ~JSONItemAccessorIterator();
2946-
2947- void accept(PlanIterVisitor& v) const;
2948-
2949- bool nextImpl(store::Item_t& result, PlanState& aPlanState) const;
2950-};
2951-
2952-
2953-/**
2954- *
2955- * Author:
2956- */
2957-class JSONObjectNamesIteratorState : public PlanIteratorState
2958-{
2959-public:
2960- store::Iterator_t theNames; //
2961- std::unique_ptr<HashSet<zstring, HashMapZStringCmp> > theNamesSet; //
2962-
2963- JSONObjectNamesIteratorState();
2964-
2965- ~JSONObjectNamesIteratorState();
2966-
2967- void init(PlanState&);
2968- void reset(PlanState&);
2969-};
2970-
2971-class JSONObjectNamesIterator : public UnaryBaseIterator<JSONObjectNamesIterator, JSONObjectNamesIteratorState>
2972-{
2973-public:
2974- SERIALIZABLE_CLASS(JSONObjectNamesIterator);
2975-
2976- SERIALIZABLE_CLASS_CONSTRUCTOR2T(JSONObjectNamesIterator,
2977- UnaryBaseIterator<JSONObjectNamesIterator, JSONObjectNamesIteratorState>);
2978-
2979- void serialize( ::zorba::serialization::Archiver& ar);
2980-
2981- JSONObjectNamesIterator(
2982- static_context* sctx,
2983- const QueryLoc& loc,
2984- PlanIter_t& child)
2985- :
2986- UnaryBaseIterator<JSONObjectNamesIterator, JSONObjectNamesIteratorState>(sctx, loc, child)
2987- {}
2988-
2989- virtual ~JSONObjectNamesIterator();
2990-
2991- void accept(PlanIterVisitor& v) const;
2992-
2993- bool nextImpl(store::Item_t& result, PlanState& aPlanState) const;
2994-};
2995-
2996-
2997-/**
2998- *
2999- * Author:
3000- */
3001-class SingleObjectNamesIteratorState : public PlanIteratorState
3002-{
3003-public:
3004- store::Iterator_t theNames; //
3005-
3006- SingleObjectNamesIteratorState();
3007-
3008- ~SingleObjectNamesIteratorState();
3009-
3010- void init(PlanState&);
3011- void reset(PlanState&);
3012-};
3013-
3014-class SingleObjectNamesIterator : public UnaryBaseIterator<SingleObjectNamesIterator, SingleObjectNamesIteratorState>
3015-{
3016-public:
3017- SERIALIZABLE_CLASS(SingleObjectNamesIterator);
3018-
3019- SERIALIZABLE_CLASS_CONSTRUCTOR2T(SingleObjectNamesIterator,
3020- UnaryBaseIterator<SingleObjectNamesIterator, SingleObjectNamesIteratorState>);
3021-
3022- void serialize( ::zorba::serialization::Archiver& ar);
3023-
3024- SingleObjectNamesIterator(
3025- static_context* sctx,
3026- const QueryLoc& loc,
3027- PlanIter_t& child)
3028- :
3029- UnaryBaseIterator<SingleObjectNamesIterator, SingleObjectNamesIteratorState>(sctx, loc, child)
3030- {}
3031-
3032- virtual ~SingleObjectNamesIterator();
3033+class MultiObjectKeysIteratorState : public PlanIteratorState
3034+{
3035+public:
3036+ store::Iterator_t theObjKeysIte; //
3037+ store::Item_t theSecondObj; //
3038+ std::unique_ptr<HashSet<zstring, HashMapZStringCmp> > theUniqueKeys; //
3039+
3040+ MultiObjectKeysIteratorState();
3041+
3042+ ~MultiObjectKeysIteratorState();
3043+
3044+ void init(PlanState&);
3045+ void reset(PlanState&);
3046+};
3047+
3048+class MultiObjectKeysIterator : public UnaryBaseIterator<MultiObjectKeysIterator, MultiObjectKeysIteratorState>
3049+{
3050+public:
3051+ SERIALIZABLE_CLASS(MultiObjectKeysIterator);
3052+
3053+ SERIALIZABLE_CLASS_CONSTRUCTOR2T(MultiObjectKeysIterator,
3054+ UnaryBaseIterator<MultiObjectKeysIterator, MultiObjectKeysIteratorState>);
3055+
3056+ void serialize( ::zorba::serialization::Archiver& ar);
3057+
3058+ MultiObjectKeysIterator(
3059+ static_context* sctx,
3060+ const QueryLoc& loc,
3061+ PlanIter_t& child)
3062+ :
3063+ UnaryBaseIterator<MultiObjectKeysIterator, MultiObjectKeysIteratorState>(sctx, loc, child)
3064+ {}
3065+
3066+ virtual ~MultiObjectKeysIterator();
3067+
3068+ void accept(PlanIterVisitor& v) const;
3069+
3070+ bool nextImpl(store::Item_t& result, PlanState& aPlanState) const;
3071+};
3072+
3073+
3074+/**
3075+ *
3076+ * Author:
3077+ */
3078+class SingleObjectKeysIteratorState : public PlanIteratorState
3079+{
3080+public:
3081+ store::Iterator_t theObjKeysIte; //
3082+
3083+ SingleObjectKeysIteratorState();
3084+
3085+ ~SingleObjectKeysIteratorState();
3086+
3087+ void init(PlanState&);
3088+ void reset(PlanState&);
3089+};
3090+
3091+class SingleObjectKeysIterator : public UnaryBaseIterator<SingleObjectKeysIterator, SingleObjectKeysIteratorState>
3092+{
3093+public:
3094+ SERIALIZABLE_CLASS(SingleObjectKeysIterator);
3095+
3096+ SERIALIZABLE_CLASS_CONSTRUCTOR2T(SingleObjectKeysIterator,
3097+ UnaryBaseIterator<SingleObjectKeysIterator, SingleObjectKeysIteratorState>);
3098+
3099+ void serialize( ::zorba::serialization::Archiver& ar);
3100+
3101+ SingleObjectKeysIterator(
3102+ static_context* sctx,
3103+ const QueryLoc& loc,
3104+ PlanIter_t& child)
3105+ :
3106+ UnaryBaseIterator<SingleObjectKeysIterator, SingleObjectKeysIteratorState>(sctx, loc, child)
3107+ {}
3108+
3109+ virtual ~SingleObjectKeysIterator();
3110
3111 public:
3112 bool count(store::Item_t& result, PlanState& planState) const;
3113@@ -327,25 +285,68 @@
3114 *
3115 * Author:
3116 */
3117-class JSONObjectValueIterator : public BinaryBaseIterator<JSONObjectValueIterator, PlanIteratorState>
3118-{
3119-public:
3120- SERIALIZABLE_CLASS(JSONObjectValueIterator);
3121-
3122- SERIALIZABLE_CLASS_CONSTRUCTOR2T(JSONObjectValueIterator,
3123- BinaryBaseIterator<JSONObjectValueIterator, PlanIteratorState>);
3124-
3125- void serialize( ::zorba::serialization::Archiver& ar);
3126-
3127- JSONObjectValueIterator(
3128- static_context* sctx,
3129- const QueryLoc& loc,
3130- PlanIter_t& child1, PlanIter_t& child2)
3131- :
3132- BinaryBaseIterator<JSONObjectValueIterator, PlanIteratorState>(sctx, loc, child1, child2)
3133- {}
3134-
3135- virtual ~JSONObjectValueIterator();
3136+class MultiObjectLookupIteratorState : public PlanIteratorState
3137+{
3138+public:
3139+ store::Item_t theKey; //
3140+
3141+ MultiObjectLookupIteratorState();
3142+
3143+ ~MultiObjectLookupIteratorState();
3144+
3145+ void init(PlanState&);
3146+ void reset(PlanState&);
3147+};
3148+
3149+class MultiObjectLookupIterator : public BinaryBaseIterator<MultiObjectLookupIterator, MultiObjectLookupIteratorState>
3150+{
3151+public:
3152+ SERIALIZABLE_CLASS(MultiObjectLookupIterator);
3153+
3154+ SERIALIZABLE_CLASS_CONSTRUCTOR2T(MultiObjectLookupIterator,
3155+ BinaryBaseIterator<MultiObjectLookupIterator, MultiObjectLookupIteratorState>);
3156+
3157+ void serialize( ::zorba::serialization::Archiver& ar);
3158+
3159+ MultiObjectLookupIterator(
3160+ static_context* sctx,
3161+ const QueryLoc& loc,
3162+ PlanIter_t& child1, PlanIter_t& child2)
3163+ :
3164+ BinaryBaseIterator<MultiObjectLookupIterator, MultiObjectLookupIteratorState>(sctx, loc, child1, child2)
3165+ {}
3166+
3167+ virtual ~MultiObjectLookupIterator();
3168+
3169+ void accept(PlanIterVisitor& v) const;
3170+
3171+ bool nextImpl(store::Item_t& result, PlanState& aPlanState) const;
3172+};
3173+
3174+
3175+/**
3176+ *
3177+ * Author:
3178+ */
3179+class SingleObjectLookupIterator : public BinaryBaseIterator<SingleObjectLookupIterator, PlanIteratorState>
3180+{
3181+public:
3182+ SERIALIZABLE_CLASS(SingleObjectLookupIterator);
3183+
3184+ SERIALIZABLE_CLASS_CONSTRUCTOR2T(SingleObjectLookupIterator,
3185+ BinaryBaseIterator<SingleObjectLookupIterator, PlanIteratorState>);
3186+
3187+ void serialize( ::zorba::serialization::Archiver& ar);
3188+
3189+ SingleObjectLookupIterator(
3190+ static_context* sctx,
3191+ const QueryLoc& loc,
3192+ PlanIter_t& child1, PlanIter_t& child2)
3193+ :
3194+ BinaryBaseIterator<SingleObjectLookupIterator, PlanIteratorState>(sctx, loc, child1, child2)
3195+ {}
3196+
3197+ virtual ~SingleObjectLookupIterator();
3198
3199 void accept(PlanIterVisitor& v) const;
3200
3201@@ -443,68 +444,38 @@
3202 *
3203 * Author:
3204 */
3205-class JSONArrayMemberIterator : public BinaryBaseIterator<JSONArrayMemberIterator, PlanIteratorState>
3206-{
3207-public:
3208- SERIALIZABLE_CLASS(JSONArrayMemberIterator);
3209-
3210- SERIALIZABLE_CLASS_CONSTRUCTOR2T(JSONArrayMemberIterator,
3211- BinaryBaseIterator<JSONArrayMemberIterator, PlanIteratorState>);
3212-
3213- void serialize( ::zorba::serialization::Archiver& ar);
3214-
3215- JSONArrayMemberIterator(
3216- static_context* sctx,
3217- const QueryLoc& loc,
3218- PlanIter_t& child1, PlanIter_t& child2)
3219- :
3220- BinaryBaseIterator<JSONArrayMemberIterator, PlanIteratorState>(sctx, loc, child1, child2)
3221- {}
3222-
3223- virtual ~JSONArrayMemberIterator();
3224-
3225- void accept(PlanIterVisitor& v) const;
3226-
3227- bool nextImpl(store::Item_t& result, PlanState& aPlanState) const;
3228-};
3229-
3230-
3231-/**
3232- *
3233- * Author:
3234- */
3235-class JSONArrayMembersIteratorState : public PlanIteratorState
3236+class MultiArrayMembersIteratorState : public PlanIteratorState
3237 {
3238 public:
3239 store::Iterator_t theMembers; //
3240
3241- JSONArrayMembersIteratorState();
3242+ MultiArrayMembersIteratorState();
3243
3244- ~JSONArrayMembersIteratorState();
3245+ ~MultiArrayMembersIteratorState();
3246
3247 void init(PlanState&);
3248 void reset(PlanState&);
3249 };
3250
3251-class JSONArrayMembersIterator : public UnaryBaseIterator<JSONArrayMembersIterator, JSONArrayMembersIteratorState>
3252+class MultiArrayMembersIterator : public UnaryBaseIterator<MultiArrayMembersIterator, MultiArrayMembersIteratorState>
3253 {
3254 public:
3255- SERIALIZABLE_CLASS(JSONArrayMembersIterator);
3256+ SERIALIZABLE_CLASS(MultiArrayMembersIterator);
3257
3258- SERIALIZABLE_CLASS_CONSTRUCTOR2T(JSONArrayMembersIterator,
3259- UnaryBaseIterator<JSONArrayMembersIterator, JSONArrayMembersIteratorState>);
3260+ SERIALIZABLE_CLASS_CONSTRUCTOR2T(MultiArrayMembersIterator,
3261+ UnaryBaseIterator<MultiArrayMembersIterator, MultiArrayMembersIteratorState>);
3262
3263 void serialize( ::zorba::serialization::Archiver& ar);
3264
3265- JSONArrayMembersIterator(
3266+ MultiArrayMembersIterator(
3267 static_context* sctx,
3268 const QueryLoc& loc,
3269 PlanIter_t& child)
3270 :
3271- UnaryBaseIterator<JSONArrayMembersIterator, JSONArrayMembersIteratorState>(sctx, loc, child)
3272+ UnaryBaseIterator<MultiArrayMembersIterator, MultiArrayMembersIteratorState>(sctx, loc, child)
3273 {}
3274
3275- virtual ~JSONArrayMembersIterator();
3276+ virtual ~MultiArrayMembersIterator();
3277
3278 public:
3279 bool count(store::Item_t& result, PlanState& planState) const;
3280@@ -563,6 +534,79 @@
3281 *
3282 * Author:
3283 */
3284+class MultiArrayLookupIteratorState : public PlanIteratorState
3285+{
3286+public:
3287+ store::Item_t thePosition; //
3288+
3289+ MultiArrayLookupIteratorState();
3290+
3291+ ~MultiArrayLookupIteratorState();
3292+
3293+ void init(PlanState&);
3294+ void reset(PlanState&);
3295+};
3296+
3297+class MultiArrayLookupIterator : public BinaryBaseIterator<MultiArrayLookupIterator, MultiArrayLookupIteratorState>
3298+{
3299+public:
3300+ SERIALIZABLE_CLASS(MultiArrayLookupIterator);
3301+
3302+ SERIALIZABLE_CLASS_CONSTRUCTOR2T(MultiArrayLookupIterator,
3303+ BinaryBaseIterator<MultiArrayLookupIterator, MultiArrayLookupIteratorState>);
3304+
3305+ void serialize( ::zorba::serialization::Archiver& ar);
3306+
3307+ MultiArrayLookupIterator(
3308+ static_context* sctx,
3309+ const QueryLoc& loc,
3310+ PlanIter_t& child1, PlanIter_t& child2)
3311+ :
3312+ BinaryBaseIterator<MultiArrayLookupIterator, MultiArrayLookupIteratorState>(sctx, loc, child1, child2)
3313+ {}
3314+
3315+ virtual ~MultiArrayLookupIterator();
3316+
3317+ void accept(PlanIterVisitor& v) const;
3318+
3319+ bool nextImpl(store::Item_t& result, PlanState& aPlanState) const;
3320+};
3321+
3322+
3323+/**
3324+ *
3325+ * Author:
3326+ */
3327+class SingleArrayLookupIterator : public BinaryBaseIterator<SingleArrayLookupIterator, PlanIteratorState>
3328+{
3329+public:
3330+ SERIALIZABLE_CLASS(SingleArrayLookupIterator);
3331+
3332+ SERIALIZABLE_CLASS_CONSTRUCTOR2T(SingleArrayLookupIterator,
3333+ BinaryBaseIterator<SingleArrayLookupIterator, PlanIteratorState>);
3334+
3335+ void serialize( ::zorba::serialization::Archiver& ar);
3336+
3337+ SingleArrayLookupIterator(
3338+ static_context* sctx,
3339+ const QueryLoc& loc,
3340+ PlanIter_t& child1, PlanIter_t& child2)
3341+ :
3342+ BinaryBaseIterator<SingleArrayLookupIterator, PlanIteratorState>(sctx, loc, child1, child2)
3343+ {}
3344+
3345+ virtual ~SingleArrayLookupIterator();
3346+
3347+ void accept(PlanIterVisitor& v) const;
3348+
3349+ bool nextImpl(store::Item_t& result, PlanState& aPlanState) const;
3350+};
3351+
3352+
3353+/**
3354+ *
3355+ * Author:
3356+ */
3357 class JSONArraySizeIterator : public UnaryBaseIterator<JSONArraySizeIterator, PlanIteratorState>
3358 {
3359 public:
3360
3361=== modified file 'src/runtime/pregenerated/iterator_enum.h'
3362--- src/runtime/pregenerated/iterator_enum.h 2013-08-14 15:16:42 +0000
3363+++ src/runtime/pregenerated/iterator_enum.h 2013-08-16 17:18:24 +0000
3364@@ -167,15 +167,16 @@
3365 TYPE_JSONDecodeFromRoundtripIterator,
3366 TYPE_JSONEncodeForRoundtripIterator,
3367 TYPE_JSONParseIterator,
3368- TYPE_JSONItemAccessorIterator,
3369- TYPE_JSONObjectNamesIterator,
3370- TYPE_SingleObjectNamesIterator,
3371- TYPE_JSONObjectValueIterator,
3372+ TYPE_MultiObjectKeysIterator,
3373+ TYPE_SingleObjectKeysIterator,
3374+ TYPE_MultiObjectLookupIterator,
3375+ TYPE_SingleObjectLookupIterator,
3376 TYPE_JSONObjectProjectIterator,
3377 TYPE_JSONObjectTrimIterator,
3378- TYPE_JSONArrayMemberIterator,
3379- TYPE_JSONArrayMembersIterator,
3380+ TYPE_MultiArrayMembersIterator,
3381 TYPE_SingleArrayMembersIterator,
3382+ TYPE_MultiArrayLookupIterator,
3383+ TYPE_SingleArrayLookupIterator,
3384 TYPE_JSONArraySizeIterator,
3385 TYPE_JSONArrayFlattenIterator,
3386 TYPE_JSONNullIterator,
3387
3388=== modified file 'src/runtime/spec/json/jsoniq_functions.xml'
3389--- src/runtime/spec/json/jsoniq_functions.xml 2013-08-14 15:16:42 +0000
3390+++ src/runtime/spec/json/jsoniq_functions.xml 2013-08-16 17:18:24 +0000
3391@@ -202,42 +202,7 @@
3392 /*******************************************************************************
3393 ********************************************************************************/
3394 -->
3395-<zorba:iterator name="JSONItemAccessorIterator">
3396-
3397- <zorba:function isDeterministic="true">
3398-
3399- <zorba:signature localname="json-item-accessor" prefix="op-zorba">
3400- <zorba:param>item()?</zorba:param>
3401- <zorba:output>item()*</zorba:output>
3402- </zorba:signature>
3403-
3404- <zorba:signature localname="json-item-accessor" prefix="op-zorba">
3405- <zorba:param>item()?</zorba:param>
3406- <zorba:param>item()?</zorba:param>
3407- <zorba:output>item()?</zorba:output>
3408- </zorba:signature>
3409-
3410- <zorba:methods>
3411- <zorba:getReturnType/>
3412- <zorba:propagatesInputNodes producer="0"/>
3413- <zorba:mustCopyInputNodes value="false"/>
3414- </zorba:methods>
3415-
3416- </zorba:function>
3417-
3418- <zorba:state>
3419- <zorba:member type="store::Iterator_t" name="theIterator"/>
3420- </zorba:state>
3421-
3422-</zorba:iterator>
3423-
3424-
3425-
3426-<!--
3427-/*******************************************************************************
3428-********************************************************************************/
3429--->
3430-<zorba:iterator name="JSONObjectNamesIterator" arity="unary">
3431+<zorba:iterator name="MultiObjectKeysIterator" arity="unary">
3432
3433 <zorba:function isDeterministic="true"
3434 generateCodegen="false">
3435@@ -257,10 +222,12 @@
3436
3437 <zorba:state generateInit="false" generateReset="false">
3438
3439- <zorba:member type="store::Iterator_t" name="theNames"/>
3440+ <zorba:member type="store::Iterator_t" name="theObjKeysIte"/>
3441+
3442+ <zorba:member type="store::Item_t" name="theSecondObj"/>
3443
3444 <zorba:member type="std::unique_ptr&lt;HashSet&lt;zstring, HashMapZStringCmp> >"
3445- name="theNamesSet"/>
3446+ name="theUniqueKeys"/>
3447 </zorba:state>
3448
3449 </zorba:iterator>
3450@@ -270,7 +237,7 @@
3451 /*******************************************************************************
3452 ********************************************************************************/
3453 -->
3454-<zorba:iterator name="SingleObjectNamesIterator" arity="unary">
3455+<zorba:iterator name="SingleObjectKeysIterator" arity="unary">
3456
3457 <zorba:function isDeterministic="true">
3458
3459@@ -287,7 +254,7 @@
3460 </zorba:function>
3461
3462 <zorba:state>
3463- <zorba:member type="store::Iterator_t" name="theNames" brief=""/>
3464+ <zorba:member type="store::Iterator_t" name="theObjKeysIte" brief=""/>
3465 </zorba:state>
3466
3467 <zorba:method name="count" const="true" return="bool">
3468@@ -302,11 +269,41 @@
3469 /*******************************************************************************
3470 ********************************************************************************/
3471 -->
3472-<zorba:iterator name="JSONObjectValueIterator" arity="binary">
3473+<zorba:iterator name="MultiObjectLookupIterator" arity="binary">
3474+
3475+ <zorba:function isDeterministic="true"
3476+ generateCodegen="false">
3477+
3478+ <zorba:signature localname="multi-object-lookup" prefix="op-zorba">
3479+ <zorba:param>item()*</zorba:param>
3480+ <zorba:param>item()?</zorba:param>
3481+ <zorba:output>item()*</zorba:output>
3482+ </zorba:signature>
3483+
3484+ <zorba:methods>
3485+ <zorba:getReturnType/>
3486+ <zorba:propagatesInputNodes producer="0"/>
3487+ <zorba:mustCopyInputNodes value="false"/>
3488+ </zorba:methods>
3489+
3490+ </zorba:function>
3491+
3492+ <zorba:state>
3493+ <zorba:member type="store::Item_t" name="theKey"/>
3494+ </zorba:state>
3495+
3496+</zorba:iterator>
3497+
3498+
3499+<!--
3500+/*******************************************************************************
3501+********************************************************************************/
3502+-->
3503+<zorba:iterator name="SingleObjectLookupIterator" arity="binary">
3504
3505 <zorba:function isDeterministic="true">
3506
3507- <zorba:signature localname="object-value" prefix="op-zorba">
3508+ <zorba:signature localname="single-object-lookup" prefix="op-zorba">
3509 <zorba:param>item()?</zorba:param>
3510 <zorba:param>item()?</zorba:param>
3511 <zorba:output>item()?</zorba:output>
3512@@ -387,32 +384,7 @@
3513 /*******************************************************************************
3514 ********************************************************************************/
3515 -->
3516-<zorba:iterator name="JSONArrayMemberIterator" arity="binary">
3517-
3518- <zorba:function isDeterministic="true">
3519-
3520- <zorba:signature localname="array-member" prefix="op-zorba">
3521- <zorba:param>item()?</zorba:param>
3522- <zorba:param>item()?</zorba:param>
3523- <zorba:output>item()?</zorba:output>
3524- </zorba:signature>
3525-
3526- <zorba:methods>
3527- <zorba:getReturnType/>
3528- <zorba:propagatesInputNodes producer="0"/>
3529- <zorba:mustCopyInputNodes value="false"/>
3530- </zorba:methods>
3531-
3532- </zorba:function>
3533-
3534-</zorba:iterator>
3535-
3536-
3537-<!--
3538-/*******************************************************************************
3539-********************************************************************************/
3540--->
3541-<zorba:iterator name="JSONArrayMembersIterator" arity="unary">
3542+<zorba:iterator name="MultiArrayMembersIterator" arity="unary">
3543
3544 <zorba:function isDeterministic="true"
3545 generateCodegen="false">
3546@@ -478,6 +450,62 @@
3547 /*******************************************************************************
3548 ********************************************************************************/
3549 -->
3550+<zorba:iterator name="MultiArrayLookupIterator" arity="binary">
3551+
3552+ <zorba:function isDeterministic="true"
3553+ generateCodegen="false">
3554+
3555+ <zorba:signature localname="multi-array-lookup" prefix="op-zorba">
3556+ <zorba:param>item()*</zorba:param>
3557+ <zorba:param>item()?</zorba:param>
3558+ <zorba:output>item()*</zorba:output>
3559+ </zorba:signature>
3560+
3561+ <zorba:methods>
3562+ <zorba:getReturnType/>
3563+ <zorba:propagatesInputNodes producer="0"/>
3564+ <zorba:mustCopyInputNodes value="false"/>
3565+ <zorba:isMap producer="0"/>
3566+ </zorba:methods>
3567+
3568+ </zorba:function>
3569+
3570+ <zorba:state>
3571+ <zorba:member type="store::Item_t" name="thePosition"/>
3572+ </zorba:state>
3573+
3574+</zorba:iterator>
3575+
3576+
3577+<!--
3578+/*******************************************************************************
3579+********************************************************************************/
3580+-->
3581+<zorba:iterator name="SingleArrayLookupIterator" arity="binary">
3582+
3583+ <zorba:function isDeterministic="true">
3584+
3585+ <zorba:signature localname="single-array-lookup" prefix="op-zorba">
3586+ <zorba:param>item()?</zorba:param>
3587+ <zorba:param>item()?</zorba:param>
3588+ <zorba:output>item()?</zorba:output>
3589+ </zorba:signature>
3590+
3591+ <zorba:methods>
3592+ <zorba:getReturnType/>
3593+ <zorba:propagatesInputNodes producer="0"/>
3594+ <zorba:mustCopyInputNodes value="false"/>
3595+ </zorba:methods>
3596+
3597+ </zorba:function>
3598+
3599+</zorba:iterator>
3600+
3601+
3602+<!--
3603+/*******************************************************************************
3604+********************************************************************************/
3605+-->
3606 <zorba:iterator name="JSONArraySizeIterator" arity="unary">
3607
3608 <zorba:function isDeterministic="true">
3609
3610=== modified file 'src/runtime/visitors/planiter_visitor_impl_code.h'
3611--- src/runtime/visitors/planiter_visitor_impl_code.h 2013-06-15 02:57:08 +0000
3612+++ src/runtime/visitors/planiter_visitor_impl_code.h 2013-08-16 17:18:24 +0000
3613@@ -352,7 +352,8 @@
3614 PLAN_ITER_VISITOR(CreateInternalIndexIterator);
3615 PLAN_ITER_VISITOR(DeleteIndexIterator);
3616
3617- PLAN_ITER_VISITOR(DynamicFnCallIterator);
3618+ PLAN_ITER_VISITOR(SingleDynamicFnCallIterator);
3619+ PLAN_ITER_VISITOR(MultiDynamicFnCallIterator);
3620 PLAN_ITER_VISITOR(ArgumentPlaceholderIterator);
3621
3622 PLAN_ITER_VISITOR(EvalIterator);
3623
3624=== modified file 'src/runtime/visitors/planiter_visitor_impl_include.h'
3625--- src/runtime/visitors/planiter_visitor_impl_include.h 2013-06-15 02:57:08 +0000
3626+++ src/runtime/visitors/planiter_visitor_impl_include.h 2013-08-16 17:18:24 +0000
3627@@ -172,7 +172,8 @@
3628 class CreateInternalIndexIterator;
3629 class DeleteIndexIterator;
3630
3631-class DynamicFnCallIterator;
3632+class SingleDynamicFnCallIterator;
3633+class MultiDynamicFnCallIterator;
3634 class ArgumentPlaceholderIterator;
3635
3636 class EvalIterator;
3637
3638=== modified file 'src/runtime/visitors/pregenerated/planiter_visitor.h'
3639--- src/runtime/visitors/pregenerated/planiter_visitor.h 2013-08-14 15:16:42 +0000
3640+++ src/runtime/visitors/pregenerated/planiter_visitor.h 2013-08-16 17:18:24 +0000
3641@@ -340,24 +340,26 @@
3642
3643 class JSONParseIterator;
3644
3645- class JSONItemAccessorIterator;
3646-
3647- class JSONObjectNamesIterator;
3648-
3649- class SingleObjectNamesIterator;
3650-
3651- class JSONObjectValueIterator;
3652+ class MultiObjectKeysIterator;
3653+
3654+ class SingleObjectKeysIterator;
3655+
3656+ class MultiObjectLookupIterator;
3657+
3658+ class SingleObjectLookupIterator;
3659
3660 class JSONObjectProjectIterator;
3661
3662 class JSONObjectTrimIterator;
3663
3664- class JSONArrayMemberIterator;
3665-
3666- class JSONArrayMembersIterator;
3667+ class MultiArrayMembersIterator;
3668
3669 class SingleArrayMembersIterator;
3670
3671+ class MultiArrayLookupIterator;
3672+
3673+ class SingleArrayLookupIterator;
3674+
3675 class JSONArraySizeIterator;
3676
3677 class JSONArrayFlattenIterator;
3678@@ -1214,17 +1216,17 @@
3679 virtual void beginVisit ( const JSONParseIterator& ) = 0;
3680 virtual void endVisit ( const JSONParseIterator& ) = 0;
3681
3682- virtual void beginVisit ( const JSONItemAccessorIterator& ) = 0;
3683- virtual void endVisit ( const JSONItemAccessorIterator& ) = 0;
3684-
3685- virtual void beginVisit ( const JSONObjectNamesIterator& ) = 0;
3686- virtual void endVisit ( const JSONObjectNamesIterator& ) = 0;
3687-
3688- virtual void beginVisit ( const SingleObjectNamesIterator& ) = 0;
3689- virtual void endVisit ( const SingleObjectNamesIterator& ) = 0;
3690-
3691- virtual void beginVisit ( const JSONObjectValueIterator& ) = 0;
3692- virtual void endVisit ( const JSONObjectValueIterator& ) = 0;
3693+ virtual void beginVisit ( const MultiObjectKeysIterator& ) = 0;
3694+ virtual void endVisit ( const MultiObjectKeysIterator& ) = 0;
3695+
3696+ virtual void beginVisit ( const SingleObjectKeysIterator& ) = 0;
3697+ virtual void endVisit ( const SingleObjectKeysIterator& ) = 0;
3698+
3699+ virtual void beginVisit ( const MultiObjectLookupIterator& ) = 0;
3700+ virtual void endVisit ( const MultiObjectLookupIterator& ) = 0;
3701+
3702+ virtual void beginVisit ( const SingleObjectLookupIterator& ) = 0;
3703+ virtual void endVisit ( const SingleObjectLookupIterator& ) = 0;
3704
3705 virtual void beginVisit ( const JSONObjectProjectIterator& ) = 0;
3706 virtual void endVisit ( const JSONObjectProjectIterator& ) = 0;
3707@@ -1232,15 +1234,18 @@
3708 virtual void beginVisit ( const JSONObjectTrimIterator& ) = 0;
3709 virtual void endVisit ( const JSONObjectTrimIterator& ) = 0;
3710
3711- virtual void beginVisit ( const JSONArrayMemberIterator& ) = 0;
3712- virtual void endVisit ( const JSONArrayMemberIterator& ) = 0;
3713-
3714- virtual void beginVisit ( const JSONArrayMembersIterator& ) = 0;
3715- virtual void endVisit ( const JSONArrayMembersIterator& ) = 0;
3716+ virtual void beginVisit ( const MultiArrayMembersIterator& ) = 0;
3717+ virtual void endVisit ( const MultiArrayMembersIterator& ) = 0;
3718
3719 virtual void beginVisit ( const SingleArrayMembersIterator& ) = 0;
3720 virtual void endVisit ( const SingleArrayMembersIterator& ) = 0;
3721
3722+ virtual void beginVisit ( const MultiArrayLookupIterator& ) = 0;
3723+ virtual void endVisit ( const MultiArrayLookupIterator& ) = 0;
3724+
3725+ virtual void beginVisit ( const SingleArrayLookupIterator& ) = 0;
3726+ virtual void endVisit ( const SingleArrayLookupIterator& ) = 0;
3727+
3728 virtual void beginVisit ( const JSONArraySizeIterator& ) = 0;
3729 virtual void endVisit ( const JSONArraySizeIterator& ) = 0;
3730
3731
3732=== modified file 'src/runtime/visitors/pregenerated/printer_visitor.cpp'
3733--- src/runtime/visitors/pregenerated/printer_visitor.cpp 2013-08-14 15:16:42 +0000
3734+++ src/runtime/visitors/pregenerated/printer_visitor.cpp 2013-08-16 17:18:24 +0000
3735@@ -2052,60 +2052,60 @@
3736 // </JSONParseIterator>
3737
3738
3739-// <JSONItemAccessorIterator>
3740-void PrinterVisitor::beginVisit ( const JSONItemAccessorIterator& a) {
3741- thePrinter.startBeginVisit("JSONItemAccessorIterator", ++theId);
3742- printCommons( &a, theId );
3743- thePrinter.endBeginVisit( theId );
3744-}
3745-
3746-void PrinterVisitor::endVisit ( const JSONItemAccessorIterator& ) {
3747- thePrinter.startEndVisit();
3748- thePrinter.endEndVisit();
3749-}
3750-// </JSONItemAccessorIterator>
3751-
3752-
3753-// <JSONObjectNamesIterator>
3754-void PrinterVisitor::beginVisit ( const JSONObjectNamesIterator& a) {
3755- thePrinter.startBeginVisit("JSONObjectNamesIterator", ++theId);
3756- printCommons( &a, theId );
3757- thePrinter.endBeginVisit( theId );
3758-}
3759-
3760-void PrinterVisitor::endVisit ( const JSONObjectNamesIterator& ) {
3761- thePrinter.startEndVisit();
3762- thePrinter.endEndVisit();
3763-}
3764-// </JSONObjectNamesIterator>
3765-
3766-
3767-// <SingleObjectNamesIterator>
3768-void PrinterVisitor::beginVisit ( const SingleObjectNamesIterator& a) {
3769- thePrinter.startBeginVisit("SingleObjectNamesIterator", ++theId);
3770- printCommons( &a, theId );
3771- thePrinter.endBeginVisit( theId );
3772-}
3773-
3774-void PrinterVisitor::endVisit ( const SingleObjectNamesIterator& ) {
3775- thePrinter.startEndVisit();
3776- thePrinter.endEndVisit();
3777-}
3778-// </SingleObjectNamesIterator>
3779-
3780-
3781-// <JSONObjectValueIterator>
3782-void PrinterVisitor::beginVisit ( const JSONObjectValueIterator& a) {
3783- thePrinter.startBeginVisit("JSONObjectValueIterator", ++theId);
3784- printCommons( &a, theId );
3785- thePrinter.endBeginVisit( theId );
3786-}
3787-
3788-void PrinterVisitor::endVisit ( const JSONObjectValueIterator& ) {
3789- thePrinter.startEndVisit();
3790- thePrinter.endEndVisit();
3791-}
3792-// </JSONObjectValueIterator>
3793+// <MultiObjectKeysIterator>
3794+void PrinterVisitor::beginVisit ( const MultiObjectKeysIterator& a) {
3795+ thePrinter.startBeginVisit("MultiObjectKeysIterator", ++theId);
3796+ printCommons( &a, theId );
3797+ thePrinter.endBeginVisit( theId );
3798+}
3799+
3800+void PrinterVisitor::endVisit ( const MultiObjectKeysIterator& ) {
3801+ thePrinter.startEndVisit();
3802+ thePrinter.endEndVisit();
3803+}
3804+// </MultiObjectKeysIterator>
3805+
3806+
3807+// <SingleObjectKeysIterator>
3808+void PrinterVisitor::beginVisit ( const SingleObjectKeysIterator& a) {
3809+ thePrinter.startBeginVisit("SingleObjectKeysIterator", ++theId);
3810+ printCommons( &a, theId );
3811+ thePrinter.endBeginVisit( theId );
3812+}
3813+
3814+void PrinterVisitor::endVisit ( const SingleObjectKeysIterator& ) {
3815+ thePrinter.startEndVisit();
3816+ thePrinter.endEndVisit();
3817+}
3818+// </SingleObjectKeysIterator>
3819+
3820+
3821+// <MultiObjectLookupIterator>
3822+void PrinterVisitor::beginVisit ( const MultiObjectLookupIterator& a) {
3823+ thePrinter.startBeginVisit("MultiObjectLookupIterator", ++theId);
3824+ printCommons( &a, theId );
3825+ thePrinter.endBeginVisit( theId );
3826+}
3827+
3828+void PrinterVisitor::endVisit ( const MultiObjectLookupIterator& ) {
3829+ thePrinter.startEndVisit();
3830+ thePrinter.endEndVisit();
3831+}
3832+// </MultiObjectLookupIterator>
3833+
3834+
3835+// <SingleObjectLookupIterator>
3836+void PrinterVisitor::beginVisit ( const SingleObjectLookupIterator& a) {
3837+ thePrinter.startBeginVisit("SingleObjectLookupIterator", ++theId);
3838+ printCommons( &a, theId );
3839+ thePrinter.endBeginVisit( theId );
3840+}
3841+
3842+void PrinterVisitor::endVisit ( const SingleObjectLookupIterator& ) {
3843+ thePrinter.startEndVisit();
3844+ thePrinter.endEndVisit();
3845+}
3846+// </SingleObjectLookupIterator>
3847
3848
3849 // <JSONObjectProjectIterator>
3850@@ -2136,32 +2136,18 @@
3851 // </JSONObjectTrimIterator>
3852
3853
3854-// <JSONArrayMemberIterator>
3855-void PrinterVisitor::beginVisit ( const JSONArrayMemberIterator& a) {
3856- thePrinter.startBeginVisit("JSONArrayMemberIterator", ++theId);
3857- printCommons( &a, theId );
3858- thePrinter.endBeginVisit( theId );
3859-}
3860-
3861-void PrinterVisitor::endVisit ( const JSONArrayMemberIterator& ) {
3862- thePrinter.startEndVisit();
3863- thePrinter.endEndVisit();
3864-}
3865-// </JSONArrayMemberIterator>
3866-
3867-
3868-// <JSONArrayMembersIterator>
3869-void PrinterVisitor::beginVisit ( const JSONArrayMembersIterator& a) {
3870- thePrinter.startBeginVisit("JSONArrayMembersIterator", ++theId);
3871- printCommons( &a, theId );
3872- thePrinter.endBeginVisit( theId );
3873-}
3874-
3875-void PrinterVisitor::endVisit ( const JSONArrayMembersIterator& ) {
3876- thePrinter.startEndVisit();
3877- thePrinter.endEndVisit();
3878-}
3879-// </JSONArrayMembersIterator>
3880+// <MultiArrayMembersIterator>
3881+void PrinterVisitor::beginVisit ( const MultiArrayMembersIterator& a) {
3882+ thePrinter.startBeginVisit("MultiArrayMembersIterator", ++theId);
3883+ printCommons( &a, theId );
3884+ thePrinter.endBeginVisit( theId );
3885+}
3886+
3887+void PrinterVisitor::endVisit ( const MultiArrayMembersIterator& ) {
3888+ thePrinter.startEndVisit();
3889+ thePrinter.endEndVisit();
3890+}
3891+// </MultiArrayMembersIterator>
3892
3893
3894 // <SingleArrayMembersIterator>
3895@@ -2178,6 +2164,34 @@
3896 // </SingleArrayMembersIterator>
3897
3898
3899+// <MultiArrayLookupIterator>
3900+void PrinterVisitor::beginVisit ( const MultiArrayLookupIterator& a) {
3901+ thePrinter.startBeginVisit("MultiArrayLookupIterator", ++theId);
3902+ printCommons( &a, theId );
3903+ thePrinter.endBeginVisit( theId );
3904+}
3905+
3906+void PrinterVisitor::endVisit ( const MultiArrayLookupIterator& ) {
3907+ thePrinter.startEndVisit();
3908+ thePrinter.endEndVisit();
3909+}
3910+// </MultiArrayLookupIterator>
3911+
3912+
3913+// <SingleArrayLookupIterator>
3914+void PrinterVisitor::beginVisit ( const SingleArrayLookupIterator& a) {
3915+ thePrinter.startBeginVisit("SingleArrayLookupIterator", ++theId);
3916+ printCommons( &a, theId );
3917+ thePrinter.endBeginVisit( theId );
3918+}
3919+
3920+void PrinterVisitor::endVisit ( const SingleArrayLookupIterator& ) {
3921+ thePrinter.startEndVisit();
3922+ thePrinter.endEndVisit();
3923+}
3924+// </SingleArrayLookupIterator>
3925+
3926+
3927 // <JSONArraySizeIterator>
3928 void PrinterVisitor::beginVisit ( const JSONArraySizeIterator& a) {
3929 thePrinter.startBeginVisit("JSONArraySizeIterator", ++theId);
3930
3931=== modified file 'src/runtime/visitors/pregenerated/printer_visitor.h'
3932--- src/runtime/visitors/pregenerated/printer_visitor.h 2013-08-14 15:16:42 +0000
3933+++ src/runtime/visitors/pregenerated/printer_visitor.h 2013-08-16 17:18:24 +0000
3934@@ -520,17 +520,17 @@
3935 void beginVisit( const JSONParseIterator& );
3936 void endVisit ( const JSONParseIterator& );
3937
3938- void beginVisit( const JSONItemAccessorIterator& );
3939- void endVisit ( const JSONItemAccessorIterator& );
3940-
3941- void beginVisit( const JSONObjectNamesIterator& );
3942- void endVisit ( const JSONObjectNamesIterator& );
3943-
3944- void beginVisit( const SingleObjectNamesIterator& );
3945- void endVisit ( const SingleObjectNamesIterator& );
3946-
3947- void beginVisit( const JSONObjectValueIterator& );
3948- void endVisit ( const JSONObjectValueIterator& );
3949+ void beginVisit( const MultiObjectKeysIterator& );
3950+ void endVisit ( const MultiObjectKeysIterator& );
3951+
3952+ void beginVisit( const SingleObjectKeysIterator& );
3953+ void endVisit ( const SingleObjectKeysIterator& );
3954+
3955+ void beginVisit( const MultiObjectLookupIterator& );
3956+ void endVisit ( const MultiObjectLookupIterator& );
3957+
3958+ void beginVisit( const SingleObjectLookupIterator& );
3959+ void endVisit ( const SingleObjectLookupIterator& );
3960
3961 void beginVisit( const JSONObjectProjectIterator& );
3962 void endVisit ( const JSONObjectProjectIterator& );
3963@@ -538,15 +538,18 @@
3964 void beginVisit( const JSONObjectTrimIterator& );
3965 void endVisit ( const JSONObjectTrimIterator& );
3966
3967- void beginVisit( const JSONArrayMemberIterator& );
3968- void endVisit ( const JSONArrayMemberIterator& );
3969-
3970- void beginVisit( const JSONArrayMembersIterator& );
3971- void endVisit ( const JSONArrayMembersIterator& );
3972+ void beginVisit( const MultiArrayMembersIterator& );
3973+ void endVisit ( const MultiArrayMembersIterator& );
3974
3975 void beginVisit( const SingleArrayMembersIterator& );
3976 void endVisit ( const SingleArrayMembersIterator& );
3977
3978+ void beginVisit( const MultiArrayLookupIterator& );
3979+ void endVisit ( const MultiArrayLookupIterator& );
3980+
3981+ void beginVisit( const SingleArrayLookupIterator& );
3982+ void endVisit ( const SingleArrayLookupIterator& );
3983+
3984 void beginVisit( const JSONArraySizeIterator& );
3985 void endVisit ( const JSONArraySizeIterator& );
3986
3987
3988=== modified file 'src/runtime/visitors/printer_visitor_impl.cpp'
3989--- src/runtime/visitors/printer_visitor_impl.cpp 2013-06-15 02:57:08 +0000
3990+++ src/runtime/visitors/printer_visitor_impl.cpp 2013-08-16 17:18:24 +0000
3991@@ -1543,7 +1543,8 @@
3992
3993 #undef PRINTER_INSERT_NODES_VISITOR_DEFINITION
3994
3995- PRINTER_VISITOR_DEFINITION(DynamicFnCallIterator);
3996+ PRINTER_VISITOR_DEFINITION(SingleDynamicFnCallIterator);
3997+ PRINTER_VISITOR_DEFINITION(MultiDynamicFnCallIterator);
3998 PRINTER_VISITOR_DEFINITION(ArgumentPlaceholderIterator);
3999
4000 PRINTER_VISITOR_DEFINITION(EvalIterator);
4001
4002=== modified file 'src/runtime/visitors/printer_visitor_impl.h'
4003--- src/runtime/visitors/printer_visitor_impl.h 2013-06-15 02:57:08 +0000
4004+++ src/runtime/visitors/printer_visitor_impl.h 2013-08-16 17:18:24 +0000
4005@@ -307,7 +307,8 @@
4006 DECLARE_VISITOR(CreateInternalIndexIterator);
4007 DECLARE_VISITOR(DeleteIndexIterator);
4008
4009- DECLARE_VISITOR(DynamicFnCallIterator);
4010+ DECLARE_VISITOR(SingleDynamicFnCallIterator);
4011+ DECLARE_VISITOR(MultiDynamicFnCallIterator);
4012 DECLARE_VISITOR(ArgumentPlaceholderIterator);
4013
4014 DECLARE_VISITOR(EvalIterator);
4015
4016=== modified file 'src/zorbaserialization/archiver_consts.h'
4017--- src/zorbaserialization/archiver_consts.h 2013-06-27 15:54:27 +0000
4018+++ src/zorbaserialization/archiver_consts.h 2013-08-16 17:18:24 +0000
4019@@ -250,7 +250,8 @@
4020
4021 TYPE_FunctionItemIterator,
4022 TYPE_FunctionItemInfo,
4023- TYPE_DynamicFnCallIterator,
4024+ TYPE_SingleDynamicFnCallIterator,
4025+ TYPE_MultiDynamicFnCallIterator,
4026 TYPE_ArgumentPlaceholderIterator,
4027
4028 TYPE_CountCollectionIterator,
4029
4030=== modified file 'test/fots/CMakeLists.txt'
4031--- test/fots/CMakeLists.txt 2013-08-12 19:48:58 +0000
4032+++ test/fots/CMakeLists.txt 2013-08-16 17:18:24 +0000
4033@@ -141,6 +141,8 @@
4034
4035 EXPECTED_FOTS_FAILURE (fn-fold-left fold-left-009 1187685)
4036 EXPECTED_FOTS_FAILURE (fn-for-each-pair fn-for-each-pair-026 1187685)
4037+EXPECTED_FOTS_FAILURE (fn-for-each-pair fn-for-each-pair-034 000)
4038+EXPECTED_FOTS_FAILURE (fn-for-each-pair fn-for-each-pair-035 000)
4039 EXPECTED_FOTS_FAILURE (fn-format-number numberformat20 1167641)
4040 EXPECTED_FOTS_FAILURE (fn-format-number numberformat60a 1167609)
4041 EXPECTED_FOTS_FAILURE (fn-format-number numberformat60m 1167609)
4042@@ -153,7 +155,6 @@
4043 EXPECTED_FOTS_FAILURE (fn-format-number numberformat88 1167641)
4044 EXPECTED_FOTS_FAILURE (fn-format-number cbcl-fn-format-number-003 1200494)
4045 EXPECTED_FOTS_FAILURE (fn-function-lookup fn-function-lookup-062 1187685)
4046-EXPECTED_FOTS_FAILURE (fn-function-lookup fn-function-lookup-530 1188329)
4047 EXPECTED_FOTS_FAILURE (fn-in-scope-prefixes K2-InScopePrefixesFunc-25 1200498)
4048 EXPECTED_FOTS_FAILURE (fn-matches cbcl-matches-038 1131304)
4049 EXPECTED_FOTS_FAILURE (fn-normalize-space fn-normalize-space-23 1187802)
4050
4051=== modified file 'test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_veq_08b.iter'
4052--- test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_veq_08b.iter 2013-02-21 06:30:02 +0000
4053+++ test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_veq_08b.iter 2013-08-16 17:18:24 +0000
4054@@ -10,10 +10,10 @@
4055 <ForVarIterator varname="$$context-item"/>
4056 <PromoteIterator type="xs:string">
4057 <FnDataIterator>
4058- <JSONObjectValueIterator>
4059+ <SingleObjectLookupIterator>
4060 <ForVarIterator varname="$$context-item"/>
4061 <SingletonIterator value="xs:string(question_id)"/>
4062- </JSONObjectValueIterator>
4063+ </SingleObjectLookupIterator>
4064 </FnDataIterator>
4065 </PromoteIterator>
4066 </ValueIndexEntryBuilderIterator>
4067@@ -64,10 +64,10 @@
4068 <Spec>
4069 <TreatIterator quant="?">
4070 <FnDataIterator>
4071- <JSONObjectValueIterator>
4072+ <SingleObjectLookupIterator>
4073 <ForVarIterator varname="answers"/>
4074 <SingletonIterator value="xs:string(question_id)"/>
4075- </JSONObjectValueIterator>
4076+ </SingleObjectLookupIterator>
4077 </FnDataIterator>
4078 </TreatIterator>
4079 <GroupVariable/>
4080@@ -86,25 +86,25 @@
4081 <SingletonIterator value="xs:string(title)"/>
4082 <SingletonIterator value="xs:string(answer_count)"/>
4083 <JSONBoxIterator>
4084- <flwor::FLWORIterator>
4085- <ForVariable name="$$context-item">
4086- <ProbeIndexRangeValueIterator>
4087- <SingletonIterator value="xs:QName(http://28.io/collections,db28,question-id-idx)"/>
4088- <ForVarIterator varname="id"/>
4089- <ForVarIterator varname="id"/>
4090- <SingletonIterator value="xs:boolean(true)"/>
4091- <SingletonIterator value="xs:boolean(true)"/>
4092- <SingletonIterator value="xs:boolean(true)"/>
4093- <SingletonIterator value="xs:boolean(true)"/>
4094- </ProbeIndexRangeValueIterator>
4095- </ForVariable>
4096- <ReturnClause>
4097- <JSONObjectValueIterator>
4098+ <MultiObjectLookupIterator>
4099+ <flwor::FLWORIterator>
4100+ <ForVariable name="$$context-item">
4101+ <ProbeIndexRangeValueIterator>
4102+ <SingletonIterator value="xs:QName(http://28.io/collections,db28,question-id-idx)"/>
4103+ <ForVarIterator varname="id"/>
4104+ <ForVarIterator varname="id"/>
4105+ <SingletonIterator value="xs:boolean(true)"/>
4106+ <SingletonIterator value="xs:boolean(true)"/>
4107+ <SingletonIterator value="xs:boolean(true)"/>
4108+ <SingletonIterator value="xs:boolean(true)"/>
4109+ </ProbeIndexRangeValueIterator>
4110+ </ForVariable>
4111+ <ReturnClause>
4112 <ForVarIterator varname="$$context-item"/>
4113- <SingletonIterator value="xs:string(title)"/>
4114- </JSONObjectValueIterator>
4115- </ReturnClause>
4116- </flwor::FLWORIterator>
4117+ </ReturnClause>
4118+ </flwor::FLWORIterator>
4119+ <SingletonIterator value="xs:string(title)"/>
4120+ </MultiObjectLookupIterator>
4121 </JSONBoxIterator>
4122 <ForVarIterator varname="count"/>
4123 </JSONDirectObjectIterator>
4124
4125=== modified file 'test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_veq_09.iter'
4126--- test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_veq_09.iter 2013-02-21 21:46:03 +0000
4127+++ test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_veq_09.iter 2013-08-16 17:18:24 +0000
4128@@ -10,10 +10,10 @@
4129 <ForVarIterator varname="$$context-item"/>
4130 <TreatIterator type="xs:integer" quant="">
4131 <FnDataIterator>
4132- <JSONObjectValueIterator>
4133+ <SingleObjectLookupIterator>
4134 <ForVarIterator varname="$$context-item"/>
4135 <SingletonIterator value="xs:string(question_id)"/>
4136- </JSONObjectValueIterator>
4137+ </SingleObjectLookupIterator>
4138 </FnDataIterator>
4139 </TreatIterator>
4140 </ValueIndexEntryBuilderIterator>
4141@@ -64,10 +64,10 @@
4142 <Spec>
4143 <TreatIterator quant="?">
4144 <FnDataIterator>
4145- <JSONObjectValueIterator>
4146+ <SingleObjectLookupIterator>
4147 <ForVarIterator varname="answers"/>
4148 <SingletonIterator value="xs:string(question_id)"/>
4149- </JSONObjectValueIterator>
4150+ </SingleObjectLookupIterator>
4151 </FnDataIterator>
4152 </TreatIterator>
4153 <GroupVariable/>
4154@@ -86,25 +86,25 @@
4155 <SingletonIterator value="xs:string(title)"/>
4156 <SingletonIterator value="xs:string(answer_count)"/>
4157 <JSONBoxIterator>
4158- <flwor::FLWORIterator>
4159- <ForVariable name="$$context-item">
4160- <ProbeIndexRangeValueIterator>
4161- <SingletonIterator value="xs:QName(http://28.io/collections,db28,question-id-idx)"/>
4162- <ForVarIterator varname="id"/>
4163- <ForVarIterator varname="id"/>
4164- <SingletonIterator value="xs:boolean(true)"/>
4165- <SingletonIterator value="xs:boolean(true)"/>
4166- <SingletonIterator value="xs:boolean(true)"/>
4167- <SingletonIterator value="xs:boolean(true)"/>
4168- </ProbeIndexRangeValueIterator>
4169- </ForVariable>
4170- <ReturnClause>
4171- <JSONObjectValueIterator>
4172+ <MultiObjectLookupIterator>
4173+ <flwor::FLWORIterator>
4174+ <ForVariable name="$$context-item">
4175+ <ProbeIndexRangeValueIterator>
4176+ <SingletonIterator value="xs:QName(http://28.io/collections,db28,question-id-idx)"/>
4177+ <ForVarIterator varname="id"/>
4178+ <ForVarIterator varname="id"/>
4179+ <SingletonIterator value="xs:boolean(true)"/>
4180+ <SingletonIterator value="xs:boolean(true)"/>
4181+ <SingletonIterator value="xs:boolean(true)"/>
4182+ <SingletonIterator value="xs:boolean(true)"/>
4183+ </ProbeIndexRangeValueIterator>
4184+ </ForVariable>
4185+ <ReturnClause>
4186 <ForVarIterator varname="$$context-item"/>
4187- <SingletonIterator value="xs:string(title)"/>
4188- </JSONObjectValueIterator>
4189- </ReturnClause>
4190- </flwor::FLWORIterator>
4191+ </ReturnClause>
4192+ </flwor::FLWORIterator>
4193+ <SingletonIterator value="xs:string(title)"/>
4194+ </MultiObjectLookupIterator>
4195 </JSONBoxIterator>
4196 <ForVarIterator varname="count"/>
4197 </JSONDirectObjectIterator>
4198
4199=== modified file 'test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_veq_10.iter'
4200--- test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_veq_10.iter 2013-05-14 15:51:12 +0000
4201+++ test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_veq_10.iter 2013-08-16 17:18:24 +0000
4202@@ -11,10 +11,10 @@
4203 <PromoteIterator type="xs:string">
4204 <CastIterator type="xs:string">
4205 <FnDataIterator>
4206- <JSONObjectValueIterator>
4207+ <SingleObjectLookupIterator>
4208 <ForVarIterator varname="$$context-item"/>
4209 <SingletonIterator value="xs:string(question_id)"/>
4210- </JSONObjectValueIterator>
4211+ </SingleObjectLookupIterator>
4212 </FnDataIterator>
4213 </CastIterator>
4214 </PromoteIterator>
4215@@ -68,10 +68,10 @@
4216 <Spec>
4217 <TreatIterator quant="?">
4218 <FnDataIterator>
4219- <JSONObjectValueIterator>
4220+ <SingleObjectLookupIterator>
4221 <ForVarIterator varname="answers"/>
4222 <SingletonIterator value="xs:string(question_id)"/>
4223- </JSONObjectValueIterator>
4224+ </SingleObjectLookupIterator>
4225 </FnDataIterator>
4226 </TreatIterator>
4227 <GroupVariable/>
4228@@ -96,29 +96,29 @@
4229 <SingletonIterator value="xs:string(title)"/>
4230 <SingletonIterator value="xs:string(answer_count)"/>
4231 <JSONBoxIterator>
4232- <flwor::FLWORIterator>
4233- <ForVariable name="$$context-item">
4234- <ProbeIndexRangeValueIterator>
4235- <SingletonIterator value="xs:QName(http://28.io/collections,db28,question-id-idx)"/>
4236- <UnhoistIterator>
4237- <LetVarIterator varname="$$opt_temp_0"/>
4238- </UnhoistIterator>
4239- <UnhoistIterator>
4240- <LetVarIterator varname="$$opt_temp_0"/>
4241- </UnhoistIterator>
4242- <SingletonIterator value="xs:boolean(true)"/>
4243- <SingletonIterator value="xs:boolean(true)"/>
4244- <SingletonIterator value="xs:boolean(true)"/>
4245- <SingletonIterator value="xs:boolean(true)"/>
4246- </ProbeIndexRangeValueIterator>
4247- </ForVariable>
4248- <ReturnClause>
4249- <JSONObjectValueIterator>
4250+ <MultiObjectLookupIterator>
4251+ <flwor::FLWORIterator>
4252+ <ForVariable name="$$context-item">
4253+ <ProbeIndexRangeValueIterator>
4254+ <SingletonIterator value="xs:QName(http://28.io/collections,db28,question-id-idx)"/>
4255+ <UnhoistIterator>
4256+ <LetVarIterator varname="$$opt_temp_0"/>
4257+ </UnhoistIterator>
4258+ <UnhoistIterator>
4259+ <LetVarIterator varname="$$opt_temp_0"/>
4260+ </UnhoistIterator>
4261+ <SingletonIterator value="xs:boolean(true)"/>
4262+ <SingletonIterator value="xs:boolean(true)"/>
4263+ <SingletonIterator value="xs:boolean(true)"/>
4264+ <SingletonIterator value="xs:boolean(true)"/>
4265+ </ProbeIndexRangeValueIterator>
4266+ </ForVariable>
4267+ <ReturnClause>
4268 <ForVarIterator varname="$$context-item"/>
4269- <SingletonIterator value="xs:string(title)"/>
4270- </JSONObjectValueIterator>
4271- </ReturnClause>
4272- </flwor::FLWORIterator>
4273+ </ReturnClause>
4274+ </flwor::FLWORIterator>
4275+ <SingletonIterator value="xs:string(title)"/>
4276+ </MultiObjectLookupIterator>
4277 </JSONBoxIterator>
4278 <ForVarIterator varname="count"/>
4279 </JSONDirectObjectIterator>
4280
4281=== modified file 'test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_vrange_04.iter'
4282--- test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_vrange_04.iter 2013-04-27 16:36:36 +0000
4283+++ test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_vrange_04.iter 2013-08-16 17:18:24 +0000
4284@@ -10,10 +10,10 @@
4285 <ForVarIterator varname="$$context-item"/>
4286 <PromoteIterator type="xs:string">
4287 <FnDataIterator>
4288- <DynamicFnCallIterator>
4289+ <SingleDynamicFnCallIterator>
4290 <ForVarIterator varname="$$context-item"/>
4291 <SingletonIterator value="xs:string(_id)"/>
4292- </DynamicFnCallIterator>
4293+ </SingleDynamicFnCallIterator>
4294 </FnDataIterator>
4295 </PromoteIterator>
4296 </ValueIndexEntryBuilderIterator>
4297
4298=== modified file 'test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_vrange_05.iter'
4299--- test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_vrange_05.iter 2013-05-04 21:26:57 +0000
4300+++ test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_vrange_05.iter 2013-08-16 17:18:24 +0000
4301@@ -8,10 +8,10 @@
4302 <ForVarIterator varname="$$context-item"/>
4303 <PromoteIterator type="xs:string">
4304 <FnDataIterator>
4305- <JSONObjectValueIterator>
4306+ <SingleObjectLookupIterator>
4307 <ForVarIterator varname="$$context-item"/>
4308 <SingletonIterator value="xs:string(_id)"/>
4309- </JSONObjectValueIterator>
4310+ </SingleObjectLookupIterator>
4311 </FnDataIterator>
4312 </PromoteIterator>
4313 </ValueIndexEntryBuilderIterator>
4314@@ -30,10 +30,10 @@
4315 <ForVarIterator varname="$$context-item"/>
4316 <PromoteIterator type="xs:string">
4317 <FnDataIterator>
4318- <JSONObjectValueIterator>
4319+ <SingleObjectLookupIterator>
4320 <ForVarIterator varname="$$context-item"/>
4321 <SingletonIterator value="xs:string(_id)"/>
4322- </JSONObjectValueIterator>
4323+ </SingleObjectLookupIterator>
4324 </FnDataIterator>
4325 </PromoteIterator>
4326 </ValueIndexEntryBuilderIterator>
4327
4328=== modified file 'test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_vrange_06.iter'
4329--- test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_vrange_06.iter 2013-06-05 15:06:53 +0000
4330+++ test/rbkt/ExpCompilerResults/IterPlan/zorba/index/match_vrange_06.iter 2013-08-16 17:18:24 +0000
4331@@ -10,10 +10,10 @@
4332 <ForVarIterator varname="$$context-item"/>
4333 <PromoteIterator type="xs:string">
4334 <FnDataIterator>
4335- <DynamicFnCallIterator>
4336+ <SingleDynamicFnCallIterator>
4337 <ForVarIterator varname="$$context-item"/>
4338 <SingletonIterator value="xs:string(_id)"/>
4339- </DynamicFnCallIterator>
4340+ </SingleDynamicFnCallIterator>
4341 </FnDataIterator>
4342 </PromoteIterator>
4343 </ValueIndexEntryBuilderIterator>
4344@@ -34,16 +34,16 @@
4345 <FnDataIterator>
4346 <flwor::FLWORIterator>
4347 <ForVariable name="$$context-item">
4348- <DynamicFnCallIterator>
4349+ <SingleDynamicFnCallIterator>
4350 <ForVarIterator varname="$$context-item"/>
4351 <SingletonIterator value="xs:string(properties)"/>
4352- </DynamicFnCallIterator>
4353+ </SingleDynamicFnCallIterator>
4354 </ForVariable>
4355 <ReturnClause>
4356- <DynamicFnCallIterator>
4357+ <SingleDynamicFnCallIterator>
4358 <ForVarIterator varname="$$context-item"/>
4359 <SingletonIterator value="xs:string(STREET)"/>
4360- </DynamicFnCallIterator>
4361+ </SingleDynamicFnCallIterator>
4362 </ReturnClause>
4363 </flwor::FLWORIterator>
4364 </FnDataIterator>
4365
4366=== modified file 'test/rbkt/ExpCompilerResults/IterPlan/zorba/jsoniq/member_01.iter'
4367--- test/rbkt/ExpCompilerResults/IterPlan/zorba/jsoniq/member_01.iter 2013-08-09 10:31:23 +0000
4368+++ test/rbkt/ExpCompilerResults/IterPlan/zorba/jsoniq/member_01.iter 2013-08-16 17:18:24 +0000
4369@@ -10,20 +10,20 @@
4370 <ReturnClause>
4371 <FnConcatIterator>
4372 <FnEmptyIterator>
4373- <JSONItemAccessorIterator>
4374+ <SingleDynamicFnCallIterator>
4375 <LetVarIterator varname="j"/>
4376 <SingletonIterator value="xs:integer(0)"/>
4377- </JSONItemAccessorIterator>
4378+ </SingleDynamicFnCallIterator>
4379 </FnEmptyIterator>
4380- <JSONItemAccessorIterator>
4381+ <SingleDynamicFnCallIterator>
4382 <LetVarIterator varname="j"/>
4383 <SingletonIterator value="xs:integer(1)"/>
4384- </JSONItemAccessorIterator>
4385+ </SingleDynamicFnCallIterator>
4386 <FnEmptyIterator>
4387- <JSONItemAccessorIterator>
4388+ <SingleDynamicFnCallIterator>
4389 <LetVarIterator varname="j"/>
4390 <SingletonIterator value="xs:integer(3)"/>
4391- </JSONItemAccessorIterator>
4392+ </SingleDynamicFnCallIterator>
4393 </FnEmptyIterator>
4394 </FnConcatIterator>
4395 </ReturnClause>
4396
4397=== added file 'test/rbkt/ExpQueryResults/zorba/jsoniq/keys_06.xml.res'
4398--- test/rbkt/ExpQueryResults/zorba/jsoniq/keys_06.xml.res 1970-01-01 00:00:00 +0000
4399+++ test/rbkt/ExpQueryResults/zorba/jsoniq/keys_06.xml.res 2013-08-16 17:18:24 +0000
4400@@ -0,0 +1,1 @@
4401+foo1 foo2 foo1 foo2
4402
4403=== added file 'test/rbkt/ExpQueryResults/zorba/jsoniq/keys_07.xml.res'
4404--- test/rbkt/ExpQueryResults/zorba/jsoniq/keys_07.xml.res 1970-01-01 00:00:00 +0000
4405+++ test/rbkt/ExpQueryResults/zorba/jsoniq/keys_07.xml.res 2013-08-16 17:18:24 +0000
4406@@ -0,0 +1,1 @@
4407+foo1 foo2 foo1 foo2
4408
4409=== added file 'test/rbkt/Queries/zorba/jsoniq/keys_06.xq'
4410--- test/rbkt/Queries/zorba/jsoniq/keys_06.xq 1970-01-01 00:00:00 +0000
4411+++ test/rbkt/Queries/zorba/jsoniq/keys_06.xq 2013-08-16 17:18:24 +0000
4412@@ -0,0 +1,6 @@
4413+
4414+for $j in (1, 2)
4415+let $a :=
4416+ for $i in 1 to 10
4417+ return ($i, { if ($i mod 2 eq 0) then "foo2" else "foo1" : "bar" || $i })
4418+return $a()
4419
4420=== added file 'test/rbkt/Queries/zorba/jsoniq/keys_07.xq'
4421--- test/rbkt/Queries/zorba/jsoniq/keys_07.xq 1970-01-01 00:00:00 +0000
4422+++ test/rbkt/Queries/zorba/jsoniq/keys_07.xq 2013-08-16 17:18:24 +0000
4423@@ -0,0 +1,6 @@
4424+
4425+for $j in (1, 2)
4426+let $a as object()+ :=
4427+ for $i in 1 to 10
4428+ return { if ($i mod 2 eq 0) then "foo2" else "foo1" : "bar" || $i }
4429+return $a()

Subscribers

People subscribed via source and target branches