directory-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alex Karasulu <akaras...@gmail.com>
Subject Re: [SHARED] Is there an easy way to compare filters, some with OID and some without?
Date Wed, 18 Feb 2009 15:37:58 GMT
On Wed, Feb 18, 2009 at 10:25 AM, Hammond, Steve
<steve.hammond@polycom.com>wrote:

>  I am trying to compare 2 filters (ExprNode), it happens to be an and
> clause, but that is irrelevant.
>
>
>
> So my code is *if* ( filter.equals(*groupUnimporte**d))   // special
> filter case.*
>
> * *
>
> The problem is that when it gets to this code filter =
> (&(2.5.4.0=group)(!(1.2.840.113556.1.4.26=-1)))
>
> And groupUnimported= (&(objectClass=group)(!(ugpid=-1)))
>
>
>
> I can look at those and know they are equal.  Is there some normalizer I
> can run the 2 ExprNodes thru before doing the equals?  I don't want to do 4
> separate equals tests, especially if we start to get bigger filters that end
> up as special cases.
>
You're in luck Steve. You can use the following visitor implementation to
perform normalized comparisons of filter expressions.  This was specifically
written to match for equivalent logical expressions that may have term order
variations.

Here take a look:

    http://ahkaek.notlong.com/

This BranchNormalizedVisitor will normalize the order of terms in a filter
branch (OR / AND nodes only) without effecting the logic of the filter.
After doing this the filter can be dumped to a string and compared.

In addition to this you'll want to normalize attributes to OID's which is
easy to do if you have access to the schema.  Just write another visitor to
change the attribute alias names in leaf nodes to their respective OID value
using the lookup method in AttriuteTypeRegistry.

HTH,
Alex

Mime
View raw message