| 28 | } |
| 29 | |
| 30 | void PathExpressionEvaluator::init(const processor::ResultSet& resultSet, |
| 31 | main::ClientContext* clientContext) { |
| 32 | ExpressionEvaluator::init(resultSet, clientContext); |
| 33 | auto resultNodesIdx = StructType::getFieldIdx(resultVector->dataType, InternalKeyword::NODES); |
| 34 | resultNodesVector = StructVector::getFieldVector(resultVector.get(), resultNodesIdx).get(); |
| 35 | auto resultNodesDataVector = ListVector::getDataVector(resultNodesVector); |
| 36 | for (auto& fieldVector : StructVector::getFieldVectors(resultNodesDataVector)) { |
| 37 | resultNodesFieldVectors.push_back(fieldVector.get()); |
| 38 | } |
| 39 | auto resultRelsIdx = StructType::getFieldIdx(resultVector->dataType, InternalKeyword::RELS); |
| 40 | resultRelsVector = StructVector::getFieldVector(resultVector.get(), resultRelsIdx).get(); |
| 41 | auto resultRelsDataVector = ListVector::getDataVector(resultRelsVector); |
| 42 | for (auto& fieldVector : StructVector::getFieldVectors(resultRelsDataVector)) { |
| 43 | resultRelsFieldVectors.push_back(fieldVector.get()); |
| 44 | } |
| 45 | auto pathExpression = (PathExpression*)expression.get(); |
| 46 | for (auto i = 0u; i < expression->getNumChildren(); ++i) { |
| 47 | auto child = expression->getChild(i).get(); |
| 48 | auto vectors = std::make_unique<InputVectors>(); |
| 49 | vectors->input = children[i]->resultVector.get(); |
| 50 | switch (child->dataType.getLogicalTypeID()) { |
| 51 | case LogicalTypeID::NODE: { |
| 52 | vectors->nodeFieldVectors = |
| 53 | getFieldVectors(child->dataType, pathExpression->getNodeType(), vectors->input); |
| 54 | } break; |
| 55 | case LogicalTypeID::REL: { |
| 56 | vectors->relFieldVectors = |
| 57 | getFieldVectors(child->dataType, pathExpression->getRelType(), vectors->input); |
| 58 | } break; |
| 59 | case LogicalTypeID::RECURSIVE_REL: { |
| 60 | auto rel = (RelExpression*)child; |
| 61 | auto recursiveNode = rel->getRecursiveInfo()->node; |
| 62 | auto recursiveRel = rel->getRecursiveInfo()->rel; |
| 63 | auto nodeFieldIdx = StructType::getFieldIdx(child->dataType, InternalKeyword::NODES); |
| 64 | vectors->nodesInput = StructVector::getFieldVector(vectors->input, nodeFieldIdx).get(); |
| 65 | vectors->nodesDataInput = ListVector::getDataVector(vectors->nodesInput); |
| 66 | vectors->nodeFieldVectors = getFieldVectors(recursiveNode->dataType, |
| 67 | pathExpression->getNodeType(), vectors->nodesDataInput); |
| 68 | auto relFieldIdx = |
| 69 | StructType::getFieldIdx(vectors->input->dataType, InternalKeyword::RELS); |
| 70 | vectors->relsInput = StructVector::getFieldVector(vectors->input, relFieldIdx).get(); |
| 71 | vectors->relsDataInput = ListVector::getDataVector(vectors->relsInput); |
| 72 | vectors->relFieldVectors = getFieldVectors(recursiveRel->dataType, |
| 73 | pathExpression->getRelType(), vectors->relsDataInput); |
| 74 | } break; |
| 75 | default: |
| 76 | UNREACHABLE_CODE; |
| 77 | } |
| 78 | inputVectorsPerChild.push_back(std::move(vectors)); |
| 79 | } |
| 80 | } |
| 81 | |
| 82 | void PathExpressionEvaluator::evaluate() { |
| 83 | resultVector->resetAuxiliaryBuffer(); |
no test coverage detected