zorba-coders team mailing list archive
-
zorba-coders team
-
Mailing list archive
-
Message #22586
[Merge] lp:~zorba-coders/zorba/markos-scratch into lp:zorba
Markos Zaharioudakis has proposed merging lp:~zorba-coders/zorba/markos-scratch into lp:zorba.
Commit message:
caching of the index view expression
Requested reviews:
Markos Zaharioudakis (markos-za)
For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/166627
caching of the index view expression
--
https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/166627
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'src/compiler/rewriter/rules/index_matching_rule.cpp'
--- src/compiler/rewriter/rules/index_matching_rule.cpp 2013-05-30 22:25:30 +0000
+++ src/compiler/rewriter/rules/index_matching_rule.cpp 2013-05-31 01:51:28 +0000
@@ -81,40 +81,9 @@
RewriteRule(RewriteRule::IndexJoin, "IndexJoin"),
theIndexDecl(decl),
theViewExpr(NULL),
- theDoTrace(true),
+ theKeyClauses(NULL),
theParentNode(NULL)
{
- theViewExpr = decl->getViewExpr();
-
- csize numVClauses = theViewExpr->num_clauses();
-
- theKeyClauses.reserve(numVClauses);
-
- for (csize i = 1; i < numVClauses; ++i)
- {
- assert(theViewExpr->get_clause(i)->get_kind() == flwor_clause::let_clause);
- let_clause* lc = static_cast<let_clause*>(theViewExpr->get_clause(i));
- theKeyClauses.push_back(lc);
- }
-
- // We apply the fold rules on the view expr in order to flatten a
- std::ostringstream msg;
- msg << "normalization of candidate index: " << decl->getName()->getStringValue();
-
- RewriterContext rCtx(theViewExpr->get_ccb(),
- theViewExpr,
- theViewExpr->get_udf(),
- msg.str(),
- true);
- FoldRules foldRules;
- foldRules.rewrite(rCtx);
-
- if (Properties::instance()->printIntermediateOpt() && theDoTrace)
- {
- std::cout << "Canonical view expr for candidate index : "
- << decl->getName()->getStringValue() << std::endl;
- theViewExpr->put(std::cout) << std::endl;
- }
}
@@ -132,6 +101,9 @@
if (node->get_expr_kind() == flwor_expr_kind)
{
+ if (theViewExpr == NULL)
+ theViewExpr = theIndexDecl->getViewExpr(theKeyClauses);
+
theQueryExpr = static_cast<flwor_expr*>(node);
bool matched = matchIndex();
@@ -204,7 +176,7 @@
theUnmatchedQPreds.clear();
theMatchedQPreds.clear();
theProbeArgs.clear();
- theProbeArgs.reserve(theKeyClauses.size() + 1);
+ theProbeArgs.reserve(theKeyClauses->size() + 1);
expr::substitution_t subst;
@@ -459,7 +431,7 @@
orderby_clause* ob =
static_cast<orderby_clause*>(theQueryExpr->get_clause(firstOrderByPos));
- csize numKeys = theKeyClauses.size();
+ csize numKeys = theKeyClauses->size();
csize numSortKeys = ob->num_columns();
if (numSortKeys <= numKeys)
@@ -472,7 +444,7 @@
break;
if (!matchKeyExpr(ob->get_column_expr(i),
- theKeyClauses[i]->get_expr(),
+ (*theKeyClauses)[i]->get_expr(),
subst))
break;
}
@@ -761,8 +733,8 @@
bool matchedFirstKey = false;
- std::vector<let_clause*>::const_iterator keyIte = theKeyClauses.begin();
- std::vector<let_clause*>::const_iterator keyEnd = theKeyClauses.end();
+ std::vector<let_clause*>::const_iterator keyIte = theKeyClauses->begin();
+ std::vector<let_clause*>::const_iterator keyEnd = theKeyClauses->end();
for (; keyIte != keyEnd; ++keyIte)
{
@@ -904,7 +876,7 @@
else
theProbeArgs.push_back(falseExpr);
- if (keyIte == theKeyClauses.begin() &&
+ if (keyIte == theKeyClauses->begin() &&
(bounds[0] != NULL || bounds[1] != NULL))
matchedFirstKey = true;
}
@@ -925,8 +897,8 @@
expr::substitution_t& subst,
csize& lastMatchedWHEREpos)
{
- std::vector<let_clause*>::const_iterator keyIte = theKeyClauses.begin();
- std::vector<let_clause*>::const_iterator keyEnd = theKeyClauses.end();
+ std::vector<let_clause*>::const_iterator keyIte = theKeyClauses->begin();
+ std::vector<let_clause*>::const_iterator keyEnd = theKeyClauses->end();
for (; keyIte != keyEnd; ++keyIte)
{
=== modified file 'src/compiler/rewriter/rules/index_matching_rule.h'
--- src/compiler/rewriter/rules/index_matching_rule.h 2013-05-04 20:20:05 +0000
+++ src/compiler/rewriter/rules/index_matching_rule.h 2013-05-31 01:51:28 +0000
@@ -52,9 +52,9 @@
protected:
IndexDecl * theIndexDecl;
flwor_expr * theViewExpr;
- std::vector<let_clause*> theKeyClauses;
+ std::vector<let_clause*> * theKeyClauses;
+
flwor_expr * theQueryExpr;
- bool theDoTrace;
std::vector<PredInfo> theUnmatchedQPreds;
std::vector<PredInfo> theMatchedQPreds;
=== modified file 'src/compiler/xqddf/value_index.cpp'
--- src/compiler/xqddf/value_index.cpp 2013-05-30 22:25:30 +0000
+++ src/compiler/xqddf/value_index.cpp 2013-05-31 01:51:28 +0000
@@ -31,6 +31,8 @@
#include "compiler/expression/expr_iter.h"
#include "compiler/expression/expr_manager.h"
#include "compiler/codegen/plan_visitor.h"
+#include "compiler/rewriter/framework/rewriter_context.h"
+#include "compiler/rewriter/rules/fold_rules.h"
#include "runtime/base/plan_iterator.h"
#include "runtime/indexing/doc_indexer.h"
@@ -70,6 +72,7 @@
theDomainExpr(NULL),
theDomainVar(NULL),
theDomainPosVar(NULL),
+ theViewExpr(NULL),
theBuildExpr(NULL),
theDocIndexerExpr(NULL)
{
@@ -81,7 +84,14 @@
********************************************************************************/
IndexDecl::IndexDecl(::zorba::serialization::Archiver& ar)
:
- SimpleRCObject(ar)
+ SimpleRCObject(ar),
+ theDomainClause(NULL),
+ theDomainExpr(NULL),
+ theDomainVar(NULL),
+ theDomainPosVar(NULL),
+ theViewExpr(NULL),
+ theBuildExpr(NULL),
+ theDocIndexerExpr(NULL)
{
}
@@ -475,10 +485,19 @@
For now, this is done for value indexes only
for $newdot at $newpos in cloned_domain_expr
+ let $key_1 := new_key_expr_1
+ .....
+ let $key_N := new_key_expr_N
return $newdot
*******************************************************************************/
-flwor_expr* IndexDecl::getViewExpr()
+flwor_expr* IndexDecl::getViewExpr(std::vector<let_clause*>*& keyClauses)
{
+ if (theViewExpr != NULL)
+ {
+ keyClauses = &theKeyClauses;
+ return theViewExpr;
+ }
+
theDomainClause = NULL;
expr* domainExpr = getDomainExpr();
@@ -539,6 +558,8 @@
//std::vector<expr*> predExprs;
csize numKeys = theKeyExprs.size();
+ theKeyClauses.reserve(numKeys);
+
for (csize i = 0; i < numKeys; ++i)
{
// clone the key expr
@@ -548,6 +569,8 @@
expr* keyClone = theKeyExprs[i]->clone(udf, subst);
+ keyClone->setNonDiscardable(ANNOTATION_TRUE_FIXED);
+
const QueryLoc& keyloc = keyClone->get_loc();
// create the LET clause
@@ -561,45 +584,27 @@
let_clause* lc = theCCB->theEM->create_let_clause(sctx, keyloc, keyVar, keyClone);
flworExpr->add_clause(lc);
-
-#if 0
- // create the predicate
- expr* op1 = theCCB->theEM->create_wrapper_expr(sctx, udf, keyloc, keyVar);
-
- localName = "$$arg_" + ztd::to_string(i);
- store::Item_t argVarName;
- GENV_ITEMFACTORY->createQName(argVarName, "", "", localName);
-
- expr* op2 = theCCB->theEM->
- create_var_expr(sctx, udf, keyloc, var_expr::arg_var, keyVarName);
-
- expr* pred = theCCB->theEM->
- create_fo_expr(sctx, udf, keyloc, compFunc, op1, op2);
-
- predExprs.push_back(pred);
-#endif
- }
-
-#if 0
- expr* whereExpr;
-
- if (predExprs.size() > 1)
- {
- whereExpr = theCCB->theEM->
- create_fo_expr(sctx, udf, domloc, BUILTIN_FUNC(OP_AND_N), predExprs);
- }
- else
- {
- whereExpr = predExprs[0];
- }
-
- where_clause* wc = theCCB->theEM->
- create_where_clause(sctx, whereExpr->get_loc(), whereExpr);
-
- flworExpr->add_clause(wc);
-#endif
-
- return flworExpr;
+ theKeyClauses.push_back(lc);
+ }
+
+ theViewExpr = flworExpr;
+
+ // We apply the fold rules on the view expr in order to flatten a
+ std::ostringstream msg;
+ msg << "normalization of candidate index: " << getName()->getStringValue();
+
+ RewriterContext rCtx(theViewExpr->get_ccb(),
+ theViewExpr,
+ theViewExpr->get_udf(),
+ msg.str(),
+ true);
+ FoldRules foldRules;
+ foldRules.rewrite(rCtx);
+
+ ZORBA_ASSERT(theViewExpr == rCtx.getRoot());
+
+ keyClauses = &theKeyClauses;
+ return theViewExpr;
}
=== modified file 'src/compiler/xqddf/value_index.h'
--- src/compiler/xqddf/value_index.h 2013-05-30 22:25:30 +0000
+++ src/compiler/xqddf/value_index.h 2013-05-31 01:51:28 +0000
@@ -368,7 +368,7 @@
void analyze();
- flwor_expr* getViewExpr();
+ flwor_expr* getViewExpr(std::vector<let_clause*>*& keyClauses);
expr* getBuildExpr(const QueryLoc& loc);
Follow ups