Update of /var/cvs/src/org/mmbase/bridge/util
In directory james.mmbase.org:/tmp/cvs-serv15210
Modified Files:
Queries.java
Log Message:
made it support also nodes between 2 other nodes
See also: http://cvs.mmbase.org/viewcvs/src/org/mmbase/bridge/util
Index: Queries.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/bridge/util/Queries.java,v
retrieving revision 1.103
retrieving revision 1.104
diff -u -b -r1.103 -r1.104
--- Queries.java 9 Jul 2008 15:32:44 -0000 1.103
+++ Queries.java 17 Jul 2008 13:55:02 -0000 1.104
@@ -26,7 +26,7 @@
* methods are put here.
*
* @author Michiel Meeuwissen
- * @version $Id: Queries.java,v 1.103 2008/07/09 15:32:44 michiel Exp $
+ * @version $Id: Queries.java,v 1.104 2008/07/17 13:55:02 michiel Exp $
* @see org.mmbase.bridge.Query
* @since MMBase-1.7
*/
@@ -1283,23 +1283,46 @@
* @throws UnsupportedOperationException If it cannot be determined how
the node should be related.
* @since MMBase-1.8.6
* @returns Newly created node(s)
+ * @throws NullPointerException if q or n is <code>null</code>
*/
public static NodeList addToResult(Query q, Node n) {
List<Step> steps = q.getSteps();
if (steps.size() < 3) throw new UnsupportedOperationException();
+ Cloud cloud = n.getCloud();
NodeList result = q.getCloud().createNodeList();
+ if (log.isDebugEnabled()) {
+ log.debug(" " + q.toSql());
+ }
// First, try if the node can be related to a startNode.
- int start = 0;
- Step startStep = steps.get(start);
- Cloud cloud = n.getCloud();
- SortedSet<Integer> startNodes = startStep.getNodes();
- NodeManager nextManager = cloud.getNodeManager(steps.get(start +
2).getTableName());
- if (startNodes.size() > 0 && (nextManager.equals(n.getNodeManager())
|| nextManager.getDescendants().contains(n.getNodeManager()))) {
- Node startNode = cloud.getNode(startNodes.iterator().next());
+ for(int start = 0; start < steps.size() - 2; start+= 2) {
+ Step step1 = steps.get(start);
+ Step step2 = steps.get(start + 2);
+ SortedSet<Integer> nodes1 = step1.getNodes();
+ SortedSet<Integer> nodes2 = step2.getNodes();
+ NodeManager nm1 = cloud.getNodeManager(step1.getTableName());
+ NodeManager nm2 = cloud.getNodeManager(step2.getTableName());
+ NodeManager nm = n.getNodeManager();
+ boolean nodeInStep1 = (nodes1 != null &&
nodes1.contains(n.getNumber())) || (nodes1 == null && (nm1.equals(nm) ||
nm1.getDescendants().contains(nm)));
+ boolean nodeInStep2 = (nodes2 != null &&
nodes2.contains(n.getNumber())) || (nodes2 == null && (nm2.equals(nm) ||
nm2.getDescendants().contains(nm)));
+ if (log.isDebugEnabled()) {
+ log.debug("s1: " + step1 + " s2: " + step2 + " " + nodes1 + "
" + nodes2 + " " + nodeInStep1 + " " + nodeInStep2);
+ }
+ if (nodeInStep1 || nodeInStep2) {
+ Node startNode = null;
+ if (nodeInStep1 && nodes2 != null) {
+ startNode = cloud.getNode(nodes2.iterator().next());
+ }
+ if (nodeInStep2 && startNode == null && nodes1 != null) {
+ startNode = cloud.getNode(nodes1.iterator().next());
+ }
+ if (startNode == null) throw new
UnsupportedOperationException();
+
+
RelationStep rel = (RelationStep) steps.get(start + 1);
- String role =
cloud.getNode(rel.getRole().intValue()).getStringValue("sname");
+ Integer rolei = rel.getRole();
+ String role = rolei == null ? null :
cloud.getNode(rolei.intValue()).getStringValue("sname");
switch(rel.getDirectionality()) {
case RelationStep.DIRECTIONS_SOURCE: {
Relation newRel = cloud.getRelationManager(n.getNodeManager(),
startNode.getNodeManager(), role).createRelation(startNode, n);
@@ -1313,11 +1336,12 @@
result.add(newRel);
}
}
- return result;
- } else {
- throw new UnsupportedOperationException();
}
}
+ if (result.size() == 0) throw new UnsupportedOperationException();
+ return result;
+
+ }
/**
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs