opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
@@ -31,6 +31,7 @@ import org.opends.server.types.*; import java.util.*; import org.opends.server.api.SubstringMatchingRule; /** * An implementation of an Indexer for attribute substrings. @@ -161,18 +162,21 @@ Set<byte[]> keys) { if (attrList == null) return; for (Attribute attr : attrList) { if (attr.isVirtual()) { continue; } //Get the substring matching rule. SubstringMatchingRule rule = attr.getAttributeType().getSubstringMatchingRule(); for (AttributeValue value : attr) { try { byte[] normalizedBytes = value.getNormalizedValue().toByteArray(); byte[] normalizedBytes = rule.normalizeValue(value.getValue()). toByteArray(); substringKeys(normalizedBytes, keys); } @@ -249,11 +253,16 @@ { continue; } //Get the substring matching rule. SubstringMatchingRule rule = attr.getAttributeType().getSubstringMatchingRule(); for (AttributeValue value : attr) { try { byte[] normalizedBytes = value.getNormalizedValue().toByteArray(); byte[] normalizedBytes = rule.normalizeValue(value.getValue()) .toByteArray(); substringKeys(normalizedBytes, modifiedKeys, insert); } opends/src/server/org/opends/server/controls/MatchedValuesFilter.java
@@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2006-2009 Sun Microsystems, Inc. * Copyright 2006-2010 Sun Microsystems, Inc. */ package org.opends.server.controls; import org.opends.messages.Message; @@ -1357,7 +1357,8 @@ new ArrayList<ByteSequence>(normalizedSubAny); return substringMatchingRule.valueMatchesSubstring( value.getNormalizedValue(), normalizedSubInitial, substringMatchingRule.normalizeValue(value.getValue()), normalizedSubInitial, normalizedSubAnyBS, normalizedSubFinal); } catch (Exception e) @@ -1385,7 +1386,8 @@ { return (orderingMatchingRule.compareValues( assertionValue.getNormalizedValue(), value.getNormalizedValue()) >= 0); orderingMatchingRule.normalizeValue( value.getValue())) >= 0); } catch (Exception e) { @@ -1412,7 +1414,8 @@ { return (orderingMatchingRule.compareValues( assertionValue.getNormalizedValue(), value.getNormalizedValue()) <= 0); orderingMatchingRule.normalizeValue( value.getValue())) <= 0); } catch (Exception e) { @@ -1445,7 +1448,7 @@ ByteString nv1 = approximateMatchingRule.normalizeValue( assertionValue.getNormalizedValue()); ByteString nv2 = approximateMatchingRule.normalizeValue( value.getNormalizedValue()); approximateMatchingRule.normalizeValue(value.getValue())); return approximateMatchingRule.approximatelyMatch(nv1, nv2); } opends/src/server/org/opends/server/replication/plugin/HistoricalCsnOrderingMatchingRule.java
@@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2006-2009 Sun Microsystems, Inc. * Copyright 2006-2010 Sun Microsystems, Inc. */ package org.opends.server.replication.plugin; @@ -67,13 +67,7 @@ */ public int compareValues(ByteSequence value1, ByteSequence value2) { String[] token1 = value1.toString().split(":", 3); String[] token2 = value2.toString().split(":", 3); if ((token1[1] == null) || (token2[1] == null)) return -1; return token1[1].compareTo(token2[1]); return value1.compareTo(value2); } @@ -136,7 +130,6 @@ @Override public ByteString normalizeValue(ByteSequence value) { String[] token = value.toString().split(":", 3); /* Change the format of the value to index and start opends/src/server/org/opends/server/types/AttributeBuilder.java
@@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2006-2009 Sun Microsystems, Inc. * Copyright 2006-2010 Sun Microsystems, Inc. */ package org.opends.server.types; @@ -275,7 +275,8 @@ ByteString normalizedValue; try { normalizedValue = value.getNormalizedValue(); normalizedValue = matchingRule.normalizeValue(value.getValue()); } catch (Exception e) { @@ -294,7 +295,8 @@ { try { ByteString nv = v.getNormalizedValue(); ByteString nv = matchingRule.normalizeValue(v.getValue()); int comparisonResult = matchingRule .compareValues(nv, normalizedValue); if (comparisonResult >= 0) @@ -357,7 +359,8 @@ ByteString normalizedValue; try { normalizedValue = value.getNormalizedValue(); normalizedValue = matchingRule.normalizeValue(value.getValue()); } catch (Exception e) { @@ -376,7 +379,7 @@ { try { ByteString nv = v.getNormalizedValue(); ByteString nv = matchingRule.normalizeValue(v.getValue()); int comparisonResult = matchingRule .compareValues(nv, normalizedValue); if (comparisonResult <= 0) @@ -502,7 +505,8 @@ try { if (matchingRule.valueMatchesSubstring( value.getNormalizedValue(), attributeType.getSubstringMatchingRule(). normalizeValue(value.getValue()), normalizedSubInitial, normalizedSubAny, normalizedSubFinal)) opends/tests/unit-tests-testng/src/server/org/opends/server/schema/AttributeTypeSyntaxTest.java
@@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2006-2009 Sun Microsystems, Inc. * Copyright 2006-2010 Sun Microsystems, Inc. */ package org.opends.server.schema; @@ -34,6 +34,15 @@ import org.opends.server.types.AttributeType; import org.opends.server.types.ByteString; import org.opends.messages.MessageBuilder; import java.util.ArrayList; import org.opends.server.TestCaseUtils; import org.opends.server.protocols.internal.InternalClientConnection; import org.opends.server.protocols.internal.InternalSearchOperation; import org.opends.server.protocols.ldap.LDAPFilter; import org.opends.server.types.Control; import org.opends.server.types.DereferencePolicy; import org.opends.server.types.ResultCode; import org.opends.server.types.SearchScope; import static org.testng.Assert.*; @@ -149,5 +158,67 @@ assertNotNull(attrType.getApproximateMatchingRule()); assertEquals(attrType.getApproximateMatchingRule(), testApproxRule); } /** * Tests a situation when two radically different equality and substring * matching rules (such as Case Ignore and Case Exact) are used to define an * attribute description. For more information, look at the issue# 4468 in * Issue Tracker. * * @throws Exception In case of an error. */ @Test() public void testMixedEqualityAndSubstringMatchingRules() throws Exception { //Add an attribute with directory string syntax. int resultCode = TestCaseUtils.applyModifications(true, "dn: cn=schema", "changetype: modify", "add: attributetypes", "attributeTypes: ( gvRights-oid NAME 'gvRights' DESC 'x attr' EQUALITY " + "caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR " + "caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 " + "USAGE userApplications )", "-", "add: objectclasses", "objectClasses: ( gvRightsTest-oid NAME 'gvRightsTest' DESC 'Test' SUP top AUXILIARY " + "MUST ( objectClass $ gvRights ) )"); assertTrue(resultCode == 0); TestCaseUtils.initializeTestBackend(true); //add the test entry. TestCaseUtils.addEntry( "dn: cn=gvrightstest,o=test", "objectclass: person", "objectclass: gvRightsTest", "cn: gvrightstest", "sn: test", "gvRights: gvApplId=test2,ou=Applications,dc=bla$test2-T"); //Search for the entry using substring matching rule filter. InternalClientConnection conn = InternalClientConnection.getRootConnection(); InternalSearchOperation searchOperation = new InternalSearchOperation( conn, InternalClientConnection.nextOperationID(), InternalClientConnection.nextMessageID(), new ArrayList<Control>(), ByteString.valueOf("cn=gvrightstest,o=test"), SearchScope.WHOLE_SUBTREE, DereferencePolicy.NEVER_DEREF_ALIASES, Integer.MAX_VALUE, Integer.MAX_VALUE, false, LDAPFilter.decode("(&(gvrights=*ApplId=test2,ou=*)" + "(gvrights=*test2,ou=A*))"), null, null); searchOperation.run(); assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(searchOperation.getEntriesSent(), 1); } }