You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2006/08/06 21:13:08 UTC

svn commit: r429176 - in /directory/branches/apacheds/1.0: core/src/main/java/org/apache/directory/server/core/normalization/ server-unit/src/test/java/org/apache/directory/server/

Author: akarasulu
Date: Sun Aug  6 12:13:07 2006
New Revision: 429176

URL: http://svn.apache.org/viewvc?rev=429176&view=rev
Log:
fix for DIRSERVER-645: Wrong search filter evaluation with AND operator and undefined operands

Modified:
    directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/normalization/NormalizationService.java
    directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/normalization/NormalizingVisitor.java
    directory/branches/apacheds/1.0/server-unit/src/test/java/org/apache/directory/server/MiscTest.java
    directory/branches/apacheds/1.0/server-unit/src/test/java/org/apache/directory/server/SearchTest.java

Modified: directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/normalization/NormalizationService.java
URL: http://svn.apache.org/viewvc/directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/normalization/NormalizationService.java?rev=429176&r1=429175&r2=429176&view=diff
==============================================================================
--- directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/normalization/NormalizationService.java (original)
+++ directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/normalization/NormalizationService.java Sun Aug  6 12:13:07 2006
@@ -198,6 +198,12 @@
                 }
                 
                 bnode.getChildren().remove( e.getUndefinedFilterNode() );
+                
+                if ( bnode.getOperator() == BranchNode.AND )
+                {
+                    return new EmptyEnumeration();
+                }
+                
                 if ( bnode.getChildren().size() < 2 )
                 {
                     filter = bnode.getChild();
@@ -211,10 +217,10 @@
             BranchNode child = ( BranchNode ) filter;
 
             // if the remaining filter branch node has no children return an empty enumeration
-            if ( child.getChildren().size() == 0 )
+            if ( child.getChildren().size() == 0 || child.get( "undefined" ) == Boolean.TRUE )
             {
-                log
-                    .warn( "Undefined branchnode filter without child nodes not evaluted at all.  Returning empty enumeration." );
+                log.warn( "Undefined branchnode filter without child nodes not " +
+                        "evaluted at all.  Returning empty enumeration." );
                 return new EmptyEnumeration();
             }
 

Modified: directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/normalization/NormalizingVisitor.java
URL: http://svn.apache.org/viewvc/directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/normalization/NormalizingVisitor.java?rev=429176&r1=429175&r2=429176&view=diff
==============================================================================
--- directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/normalization/NormalizingVisitor.java (original)
+++ directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/normalization/NormalizingVisitor.java Sun Aug  6 12:13:07 2006
@@ -69,6 +69,10 @@
 
     public void visit( ExprNode node )
     {
+        // -------------------------------------------------------------------
+        // Handle PresenceNodes
+        // -------------------------------------------------------------------
+        
         if ( node instanceof PresenceNode )
         {
             PresenceNode pnode = ( PresenceNode ) node;
@@ -87,6 +91,10 @@
             return;
         }
 
+        // -------------------------------------------------------------------
+        // Handle SimpleNodes
+        // -------------------------------------------------------------------
+        
         if ( node instanceof SimpleNode )
         {
             SimpleNode snode = ( SimpleNode ) node;
@@ -133,6 +141,10 @@
             return;
         }
 
+        // -------------------------------------------------------------------
+        // Handle BranchNodes
+        // -------------------------------------------------------------------
+        
         if ( node instanceof BranchNode )
         {
             BranchNode bnode = ( BranchNode ) node;
@@ -147,21 +159,33 @@
                     LeafNode ln = ( LeafNode ) child;
                     if ( !ncn.isDefined( ln.getAttribute() ) )
                     {
-                        if ( buf == null )
+                        if ( log.isWarnEnabled() )
                         {
-                            buf = new StringBuffer();
+                            if ( buf == null )
+                            {
+                                buf = new StringBuffer();
+                            }
+                            else
+                            {
+                                buf.setLength( 0 );
+                            }
+                            buf.append( "Removing leaf node based on undefined attribute '" );
+                            buf.append( ln.getAttribute() );
+                            buf.append( "' from filter." );
+                            log.warn( buf.toString() );
                         }
-                        else
-                        {
-                            buf.setLength( 0 );
-                        }
-                        buf.append( "Removing leaf node based on undefined attribute '" );
-                        buf.append( ln.getAttribute() );
-                        buf.append( "' from filter." );
-                        log.warn( buf.toString() );
 
                         // remove the child at ii
                         bnode.getChildren().remove( child );
+                        
+                        if ( bnode.getOperator() != BranchNode.AND )
+                        {
+                            bnode.set( "undefined", Boolean.TRUE );
+                        }
+                        else
+                        {
+                            bnode.set( "undefined", Boolean.FALSE );
+                        }
                         ii--; // decrement so we can evaluate next child which has shifted to ii
                         continue;
                     }
@@ -178,6 +202,14 @@
                 catch( UndefinedFilterAttributeException e )
                 {
                     bnode.getChildren().remove( ii );
+                    if ( bnode.getOperator() != BranchNode.AND )
+                    {
+                        bnode.set( "undefined", Boolean.TRUE );
+                    }
+                    else
+                    {
+                        bnode.set( "undefined", Boolean.FALSE );
+                    }
                     ii--;
                     continue;
                 }
@@ -194,15 +226,16 @@
                 {
                     BranchNode child = ( BranchNode ) unknown;
 
-                    // remove child branch node that has no children left
-                    if ( child.getChildren().size() == 0 )
+                    // remove child branch node that has no children left or 
+                    // a child branch node that is undefined as a result of removals
+                    if ( child.getChildren().size() == 0 || child.get( "undefined" ) == Boolean.TRUE )
                     {
                         // remove the child at ii
                         bnode.getChildren().remove( child );
                         ii--; // decrement so we can evaluate next child which has shifted to ii
                         continue;
                     }
-
+                    
                     // now for AND & OR nodes with a single child left replace them
                     // with their child at the same index they AND/OR node was in
                     if ( child.getChildren().size() == 1 && child.getOperator() != BranchNode.NOT )

Modified: directory/branches/apacheds/1.0/server-unit/src/test/java/org/apache/directory/server/MiscTest.java
URL: http://svn.apache.org/viewvc/directory/branches/apacheds/1.0/server-unit/src/test/java/org/apache/directory/server/MiscTest.java?rev=429176&r1=429175&r2=429176&view=diff
==============================================================================
--- directory/branches/apacheds/1.0/server-unit/src/test/java/org/apache/directory/server/MiscTest.java (original)
+++ directory/branches/apacheds/1.0/server-unit/src/test/java/org/apache/directory/server/MiscTest.java Sun Aug  6 12:13:07 2006
@@ -319,10 +319,10 @@
         e = sysRoot.search( "", "(!(bogusAttribute=abc123))", cons );
         assertNotNull( e );
         assertEquals( e.getClass(), EmptyEnumeration.class );
-        e = sysRoot.search( "", "(& (bogusAttribute=abc123)(bogusAttribute=abc123) )", cons );
+        e = sysRoot.search( "", "(| (bogusAttribute=abc123)(bogusAttribute=abc123) )", cons );
         assertNotNull( e );
         assertEquals( e.getClass(), EmptyEnumeration.class );
-        e = sysRoot.search( "", "(& (bogusAttribute=abc123)(ou=abc123) )", cons );
+        e = sysRoot.search( "", "(| (bogusAttribute=abc123)(ou=abc123) )", cons );
         assertNotNull( e );
         assertFalse( e.getClass().equals( EmptyEnumeration.class ) );
 

Modified: directory/branches/apacheds/1.0/server-unit/src/test/java/org/apache/directory/server/SearchTest.java
URL: http://svn.apache.org/viewvc/directory/branches/apacheds/1.0/server-unit/src/test/java/org/apache/directory/server/SearchTest.java?rev=429176&r1=429175&r2=429176&view=diff
==============================================================================
--- directory/branches/apacheds/1.0/server-unit/src/test/java/org/apache/directory/server/SearchTest.java (original)
+++ directory/branches/apacheds/1.0/server-unit/src/test/java/org/apache/directory/server/SearchTest.java Sun Aug  6 12:13:07 2006
@@ -352,5 +352,26 @@
             fail( e.getMessage() );
         }
     }
+ 
     
+    /**
+     * Tests for <a href="http://issues.apache.org/jira/browse/DIRSERVER-645">
+     * DIRSERVER-645<\a>: Wrong search filter evaluation with AND 
+     * operator and undefined operands.
+     */
+    public void testUndefinedAvaInBranchFilters() throws Exception
+    {
+        // create additional entry
+        Attributes attributes = this.getPersonAttributes( "Bush", "Kate Bush" );
+        ctx.createSubcontext( "cn=Kate Bush", attributes );
+
+        // -------------------------------------------------------------------
+        Set results = search( "(|(sn=Bush)(numberOfOctaves=4))" );
+        assertEquals( "returned size of results", 1, results.size() );
+        assertTrue( "contains cn=Kate Bush", results.contains( "cn=Kate Bush" ) );
+
+        // if numberOfOctaves is undefined then this whole filter is undefined
+        results = search( "(&(sn=Bush)(numberOfOctaves=4))" );
+        assertEquals( "returned size of results", 0, results.size() );
+    }
 }