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