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

Matthew Swift
29.13.2015 bdc34b39ae76a66f786bbb6d46b20e0785bb99e7
OPENDJ-2328: Optimize UUID equality matching rule indexing

Fix entryUUID virtual attribute provider so that it normalizes both the
assertion value and attribute value before comparing. Previously it was
not normalizing the assertion value. A correct and reasonably efficient
implementation is provided in VirtualAttributeProvider, so removing the
bad overridden implementation is sufficient.
1 files modified
30 ■■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/server/extensions/EntryUUIDVirtualAttributeProvider.java 30 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/extensions/EntryUUIDVirtualAttributeProvider.java
@@ -32,11 +32,9 @@
import java.util.UUID;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ConditionResult;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.schema.MatchingRule;
import org.opends.server.admin.std.server.EntryUUIDVirtualAttributeCfg;
import org.opends.server.api.VirtualAttributeProvider;
import org.opends.server.core.SearchOperation;
@@ -56,8 +54,6 @@
public class EntryUUIDVirtualAttributeProvider
       extends VirtualAttributeProvider<EntryUUIDVirtualAttributeCfg>
{
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
  /**
   * Creates a new instance of this entryUUID virtual attribute provider.
   */
@@ -80,13 +76,9 @@
  @Override
  public Attribute getValues(Entry entry, VirtualAttributeRule rule)
  {
    return Attributes.create(rule.getAttributeType(), getUUIDString(entry));
  }
  private String getUUIDString(Entry entry)
  {
    ByteString normDN = entry.getName().toNormalizedByteString();
    return UUID.nameUUIDFromBytes(normDN.toByteArray()).toString();
    String uuid = UUID.nameUUIDFromBytes(normDN.toByteArray()).toString();
    return Attributes.create(rule.getAttributeType(), uuid);
  }
  /** {@inheritDoc} */
@@ -99,24 +91,6 @@
  /** {@inheritDoc} */
  @Override
  public boolean hasValue(Entry entry, VirtualAttributeRule rule, ByteString value)
  {
    MatchingRule matchingRule = rule.getAttributeType().getEqualityMatchingRule();
    try
    {
      String uuidString = getUUIDString(entry);
      ByteString normValue = matchingRule.normalizeAttributeValue(value);
      return uuidString.equals(normValue.toString());
    }
    catch (Exception e)
    {
      logger.traceException(e);
      return false;
    }
  }
  /** {@inheritDoc} */
  @Override
  public ConditionResult matchesSubstring(Entry entry,
                                          VirtualAttributeRule rule,
                                          ByteString subInitial,