ALF-747 - PermissionService.hasPermission() takes longer as the user's group membership increases

- improved use of parentAssocsCache

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@22685 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Jan Vonka
2010-09-24 11:09:53 +00:00
parent 1b62e9bc01
commit 44b1d5ff6f

View File

@@ -2622,6 +2622,8 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO
return parentAssocs.getPrimaryParentAssoc();
}
private static final int PARENT_ASSOCS_CACHE_FILTER_THRESHOLD = 2000;
public void getParentAssocs(
Long childNodeId,
QName assocTypeQName,
@@ -2629,9 +2631,9 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO
Boolean isPrimary,
ChildAssocRefQueryCallback resultsCallback)
{
// Do we go for the cache or do we have to query
if (assocTypeQName == null && assocQName == null && isPrimary == null)
{
// Go for the cache (and return all)
ParentAssocsInfo parentAssocs = getParentAssocsCached(childNodeId);
for (ChildAssocEntity assoc : parentAssocs.getParentAssocs().values())
{
@@ -2643,7 +2645,30 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO
}
else
{
selectParentAssocs(childNodeId, assocTypeQName, assocQName, isPrimary, resultsCallback);
// Decide whether we query or filter
ParentAssocsInfo parentAssocs = getParentAssocsCacheOnly(childNodeId);
if ((parentAssocs == null) || (parentAssocs.getParentAssocs().size() > PARENT_ASSOCS_CACHE_FILTER_THRESHOLD))
{
// Query
selectParentAssocs(childNodeId, assocTypeQName, assocQName, isPrimary, resultsCallback);
}
else
{
// Go for the cache (and filter)
for (ChildAssocEntity assoc : parentAssocs.getParentAssocs().values())
{
Pair<Long, ChildAssociationRef> assocPair = assoc.getPair(qnameDAO);
if (((assocTypeQName == null) || (assocPair.getSecond().getTypeQName().equals(assocTypeQName))) &&
((assocQName == null) || (assocPair.getSecond().getQName().equals(assocQName))))
{
resultsCallback.handle(
assocPair,
assoc.getParentNode().getNodePair(),
assoc.getChildNode().getNodePair());
}
}
}
}
}
@@ -2831,6 +2856,12 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO
return cacheEntry.getSecond();
}
private ParentAssocsInfo getParentAssocsCacheOnly(Long nodeId)
{
// can be null
return parentAssocsCache.getValue(nodeId);
}
/**
* Update a node's parent associations.
*/