* Reenable prefetchChildren() for grouped subnodes.
* Make Subnodelist.add()/get() type-safe by using NodeHandle instead of java.lang.Object.
This commit is contained in:
		
							parent
							
								
									d781142af1
								
							
						
					
					
						commit
						a56cdaee59
					
				
					 4 changed files with 39 additions and 52 deletions
				
			
		|  | @ -1119,7 +1119,7 @@ public final class Node implements INode, Serializable { | |||
| 
 | ||||
|             for (int i = 0; i < l; i++) | ||||
|                 try { | ||||
|                     NodeHandle shandle = (NodeHandle) subnodes.get(i); | ||||
|                     NodeHandle shandle = subnodes.get(i); | ||||
| 
 | ||||
|                     if (subid.equals(shandle.getID())) { | ||||
|                         // System.err.println ("FOUND SUBNODE: "+shandle); | ||||
|  |  | |||
|  | @ -1039,7 +1039,7 @@ public final class NodeManager { | |||
|     protected List collectMissingKeys(SubnodeList list, int start, int length) { | ||||
|         List retval = null; | ||||
|         for (int i = start; i < start + length; i++) { | ||||
|             NodeHandle handle = (NodeHandle) list.get(i); | ||||
|             NodeHandle handle = list.get(i); | ||||
|             if (handle != null && !cache.containsKey(handle.getKey())) { | ||||
|                 if (retval == null) { | ||||
|                     retval = new ArrayList(); | ||||
|  | @ -1121,18 +1121,25 @@ public final class NodeManager { | |||
|                         // group nodes. | ||||
|                         String groupName = null; | ||||
| 
 | ||||
|                         /* if (groupbyProp != null) { | ||||
|                         if (groupbyProp != null) { | ||||
|                             groupName = node.getString(groupbyProp); | ||||
|                             if (groupName != null) { | ||||
|                                 Node groupNode = (Node) groupbySubnodes.get(groupName); | ||||
| 
 | ||||
|                             SubnodeList sn = (SubnodeList) groupbySubnodes.get(groupName); | ||||
|                                 if (groupNode == null) { | ||||
|                                     groupNode = home.getGroupbySubnode(groupName, true); | ||||
|                                     groupbySubnodes.put(groupName, groupNode); | ||||
|                                 } | ||||
| 
 | ||||
|                             if (sn == null) { | ||||
|                                 sn = new SubnodeList(safe, rel); | ||||
|                                 groupbySubnodes.put(groupName, sn); | ||||
|                                 SubnodeList subnodes = groupNode.getSubnodeList(); | ||||
|                                 if (subnodes == null) { | ||||
|                                     subnodes = groupNode.createSubnodeList(); | ||||
|                                     // mark subnodes as up-to-date | ||||
|                                     subnodes.lastSubnodeFetch = subnodes.getLastSubnodeChange(); | ||||
|                                 } | ||||
|                                 subnodes.add(new NodeHandle(key)); | ||||
|                             } | ||||
| 
 | ||||
|                             sn.add(new NodeHandle(key)); | ||||
|                         } */ | ||||
|                         } | ||||
| 
 | ||||
|                         // if relation doesn't use primary key as accessName, get secondary key | ||||
|                         if (accessProp != null) { | ||||
|  | @ -1151,28 +1158,9 @@ public final class NodeManager { | |||
|                         // register new nodes with the cache. If an up-to-date copy | ||||
|                         // existed in the cache, use that. | ||||
|                         registerNewNode(node, secondaryKey); | ||||
| 
 | ||||
|                         fetchJoinedNodes(rs, joins, columns.length); | ||||
|                     } | ||||
| 
 | ||||
|                     // If these are grouped nodes, build the intermediary group nodes | ||||
|                     // with the subnod lists we created | ||||
|                     /* if (groupbyProp != null) { | ||||
|                         for (Iterator i = groupbySubnodes.keySet().iterator(); | ||||
|                                  i.hasNext();) { | ||||
|                             String groupname = (String) i.next(); | ||||
| 
 | ||||
|                             if (groupname == null) { | ||||
|                                 continue; | ||||
|                             } | ||||
| 
 | ||||
|                             Node groupnode = home.getGroupbySubnode(groupname, true); | ||||
| 
 | ||||
|                             groupnode.setSubnodes((SubnodeList) groupbySubnodes.get(groupname)); | ||||
|                             groupnode.lastSubnodeFetch =  | ||||
|                                     groupnode.getLastSubnodeChange(groupnode.dbmap.getSubnodeRelation()); | ||||
|                         } | ||||
|                     } */ | ||||
|                 } catch (Exception x) { | ||||
|                     app.logError("Error in prefetchNodes()", x); | ||||
|                 } finally { | ||||
|  |  | |||
|  | @ -33,34 +33,34 @@ public class SegmentedSubnodeList extends SubnodeList { | |||
|      * Adds the specified object to this list performing | ||||
|      * custom ordering | ||||
|      * | ||||
|      * @param obj element to be inserted. | ||||
|      * @param handle element to be inserted. | ||||
|      */ | ||||
|     public synchronized boolean add(Object obj) { | ||||
|     public synchronized boolean add(NodeHandle handle) { | ||||
|         if (!hasRelationalNodes() || segments == null) { | ||||
|             return super.add(obj); | ||||
|             return super.add(handle); | ||||
|         } | ||||
|         if (subnodeCount == -1) { | ||||
|             update(); | ||||
|         } | ||||
|         subnodeCount++; | ||||
|         segments[segments.length - 1].length += 1; | ||||
|         return list.add(obj); | ||||
|         return list.add(handle); | ||||
|     } | ||||
|     /** | ||||
|      * Adds the specified object to the list at the given position | ||||
|      * @param index the index to insert the element at | ||||
|      * @param obj the object t add | ||||
|      * @param handle the object to add | ||||
|      */ | ||||
|     public synchronized void add(int index, Object obj) { | ||||
|     public synchronized void add(int index, NodeHandle handle) { | ||||
|         if (!hasRelationalNodes() || segments == null) { | ||||
|             super.add(index, obj); | ||||
|             super.add(index, handle); | ||||
|             return; | ||||
|         } | ||||
|         if (subnodeCount == -1) { | ||||
|             update(); | ||||
|         } | ||||
|         subnodeCount++; | ||||
|         list.add(index, obj); | ||||
|         list.add(index, handle); | ||||
|         // shift segment indices by one | ||||
|         int s = getSegment(index); | ||||
|         segments[s].length += 1; | ||||
|  | @ -69,7 +69,7 @@ public class SegmentedSubnodeList extends SubnodeList { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public Object get(int index) { | ||||
|     public NodeHandle get(int index) { | ||||
|         if (!hasRelationalNodes() || segments == null) { | ||||
|             return super.get(index); | ||||
|         } | ||||
|  | @ -77,7 +77,7 @@ public class SegmentedSubnodeList extends SubnodeList { | |||
|             return null; | ||||
|         } | ||||
|         loadSegment(getSegment(index), false); | ||||
|         return list.get(index); | ||||
|         return (NodeHandle) list.get(index); | ||||
|     } | ||||
| 
 | ||||
|     public synchronized boolean contains(Object object) { | ||||
|  |  | |||
|  | @ -50,30 +50,30 @@ public class SubnodeList implements Serializable { | |||
|      * Adds the specified object to this list performing | ||||
|      * custom ordering | ||||
|      * | ||||
|      * @param obj element to be inserted. | ||||
|      * @param handle element to be inserted. | ||||
|      */ | ||||
|     public boolean add(Object obj) { | ||||
|         return list.add(obj); | ||||
|     public boolean add(NodeHandle handle) { | ||||
|         return list.add(handle); | ||||
|     } | ||||
|     /** | ||||
|      * Adds the specified object to the list at the given position | ||||
|      * @param idx the index to insert the element at | ||||
|      * @param obj the object t add | ||||
|      * @param handle the object to add | ||||
|      */ | ||||
|     public void add(int idx, Object obj) { | ||||
|         list.add(idx, obj); | ||||
|     public void add(int idx, NodeHandle handle) { | ||||
|         list.add(idx, handle); | ||||
|     } | ||||
| 
 | ||||
|     public Object get(int index) { | ||||
|     public NodeHandle get(int index) { | ||||
|         if (index < 0 || index >= list.size()) { | ||||
|             return null; | ||||
|         } | ||||
|         return list.get(index); | ||||
|         return (NodeHandle) list.get(index); | ||||
|     } | ||||
| 
 | ||||
|     public Node getNode(int index) { | ||||
|         Node retval = null; | ||||
|         NodeHandle handle = (NodeHandle) get(index); | ||||
|         NodeHandle handle = get(index); | ||||
| 
 | ||||
|         if (handle != null) { | ||||
|             retval = handle.getNode(node.nmgr); | ||||
|  | @ -149,12 +149,11 @@ public class SubnodeList implements Serializable { | |||
|         } | ||||
| 
 | ||||
|         DbMapping dbmap = getSubnodeMapping(); | ||||
|         Relation rel = getSubnodeRelation(); | ||||
| 
 | ||||
|         if (!dbmap.isRelational() || rel.getGroup() != null) { | ||||
|             return; | ||||
|         if (dbmap.isRelational()) { | ||||
|             Relation rel = getSubnodeRelation(); | ||||
|             node.nmgr.prefetchNodes(node, rel, this, start, length); | ||||
|         } | ||||
|         node.nmgr.prefetchNodes(node, rel, this, start, length); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue