Update of /var/cvs/src/org/mmbase/bridge/util
In directory james.mmbase.org:/tmp/cvs-serv16733

Modified Files:
        Queries.java 
Log Message:
added method to remove nodes from query result


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.99
retrieving revision 1.100
diff -u -b -r1.99 -r1.100
--- Queries.java        3 Apr 2008 13:24:19 -0000       1.99
+++ Queries.java        14 Apr 2008 15:58:17 -0000      1.100
@@ -26,7 +26,7 @@
  * methods are put here.
  *
  * @author Michiel Meeuwissen
- * @version $Id: Queries.java,v 1.99 2008/04/03 13:24:19 nklasens Exp $
+ * @version $Id: Queries.java,v 1.100 2008/04/14 15:58:17 michiel Exp $
  * @see  org.mmbase.bridge.Query
  * @since MMBase-1.7
  */
@@ -1289,22 +1289,29 @@
 
         if (steps.size() < 3) throw new UnsupportedOperationException();
 
+        NodeList result = q.getCloud().createNodeList();
         // 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(nextManager))) {
+        if (startNodes.size() > 0 && (nextManager.equals(n.getNodeManager()) 
|| nextManager.getDescendants().contains(n.getNodeManager()))) {
             Node startNode = cloud.getNode(startNodes.iterator().next());
             RelationStep rel = (RelationStep) steps.get(start + 1);
             String role = 
cloud.getNode(rel.getRole().intValue()).getStringValue("sname");
             switch(rel.getDirectionality()) {
-            case RelationStep.DIRECTIONS_SOURCE:
-                cloud.getRelationManager(n.getNodeManager(), 
startNode.getNodeManager(), role).createRelation(startNode, n);
+            case RelationStep.DIRECTIONS_SOURCE: {
+                Relation newRel = cloud.getRelationManager(n.getNodeManager(), 
startNode.getNodeManager(), role).createRelation(startNode, n);
+                newRel.commit();
+                result.add(newRel);
                 break;
-            default:
-                cloud.getRelationManager(startNode.getNodeManager(), 
n.getNodeManager(), role).createRelation(startNode, n);
+            }
+            default: {
+                Relation newRel = 
cloud.getRelationManager(startNode.getNodeManager(), n.getNodeManager(), 
role).createRelation(startNode, n);
+                newRel.commit();
+                result.add(newRel);
+            }
             }
             return;
         } else {
@@ -1313,6 +1320,54 @@
     }
 
 
+    /**
+     * Explores a query object, and explores if the node could be in its 
result. If so, the node is
+     * added to the necessary query step, and relations are found and deleted.
+
+     * @throw UnsupportedOperationException If it cannot be determined how the 
node should be related.
+     *
+     * @since MMBase-1.8.6
+     * @returns Removed relations.
+     */
+    public static NodeList removeFromResult(Query q, Node n) {
+        List<Step> steps = q.getSteps();
+
+        if (steps.size() < 3) throw new UnsupportedOperationException();
+
+        NodeList result = q.getCloud().createNodeList();
+
+        // First, try if the node is related to a startNode.
+        int start = 0;
+        Step startStep = steps.get(start);
+        Cloud cloud = n.getCloud();
+        for (int step = 2; step < steps.size(); step += 2) {
+            Step nextStep = steps.get(step);
+            NodeManager manager = 
cloud.getNodeManager(nextStep.getTableName());
+            if (manager.equals(n.getNodeManager()) || 
manager.getDescendants().contains(n.getNodeManager())) {
+                Query clone = q.cloneWithoutFields();
+                Step nextStepClone = clone.getSteps().get(step);
+                clone.addNode(nextStepClone, n);
+                Step relationStep = clone.getSteps().get(step - 1); // (also  
+ 1?)
+                StepField relField = clone.addField(relationStep, 
cloud.getNodeManager(relationStep.getTableName()).getField("number"));
+                String alias = relField.getAlias();
+                if (alias == null) {
+                    alias = relationStep.getAlias() + ".number";
+                }
+                NodeList list = cloud.getList(clone);
+                NodeIterator ni = list.nodeIterator();
+                while (ni.hasNext()) {
+                    Node virtual = ni.nextNode();
+                    Node r = cloud.getNode(virtual.getIntValue(alias));
+                    result.add(r);
+                    r.delete();
+
+                }
+
+            }
+        }
+        return result;
+    }
+
     public static void main(String[] argv) {
         
System.out.println(ConstraintParser.convertClauseToDBS("(([cpsettings.status]='[A]'
 OR [cpsettings.status]='I') AND [users.account] != '') and 
(lower([users.account]) LIKE '%t[est%' OR lower([users.email]) LIKE '%te]st%' 
OR lower([users.firstname]) LIKE '%t[e]st%' OR lower([users.lastname]) LIKE 
'%]test%')"));
     }
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to