private ClosableIterator doFind()

in mongodb/src/main/java/org/hibernate/ogm/datastore/mongodb/MongoDBDialect.java [1206:1250]


	private ClosableIterator<Tuple> doFind(MongoDBQueryDescriptor query, QueryParameters queryParameters, MongoCollection<Document> collection,
			EntityKeyMetadata entityKeyMetadata) {
		Document criteria = query.getCriteria();
		Document orderby = query.getOrderBy();
		int maxTimeMS = -1;

		Document modifiers = new Document();
		// We need to extract the different parts of the criteria and pass them to the cursor API
		if ( criteria.containsKey( "$query" ) ) {
			if ( orderby == null ) {
				orderby = (Document) criteria.get( "$orderby" );
			}
			maxTimeMS = criteria.getInteger( "$maxTimeMS", -1 );

			addModifier( modifiers, criteria, "$hint" );
			addModifier( modifiers, criteria, "$maxScan" );
			addModifier( modifiers, criteria, "$snapshot", false );
			addModifier( modifiers, criteria, "$min" );
			addModifier( modifiers, criteria, "$max" );
			addModifier( modifiers, criteria, "$comment" );
			addModifier( modifiers, criteria, "$explain", false );

			criteria = (Document) criteria.get( "$query" );
		}

		FindIterable<Document> prepareFind = collection.find( criteria ).modifiers( modifiers ).projection( query.getProjection() );
		if ( orderby != null ) {
			prepareFind.sort( orderby );
		}
		if ( maxTimeMS > 0 ) {
			prepareFind.maxTime( maxTimeMS, TimeUnit.MILLISECONDS );
		}

		// apply firstRow/maxRows if present
		if ( queryParameters.getRowSelection().getFirstRow() != null ) {
			prepareFind.skip( queryParameters.getRowSelection().getFirstRow() );
		}

		if ( queryParameters.getRowSelection().getMaxRows() != null ) {
			prepareFind.limit( queryParameters.getRowSelection().getMaxRows() );
		}

		MongoCursor<Document> iterator = prepareFind.iterator();
		return new MongoDBResultsCursor( iterator, entityKeyMetadata, provider.getBinaryStorageManager() );
	}