I have one question. Why do you suggest dumping to a string to compare when there is an equals function on ExprNode already?
From: Alex Karasulu [mailto:email@example.com]
Sent: Wednesday, February 18, 2009 8:38 AM
To: Apache Directory Developers List
Subject: Re: [SHARED] Is there an easy way to compare filters, some with OID and some without?
On Wed, Feb 18, 2009 at 10:25 AM, Hammond, Steve <firstname.lastname@example.org> 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(groupUnimported)) // special filter case.
The problem is that when it gets to this code filter = (&(18.104.22.168=group)(!(1.2.840.113522.214.171.124=-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:
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.