You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2007/09/14 22:15:03 UTC

svn commit: r575783 [1/4] - in /directory: apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authz/ apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/ apacheds/trunk/core/src/main/java/org/apache/directory/server...

Author: elecharny
Date: Fri Sep 14 13:14:59 2007
New Revision: 575783

URL: http://svn.apache.org/viewvc?rev=575783&view=rev
Log:
o Modified the Filter inheritence tree by adding new specialized classes :
- AndNode, orNode, NotNode
- PresenceNode, ApproximativeNode, LesserEqNode, GreaterEqNode, SubstringNode

o Using StringBuilder instead of StringBuffer

Added:
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/AndNode.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/ApproximateNode.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/GreaterEqNode.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/LessEqNode.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/NotNode.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/OrNode.java
Modified:
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authz/GroupCache.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authz/TupleCache.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/EventService.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/ExpressionEvaluator.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/LeafEvaluator.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/SubstringEvaluator.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/jndi/ServerDirContext.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/ExpandingVisitor.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/NormalizationService.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/NormalizingVisitor.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultOptimizer.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultSearchEngine.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/ExpressionEnumerator.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/ExpressionEvaluator.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/LeafEvaluator.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/SearchEngine.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/referral/ReferralService.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaPartitionDao.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaService.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/sp/LdapClassLoader.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/subtree/RefinementEvaluator.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/subtree/RefinementLeafEvaluator.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/subtree/SubentryService.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/trigger/TriggerSpecCache.java
    directory/apacheds/trunk/core/src/test/java/org/apache/directory/server/core/subtree/RefinementEvaluatorTest.java
    directory/apacheds/trunk/core/src/test/java/org/apache/directory/server/core/subtree/RefinementLeafEvaluatorTest.java
    directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/support/SearchHandler.java
    directory/shared/trunk/ldap/src/main/antlr/ACIItem.g
    directory/shared/trunk/ldap/src/main/antlr/filter-parser.g
    directory/shared/trunk/ldap/src/main/antlr/subtree-specification.g
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/aci/ACIItem.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/aci/GrantAndDenial.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/aci/ItemFirstACIItem.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/aci/ItemPermission.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/aci/ProtectedItem.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/aci/UserClass.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/aci/UserFirstACIItem.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/aci/UserPermission.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/TwixTransformer.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/AbstractExprNode.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/AssertionNode.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/BranchNode.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/BranchNormalizedVisitor.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/ExprNode.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/ExtensibleNode.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/LeafNode.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/PresenceNode.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/ScopeNode.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/SimpleNode.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/filter/SubstringNode.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/message/SearchRequestImpl.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/subtree/BaseSubtreeSpecification.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/subtree/SubtreeSpecification.java
    directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/filter/BranchNormalizedVisitorTest.java
    directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/filter/FilterParserImplTest.java
    directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/subtree/SubtreeSpecificationParserTest.java

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authz/GroupCache.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authz/GroupCache.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authz/GroupCache.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authz/GroupCache.java Fri Sep 14 13:14:59 2007
@@ -32,9 +32,9 @@
 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
 import org.apache.directory.shared.ldap.constants.ServerDNConstants;
-import org.apache.directory.shared.ldap.filter.AssertionEnum;
 import org.apache.directory.shared.ldap.filter.BranchNode;
-import org.apache.directory.shared.ldap.filter.SimpleNode;
+import org.apache.directory.shared.ldap.filter.EqualityNode;
+import org.apache.directory.shared.ldap.filter.OrNode;
 import org.apache.directory.shared.ldap.message.ModificationItemImpl;
 import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.directory.shared.ldap.schema.AttributeType;
@@ -130,9 +130,9 @@
         // search all naming contexts for static groups and generate
         // normalized sets of members to cache within the map
 
-        BranchNode filter = new BranchNode( AssertionEnum.OR );
-        filter.addNode( new SimpleNode( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.GROUP_OF_NAMES_OC, AssertionEnum.EQUALITY ) );
-        filter.addNode( new SimpleNode( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.GROUP_OF_UNIQUE_NAMES_OC, AssertionEnum.EQUALITY ) );
+        BranchNode filter = new OrNode();
+        filter.addNode( new EqualityNode( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.GROUP_OF_NAMES_OC ) );
+        filter.addNode( new EqualityNode( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.GROUP_OF_UNIQUE_NAMES_OC) );
 
         Iterator<String> suffixes = nexus.listSuffixes( null );
         

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authz/TupleCache.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authz/TupleCache.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authz/TupleCache.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/authz/TupleCache.java Fri Sep 14 13:14:59 2007
@@ -47,9 +47,8 @@
 import org.apache.directory.shared.ldap.aci.ACITuple;
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
 import org.apache.directory.shared.ldap.exception.LdapSchemaViolationException;
-import org.apache.directory.shared.ldap.filter.AssertionEnum;
+import org.apache.directory.shared.ldap.filter.EqualityNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
-import org.apache.directory.shared.ldap.filter.SimpleNode;
 import org.apache.directory.shared.ldap.message.ModificationItemImpl;
 import org.apache.directory.shared.ldap.message.ResultCodeEnum;
 import org.apache.directory.shared.ldap.name.LdapDN;
@@ -135,7 +134,7 @@
         {
             String suffix = suffixes.next();
             LdapDN baseDn = parseNormalized( suffix );
-            ExprNode filter = new SimpleNode( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.ACCESS_CONTROL_SUBENTRY_OC, AssertionEnum.EQUALITY );
+            ExprNode filter = new EqualityNode( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.ACCESS_CONTROL_SUBENTRY_OC );
             SearchControls ctls = new SearchControls();
             ctls.setSearchScope( SearchControls.SUBTREE_SCOPE );
             NamingEnumeration<SearchResult> results = 

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/EventService.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/EventService.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/EventService.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/EventService.java Fri Sep 14 13:14:59 2007
@@ -59,10 +59,11 @@
 import org.apache.directory.server.schema.ConcreteNameComponentNormalizer;
 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
 import org.apache.directory.server.schema.registries.OidRegistry;
-import org.apache.directory.shared.ldap.filter.AssertionEnum;
+import org.apache.directory.shared.ldap.filter.AndNode;
 import org.apache.directory.shared.ldap.filter.BranchNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
 import org.apache.directory.shared.ldap.filter.LeafNode;
+import org.apache.directory.shared.ldap.filter.NotNode;
 import org.apache.directory.shared.ldap.filter.ScopeNode;
 import org.apache.directory.shared.ldap.message.DerefAliasesEnum;
 import org.apache.directory.shared.ldap.message.ModificationItemImpl;
@@ -156,9 +157,9 @@
             }
 
             // Now for AND & OR nodes with a single child left replace them with their child
-            if ( child.getChildren().size() == 1 && child.getOperator() != AssertionEnum.NOT )
+            if ( child.getChildren().size() == 1 && ! ( child instanceof NotNode ) )
             {
-                filter = child.getChild();
+                filter = child.getFirstChild();
             }
         }
         
@@ -168,7 +169,7 @@
         
         if ( filter != null )
         {
-            BranchNode and = new BranchNode( AssertionEnum.AND );
+            BranchNode and = new AndNode();
             and.addNode( scope );
             and.addNode( filter );
             filter = and;

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/ExpressionEvaluator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/ExpressionEvaluator.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/ExpressionEvaluator.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/ExpressionEvaluator.java Fri Sep 14 13:14:59 2007
@@ -20,15 +20,16 @@
 package org.apache.directory.server.core.event;
 
 
-import java.util.Iterator;
-
 import javax.naming.NamingException;
 import javax.naming.directory.Attributes;
 
 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
 import org.apache.directory.server.schema.registries.OidRegistry;
+import org.apache.directory.shared.ldap.filter.AndNode;
 import org.apache.directory.shared.ldap.filter.BranchNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
+import org.apache.directory.shared.ldap.filter.NotNode;
+import org.apache.directory.shared.ldap.filter.OrNode;
 
 
 
@@ -102,46 +103,42 @@
 
         BranchNode bnode = ( BranchNode ) node;
 
-        switch ( bnode.getOperator() )
+        if ( bnode instanceof OrNode )
         {
-            case OR :
-                Iterator children = bnode.getChildren().iterator();
-
-                while ( children.hasNext() )
+            for ( ExprNode child: bnode.getChildren() )
+            {
+                if ( evaluate( child, dn, entry ) )
                 {
-                    ExprNode child = ( ExprNode ) children.next();
-
-                    if ( evaluate( child, dn, entry ) )
-                    {
-                        return true;
-                    }
+                    return true;
                 }
+            }
 
-                return false;
-                
-            case AND :
-                children = bnode.getChildren().iterator();
-                while ( children.hasNext() )
+            return false;
+        }
+        else if ( bnode instanceof AndNode )
+        {
+            for ( ExprNode child: bnode.getChildren() )
+            {
+                if ( !evaluate( child, dn, entry ) )
                 {
-                    ExprNode child = ( ExprNode ) children.next();
-
-                    if ( !evaluate( child, dn, entry ) )
-                    {
-                        return false;
-                    }
+                    return false;
                 }
+            }
 
-                return true;
-                
-            case NOT :
-                if ( null != bnode.getChild() )
-                {
-                    return !evaluate( bnode.getChild(), dn, entry );
-                }
+            return true;
+        }
+        else if ( bnode instanceof NotNode )
+        {
+            if ( null != bnode.getFirstChild() )
+            {
+                return !evaluate( bnode.getFirstChild(), dn, entry );
+            }
 
-                throw new NamingException( "Negation has no child: " + node );
-            default:
-                throw new NamingException( "Unrecognized branch node operator: " + bnode.getOperator() );
+            throw new NamingException( "Negation has no child: " + node );
+        }
+        else
+        {
+                throw new NamingException( "Unrecognized branch node operator: " + bnode );
         }
     }
 }

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/LeafEvaluator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/LeafEvaluator.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/LeafEvaluator.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/LeafEvaluator.java Fri Sep 14 13:14:59 2007
@@ -30,11 +30,16 @@
 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
 import org.apache.directory.server.schema.registries.OidRegistry;
 import org.apache.directory.shared.ldap.NotImplementedException;
+import org.apache.directory.shared.ldap.filter.ApproximateNode;
+import org.apache.directory.shared.ldap.filter.EqualityNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
-import org.apache.directory.shared.ldap.filter.LeafNode;
+import org.apache.directory.shared.ldap.filter.ExtensibleNode;
+import org.apache.directory.shared.ldap.filter.GreaterEqNode;
+import org.apache.directory.shared.ldap.filter.LessEqNode;
 import org.apache.directory.shared.ldap.filter.PresenceNode;
 import org.apache.directory.shared.ldap.filter.ScopeNode;
 import org.apache.directory.shared.ldap.filter.SimpleNode;
+import org.apache.directory.shared.ldap.filter.SubstringNode;
 import org.apache.directory.shared.ldap.schema.AttributeType;
 import org.apache.directory.shared.ldap.schema.MatchingRule;
 import org.apache.directory.shared.ldap.schema.Normalizer;
@@ -64,6 +69,10 @@
     private SubstringEvaluator substringEvaluator;
     /** ScopeNode evaluator we depend on */
     private ScopeEvaluator scopeEvaluator;
+    
+    /** Constants used for comparisons */
+    private static final boolean COMPARE_GREATER = true;
+    private static final boolean COMPARE_LESSER = false;
 
 
     /**
@@ -103,32 +112,34 @@
             return scopeEvaluator.evaluate( node, dn, entry );
         }
 
-        switch ( ( ( LeafNode ) node ).getAssertionType() )
+        if ( node instanceof PresenceNode )
         {
-            case APPROXIMATE :
-                return evalEquality( ( SimpleNode ) node, entry );
-                
-            case EQUALITY :
-                return evalEquality( ( SimpleNode ) node, entry );
-                
-            case EXTENSIBLE :
-                throw new NotImplementedException();
-                
-            case GREATEREQ :
-                return evalGreater( ( SimpleNode ) node, entry, true );
-                
-            case LESSEQ :
-                return evalGreater( ( SimpleNode ) node, entry, false );
-                
-            case PRESENCE :
-                String attrId = ( ( PresenceNode ) node ).getAttribute();
-                return evalPresence( attrId, entry );
-                
-            case SUBSTRING :
-                return substringEvaluator.evaluate( node, dn, entry );
-                
-            default:
-                throw new NamingException( "Unrecognized leaf node type: " + ( ( LeafNode ) node ).getAssertionType() );
+            String attrId = ((PresenceNode)node).getAttribute();
+            return evalPresence( attrId, entry );
+        }
+        else if ( ( node instanceof EqualityNode ) || ( node instanceof ApproximateNode ) )
+        {
+        	return evalEquality( ( EqualityNode ) node, entry );
+        }
+        else if ( node instanceof GreaterEqNode )
+        {
+        	return evalGreaterOrLesser( ( GreaterEqNode ) node, entry, COMPARE_GREATER );
+        }
+        else if ( node instanceof LessEqNode )
+        {
+        	return evalGreaterOrLesser( ( LessEqNode ) node, entry, COMPARE_LESSER );
+        }
+        else if ( node instanceof SubstringNode )
+        {
+        	return substringEvaluator.evaluate( node, dn, entry );
+        }
+        else if ( node instanceof ExtensibleNode )
+        {
+        	throw new NotImplementedException();
+        }
+        else
+        {
+        	throw new NamingException( "Unrecognized leaf node type: " + node );
         }
     }
 
@@ -144,7 +155,7 @@
      * @return the ava evaluation on the perspective candidate
      * @throws javax.naming.NamingException if there is a database access failure
      */
-    private boolean evalGreater( SimpleNode node, Attributes entry, boolean isGreater ) throws NamingException
+    private boolean evalGreaterOrLesser( SimpleNode node, Attributes entry, boolean isGreaterOrLesser ) throws NamingException
     {
         String attrId = node.getAttribute();
 
@@ -171,7 +182,7 @@
          * Cheaper to not check isGreater in one loop - better to separate
          * out into two loops which you choose to execute based on isGreater
          */
-        if ( isGreater )
+        if ( isGreaterOrLesser == COMPARE_GREATER )
         {
             while ( list.hasMore() )
             {
@@ -232,7 +243,7 @@
      * @return the ava evaluation on the perspective candidate
      * @throws javax.naming.NamingException if there is a database access failure
      */
-    private boolean evalEquality( SimpleNode node, Attributes entry ) throws NamingException
+    private boolean evalEquality( EqualityNode node, Attributes entry ) throws NamingException
     {
         Normalizer normalizer = getNormalizer( node.getAttribute() );
         Comparator comparator = getComparator( node.getAttribute() );
@@ -268,6 +279,7 @@
          * to determine if a match exists.
          */
         NamingEnumeration list = attr.getAll();
+        
         while ( list.hasMore() )
         {
             Object value = normalizer.normalize( list.next() );

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/SubstringEvaluator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/SubstringEvaluator.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/SubstringEvaluator.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/SubstringEvaluator.java Fri Sep 14 13:14:59 2007
@@ -69,7 +69,7 @@
     public boolean evaluate( ExprNode node, String dn, Attributes entry ) throws NamingException
     {
         Pattern regex = null;
-        SubstringNode snode = ( SubstringNode ) node;
+        SubstringNode snode = (SubstringNode)node;
         String oid = oidRegistry.getOid( snode.getAttribute() );
         AttributeType type = attributeTypeRegistry.lookup( oid );
         Normalizer normalizer = type.getSubstr().getNormalizer();

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/jndi/ServerDirContext.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/jndi/ServerDirContext.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/jndi/ServerDirContext.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/jndi/ServerDirContext.java Fri Sep 14 13:14:59 2007
@@ -48,8 +48,9 @@
 import org.apache.directory.server.core.interceptor.context.EntryOperationContext;
 import org.apache.directory.server.core.partition.PartitionNexusProxy;
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
-import org.apache.directory.shared.ldap.filter.AssertionEnum;
+import org.apache.directory.shared.ldap.filter.AndNode;
 import org.apache.directory.shared.ldap.filter.BranchNode;
+import org.apache.directory.shared.ldap.filter.EqualityNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
 import org.apache.directory.shared.ldap.filter.FilterParserImpl;
 import org.apache.directory.shared.ldap.filter.PresenceNode;
@@ -558,11 +559,11 @@
                 
                 if ( value instanceof byte[] )
                 {
-                    node = new SimpleNode( attr.getID(), ( byte [] ) value, AssertionEnum.EQUALITY );
+                    node = new EqualityNode( attr.getID(), ( byte [] ) value );
                 }
                 else 
                 {
-                    node = new SimpleNode( attr.getID(), ( String ) value, AssertionEnum.EQUALITY );
+                    node = new EqualityNode( attr.getID(), ( String ) value );
                 }
 
                 return doSearchOperation( target, getEnvironment(), node, ctls );
@@ -575,7 +576,7 @@
          */
         Attribute attr;
         SimpleNode node;
-        BranchNode filter = new BranchNode( AssertionEnum.AND );
+        BranchNode filter = new AndNode();
         NamingEnumeration list = matchingAttributes.getAll();
 
         // Loop through each attribute value pair
@@ -605,7 +606,7 @@
                 // Add simpel AVA node if its value is a String 
                 if ( val instanceof String )
                 {
-                    node = new SimpleNode( attr.getID(), ( String ) val, AssertionEnum.EQUALITY );
+                    node = new EqualityNode( attr.getID(), ( String ) val );
                     filter.addNode( node );
                 }
             }

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/ExpandingVisitor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/ExpandingVisitor.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/ExpandingVisitor.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/ExpandingVisitor.java Fri Sep 14 13:14:59 2007
@@ -26,14 +26,17 @@
 import javax.naming.NamingException;
 
 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
-import org.apache.directory.shared.ldap.filter.AssertionEnum;
+import org.apache.directory.shared.ldap.filter.ApproximateNode;
 import org.apache.directory.shared.ldap.filter.BranchNode;
+import org.apache.directory.shared.ldap.filter.EqualityNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
 import org.apache.directory.shared.ldap.filter.ExtensibleNode;
 import org.apache.directory.shared.ldap.filter.FilterVisitor;
+import org.apache.directory.shared.ldap.filter.GreaterEqNode;
 import org.apache.directory.shared.ldap.filter.LeafNode;
+import org.apache.directory.shared.ldap.filter.LessEqNode;
+import org.apache.directory.shared.ldap.filter.OrNode;
 import org.apache.directory.shared.ldap.filter.PresenceNode;
-import org.apache.directory.shared.ldap.filter.SimpleNode;
 import org.apache.directory.shared.ldap.filter.SubstringNode;
 import org.apache.directory.shared.ldap.schema.AttributeType;
 
@@ -98,7 +101,7 @@
                         // create a new OR node to hold all descendent forms
                         // add to this node the generalized leaf node and 
                         // replace the old leaf with the new OR branch node
-                        BranchNode orNode = new BranchNode( AssertionEnum.OR );
+                        BranchNode orNode = new OrNode();
                         orNode.getChildren().add( leaf );
                         children.set( childNumber++, orNode );
                         
@@ -110,56 +113,110 @@
                             LeafNode newLeaf = null;
                             AttributeType descendant = ( AttributeType ) descendants.next();
                             
-                            switch( leaf.getAssertionType() )
+                            if ( leaf instanceof PresenceNode )
                             {
-                                case EXTENSIBLE :
-                                    ExtensibleNode extensibleNode = ( ExtensibleNode ) leaf;
-                                    newLeaf = new ExtensibleNode( descendant.getOid(), 
-                                        extensibleNode.getValue(), 
-                                        extensibleNode.getMatchingRuleId(), 
-                                        extensibleNode.dnAttributes() );
-                                    break;
-                                    
-                                case PRESENCE :
-                                    newLeaf = new PresenceNode( descendant.getOid() );
-                                    break;
-                                    
-                                case SUBSTRING :
-                                    SubstringNode substringNode = ( SubstringNode ) leaf;
-                                    newLeaf = new SubstringNode( descendant.getOid(), 
-                                        substringNode.getInitial(), 
-                                        substringNode.getFinal() );
-                                    break;
-                                    
-                                case APPROXIMATE :
-                                case EQUALITY :
-                                case GREATEREQ :
-                                case LESSEQ :
-                                    SimpleNode simpleNode = ( SimpleNode ) leaf;
-                                    if ( simpleNode.getValue() instanceof String )
-                                    {
-                                        newLeaf = new SimpleNode( descendant.getOid(), 
-                                            ( String ) simpleNode.getValue(), 
-                                            simpleNode.getAssertionType() );
-                                    }
-                                    else if ( simpleNode.getValue() instanceof byte[] )
-                                    {
-                                        newLeaf = new SimpleNode( descendant.getOid(), 
-                                            ( byte[] ) simpleNode.getValue(), 
-                                            simpleNode.getAssertionType() );
-                                    }
-                                    else
-                                    {
-                                        newLeaf = new SimpleNode( descendant.getOid(), 
-                                            simpleNode.getValue().toString(), 
-                                            simpleNode.getAssertionType() );
-                                    }
-                                    break;
-                                    
-                                default:
-                                    throw new IllegalStateException( "Unknown assertion type: " 
-                                        + leaf.getAssertionType() );
+                                newLeaf = new PresenceNode( descendant.getOid() );
                             }
+                            else if ( leaf instanceof ApproximateNode ) 
+                            {
+                            	ApproximateNode approximateNode = ( ApproximateNode ) leaf;
+                                
+                                if ( approximateNode.getValue() instanceof String )
+                                {
+                                    newLeaf = new ApproximateNode( descendant.getOid(), 
+                                        ( String ) approximateNode.getValue() );
+                                }
+                                else if ( approximateNode.getValue() instanceof byte[] )
+                                {
+                                    newLeaf = new ApproximateNode( descendant.getOid(), 
+                                        ( byte[] ) approximateNode.getValue() );
+                                }
+                                else
+                                {
+                                    newLeaf = new ApproximateNode( descendant.getOid(), 
+                                    		approximateNode.getValue().toString() );
+                                }
+                            }
+                            else if ( leaf instanceof EqualityNode )
+                            {
+                            	EqualityNode equalityNode = ( EqualityNode ) leaf;
+                                
+                                if ( equalityNode.getValue() instanceof String )
+                                {
+                                    newLeaf = new EqualityNode( descendant.getOid(), 
+                                        ( String ) equalityNode.getValue() );
+                                }
+                                else if ( equalityNode.getValue() instanceof byte[] )
+                                {
+                                    newLeaf = new EqualityNode( descendant.getOid(), 
+                                        ( byte[] ) equalityNode.getValue() );
+                                }
+                                else
+                                {
+                                    newLeaf = new EqualityNode( descendant.getOid(), 
+                                    		equalityNode.getValue().toString() );
+                                }
+                            }
+                            else if ( leaf instanceof GreaterEqNode )
+                            {
+                            	GreaterEqNode greaterEqNode = ( GreaterEqNode ) leaf;
+                                
+                                if ( greaterEqNode.getValue() instanceof String )
+                                {
+                                    newLeaf = new GreaterEqNode( descendant.getOid(), 
+                                        ( String ) greaterEqNode.getValue() );
+                                }
+                                else if ( greaterEqNode.getValue() instanceof byte[] )
+                                {
+                                    newLeaf = new GreaterEqNode( descendant.getOid(), 
+                                        ( byte[] ) greaterEqNode.getValue() );
+                                }
+                                else
+                                {
+                                    newLeaf = new GreaterEqNode( descendant.getOid(), 
+                                    		greaterEqNode.getValue().toString() );
+                                }
+                            }
+                            else if ( leaf instanceof LessEqNode )
+                            {
+                            	LessEqNode lessEqNode = ( LessEqNode ) leaf;
+                                
+                                if ( lessEqNode.getValue() instanceof String )
+                                {
+                                    newLeaf = new LessEqNode( descendant.getOid(), 
+                                        ( String ) lessEqNode.getValue() );
+                                }
+                                else if ( lessEqNode.getValue() instanceof byte[] )
+                                {
+                                    newLeaf = new LessEqNode( descendant.getOid(), 
+                                        ( byte[] ) lessEqNode.getValue() );
+                                }
+                                else
+                                {
+                                    newLeaf = new LessEqNode( descendant.getOid(), 
+                                    		lessEqNode.getValue().toString() );
+                                }
+                            }
+                            else if ( leaf instanceof ExtensibleNode )
+                            {
+                                ExtensibleNode extensibleNode = ( ExtensibleNode ) leaf;
+                                newLeaf = new ExtensibleNode( descendant.getOid(), 
+                                    extensibleNode.getValue(), 
+                                    extensibleNode.getMatchingRuleId(), 
+                                    extensibleNode.dnAttributes() );
+                            }
+                            else if ( leaf instanceof SubstringNode )
+                            {
+                                SubstringNode substringNode = ( SubstringNode ) leaf;
+                                newLeaf = new SubstringNode( descendant.getOid(), 
+                                    substringNode.getInitial(), 
+                                    substringNode.getFinal() );
+                            }
+                            else
+                            {
+                                    throw new IllegalStateException( "Unknown assertion type: " + leaf );
+                            }
+
                             orNode.addNode( newLeaf );
                         }
                     }

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/NormalizationService.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/NormalizationService.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/NormalizationService.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/NormalizationService.java Fri Sep 14 13:14:59 2007
@@ -52,13 +52,18 @@
 import org.apache.directory.server.schema.ConcreteNameComponentNormalizer;
 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
 import org.apache.directory.server.schema.registries.OidRegistry;
-import org.apache.directory.shared.ldap.filter.AssertionEnum;
+import org.apache.directory.shared.ldap.filter.AndNode;
+import org.apache.directory.shared.ldap.filter.ApproximateNode;
 import org.apache.directory.shared.ldap.filter.BranchNode;
+import org.apache.directory.shared.ldap.filter.EqualityNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
 import org.apache.directory.shared.ldap.filter.ExtensibleNode;
+import org.apache.directory.shared.ldap.filter.GreaterEqNode;
 import org.apache.directory.shared.ldap.filter.LeafNode;
+import org.apache.directory.shared.ldap.filter.LessEqNode;
+import org.apache.directory.shared.ldap.filter.NotNode;
+import org.apache.directory.shared.ldap.filter.OrNode;
 import org.apache.directory.shared.ldap.filter.PresenceNode;
-import org.apache.directory.shared.ldap.filter.SimpleNode;
 import org.apache.directory.shared.ldap.filter.SubstringNode;
 import org.apache.directory.shared.ldap.name.LdapDN;
 import org.apache.directory.shared.ldap.name.NameComponentNormalizer;
@@ -165,7 +170,6 @@
         nextInterceptor.moveAndRename( opContext );
     }
 
-
     public NamingEnumeration<SearchResult> search( NextInterceptor nextInterceptor, SearchOperationContext opContext ) throws NamingException
     {
         LdapDN base = opContext.getDn();
@@ -210,6 +214,7 @@
                 }
 
                 filter.accept( normVisitor );
+                
                 isFailure = false;
             }
             catch( UndefinedFilterAttributeException e )
@@ -226,21 +231,21 @@
                 // note that in this case the undefined node will not be removed.
                 BranchNode bnode = ( BranchNode ) filter;
                 
-                if ( bnode.isNegation() )
+                if ( bnode instanceof NotNode )
                 {
                     return new EmptyEnumeration<SearchResult>();
                 }
                 
                 bnode.getChildren().remove( e.getUndefinedFilterNode() );
                 
-                if ( bnode.getOperator() == AssertionEnum.AND )
+                if ( bnode instanceof AndNode )
                 {
                     return new EmptyEnumeration<SearchResult>();
                 }
                 
                 if ( bnode.getChildren().size() < 2 )
                 {
-                    filter = bnode.getChild();
+                    filter = bnode.getFirstChild();
                 }
             }
         }
@@ -259,9 +264,9 @@
             }
 
             // now for AND & OR nodes with a single child left replace them with their child
-            if ( child.getChildren().size() == 1 && child.getOperator() != AssertionEnum.NOT )
+            if ( child.getChildren().size() == 1 && ! ( child instanceof NotNode ) )
             {
-                filter = child.getChild();
+                filter = child.getFirstChild();
             }
         }
         
@@ -282,7 +287,7 @@
             {
                 // create new OR node and add the filter leaf to it 
                 // and set filter to this new branch node
-                BranchNode bnode = new BranchNode( AssertionEnum.OR );
+                BranchNode bnode = new OrNode();
                 bnode.getChildren().add( filter );
                 filter = bnode;
                 
@@ -294,55 +299,111 @@
                     LeafNode newLeaf = null;
                     AttributeType descendant = ( AttributeType ) descendants.next();
                     
-                    switch( leaf.getAssertionType() )
+                    if ( leaf instanceof PresenceNode )
+                    {
+                    	newLeaf = new PresenceNode( descendant.getOid() );
+                    } 
+                    else if ( leaf instanceof EqualityNode )
+                    {
+                    	EqualityNode equalityNode = ( EqualityNode ) leaf;
+                    	
+                        if ( equalityNode.getValue() instanceof String )
+                        {
+                            newLeaf = new EqualityNode( descendant.getOid(), 
+                                ( String ) equalityNode.getValue() );
+                        }
+                        else if ( equalityNode.getValue() instanceof byte[] )
+                        {
+                            newLeaf = new EqualityNode( descendant.getOid(), 
+                                ( byte[] ) equalityNode.getValue() );
+                        }
+                        else
+                        {
+                            newLeaf = new EqualityNode( descendant.getOid(), 
+                            		equalityNode.getValue().toString() );
+                        }
+                    }
+                    else if ( leaf instanceof GreaterEqNode )
+                    {
+                    	GreaterEqNode greaterEqNode = ( GreaterEqNode ) leaf;
+                    	
+                        if ( greaterEqNode.getValue() instanceof String )
+                        {
+                            newLeaf = new GreaterEqNode( descendant.getOid(), 
+                                ( String ) greaterEqNode.getValue() );
+                        }
+                        else if ( greaterEqNode.getValue() instanceof byte[] )
+                        {
+                            newLeaf = new GreaterEqNode( descendant.getOid(), 
+                                ( byte[] ) greaterEqNode.getValue() );
+                        }
+                        else
+                        {
+                            newLeaf = new GreaterEqNode( descendant.getOid(), 
+                            		greaterEqNode.getValue().toString() );
+                        }
+                    }
+                    else if ( leaf instanceof LessEqNode )
+                    {
+                    	LessEqNode lessEqNode = ( LessEqNode ) leaf;
+                    	
+                        if ( lessEqNode.getValue() instanceof String )
+                        {
+                            newLeaf = new LessEqNode( descendant.getOid(), 
+                                ( String ) lessEqNode.getValue() );
+                        }
+                        else if ( lessEqNode.getValue() instanceof byte[] )
+                        {
+                            newLeaf = new LessEqNode( descendant.getOid(), 
+                                ( byte[] ) lessEqNode.getValue() );
+                        }
+                        else
+                        {
+                            newLeaf = new LessEqNode( descendant.getOid(), 
+                            		lessEqNode.getValue().toString() );
+                        }
+                    }
+                    else if ( leaf instanceof ApproximateNode )
+                    {
+                    	ApproximateNode approximateNode = ( ApproximateNode ) leaf;
+                    	
+                        if ( approximateNode.getValue() instanceof String )
+                        {
+                            newLeaf = new ApproximateNode( descendant.getOid(), 
+                                ( String ) approximateNode.getValue()  );
+                        }
+                        else if ( approximateNode.getValue() instanceof byte[] )
+                        {
+                            newLeaf = new ApproximateNode( descendant.getOid(), 
+                                ( byte[] ) approximateNode.getValue()  );
+                        }
+                        else
+                        {
+                            newLeaf = new ApproximateNode( descendant.getOid(), 
+                            		approximateNode.getValue().toString() );
+                        }
+                    }
+                    else if ( leaf instanceof SubstringNode )
+                    {
+                        SubstringNode substringNode = ( SubstringNode ) leaf;
+                        
+                        newLeaf = new SubstringNode( descendant.getOid(), 
+                            substringNode.getInitial(), 
+                            substringNode.getFinal() );
+                    }
+                    else if ( leaf instanceof ExtensibleNode )
+                    {
+                        ExtensibleNode extensibleNode = ( ExtensibleNode ) leaf;
+                        
+                        newLeaf = new ExtensibleNode( descendant.getOid(), 
+                            extensibleNode.getValue(), 
+                            extensibleNode.getMatchingRuleId(), 
+                            extensibleNode.dnAttributes() );
+                    	
+                    }
+                    else
                     {
-                        case EXTENSIBLE :
-                            ExtensibleNode extensibleNode = ( ExtensibleNode ) leaf;
-                            newLeaf = new ExtensibleNode( descendant.getOid(), 
-                                extensibleNode.getValue(), 
-                                extensibleNode.getMatchingRuleId(), 
-                                extensibleNode.dnAttributes() );
-                            break;
-                            
-                        case PRESENCE :
-                            newLeaf = new PresenceNode( descendant.getOid() );
-                            break;
-                            
-                        case SUBSTRING :
-                            SubstringNode substringNode = ( SubstringNode ) leaf;
-                            newLeaf = new SubstringNode( descendant.getOid(), 
-                                substringNode.getInitial(), 
-                                substringNode.getFinal() );
-                            break;
-                            
-                        case APPROXIMATE :
-                        case EQUALITY :
-                        case GREATEREQ :
-                        case LESSEQ :
-                            SimpleNode simpleNode = ( SimpleNode ) leaf;
-                            if ( simpleNode.getValue() instanceof String )
-                            {
-                                newLeaf = new SimpleNode( descendant.getOid(), 
-                                    ( String ) simpleNode.getValue(), 
-                                    simpleNode.getAssertionType() );
-                            }
-                            else if ( simpleNode.getValue() instanceof byte[] )
-                            {
-                                newLeaf = new SimpleNode( descendant.getOid(), 
-                                    ( byte[] ) simpleNode.getValue(), 
-                                    simpleNode.getAssertionType() );
-                            }
-                            else
-                            {
-                                newLeaf = new SimpleNode( descendant.getOid(), 
-                                    simpleNode.getValue().toString(), 
-                                    simpleNode.getAssertionType() );
-                            }
-                            break;
-                            
-                        default:
-                            throw new IllegalStateException( "Unknown assertion type: " 
-                                + leaf.getAssertionType() );
+                        throw new IllegalStateException( "Unknown assertion type: " + leaf );
                     }
                     
                     bnode.getChildren().add( newLeaf );

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/NormalizingVisitor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/NormalizingVisitor.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/NormalizingVisitor.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/NormalizingVisitor.java Fri Sep 14 13:14:59 2007
@@ -21,11 +21,12 @@
 
 
 import org.apache.directory.server.schema.registries.OidRegistry;
-import org.apache.directory.shared.ldap.filter.AssertionEnum;
+import org.apache.directory.shared.ldap.filter.AndNode;
 import org.apache.directory.shared.ldap.filter.BranchNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
 import org.apache.directory.shared.ldap.filter.FilterVisitor;
 import org.apache.directory.shared.ldap.filter.LeafNode;
+import org.apache.directory.shared.ldap.filter.NotNode;
 import org.apache.directory.shared.ldap.filter.PresenceNode;
 import org.apache.directory.shared.ldap.filter.SimpleNode;
 import org.apache.directory.shared.ldap.name.NameComponentNormalizer;
@@ -206,14 +207,15 @@
                         // remove the child at ii
                         bnode.getChildren().remove( child );
                         
-                        if ( bnode.getOperator() != AssertionEnum.AND )
+                        if ( bnode instanceof AndNode )
                         {
-                            bnode.set( "undefined", Boolean.TRUE );
+                            bnode.set( "undefined", Boolean.FALSE );
                         }
                         else
                         {
-                            bnode.set( "undefined", Boolean.FALSE );
+                            bnode.set( "undefined", Boolean.TRUE );
                         }
+
                         ii--; // decrement so we can evaluate next child which has shifted to ii
                         continue;
                     }
@@ -230,14 +232,16 @@
                 catch( UndefinedFilterAttributeException e )
                 {
                     bnode.getChildren().remove( ii );
-                    if ( bnode.getOperator() != AssertionEnum.AND )
+                    
+                    if ( bnode instanceof AndNode )
                     {
-                        bnode.set( "undefined", Boolean.TRUE );
+                        bnode.set( "undefined", Boolean.FALSE );
                     }
                     else
                     {
-                        bnode.set( "undefined", Boolean.FALSE );
+                        bnode.set( "undefined", Boolean.TRUE );
                     }
+
                     ii--;
                     continue;
                 }
@@ -266,16 +270,16 @@
                     
                     // 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() != AssertionEnum.NOT )
+                    if ( child.getChildren().size() == 1 && ! ( child instanceof NotNode ) )
                     {
                         bnode.getChildren().remove( child );
                         if ( ii >= bnode.getChildren().size() )
                         {
-                            bnode.getChildren().add( child.getChild() );
+                            bnode.getChildren().add( child.getFirstChild() );
                         }
                         else
                         {
-                            bnode.getChildren().add( ii, child.getChild() );
+                            bnode.getChildren().add( ii, child.getFirstChild() );
                         }
                     }
                 }

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultOptimizer.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultOptimizer.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultOptimizer.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultOptimizer.java Fri Sep 14 13:14:59 2007
@@ -25,13 +25,22 @@
 import javax.naming.NamingException;
 import javax.naming.directory.SearchControls;
 
+import org.apache.directory.shared.ldap.filter.AndNode;
+import org.apache.directory.shared.ldap.filter.ApproximateNode;
 import org.apache.directory.shared.ldap.filter.AssertionNode;
 import org.apache.directory.shared.ldap.filter.BranchNode;
+import org.apache.directory.shared.ldap.filter.EqualityNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
+import org.apache.directory.shared.ldap.filter.ExtensibleNode;
+import org.apache.directory.shared.ldap.filter.GreaterEqNode;
 import org.apache.directory.shared.ldap.filter.LeafNode;
+import org.apache.directory.shared.ldap.filter.LessEqNode;
+import org.apache.directory.shared.ldap.filter.NotNode;
+import org.apache.directory.shared.ldap.filter.OrNode;
 import org.apache.directory.shared.ldap.filter.PresenceNode;
 import org.apache.directory.shared.ldap.filter.ScopeNode;
 import org.apache.directory.shared.ldap.filter.SimpleNode;
+import org.apache.directory.shared.ldap.filter.SubstringNode;
 
 
 /**
@@ -42,12 +51,9 @@
  */
 public class DefaultOptimizer implements Optimizer
 {
-    /** the maximum size for a count Integer.MAX_VALUE as a BigInteger */
-    private static final Long MAX = Long.MAX_VALUE;
     /** the database this optimizer operates on */
     private BTreePartition db;
 
-
     /**
      * Creates an optimizer on a database.
      *
@@ -70,7 +76,7 @@
     public void annotate( ExprNode node ) throws NamingException
     {
         // Start off with the worst case unless scan count says otherwise.
-        Long count = MAX;
+        long count = Long.MAX_VALUE;
 
         /* --------------------------------------------------------------------
          *                 H A N D L E   L E A F   N O D E S          
@@ -101,40 +107,40 @@
         {
             LeafNode leaf = ( LeafNode ) node;
 
-            switch ( leaf.getAssertionType() )
+            if ( node instanceof PresenceNode )
+            {
+                count = getPresenceScan( ( PresenceNode ) leaf );
+            }
+            else if ( node instanceof EqualityNode )
+            {
+                count = getEqualityScan( ( EqualityNode ) leaf );
+            }
+            else if ( node instanceof GreaterEqNode )
+            {
+                count = getGreaterLessScan( ( GreaterEqNode ) leaf, SimpleNode.EVAL_GREATER );
+            }
+            else if ( node instanceof LessEqNode )
+            {
+                count = getGreaterLessScan( ( SimpleNode ) leaf, SimpleNode.EVAL_LESSER );
+            }
+            else if ( node instanceof SubstringNode )
+            {
+                /** Cannot really say so we presume the total index count */
+                count = getFullScan( leaf );
+            }
+            else if ( node instanceof ExtensibleNode )
+            {
+                /** Cannot really say so we presume the total index count */
+                count = getFullScan( leaf );
+            }
+            else if ( node instanceof ApproximateNode )
             {
-                case APPROXIMATE :
-                    /** Feature not implemented so we just use equality matching */
-                    count = getEqualityScan( ( SimpleNode ) leaf );
-                    break;
-                    
-                case EQUALITY :
-                    count = getEqualityScan( ( SimpleNode ) leaf );
-                    break;
-                    
-                case EXTENSIBLE :
-                    /** Cannot really say so we presume the total index count */
-                    count = getFullScan( leaf );
-                    break;
-                    
-                case GREATEREQ :
-                    count = getGreaterLessScan( ( SimpleNode ) leaf, true );
-                    break;
-                    
-                case LESSEQ :
-                    count = getGreaterLessScan( ( SimpleNode ) leaf, false );
-                    break;
-                case PRESENCE :
-                    count = getPresenceScan( ( PresenceNode ) leaf );
-                    break;
-                    
-                case SUBSTRING :
-                    /** Cannot really say so we presume the total index count */
-                    count = getFullScan( leaf );
-                    break;
-                    
-                default:
-                    throw new IllegalArgumentException( "Unrecognized leaf node" );
+                /** Feature not implemented so we just use equality matching */
+                count = getEqualityScan( ( ApproximateNode ) leaf );
+            }
+            else
+            {
+                throw new IllegalArgumentException( "Unrecognized leaf node" );
             }
         }
         // --------------------------------------------------------------------
@@ -142,31 +148,28 @@
         // --------------------------------------------------------------------
         else
         {
-            BranchNode bnode = ( BranchNode ) node;
-
-            switch ( bnode.getOperator() )
+            if ( node instanceof AndNode )
+            {
+            	count = getConjunctionScan( (AndNode)node );
+            }
+            else if ( node instanceof OrNode )
+            {
+            	count = getDisjunctionScan( (OrNode)node );
+            }
+            else if ( node instanceof NotNode )
+            {
+            	count = getNegationScan( (NotNode)node );
+            }
+            else
             {
-                case AND :
-                    count = getConjunctionScan( bnode );
-                    break;
-                    
-                case NOT :
-                    count = getNegationScan( bnode );
-                    break;
-                    
-                case OR :
-                    count = getDisjunctionScan( bnode );
-                    break;
-                    
-                default:
-                    throw new IllegalArgumentException( "Unrecognized branch node type" );
+            	throw new IllegalArgumentException( "Unrecognized branch node type" );
             }
         }
 
         // Protect against overflow when counting.
-        if ( count.compareTo( 0L ) < 0 )
+        if ( count < 0L )
         {
-            count = MAX;
+            count = Long.MAX_VALUE;
         }
 
         node.set( "count", count );
@@ -184,9 +187,9 @@
      * @return the calculated scan count
      * @throws NamingException if there is an error
      */
-    private Long getConjunctionScan( BranchNode node ) throws NamingException
+    private long getConjunctionScan( BranchNode node ) throws NamingException
     {
-        Long count = MAX;
+        long count = Long.MAX_VALUE;
         List<ExprNode> children = node.getChildren();
 
         for ( int ii = 0; ii < children.size(); ii++ )
@@ -209,9 +212,9 @@
      * @return the scan count
      * @throws NamingException if there is an error
      */
-    private Long getNegationScan( BranchNode node ) throws NamingException
+    private long getNegationScan( BranchNode node ) throws NamingException
     {
-        return MAX;
+        return Long.MAX_VALUE;
     }
 
 
@@ -224,10 +227,10 @@
      * @return the scan count on the OR node
      * @throws NamingException if there is an error
      */
-    private Long getDisjunctionScan( BranchNode node ) throws NamingException
+    private long getDisjunctionScan( BranchNode node ) throws NamingException
     {
         List<ExprNode> children = node.getChildren();
-        Long total = 0L;
+        long total = 0L;
 
         for ( int ii = 0; ii < children.size(); ii++ )
         {
@@ -236,12 +239,6 @@
             total += ( Long ) child.get( "count" );
         }
         
-        // we don't want values bigger than Integer.MAX_VALUE
-        if ( total.compareTo( MAX ) > 0 )
-        {
-            total = MAX;
-        }
-
         return total;
     }
 
@@ -254,7 +251,7 @@
      * @return the worst case
      * @throws NamingException if there is an error accessing an index
      */
-    private Long getEqualityScan( SimpleNode node ) throws NamingException
+    private long getEqualityScan( SimpleNode node ) throws NamingException
     {
         if ( db.hasUserIndexOn( node.getAttribute() ) )
         {
@@ -263,7 +260,7 @@
         }
 
         // count for non-indexed attribute is unknown so we presume da worst
-        return MAX;
+        return Long.MAX_VALUE;
     }
 
 
@@ -276,7 +273,7 @@
      * @return the scan count of all nodes satisfying the AVA
      * @throws NamingException if there is an error accessing an index
      */
-    private Long getGreaterLessScan( SimpleNode node, boolean isGreaterThan ) throws NamingException
+    private long getGreaterLessScan( SimpleNode node, boolean isGreaterThan ) throws NamingException
     {
         if ( db.hasUserIndexOn( node.getAttribute() ) )
         {
@@ -286,7 +283,7 @@
         }
 
         // count for non-indexed attribute is unknown so we presume da worst
-        return MAX;
+        return Long.MAX_VALUE;
     }
 
 
@@ -299,7 +296,7 @@
      * @return the worst case full scan count
      * @throws NamingException if there is an error access database indices
      */
-    private Long getFullScan( LeafNode node ) throws NamingException
+    private long getFullScan( LeafNode node ) throws NamingException
     {
         if ( db.hasUserIndexOn( node.getAttribute() ) )
         {
@@ -308,7 +305,7 @@
             return Long.valueOf( count );
         }
 
-        return MAX;
+        return Long.MAX_VALUE;
     }
 
 
@@ -320,7 +317,7 @@
      * @return the number of entries matched for the presence of an attribute
      * @throws NamingException if errors result
      */
-    private Long getPresenceScan( PresenceNode node ) throws NamingException
+    private long getPresenceScan( PresenceNode node ) throws NamingException
     {
         if ( db.hasUserIndexOn( node.getAttribute() ) )
         {
@@ -329,7 +326,7 @@
             return Long.valueOf( count );
         }
 
-        return MAX;
+        return Long.MAX_VALUE;
     }
 
 
@@ -340,7 +337,7 @@
      * @return the scan count for scope
      * @throws NamingException if any errors result
      */
-    private Long getScopeScan( ScopeNode node ) throws NamingException
+    private long getScopeScan( ScopeNode node ) throws NamingException
     {
         switch ( node.getScope() )
         {
@@ -348,7 +345,7 @@
                 return 1L;
             
             case ( SearchControls.ONELEVEL_SCOPE  ):
-                Long id = db.getEntryId( node.getBaseDn() );
+                long id = db.getEntryId( node.getBaseDn() );
                 return Long.valueOf( db.getChildCount( id ) );
                 
             case ( SearchControls.SUBTREE_SCOPE  ):

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultSearchEngine.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultSearchEngine.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultSearchEngine.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/DefaultSearchEngine.java Fri Sep 14 13:14:59 2007
@@ -27,7 +27,7 @@
 import javax.naming.NamingException;
 import javax.naming.directory.SearchControls;
 
-import org.apache.directory.shared.ldap.filter.AssertionEnum;
+import org.apache.directory.shared.ldap.filter.AndNode;
 import org.apache.directory.shared.ldap.filter.BranchNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
 import org.apache.directory.shared.ldap.filter.ScopeNode;
@@ -125,7 +125,7 @@
         }
 
         // Add the scope node using the eective base to the ilter
-        BranchNode root = new BranchNode( AssertionEnum.AND );
+        BranchNode root = new AndNode();
         ExprNode node = new ScopeNode( env, effectiveBase.toString(), searchCtls.getSearchScope() );
         root.getChildren().add( node );
         root.getChildren().add( filter );

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/ExpressionEnumerator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/ExpressionEnumerator.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/ExpressionEnumerator.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/ExpressionEnumerator.java Fri Sep 14 13:14:59 2007
@@ -27,13 +27,22 @@
 
 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
 import org.apache.directory.shared.ldap.NotImplementedException;
+import org.apache.directory.shared.ldap.filter.AndNode;
+import org.apache.directory.shared.ldap.filter.ApproximateNode;
 import org.apache.directory.shared.ldap.filter.AssertionNode;
 import org.apache.directory.shared.ldap.filter.BranchNode;
+import org.apache.directory.shared.ldap.filter.EqualityNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
+import org.apache.directory.shared.ldap.filter.ExtensibleNode;
+import org.apache.directory.shared.ldap.filter.GreaterEqNode;
 import org.apache.directory.shared.ldap.filter.LeafNode;
+import org.apache.directory.shared.ldap.filter.LessEqNode;
+import org.apache.directory.shared.ldap.filter.NotNode;
+import org.apache.directory.shared.ldap.filter.OrNode;
 import org.apache.directory.shared.ldap.filter.PresenceNode;
 import org.apache.directory.shared.ldap.filter.ScopeNode;
 import org.apache.directory.shared.ldap.filter.SimpleNode;
+import org.apache.directory.shared.ldap.filter.SubstringNode;
 
 
 /**
@@ -96,60 +105,59 @@
         {
             LeafNode leaf = ( LeafNode ) node;
 
-            switch ( leaf.getAssertionType() )
+            if ( node instanceof PresenceNode )
             {
-                case APPROXIMATE :
-                    list = enumEquality( ( SimpleNode ) node );
-                    break;
-                    
-                case EQUALITY :
-                    list = enumEquality( ( SimpleNode ) node );
-                    break;
-                    
-                case EXTENSIBLE :
-                    // N O T   I M P L E M E N T E D   Y E T !
-                    throw new NotImplementedException();
-                
-                case GREATEREQ :
-                    list = enumGreater( ( SimpleNode ) node, true );
-                    break;
-                    
-                case LESSEQ :
-                    list = enumGreater( ( SimpleNode ) node, false );
-                    break;
-                    
-                case PRESENCE :
-                    list = enumPresence( ( PresenceNode ) node );
-                    break;
-                    
-                case SUBSTRING :
-                    list = substringEnumerator.enumerate( leaf );
-                    break;
-                    
-                default:
-                    throw new IllegalArgumentException( "Unknown leaf assertion" );
+                list = enumPresence( ( PresenceNode ) node );
+            }
+            else if ( node instanceof EqualityNode )
+            {
+                list = enumEquality( ( EqualityNode ) node );
+            }
+            else if ( node instanceof GreaterEqNode )
+            {
+                list = enumGreaterOrLesser( ( SimpleNode ) node, SimpleNode.EVAL_GREATER );
+            }
+            else if ( node instanceof LessEqNode )
+            {
+                list = enumGreaterOrLesser( ( SimpleNode ) node, SimpleNode.EVAL_LESSER );
+            }
+            else if ( node instanceof SubstringNode )
+            {
+                list = substringEnumerator.enumerate( leaf );
+            }
+            else if ( node instanceof ExtensibleNode )
+            {
+                // N O T   I M P L E M E N T E D   Y E T !
+                throw new NotImplementedException();
+            }
+            else if ( node instanceof ApproximateNode )
+            {
+                list = enumEquality( ( EqualityNode ) node );
+            }
+            else
+            {
+                throw new IllegalArgumentException( "Unknown leaf assertion" );
             }
         }
         else
         {
             BranchNode branch = ( BranchNode ) node;
 
-            switch ( branch.getOperator() )
+            if ( node instanceof AndNode )
+            {
+                list = enumConj( (AndNode)branch );
+            }
+            else if ( node instanceof OrNode )
             {
-                case AND :
-                    list = enumConj( branch );
-                    break;
-                    
-                case NOT :
-                    list = enumNeg( branch );
-                    break;
-                    
-                case OR :
-                    list = enumDisj( branch );
-                    break;
-                    
-                default:
-                    throw new IllegalArgumentException( "Unknown branch logical operator" );
+                list = enumDisj( (OrNode)branch );
+            }
+            else if ( node instanceof NotNode )
+            {
+                list = enumNeg( (NotNode)branch );
+            }
+            else
+            {
+                throw new IllegalArgumentException( "Unknown branch logical operator" );
             }
         }
 
@@ -162,7 +170,7 @@
      *
      * @param node the disjunction expression branch node
      */
-    private NamingEnumeration<IndexRecord> enumDisj( BranchNode node ) throws NamingException
+    private NamingEnumeration<IndexRecord> enumDisj( OrNode node ) throws NamingException
     {
         List<ExprNode> children = node.getChildren();
         NamingEnumeration[] childEnumerations = new NamingEnumeration[children.size()];
@@ -196,7 +204,7 @@
                 // NOTICE THE ! HERE
                 // The candidate is valid if it does not pass assertion. A
                 // candidate that passes assertion is therefore invalid.
-                return !evaluator.evaluate( node.getChild(), rec );
+                return !evaluator.evaluate( node.getFirstChild(), rec );
             }
         };
 
@@ -210,7 +218,7 @@
      *
      * @param node a conjunction expression branch node
      */
-    private NamingEnumeration<IndexRecord> enumConj( final BranchNode node ) throws NamingException
+    private NamingEnumeration<IndexRecord> enumConj( final AndNode node ) throws NamingException
     {
         int minIndex = 0;
         long minValue = Long.MAX_VALUE;
@@ -298,20 +306,13 @@
      * @return an enumeration over the index records matching the AVA
      * @throws NamingException if there is a failure while accessing the db
      */
-    private NamingEnumeration<IndexRecord> enumGreater( final SimpleNode node, final boolean isGreater ) throws NamingException
+    private NamingEnumeration<IndexRecord> enumGreaterOrLesser( final SimpleNode node, final boolean isGreaterOrLesser ) throws NamingException
     {
         if ( db.hasUserIndexOn( node.getAttribute() ) )
         {
             Index idx = db.getUserIndex( node.getAttribute() );
 
-            if ( isGreater )
-            {
-                return idx.listIndices( node.getValue(), true );
-            }
-            else
-            {
-                return idx.listIndices( node.getValue(), false );
-            }
+            return idx.listIndices( node.getValue(), isGreaterOrLesser );
         }
 
         return nonIndexedScan( node );
@@ -326,7 +327,7 @@
      * @return an enumeration over the index records matching the AVA
      * @throws NamingException if there is a failure while accessing the db
      */
-    private NamingEnumeration<IndexRecord> enumEquality( final SimpleNode node ) throws NamingException
+    private NamingEnumeration<IndexRecord> enumEquality( final EqualityNode node ) throws NamingException
     {
         if ( db.hasUserIndexOn( node.getAttribute() ) )
         {

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/ExpressionEvaluator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/ExpressionEvaluator.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/ExpressionEvaluator.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/ExpressionEvaluator.java Fri Sep 14 13:14:59 2007
@@ -20,14 +20,15 @@
 package org.apache.directory.server.core.partition.impl.btree;
 
 
-import java.util.Iterator;
-
 import javax.naming.NamingException;
 
 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
 import org.apache.directory.server.schema.registries.OidRegistry;
+import org.apache.directory.shared.ldap.filter.AndNode;
 import org.apache.directory.shared.ldap.filter.BranchNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
+import org.apache.directory.shared.ldap.filter.NotNode;
+import org.apache.directory.shared.ldap.filter.OrNode;
 
 
 /**
@@ -105,47 +106,42 @@
 
         BranchNode bnode = ( BranchNode ) node;
 
-        switch ( bnode.getOperator() )
+        if ( bnode instanceof OrNode )
         {
-            case OR :
-                Iterator children = bnode.getChildren().iterator();
-
-                while ( children.hasNext() )
+            for ( ExprNode child:bnode.getChildren() )
+            {
+                if ( evaluate( child, record ) )
                 {
-                    ExprNode child = ( ExprNode ) children.next();
-
-                    if ( evaluate( child, record ) )
-                    {
-                        return true;
-                    }
+                    return true;
                 }
+            }
 
-                return false;
-                
-            case AND :
-                children = bnode.getChildren().iterator();
-                while ( children.hasNext() )
+            return false;
+        }
+        else if ( bnode instanceof AndNode )
+        {
+            for ( ExprNode child:bnode.getChildren() )
+            {
+                if ( !evaluate( child, record ) )
                 {
-                    ExprNode child = ( ExprNode ) children.next();
-
-                    if ( !evaluate( child, record ) )
-                    {
-                        return false;
-                    }
+                    return false;
                 }
+            }
 
-                return true;
-                
-            case NOT :
-                if ( null != bnode.getChild() )
-                {
-                    return !evaluate( bnode.getChild(), record );
-                }
+            return true;
+        }
+        else if ( bnode instanceof NotNode )
+        {
+            if ( null != bnode.getFirstChild() )
+            {
+                return !evaluate( bnode.getFirstChild(), record );
+            }
 
-                throw new NamingException( "Negation has no child: " + node );
-                
-            default:
-                throw new NamingException( "Unrecognized branch node operator: " + bnode.getOperator() );
+            throw new NamingException( "Negation has no child: " + node );
+        }
+        else
+        {
+                throw new NamingException( "Unrecognized branch node operator: " + bnode );
         }
     }
 }

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/LeafEvaluator.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/LeafEvaluator.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/LeafEvaluator.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/LeafEvaluator.java Fri Sep 14 13:14:59 2007
@@ -30,11 +30,16 @@
 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
 import org.apache.directory.server.schema.registries.OidRegistry;
 import org.apache.directory.shared.ldap.NotImplementedException;
+import org.apache.directory.shared.ldap.filter.ApproximateNode;
+import org.apache.directory.shared.ldap.filter.EqualityNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
-import org.apache.directory.shared.ldap.filter.LeafNode;
+import org.apache.directory.shared.ldap.filter.ExtensibleNode;
+import org.apache.directory.shared.ldap.filter.GreaterEqNode;
+import org.apache.directory.shared.ldap.filter.LessEqNode;
 import org.apache.directory.shared.ldap.filter.PresenceNode;
 import org.apache.directory.shared.ldap.filter.ScopeNode;
 import org.apache.directory.shared.ldap.filter.SimpleNode;
+import org.apache.directory.shared.ldap.filter.SubstringNode;
 import org.apache.directory.shared.ldap.schema.AttributeType;
 import org.apache.directory.shared.ldap.schema.ByteArrayComparator;
 import org.apache.directory.shared.ldap.schema.MatchingRule;
@@ -69,7 +74,6 @@
     /** ScopeNode evaluator we depend on */
     private ScopeEvaluator scopeEvaluator;
 
-
     /**
      * Creates a leaf expression node evaluator.
      *
@@ -111,33 +115,39 @@
             return scopeEvaluator.evaluate( node, record );
         }
 
-        switch ( ( ( LeafNode ) node ).getAssertionType() )
+        if ( node instanceof PresenceNode )
+        {
+            String attrId = ( ( PresenceNode ) node ).getAttribute();
+            return evalPresence( attrId, record );
+        }
+        else if ( node instanceof EqualityNode )
+        {
+            return evalEquality( ( EqualityNode ) node, record );
+        }
+        else if ( node instanceof GreaterEqNode )
+        {
+        	return evalGreaterOrLesser( ( SimpleNode ) node, record, SimpleNode.EVAL_GREATER );
+        }
+        else if ( node instanceof LessEqNode )
         {
-            case APPROXIMATE :
-                return evalEquality( ( SimpleNode ) node, record );
-            
-            case EQUALITY :
-                return evalEquality( ( SimpleNode ) node, record );
-            
-            case EXTENSIBLE :
-                throw new NotImplementedException();
-            
-            case GREATEREQ :
-                return evalGreater( ( SimpleNode ) node, record, true );
-            
-            case LESSEQ :
-                return evalGreater( ( SimpleNode ) node, record, false );
-            
-            case PRESENCE :
-                String attrId = ( ( PresenceNode ) node ).getAttribute();
-                return evalPresence( attrId, record );
-                
-            case SUBSTRING :
-                return substringEvaluator.evaluate( node, record );
-            
-            default:
-                throw new NamingException( "Unrecognized leaf node type: " + ( ( LeafNode ) node ).getAssertionType() );
+        	return evalGreaterOrLesser( ( SimpleNode ) node, record, SimpleNode.EVAL_LESSER );
         }
+        else if ( node instanceof SubstringNode )
+        {
+            return substringEvaluator.evaluate( node, record );
+        }
+        else if ( node instanceof ExtensibleNode )
+        {
+        	throw new NotImplementedException();
+        }
+        else if ( node instanceof ApproximateNode )
+        {
+        	return evalEquality( ( ApproximateNode ) node, record );
+        }
+        else
+        {
+        	throw new NamingException( "Unrecognized leaf node type: " + node );
+    	}        
     }
 
 
@@ -152,7 +162,7 @@
      * @return the ava evaluation on the perspective candidate
      * @throws NamingException if there is a database access failure
      */
-    private boolean evalGreater( SimpleNode node, IndexRecord record, boolean isGreater ) throws NamingException
+    private boolean evalGreaterOrLesser( SimpleNode node, IndexRecord record, boolean isGreaterOrLesser ) throws NamingException
     {
         String attrId = node.getAttribute();
         Long id = (Long)record.getEntryId();
@@ -161,7 +171,7 @@
         {
             Index idx = db.getUserIndex( attrId );
 
-            if ( isGreater )
+            if ( isGreaterOrLesser = SimpleNode.EVAL_GREATER )
             {
                 return idx.hasValue( node.getValue(), id, true );
             }
@@ -198,7 +208,7 @@
          * Cheaper to not check isGreater in one loop - better to separate
          * out into two loops which you choose to execute based on isGreater
          */
-        if ( isGreater )
+        if ( isGreaterOrLesser == SimpleNode.EVAL_GREATER )
         {
             while ( list.hasMore() )
             {

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/SearchEngine.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/SearchEngine.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/SearchEngine.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/partition/impl/btree/SearchEngine.java Fri Sep 14 13:14:59 2007
@@ -85,7 +85,7 @@
      * @return enumeration over SearchResults
      * @throws NamingException if the search fails
      */
-    NamingEnumeration search( Name base, Map env, ExprNode filter, SearchControls searchCtls ) throws NamingException;
+    NamingEnumeration search( Name base, Map<?, ?> env, ExprNode filter, SearchControls searchCtls ) throws NamingException;
 
 
     /**

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/referral/ReferralService.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/referral/ReferralService.java?rev=575783&r1=575782&r2=575783&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/referral/ReferralService.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/referral/ReferralService.java Fri Sep 14 13:14:59 2007
@@ -70,9 +70,8 @@
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
 import org.apache.directory.shared.ldap.exception.LdapNamingException;
 import org.apache.directory.shared.ldap.exception.LdapReferralException;
-import org.apache.directory.shared.ldap.filter.AssertionEnum;
+import org.apache.directory.shared.ldap.filter.EqualityNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
-import org.apache.directory.shared.ldap.filter.SimpleNode;
 import org.apache.directory.shared.ldap.message.ModificationItemImpl;
 import org.apache.directory.shared.ldap.message.ResultCodeEnum;
 import org.apache.directory.shared.ldap.name.LdapDN;
@@ -868,7 +867,7 @@
 
     static ExprNode getReferralFilter()
     {
-        return new SimpleNode( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.REFERRAL_OC, AssertionEnum.EQUALITY );
+        return new EqualityNode( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.REFERRAL_OC );
     }