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