From e63819ecedabbbac87514c1377c120c71fe7ffa4 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Fri, 24 Jun 2016 14:29:28 +0000
Subject: [PATCH] OPENDJ-2965 Simplify OR and AND filters when only one element is provided in the expression
---
opendj-server-legacy/src/main/java/org/opends/server/types/SearchFilter.java | 4 ++++
opendj-server-legacy/src/main/java/org/opends/server/protocols/ldap/LDAPFilter.java | 8 +++++++-
opendj-server-legacy/src/test/java/org/opends/server/types/SearchFilterTests.java | 9 +++++----
3 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/protocols/ldap/LDAPFilter.java b/opendj-server-legacy/src/main/java/org/opends/server/protocols/ldap/LDAPFilter.java
index 63a0a7a..66e3d4a 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/protocols/ldap/LDAPFilter.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/protocols/ldap/LDAPFilter.java
@@ -1866,7 +1866,13 @@
}
else
{
- subComps = new ArrayList<>(filterComponents.size());
+ int compSize = filterComponents.size();
+ if (compSize == 1)
+ {
+ // the filter can be simplified to the single component
+ return filterComponents.get(0).toSearchFilter();
+ }
+ subComps = new ArrayList<>(compSize);
for (RawFilter f : filterComponents)
{
subComps.add(f.toSearchFilter());
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/types/SearchFilter.java b/opendj-server-legacy/src/main/java/org/opends/server/types/SearchFilter.java
index acbb488..b0870d3 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/types/SearchFilter.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/types/SearchFilter.java
@@ -1107,6 +1107,10 @@
return new SearchFilter(filterType, null, notComponent, null,
null, null, null, null, null, false);
}
+ else if ((filterType == FilterType.AND || filterType == FilterType.OR) && filterComponents.size() == 1)
+ {
+ return filterComponents.get(0);
+ }
else
{
return new SearchFilter(filterType, filterComponents, null,
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/types/SearchFilterTests.java b/opendj-server-legacy/src/test/java/org/opends/server/types/SearchFilterTests.java
index 6853b1c..846fba7 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/types/SearchFilterTests.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/types/SearchFilterTests.java
@@ -83,8 +83,9 @@
{"(!(sn=test))", "(!(sn=test))"},
{"(|(sn=test)(sn=test2))", "(|(sn=test)(sn=test2))"},
- {"(&(sn=test))", "(&(sn=test))"},
- {"(|(sn=test))", "(|(sn=test))"},
+ {"(&(sn=test))", "(sn=test)"},
+ {"(|(sn=test))", "(sn=test)"},
+ {"(&(objectclass=person)(|(sn=test)))", "(&(objectClass=person)(sn=test))"},
};
}
@@ -861,8 +862,8 @@
private static final Object[][] TEST_EQUALS_PARAMS = new Object[][]{
// These have duplicates, and their String representation should even reflect that.
- {"(&(sn=Smith))", "(&(sn=Smith)(sn=Smith))", true, true},
- {"(|(sn=Smith))", "(|(sn=Smith)(sn=Smith))", true, true},
+ {"(&(sn=Smith))", "(sn=Smith)", true, true},
+ {"(|(sn=Smith))", "(sn=Smith)", true, true},
// These are reordered, so they are equivalent, but their String representations will differ
{"(&(sn=Smith)(sn<=Aus))", "(&(sn<=Aus)(sn=Smith))", true, false},
--
Gitblit v1.10.0