zorba-coders team mailing list archive
-
zorba-coders team
-
Mailing list archive
-
Message #04750
[Merge] lp:~paul-lucas/zorba/bug-923015 into lp:zorba
Paul J. Lucas has proposed merging lp:~paul-lucas/zorba/bug-923015 into lp:zorba.
Requested reviews:
Matthias Brantner (matthias-brantner)
William Candillon (wcandillon)
Related bugs:
Bug #923015 in Zorba: "clone() not implemented for full-text expressions"
https://bugs.launchpad.net/zorba/+bug/923015
For more details, see:
https://code.launchpad.net/~paul-lucas/zorba/bug-923015/+merge/92398
Added clone().
--
https://code.launchpad.net/~paul-lucas/zorba/bug-923015/+merge/92398
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'ChangeLog'
--- ChangeLog 2012-02-07 14:26:42 +0000
+++ ChangeLog 2012-02-10 01:03:24 +0000
@@ -2,6 +2,7 @@
version 2.2
+ * Fixed bug 923015 (clone() not implemented for full-text expressions)
* No-copy optimization: avoids copying nodes during node-constructor expressions.
* Added external function annotations %ann:propagates-input-nodes and
%ann:must-copy-input-nodes to be used by the no-copy optimization.
=== modified file 'src/compiler/expression/ft_expr.cpp'
--- src/compiler/expression/ft_expr.cpp 2011-06-14 17:26:33 +0000
+++ src/compiler/expression/ft_expr.cpp 2012-02-10 01:03:24 +0000
@@ -58,6 +58,15 @@
v.end_visit( *this );
}
+expr_t ftcontains_expr::clone( substitution_t &s ) const {
+ return new ftcontains_expr(
+ theSctx, get_loc(),
+ range_->clone( s ),
+ ftselection_->clone( s ).release(),
+ ftignore_.isNull() ? 0 : ftignore_->clone( s )
+ );
+}
+
void ftcontains_expr::compute_scripting_kind() {
checkSimpleExpr(range_);
=== modified file 'src/compiler/expression/ft_expr.h'
--- src/compiler/expression/ft_expr.h 2012-01-11 17:30:25 +0000
+++ src/compiler/expression/ft_expr.h 2012-02-10 01:03:24 +0000
@@ -37,13 +37,14 @@
void serialize( serialization::Archiver& );
ftcontains_expr(
- static_context* sctx,
+ static_context*,
QueryLoc const&,
expr_t range,
ftnode *ftselection,
expr_t ftignore
);
+ expr_t clone( substitution_t& ) const;
void compute_scripting_kind();
expr_t get_range() const { return range_; }
@@ -63,7 +64,6 @@
} // namespace zorba
#endif /* ZORBA_FT_EXPR_H */
-
/*
* Local variables:
* mode: c++
=== modified file 'src/compiler/expression/ftnode.cpp'
--- src/compiler/expression/ftnode.cpp 2012-02-02 09:56:52 +0000
+++ src/compiler/expression/ftnode.cpp 2012-02-10 01:03:24 +0000
@@ -30,6 +30,7 @@
#include "ftnode_visitor.h"
using namespace std;
+using namespace zorba::locale;
namespace zorba {
@@ -199,6 +200,37 @@
///////////////////////////////////////////////////////////////////////////////
+template<typename PointerType>
+inline PointerType clone_ptr( PointerType p, expr::substitution_t &s ) {
+ return static_cast<PointerType>( p->clone( s ).release() );
+}
+
+template<class RCHandleValueType>
+inline RCHandleValueType* clone_ptr( rchandle<RCHandleValueType> const &p,
+ expr::substitution_t &s ) {
+ return static_cast<RCHandleValueType*>( p->clone( s ).release() );
+}
+
+template<typename PointerType>
+inline PointerType clone_ptr_if( PointerType p, expr::substitution_t &s ) {
+ return p ? clone_ptr( p, s ) : nullptr;
+}
+
+template<class RCHandleValueType>
+inline RCHandleValueType* clone_ptr_if( rchandle<RCHandleValueType> const &p,
+ expr::substitution_t &s ) {
+ return p.isNull() ? nullptr : clone_ptr( p, s );
+}
+
+template<class ContainerType>
+void clone_list( ContainerType const &from, ContainerType *to,
+ expr::substitution_t &s ) {
+ FOR_EACH( typename ContainerType, i, from )
+ to->push_back( clone_ptr( *i, s ) );
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
void ftnode::serialize( serialization::Archiver &ar ) {
ar & loc_;
}
@@ -214,6 +246,12 @@
END_VISIT( v );
}
+ftnode_t ftand::clone( expr::substitution_t &s ) const {
+ ftnode_list_t copy;
+ clone_list( get_node_list(), ©, s );
+ return new ftand( get_loc(), copy );
+}
+
ostream& ftand::put( ostream &o ) const {
BEGIN_INDENT_PUT( o, ftand );
PUT_SEQ( o, ftnode_list_t, get_node_list() );
@@ -238,6 +276,10 @@
END_VISIT( v );
}
+ftnode_t ftcase_option::clone( expr::substitution_t& ) const {
+ return new ftcase_option( get_loc(), mode_ );
+}
+
ostream& ftcase_option::put( ostream &o ) const {
BEGIN_PUT( o, ftcase_option );
PUT_ATTR( o, mode ) << endl;
@@ -262,6 +304,10 @@
END_VISIT( v );
}
+ftnode_t ftcontent_filter::clone( expr::substitution_t &s ) const {
+ return new ftcontent_filter( get_loc(), mode_ );
+}
+
void ftcontent_filter::serialize( serialization::Archiver &ar ) {
serialize_baseclass( ar, (ftpos_filter*)this );
SERIALIZE_ENUM(ft_content_mode::type, mode_);
@@ -287,6 +333,10 @@
END_VISIT( v );
}
+ftnode_t ftdiacritics_option::clone( expr::substitution_t& ) const {
+ return new ftdiacritics_option( get_loc(), mode_ );
+}
+
ostream& ftdiacritics_option::put( ostream &o ) const {
BEGIN_PUT( o, ftdiacritics_option );
PUT_ATTR( o, mode ) << endl;
@@ -320,6 +370,10 @@
END_VISIT( v );
}
+ftnode_t ftdistance_filter::clone( expr::substitution_t &s ) const {
+ return new ftdistance_filter( get_loc(), clone_ptr_if( range_, s ), unit_ );
+}
+
ostream& ftdistance_filter::put( ostream &o ) const {
BEGIN_PUT( o, ftcontent_filter );
PUT_ATTR( o, unit );
@@ -355,6 +409,12 @@
END_VISIT( v );
}
+ftnode_t ftextension_selection::clone( expr::substitution_t &s ) const {
+ return new ftextension_selection(
+ get_loc(), pragmas_, clone_ptr_if( ftselection_, s )
+ );
+}
+
ostream& ftextension_selection::put( ostream &o ) const {
BEGIN_INDENT_PUT( o, ftextension_selection );
PUT_NODE( o, ftselection_ );
@@ -383,6 +443,10 @@
END_VISIT( v );
}
+ftnode_t ftextension_option::clone( expr::substitution_t& ) const {
+ return new ftextension_option( get_loc(), qname_, val_ );
+}
+
ostream& ftextension_option::put( ostream &o ) const {
BEGIN_PUT( o, ftextension_option )
//<< " qname=" << qname_
@@ -416,6 +480,15 @@
);
}
+ftlanguage_option::ftlanguage_option(
+ QueryLoc const &loc,
+ iso639_1::type lang
+) :
+ ftmatch_option( loc ),
+ lang_( lang )
+{
+}
+
void ftlanguage_option::serialize( serialization::Archiver &ar ) {
serialize_baseclass( ar, (ftmatch_option*)this );
SERIALIZE_ENUM(locale::iso639_1::type,lang_);
@@ -427,6 +500,10 @@
END_VISIT( v );
}
+ftnode_t ftlanguage_option::clone( expr::substitution_t& ) const {
+ return new ftlanguage_option( get_loc(), lang_ );
+}
+
ostream& ftlanguage_option::put( ostream &o ) const {
BEGIN_PUT( o, ftlanguage_option );
PUT_ATTR( o, lang ) << endl;
@@ -456,6 +533,33 @@
END_VISIT( v );
}
+ftnode_t ftmatch_options::clone( expr::substitution_t &s ) const {
+ unique_ptr<ftmatch_options> p( new ftmatch_options( get_loc() ) );
+ if ( case_option_ )
+ p->set_case_option( clone_ptr( case_option_, s ) );
+ if ( diacritics_option_ )
+ p->set_diacritics_option(
+ clone_ptr( diacritics_option_, s )
+ );
+
+ FOR_EACH( ftextension_option_list_t, i, extension_options_ )
+ p->add_extension_option( clone_ptr( *i, s ) );
+ if ( current_extension_options_ != &extension_options_ )
+ p->set_extension_options( current_extension_options_ );
+
+ if ( language_option_ )
+ p->set_language_option( clone_ptr( language_option_, s ) );
+ if ( stem_option_ )
+ p->set_stem_option( clone_ptr( stem_option_, s ) );
+ if ( stop_word_option_ )
+ p->set_stop_word_option( clone_ptr( stop_word_option_, s ) );
+ if ( thesaurus_option_ )
+ p->set_thesaurus_option( clone_ptr( thesaurus_option_, s ) );
+ if ( wild_card_option_ )
+ p->set_wild_card_option( clone_ptr( wild_card_option_, s ) );
+ return p.release();
+}
+
ostream& ftmatch_options::put( ostream &o ) const {
BEGIN_INDENT_PUT( o, ftmatch_options );
PUT_NODE( o, case_option_ );
@@ -474,7 +578,7 @@
ar & case_option_;
ar & diacritics_option_;
ar & extension_options_;
- if(!ar.is_serializing_out())
+ if ( !ar.is_serializing_out() )
current_extension_options_ = &extension_options_;
ar & language_option_;
ar & stem_option_;
@@ -510,6 +614,12 @@
END_VISIT( v );
}
+ftnode_t ftmild_not::clone( expr::substitution_t &s ) const {
+ ftnode_list_t copy;
+ clone_list( get_node_list(), ©, s );
+ return new ftmild_not( get_loc(), copy );
+}
+
ostream& ftmild_not::put( ostream &o ) const {
BEGIN_INDENT_PUT( o, ftmild_not );
PUT_SEQ( o, ftnode_list_t, get_node_list() );
@@ -546,6 +656,12 @@
END_VISIT( v );
}
+ftnode_t ftor::clone( expr::substitution_t &s ) const {
+ ftnode_list_t copy;
+ clone_list( get_node_list(), ©, s );
+ return new ftor( get_loc(), copy );
+}
+
ostream& ftor::put( ostream &o ) const {
BEGIN_INDENT_PUT( o, ftor );
PUT_SEQ( o, ftnode_list_t, get_node_list() );
@@ -566,10 +682,15 @@
END_VISIT( v );
}
+ftnode_t ftorder_filter::clone( expr::substitution_t &s ) const {
+ return new ftorder_filter( get_loc() );
+}
+
ostream& ftorder_filter::put( ostream &o ) const {
BEGIN_PUT( o, ftorder_filter ) << endl;
END_PUT( o );
}
+
void ftorder_filter::serialize( serialization::Archiver &ar ) {
serialize_baseclass( ar, (ftpos_filter*)this );
}
@@ -583,9 +704,7 @@
serialize_baseclass( ar, (ftnode*)this );
}
-ftprimary_with_options::ftprimary_with_options(
- QueryLoc const &loc
-) :
+ftprimary_with_options::ftprimary_with_options( QueryLoc const &loc ) :
ftnode( loc ),
primary_( nullptr ),
match_options_( new ftmatch_options( loc ) ),
@@ -607,6 +726,17 @@
END_VISIT( v );
}
+ftnode_t ftprimary_with_options::clone( expr::substitution_t &s ) const {
+ unique_ptr<ftprimary_with_options> p(
+ new ftprimary_with_options( get_loc() )
+ );
+ p->set_match_options( clone_ptr( match_options_, s ) );
+ p->set_primary( clone_ptr( primary_, s ) );
+ if ( weight_ )
+ p->set_weight( clone_ptr( weight_, s ) );
+ return p.release();
+}
+
ostream& ftprimary_with_options::put( ostream &o ) const {
BEGIN_INDENT_PUT( o, ftprimary_with_options );
PUT_NODE( o, primary_ );
@@ -643,6 +773,15 @@
END_VISIT( v );
}
+ftnode_t ftrange::clone( expr::substitution_t &s ) const {
+ return new ftrange(
+ get_loc(), mode_,
+ clone_ptr( expr1_, s ),
+ clone_ptr_if( expr2_, s )
+ );
+ // TODO: do PlanIter_t's have to be cloned?
+}
+
ostream& ftrange::put( ostream &o ) const {
BEGIN_INDENT_PUT( o, ftrange );
PUT_EXPR( o, expr1_ );
@@ -673,6 +812,10 @@
END_VISIT( v );
}
+ftnode_t ftscope_filter::clone( expr::substitution_t &s ) const {
+ return new ftscope_filter( get_loc(), scope_, unit_ );
+}
+
ostream& ftscope_filter::put( ostream &o ) const {
BEGIN_PUT( o, ftscope_filter );
PUT_ATTR( o, scope );
@@ -726,6 +869,10 @@
END_VISIT( v );
}
+ftnode_t ftselection::clone( expr::substitution_t &s ) const {
+ return new ftselection( get_loc(), ftor_->clone( s ).release(), list_ );
+}
+
ostream& ftselection::put( ostream &o ) const {
BEGIN_INDENT_PUT( o, ftselection );
PUT_NODE( o, ftor_ );
@@ -753,6 +900,10 @@
END_VISIT( v );
}
+ftnode_t ftstem_option::clone( expr::substitution_t& ) const {
+ return new ftstem_option( get_loc(), mode_ );
+}
+
ostream& ftstem_option::put( ostream &o ) const {
BEGIN_PUT( o, ftstem_option );
PUT_ATTR( o, mode ) << endl;
@@ -783,6 +934,10 @@
END_VISIT( v );
}
+ftnode_t ftstop_words::clone( expr::substitution_t& ) const {
+ return new ftstop_words( get_loc(), uri_, list_, mode_ );
+}
+
ostream& ftstop_words::put( ostream &o ) const {
BEGIN_PUT( o, ftstop_words );
PUT_ATTR( o, uri );
@@ -831,6 +986,12 @@
END_VISIT( v );
}
+ftnode_t ftstop_word_option::clone( expr::substitution_t &s ) const {
+ list_t copy;
+ clone_list( stop_words_, ©, s );
+ return new ftstop_word_option( get_loc(), copy, mode_ );
+}
+
ostream& ftstop_word_option::put( ostream &o ) const {
BEGIN_PUT( o, ftstop_word_option );
PUT_ATTR( o, mode );
@@ -873,6 +1034,12 @@
END_VISIT( v );
}
+ftnode_t ftthesaurus_id::clone( expr::substitution_t &s ) const {
+ return new ftthesaurus_id(
+ get_loc(), uri_, relationship_, clone_ptr_if( levels_, s )
+ );
+}
+
ostream& ftthesaurus_id::put( ostream &o ) const {
BEGIN_PUT( o, ftthesaurus_id );
PUT_ATTR( o, uri );
@@ -914,6 +1081,14 @@
END_VISIT( v );
}
+ftnode_t ftthesaurus_option::clone( expr::substitution_t &s ) const {
+ thesaurus_id_list_t copy;
+ clone_list( thesaurus_id_list_, ©, s );
+ return new ftthesaurus_option(
+ get_loc(), clone_ptr_if( default_tid_, s ), copy, no_thesaurus_
+ );
+}
+
ostream& ftthesaurus_option::put( ostream &o ) const {
BEGIN_PUT( o, ftthesaurus_option );
PUT_BOOL( o, no_thesaurus );
@@ -945,6 +1120,10 @@
END_VISIT( v );
}
+ftnode_t ftunary_not::clone( expr::substitution_t &s ) const {
+ return new ftunary_not( get_loc(), subnode_->clone( s ).release() );
+}
+
ostream& ftunary_not::put( ostream &o ) const {
BEGIN_INDENT_PUT( o, ftunary_not );
PUT_NODE( o, subnode_ );
@@ -967,6 +1146,10 @@
END_VISIT( v );
}
+ftnode_t ftweight::clone( expr::substitution_t &s ) const {
+ return new ftweight( get_loc(), weight_expr_->clone( s ).release() );
+}
+
ostream& ftweight::put( ostream &o ) const {
BEGIN_INDENT_PUT( o, ftweight );
PUT_EXPR( o, weight_expr_ );
@@ -993,6 +1176,10 @@
END_VISIT( v );
}
+ftnode_t ftwild_card_option::clone( expr::substitution_t &s ) const {
+ return new ftwild_card_option( get_loc(), mode_ );
+}
+
ostream& ftwild_card_option::put( ostream &o ) const {
BEGIN_PUT( o, ftwild_card_option );
PUT_ATTR( o, mode ) << endl;
@@ -1022,6 +1209,12 @@
END_VISIT( v );
}
+ftnode_t ftwindow_filter::clone( expr::substitution_t &s ) const {
+ return new ftwindow_filter(
+ get_loc(), window_expr_->clone( s ).release(), unit_
+ );
+}
+
ostream& ftwindow_filter::put( ostream &o ) const {
BEGIN_PUT( o, ftwindow_filter );
PUT_ATTR( o, unit );
@@ -1054,6 +1247,10 @@
END_VISIT( v );
}
+ftnode_t ftwords::clone( expr::substitution_t &s ) const {
+ return new ftwords( get_loc(), value_expr_->clone( s ).release(), mode_ );
+}
+
ostream& ftwords::put( ostream &o ) const {
BEGIN_PUT( o, ftwords );
PUT_ATTR( o, mode );
@@ -1093,6 +1290,12 @@
END_VISIT( v );
}
+ftnode_t ftwords_times::clone( expr::substitution_t &s ) const {
+ return new ftwords_times(
+ get_loc(), clone_ptr( ftwords_, s ), clone_ptr_if( fttimes_, s )
+ );
+}
+
ostream& ftwords_times::put( ostream &o ) const {
BEGIN_INDENT_PUT( o, ftwords_times );
PUT_NODE( o, ftwords_ );
=== modified file 'src/compiler/expression/ftnode.h'
--- src/compiler/expression/ftnode.h 2011-07-17 20:05:49 +0000
+++ src/compiler/expression/ftnode.h 2012-02-10 01:03:24 +0000
@@ -43,6 +43,7 @@
void serialize( serialization::Archiver& );
virtual ft_visit_result::type accept( ftnode_visitor& ) = 0;
+ virtual ftnode_t clone( expr::substitution_t& ) const = 0;
QueryLoc const& get_loc() const { return loc_; }
virtual std::ostream& put( std::ostream& ) const = 0;
@@ -83,6 +84,7 @@
);
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
ft_case_mode::type get_mode() const { return mode_; }
std::ostream& put( std::ostream& ) const;
@@ -104,6 +106,7 @@
);
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
ft_diacritics_mode::type get_mode() const { return mode_; }
std::ostream& put( std::ostream& ) const;
@@ -126,6 +129,7 @@
);
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
rchandle<QName> const& get_qname() const { return qname_; }
zstring const& get_val() const { return val_; }
std::ostream& put( std::ostream& ) const;
@@ -148,7 +152,13 @@
zstring const &language
);
+ ftlanguage_option(
+ QueryLoc const&,
+ locale::iso639_1::type
+ );
+
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
locale::iso639_1::type get_language() const { return lang_; }
std::ostream& put( std::ostream& ) const;
@@ -170,6 +180,7 @@
);
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
ft_stem_mode::type get_mode() const { return mode_; }
std::ostream& put( std::ostream& ) const;
@@ -195,6 +206,7 @@
);
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
zstring const& get_uri() const { return uri_; }
list_t const& get_list() const { return list_; }
ft_stop_words_unex::type get_mode() const { return mode_; }
@@ -233,6 +245,7 @@
~ftstop_word_option();
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
ft_stop_words_mode::type get_mode() const { return mode_; }
list_t const& get_stop_words() const { return stop_words_; }
std::ostream& put( std::ostream& ) const;
@@ -259,6 +272,7 @@
~ftthesaurus_id();
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
zstring const& get_uri() const { return uri_; }
zstring const& get_relationship() const { return relationship_; }
ftrange const* get_levels() const { return levels_; }
@@ -295,6 +309,7 @@
}
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
bool no_thesaurus() const { return no_thesaurus_; }
std::ostream& put( std::ostream& ) const;
@@ -318,6 +333,7 @@
);
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
ft_wild_card_mode::type get_mode() const { return mode_; }
std::ostream& put( std::ostream& ) const;
@@ -338,31 +354,43 @@
ftmatch_options( QueryLoc const& );
ft_visit_result::type accept( ftnode_visitor& );
-
- ftcase_option const* get_case_option() const { return case_option_.getp(); }
-
- ftdiacritics_option const* get_diacritics_option() const
- { return diacritics_option_.getp(); }
-
- ftextension_option_list_t* get_extension_options()
- { return extension_options_.empty() ? nullptr : &extension_options_; }
-
- ftextension_option_list_t const* get_extension_options() const
- { return extension_options_.empty() ? nullptr : &extension_options_; }
-
- ftlanguage_option const* get_language_option() const
- { return language_option_.getp(); }
-
- ftstem_option const* get_stem_option() const { return stem_option_.getp(); }
-
- ftstop_word_option const* get_stop_word_option() const
- { return stop_word_option_.getp(); }
-
- ftthesaurus_option const* get_thesaurus_option() const
- { return thesaurus_option_.getp(); }
-
- ftwild_card_option const* get_wild_card_option() const
- { return wild_card_option_.getp(); }
+ ftnode_t clone( expr::substitution_t& ) const;
+
+ ftcase_option const* get_case_option() const {
+ return case_option_.getp();
+ }
+
+ ftdiacritics_option const* get_diacritics_option() const {
+ return diacritics_option_.getp();
+ }
+
+ ftextension_option_list_t* get_extension_options() {
+ return extension_options_.empty() ? nullptr : &extension_options_;
+ }
+
+ ftextension_option_list_t const* get_extension_options() const {
+ return extension_options_.empty() ? nullptr : &extension_options_;
+ }
+
+ ftlanguage_option const* get_language_option() const {
+ return language_option_.getp();
+ }
+
+ ftstem_option const* get_stem_option() const {
+ return stem_option_.getp();
+ }
+
+ ftstop_word_option const* get_stop_word_option() const {
+ return stop_word_option_.getp();
+ }
+
+ ftthesaurus_option const* get_thesaurus_option() const {
+ return thesaurus_option_.getp();
+ }
+
+ ftwild_card_option const* get_wild_card_option() const {
+ return wild_card_option_.getp();
+ }
void add_extension_option( ftextension_option *o ) {
extension_options_.push_back( o );
@@ -407,8 +435,14 @@
private:
ftcase_option_t case_option_;
ftdiacritics_option_t diacritics_option_;
+
ftextension_option_list_t extension_options_;
+ //
+ // This points either to our own extension_options_ or a different one set by
+ // set_extension_options().
+ //
ftextension_option_list_t const *current_extension_options_;
+
ftlanguage_option_t language_option_;
ftstem_option_t stem_option_;
ftstop_word_option_t stop_word_option_;
@@ -427,6 +461,7 @@
ftweight( QueryLoc const&, expr_t const &weight_expr );
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
expr_t& get_weight_expr() { return weight_expr_; }
PlanIter_t get_weight_iter() const { return weight_iter_; }
std::ostream& put( std::ostream& ) const;
@@ -465,6 +500,7 @@
~ftprimary_with_options();
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
ftprimary const* get_primary() const { return primary_; }
ftweight* get_weight() { return weight_; }
ftmatch_options const* get_match_options() const { return match_options_; }
@@ -506,6 +542,7 @@
~ftextension_selection();
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
rchandle<PragmaList> const& get_pragmas() const { return pragmas_; }
ftselection const* get_ftselection() const { return ftselection_; }
std::ostream& put( std::ostream& ) const;
@@ -532,6 +569,7 @@
~ftselection();
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
ftpos_filter_list_t const& get_ftpos_filter_list() const { return list_; }
ftnode const* get_ftor() const { return ftor_; };
std::ostream& put( std::ostream& ) const;
@@ -556,6 +594,7 @@
~ftwords_times();
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
ftwords const* get_words() const { return ftwords_; }
ftrange const* get_times() const { return fttimes_; }
std::ostream& put( std::ostream& ) const;
@@ -587,6 +626,7 @@
ftcontent_filter( QueryLoc const&, ft_content_mode::type );
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
ft_content_mode::type get_mode() const { return mode_; }
std::ostream& put( std::ostream& ) const;
@@ -605,6 +645,7 @@
~ftdistance_filter();
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
ftrange const* get_range() const { return range_; }
ft_unit::type get_unit() const { return unit_; }
std::ostream& put( std::ostream& ) const;
@@ -621,8 +662,10 @@
SERIALIZABLE_CLASS_CONSTRUCTOR2(ftorder_filter,ftpos_filter)
void serialize( serialization::Archiver& );
- ft_visit_result::type accept( ftnode_visitor& );
ftorder_filter( QueryLoc const& );
+
+ ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
std::ostream& put( std::ostream& ) const;
};
@@ -636,6 +679,7 @@
ftscope_filter( QueryLoc const&, ft_scope::type, ft_big_unit::type );
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
ft_scope::type get_scope() const { return scope_; }
ft_big_unit::type get_unit() const { return unit_; }
std::ostream& put( std::ostream& ) const;
@@ -655,6 +699,7 @@
ftwindow_filter( QueryLoc const&, expr_t const&, ft_unit::type );
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
ft_unit::type get_unit() const { return unit_; }
expr_t& get_window_expr() { return window_expr_; }
PlanIter_t get_window_iter() const { return window_iter_; }
@@ -705,6 +750,7 @@
ftand( QueryLoc const&, ftnode_list_t& );
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
std::ostream& put( std::ostream& ) const;
};
@@ -718,6 +764,7 @@
ftmild_not( QueryLoc const&, ftnode_list_t& );
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
std::ostream& put( std::ostream& ) const;
};
@@ -731,6 +778,7 @@
ftor( QueryLoc const&, ftnode_list_t& );
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
std::ostream& put( std::ostream& ) const;
};
@@ -745,6 +793,7 @@
~ftunary_not();
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
ftnode const* get_subnode() const { return subnode_; }
std::ostream& put( std::ostream& ) const;
@@ -768,6 +817,7 @@
);
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
expr_t& get_expr1() { return expr1_; }
expr_t& get_expr2() { return expr2_; }
PlanIter_t get_plan_iter1() const { return iter1_; }
@@ -802,6 +852,7 @@
);
ft_visit_result::type accept( ftnode_visitor& );
+ ftnode_t clone( expr::substitution_t& ) const;
expr_t& get_value_expr() { return value_expr_; }
PlanIter_t get_value_iter() const { return value_iter_; }
ft_anyall_mode::type get_mode() const { return mode_; }
=== modified file 'src/zorbatypes/rchandle.h'
--- src/zorbatypes/rchandle.h 2012-02-02 09:56:52 +0000
+++ src/zorbatypes/rchandle.h 2012-02-10 01:03:24 +0000
@@ -142,6 +142,13 @@
********************************************************************************/
template<class T> class rchandle
{
+public:
+ typedef T value_type;
+ typedef value_type* pointer;
+ typedef value_type const* const_pointer;
+ typedef value_type& reference;
+ typedef value_type const& const_reference;
+
protected:
T * p;
=== added file 'test/rbkt/ExpQueryResults/zorba/fulltext/ft-expr-clone-1.xml.res'
--- test/rbkt/ExpQueryResults/zorba/fulltext/ft-expr-clone-1.xml.res 1970-01-01 00:00:00 +0000
+++ test/rbkt/ExpQueryResults/zorba/fulltext/ft-expr-clone-1.xml.res 2012-02-10 01:03:24 +0000
@@ -0,0 +1,1 @@
+true
=== added file 'test/rbkt/Queries/zorba/fulltext/ft-expr-clone-1.xq'
--- test/rbkt/Queries/zorba/fulltext/ft-expr-clone-1.xq 1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/fulltext/ft-expr-clone-1.xq 2012-02-10 01:03:24 +0000
@@ -0,0 +1,10 @@
+(: This tests that full-text expressions are cloned properly. :)
+
+declare function local:f() {
+ let $x := <msg>hello world</msg>
+ return $x contains text "hello"
+};
+
+local:f()
+
+(: vim:set et sw=2 ts=2: :)
Follow ups