void BtreeKeyGeneratorV1::_getKeysArrEltFixed(std::vector<const char*>* fieldNames, std::vector<BSONElement>* fixed, const BSONElement& arrEntry, BSONObjSet* keys, unsigned numNotFound, const BSONElement& arrObjElt, const std::set<size_t>& arrIdxs, bool mayExpandArrayUnembedded, const std::vector<PositionalPathInfo>& positionalInfo, MultikeyPaths* multikeyPaths) const { // Set up any terminal array values. for (const auto idx : arrIdxs) { if (*(*fieldNames)[idx] == '\0') { (*fixed)[idx] = mayExpandArrayUnembedded ? arrEntry : arrObjElt; } } // Recurse. getKeysImplWithArray(*fieldNames, *fixed, arrEntry.type() == Object ? arrEntry.embeddedObject() : BSONObj(), keys, numNotFound, positionalInfo, multikeyPaths); }
void BtreeKeyGeneratorV1::getKeysImpl(std::vector<const char*> fieldNames, std::vector<BSONElement> fixed, const BSONObj& obj, BSONObjSet* keys, MultikeyPaths* multikeyPaths) const { if (_isIdIndex) { // we special case for speed BSONElement e = obj["_id"]; if (e.eoo()) { keys->insert(_nullKey); } else { BSONObjBuilder b; CollationIndexKey::collationAwareIndexKeyAppend(e, _collator, &b); keys->insert(b.obj()); } // The {_id: 1} index can never be multikey because the _id field isn't allowed to be an // array value. We therefore always set 'multikeyPaths' as [ [ ] ]. if (multikeyPaths) { multikeyPaths->resize(1); } return; } if (multikeyPaths) { invariant(multikeyPaths->empty()); multikeyPaths->resize(fieldNames.size()); } getKeysImplWithArray(fieldNames, fixed, obj, keys, 0, _emptyPositionalInfo, multikeyPaths); }
void BtreeKeyGeneratorV1::getKeysImpl(std::vector<const char*> fieldNames, std::vector<BSONElement> fixed, const BSONObj& obj, BSONObjSet* keys, MultikeyPaths* multikeyPaths) const { if (multikeyPaths) { multikeyPaths->resize(fieldNames.size()); } getKeysImplWithArray(fieldNames, fixed, obj, keys, 0, _emptyPositionalInfo, multikeyPaths); }
void BtreeKeyGeneratorV1::_getKeysArrEltFixed(vector<const char*> &fieldNames, vector<BSONElement> &fixed, const BSONElement &arrEntry, BSONObjSet *keys, unsigned numNotFound, const BSONElement &arrObjElt, const set<unsigned> &arrIdxs, bool mayExpandArrayUnembedded) const { // set up any terminal array values for( set<unsigned>::const_iterator j = arrIdxs.begin(); j != arrIdxs.end(); ++j ) { if ( *fieldNames[ *j ] == '\0' ) { fixed[ *j ] = mayExpandArrayUnembedded ? arrEntry : arrObjElt; } } // recurse getKeysImplWithArray(fieldNames, fixed, arrEntry.type() == Object ? arrEntry.embeddedObject() : BSONObj(), keys, numNotFound, arrObjElt.embeddedObject()); }
void BtreeKeyGeneratorV1::getKeysImpl(std::vector<const char*> fieldNames, std::vector<BSONElement> fixed, const BSONObj& obj, BSONObjSet* keys, MultikeyPaths* multikeyPaths) const { if (_isIdIndex) { // we special case for speed BSONElement e = obj["_id"]; if (e.eoo()) { keys->insert(_nullKey); } else if (_collator) { BSONObjBuilder b; CollationIndexKey::collationAwareIndexKeyAppend(e, _collator, &b); // Insert a copy so its buffer size fits the object size. keys->insert(b.obj().copy()); } else { int size = e.size() + 5 /* bson over head*/ - 3 /* remove _id string */; BSONObjBuilder b(size); b.appendAs(e, ""); keys->insert(b.obj()); invariant(keys->begin()->objsize() == size); } // The {_id: 1} index can never be multikey because the _id field isn't allowed to be an // array value. We therefore always set 'multikeyPaths' as [ [ ] ]. if (multikeyPaths) { multikeyPaths->resize(1); } return; } if (multikeyPaths) { invariant(multikeyPaths->empty()); multikeyPaths->resize(fieldNames.size()); } getKeysImplWithArray( std::move(fieldNames), std::move(fixed), obj, keys, 0, _emptyPositionalInfo, multikeyPaths); }
void BtreeKeyGeneratorV1::getKeysImpl(vector<const char*> fieldNames, vector<BSONElement> fixed, const BSONObj &obj, BSONObjSet *keys) const { getKeysImplWithArray(fieldNames, fixed, obj, keys, 0, BSONObj()); }