zorba-coders team mailing list archive
-
zorba-coders team
-
Mailing list archive
-
Message #04820
[Merge] lp:~zorba-coders/zorba/markos-scratch into lp:zorba
Markos Zaharioudakis has proposed merging lp:~zorba-coders/zorba/markos-scratch into lp:zorba.
Requested reviews:
Markos Zaharioudakis (markos-za)
For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/92871
1. Optimization: preallocate and reuse temp sequence iterator for LetVarITerator and CtxVarIterator.
2. Optimization: enhanced push-down of positional predicate into LetVarITerator and CtxVarIterator.
--
https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/92871
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'ChangeLog'
--- ChangeLog 2012-02-10 01:01:16 +0000
+++ ChangeLog 2012-02-13 22:55:21 +0000
@@ -26,6 +26,10 @@
* Added split function to the string module that allows for streamable tokenization but doesn't have regular expression
support.
* Fixed bug involving positional var and groupby
+ * Optimization: preallocate and reuse temp sequence iterator for LetVarITerator
+ and CtxVarIterator.
+ * Optimization: enhanced push-down of positional predicate into LetVarITerator
+ and CtxVarIterator.
* zerr is not predeclared anymore to be http://www.zorba-xquery.com/errors
* Add new XQuery interface for the PHP bindings.
* Added API method Item::getNamespaceBindings().
=== modified file 'src/functions/func_sequences_impl.cpp'
--- src/functions/func_sequences_impl.cpp 2012-01-23 10:06:24 +0000
+++ src/functions/func_sequences_impl.cpp 2012-02-13 22:55:21 +0000
@@ -393,12 +393,11 @@
const var_expr* inputVar = inputExpr->get_var();
if (inputVar != NULL &&
- lenExpr != NULL &&
(inputVar->get_kind() == var_expr::let_var ||
inputVar->get_kind() == var_expr::win_var ||
inputVar->get_kind() == var_expr::non_groupby_var) &&
letVarIter->setTargetPosIter(aArgs[1]) &&
- letVarIter->setTargetLenIter(aArgs[2]))
+ letVarIter->setTargetLenIter(lenExpr ? aArgs[2] : NULL))
{
return aArgs[0];
}
@@ -408,10 +407,9 @@
const var_expr* inputVar = inputExpr->get_var();
if (inputVar != NULL &&
- lenExpr != NULL &&
!inputVar->is_context_item() &&
ctxVarIter->setTargetPosIter(aArgs[1]) &&
- ctxVarIter->setTargetLenIter(aArgs[2]))
+ ctxVarIter->setTargetLenIter(lenExpr ? aArgs[2] : NULL))
{
return aArgs[0];
}
=== modified file 'src/runtime/core/var_iterators.cpp'
--- src/runtime/core/var_iterators.cpp 2011-12-21 14:40:33 +0000
+++ src/runtime/core/var_iterators.cpp 2012-02-13 22:55:21 +0000
@@ -29,9 +29,11 @@
#include "runtime/visitors/planiter_visitor.h"
#include "store/api/iterator.h"
+#include "store/api/iterator_factory.h"
#include "store/api/item.h"
#include "store/api/item_factory.h"
#include "store/api/temp_seq.h"
+#include "store/api/store.h"
#include "util/string_util.h"
@@ -262,6 +264,9 @@
}
+/*******************************************************************************
+
+********************************************************************************/
CtxVarIterator::CtxVarIterator(
static_context* sctx,
const QueryLoc& loc,
@@ -273,7 +278,8 @@
theVarId(varid),
theVarName(varName),
theIsLocal(isLocal),
- theTargetPos(0)
+ theTargetPos(0),
+ theInfLen(false)
{
}
@@ -289,6 +295,7 @@
ar & theTargetPos;
ar & theTargetPosIter;
ar & theTargetLenIter;
+ ar & theInfLen;
}
@@ -316,15 +323,24 @@
bool CtxVarIterator::setTargetLenIter(const PlanIter_t& v)
{
- if (theTargetPos == Integer(0) && theTargetLenIter == NULL)
+ if (theTargetPos == Integer(0) &&
+ theTargetLenIter == NULL &&
+ theInfLen == false)
{
- theTargetLenIter = v;
+ if (v == NULL)
+ theInfLen = true;
+ else
+ theTargetLenIter = v;
+
return true;
}
return false;
}
+/*******************************************************************************
+
+********************************************************************************/
uint32_t CtxVarIterator::getStateSizeOfSubtree() const
{
uint32_t size = 0;
@@ -345,6 +361,9 @@
}
+/*******************************************************************************
+
+********************************************************************************/
void CtxVarIterator::openImpl(
PlanState& planState,
uint32_t& offset)
@@ -361,6 +380,9 @@
}
+/*******************************************************************************
+
+********************************************************************************/
void CtxVarIterator::resetImpl(PlanState& planState) const
{
NoaryBaseIterator<CtxVarIterator, CtxVarState>::resetImpl(planState);
@@ -375,6 +397,9 @@
}
+/*******************************************************************************
+
+********************************************************************************/
void CtxVarIterator::closeImpl(PlanState& planState)
{
NoaryBaseIterator<CtxVarIterator, CtxVarState>::closeImpl(planState);
@@ -389,7 +414,9 @@
}
+/*******************************************************************************
+********************************************************************************/
bool CtxVarIterator::nextImpl(store::Item_t& result, PlanState& planState) const
{
store::Item_t varSingleItem;
@@ -405,7 +432,7 @@
CtxVarState* state;
DEFAULT_STACK_INIT(CtxVarState, state, planState);
- if (theTargetPosIter != NULL && theTargetLenIter == NULL)
+ if (theTargetPosIter != NULL && theTargetLenIter == NULL && theInfLen == false)
{
result = NULL;
@@ -443,7 +470,7 @@
}
} // if (theTargetPosIter != NULL && theTargetLenIter == NULL)
- else if (theTargetPosIter != NULL && theTargetLenIter != NULL)
+ else if (theTargetPosIter != NULL)
{
result = NULL;
@@ -454,12 +481,24 @@
startPos = posItem->getIntegerValue();
- if (!consumeNext(lenItem, theTargetLenIter, planState))
- {
- ZORBA_ASSERT(false);
- }
+ dctx->get_variable(theVarId, theVarName, loc, varSingleItem, state->theTempSeq);
- len = lenItem->getIntegerValue();
+ if (theInfLen)
+ {
+ if (varSingleItem != NULL)
+ len = 1;
+ else
+ len = state->theTempSeq->getSize();
+ }
+ else
+ {
+ if (!consumeNext(lenItem, theTargetLenIter, planState))
+ {
+ ZORBA_ASSERT(false);
+ }
+
+ len = lenItem->getIntegerValue();
+ }
if (startPos <= Integer(0))
{
@@ -467,10 +506,8 @@
startPos = 1;
}
- state->theLastPos = startPos + len;
- state->thePos = startPos;
-
- dctx->get_variable(theVarId, theVarName, loc, varSingleItem, state->theTempSeq);
+ state->theLastPos = startPos + len;
+ state->thePos = startPos;
if (varSingleItem != NULL)
{
@@ -542,7 +579,10 @@
}
else if (state->theTempSeq != NULL)
{
- state->theSourceIter = state->theTempSeq->getIterator();
+ if (state->theSourceIter == NULL)
+ state->theSourceIter = GENV_STORE.getIteratorFactory()->createTempSeqIterator();
+
+ state->theSourceIter->init(state->theTempSeq);
state->theSourceIter->open();
while (state->theSourceIter->next(result))
@@ -551,7 +591,6 @@
}
state->theSourceIter->close();
- state->theSourceIter = NULL;
}
else
{
@@ -648,9 +687,15 @@
if (theSourceIter != NULL)
theSourceIter->reset();
+
+ if (theTempSeqIter != NULL)
+ theTempSeqIter->reset();
}
+/*******************************************************************************
+
+********************************************************************************/
LetVarIterator::LetVarIterator(
static_context* sctx,
const QueryLoc& loc,
@@ -658,7 +703,8 @@
:
NoaryBaseIterator<LetVarIterator, LetVarState>(sctx, loc),
theVarName(name),
- theTargetPos(0)
+ theTargetPos(0),
+ theInfLen(false)
{
}
@@ -670,9 +716,13 @@
ar & theTargetPos;
ar & theTargetPosIter;
ar & theTargetLenIter;
+ ar & theInfLen;
}
+/*******************************************************************************
+
+********************************************************************************/
bool LetVarIterator::setTargetPos(xs_integer v)
{
if (theTargetPos == Integer(0) && theTargetPosIter == NULL)
@@ -697,9 +747,15 @@
bool LetVarIterator::setTargetLenIter(const PlanIter_t& v)
{
- if (theTargetPos == Integer(0) && theTargetLenIter == NULL)
+ if (theTargetPos == Integer(0) &&
+ theTargetLenIter == NULL &&
+ theInfLen == false)
{
- theTargetLenIter = v;
+ if (v == NULL)
+ theInfLen = true;
+ else
+ theTargetLenIter = v;
+
return true;
}
return false;
@@ -721,7 +777,7 @@
/*******************************************************************************
********************************************************************************/
-void LetVarIterator::bind(store::TempSeq_t& value, PlanState& planState)
+void LetVarIterator::bind(const store::TempSeq_t& value, PlanState& planState)
{
LetVarState* state;
state = StateTraitsImpl<LetVarState>::getState(planState, theStateOffset);
@@ -736,8 +792,11 @@
}
else
{
- state->theSourceIter = state->theTempSeq->getIterator();
- state->theSourceIter->open();
+ if (state->theTempSeqIter == NULL)
+ state->theTempSeqIter = GENV_STORE.getIteratorFactory()->createTempSeqIterator();
+
+ state->theTempSeqIter->init(value);
+ state->theTempSeqIter->open();
}
}
}
@@ -749,8 +808,8 @@
void LetVarIterator::bind(
store::TempSeq_t& value,
PlanState& planState,
- ulong startPos,
- ulong endPos)
+ xs_integer startPos,
+ xs_integer endPos)
{
LetVarState* state;
state = StateTraitsImpl<LetVarState>::getState(planState, theStateOffset);
@@ -761,12 +820,15 @@
{
if (theTargetPos > Integer(0))
{
- value->getItem((Integer(startPos) + theTargetPos - Integer(1)), state->theItem);
+ value->getItem((startPos + theTargetPos - Integer(1)), state->theItem);
}
else
{
- state->theSourceIter = state->theTempSeq->getIterator(startPos, endPos, true);
- state->theSourceIter->open();
+ if (state->theTempSeqIter == NULL)
+ state->theTempSeqIter = GENV_STORE.getIteratorFactory()->createTempSeqIterator();
+
+ state->theTempSeqIter->init(value, startPos, endPos);
+ state->theTempSeqIter->open();
}
}
}
@@ -849,7 +911,7 @@
startPos = posItem->getIntegerValue();
- if (theTargetLenIter == NULL)
+ if (theTargetLenIter == NULL && theInfLen == false)
{
if (startPos > Integer(0))
state->theTempSeq->getItem(startPos, result);
@@ -859,12 +921,19 @@
}
else
{
- if (!consumeNext(lenItem, theTargetLenIter, planState))
+ if (theInfLen)
{
- ZORBA_ASSERT(false);
+ len = state->theTempSeq->getSize();
}
+ else
+ {
+ if (!consumeNext(lenItem, theTargetLenIter, planState))
+ {
+ ZORBA_ASSERT(false);
+ }
- len = lenItem->getIntegerValue();
+ len = lenItem->getIntegerValue();
+ }
if (startPos <= Integer(0))
{
@@ -892,9 +961,17 @@
if (result)
STACK_PUSH(true, state);
}
+ else if (state->theTempSeqIter)
+ {
+ assert(state->theSourceIter == NULL);
+ while (state->theTempSeqIter->next(result))
+ {
+ STACK_PUSH(true, state);
+ }
+ }
else
{
- assert(state->theSourceIter != NULL);
+ assert(state->theSourceIter != NULL && state->theTempSeqIter == NULL);
while (state->theSourceIter->next(result))
{
STACK_PUSH(true, state);
=== modified file 'src/runtime/core/var_iterators.h'
--- src/runtime/core/var_iterators.h 2011-12-21 14:40:33 +0000
+++ src/runtime/core/var_iterators.h 2012-02-13 22:55:21 +0000
@@ -223,13 +223,13 @@
class CtxVarState : public PlanIteratorState
{
public:
- store::TempSeq_t theTempSeq;
-
- store::Iterator_t theSourceIter;
- store::Item_t theItem;
-
- xs_integer thePos;
- xs_integer theLastPos;
+ store::TempSeq_t theTempSeq;
+
+ store::TempSeqIterator_t theSourceIter;
+ store::Item_t theItem;
+
+ xs_integer thePos;
+ xs_integer theLastPos;
public:
CtxVarState();
@@ -250,6 +250,7 @@
xs_integer theTargetPos;
PlanIter_t theTargetPosIter;
PlanIter_t theTargetLenIter;
+ bool theInfLen;
public:
SERIALIZABLE_CLASS(CtxVarIterator);
@@ -366,22 +367,34 @@
LET variables. A LetVarIterator represents a reference to a let variable V.
- theSourceIter stores the current "value" of V: it is a PlanIteratorWraper
- that may wrap the actual domain expression that defines the var, or an
- iterator over a temp sequence, if the result of the domain expression is
- materialized.
+ If the var is materialized, then its value is stored in a temp sequence, and a
+ (smart) pointer to that temp seq is stored in the state of the LetVarIterator.
+ Otherwise, it's value is a PlanIteratorWraper that may wrap the actual domain
+ expression that defines the var.
+
+ theSourceIter:
+ --------------
+ Stores the current "value" of V, if the variable is not materialized.
+
+ theTempSeq:
+ -----------
+ The temp seq storing the value of tha variable.
+
+ theTempSeqIter:
+ ---------------
+ A pre-allocated iterator over the temp seq.
********************************************************************************/
class LetVarState : public PlanIteratorState
{
public:
- store::TempSeq_t theTempSeq;
-
- store::Iterator_t theSourceIter;
- store::Item_t theItem;
-
- xs_integer thePos;
- xs_integer theLastPos;
+ store::Iterator_t theSourceIter;
+
+ store::TempSeq_t theTempSeq;
+ store::TempSeqIterator_t theTempSeqIter;
+ store::Item_t theItem;
+ xs_integer thePos;
+ xs_integer theLastPos;
public:
LetVarState();
@@ -399,6 +412,7 @@
xs_integer theTargetPos;
PlanIter_t theTargetPosIter;
PlanIter_t theTargetLenIter;
+ bool theInfLen;
public:
SERIALIZABLE_CLASS(LetVarIterator);
@@ -431,9 +445,13 @@
store::Item* getVarName() const { return theVarName.getp(); }
- void bind(store::TempSeq_t& value, PlanState& planState);
+ void bind(const store::TempSeq_t& value, PlanState& planState);
- void bind(store::TempSeq_t& value, PlanState& planState, ulong startPos, ulong endPos);
+ void bind(
+ store::TempSeq_t& value,
+ PlanState& planState,
+ xs_integer startPos,
+ xs_integer endPos);
void bind(store::Iterator_t& it, PlanState& planState);
=== modified file 'src/store/api/iterator.h'
--- src/store/api/iterator.h 2011-06-14 17:26:33 +0000
+++ src/store/api/iterator.h 2012-02-13 22:55:21 +0000
@@ -208,6 +208,8 @@
virtual void init(const TempSeq_t& seq) = 0;
+ virtual void init(const TempSeq_t& seq, xs_integer startPos, xs_integer endPos) = 0;
+
virtual void open() = 0;
virtual Item* next() = 0;
=== modified file 'src/store/api/temp_seq.h'
--- src/store/api/temp_seq.h 2011-12-21 14:40:33 +0000
+++ src/store/api/temp_seq.h 2012-02-13 22:55:21 +0000
@@ -80,7 +80,6 @@
*/
virtual void getItem(xs_integer position, Item_t& result) = 0;
-
/**
* Returns true if the item at the passed position is available.
*
@@ -92,6 +91,11 @@
virtual bool containsItem(xs_integer position) = 0;
/**
+ *
+ */
+ virtual xs_integer getSize() const = 0;
+
+ /**
* Reads the whole Sequence from beginning to end; it is allowed to have several
* concurrent iterators on the same TempSeq.
*
=== modified file 'src/store/naive/simple_lazy_temp_seq.cpp'
--- src/store/naive/simple_lazy_temp_seq.cpp 2012-02-02 14:42:18 +0000
+++ src/store/naive/simple_lazy_temp_seq.cpp 2012-02-13 22:55:21 +0000
@@ -233,6 +233,16 @@
/*******************************************************************************
+
+********************************************************************************/
+xs_integer SimpleLazyTempSeq::getSize() const
+{
+ ZORBA_ASSERT(false);
+ return 0;
+}
+
+
+/*******************************************************************************
Reads the whole Sequence from beginning to end; it is allowed to have several
concurrent iterators on the same TempSeq.
=== modified file 'src/store/naive/simple_lazy_temp_seq.h'
--- src/store/naive/simple_lazy_temp_seq.h 2011-12-21 14:40:33 +0000
+++ src/store/naive/simple_lazy_temp_seq.h 2012-02-13 22:55:21 +0000
@@ -76,6 +76,8 @@
bool containsItem(xs_integer position);
+ xs_integer getSize() const;
+
store::Iterator_t getIterator() const;
store::Iterator_t getIterator(
=== modified file 'src/store/naive/simple_temp_seq.cpp'
--- src/store/naive/simple_temp_seq.cpp 2012-02-02 14:42:18 +0000
+++ src/store/naive/simple_temp_seq.cpp 2012-02-13 22:55:21 +0000
@@ -226,13 +226,22 @@
SimpleTempSeqIter::SimpleTempSeqIter(
- const SimpleTempSeq* aTempSeq,
- xs_integer startPos,
- xs_integer endPos)
- :
- theTempSeq(const_cast<SimpleTempSeq*>(aTempSeq)),
- theBorderType(startEnd)
-{
+ const SimpleTempSeq* seq,
+ xs_integer startPos,
+ xs_integer endPos)
+{
+ init(const_cast<SimpleTempSeq*>(seq), startPos, endPos);
+}
+
+
+void SimpleTempSeqIter::init(
+ const store::TempSeq_t& aTempSeq,
+ xs_integer startPos,
+ xs_integer endPos)
+{
+ theTempSeq = aTempSeq;
+ theBorderType = startEnd;
+
xs_long start;
xs_long end;
=== modified file 'src/store/naive/simple_temp_seq.h'
--- src/store/naive/simple_temp_seq.h 2011-12-21 14:40:33 +0000
+++ src/store/naive/simple_temp_seq.h 2012-02-13 22:55:21 +0000
@@ -24,14 +24,14 @@
namespace zorba { namespace simplestore {
/**
- * Very simple implementation of Temp Sequence. It saves the resulting items
- * of an iterator eager in a vector.
+ *
*/
typedef rchandle<class SimpleTempSeq> SimpleTempSeq_t;
/*******************************************************************************
-
+ Very simple implementation of Temp Sequence. It eagerly saves the items
+ returned by an iterator into a vector.
********************************************************************************/
class SimpleTempSeq : public store::TempSeq
{
@@ -108,17 +108,16 @@
public:
SimpleTempSeqIter() {}
- SimpleTempSeqIter(const SimpleTempSeq* aTempSeq);
+ SimpleTempSeqIter(const SimpleTempSeq* seq);
- SimpleTempSeqIter(
- const SimpleTempSeq* aTempSeq,
- xs_integer startPos,
- xs_integer endPos);
+ SimpleTempSeqIter(const SimpleTempSeq* seq, xs_integer startPos, xs_integer endPos);
~SimpleTempSeqIter() {}
void init(const store::TempSeq_t& seq);
+ void init(const store::TempSeq_t& seq, xs_integer startPos, xs_integer endPos);
+
store::Item* next();
void open();
=== modified file 'test/rbkt/testdriver.cpp'
--- test/rbkt/testdriver.cpp 2011-07-16 23:46:39 +0000
+++ test/rbkt/testdriver.cpp 2012-02-13 22:55:21 +0000
@@ -26,6 +26,7 @@
#include <time.h>
#endif
+//#define ZORBA_TEST_PLAN_SERIALIZATION
#include "testdriverconfig.h" // SRC and BIN dir definitions
#include "specification.h" // parsing spec files
Follow ups