Author: nfilotto
Date: 2009-12-28 18:20:59 -0500 (Mon, 28 Dec 2009)
New Revision: 1222
Modified:
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
Log:
EXOJCR-344: Removal of the bottlenecks found with JProfiler
Make the method SessionDataManager.traverseStoredDescendants avoid to store the result
into Map<String, ItemData> ret when no merge are required: i.e. deep ||
!transientDescendants.isEmpty()
Modified:
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
===================================================================
---
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2009-12-28
16:18:41 UTC (rev 1221)
+++
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2009-12-28
23:20:59 UTC (rev 1222)
@@ -1587,37 +1587,43 @@
// 2 get ALL persisted descendants
Map<String, ItemData> descendants = new LinkedHashMap<String,
ItemData>();
- traverseStoredDescendants(rootData, dataManager, false, action, descendants, false,
transientDescendants);
+ List<? extends ItemData> result = traverseStoredDescendants(rootData,
dataManager, false, action, descendants, false, transientDescendants);
- // merge data
- for (ItemState state : transientDescendants)
+ if (deep || !transientDescendants.isEmpty())
{
- ItemData data = state.getData();
- if (!state.isDeleted())
- descendants.put(data.getIdentifier(), data);
- else
- descendants.remove(data.getIdentifier());
- }
- Collection<ItemData> desc = descendants.values();
- List<ItemData> retval;
- if (deep)
- {
- int size = desc.size();
- retval = new ArrayList<ItemData>(size < 10 ? 10 : size);
-
- for (ItemData itemData : desc)
+ // merge data
+ for (ItemState state : transientDescendants)
{
- retval.add(itemData);
- if (deep)
- retval.addAll(merge(itemData, dataManager, true, action));
+ ItemData data = state.getData();
+ if (!state.isDeleted())
+ descendants.put(data.getIdentifier(), data);
+ else
+ descendants.remove(data.getIdentifier());
}
+ Collection<? extends ItemData> desc = result != null ? result :
descendants.values();
+ List<ItemData> retval;
+ if (deep)
+ {
+ int size = desc.size();
+ retval = new ArrayList<ItemData>(size < 10 ? 10 : size);
+
+ for (ItemData itemData : desc)
+ {
+ retval.add(itemData);
+ if (deep)
+ retval.addAll(merge(itemData, dataManager, true, action));
+ }
+ }
+ else
+ {
+ retval = new ArrayList<ItemData>(desc);
+ }
+ return retval;
}
else
{
- retval = new ArrayList<ItemData>(desc);
+ return new ArrayList<ItemData>(result);
}
-
- return retval;
}
/**
@@ -1641,36 +1647,43 @@
// 2 get ALL persisted descendants
Map<String, ItemData> descendants = new LinkedHashMap<String,
ItemData>();
- traverseStoredDescendants(rootData, dataManager, false, action, descendants, true,
transientDescendants);
+ List<? extends ItemData> result = traverseStoredDescendants(rootData,
dataManager, false, action, descendants, true, transientDescendants);
- // merge data
- for (ItemState state : transientDescendants)
+ if (deep || !transientDescendants.isEmpty())
{
- ItemData data = state.getData();
- if (!state.isDeleted())
- descendants.put(data.getIdentifier(), data);
+ // merge data
+ for (ItemState state : transientDescendants)
+ {
+ ItemData data = state.getData();
+ if (!state.isDeleted())
+ descendants.put(data.getIdentifier(), data);
+ else
+ descendants.remove(data.getIdentifier());
+ }
+ Collection<? extends ItemData> desc = result != null ? result :
descendants.values();
+ List<ItemData> retval;
+ if (deep)
+ {
+ int size = desc.size();
+ retval = new ArrayList<ItemData>(size < 10 ? 10 : size);
+
+ for (ItemData itemData : desc)
+ {
+ retval.add(itemData);
+ if (deep)
+ retval.addAll(mergeList(itemData, dataManager, true, action));
+ }
+ }
else
- descendants.remove(data.getIdentifier());
- }
- Collection<ItemData> desc = descendants.values();
- List<ItemData> retval;
- if (deep)
- {
- int size = desc.size();
- retval = new ArrayList<ItemData>(size < 10 ? 10 : size);
-
- for (ItemData itemData : desc)
{
- retval.add(itemData);
- if (deep)
- retval.addAll(mergeList(itemData, dataManager, true, action));
+ retval = new ArrayList<ItemData>(desc);
}
+ return retval;
}
else
{
- retval = new ArrayList<ItemData>(desc);
+ return new ArrayList<ItemData>(result);
}
- return retval;
}
/**
@@ -1683,50 +1696,81 @@
* @param ret
* @throws RepositoryException
*/
- private void traverseStoredDescendants(ItemData parent, DataManager dataManager,
boolean deep, int action,
+ private List<? extends ItemData> traverseStoredDescendants(ItemData parent,
DataManager dataManager, boolean deep, int action,
Map<String, ItemData> ret, boolean listOnly, List<ItemState>
transientDescendants) throws RepositoryException
{
if (parent.isNode())
{
+ List<ItemData> childItems = null;
if (action != MERGE_PROPS)
{
List<NodeData> childNodes =
dataManager.getChildNodesData((NodeData)parent);
- for (NodeData childNode : childNodes)
+ if (deep || !transientDescendants.isEmpty())
{
- ret.put(childNode.getIdentifier(), childNode);
+ for (NodeData childNode : childNodes)
+ {
+ ret.put(childNode.getIdentifier(), childNode);
- if (log.isDebugEnabled())
- log.debug("Traverse stored (N) " +
childNode.getQPath().getAsString());
+ if (log.isDebugEnabled())
+ log.debug("Traverse stored (N) " +
childNode.getQPath().getAsString());
- // TODO [PN] Not used
- if (deep)
- traverseStoredDescendants(childNode, dataManager, deep, action, ret,
listOnly, transientDescendants);
+ // TODO [PN] Not used
+ if (deep)
+ traverseStoredDescendants(childNode, dataManager, deep, action, ret,
listOnly, transientDescendants);
+ }
}
+ else
+ {
+ if (action != MERGE_NODES)
+ {
+ childItems = new ArrayList<ItemData>(childNodes);
+ }
+ else
+ {
+ return childNodes;
+ }
+ }
}
if (action != MERGE_NODES)
{
List<PropertyData> childProps =
listOnly ? dataManager.listChildPropertiesData((NodeData)parent) :
dataManager
.getChildPropertiesData((NodeData)parent);
- outer : for (PropertyData childProp : childProps)
+ if (deep || !transientDescendants.isEmpty())
{
- for (ItemState transientState : transientDescendants)
+ outer : for (PropertyData childProp : childProps)
{
- if (!transientState.isNode() && !transientState.isDeleted()
- && transientState.getData().getQPath().getDepth() ==
childProp.getQPath().getDepth()
- &&
transientState.getData().getQPath().getName().equals(childProp.getQPath().getName()))
+ for (ItemState transientState : transientDescendants)
{
- continue outer;
+ if (!transientState.isNode() && !transientState.isDeleted()
+ && transientState.getData().getQPath().getDepth() ==
childProp.getQPath().getDepth()
+ &&
transientState.getData().getQPath().getName().equals(childProp.getQPath().getName()))
+ {
+ continue outer;
+ }
}
- }
- ret.put(childProp.getIdentifier(), childProp);
+ ret.put(childProp.getIdentifier(), childProp);
- if (log.isDebugEnabled())
- log.debug("Traverse stored (P) " +
childProp.getQPath().getAsString());
+ if (log.isDebugEnabled())
+ log.debug("Traverse stored (P) " +
childProp.getQPath().getAsString());
+ }
}
+ else
+ {
+ if (action != MERGE_PROPS)
+ {
+ childItems.addAll(childProps);
+ }
+ else
+ {
+ return childProps;
+ }
+ }
}
+ return childItems;
}
+ return null;
}
/**