Author: michiel
Date: 2010-01-26 12:24:35 +0100 (Tue, 26 Jan 2010)
New Revision: 40726

Modified:
   
mmbase/trunk/core/src/main/java/org/mmbase/storage/search/implementation/database/BasicSqlHandler.java
Log:
MMB-1919

Modified: 
mmbase/trunk/core/src/main/java/org/mmbase/storage/search/implementation/database/BasicSqlHandler.java
===================================================================
--- 
mmbase/trunk/core/src/main/java/org/mmbase/storage/search/implementation/database/BasicSqlHandler.java
      2010-01-26 09:33:42 UTC (rev 40725)
+++ 
mmbase/trunk/core/src/main/java/org/mmbase/storage/search/implementation/database/BasicSqlHandler.java
      2010-01-26 11:24:35 UTC (rev 40726)
@@ -1042,7 +1042,23 @@
 
         // Test for at least 1 child.
         if (childs.isEmpty()) {
-            throw new IllegalStateException("Composite constraint has no child 
(at least 1 child is required).");
+            // See MMB-1919
+            if ((compositeConstraint.getLogicalOperator() == 
CompositeConstraint.LOGICAL_AND && ! compositeConstraint.isInverse())
+                || (compositeConstraint.getLogicalOperator() == 
CompositeConstraint.LOGICAL_OR &&  compositeConstraint.isInverse())
+                ) {
+                // An empty AND constraint is the same as no constraint at all
+                // An empty inverse OR constraint too
+                sb.append("(1 = 1)");
+                return;
+            }
+            if ((compositeConstraint.getLogicalOperator() == 
CompositeConstraint.LOGICAL_OR && ! compositeConstraint.isInverse())
+                || (compositeConstraint.getLogicalOperator() == 
CompositeConstraint.LOGICAL_AND && compositeConstraint.isInverse())) {
+                // OR means 'at least one'. So if no childs, it's always false.
+                // AND means 'all', so inverse ALL is always false, because if 
there are none, they are all always true.
+                sb.append("(1 = 0)");
+                return;
+
+            }
         }
 
         boolean hasMultipleChilds = childs.size() > 1;

_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to