bool WorkingSetMember::getFieldDotted(const string& field, BSONElement* out) const { // If our state is such that we have an object, use it. if (hasObj()) { *out = obj.getFieldDotted(field); return true; } // Our state should be such that we have index data/are covered. for (size_t i = 0; i < keyData.size(); ++i) { BSONObjIterator keyPatternIt(keyData[i].indexKeyPattern); BSONObjIterator keyDataIt(keyData[i].keyData); while (keyPatternIt.more()) { BSONElement keyPatternElt = keyPatternIt.next(); verify(keyDataIt.more()); BSONElement keyDataElt = keyDataIt.next(); if (field == keyPatternElt.fieldName()) { *out = keyDataElt; return true; } } } return false; }
virtual ElementIterator* allocateIterator(const ElementPath* path) const { BSONObjIterator keyPatternIt(_keyPattern); BSONObjIterator keyDataIt(_key); // Skip the "2d"-indexed stuff. We might have a diff. predicate over that field // and those can't be covered. keyPatternIt.next(); keyDataIt.next(); // Look in the key. while (keyPatternIt.more()) { BSONElement keyPatternElt = keyPatternIt.next(); verify(keyDataIt.more()); BSONElement keyDataElt = keyDataIt.next(); if (path->fieldRef().equalsDottedField(keyPatternElt.fieldName())) { if (Array == keyDataElt.type()) { return new SimpleArrayElementIterator(keyDataElt, true); } else { return new SingleElementElementIterator(keyDataElt); } } } // All else fails, fetch. *_fetched = true; return new BSONElementIterator(path, _loc.obj()); }
virtual ElementIterator* allocateIterator(const ElementPath* path) const { BSONObjIterator keyPatternIt(_keyPattern); BSONObjIterator keyDataIt(_key); // Look in the key. while (keyPatternIt.more()) { BSONElement keyPatternElt = keyPatternIt.next(); verify(keyDataIt.more()); BSONElement keyDataElt = keyDataIt.next(); if (path->fieldRef().equalsDottedField(keyPatternElt.fieldName())) { if (Array == keyDataElt.type()) { return new SimpleArrayElementIterator(keyDataElt, true); } else { return new SingleElementElementIterator(keyDataElt); } } } // All else fails, fetch. *_fetched = true; return new BSONElementIterator(path, _loc.obj()); }