mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Jean-Noël Rouvignac
24.27.2015 5f4f429bcbd2638da1b0548705371416a9fc0a94
Fix VLV index / server side control tests
5 files modified
234 ■■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java 2 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java 6 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/types/SortKey.java 17 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/ControlsTestCase.java 16 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/controls/ServerSideSortControlTestCase.java 193 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
@@ -279,6 +279,7 @@
    @Override
    public boolean isConfigurationAddAcceptable(BackendVLVIndexCfg cfg, List<LocalizableMessage> unacceptableReasons)
    {
      // TODO JNR remove du-plication
      try
      {
        SearchFilter.createFilterFromString(cfg.getFilter());
@@ -316,6 +317,7 @@
          unacceptableReasons.add(ERR_CONFIG_VLV_INDEX_UNDEFINED_ATTR.get(sortAttrs[i], cfg.getName()));
          return false;
        }
        // TODO Add ordering matching rule null check
        sortKeys[i] = new SortKey(attrType, ascending[i]);
      }
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
@@ -178,6 +178,7 @@
  public synchronized boolean isConfigurationChangeAcceptable(final BackendVLVIndexCfg cfg,
      final List<LocalizableMessage> unacceptableReasons)
  {
    // TODO JNR remove duplication
    try
    {
      SearchFilter.createFilterFromString(cfg.getFilter());
@@ -324,6 +325,7 @@
      {
        throw new ConfigException(ERR_CONFIG_VLV_INDEX_UNDEFINED_ATTR.get(sortAttrs[i], getName()));
      }
      // TODO Add ordering matching rule null check
      sortKeys[i] = new SortKey(attrType, ascending);
    }
    return sortKeys;
@@ -606,7 +608,7 @@
       * include some escaped bytes as well. 10 extra bytes should accommodate most inputs.
       */
      final ByteStringBuilder encodedPrimaryKey = new ByteStringBuilder(assertion.length() + 10);
      final MatchingRule matchingRule = primarySortKey.getAttributeType().getOrderingMatchingRule();
      final MatchingRule matchingRule = primarySortKey.getEffectiveOrderingRule();
      final ByteString normalizedAttributeValue = matchingRule.normalizeAttributeValue(assertion);
      encodeVLVKeyValue(normalizedAttributeValue, encodedPrimaryKey, primarySortKey.ascending());
      return encodedPrimaryKey;
@@ -767,7 +769,7 @@
    for (final SortKey sortKey : sortOrder.getSortKeys())
    {
      final AttributeType attributeType = sortKey.getAttributeType();
      final MatchingRule matchingRule = attributeType.getOrderingMatchingRule();
      final MatchingRule matchingRule = sortKey.getEffectiveOrderingRule();
      final List<Attribute> attrList = entry.getAttribute(attributeType);
      ByteString sortValue = null;
      if (attrList != null)
opendj-server-legacy/src/main/java/org/opends/server/types/SortKey.java
@@ -51,10 +51,8 @@
  /** The attribute type for this sort key. */
  private AttributeType attributeType;
  /** The indication of whether the sort should be ascending. */
  private boolean ascending;
  /** The ordering matching rule to use with this sort key. */
  private MatchingRule orderingRule;
@@ -69,10 +67,7 @@
   */
  public SortKey(AttributeType attributeType, boolean ascending)
  {
    this.attributeType = attributeType;
    this.ascending     = ascending;
    orderingRule = null;
    this(attributeType, ascending, null);
  }
@@ -132,7 +127,15 @@
    return orderingRule;
  }
  /**
   * Retrieves the ordering matching rule to use with this sort key.
   *
   * @return The ordering matching rule to use with this sort key.
   */
  public MatchingRule getEffectiveOrderingRule()
  {
    return orderingRule != null ? orderingRule : attributeType.getOrderingMatchingRule();
  }
  /**
   * Compares the provided values using this sort key.
opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/ControlsTestCase.java
@@ -91,7 +91,7 @@
    user(givenNames("William", "Bill"),    surname("Beak"),        employeeNumber(4)),
    user(givenNames(),                     surname("Prince"),      employeeNumber(5)),
    user(givenNames("Charlie"),            surname("Chalk"),       employeeNumber(6)),
    user(givenNames("Albert"),             surname("Einstein"),    employeeNumber(7)),
    user(givenNames("Albert"),             surname("DEinstein"),   employeeNumber(7)),
    user(givenNames("Mini"),               surname("Mouse"),       employeeNumber(8)),
  };
  // @formatter:on
@@ -107,6 +107,9 @@
  /** Unindexed: ordered by ascending sn and ascending employee number then entryID */
  private static final String SORT_ORDER_3 = "sn employeeNumber";
  /** Indexed: ordered by ascending givenName then entryID */
  private static final String SORT_ORDER_4 = "surname:caseExactOrderingMatch";
  /** Ordered by {@link #SORT_ORDER_1} */
  private static final List<Integer> USERS_BY_ENTRY_ID = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8);
@@ -119,6 +122,9 @@
  /** Unindexed: ordered by {@link #SORT_ORDER_3} */
  private static final List<Integer> USERS_BY_SORT_ORDER_3 = Arrays.asList(4, 6, 1, 7, 3, 8, 5, 2, 0);
  /** Unindexed: ordered by {@link #SORT_ORDER_4} */
  private static final List<Integer> USERS_BY_SORT_ORDER_4 = Arrays.asList(4, 6, 7, 3, 8, 5, 2, 0, 1);
  private PDBBackend backend;
  @BeforeClass
@@ -443,6 +449,14 @@
        USERS_BY_SORT_ORDER_3.subList(9, 9),            // nothing
        expectedPosition(10)
      },
      {
        SORT_ORDER_4,
        beforeCount(0),
        afterCount(10),
        assertion("A"),                                 // before all
        USERS_BY_SORT_ORDER_4,                          // everything
        expectedPosition(1)
      },
    };
    // @formatter:on
  }
opendj-server-legacy/src/test/java/org/opends/server/controls/ServerSideSortControlTestCase.java
@@ -27,6 +27,7 @@
package org.opends.server.controls;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
@@ -34,7 +35,6 @@
import org.forgerock.opendj.ldap.SearchScope;
import org.opends.server.TestCaseUtils;
import org.opends.server.core.DirectoryServer;
import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.protocols.internal.InternalSearchOperation;
import org.opends.server.protocols.internal.SearchRequest;
import org.opends.server.protocols.ldap.LDAPControl;
@@ -289,29 +289,16 @@
  public void testInternalSearchGivenNameAscending()
         throws Exception
  {
    populateDB();
    InternalClientConnection conn = getRootConnection();
    SearchRequest request = newSearchRequest("dc=example,dc=com", SearchScope.WHOLE_SUBTREE, "(objectClass=person)")
        .addControl(new ServerSideSortRequestControl("givenName"));
    InternalSearchOperation internalSearch = conn.processSearch(request);
    assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
    ArrayList<DN> expectedDNOrder = new ArrayList<>();
    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
    expectedDNOrder.add(aaronZimmermanDN);  // Aaron
    expectedDNOrder.add(albertZimmermanDN); // Albert, lower entry ID
    expectedDNOrder.add(albertSmithDN);     // Albert, higher entry ID
    expectedDNOrder.add(lowercaseMcGeeDN);  // lowercase
    expectedDNOrder.add(margaretJonesDN);   // Maggie
    expectedDNOrder.add(maryJonesDN);       // Mary
    expectedDNOrder.add(samZweckDN);        // Sam
    expectedDNOrder.add(zorroDN);           // No first name
    assertEquals(getDNs(internalSearch.getSearchEntries()), expectedDNOrder);
    assertNoAttributeTypeForSort(internalSearch);
    testInternalSearchWithSort("givenName",
        aaccfJohnsonDN,    // Aaccf
        aaronZimmermanDN,  // Aaron
        albertZimmermanDN, // Albert, lower entry ID
        albertSmithDN,     // Albert, higher entry ID
        lowercaseMcGeeDN,  // lowercase
        margaretJonesDN,   // Maggie
        maryJonesDN,       // Mary
        samZweckDN,        // Sam
        zorroDN);          // No first name
  }
  /**
@@ -324,27 +311,16 @@
  @Test
  public void testInternalSearchGivenNameAscendingCaseExact() throws Exception
  {
    populateDB();
    SearchRequest request = newSearchRequest("dc=example,dc=com", SearchScope.WHOLE_SUBTREE, "(objectClass=person)")
        .addControl(new ServerSideSortRequestControl("givenName:caseExactOrderingMatch"));
    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
    assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
    ArrayList<DN> expectedDNOrder = new ArrayList<>();
    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
    expectedDNOrder.add(aaronZimmermanDN);  // Aaron
    expectedDNOrder.add(albertZimmermanDN); // Albert, lower entry ID
    expectedDNOrder.add(albertSmithDN);     // Albert, higher entry ID
    expectedDNOrder.add(margaretJonesDN);   // Maggie
    expectedDNOrder.add(maryJonesDN);       // Mary
    expectedDNOrder.add(samZweckDN);        // Sam
    expectedDNOrder.add(lowercaseMcGeeDN);  // lowercase
    expectedDNOrder.add(zorroDN);           // No first name
    assertEquals(getDNs(internalSearch.getSearchEntries()), expectedDNOrder);
    assertNoAttributeTypeForSort(internalSearch);
    testInternalSearchWithSort("givenName:caseExactOrderingMatch",
        aaccfJohnsonDN,    // Aaccf
        aaronZimmermanDN,  // Aaron
        albertZimmermanDN, // Albert, lower entry ID
        albertSmithDN,     // Albert, higher entry ID
        margaretJonesDN,   // Maggie
        maryJonesDN,       // Mary
        samZweckDN,        // Sam
        lowercaseMcGeeDN,  // lowercase
        zorroDN);          // No first name
  }
  /**
@@ -356,31 +332,18 @@
  @Test
  public void testInternalSearchGivenNameDescending() throws Exception
  {
    populateDB();
    SearchRequest request = newSearchRequest("dc=example,dc=com", SearchScope.WHOLE_SUBTREE, "(objectClass=person)")
        .addControl(new ServerSideSortRequestControl("-givenName"));
    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
    assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
    ArrayList<DN> expectedDNOrder = new ArrayList<>();
    expectedDNOrder.add(aaronZimmermanDN);  // Zeke
    expectedDNOrder.add(samZweckDN);        // Sam
    expectedDNOrder.add(maryJonesDN);       // Mary
    expectedDNOrder.add(margaretJonesDN);   // Margaret
    expectedDNOrder.add(lowercaseMcGeeDN);  // lowercase
    expectedDNOrder.add(albertZimmermanDN); // Albert, lower entry ID
    expectedDNOrder.add(albertSmithDN);     // Albert, higher entry ID
    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
    expectedDNOrder.add(zorroDN);           // No first name
    assertEquals(getDNs(internalSearch.getSearchEntries()), expectedDNOrder);
    assertNoAttributeTypeForSort(internalSearch);
    testInternalSearchWithSort("-givenName",
        zorroDN,           // No first name
        samZweckDN,        // Sam
        maryJonesDN,       // Mary
        margaretJonesDN,   // Margaret
        lowercaseMcGeeDN,  // lowercase
        albertZimmermanDN, // Albert, lower entry ID
        albertSmithDN,     // Albert, higher entry ID
        aaronZimmermanDN,  // Aaron
        aaccfJohnsonDN);   // Aaccf
  }
  /**
   * Tests performing an internal search using the server-side sort control to
   * sort the entries in order of descending givenName values using a specific
@@ -391,32 +354,18 @@
  @Test
  public void testInternalSearchGivenNameDescendingCaseExact() throws Exception
  {
    populateDB();
    SearchRequest request = newSearchRequest("dc=example,dc=com", SearchScope.WHOLE_SUBTREE, "(objectClass=person)")
        .addControl(new ServerSideSortRequestControl("-givenName:caseExactOrderingMatch"));
    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
    assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
    ArrayList<DN> expectedDNOrder = new ArrayList<>();
    expectedDNOrder.add(lowercaseMcGeeDN);  // lowercase
    expectedDNOrder.add(aaronZimmermanDN);  // Zeke
    expectedDNOrder.add(samZweckDN);        // Sam
    expectedDNOrder.add(maryJonesDN);       // Mary
    expectedDNOrder.add(margaretJonesDN);   // Margaret
    expectedDNOrder.add(albertZimmermanDN); // Albert, lower entry ID
    expectedDNOrder.add(albertSmithDN);     // Albert, higher entry ID
    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
    expectedDNOrder.add(zorroDN);           // No first name
    assertEquals(getDNs(internalSearch.getSearchEntries()), expectedDNOrder);
    assertNoAttributeTypeForSort(internalSearch);
    testInternalSearchWithSort("-givenName:caseExactOrderingMatch",
        zorroDN,           // No first name
        lowercaseMcGeeDN,  // lowercase
        samZweckDN,        // Sam
        maryJonesDN,       // Mary
        margaretJonesDN,   // Margaret
        albertZimmermanDN, // Albert, lower entry ID
        albertSmithDN,     // Albert, higher entry ID
        aaronZimmermanDN,  // Aaron
        aaccfJohnsonDN);   // Aaccf
  }
  /**
   * Tests performing an internal search using the server-side sort control to
   * sort the entries in order of ascending givenName and ascending sn values.
@@ -426,27 +375,16 @@
  @Test
  public void testInternalSearchGivenNameAscendingSnAscending() throws Exception
  {
    populateDB();
    SearchRequest request = newSearchRequest("dc=example,dc=com", SearchScope.WHOLE_SUBTREE, "(objectClass=person)")
        .addControl(new ServerSideSortRequestControl("givenName,sn"));
    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
    assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
    ArrayList<DN> expectedDNOrder = new ArrayList<>();
    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
    expectedDNOrder.add(aaronZimmermanDN);  // Aaron
    expectedDNOrder.add(albertSmithDN);     // Albert, lower sn
    expectedDNOrder.add(albertZimmermanDN); // Albert, higher sn
    expectedDNOrder.add(lowercaseMcGeeDN);  // lowercase
    expectedDNOrder.add(margaretJonesDN);   // Maggie
    expectedDNOrder.add(maryJonesDN);       // Mary
    expectedDNOrder.add(samZweckDN);        // Sam
    expectedDNOrder.add(zorroDN);           // No first name
    assertEquals(getDNs(internalSearch.getSearchEntries()), expectedDNOrder);
    assertNoAttributeTypeForSort(internalSearch);
    testInternalSearchWithSort("givenName,sn",
        aaccfJohnsonDN,    // Aaccf
        aaronZimmermanDN,  // Aaron
        albertSmithDN,     // Albert, lower sn
        albertZimmermanDN, // Albert, higher sn
        lowercaseMcGeeDN,  // lowercase
        margaretJonesDN,   // Maggie
        maryJonesDN,       // Mary
        samZweckDN,        // Sam
        zorroDN);          // No first name
  }
  /**
@@ -459,25 +397,28 @@
  public void testInternalSearchGivenNameAscendingSnDescending()
         throws Exception
  {
    testInternalSearchWithSort("givenName,-sn",
        aaccfJohnsonDN,    // Aaccf
        aaronZimmermanDN,  // Aaron
        albertZimmermanDN, // Albert, higher sn
        albertSmithDN,     // Albert, lower sn
        lowercaseMcGeeDN,  // lowercase
        margaretJonesDN,   // Maggie
        maryJonesDN,       // Mary
        samZweckDN,        // Sam
        zorroDN);          // No first name
  }
  private void testInternalSearchWithSort(String sortOrderString, DN... expectedDNOrder) throws Exception
  {
    populateDB();
    SearchRequest request = newSearchRequest("dc=example,dc=com", SearchScope.WHOLE_SUBTREE, "(objectClass=person)")
        .addControl(new ServerSideSortRequestControl("givenName,-sn"));
        .addControl(new ServerSideSortRequestControl(sortOrderString));
    InternalSearchOperation internalSearch = getRootConnection().processSearch(request);
    assertEquals(internalSearch.getResultCode(), ResultCode.SUCCESS);
    ArrayList<DN> expectedDNOrder = new ArrayList<>();
    expectedDNOrder.add(aaccfJohnsonDN);    // Aaccf
    expectedDNOrder.add(aaronZimmermanDN);  // Aaron
    expectedDNOrder.add(albertZimmermanDN); // Albert, higher sn
    expectedDNOrder.add(albertSmithDN);     // Albert, lower sn
    expectedDNOrder.add(lowercaseMcGeeDN);  // lowercase
    expectedDNOrder.add(margaretJonesDN);   // Maggie
    expectedDNOrder.add(maryJonesDN);       // Mary
    expectedDNOrder.add(samZweckDN);        // Sam
    expectedDNOrder.add(zorroDN);           // No first name
    assertEquals(getDNs(internalSearch.getSearchEntries()), expectedDNOrder);
    assertEquals(getDNs(internalSearch.getSearchEntries()), Arrays.asList(expectedDNOrder));
    assertNoAttributeTypeForSort(internalSearch);
  }