zorba-coders team mailing list archive
-
zorba-coders team
-
Mailing list archive
-
Message #06368
[Merge] lp:~zorba-coders/zorba/feature-node_copy into lp:zorba
Matthias Brantner has proposed merging lp:~zorba-coders/zorba/feature-node_copy into lp:zorba.
Requested reviews:
Matthias Brantner (matthias-brantner)
Markos Zaharioudakis (markos-za)
For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/feature-node_copy/+merge/97562
node:copy function
--
https://code.launchpad.net/~zorba-coders/zorba/feature-node_copy/+merge/97562
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'ChangeLog'
--- ChangeLog 2012-03-12 20:01:39 +0000
+++ ChangeLog 2012-03-15 03:03:24 +0000
@@ -19,6 +19,7 @@
* http:send-request is able to handle arbitrary encodings
* Added API method StaticContext::getNamespaceBindings() (see bug #905035)
* New version of the JSON converter module in the core of Zorba (no external dependencies anymore)
+ * Added a node copy function to the node module
* Added truncate function to the collection modules for efficient deletion of all nodes in a collection.
=== modified file 'modules/com/zorba-xquery/www/modules/node.xq'
--- modules/com/zorba-xquery/www/modules/node.xq 2011-08-03 03:58:09 +0000
+++ modules/com/zorba-xquery/www/modules/node.xq 2012-03-15 03:03:24 +0000
@@ -164,3 +164,16 @@
declare function node:least-common-ancestor(
$node1 as node(),
$node2 as node()) as node()? external;
+
+(:~
+ : Return a deep copy of every given node according to the properties
+ : specified in the static context of the invoking module.
+ :
+ : Please note that a copy of a node is parentless.
+ :
+ : @param $input the node to copy
+ :
+ : @return a deep copy of every node in the input sequence or the empty sequence if
+ : $input is the empty sequence.
+ :)
+declare function node:copy($input as node()*) as node()* external;
=== modified file 'src/functions/pregenerated/func_nodes.cpp'
--- src/functions/pregenerated/func_nodes.cpp 2012-02-16 12:48:17 +0000
+++ src/functions/pregenerated/func_nodes.cpp 2012-03-15 03:03:24 +0000
@@ -231,6 +231,16 @@
return new LeastCommonAncestor(sctx, loc, argv);
}
+PlanIter_t fn_zorba_node_copy::codegen(
+ CompilerCB*,
+ static_context* sctx,
+ const QueryLoc& loc,
+ std::vector<PlanIter_t>& argv,
+ expr& ann) const
+{
+ return new NodeCopyIterator(sctx, loc, argv);
+}
+
void populate_context_nodes(static_context* sctx)
{
{
@@ -538,6 +548,18 @@
}
+
+ {
+
+
+ DECL_WITH_KIND(sctx, fn_zorba_node_copy,
+ (createQName("http://www.zorba-xquery.com/modules/node","","copy"),
+ GENV_TYPESYSTEM.ANY_NODE_TYPE_STAR,
+ GENV_TYPESYSTEM.ANY_NODE_TYPE_STAR),
+ FunctionConsts::FN_ZORBA_NODE_COPY_1);
+
+ }
+
}
=== modified file 'src/functions/pregenerated/func_nodes.h'
--- src/functions/pregenerated/func_nodes.h 2012-01-11 17:30:25 +0000
+++ src/functions/pregenerated/func_nodes.h 2012-03-15 03:03:24 +0000
@@ -372,6 +372,23 @@
};
+//fn-zorba-node:copy
+class fn_zorba_node_copy : public function
+{
+public:
+ fn_zorba_node_copy(const signature& sig, FunctionConsts::FunctionKind kind)
+ :
+ function(sig, kind)
+ {
+
+ }
+
+ bool mustCopyInputNodes(expr* fo, csize producer) const { return true; }
+
+ CODEGEN_DECL();
+};
+
+
} //namespace zorba
=== modified file 'src/functions/pregenerated/function_enum.h'
--- src/functions/pregenerated/function_enum.h 2012-03-08 18:51:25 +0000
+++ src/functions/pregenerated/function_enum.h 2012-03-15 03:03:24 +0000
@@ -245,6 +245,7 @@
FN_ZORBA_NODE_PRECEDING_SIBLING_OF_2,
FN_ZORBA_NODE_LEVEL_1,
FN_ZORBA_NODE_LEAST_COMMON_ANCESTOR_2,
+ FN_ZORBA_NODE_COPY_1,
FN_ABS_1,
FN_CEILING_1,
FN_FLOOR_1,
=== modified file 'src/runtime/nodes/nodes_impl.cpp'
--- src/runtime/nodes/nodes_impl.cpp 2011-10-10 12:56:57 +0000
+++ src/runtime/nodes/nodes_impl.cpp 2012-03-15 03:03:24 +0000
@@ -19,11 +19,13 @@
#include "zorbamisc/ns_consts.h"
#include "system/globalenv.h"
+#include "context/static_context.h"
#include "store/api/item.h"
#include "store/api/iterator.h"
#include "store/api/item_factory.h"
#include "store/api/store.h"
+#include "store/api/copymode.h"
#include "util/string_util.h"
#include "util/uri_util.h"
@@ -628,5 +630,29 @@
STACK_END (state);
}
+/*******************************************************************************
+********************************************************************************/
+bool
+NodeCopyIterator::nextImpl(store::Item_t& result, PlanState& planState) const
+{
+ store::Item_t lItem;
+ store::CopyMode lCopyMode;
+ lCopyMode.set(true,
+ theSctx->construction_mode() == StaticContextConsts::cons_preserve,
+ theSctx->preserve_mode() == StaticContextConsts::preserve_ns,
+ theSctx->inherit_mode() == StaticContextConsts::inherit_ns);
+
+ PlanIteratorState *state;
+ DEFAULT_STACK_INIT(PlanIteratorState, state, planState);
+
+ while (consumeNext(lItem, theChildren[0].getp(), planState))
+ {
+ result = lItem->copy(0, lCopyMode);
+ STACK_PUSH(true, state);
+ }
+
+ STACK_END (state);
+}
+
} // namespace zorba
/* vim:set et sw=2 ts=2: */
=== modified file 'src/runtime/nodes/pregenerated/nodes.cpp'
--- src/runtime/nodes/pregenerated/nodes.cpp 2011-10-19 15:28:51 +0000
+++ src/runtime/nodes/pregenerated/nodes.cpp 2012-03-15 03:03:24 +0000
@@ -588,6 +588,34 @@
// </LeastCommonAncestor>
+// <NodeCopyIterator>
+const char* NodeCopyIterator::class_name_str = "NodeCopyIterator";
+NodeCopyIterator::class_factory<NodeCopyIterator>
+NodeCopyIterator::g_class_factory;
+
+const serialization::ClassVersion
+NodeCopyIterator::class_versions[] ={{ 1, 0x000905, false}};
+
+const int NodeCopyIterator::class_versions_count =
+sizeof(NodeCopyIterator::class_versions)/sizeof(struct serialization::ClassVersion);
+
+void NodeCopyIterator::accept(PlanIterVisitor& v) const {
+ v.beginVisit(*this);
+
+ std::vector<PlanIter_t>::const_iterator lIter = theChildren.begin();
+ std::vector<PlanIter_t>::const_iterator lEnd = theChildren.end();
+ for ( ; lIter != lEnd; ++lIter ){
+ (*lIter)->accept(v);
+ }
+
+ v.endVisit(*this);
+}
+
+NodeCopyIterator::~NodeCopyIterator() {}
+
+// </NodeCopyIterator>
+
+
}
=== modified file 'src/runtime/nodes/pregenerated/nodes.h'
--- src/runtime/nodes/pregenerated/nodes.h 2011-10-19 15:28:51 +0000
+++ src/runtime/nodes/pregenerated/nodes.h 2012-03-15 03:03:24 +0000
@@ -720,6 +720,40 @@
};
+/**
+ *
+ * Author: Zorba Team
+ */
+class NodeCopyIterator : public NaryBaseIterator<NodeCopyIterator, PlanIteratorState>
+{
+public:
+ SERIALIZABLE_CLASS(NodeCopyIterator);
+
+ SERIALIZABLE_CLASS_CONSTRUCTOR2T(NodeCopyIterator,
+ NaryBaseIterator<NodeCopyIterator, PlanIteratorState>);
+
+ void serialize( ::zorba::serialization::Archiver& ar)
+ {
+ serialize_baseclass(ar,
+ (NaryBaseIterator<NodeCopyIterator, PlanIteratorState>*)this);
+ }
+
+ NodeCopyIterator(
+ static_context* sctx,
+ const QueryLoc& loc,
+ std::vector<PlanIter_t>& children)
+ :
+ NaryBaseIterator<NodeCopyIterator, PlanIteratorState>(sctx, loc, children)
+ {}
+
+ virtual ~NodeCopyIterator();
+
+ void accept(PlanIterVisitor& v) const;
+
+ bool nextImpl(store::Item_t& result, PlanState& aPlanState) const;
+};
+
+
}
#endif
/*
=== modified file 'src/runtime/spec/nodes/nodes.xml'
--- src/runtime/spec/nodes/nodes.xml 2012-01-11 17:30:25 +0000
+++ src/runtime/spec/nodes/nodes.xml 2012-03-15 03:03:24 +0000
@@ -515,4 +515,26 @@
</zorba:iterator>
+ <!--
+/*******************************************************************************
+********************************************************************************/
+-->
+<zorba:iterator name="NodeCopyIterator">
+
+ <zorba:description author="Zorba Team"></zorba:description>
+
+ <zorba:function>
+ <zorba:signature localname="copy" prefix="fn-zorba-node">
+ <zorba:param>node()*</zorba:param>
+ <zorba:output>node()*</zorba:output>
+ </zorba:signature>
+
+ <zorba:methods>
+ <zorba:mustCopyInputNodes value="true"/>
+ </zorba:methods>
+
+ </zorba:function>
+
+</zorba:iterator>
+
</zorba:iterators>
=== modified file 'src/runtime/visitors/pregenerated/planiter_visitor.h'
--- src/runtime/visitors/pregenerated/planiter_visitor.h 2012-03-08 18:51:25 +0000
+++ src/runtime/visitors/pregenerated/planiter_visitor.h 2012-03-15 03:03:24 +0000
@@ -395,6 +395,8 @@
class LeastCommonAncestor;
+ class NodeCopyIterator;
+
class AbsIterator;
class CeilingIterator;
@@ -1153,6 +1155,9 @@
virtual void beginVisit ( const LeastCommonAncestor& ) = 0;
virtual void endVisit ( const LeastCommonAncestor& ) = 0;
+ virtual void beginVisit ( const NodeCopyIterator& ) = 0;
+ virtual void endVisit ( const NodeCopyIterator& ) = 0;
+
virtual void beginVisit ( const AbsIterator& ) = 0;
virtual void endVisit ( const AbsIterator& ) = 0;
=== modified file 'src/runtime/visitors/pregenerated/printer_visitor.cpp'
--- src/runtime/visitors/pregenerated/printer_visitor.cpp 2012-03-08 18:51:25 +0000
+++ src/runtime/visitors/pregenerated/printer_visitor.cpp 2012-03-15 03:03:24 +0000
@@ -2660,6 +2660,20 @@
// </LeastCommonAncestor>
+// <NodeCopyIterator>
+void PrinterVisitor::beginVisit ( const NodeCopyIterator& a) {
+ thePrinter.startBeginVisit("NodeCopyIterator", ++theId);
+ printCommons( &a, theId );
+ thePrinter.endBeginVisit( theId );
+}
+
+void PrinterVisitor::endVisit ( const NodeCopyIterator& ) {
+ thePrinter.startEndVisit();
+ thePrinter.endEndVisit();
+}
+// </NodeCopyIterator>
+
+
// <AbsIterator>
void PrinterVisitor::beginVisit ( const AbsIterator& a) {
thePrinter.startBeginVisit("AbsIterator", ++theId);
=== modified file 'src/runtime/visitors/pregenerated/printer_visitor.h'
--- src/runtime/visitors/pregenerated/printer_visitor.h 2012-03-08 18:51:25 +0000
+++ src/runtime/visitors/pregenerated/printer_visitor.h 2012-03-15 03:03:24 +0000
@@ -595,6 +595,9 @@
void beginVisit( const LeastCommonAncestor& );
void endVisit ( const LeastCommonAncestor& );
+ void beginVisit( const NodeCopyIterator& );
+ void endVisit ( const NodeCopyIterator& );
+
void beginVisit( const AbsIterator& );
void endVisit ( const AbsIterator& );
=== added file 'test/rbkt/ExpQueryResults/zorba/nodes/copy01.xml.res'
--- test/rbkt/ExpQueryResults/zorba/nodes/copy01.xml.res 1970-01-01 00:00:00 +0000
+++ test/rbkt/ExpQueryResults/zorba/nodes/copy01.xml.res 2012-03-15 03:03:24 +0000
@@ -0,0 +1,1 @@
+false
=== added file 'test/rbkt/Queries/zorba/nodes/copy01.xq'
--- test/rbkt/Queries/zorba/nodes/copy01.xq 1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/nodes/copy01.xq 2012-03-15 03:03:24 +0000
@@ -0,0 +1,10 @@
+import module namespace node = "http://www.zorba-xquery.com/modules/node";
+
+let $node :=
+ <a>
+ <b>
+ <c/>
+ </b>
+ </a>
+let $new-node := node:copy($node/b)
+return ($node/b is $new-node, $new-node/parent::a)
Follow ups
-
Re: [Merge] lp:~zorba-coders/zorba/feature-node_copy into lp:zorba
From: Markos Zaharioudakis, 2012-03-15
-
Re: [Merge] lp:~zorba-coders/zorba/feature-node_copy into lp:zorba
From: Markos Zaharioudakis, 2012-03-15
-
[Merge] lp:~zorba-coders/zorba/feature-node_copy into lp:zorba
From: Zorba Build Bot, 2012-03-15
-
Re: [Merge] lp:~zorba-coders/zorba/feature-node_copy into lp:zorba
From: Zorba Build Bot, 2012-03-15
-
[Merge] lp:~zorba-coders/zorba/feature-node_copy into lp:zorba
From: Zorba Build Bot, 2012-03-15
-
[Merge] lp:~zorba-coders/zorba/feature-node_copy into lp:zorba
From: Matthias Brantner, 2012-03-15
-
[Merge] lp:~zorba-coders/zorba/feature-node_copy into lp:zorba
From: Zorba Build Bot, 2012-03-15
-
Re: [Merge] lp:~zorba-coders/zorba/feature-node_copy into lp:zorba
From: Zorba Build Bot, 2012-03-15
-
[Merge] lp:~zorba-coders/zorba/feature-node_copy into lp:zorba
From: Zorba Build Bot, 2012-03-15
-
[Merge] lp:~zorba-coders/zorba/feature-node_copy into lp:zorba
From: Matthias Brantner, 2012-03-15
-
Re: [Merge] lp:~zorba-coders/zorba/feature-node_copy into lp:zorba
From: Matthias Brantner, 2012-03-15