From e28ddc3ed27d4352ddc7c476f4e5208b2eb27251 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 06 Mar 2014 23:25:34 +0000
Subject: [PATCH] OPENDJ-1308 Migrate schema support
---
opendj3-server-dev/src/server/org/opends/server/backends/jeb/SubstringIndexer.java | 148 +++++++++++++++++--------------------------------
1 files changed, 52 insertions(+), 96 deletions(-)
diff --git a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/SubstringIndexer.java b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
index c742496..6547454 100644
--- a/opendj3-server-dev/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
+++ b/opendj3-server-dev/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
@@ -27,12 +27,15 @@
package org.opends.server.backends.jeb;
import java.util.Comparator;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.DecodeException;
+import org.forgerock.opendj.ldap.spi.IndexingOptions;
+import org.opends.server.api.ExtensibleIndexer;
import org.opends.server.api.SubstringMatchingRule;
import org.opends.server.types.*;
@@ -56,22 +59,21 @@
* generate index keys.
*/
private AttributeType attributeType;
-
- /**
- * The substring length.
- */
- private int substrLength;
+ private IndexingOptions indexingOptions;
/**
* Create a new attribute substring indexer for the given index configuration.
- * @param attributeType The attribute type for which an indexer is
- * required.
- * @param substringLength The decomposed substring length.
+ *
+ * @param attributeType
+ * The attribute type for which an indexer is required.
+ * @param indexingOptions
+ * The decomposed substring length.
*/
- public SubstringIndexer(AttributeType attributeType, int substringLength)
+ public SubstringIndexer(AttributeType attributeType,
+ IndexingOptions indexingOptions)
{
this.attributeType = attributeType;
- this.substrLength = substringLength;
+ this.indexingOptions = indexingOptions;
}
/**
@@ -169,25 +171,13 @@
if (attrList == null) return;
for (Attribute attr : attrList)
{
- if (attr.isVirtual())
+ if (!attr.isVirtual())
{
- continue;
- }
- //Get the substring matching rule.
- SubstringMatchingRule rule =
- attr.getAttributeType().getSubstringMatchingRule();
- for (AttributeValue value : attr)
- {
- try
+ SubstringMatchingRule rule =
+ attr.getAttributeType().getSubstringMatchingRule();
+ for (AttributeValue value : attr)
{
- byte[] normalizedBytes = rule.normalizeAttributeValue(value.getValue()).
- toByteArray();
-
- substringKeys(normalizedBytes, keys);
- }
- catch (DecodeException e)
- {
- logger.traceException(e);
+ getKeys(rule, value, keys);
}
}
}
@@ -198,24 +188,32 @@
* The ID of the entry containing this value should be inserted
* into the list of each of these keys.
*
- * @param value A byte array containing the normalized attribute value
- * @param set A set into which the keys will be inserted.
+ * @param attrValue A byte array containing the normalized attribute value
+ * @param keys A set into which the keys will be inserted.
*/
- private void substringKeys(byte[] value, Set<byte[]> set)
- {
- byte[] keyBytes;
-
- // Example: The value is ABCDE and the substring length is 3.
- // We produce the keys ABC BCD CDE DE E
- // To find values containing a short substring such as DE,
- // iterate through keys with prefix DE. To find values
- // containing a longer substring such as BCDE, read keys
- // BCD and CDE.
- for (int i = 0, remain = value.length; remain > 0; i++, remain--)
+ private void getKeys(SubstringMatchingRule rule, AttributeValue attrValue,
+ Set<byte[]> keys)
+ { // TODO merge with ExtensibleIndexer.getKeys(attrValue, keys);
+ try
{
- int len = Math.min(substrLength, remain);
- keyBytes = makeSubstringKey(value, i, len);
- set.add(keyBytes);
+ byte[] value = rule.normalizeAttributeValue(attrValue.getValue()).toByteArray();
+
+ // Example: The value is ABCDE and the substring length is 3.
+ // We produce the keys ABC BCD CDE DE E
+ // To find values containing a short substring such as DE,
+ // iterate through keys with prefix DE. To find values
+ // containing a longer substring such as BCDE, read keys
+ // BCD and CDE.
+ final int substringKeySize = indexingOptions.substringKeySize();
+ for (int i = 0, remain = value.length; remain > 0; i++, remain--)
+ {
+ int len = Math.min(substringKeySize, remain);
+ keys.add(makeSubstringKey(value, i, len));
+ }
+ }
+ catch (DecodeException e)
+ {
+ logger.traceException(e);
}
}
@@ -251,26 +249,13 @@
for (Attribute attr : attrList)
{
- if (attr.isVirtual())
+ if (!attr.isVirtual())
{
- continue;
- }
- //Get the substring matching rule.
- SubstringMatchingRule rule =
- attr.getAttributeType().getSubstringMatchingRule();
-
- for (AttributeValue value : attr)
- {
- try
+ SubstringMatchingRule rule =
+ attr.getAttributeType().getSubstringMatchingRule();
+ for (AttributeValue value : attr)
{
- byte[] normalizedBytes = rule.normalizeAttributeValue(value.getValue())
- .toByteArray();
-
- substringKeys(normalizedBytes, modifiedKeys, insert);
- }
- catch (DecodeException e)
- {
- logger.traceException(e);
+ getKeys(rule, value, modifiedKeys, insert);
}
}
}
@@ -287,41 +272,12 @@
* @param insert <code>true</code> if generated keys should
* be inserted or <code>false</code> otherwise.
*/
- private void substringKeys(byte[] value,
- Map<byte[], Boolean> modifiedKeys,
- Boolean insert)
- {
- byte[] keyBytes;
-
- // Example: The value is ABCDE and the substring length is 3.
- // We produce the keys ABC BCD CDE DE E
- // To find values containing a short substring such as DE,
- // iterate through keys with prefix DE. To find values
- // containing a longer substring such as BCDE, read keys
- // BCD and CDE.
- for (int i = 0, remain = value.length; remain > 0; i++, remain--)
- {
- int len = Math.min(substrLength, remain);
- keyBytes = makeSubstringKey(value, i, len);
- Boolean cInsert = modifiedKeys.get(keyBytes);
- if(cInsert == null)
- {
- modifiedKeys.put(keyBytes, insert);
- }
- else if(!cInsert.equals(insert))
- {
- modifiedKeys.remove(keyBytes);
- }
- }
+ private void getKeys(SubstringMatchingRule rule, AttributeValue value,
+ Map<byte[], Boolean> modifiedKeys, Boolean insert)
+ { // TODO merge with ExtensibleIndexer.getKeys(attrValue, modifiedKeys, insert);
+ Set<byte[]> keys = new HashSet<byte[]>();
+ getKeys(rule, value, keys);
+ ExtensibleIndexer.computeModifiedKeys(modifiedKeys, insert, keys);
}
- /**
- * Return the substring length for an indexer.
- *
- * @return The substring length configured for an sub string indexer.
- */
- public int getSubStringLen()
- {
- return substrLength;
- }
}
--
Gitblit v1.10.0