void QEvalInstrucGenerator::appendEdgeQueryOnePath(std::queue<QEvalInstruc> &instrucQueue, const QueryData &qData, arg_idx_t argIdx, std::vector<bool> &qtClausePushed) { std::stack<q_clause_idx_t> qClauseStack; std::stack<arg_idx_t> targetVarArgIdxStack; NonRepQueue<arg_idx_t> holdVarArgIdxQueue; holdVarArgIdxQueue.push(argIdx); while (!holdVarArgIdxQueue.empty()) { arg_idx_t current = holdVarArgIdxQueue.front(); for (q_clause_idx_t i = 0; i < (int)qData.numClauses(); i++) { if (!qtClausePushed[i]) { const QEvalClause * clausePtr = qData.getQEvalClause(i); const std::set<arg_idx_t> &refVarArgIdxSet = clausePtr->inVarArgIdxSet; assert (refVarArgIdxSet.size() == 2); if (*(refVarArgIdxSet.begin()) == current) { holdVarArgIdxQueue.push(*(refVarArgIdxSet.end())); } else { holdVarArgIdxQueue.push(*(refVarArgIdxSet.begin())); } qClauseStack.push(i); targetVarArgIdxStack.push(current); qtClausePushed[i] = true; } } holdVarArgIdxQueue.pop(); } while (!qClauseStack.empty()) { instrucQueue.push(QEvalInstruc(qClauseStack.top(), targetVarArgIdxStack.top())); qClauseStack.pop(); targetVarArgIdxStack.pop(); } }
void QEvalInstrucGenerator::appendIndepQueryInstruc(std::queue<QEvalInstruc> &instrucQueue, const QueryData &qData, std::vector<bool> &qClausePushed) { for (q_clause_idx_t i = 0; i < (int)qData.numClauses(); i++) { const QEvalClause * clausePtr = qData.getQEvalClause(i); if (clausePtr->inVarArgIdxSet.size() == 0) { instrucQueue.push(QEvalInstruc(i, 0)); qClausePushed[i] = true; } } }
void QEvalInstrucGenerator::generate(std::queue<QEvalInstruc> &instrucQueue, const QueryData &qData) { std::vector<bool> qClausePushed(qData.numClauses()); // first append all independent query clauses to the instruction queue appendIndepQueryInstruc(instrucQueue, qData, qClausePushed); // second append all boolean node select appendNodeQueryInstruc(instrucQueue, qData, qClausePushed); // third append all boolean edge select appendEdgeQueryInstruc(instrucQueue, qData, qClausePushed); }