/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.ogm.query.impl;
import static org.hibernate.ogm.util.impl.TupleContextHelper.tupleContext;
import java.io.Serializable;
import org.hibernate.HibernateException;
import org.hibernate.engine.query.spi.NativeSQLQueryPlan;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.loader.custom.CustomQuery;
import org.hibernate.ogm.dialect.query.spi.BackendQuery;
import org.hibernate.ogm.dialect.query.spi.QueryParameters;
import org.hibernate.ogm.dialect.query.spi.QueryableGridDialect;
import org.hibernate.ogm.dialect.spi.TupleContext;
import org.hibernate.ogm.loader.nativeloader.impl.BackendCustomQuery;
import org.hibernate.ogm.type.spi.TypeTranslator;
/**
* An execution plan for a native NoSQL query. This custom implementation will allow us to implement native update
* queries.
*
* @author Gunnar Morling
* @author Thorsten Möller
*/
class NativeNoSqlQueryPlan extends NativeSQLQueryPlan {
public NativeNoSqlQueryPlan(String sourceQuery, CustomQuery customQuery) {
super( sourceQuery, customQuery );
}
@Override
public int performExecuteUpdate(org.hibernate.engine.spi.QueryParameters queryParameters, SessionImplementor session) throws HibernateException {
QueryableGridDialect<?> gridDialect = session.getFactory().getServiceRegistry().getService( QueryableGridDialect.class );
TypeTranslator typeTranslator = session.getFactory().getServiceRegistry().getService( TypeTranslator.class );
return performExecuteUpdateQuery( gridDialect, QueryParameters.fromOrmQueryParameters( queryParameters, typeTranslator, session.getFactory() ), session );
}
@SuppressWarnings("unchecked")
private <T extends Serializable> int performExecuteUpdateQuery(QueryableGridDialect<T> gridDialect, QueryParameters queryParameters,
SessionImplementor session) {
// Safe cast, see
// org.hibernate.ogm.query.impl.NativeNoSqlQueryInterpreter.createQueryPlan(NativeSQLQuerySpecification,
// SessionFactoryImplementor)
BackendCustomQuery<T> customQuery = (BackendCustomQuery<T>) getCustomQuery();
BackendQuery<T> backendQuery = new BackendQuery<T>( customQuery.getQueryObject(), customQuery.getSingleEntityMetadataInformationOrNull() );
TupleContext tupleContext = tupleContext( session, customQuery.getSingleEntityMetadataInformationOrNull() );
return gridDialect.executeBackendUpdateQuery( backendQuery, queryParameters, tupleContext );
}
}