Merge lp:~zorba-coders/zorba/feature-node-reference-management into lp:zorba

Proposed by Till Westmann
Status: Merged
Approved by: Markos Zaharioudakis
Approved revision: 10900
Merged at revision: 10901
Proposed branch: lp:~zorba-coders/zorba/feature-node-reference-management
Merge into: lp:zorba
Diff against target: 636 lines (+419/-6)
19 files modified
src/functions/pregenerated/func_nodes.cpp (+45/-0)
src/functions/pregenerated/func_nodes.h (+32/-0)
src/functions/pregenerated/function_enum.h (+2/-0)
src/runtime/nodes/nodes_impl.cpp (+52/-2)
src/runtime/nodes/pregenerated/nodes.cpp (+56/-0)
src/runtime/nodes/pregenerated/nodes.h (+64/-0)
src/runtime/pregenerated/iterator_enum.h (+2/-0)
src/runtime/spec/nodes/nodes.xml (+47/-0)
src/runtime/visitors/pregenerated/planiter_visitor.h (+10/-0)
src/runtime/visitors/pregenerated/printer_visitor.cpp (+28/-0)
src/runtime/visitors/pregenerated/printer_visitor.h (+6/-0)
src/store/api/store.h (+8/-0)
src/store/naive/simple_store.cpp (+19/-4)
src/store/naive/simple_store.h (+2/-0)
test/rbkt/ExpQueryResults/zorba/reference/reference_coll_4.xml.res (+2/-0)
test/rbkt/ExpQueryResults/zorba/reference/reference_coll_5.xml.res (+2/-0)
test/rbkt/Queries/zorba/reference/collections.xqdata (+1/-0)
test/rbkt/Queries/zorba/reference/reference_coll_4.xq (+20/-0)
test/rbkt/Queries/zorba/reference/reference_coll_5.xq (+21/-0)
To merge this branch: bzr merge lp:~zorba-coders/zorba/feature-node-reference-management
Reviewer Review Type Date Requested Status
Markos Zaharioudakis Approve
Matthias Brantner Approve
Review via email: mp+112660@code.launchpad.net

Commit message

add ref:has-node-reference and ref:assign-node-reference

Description of the change

Add ref:has-node-reference and ref:assign-node-reference to the node reference module that can be used to actively manage node references. As node-references are usually created on-demand, these functions are not needed for the usual lifecycle of node references. Therefore these functions are not part of the documentation.

To post a comment you must log in.
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :
Revision history for this message
Matthias Brantner (matthias-brantner) :
review: Approve
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :

The attempt to merge lp:~zorba-coders/zorba/feature-node-reference-management into lp:zorba failed. Below is the output from the failed tests.

CMake Error at /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake:274 (message):
  Validation queue job
  feature-node-reference-management-2012-06-28T22-05-56.705Z is finished.
  The final status was:

  1 tests did not succeed - changes not commited.

Error in read script: /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake

Revision history for this message
Markos Zaharioudakis (markos-za) :
review: Approve
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :

Validation queue job feature-node-reference-management-2012-06-29T02-50-57.727Z is finished. The final status was:

All tests succeeded!

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/functions/pregenerated/func_nodes.cpp'
2--- src/functions/pregenerated/func_nodes.cpp 2012-06-28 04:14:03 +0000
3+++ src/functions/pregenerated/func_nodes.cpp 2012-06-28 22:02:21 +0000
4@@ -41,6 +41,26 @@
5 return new NodeReferenceIterator(sctx, loc, argv);
6 }
7
8+PlanIter_t fn_zorba_ref_has_node_reference::codegen(
9+ CompilerCB*,
10+ static_context* sctx,
11+ const QueryLoc& loc,
12+ std::vector<PlanIter_t>& argv,
13+ expr& ann) const
14+{
15+ return new HasNodeReferenceIterator(sctx, loc, argv);
16+}
17+
18+PlanIter_t fn_zorba_ref_assign_node_reference::codegen(
19+ CompilerCB*,
20+ static_context* sctx,
21+ const QueryLoc& loc,
22+ std::vector<PlanIter_t>& argv,
23+ expr& ann) const
24+{
25+ return new AssignNodeReferenceIterator(sctx, loc, argv);
26+}
27+
28 PlanIter_t fn_zorba_ref_node_by_reference::codegen(
29 CompilerCB*,
30 static_context* sctx,
31@@ -258,6 +278,31 @@
32
33
34 {
35+ DECL_WITH_KIND(sctx, fn_zorba_ref_has_node_reference,
36+ (createQName("http://www.zorba-xquery.com/modules/node-reference","","has-node-reference"),
37+ GENV_TYPESYSTEM.ANY_NODE_TYPE_ONE,
38+ GENV_TYPESYSTEM.BOOLEAN_TYPE_ONE),
39+ FunctionConsts::FN_ZORBA_REF_HAS_NODE_REFERENCE_1);
40+
41+ }
42+
43+
44+
45+
46+ {
47+ DECL_WITH_KIND(sctx, fn_zorba_ref_assign_node_reference,
48+ (createQName("http://www.zorba-xquery.com/modules/node-reference","","assign-node-reference"),
49+ GENV_TYPESYSTEM.ANY_NODE_TYPE_ONE,
50+ GENV_TYPESYSTEM.ANY_URI_TYPE_ONE,
51+ GENV_TYPESYSTEM.BOOLEAN_TYPE_ONE),
52+ FunctionConsts::FN_ZORBA_REF_ASSIGN_NODE_REFERENCE_2);
53+
54+ }
55+
56+
57+
58+
59+ {
60 DECL_WITH_KIND(sctx, fn_zorba_ref_node_by_reference,
61 (createQName("http://www.zorba-xquery.com/modules/node-reference","","node-by-reference"),
62 GENV_TYPESYSTEM.ANY_URI_TYPE_ONE,
63
64=== modified file 'src/functions/pregenerated/func_nodes.h'
65--- src/functions/pregenerated/func_nodes.h 2012-06-28 04:14:03 +0000
66+++ src/functions/pregenerated/func_nodes.h 2012-06-28 22:02:21 +0000
67@@ -55,6 +55,38 @@
68 };
69
70
71+//fn-zorba-ref:has-node-reference
72+class fn_zorba_ref_has_node_reference : public function
73+{
74+public:
75+ fn_zorba_ref_has_node_reference(const signature& sig, FunctionConsts::FunctionKind kind)
76+ :
77+ function(sig, kind)
78+ {
79+
80+ }
81+
82+ CODEGEN_DECL();
83+};
84+
85+
86+//fn-zorba-ref:assign-node-reference
87+class fn_zorba_ref_assign_node_reference : public function
88+{
89+public:
90+ fn_zorba_ref_assign_node_reference(const signature& sig, FunctionConsts::FunctionKind kind)
91+ :
92+ function(sig, kind)
93+ {
94+
95+ }
96+
97+ unsigned short getScriptingKind() const { return SEQUENTIAL_FUNC_EXPR; }
98+
99+ CODEGEN_DECL();
100+};
101+
102+
103 //fn-zorba-ref:node-by-reference
104 class fn_zorba_ref_node_by_reference : public function
105 {
106
107=== modified file 'src/functions/pregenerated/function_enum.h'
108--- src/functions/pregenerated/function_enum.h 2012-06-28 04:14:03 +0000
109+++ src/functions/pregenerated/function_enum.h 2012-06-28 22:02:21 +0000
110@@ -288,6 +288,8 @@
111 FN_ZORBA_POS_IN_COLLECTION_1,
112 FN_ZORBA_POS_IN_SAME_COLLECTION_OF_2,
113 FN_ZORBA_REF_NODE_REFERENCE_1,
114+ FN_ZORBA_REF_HAS_NODE_REFERENCE_1,
115+ FN_ZORBA_REF_ASSIGN_NODE_REFERENCE_2,
116 FN_ZORBA_REF_NODE_BY_REFERENCE_1,
117 FN_LOCAL_NAME_0,
118 FN_LOCAL_NAME_1,
119
120=== modified file 'src/runtime/nodes/nodes_impl.cpp'
121--- src/runtime/nodes/nodes_impl.cpp 2012-06-28 19:06:27 +0000
122+++ src/runtime/nodes/nodes_impl.cpp 2012-06-28 22:02:21 +0000
123@@ -40,8 +40,6 @@
124 NodeReferenceIterator::nextImpl(store::Item_t& aResult, PlanState& aPlanState) const
125 {
126 store::Item_t lNode;
127- store::Item_t lGenerateIdentifier;
128- zstring lNodeId;
129
130 PlanIteratorState* state;
131 DEFAULT_STACK_INIT(PlanIteratorState, state, aPlanState);
132@@ -58,6 +56,58 @@
133
134 ********************************************************************************/
135 bool
136+HasNodeReferenceIterator::nextImpl(store::Item_t& aResult, PlanState& aPlanState) const
137+{
138+ store::Item_t lNode;
139+ xs_boolean lHasReference;
140+
141+ PlanIteratorState* state;
142+ DEFAULT_STACK_INIT(PlanIteratorState, state, aPlanState);
143+
144+ consumeNext(lNode, theChildren[0].getp(), aPlanState);
145+
146+ lHasReference = GENV_STORE.hasReference(lNode);
147+
148+ STACK_PUSH(GENV_ITEMFACTORY->createBoolean(aResult, lHasReference), state);
149+
150+ STACK_END (state);
151+}
152+
153+
154+/*******************************************************************************
155+
156+********************************************************************************/
157+bool
158+AssignNodeReferenceIterator::nextImpl(store::Item_t& aResult, PlanState& aPlanState) const
159+{
160+ store::Item_t lNode;
161+ store::Item_t lUUID;
162+ xs_boolean lHaveResult;
163+
164+ PlanIteratorState* state;
165+ DEFAULT_STACK_INIT(PlanIteratorState, state, aPlanState);
166+
167+ consumeNext(lNode, theChildren[0].getp(), aPlanState);
168+ consumeNext(lUUID, theChildren[1].getp(), aPlanState);
169+ try
170+ {
171+ lHaveResult = GENV_STORE.assignReference(lNode, lUUID->getStringValue());
172+ }
173+ catch (ZorbaException& e)
174+ {
175+ set_source( e, loc );
176+ throw;
177+ }
178+ STACK_PUSH(GENV_ITEMFACTORY->createBoolean(aResult, lHaveResult), state);
179+
180+ STACK_END (state);
181+}
182+
183+
184+/*******************************************************************************
185+
186+********************************************************************************/
187+bool
188 NodeByReferenceIterator::nextImpl(store::Item_t& result, PlanState& planState) const
189 {
190 store::Item_t lUUID;
191
192=== modified file 'src/runtime/nodes/pregenerated/nodes.cpp'
193--- src/runtime/nodes/pregenerated/nodes.cpp 2012-06-28 04:14:03 +0000
194+++ src/runtime/nodes/pregenerated/nodes.cpp 2012-06-28 22:02:21 +0000
195@@ -60,6 +60,62 @@
196 // </NodeReferenceIterator>
197
198
199+// <HasNodeReferenceIterator>
200+SERIALIZABLE_CLASS_VERSIONS(HasNodeReferenceIterator)
201+
202+void HasNodeReferenceIterator::serialize(::zorba::serialization::Archiver& ar)
203+{
204+ serialize_baseclass(ar,
205+ (NaryBaseIterator<HasNodeReferenceIterator, PlanIteratorState>*)this);
206+}
207+
208+
209+void HasNodeReferenceIterator::accept(PlanIterVisitor& v) const
210+{
211+ v.beginVisit(*this);
212+
213+ std::vector<PlanIter_t>::const_iterator lIter = theChildren.begin();
214+ std::vector<PlanIter_t>::const_iterator lEnd = theChildren.end();
215+ for ( ; lIter != lEnd; ++lIter ){
216+ (*lIter)->accept(v);
217+ }
218+
219+ v.endVisit(*this);
220+}
221+
222+HasNodeReferenceIterator::~HasNodeReferenceIterator() {}
223+
224+// </HasNodeReferenceIterator>
225+
226+
227+// <AssignNodeReferenceIterator>
228+SERIALIZABLE_CLASS_VERSIONS(AssignNodeReferenceIterator)
229+
230+void AssignNodeReferenceIterator::serialize(::zorba::serialization::Archiver& ar)
231+{
232+ serialize_baseclass(ar,
233+ (NaryBaseIterator<AssignNodeReferenceIterator, PlanIteratorState>*)this);
234+}
235+
236+
237+void AssignNodeReferenceIterator::accept(PlanIterVisitor& v) const
238+{
239+ v.beginVisit(*this);
240+
241+ std::vector<PlanIter_t>::const_iterator lIter = theChildren.begin();
242+ std::vector<PlanIter_t>::const_iterator lEnd = theChildren.end();
243+ for ( ; lIter != lEnd; ++lIter ){
244+ (*lIter)->accept(v);
245+ }
246+
247+ v.endVisit(*this);
248+}
249+
250+AssignNodeReferenceIterator::~AssignNodeReferenceIterator() {}
251+
252+// </AssignNodeReferenceIterator>
253+
254+
255 // <NodeByReferenceIterator>
256 SERIALIZABLE_CLASS_VERSIONS(NodeByReferenceIterator)
257
258
259=== modified file 'src/runtime/nodes/pregenerated/nodes.h'
260--- src/runtime/nodes/pregenerated/nodes.h 2012-06-28 04:14:03 +0000
261+++ src/runtime/nodes/pregenerated/nodes.h 2012-06-28 22:02:21 +0000
262@@ -67,6 +67,70 @@
263
264 /**
265 *
266+ * declare function ref:has-node-reference($node as node()) as xs:boolean
267+ *
268+ * Author: Till Westmann
269+ */
270+class HasNodeReferenceIterator : public NaryBaseIterator<HasNodeReferenceIterator, PlanIteratorState>
271+{
272+public:
273+ SERIALIZABLE_CLASS(HasNodeReferenceIterator);
274+
275+ SERIALIZABLE_CLASS_CONSTRUCTOR2T(HasNodeReferenceIterator,
276+ NaryBaseIterator<HasNodeReferenceIterator, PlanIteratorState>);
277+
278+ void serialize( ::zorba::serialization::Archiver& ar);
279+
280+ HasNodeReferenceIterator(
281+ static_context* sctx,
282+ const QueryLoc& loc,
283+ std::vector<PlanIter_t>& children)
284+ :
285+ NaryBaseIterator<HasNodeReferenceIterator, PlanIteratorState>(sctx, loc, children)
286+ {}
287+
288+ virtual ~HasNodeReferenceIterator();
289+
290+ void accept(PlanIterVisitor& v) const;
291+
292+ bool nextImpl(store::Item_t& result, PlanState& aPlanState) const;
293+};
294+
295+
296+/**
297+ *
298+ * declare function ref:assign-node-reference($node as node()) as xs:boolean
299+ *
300+ * Author: Till Westmann
301+ */
302+class AssignNodeReferenceIterator : public NaryBaseIterator<AssignNodeReferenceIterator, PlanIteratorState>
303+{
304+public:
305+ SERIALIZABLE_CLASS(AssignNodeReferenceIterator);
306+
307+ SERIALIZABLE_CLASS_CONSTRUCTOR2T(AssignNodeReferenceIterator,
308+ NaryBaseIterator<AssignNodeReferenceIterator, PlanIteratorState>);
309+
310+ void serialize( ::zorba::serialization::Archiver& ar);
311+
312+ AssignNodeReferenceIterator(
313+ static_context* sctx,
314+ const QueryLoc& loc,
315+ std::vector<PlanIter_t>& children)
316+ :
317+ NaryBaseIterator<AssignNodeReferenceIterator, PlanIteratorState>(sctx, loc, children)
318+ {}
319+
320+ virtual ~AssignNodeReferenceIterator();
321+
322+ void accept(PlanIterVisitor& v) const;
323+
324+ bool nextImpl(store::Item_t& result, PlanState& aPlanState) const;
325+};
326+
327+
328+/**
329+ *
330 * declare function ref:node-by-reference($reference as xs:anyURI) as node()?
331 *
332 * Author: Federico Cavalieri
333
334=== modified file 'src/runtime/pregenerated/iterator_enum.h'
335--- src/runtime/pregenerated/iterator_enum.h 2012-06-27 14:07:46 +0000
336+++ src/runtime/pregenerated/iterator_enum.h 2012-06-28 22:02:21 +0000
337@@ -215,6 +215,8 @@
338 TYPE_InCollectionPositionIterator,
339 TYPE_InSameCollectionPositionIterator,
340 TYPE_NodeReferenceIterator,
341+ TYPE_HasNodeReferenceIterator,
342+ TYPE_AssignNodeReferenceIterator,
343 TYPE_NodeByReferenceIterator,
344 TYPE_FnLocalNameIterator,
345 TYPE_FnNamespaceUriIterator,
346
347=== modified file 'src/runtime/spec/nodes/nodes.xml'
348--- src/runtime/spec/nodes/nodes.xml 2012-06-28 04:14:03 +0000
349+++ src/runtime/spec/nodes/nodes.xml 2012-06-28 22:02:21 +0000
350@@ -41,6 +41,53 @@
351 /*******************************************************************************
352 ********************************************************************************/
353 -->
354+ <zorba:iterator name="HasNodeReferenceIterator">
355+
356+ <zorba:description author="Till Westmann">
357+ declare function ref:has-node-reference($node as node()) as xs:boolean
358+ </zorba:description>
359+
360+ <zorba:function>
361+
362+ <zorba:signature localname="has-node-reference" prefix="fn-zorba-ref">
363+ <zorba:param>node()</zorba:param>
364+ <zorba:output>xs:boolean</zorba:output>
365+ </zorba:signature>
366+
367+ </zorba:function>
368+
369+ </zorba:iterator>
370+
371+<!--
372+/*******************************************************************************
373+********************************************************************************/
374+-->
375+ <zorba:iterator name="AssignNodeReferenceIterator">
376+
377+ <zorba:description author="Till Westmann">
378+ declare function ref:assign-node-reference($node as node()) as xs:boolean
379+ </zorba:description>
380+
381+ <zorba:function>
382+
383+ <zorba:signature localname="assign-node-reference" prefix="fn-zorba-ref">
384+ <zorba:param>node()</zorba:param>
385+ <zorba:param>xs:anyURI</zorba:param>
386+ <zorba:output>xs:boolean</zorba:output>
387+ </zorba:signature>
388+
389+ <zorba:methods>
390+ <zorba:getScriptingKind returnValue="SEQUENTIAL_FUNC_EXPR"/>
391+ </zorba:methods>
392+
393+ </zorba:function>
394+
395+ </zorba:iterator>
396+
397+<!--
398+/*******************************************************************************
399+********************************************************************************/
400+-->
401 <zorba:iterator name="NodeByReferenceIterator">
402
403 <zorba:description author="Federico Cavalieri">
404
405=== modified file 'src/runtime/visitors/pregenerated/planiter_visitor.h'
406--- src/runtime/visitors/pregenerated/planiter_visitor.h 2012-06-28 04:14:03 +0000
407+++ src/runtime/visitors/pregenerated/planiter_visitor.h 2012-06-28 22:02:21 +0000
408@@ -450,6 +450,10 @@
409
410 class NodeReferenceIterator;
411
412+ class HasNodeReferenceIterator;
413+
414+ class AssignNodeReferenceIterator;
415+
416 class NodeByReferenceIterator;
417
418 class FnLocalNameIterator;
419@@ -1330,6 +1334,12 @@
420 virtual void beginVisit ( const NodeReferenceIterator& ) = 0;
421 virtual void endVisit ( const NodeReferenceIterator& ) = 0;
422
423+ virtual void beginVisit ( const HasNodeReferenceIterator& ) = 0;
424+ virtual void endVisit ( const HasNodeReferenceIterator& ) = 0;
425+
426+ virtual void beginVisit ( const AssignNodeReferenceIterator& ) = 0;
427+ virtual void endVisit ( const AssignNodeReferenceIterator& ) = 0;
428+
429 virtual void beginVisit ( const NodeByReferenceIterator& ) = 0;
430 virtual void endVisit ( const NodeByReferenceIterator& ) = 0;
431
432
433=== modified file 'src/runtime/visitors/pregenerated/printer_visitor.cpp'
434--- src/runtime/visitors/pregenerated/printer_visitor.cpp 2012-06-28 04:14:03 +0000
435+++ src/runtime/visitors/pregenerated/printer_visitor.cpp 2012-06-28 22:02:21 +0000
436@@ -2873,6 +2873,34 @@
437 // </NodeReferenceIterator>
438
439
440+// <HasNodeReferenceIterator>
441+void PrinterVisitor::beginVisit ( const HasNodeReferenceIterator& a) {
442+ thePrinter.startBeginVisit("HasNodeReferenceIterator", ++theId);
443+ printCommons( &a, theId );
444+ thePrinter.endBeginVisit( theId );
445+}
446+
447+void PrinterVisitor::endVisit ( const HasNodeReferenceIterator& ) {
448+ thePrinter.startEndVisit();
449+ thePrinter.endEndVisit();
450+}
451+// </HasNodeReferenceIterator>
452+
453+
454+// <AssignNodeReferenceIterator>
455+void PrinterVisitor::beginVisit ( const AssignNodeReferenceIterator& a) {
456+ thePrinter.startBeginVisit("AssignNodeReferenceIterator", ++theId);
457+ printCommons( &a, theId );
458+ thePrinter.endBeginVisit( theId );
459+}
460+
461+void PrinterVisitor::endVisit ( const AssignNodeReferenceIterator& ) {
462+ thePrinter.startEndVisit();
463+ thePrinter.endEndVisit();
464+}
465+// </AssignNodeReferenceIterator>
466+
467+
468 // <NodeByReferenceIterator>
469 void PrinterVisitor::beginVisit ( const NodeByReferenceIterator& a) {
470 thePrinter.startBeginVisit("NodeByReferenceIterator", ++theId);
471
472=== modified file 'src/runtime/visitors/pregenerated/printer_visitor.h'
473--- src/runtime/visitors/pregenerated/printer_visitor.h 2012-06-28 04:14:03 +0000
474+++ src/runtime/visitors/pregenerated/printer_visitor.h 2012-06-28 22:02:21 +0000
475@@ -692,6 +692,12 @@
476 void beginVisit( const NodeReferenceIterator& );
477 void endVisit ( const NodeReferenceIterator& );
478
479+ void beginVisit( const HasNodeReferenceIterator& );
480+ void endVisit ( const HasNodeReferenceIterator& );
481+
482+ void beginVisit( const AssignNodeReferenceIterator& );
483+ void endVisit ( const AssignNodeReferenceIterator& );
484+
485 void beginVisit( const NodeByReferenceIterator& );
486 void endVisit ( const NodeByReferenceIterator& );
487
488
489=== modified file 'src/store/api/store.h'
490--- src/store/api/store.h 2012-06-28 04:14:03 +0000
491+++ src/store/api/store.h 2012-06-28 22:02:21 +0000
492@@ -120,6 +120,14 @@
493 virtual bool hasReference(const Item* node) = 0;
494
495 /**
496+ * Assigns a specific reference for the given node.
497+ *
498+ * @param item XDM node
499+ * @param reference an xs:anyURI item
500+ */
501+ virtual bool assignReference(const Item* node, const zstring& reference) = 0;
502+
503+ /**
504 * Returns the node which is identified by the given reference.
505 * If the given reference is not a valid reference, as generated by
506 * getReference, error ZAPI0028 is raised.
507
508=== modified file 'src/store/naive/simple_store.cpp'
509--- src/store/naive/simple_store.cpp 2012-06-28 04:14:03 +0000
510+++ src/store/naive/simple_store.cpp 2012-06-28 22:02:21 +0000
511@@ -292,10 +292,7 @@
512 uuid_create(&uuid);
513 zstring uuidStr = uuidToURI(uuid);
514
515- const_cast<XmlNode*>(xmlNode)->setHaveReference();
516-
517- theNodeToReferencesMap.insert(xmlNode, uuidStr);
518- theReferencesToNodeMap[uuidStr] = node;
519+ assignReference(xmlNode, uuidStr);
520
521 return theItemFactory->createAnyURI(result, uuidStr);
522 }
523@@ -313,6 +310,24 @@
524 }
525
526
527+bool SimpleStore::assignReference(const store::Item* node, const zstring& reference)
528+{
529+ const XmlNode* xmlNode = static_cast<const XmlNode*>(node);
530+ zstring uuidStr = reference;
531+
532+ if (xmlNode->haveReference())
533+ {
534+ return false;
535+ }
536+ const_cast<XmlNode*>(xmlNode)->setHaveReference();
537+
538+ theNodeToReferencesMap.insert(xmlNode, uuidStr);
539+ theReferencesToNodeMap[uuidStr] = node;
540+
541+ return true;
542+}
543+
544+
545 /*******************************************************************************
546 Returns the node which is identified by the given reference.
547
548
549=== modified file 'src/store/naive/simple_store.h'
550--- src/store/naive/simple_store.h 2012-06-28 04:14:03 +0000
551+++ src/store/naive/simple_store.h 2012-06-28 22:02:21 +0000
552@@ -108,6 +108,8 @@
553
554 bool hasReference(const store::Item* node);
555
556+ bool assignReference(const store::Item* node, const zstring& reference);
557+
558 bool getNodeByReference(store::Item_t& result, const zstring& reference);
559
560 #ifdef ZORBA_WITH_JSON
561
562=== added file 'test/rbkt/ExpQueryResults/zorba/reference/reference_coll_4.xml.res'
563--- test/rbkt/ExpQueryResults/zorba/reference/reference_coll_4.xml.res 1970-01-01 00:00:00 +0000
564+++ test/rbkt/ExpQueryResults/zorba/reference/reference_coll_4.xml.res 2012-06-28 22:02:21 +0000
565@@ -0,0 +1,2 @@
566+<?xml version="1.0" encoding="UTF-8"?>
567+false true
568\ No newline at end of file
569
570=== added file 'test/rbkt/ExpQueryResults/zorba/reference/reference_coll_5.xml.res'
571--- test/rbkt/ExpQueryResults/zorba/reference/reference_coll_5.xml.res 1970-01-01 00:00:00 +0000
572+++ test/rbkt/ExpQueryResults/zorba/reference/reference_coll_5.xml.res 2012-06-28 22:02:21 +0000
573@@ -0,0 +1,2 @@
574+<?xml version="1.0" encoding="UTF-8"?>
575+false true true
576\ No newline at end of file
577
578=== modified file 'test/rbkt/Queries/zorba/reference/collections.xqdata'
579--- test/rbkt/Queries/zorba/reference/collections.xqdata 2012-06-28 04:14:03 +0000
580+++ test/rbkt/Queries/zorba/reference/collections.xqdata 2012-06-28 22:02:21 +0000
581@@ -3,3 +3,4 @@
582 declare namespace ann = "http://www.zorba-xquery.com/annotations";
583
584 declare %ann:ordered collection ns:test as node()*;
585+declare collection ns:test2 as node()*;
586
587=== added file 'test/rbkt/Queries/zorba/reference/reference_coll_4.xq'
588--- test/rbkt/Queries/zorba/reference/reference_coll_4.xq 1970-01-01 00:00:00 +0000
589+++ test/rbkt/Queries/zorba/reference/reference_coll_4.xq 2012-06-28 22:02:21 +0000
590@@ -0,0 +1,20 @@
591+import module namespace ddl = "http://www.zorba-xquery.com/modules/store/static/collections/ddl";
592+import module namespace dml = "http://www.zorba-xquery.com/modules/store/static/collections/dml";
593+import module namespace ns = "http://example.org/datamodule/" at "collections.xqdata";
594+
595+import module namespace ref = "http://www.zorba-xquery.com/modules/node-reference";
596+
597+declare namespace ann = "http://www.zorba-xquery.com/annotations";
598+
599+declare %ann:sequential function local:test()
600+{
601+ ddl:create(xs:QName("ns:test2"));
602+ dml:insert-nodes(xs:QName("ns:test2"), <a><b><c d="e"></c></b></a>);
603+ variable $node := dml:collection(xs:QName("ns:test2"))/b/c/@d;
604+ variable $has1 := ref:has-node-reference($node);
605+ variable $ref := ref:node-reference($node);
606+ variable $has2 := ref:has-node-reference($node);
607+ ($has1, $has2)
608+};
609+
610+local:test()
611
612=== added file 'test/rbkt/Queries/zorba/reference/reference_coll_5.xq'
613--- test/rbkt/Queries/zorba/reference/reference_coll_5.xq 1970-01-01 00:00:00 +0000
614+++ test/rbkt/Queries/zorba/reference/reference_coll_5.xq 2012-06-28 22:02:21 +0000
615@@ -0,0 +1,21 @@
616+import module namespace ddl = "http://www.zorba-xquery.com/modules/store/static/collections/ddl";
617+import module namespace dml = "http://www.zorba-xquery.com/modules/store/static/collections/dml";
618+import module namespace ns = "http://example.org/datamodule/" at "collections.xqdata";
619+
620+import module namespace ref = "http://www.zorba-xquery.com/modules/node-reference";
621+
622+declare namespace ann = "http://www.zorba-xquery.com/annotations";
623+
624+declare %ann:sequential function local:test()
625+{
626+ ddl:create(xs:QName("ns:test2"));
627+ variable $ref := xs:anyURI("urn:uuid:e35e9021-0a1c-48c7-8902-833105a2f013");
628+ variable $node := dml:apply-insert-nodes(xs:QName("ns:test2"), <f><g><h i="j"></h></g></f>);
629+ variable $has1 := ref:has-node-reference($node);
630+ ref:assign-node-reference($node, $ref);
631+ variable $has2 := ref:has-node-reference($node);
632+ variable $find := ref:node-by-reference($ref);
633+ ($has1, $has2, $node is $find)
634+};
635+
636+local:test()

Subscribers

People subscribed via source and target branches