void QEvalInstrucGenerator::appendEdgeQueryInstruc(std::queue<QEvalInstruc>& instrucQueue, const QueryData &qData, std::vector<bool> &qtClausePushed) { if (!qData.getQueryTarget().isBool()) { appendEdgeQueryOnePath(instrucQueue, qData, qData.getQueryTarget().getTarArgIdx(), qtClausePushed); } arg_idx_t target; bool finded = false; for (int i = 0; i < (int)qtClausePushed.size(); i++) { if (!qtClausePushed[i]) { target = *(qData.getQEvalClause(i)->inVarArgIdxSet.begin()); finded = true; } } while (finded) { appendEdgeQueryOnePath(instrucQueue, qData, target, qtClausePushed); finded = false; for (int i = 0; i < (int)qtClausePushed.size(); i++) { if (!qtClausePushed[i]) { target = *(qData.getQEvalClause(i)->inVarArgIdxSet.begin()); finded = true; } } } }
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; } } }