private static ClosableIterator doMapReduce()

in mongodb/src/main/java/org/hibernate/ogm/datastore/mongodb/MongoDBDialect.java [1115:1183]


	private static ClosableIterator<Tuple> doMapReduce(final MongoDBQueryDescriptor queryDescriptor, final MongoCollection<Document> collection) {

		MapReduceIterable<Document> mapReduceIterable = collection.mapReduce( queryDescriptor.getMapFunction(), queryDescriptor.getReduceFunction() );
		Document options = queryDescriptor.getOptions();
		if ( options != null ) {
			Document query = (Document) options.get( "query" );
			Document sort = (Document) options.get( "sort" );
			Integer limit = options.getInteger( "limit" );
			String finalizeFunction = options.getString( "finalize" );
			Document scope = (Document) options.get( "scope" );
			Boolean jsMode = options.getBoolean( "jsMode" );
			Boolean verbose = options.getBoolean( "verbose" );
			Boolean bypassDocumentValidation = options.getBoolean( "bypassDocumentValidation" );
			Collation collation = getCollation( (Document) options.get( "collation" ) );
			MapReduceAction mapReduceAction = null;
			String collectionName = null;
			String dbName = null;
			Boolean sharded = null;
			Boolean nonAtomic = null;

			Object out;
			if ( ( out = options.get( "out" ) ) != null ) {
				if ( out instanceof String ) {
					collectionName = (String) out;
				}
				else if ( out instanceof Document ) {
					Document outDocument = (Document) out;
					if ( outDocument.containsKey( "merge" ) ) {
						mapReduceAction = MapReduceAction.MERGE;
						collectionName = outDocument.getString( "merge" );
					}
					else if ( outDocument.containsKey( "replace" ) ) {
						mapReduceAction = MapReduceAction.REPLACE;
						collectionName = outDocument.getString( "replace" );
					}
					else if ( ( (Document) out ).containsKey( "reduce" ) ) {
						mapReduceAction = MapReduceAction.REDUCE;
						collectionName = outDocument.getString( "reduce" );
					}
					dbName = outDocument.getString( "db" );
					sharded = outDocument.getBoolean( "sharded" );
					nonAtomic = outDocument.getBoolean( "nonAtomic" );
				}
			}
			mapReduceIterable = ( query != null ) ? mapReduceIterable.filter( query ) : mapReduceIterable;
			mapReduceIterable = ( sort != null ) ? mapReduceIterable.sort( sort ) : mapReduceIterable;
			mapReduceIterable = ( limit != null ) ? mapReduceIterable.limit( limit ) : mapReduceIterable;
			mapReduceIterable = ( finalizeFunction != null ) ? mapReduceIterable.finalizeFunction( finalizeFunction ) : mapReduceIterable;
			mapReduceIterable = ( scope != null ) ? mapReduceIterable.scope( scope ) : mapReduceIterable;
			mapReduceIterable = ( jsMode != null ) ? mapReduceIterable.jsMode( jsMode ) : mapReduceIterable;
			mapReduceIterable = ( verbose != null ) ? mapReduceIterable.verbose( verbose ) : mapReduceIterable;
			mapReduceIterable = ( bypassDocumentValidation != null ) ? mapReduceIterable.bypassDocumentValidation( bypassDocumentValidation ) : mapReduceIterable;
			mapReduceIterable = ( collation != null ) ? mapReduceIterable.collation( collation ) : mapReduceIterable;
			mapReduceIterable = ( mapReduceAction != null ) ? mapReduceIterable.action( mapReduceAction ) : mapReduceIterable;
			mapReduceIterable = ( collectionName != null ) ? mapReduceIterable.collectionName( collectionName ) : mapReduceIterable;
			mapReduceIterable = ( dbName != null ) ? mapReduceIterable.databaseName( dbName ) : mapReduceIterable;
			mapReduceIterable = ( sharded != null ) ? mapReduceIterable.sharded( sharded ) : mapReduceIterable;
			mapReduceIterable = ( nonAtomic != null ) ? mapReduceIterable.nonAtomic( nonAtomic ) : mapReduceIterable;
		}

		MongoCursor<Document> cursor = mapReduceIterable.iterator();
		Map<Object, Object> documents = new LinkedHashMap<>();
		while ( cursor.hasNext() ) {
			Document doc = cursor.next();
			documents.put( doc.get( "_id" ), doc.get( "value" ) );
		}
		MapTupleSnapshot snapshot = new MapTupleSnapshot( Collections.<String, Object>singletonMap( "n", documents ) );
		return CollectionHelper.newClosableIterator( Collections.singletonList( new Tuple( snapshot, SnapshotType.UNKNOWN ) ) );
	}