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 2008/03/29 03:22:18 UTC

svn commit: r642490 - in /directory/sandbox/akarasulu/bigbang: apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/ shared/ldap/src/main/java/org/apache/directory/shared/ldap/filter/

Author: akarasulu
Date: Fri Mar 28 19:22:16 2008
New Revision: 642490

URL: http://svn.apache.org/viewvc?rev=642490&view=rev
Log:
Adding leaf node based evaluators ...
 
 o corrected doco in LeafNode - nothing major
 o changing generics on Evaluator interface to include type for ExprNode
 o added new Evaluators
    - GreaterEqEvaluator
    - LessEqEvaluator
    - EqualityEvaluator
    - PresenceEvaluator
 o generic changes to SubstringEvaluator to match changes in Evaluator interface
 o removed cast in SubstringCursor
 o other changes don't matter
 

Added:
    directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/EqualityEvaluator.java
    directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/GreaterEqEvaluator.java
    directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/LessEqEvaluator.java
    directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/PresenceEvaluator.java
Modified:
    directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/Evaluator.java
    directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/ExpressionCursorBuilder.java
    directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/ExpressionEvaluatorBuilder.java
    directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/SubstringCursor.java
    directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/SubstringEvaluator.java
    directory/sandbox/akarasulu/bigbang/shared/ldap/src/main/java/org/apache/directory/shared/ldap/filter/LeafNode.java

Added: directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/EqualityEvaluator.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/EqualityEvaluator.java?rev=642490&view=auto
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/EqualityEvaluator.java (added)
+++ directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/EqualityEvaluator.java Fri Mar 28 19:22:16 2008
@@ -0,0 +1,177 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.server.xdbm.search.impl;
+
+
+import org.apache.directory.shared.ldap.filter.EqualityNode;
+import org.apache.directory.shared.ldap.util.AttributeUtils;
+import org.apache.directory.shared.ldap.schema.AttributeType;
+import org.apache.directory.shared.ldap.schema.MatchingRule;
+import org.apache.directory.shared.ldap.schema.Normalizer;
+import org.apache.directory.server.xdbm.IndexEntry;
+import org.apache.directory.server.xdbm.Store;
+import org.apache.directory.server.xdbm.Index;
+import org.apache.directory.server.schema.registries.Registries;
+
+import javax.naming.directory.Attributes;
+import javax.naming.directory.Attribute;
+import javax.naming.NamingEnumeration;
+import java.util.Iterator;
+import java.util.Comparator;
+
+
+/**
+ * An Evaluator which determines if candidates are matched by GreaterEqNode
+ * assertions.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+public class EqualityEvaluator implements Evaluator<EqualityNode, Attributes>
+{
+    private final EqualityNode node;
+    private final Store<Attributes> db;
+    private final Registries registries;
+    private final AttributeType type;
+    private final Normalizer normalizer;
+    private final Comparator comparator;
+    private final Index<Number,Attributes> idx;
+
+
+    public EqualityEvaluator( EqualityNode node, Store<Attributes> db, Registries registries )
+        throws Exception
+    {
+        this.db = db;
+        this.node = node;
+        this.registries = registries;
+
+        if ( db.hasUserIndexOn( node.getAttribute() ) )
+        {
+            //noinspection unchecked
+            idx = db.getUserIndex( node.getAttribute() );
+            type = null;
+            normalizer = null;
+            comparator = null;
+        }
+        else
+        {
+            idx = null;
+            type = registries.getAttributeTypeRegistry().lookup( node.getAttribute() );
+
+            MatchingRule mr = type.getEquality();
+
+            if ( mr == null )
+            {
+                throw new IllegalStateException(
+                    "Could not find matchingRule to use for EqualityNode evaluation: " + node );
+            }
+
+            normalizer = mr.getNormalizer();
+            comparator = mr.getComparator();
+        }
+    }
+
+
+    public EqualityNode getExpression()
+    {
+        return node;
+    }
+
+
+    public boolean evaluate( IndexEntry<?,Attributes> indexEntry ) throws Exception
+    {
+        if ( idx != null )
+        {
+            return idx.has( ( Number ) indexEntry.getValue(), indexEntry.getId() );
+        }
+
+        Attributes entry = indexEntry.getObject();
+
+        // resuscitate the entry if it has not been and set entry in IndexEntry
+        if ( null == entry )
+        {
+            entry = db.lookup( indexEntry.getId() );
+            indexEntry.setObject( entry );
+        }
+
+        // get the attribute
+        Attribute attr = AttributeUtils.getAttribute( entry, type );
+
+        // if the attribute does not exist just return false
+        if ( attr != null && evaluate( attr ) )
+        {
+            return true;
+        }
+
+        // If we do not have the attribute, loop through the sub classes of
+        // the attributeType.  Perhaps the entry has an attribute value of a
+        // subtype (descendant) that will produce a match
+        if ( registries.getAttributeTypeRegistry().hasDescendants( node.getAttribute() ) )
+        {
+            // TODO check to see if descendant handling is necessary for the
+            // index so we can match properly even when for example a name
+            // attribute is used instead of more specific commonName
+            Iterator<AttributeType> descendants =
+                registries.getAttributeTypeRegistry().descendants( node.getAttribute() );
+
+            while ( descendants.hasNext() )
+            {
+                AttributeType descendant = descendants.next();
+
+                attr = AttributeUtils.getAttribute( entry, descendant );
+
+                if ( attr != null && evaluate( attr ) )
+                {
+                    return true;
+                }
+            }
+        }
+
+        // we fell through so a match was not found - assertion was false.
+        return false;
+    }
+
+
+    private boolean evaluate( Attribute attribute ) throws Exception
+    {
+        /*
+         * Cycle through the attribute values testing normalized version
+         * obtained from using the ordering or equality matching rule's
+         * normalizer.  The test uses the comparator obtained from the
+         * appropriate matching rule to perform the check.
+         */
+        NamingEnumeration values = attribute.getAll();
+
+        while ( values.hasMore() )
+        {
+            Object value = normalizer.normalize( values.next() );
+
+            // Once match is found cleanup and return true
+            //noinspection unchecked
+            if ( comparator.compare( value, node.getValue() ) == 0 )
+            {
+                values.close();
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
\ No newline at end of file

Modified: directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/Evaluator.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/Evaluator.java?rev=642490&r1=642489&r2=642490&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/Evaluator.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/Evaluator.java Fri Mar 28 19:22:16 2008
@@ -30,7 +30,7 @@
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$
  */
-public interface Evaluator<E>
+public interface Evaluator<N extends ExprNode,E>
 {
     /**
      * Evaluates a candidate to determine if a filter expression selects it.
@@ -47,5 +47,5 @@
      *
      * @return the AST for the expression
      */
-    ExprNode getExpression();
+    N getExpression();
 }

Modified: directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/ExpressionCursorBuilder.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/ExpressionCursorBuilder.java?rev=642490&r1=642489&r2=642490&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/ExpressionCursorBuilder.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/ExpressionCursorBuilder.java Fri Mar 28 19:22:16 2008
@@ -24,6 +24,7 @@
 
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
+import javax.naming.directory.Attributes;
 
 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
 import org.apache.directory.server.xdbm.ForwardIndexEntry;
@@ -63,10 +64,8 @@
     private Store<E> db = null;
     /** CursorBuilder flyweight for evaulating filter scope assertions */
     private ScopeCursorBuilder<E> scopeEnumerator;
-    /** CursorBuilder flyweight for evaulating filter substring assertions */
-    private SubstringCursorBuilder<E> substringEnumerator;
     /** Evaluator dependency on a ExpressionEvaluatorBuilder */
-    private ExpressionEvaluatorBuilder<E> evaluatorBuilder;
+    private ExpressionEvaluatorBuilder<Attributes> evaluatorBuilder;
 
 
     /**

Modified: directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/ExpressionEvaluatorBuilder.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/ExpressionEvaluatorBuilder.java?rev=642490&r1=642489&r2=642490&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/ExpressionEvaluatorBuilder.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/ExpressionEvaluatorBuilder.java Fri Mar 28 19:22:16 2008
@@ -21,9 +21,10 @@
 
 
 import javax.naming.NamingException;
+import javax.naming.directory.Attributes;
 
 import org.apache.directory.server.schema.registries.Registries;
-import org.apache.directory.server.xdbm.IndexEntry;
+import org.apache.directory.server.xdbm.Store;
 import org.apache.directory.shared.ldap.filter.AndNode;
 import org.apache.directory.shared.ldap.filter.BranchNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
@@ -37,70 +38,43 @@
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$
  */
-public class ExpressionEvaluatorBuilder implements EvaluatorBuilder
+public class ExpressionEvaluatorBuilder implements EvaluatorBuilder<Attributes>
 {
-    /** Leaf Evaluator flyweight use for leaf filter assertions */
-    private LeafEvaluator leafEvaluator;
+    private final Store<Attributes> db;
+    private final Registries registries;
 
 
     // ------------------------------------------------------------------------
     // C O N S T R U C T O R S
     // ------------------------------------------------------------------------
 
-    /**
-     * Creates a top level Evaluator where leaves are delegated to a leaf node
-     * evaluator which is already provided.
-     *
-     * @param leafEvaluator handles leaf node evaluation.
-     */
-    public ExpressionEvaluatorBuilder(LeafEvaluator leafEvaluator)
-    {
-        this.leafEvaluator = leafEvaluator;
-    }
-
 
     /**
      * Creates a top level Evaluator where leaves are delegated to a leaf node
      * evaluator which will be created.
      *
      * @param db the database this evaluator operates upon
-     * @param oidRegistry the oid reg used for attrID to oid resolution
-     * @param attributeTypeRegistry the attribtype reg used for value comparison
-     */
-    public ExpressionEvaluatorBuilder(BTreePartition db, Registries registries )
-    {
-        ScopeEvaluator scopeEvaluator = null;
-        SubstringEvaluator substringEvaluator = null;
-
-        scopeEvaluator = new ScopeEvaluator( db );
-        substringEvaluator = new SubstringEvaluator( db, registries );
-        leafEvaluator = new LeafEvaluator( db, registries, scopeEvaluator, substringEvaluator );
-    }
-
-
-    /**
-     * Gets the leaf evaluator used by this top level expression evaluator.
-     *
-     * @return the leaf evaluator used by this top level expression evaluator
      */
-    public LeafEvaluator getLeafEvaluator()
+    public ExpressionEvaluatorBuilder( Store<Attributes> db, Registries registries ) throws Exception
     {
-        return leafEvaluator;
+        this.db = db;
+        this.registries = registries;
     }
 
 
     // ------------------------------------------------------------------------
-    // Evaluator.evaluate() implementation
+    // EvaluatorBuilder.build() implementation
     // ------------------------------------------------------------------------
 
+
     /**
-     * @see Evaluator#evaluate(ExprNode, IndexEntry)
+     * @see EvaluatorBuilder#build(ExprNode)
      */
-    public boolean evaluate( ExprNode node, IndexEntry entry ) throws NamingException
+    public Evaluator<Attributes> build( ExprNode node ) throws NamingException
     {
         if ( node.isLeaf() )
         {
-            return leafEvaluator.evaluate( node, entry );
+            return new LeafEvaluator( node );
         }
 
         BranchNode bnode = ( BranchNode ) node;

Added: directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/GreaterEqEvaluator.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/GreaterEqEvaluator.java?rev=642490&view=auto
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/GreaterEqEvaluator.java (added)
+++ directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/GreaterEqEvaluator.java Fri Mar 28 19:22:16 2008
@@ -0,0 +1,188 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.server.xdbm.search.impl;
+
+
+import org.apache.directory.shared.ldap.filter.GreaterEqNode;
+import org.apache.directory.shared.ldap.util.AttributeUtils;
+import org.apache.directory.shared.ldap.schema.AttributeType;
+import org.apache.directory.shared.ldap.schema.MatchingRule;
+import org.apache.directory.shared.ldap.schema.Normalizer;
+import org.apache.directory.server.xdbm.IndexEntry;
+import org.apache.directory.server.xdbm.Store;
+import org.apache.directory.server.xdbm.Index;
+import org.apache.directory.server.schema.registries.Registries;
+
+import javax.naming.directory.Attributes;
+import javax.naming.directory.Attribute;
+import javax.naming.NamingEnumeration;
+import java.util.Iterator;
+import java.util.Comparator;
+
+
+/**
+ * An Evaluator which determines if candidates are matched by GreaterEqNode
+ * assertions.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+public class GreaterEqEvaluator implements Evaluator<GreaterEqNode, Attributes>
+{
+    private final GreaterEqNode node;
+    private final Store<Attributes> db;
+    private final Registries registries;
+    private final AttributeType type;
+    private final Normalizer normalizer;
+    private final Comparator comparator;
+    private final Index<Number,Attributes> idx;
+
+
+    public GreaterEqEvaluator( GreaterEqNode node, Store<Attributes> db, Registries registries )
+        throws Exception
+    {
+        this.db = db;
+        this.node = node;
+        this.registries = registries;
+
+        if ( db.hasUserIndexOn( node.getAttribute() ) )
+        {
+            //noinspection unchecked
+            idx = db.getUserIndex( node.getAttribute() );
+            type = null;
+            normalizer = null;
+            comparator = null;
+        }
+        else
+        {
+            idx = null;
+            type = registries.getAttributeTypeRegistry().lookup( node.getAttribute() );
+
+            /*
+             * We prefer matching using the Normalizer and Comparator pair from
+             * the ordering matchingRule if one is available.  It may very well
+             * not be.  If so then we resort to using the Normalizer and
+             * Comparator from the equality matchingRule as a last resort.
+             */
+            MatchingRule mr = type.getOrdering();
+
+            if ( mr == null )
+            {
+                mr = type.getEquality();
+            }
+
+            if ( mr == null )
+            {
+                throw new IllegalStateException(
+                    "Could not find matchingRule to use for GreaterEqNode evaluation: " + node );
+            }
+
+            normalizer = mr.getNormalizer();
+            comparator = mr.getComparator();
+        }
+    }
+
+
+    public GreaterEqNode getExpression()
+    {
+        return node;
+    }
+
+
+    public boolean evaluate( IndexEntry<?,Attributes> indexEntry ) throws Exception
+    {
+        if ( idx != null )
+        {
+            return idx.hasGreaterOrEqual( ( Number ) indexEntry.getValue(), indexEntry.getId() );
+        }
+
+        Attributes entry = indexEntry.getObject();
+
+        // resuscitate the entry if it has not been and set entry in IndexEntry
+        if ( null == entry )
+        {
+            entry = db.lookup( indexEntry.getId() );
+            indexEntry.setObject( entry );
+        }
+
+        // get the attribute
+        Attribute attr = AttributeUtils.getAttribute( entry, type );
+
+        // if the attribute does not exist just return false
+        if ( attr != null && evaluate( attr ) )
+        {
+            return true;
+        }
+
+        // If we do not have the attribute, loop through the sub classes of
+        // the attributeType.  Perhaps the entry has an attribute value of a
+        // subtype (descendant) that will produce a match
+        if ( registries.getAttributeTypeRegistry().hasDescendants( node.getAttribute() ) )
+        {
+            // TODO check to see if descendant handling is necessary for the
+            // index so we can match properly even when for example a name
+            // attribute is used instead of more specific commonName
+            Iterator<AttributeType> descendants =
+                registries.getAttributeTypeRegistry().descendants( node.getAttribute() );
+
+            while ( descendants.hasNext() )
+            {
+                AttributeType descendant = descendants.next();
+
+                attr = AttributeUtils.getAttribute( entry, descendant );
+
+                if ( attr != null && evaluate( attr ) )
+                {
+                    return true;
+                }
+            }
+        }
+
+        // we fell through so a match was not found - assertion was false.
+        return false;
+    }
+
+
+    private boolean evaluate( Attribute attribute ) throws Exception
+    {
+        /*
+         * Cycle through the attribute values testing normalized version
+         * obtained from using the ordering or equality matching rule's
+         * normalizer.  The test uses the comparator obtained from the
+         * appropriate matching rule to perform the check.
+         */
+        NamingEnumeration values = attribute.getAll();
+
+        while ( values.hasMore() )
+        {
+            Object value = normalizer.normalize( values.next() );
+
+            // Once match is found cleanup and return true
+            //noinspection unchecked
+            if ( comparator.compare( value, node.getValue() ) >= 0 )
+            {
+                values.close();
+                return true;
+            }
+        }
+
+        return false;
+    }
+}

Added: directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/LessEqEvaluator.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/LessEqEvaluator.java?rev=642490&view=auto
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/LessEqEvaluator.java (added)
+++ directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/LessEqEvaluator.java Fri Mar 28 19:22:16 2008
@@ -0,0 +1,188 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.server.xdbm.search.impl;
+
+
+import org.apache.directory.shared.ldap.filter.LessEqNode;
+import org.apache.directory.shared.ldap.util.AttributeUtils;
+import org.apache.directory.shared.ldap.schema.AttributeType;
+import org.apache.directory.shared.ldap.schema.MatchingRule;
+import org.apache.directory.shared.ldap.schema.Normalizer;
+import org.apache.directory.server.xdbm.IndexEntry;
+import org.apache.directory.server.xdbm.Store;
+import org.apache.directory.server.xdbm.Index;
+import org.apache.directory.server.schema.registries.Registries;
+
+import javax.naming.directory.Attributes;
+import javax.naming.directory.Attribute;
+import javax.naming.NamingEnumeration;
+import java.util.Iterator;
+import java.util.Comparator;
+
+
+/**
+ * An Evaluator which determines if candidates are matched by GreaterEqNode
+ * assertions.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+public class LessEqEvaluator implements Evaluator<LessEqNode, Attributes>
+{
+    private final LessEqNode node;
+    private final Store<Attributes> db;
+    private final Registries registries;
+    private final AttributeType type;
+    private final Normalizer normalizer;
+    private final Comparator comparator;
+    private final Index<Number,Attributes> idx;
+
+
+    public LessEqEvaluator( LessEqNode node, Store<Attributes> db, Registries registries )
+        throws Exception
+    {
+        this.db = db;
+        this.node = node;
+        this.registries = registries;
+
+        if ( db.hasUserIndexOn( node.getAttribute() ) )
+        {
+            //noinspection unchecked
+            idx = db.getUserIndex( node.getAttribute() );
+            type = null;
+            normalizer = null;
+            comparator = null;
+        }
+        else
+        {
+            idx = null;
+            type = registries.getAttributeTypeRegistry().lookup( node.getAttribute() );
+
+            /*
+             * We prefer matching using the Normalizer and Comparator pair from
+             * the ordering matchingRule if one is available.  It may very well
+             * not be.  If so then we resort to using the Normalizer and
+             * Comparator from the equality matchingRule as a last resort.
+             */
+            MatchingRule mr = type.getOrdering();
+
+            if ( mr == null )
+            {
+                mr = type.getEquality();
+            }
+
+            if ( mr == null )
+            {
+                throw new IllegalStateException(
+                    "Could not find matchingRule to use for LessEqNode evaluation: " + node );
+            }
+
+            normalizer = mr.getNormalizer();
+            comparator = mr.getComparator();
+        }
+    }
+
+
+    public LessEqNode getExpression()
+    {
+        return node;
+    }
+
+
+    public boolean evaluate( IndexEntry<?,Attributes> indexEntry ) throws Exception
+    {
+        if ( idx != null )
+        {
+            return idx.hasLessOrEqual( ( Number ) indexEntry.getValue(), indexEntry.getId() );
+        }
+
+        Attributes entry = indexEntry.getObject();
+
+        // resuscitate the entry if it has not been and set entry in IndexEntry
+        if ( null == entry )
+        {
+            entry = db.lookup( indexEntry.getId() );
+            indexEntry.setObject( entry );
+        }
+
+        // get the attribute
+        Attribute attr = AttributeUtils.getAttribute( entry, type );
+
+        // if the attribute does not exist just return false
+        if ( attr != null && evaluate( attr ) )
+        {
+            return true;
+        }
+
+        // If we do not have the attribute, loop through the sub classes of
+        // the attributeType.  Perhaps the entry has an attribute value of a
+        // subtype (descendant) that will produce a match
+        if ( registries.getAttributeTypeRegistry().hasDescendants( node.getAttribute() ) )
+        {
+            // TODO check to see if descendant handling is necessary for the
+            // index so we can match properly even when for example a name
+            // attribute is used instead of more specific commonName
+            Iterator<AttributeType> descendants =
+                registries.getAttributeTypeRegistry().descendants( node.getAttribute() );
+
+            while ( descendants.hasNext() )
+            {
+                AttributeType descendant = descendants.next();
+
+                attr = AttributeUtils.getAttribute( entry, descendant );
+
+                if ( attr != null && evaluate( attr ) )
+                {
+                    return true;
+                }
+            }
+        }
+
+        // we fell through so a match was not found - assertion was false.
+        return false;
+    }
+
+
+    private boolean evaluate( Attribute attribute ) throws Exception
+    {
+        /*
+         * Cycle through the attribute values testing normalized version
+         * obtained from using the ordering or equality matching rule's
+         * normalizer.  The test uses the comparator obtained from the
+         * appropriate matching rule to perform the check.
+         */
+        NamingEnumeration values = attribute.getAll();
+
+        while ( values.hasMore() )
+        {
+            Object value = normalizer.normalize( values.next() );
+
+            // Once match is found cleanup and return true
+            //noinspection unchecked
+            if ( comparator.compare( value, node.getValue() ) <= 0 )
+            {
+                values.close();
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
\ No newline at end of file

Added: directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/PresenceEvaluator.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/PresenceEvaluator.java?rev=642490&view=auto
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/PresenceEvaluator.java (added)
+++ directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/PresenceEvaluator.java Fri Mar 28 19:22:16 2008
@@ -0,0 +1,130 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.server.xdbm.search.impl;
+
+
+import org.apache.directory.shared.ldap.filter.PresenceNode;
+import org.apache.directory.shared.ldap.util.AttributeUtils;
+import org.apache.directory.shared.ldap.schema.AttributeType;
+import org.apache.directory.server.xdbm.IndexEntry;
+import org.apache.directory.server.xdbm.Store;
+import org.apache.directory.server.xdbm.Index;
+import org.apache.directory.server.schema.registries.Registries;
+
+import javax.naming.directory.Attributes;
+import javax.naming.directory.Attribute;
+import java.util.Iterator;
+
+
+/**
+ * An Evaluator which determines if candidates are matched by GreaterEqNode
+ * assertions.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+public class PresenceEvaluator implements Evaluator<PresenceNode, Attributes>
+{
+    private final PresenceNode node;
+    private final Store<Attributes> db;
+    private final Registries registries;
+    private final AttributeType type;
+    private final Index<String,Attributes> idx;
+
+
+    public PresenceEvaluator( PresenceNode node, Store<Attributes> db, Registries registries )
+        throws Exception
+    {
+        this.db = db;
+        this.node = node;
+        this.registries = registries;
+
+        if ( db.hasUserIndexOn( node.getAttribute() ) )
+        {
+            idx = db.getExistanceIndex();
+            type = null;
+        }
+        else
+        {
+            idx = null;
+            type = registries.getAttributeTypeRegistry().lookup( node.getAttribute() );
+        }
+    }
+
+
+    public PresenceNode getExpression()
+    {
+        return node;
+    }
+
+
+    public boolean evaluate( IndexEntry<?,Attributes> indexEntry ) throws Exception
+    {
+        if ( idx != null )
+        {
+            return idx.has( type.getOid(), indexEntry.getId() );
+        }
+
+        Attributes entry = indexEntry.getObject();
+
+        // resuscitate the entry if it has not been and set entry in IndexEntry
+        if ( null == entry )
+        {
+            entry = db.lookup( indexEntry.getId() );
+            indexEntry.setObject( entry );
+        }
+
+        // get the attribute
+        Attribute attr = AttributeUtils.getAttribute( entry, type );
+
+        // if the attribute exists just return true
+        if ( attr != null )
+        {
+            return true;
+        }
+
+        // If we do not have the attribute, loop through the sub classes of
+        // the attributeType.  Perhaps the entry has an attribute value of a
+        // subtype (descendant) that will produce a match
+        if ( registries.getAttributeTypeRegistry().hasDescendants( node.getAttribute() ) )
+        {
+            // TODO check to see if descendant handling is necessary for the
+            // index so we can match properly even when for example a name
+            // attribute is used instead of more specific commonName
+            Iterator<AttributeType> descendants =
+                registries.getAttributeTypeRegistry().descendants( node.getAttribute() );
+
+            while ( descendants.hasNext() )
+            {
+                AttributeType descendant = descendants.next();
+
+                attr = AttributeUtils.getAttribute( entry, descendant );
+
+                if ( attr != null )
+                {
+                    return true;
+                }
+            }
+        }
+
+        // we fell through so a match was not found - assertion was false.
+        return false;
+    }
+}
\ No newline at end of file

Modified: directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/SubstringCursor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/SubstringCursor.java?rev=642490&r1=642489&r2=642490&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/SubstringCursor.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/SubstringCursor.java Fri Mar 28 19:22:16 2008
@@ -50,7 +50,7 @@
     public SubstringCursor( Store<Attributes> db,
                             final SubstringEvaluator substringEvaluator ) throws Exception
     {
-        SubstringNode node = ( SubstringNode ) substringEvaluator.getExpression();
+        SubstringNode node = substringEvaluator.getExpression();
 
         if ( db.hasUserIndexOn( node.getAttribute() ) )
         {

Modified: directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/SubstringEvaluator.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/SubstringEvaluator.java?rev=642490&r1=642489&r2=642490&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/SubstringEvaluator.java (original)
+++ directory/sandbox/akarasulu/bigbang/apacheds/xdbm-search/src/main/java/org/apache/directory/server/xdbm/search/impl/SubstringEvaluator.java Fri Mar 28 19:22:16 2008
@@ -32,7 +32,6 @@
 import org.apache.directory.server.xdbm.IndexEntry;
 import org.apache.directory.server.xdbm.Store;
 import org.apache.directory.server.core.cursor.Cursor;
-import org.apache.directory.shared.ldap.filter.ExprNode;
 import org.apache.directory.shared.ldap.filter.SubstringNode;
 import org.apache.directory.shared.ldap.schema.AttributeType;
 import org.apache.directory.shared.ldap.schema.MatchingRule;
@@ -46,7 +45,7 @@
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$
  */
-public class SubstringEvaluator implements Evaluator<Attributes>
+public class SubstringEvaluator implements Evaluator<SubstringNode,Attributes>
 {
     /** Database used while evaluating candidates */
     private final Store<Attributes> db;
@@ -64,7 +63,7 @@
 
     private final Normalizer normalizer;
 
-    private final Index idx;
+    private final Index<String,Attributes> idx;
 
 
     /**
@@ -97,6 +96,7 @@
 
         if ( db.hasUserIndexOn( node.getAttribute() ) )
         {
+            //noinspection unchecked
             idx = db.getUserIndex( node.getAttribute() );
         }
         else
@@ -129,7 +129,7 @@
     }
 
 
-    public ExprNode getExpression()
+    public SubstringNode getExpression()
     {
         return node;
     }
@@ -143,8 +143,7 @@
          * Otherwise we would have to scan the entire index if there were
          * no reverse lookups.
          */
-        //noinspection unchecked
-        Cursor<IndexEntry<?,Attributes>> entries = idx.reverseCursor( indexEntry.getId() );
+        Cursor<IndexEntry<String,Attributes>> entries = idx.reverseCursor( indexEntry.getId() );
 
         // cycle through the attribute values testing for a match
         while ( entries.next() )

Modified: directory/sandbox/akarasulu/bigbang/shared/ldap/src/main/java/org/apache/directory/shared/ldap/filter/LeafNode.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/bigbang/shared/ldap/src/main/java/org/apache/directory/shared/ldap/filter/LeafNode.java?rev=642490&r1=642489&r2=642490&view=diff
==============================================================================
--- directory/sandbox/akarasulu/bigbang/shared/ldap/src/main/java/org/apache/directory/shared/ldap/filter/LeafNode.java (original)
+++ directory/sandbox/akarasulu/bigbang/shared/ldap/src/main/java/org/apache/directory/shared/ldap/filter/LeafNode.java Fri Mar 28 19:22:16 2008
@@ -36,7 +36,6 @@
      * Creates a leaf node.
      * 
      * @param attribute the attribute this node is based on
-     * @param type the type of this leaf node
      */
     protected LeafNode( String attribute )
     {
@@ -109,11 +108,12 @@
             return false;
         }
 
+        //noinspection SimplifiableIfStatement
         if ( other.getClass() != this.getClass() )
         {
         	return false;
         }
-            
+
         return attribute.equals( ( ( LeafNode ) other ).getAttribute() );
     }