in glean/rts/query.cpp [270:300]
Id QueryExecutor::newDerivedFact(
Pid type,
binary::Output* key,
size_t keySize) {
Fact::Clause clause = Fact::Clause::from(key->bytes(), keySize);
auto id = facts.define(type, clause);
// If we are going to store this derived fact in the DB, we need to
// know its ownership set, which is determined by the facts it was
// derived from.
if (ownership) {
std::set<UsetId> owners;
// The Ids can only be facts that we already have computed owners for.
for (const auto& iter : iters) {
if (iter.id != Id::invalid()) {
auto owner = ownership->getOwner(iter.id);
if (owner == INVALID_USET) {
VLOG(1) << "fact " << iter.id.toWord() << " has no owner";
} else {
owners.insert(owner);
}
}
}
if (owners.size() > 0) {
ownership->derivedFrom(id, owners);
}
}
return id;
};