Status ProjectionStage::transform(WorkingSetMember* member) { // The default no-fast-path case. if (ProjectionStageParams::NO_FAST_PATH == _projImpl) { return _exec->transform(member); } BSONObjBuilder bob; // Note that even if our fast path analysis is bug-free something that is // covered might be invalidated and just be an obj. In this case we just go // through the SIMPLE_DOC path which is still correct if the covered data // is not available. // // SIMPLE_DOC implies that we expect an object so it's kind of redundant. if ((ProjectionStageParams::SIMPLE_DOC == _projImpl) || member->hasObj()) { // If we got here because of SIMPLE_DOC the planner shouldn't have messed up. invariant(member->hasObj()); // Look at every field in the source document and see if we're including it. BSONObjIterator inputIt(member->obj); while (inputIt.more()) { BSONElement elt = inputIt.next(); unordered_set<StringData, StringData::Hasher>::iterator fieldIt; fieldIt = _includedFields.find(elt.fieldNameStringData()); if (_includedFields.end() != fieldIt) { // If so, add it to the builder. bob.append(elt); } } } else { invariant(ProjectionStageParams::COVERED_ONE_INDEX == _projImpl); // We're pulling data out of the key. invariant(1 == member->keyData.size()); size_t keyIndex = 0; // Look at every key element... BSONObjIterator keyIterator(member->keyData[0].keyData); while (keyIterator.more()) { BSONElement elt = keyIterator.next(); // If we're supposed to include it... if (_includeKey[keyIndex]) { // Do so. bob.appendAs(elt, _keyFieldNames[keyIndex]); } ++keyIndex; } } member->state = WorkingSetMember::OWNED_OBJ; member->keyData.clear(); member->loc = DiskLoc(); member->obj = bob.obj(); return Status::OK(); }
intrusive_ptr<DocumentSourceSort> DocumentSourceSort::create( const intrusive_ptr<ExpressionContext> &pExpCtx, BSONObj sortOrder, long long limit) { intrusive_ptr<DocumentSourceSort> pSort = new DocumentSourceSort(pExpCtx); /* check for then iterate over the sort object */ size_t sortKeys = 0; for(BSONObjIterator keyIterator(sortOrder); keyIterator.more();) { BSONElement keyField(keyIterator.next()); const char *pKeyFieldName = keyField.fieldName(); int sortOrder = 0; uassert(15974, str::stream() << sortName << " key ordering must be specified using a number", keyField.isNumber()); sortOrder = (int)keyField.numberInt(); uassert(15975, str::stream() << sortName << " key ordering must be 1 (for ascending) or -1 (for descending", ((sortOrder == 1) || (sortOrder == -1))); pSort->addKey(pKeyFieldName, (sortOrder > 0)); ++sortKeys; } uassert(15976, str::stream() << sortName << " must have at least one sort key", (sortKeys > 0)); if (limit > 0) { bool coalesced = pSort->coalesce(DocumentSourceLimit::create(pExpCtx, limit)); verify(coalesced); // should always coalesce verify(pSort->getLimit() == limit); } return pSort; }
intrusive_ptr<DocumentSource> DocumentSourceSort::createFromBson( BSONElement *pBsonElement, const intrusive_ptr<ExpressionContext> &pExpCtx) { uassert(15973, str::stream() << " the " << sortName << " key specification must be an object", pBsonElement->type() == Object); intrusive_ptr<DocumentSourceSort> pSort( DocumentSourceSort::create(pExpCtx)); /* check for then iterate over the sort object */ size_t sortKeys = 0; for(BSONObjIterator keyIterator(pBsonElement->Obj().begin()); keyIterator.more();) { BSONElement keyField(keyIterator.next()); const char *pKeyFieldName = keyField.fieldName(); int sortOrder = 0; uassert(15974, str::stream() << sortName << " key ordering must be specified using a number", keyField.isNumber()); sortOrder = (int)keyField.numberInt(); uassert(15975, str::stream() << sortName << " key ordering must be 1 (for ascending) or -1 (for descending", ((sortOrder == 1) || (sortOrder == -1))); pSort->addKey(pKeyFieldName, (sortOrder > 0)); ++sortKeys; } uassert(15976, str::stream() << sortName << " must have at least one sort key", (sortKeys > 0)); return pSort; }
QIconTheme::QIconTheme(const QString &themeName) : m_valid(false) { QFile themeIndex; QList <QIconDirInfo> keyList; QStringList iconDirs = QIcon::themeSearchPaths(); for ( int i = 0 ; i < iconDirs.size() ; ++i) { QDir iconDir(iconDirs[i]); QString themeDir = iconDir.path() + QLatin1Char('/') + themeName; themeIndex.setFileName(themeDir + QLatin1String("/index.theme")); if (themeIndex.exists()) { m_contentDir = themeDir; m_valid = true; break; } } #ifndef QT_NO_SETTINGS if (themeIndex.exists()) { const QSettings indexReader(themeIndex.fileName(), QSettings::IniFormat); QStringListIterator keyIterator(indexReader.allKeys()); while (keyIterator.hasNext()) { const QString key = keyIterator.next(); if (key.endsWith(QLatin1String("/Size"))) { // Note the QSettings ini-format does not accept // slashes in key names, hence we have to cheat if (int size = indexReader.value(key).toInt()) { QString directoryKey = key.left(key.size() - 5); QIconDirInfo dirInfo(directoryKey); dirInfo.size = size; QString type = indexReader.value(directoryKey + QLatin1String("/Type") ).toString(); if (type == QLatin1String("Fixed")) dirInfo.type = QIconDirInfo::Fixed; else if (type == QLatin1String("Scalable")) dirInfo.type = QIconDirInfo::Scalable; else dirInfo.type = QIconDirInfo::Threshold; dirInfo.threshold = indexReader.value(directoryKey + QLatin1String("/Threshold"), 2).toInt(); dirInfo.minSize = indexReader.value(directoryKey + QLatin1String("/MinSize"), size).toInt(); dirInfo.maxSize = indexReader.value(directoryKey + QLatin1String("/MaxSize"), size).toInt(); m_keyList.append(dirInfo); } } } // Parent themes provide fallbacks for missing icons m_parents = indexReader.value( QLatin1String("Icon Theme/Inherits")).toStringList(); // Ensure a default platform fallback for all themes if (m_parents.isEmpty()) { const QString fallback = fallbackTheme(); if (!fallback.isEmpty()) m_parents.append(fallback); } // Ensure that all themes fall back to hicolor if (!m_parents.contains(QLatin1String("hicolor"))) m_parents.append(QLatin1String("hicolor")); } #endif //QT_NO_SETTINGS }