mirror of https://github.com/apache/openjpa.git
OPENJPA-2414: FinderCache does not consider active Fetch Groups/FetchPlan added Fields
git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@1532882 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
c3f73b7f7c
commit
c8e3d5dcbb
|
@ -108,8 +108,7 @@ public class FinderCacheImpl
|
|||
return null;
|
||||
}
|
||||
|
||||
// FinderCache only operates with Default Fetch Plans
|
||||
if (!fetch.isDefaultPUFetchGroupConfigurationOnly()) {
|
||||
if (!fetch.isFetchConfigurationSQLCacheAdmissible()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -151,8 +150,7 @@ public class FinderCacheImpl
|
|||
return null;
|
||||
}
|
||||
|
||||
// FinderCache only operates with Default Fetch Plans
|
||||
if (!fetch.isDefaultPUFetchGroupConfigurationOnly()) {
|
||||
if (!fetch.isFetchConfigurationSQLCacheAdmissible()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -77,6 +77,7 @@ public class Compatibility {
|
|||
private boolean _singletonLifecycleEventManager = false;
|
||||
private boolean _filterPCRegistryClasses = false; // OPENJPA-2288
|
||||
private boolean _returnNullOnEmptyAggregateResult = true; // OPENJPA-1794
|
||||
private boolean _cacheNonDefaultFetchPlanQueries = false; // OPENJPA-2414
|
||||
|
||||
/**
|
||||
* Whether to require exact identity value types when creating object
|
||||
|
@ -763,4 +764,18 @@ public class Compatibility {
|
|||
public void setReturnNullOnAggregateResult(boolean returnNullOnEmptyAggregateResult) {
|
||||
_returnNullOnEmptyAggregateResult = returnNullOnEmptyAggregateResult;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the SQL generated for queries executed with a modified fetch plan are cached.
|
||||
*/
|
||||
public boolean getCacheNonDefaultFetchPlanQueries() {
|
||||
return _cacheNonDefaultFetchPlanQueries;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the SQL generated for queries executed with a modified fetch plan are cached.
|
||||
*/
|
||||
public void setCacheNonDefaultFetchPlanQueries(boolean bool) {
|
||||
_cacheNonDefaultFetchPlanQueries = bool;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -595,4 +595,12 @@ public class DelegatingFetchConfiguration
|
|||
throw translate(re);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isFetchConfigurationSQLCacheAdmissible() {
|
||||
try {
|
||||
return _fetch.isFetchConfigurationSQLCacheAdmissible();
|
||||
} catch (RuntimeException re) {
|
||||
throw translate(re);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -474,4 +474,9 @@ public interface FetchConfiguration
|
|||
* @since 0.4.1
|
||||
*/
|
||||
public FetchConfiguration traverse(FieldMetaData fm);
|
||||
|
||||
/**
|
||||
* Whether SQL generated by the FetchConfiguration's current configuration should be cached.
|
||||
*/
|
||||
public boolean isFetchConfigurationSQLCacheAdmissible();
|
||||
}
|
||||
|
|
|
@ -149,6 +149,7 @@ public class FetchConfigurationImpl
|
|||
public boolean extendedPathLookup = false;
|
||||
public DataCacheRetrieveMode cacheRetrieveMode = DataCacheRetrieveMode.USE;
|
||||
public DataCacheStoreMode cacheStoreMode = DataCacheStoreMode.USE;
|
||||
public boolean cacheNonDefaultFetchPlanQueries = false;
|
||||
}
|
||||
|
||||
private final ConfigurationState _state;
|
||||
|
@ -193,6 +194,8 @@ public class FetchConfigurationImpl
|
|||
|
||||
addFetchGroups(Arrays.asList(fetchGroupList));
|
||||
setMaxFetchDepth(conf.getMaxFetchDepth());
|
||||
|
||||
_state.cacheNonDefaultFetchPlanQueries = conf.getCompatibilityInstance().getCacheNonDefaultFetchPlanQueries();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -201,6 +204,7 @@ public class FetchConfigurationImpl
|
|||
public Object clone() {
|
||||
FetchConfigurationImpl clone = newInstance(null);
|
||||
clone._state.ctx = _state.ctx;
|
||||
clone._state.cacheNonDefaultFetchPlanQueries = _state.cacheNonDefaultFetchPlanQueries;
|
||||
clone._parent = _parent;
|
||||
clone._fromField = _fromField;
|
||||
clone._fromType = _fromType;
|
||||
|
@ -346,7 +350,7 @@ public class FetchConfigurationImpl
|
|||
return addFetchGroup(name, true);
|
||||
}
|
||||
|
||||
public FetchConfiguration addFetchGroup(String name, boolean recomputeIsDefault) {
|
||||
private FetchConfiguration addFetchGroup(String name, boolean recomputeIsDefault) {
|
||||
if (StringUtils.isEmpty(name))
|
||||
throw new UserException(_loc.get("null-fg"));
|
||||
|
||||
|
@ -383,7 +387,7 @@ public class FetchConfigurationImpl
|
|||
return removeFetchGroup(group, true);
|
||||
}
|
||||
|
||||
public FetchConfiguration removeFetchGroup(String group, boolean recomputeIsDefault) {
|
||||
private FetchConfiguration removeFetchGroup(String group, boolean recomputeIsDefault) {
|
||||
lock();
|
||||
try {
|
||||
if (_state.fetchGroups != null) {
|
||||
|
@ -483,6 +487,15 @@ public class FetchConfigurationImpl
|
|||
return _state.fetchGroupIsPUDefault;
|
||||
}
|
||||
|
||||
public boolean isFetchConfigurationSQLCacheAdmissible() {
|
||||
if (_state == null || _state.cacheNonDefaultFetchPlanQueries) {
|
||||
return false;
|
||||
} else {
|
||||
// Only pctx-default matching FetchConfiguration generated SQL is cache permissible
|
||||
return _state.fetchGroupIsPUDefault;
|
||||
}
|
||||
}
|
||||
|
||||
public Set<String> getFields() {
|
||||
if (_state.fields == null) return Collections.emptySet();
|
||||
return _state.fields;
|
||||
|
@ -518,6 +531,7 @@ public class FetchConfigurationImpl
|
|||
_state.fields = new HashSet<String>();
|
||||
_state.fields.addAll(fields);
|
||||
} finally {
|
||||
verifyDefaultPUFetchGroups();
|
||||
unlock();
|
||||
}
|
||||
return this;
|
||||
|
|
Loading…
Reference in New Issue