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 );
}
}