public ClosableIterator executeBackendQuery()

in mongodb/src/main/java/org/hibernate/ogm/datastore/mongodb/MongoDBDialect.java [915:965]


	public ClosableIterator<Tuple> executeBackendQuery(BackendQuery<MongoDBQueryDescriptor> backendQuery, QueryParameters queryParameters, TupleContext tupleContext) {
		MongoDBQueryDescriptor queryDescriptor = backendQuery.getQuery();

		EntityKeyMetadata entityKeyMetadata = backendQuery.getSingleEntityMetadataInformationOrNull() == null
				? null
				: backendQuery.getSingleEntityMetadataInformationOrNull().getEntityKeyMetadata();

		// Projections and addEntities are not allowed in the same query at the same time
		if ( entityKeyMetadata != null && queryDescriptor.getProjection() != null ) {
			throw log.addEntityNotAllowedInNativeQueriesUsingProjection( entityKeyMetadata.getTable(), backendQuery.toString() );
		}

		String collectionName = getCollectionName( backendQuery, queryDescriptor, entityKeyMetadata );
		OptionsContext typeContext = entityKeyMetadata == null ? null : getOptionsContext( tupleContext );
		MongoCollection<Document> collection = getCollection( collectionName, typeContext );
		if ( !queryParameters.getPositionalParameters().isEmpty() ) { // TODO Implement binding positional parameters.
			throw new UnsupportedOperationException( "Positional parameters are not yet supported for MongoDB native queries." );
		}

		switch ( queryDescriptor.getOperation() ) {
			case FIND:
				return doFind( queryDescriptor, queryParameters, collection, entityKeyMetadata );
			case FINDONE:
				return doFindOne( queryDescriptor, collection, entityKeyMetadata );
			case FINDANDMODIFY:
				return doFindAndModify( queryDescriptor, collection, entityKeyMetadata );
			case AGGREGATE:
				return doAggregate( queryDescriptor, queryParameters, collection, entityKeyMetadata );
			case AGGREGATE_PIPELINE:
				return doAggregatePipeline( queryDescriptor, queryParameters, collection, entityKeyMetadata );
			case COUNT:
				return doCount( queryDescriptor, collection );
			case DISTINCT:
				return doDistinct( queryDescriptor, collection );
			case MAP_REDUCE:
				return doMapReduce( queryDescriptor, collection );
			case INSERT:
			case INSERTONE:
			case INSERTMANY:
			case REMOVE:
			case DELETEMANY:
			case DELETEONE:
			case UPDATE:
			case UPDATEONE:
			case UPDATEMANY:
			case REPLACEONE:
				throw log.updateQueryMustBeExecutedViaExecuteUpdate( queryDescriptor );
			default:
				throw new IllegalArgumentException( "Unexpected query operation: " + queryDescriptor );
		}
	}