[exo-jcr-commits] exo-jcr SVN: r1222 - jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core.
do-not-reply at jboss.org
do-not-reply at jboss.org
Mon Dec 28 18:20:59 EST 2009
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;
}
/**
More information about the exo-jcr-commits
mailing list