in glean/rts/query.cpp [360:412]
size_t QueryExecutor::resultWithPid(
Id id,
binary::Output *key,
binary::Output *val,
Pid pid,
bool rec) {
assert(id != Id::invalid());
result_ids.emplace_back(id.toWord());
result_pids.emplace_back(pid.toWord());
result_keys.emplace_back(key ? key->string() : "");
result_values.emplace_back(val ? val->string() : "");
DVLOG(5) << "result added (" << id.toWord() << ")";
auto key_size = key ? key->size() : 0;
auto val_size = val ? val->size() : 0;
size_t bytes = sizeof(Id) + key_size + val_size;
if (rec || depth != Depth::ResultsOnly) {
{
binary::Output bin;
bin.expect(key_size + val_size);
if (key) {
bin.put(key->bytes());
}
if (val) {
bin.put(val->bytes());
}
auto clause = Fact::Clause::from(bin.bytes(), key_size);
if (traverse) {
Predicate::runTraverse(*traverse, nestedFact_, clause);
} else {
auto predicate = inventory.lookupPredicate(pid);
if (!predicate) {
error("unknown pid: {}", pid.toWord());
}
predicate->traverse(nestedFact_, clause);
}
}
while (nested_result_pending.size() > 0) {
auto id = nested_result_pending[nested_result_pending.size() - 1];
nested_result_pending.pop_back();
facts.factById(id, [&](Pid pid_, auto clause) {
inventory.lookupPredicate(pid_)->traverse(nestedFact_, clause);
nested_result_ids.emplace_back(id.toWord());
nested_result_pids.emplace_back(pid_.toWord());
auto key = binary::mkString(clause.key());
auto val = binary::mkString(clause.value());
bytes += sizeof(Id) + key.size() + val.size();
nested_result_keys.emplace_back(std::move(key));
nested_result_values.emplace_back(std::move(val));
});
}
}
return bytes;
};