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:
Jody Grassel 2013-10-16 20:12:10 +00:00
parent c3f73b7f7c
commit c8e3d5dcbb
5 changed files with 47 additions and 7 deletions

View File

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

View File

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

View File

@ -595,4 +595,12 @@ public class DelegatingFetchConfiguration
throw translate(re);
}
}
public boolean isFetchConfigurationSQLCacheAdmissible() {
try {
return _fetch.isFetchConfigurationSQLCacheAdmissible();
} catch (RuntimeException re) {
throw translate(re);
}
}
}

View File

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

View File

@ -148,7 +148,8 @@ public class FetchConfigurationImpl
public boolean fetchGroupIsPUDefault = false;
public boolean extendedPathLookup = false;
public DataCacheRetrieveMode cacheRetrieveMode = DataCacheRetrieveMode.USE;
public DataCacheStoreMode cacheStoreMode = DataCacheStoreMode.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;