Skip to content

Commit

Permalink
Fix readOnly value and Query#scroll()
Browse files Browse the repository at this point in the history
  • Loading branch information
dreab8 committed Nov 29, 2021
1 parent 0fbfc30 commit b4cfe7e
Show file tree
Hide file tree
Showing 22 changed files with 1,122 additions and 740 deletions.
Expand Up @@ -18,18 +18,25 @@
import java.util.stream.StreamSupport;

import org.hibernate.CacheMode;
import org.hibernate.FlushMode;
import org.hibernate.LockOptions;
import org.hibernate.ScrollMode;
import org.hibernate.cache.spi.QueryKey;
import org.hibernate.cache.spi.QueryResultsCache;
import org.hibernate.engine.spi.PersistenceContext;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.graph.spi.AppliedGraph;
import org.hibernate.internal.util.collections.ArrayHelper;
import org.hibernate.query.Limit;
import org.hibernate.query.ResultListTransformer;
import org.hibernate.query.TupleTransformer;
import org.hibernate.query.internal.ScrollableResultsIterator;
import org.hibernate.query.spi.QueryOptions;
import org.hibernate.query.spi.QueryParameterBindings;
import org.hibernate.query.spi.ScrollableResultsImplementor;
import org.hibernate.sql.exec.SqlExecLogger;
import org.hibernate.sql.exec.spi.Callback;
import org.hibernate.sql.exec.spi.ExecutionContext;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcSelect;
Expand Down Expand Up @@ -58,6 +65,9 @@
import org.hibernate.type.BasicType;
import org.hibernate.type.descriptor.java.JavaType;

import jakarta.persistence.CacheRetrieveMode;
import jakarta.persistence.CacheStoreMode;

/**
* @author Steve Ebersole
*/
Expand Down Expand Up @@ -104,7 +114,7 @@ public <R> ScrollableResultsImplementor<R> scroll(
RowTransformer<R> rowTransformer) {
final SharedSessionContractImplementor session = executionContext.getSession();
session.autoFlushIfRequired( jdbcSelect.getAffectedTableNames() );
return executeQuery(
return executeQueryScroll(
jdbcSelect,
jdbcParameterBindings,
executionContext,
Expand Down Expand Up @@ -169,6 +179,150 @@ private <T, R> T executeQuery(
}
}
}

private <T, R> T executeQueryScroll(
JdbcSelect jdbcSelect,
JdbcParameterBindings jdbcParameterBindings,
ExecutionContext executionContext,
RowTransformer<R> rowTransformer,
Function<String, PreparedStatement> statementCreator,
ResultsConsumer<T, R> resultsConsumer) {
return doExecuteQuery(
jdbcSelect,
jdbcParameterBindings,
getScrollContext( executionContext, executionContext.getSession().getPersistenceContext() ),
rowTransformer,
statementCreator,
resultsConsumer
);
}

/*
When `Query#scroll()` is call the query is not executed immediately, a new ExecutionContext with the values of the `persistenceContext.isDefaultReadOnly()` and of the `queryOptions.isReadOnly()`
set at the moment of the Query#scroll() call is created in order to use it when the query will be executed.
*/
private ExecutionContext getScrollContext(ExecutionContext context, PersistenceContext persistenceContext) {
final QueryOptions queryOptions = context.getQueryOptions();
final Boolean readOnly;
if ( queryOptions.isReadOnly() == null ) {
readOnly = persistenceContext.isDefaultReadOnly();
}
else {
readOnly = queryOptions.isReadOnly();
}
final Integer timeout = queryOptions.getTimeout();
final FlushMode flushMode = queryOptions.getFlushMode();
final AppliedGraph appliedGraph = queryOptions.getAppliedGraph();
final TupleTransformer tupleTransformer = queryOptions.getTupleTransformer();
final ResultListTransformer resultListTransformer = queryOptions.getResultListTransformer();
final Boolean resultCachingEnabled = queryOptions.isResultCachingEnabled();
final CacheRetrieveMode cacheRetrieveMode = queryOptions.getCacheRetrieveMode();
final CacheStoreMode cacheStoreMode = queryOptions.getCacheStoreMode();
final String resultCacheRegionName = queryOptions.getResultCacheRegionName();
final LockOptions lockOptions = queryOptions.getLockOptions();
final String comment = queryOptions.getComment();
final List<String> databaseHints = queryOptions.getDatabaseHints();
final Integer fetchSize = queryOptions.getFetchSize();
final Limit limit = queryOptions.getLimit();

return new ExecutionContext() {
@Override
public QueryOptions getQueryOptions() {

return new QueryOptions() {
@Override
public Integer getTimeout() {
return timeout;
}

@Override
public FlushMode getFlushMode() {
return flushMode;
}

@Override
public Boolean isReadOnly() {
return readOnly;
}

@Override
public AppliedGraph getAppliedGraph() {
return appliedGraph;
}

@Override
public TupleTransformer getTupleTransformer() {
return tupleTransformer;
}

@Override
public ResultListTransformer getResultListTransformer() {
return resultListTransformer;
}

@Override
public Boolean isResultCachingEnabled() {
return resultCachingEnabled;
}

@Override
public CacheRetrieveMode getCacheRetrieveMode() {
return cacheRetrieveMode;
}

@Override
public CacheStoreMode getCacheStoreMode() {
return cacheStoreMode;
}

@Override
public String getResultCacheRegionName() {
return resultCacheRegionName;
}

@Override
public LockOptions getLockOptions() {
return lockOptions;
}

@Override
public String getComment() {
return comment;
}

@Override
public List<String> getDatabaseHints() {
return databaseHints;
}

@Override
public Integer getFetchSize() {
return fetchSize;
}

@Override
public Limit getLimit() {
return limit;
}
};
}

@Override
public QueryParameterBindings getQueryParameterBindings() {
return context.getQueryParameterBindings();
}

@Override
public Callback getCallback() {
return context.getCallback();
}

@Override
public SharedSessionContractImplementor getSession() {
return context.getSession();
}
};
}
private <T, R> T doExecuteQuery(
JdbcSelect jdbcSelect,
JdbcParameterBindings jdbcParameterBindings,
Expand Down
Expand Up @@ -872,13 +872,8 @@ private boolean skipInitialization(
private boolean isReadOnly(
RowProcessingState rowProcessingState,
SharedSessionContractImplementor persistenceContext) {
if ( persistenceContext.isDefaultReadOnly() ) {
return true;
}

final Boolean queryOption = rowProcessingState.getJdbcValuesSourceProcessingState().getQueryOptions().isReadOnly();

return queryOption == null ? false : queryOption;
final Boolean readOnly = rowProcessingState.getQueryOptions().isReadOnly();
return readOnly == null ? persistenceContext.isDefaultReadOnly() : readOnly;
}

private void preLoad(RowProcessingState rowProcessingState) {
Expand Down
Expand Up @@ -4,7 +4,7 @@
* 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.test.readonly;
package org.hibernate.orm.test.readonly;

import org.hibernate.CacheMode;
import org.hibernate.cfg.AvailableSettings;
Expand Down
Expand Up @@ -4,7 +4,7 @@
* 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.test.readonly;
package org.hibernate.orm.test.readonly;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
Expand Down
Expand Up @@ -6,7 +6,7 @@
*/

//$Id: Course.java 5686 2005-02-12 07:27:32Z steveebersole $
package org.hibernate.test.readonly;
package org.hibernate.orm.test.readonly;


/**
Expand Down
Expand Up @@ -10,7 +10,7 @@
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping
package="org.hibernate.test.readonly">
package="org.hibernate.orm.test.readonly">

<class name="DataPoint"
dynamic-update="true">
Expand Down
Expand Up @@ -6,7 +6,7 @@
*/

//$Id: DataPoint.java 7231 2005-06-19 22:04:00Z oneovthafew $
package org.hibernate.test.readonly;
package org.hibernate.orm.test.readonly;
import java.io.Serializable;
import java.math.BigDecimal;

Expand Down
Expand Up @@ -9,7 +9,7 @@
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="org.hibernate.test.readonly">
<hibernate-mapping package="org.hibernate.orm.test.readonly">

<class name="Course">
<id name="courseCode">
Expand Down
Expand Up @@ -6,7 +6,7 @@
*/

//$Id: Enrolment.java 6970 2005-05-31 20:24:41Z oneovthafew $
package org.hibernate.test.readonly;
package org.hibernate.orm.test.readonly;
import java.io.Serializable;

/**
Expand Down
Expand Up @@ -4,7 +4,7 @@
* 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.test.readonly;
package org.hibernate.orm.test.readonly;


/**
Expand Down
Expand Up @@ -4,7 +4,7 @@
* 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.test.readonly;
package org.hibernate.orm.test.readonly;
import java.io.Serializable;

/**
Expand Down

0 comments on commit b4cfe7e

Please sign in to comment.