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

Modified Files:
      Tag: MMBase-1_8
        Queries.java 
Log Message:
also added a 'removeFromResult'


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.77.2.8
retrieving revision 1.77.2.9
diff -u -b -r1.77.2.8 -r1.77.2.9
--- Queries.java        1 Apr 2008 12:00:02 -0000       1.77.2.8
+++ Queries.java        14 Apr 2008 15:27:48 -0000      1.77.2.9
@@ -17,6 +17,8 @@
 import org.mmbase.module.core.MMBase;
 import org.mmbase.storage.search.*;
 import org.mmbase.storage.search.implementation.BasicSortOrder;
+import org.mmbase.storage.search.implementation.BasicStep;
+import org.mmbase.storage.search.implementation.BasicStepField;
 import org.mmbase.storage.search.legacy.ConstraintParser;
 import org.mmbase.util.*;
 import org.mmbase.util.logging.*;
@@ -27,7 +29,7 @@
  * methods are put here.
  *
  * @author Michiel Meeuwissen
- * @version $Id: Queries.java,v 1.77.2.8 2008/04/01 12:00:02 michiel Exp $
+ * @version $Id: Queries.java,v 1.77.2.9 2008/04/14 15:27:48 michiel Exp $
  * @see  org.mmbase.bridge.Query
  * @since MMBase-1.7
  */
@@ -1317,7 +1319,7 @@
         Cloud cloud = n.getCloud();
         SortedSet startNodes = startStep.getNodes();
         NodeManager nextManager = cloud.getNodeManager(((Step) 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(((Integer) 
startNodes.iterator().next()).intValue());
             RelationStep rel = (RelationStep) steps.get(start + 1);
             String role = 
cloud.getNode(rel.getRole().intValue()).getStringValue("sname");
@@ -1336,10 +1338,64 @@
             }
             return result;
         } else {
+            // deeper queries not yet supported
             throw new UnsupportedOperationException();
         }
     }
 
+
+    /**
+     * Explores a query object, and creates a certain new relation object, 
which would make the
+     * given node appear in the query's result.
+     *
+     * You can read this as 'the query object is a related nodes query, and is 
used to contain information
+     * about the relation (role, startnodes)'. This currently is also the only 
implemented part of
+     * this method.
+
+     * @throw UnsupportedOperationException If it cannot be determined how the 
node should be related.
+     *
+     * @since MMBase-1.8.6
+     * @returns Newly created node(s)
+     */
+    public static NodeList removeFromResult(Query q, Node n) {
+        List 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 = (Step) steps.get(start);
+        Cloud cloud = n.getCloud();
+        for (int step = 2; step < steps.size(); step += 2) {
+            Step nextStep = (Step) steps.get(step);
+            NodeManager manager = 
cloud.getNodeManager(nextStep.getTableName());
+            if (manager.equals(n.getNodeManager()) || 
manager.getDescendants().contains(n.getNodeManager())) {
+                Query clone = q.cloneWithoutFields();
+                BasicStep nextStepClone = (BasicStep) 
clone.getSteps().get(step);
+                nextStepClone.addNode(n.getNumber());
+                RelationStep relationStep = (RelationStep) 
clone.getSteps().get(step - 1); // (also  + 1?)
+                BasicStepField relField = (BasicStepField) 
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
Cvs@lists.mmbase.org
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to