From 0307cf849073c6710dea6f2fc7723f1199db601f Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Thu, 18 Dec 2014 15:04:55 +0000
Subject: [PATCH] OPENDJ-1602 (CR-5566) New pluggable storage based backend

---
 opendj-sdk/opendj-config-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/BackendIndexConfiguration.xml     |  232 +++++++++++++++++++++++++
 opendj-sdk/opendj-server3x-adapter/src/test/resources/config/schema/02-config.ldif                                                       |   21 ++
 opendj-sdk/opendj-config-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/PluggableBackendConfiguration.xml |    8 
 opendj-sdk/opendj-config-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/BackendVLVIndexConfiguration.xml  |  232 +++++++++++++++++++++++++
 4 files changed, 489 insertions(+), 4 deletions(-)

diff --git a/opendj-sdk/opendj-config-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/BackendIndexConfiguration.xml b/opendj-sdk/opendj-config-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/BackendIndexConfiguration.xml
new file mode 100644
index 0000000..67d100f
--- /dev/null
+++ b/opendj-sdk/opendj-config-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/BackendIndexConfiguration.xml
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ! CDDL HEADER START
+  !
+  ! The contents of this file are subject to the terms of the
+  ! Common Development and Distribution License, Version 1.0 only
+  ! (the "License").  You may not use this file except in compliance
+  ! with the License.
+  !
+  ! You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+  ! or http://forgerock.org/license/CDDLv1.0.html.
+  ! See the License for the specific language governing permissions
+  ! and limitations under the License.
+  !
+  ! When distributing Covered Code, include this CDDL HEADER in each
+  ! file and include the License file at legal-notices/CDDLv1_0.txt.
+  ! If applicable, add the following below this CDDL HEADER, with the
+  ! fields enclosed by brackets "[]" replaced with your own identifying
+  ! information:
+  !      Portions Copyright [yyyy] [name of copyright owner]
+  !
+  ! CDDL HEADER END
+  !
+  !
+  !      Copyright 2007-2009 Sun Microsystems, Inc.
+  !      Portions copyright 2014 ForgeRock AS.
+  ! -->
+<adm:managed-object name="backend-index" plural-name="backend-indexes"
+  package="org.forgerock.opendj.server.config"
+  xmlns:adm="http://opendj.forgerock.org/admin"
+  xmlns:ldap="http://opendj.forgerock.org/admin-ldap">
+  <adm:synopsis>
+    <adm:user-friendly-plural-name />
+    are used to store information that makes it possible to locate
+    entries very quickly when processing search operations.
+  </adm:synopsis>
+  <adm:description>
+    Indexing is performed on a per-attribute level and different types
+    of indexing may be performed for different kinds of attributes, based
+    on how they are expected to be accessed during search operations.
+  </adm:description>
+  <adm:tag name="database" />
+  <adm:profile name="ldap">
+    <ldap:object-class>
+      <ldap:name>ds-cfg-backend-index</ldap:name>
+      <ldap:superior>top</ldap:superior>
+    </ldap:object-class>
+  </adm:profile>
+  <adm:property name="attribute" mandatory="true" read-only="true">
+    <adm:synopsis>
+      Specifies the name of the attribute for which the index is to
+      be maintained.
+    </adm:synopsis>
+    <adm:syntax>
+      <adm:attribute-type />
+    </adm:syntax>
+    <adm:profile name="ldap">
+      <ldap:attribute>
+        <ldap:name>ds-cfg-attribute</ldap:name>
+      </ldap:attribute>
+    </adm:profile>
+  </adm:property>
+  <adm:property name="index-entry-limit">
+    <adm:synopsis>
+      Specifies the maximum number of entries that are allowed
+      to match a given index key before that particular index key is no
+      longer maintained.
+    </adm:synopsis>
+    <adm:description>
+      This is analogous to the ALL IDs threshold in the Sun Java System
+      Directory Server. If this is specified, its value overrides the JE
+      backend-wide configuration. For no limit, use 0 for the value.
+    </adm:description>
+    <adm:requires-admin-action>
+      <adm:other>
+        <adm:synopsis>
+          If any index keys have already reached this limit, indexes
+          must be rebuilt before they will be allowed to use the
+          new limit.
+        </adm:synopsis>
+      </adm:other>
+    </adm:requires-admin-action>
+    <adm:default-behavior>
+      <adm:inherited>
+        <adm:relative property-name="index-entry-limit" offset="1"
+          managed-object-name="local-db-backend" />
+      </adm:inherited>
+    </adm:default-behavior>
+    <adm:syntax>
+      <adm:integer lower-limit="0" upper-limit="2147483647">
+        <adm:unit-synopsis>Number of entries</adm:unit-synopsis>
+      </adm:integer>
+    </adm:syntax>
+    <adm:profile name="ldap">
+      <ldap:attribute>
+        <ldap:name>ds-cfg-index-entry-limit</ldap:name>
+      </ldap:attribute>
+    </adm:profile>
+  </adm:property>
+  <adm:property name="index-type" mandatory="true"
+    multi-valued="true">
+    <adm:synopsis>
+      Specifies the type(s) of indexing that should be performed
+      for the associated attribute.
+    </adm:synopsis>
+    <adm:description>
+      For equality, presence, and substring index types, the associated
+      attribute type must have a corresponding matching rule.
+    </adm:description>
+    <adm:requires-admin-action>
+      <adm:other>
+        <adm:synopsis>
+          If any new index types are added for an attribute, and
+          values for that attribute already exist in the
+          database, the index must be rebuilt before it
+          will be accurate.
+        </adm:synopsis>
+      </adm:other>
+    </adm:requires-admin-action>
+    <adm:syntax>
+      <adm:enumeration>
+        <adm:value name="equality">
+          <adm:synopsis>
+            This index type is used to improve the efficiency
+            of searches using equality search filters.
+          </adm:synopsis>
+        </adm:value>
+        <adm:value name="ordering">
+          <adm:synopsis>
+            This index type is used to improve the efficiency
+            of searches using "greater than or equal to" or "less then
+            or equal to" search filters.
+          </adm:synopsis>
+        </adm:value>
+        <adm:value name="presence">
+          <adm:synopsis>
+            This index type is used to improve the efficiency
+            of searches using the presence search filters.
+          </adm:synopsis>
+        </adm:value>
+        <adm:value name="substring">
+          <adm:synopsis>
+            This index type is used to improve the efficiency
+            of searches using substring search filters.
+          </adm:synopsis>
+        </adm:value>
+        <adm:value name="approximate">
+          <adm:synopsis>
+            This index type is used to improve the efficiency
+            of searches using approximate matching search filters.
+          </adm:synopsis>
+        </adm:value>
+        <adm:value name="extensible">
+         <adm:synopsis>
+            This index type is used to improve the efficiency
+            of searches using extensible matching search filters.
+         </adm:synopsis>
+      </adm:value>
+      </adm:enumeration>
+    </adm:syntax>
+    <adm:profile name="ldap">
+      <ldap:attribute>
+        <ldap:name>ds-cfg-index-type</ldap:name>
+      </ldap:attribute>
+    </adm:profile>
+  </adm:property>
+  <adm:property name="substring-length" advanced="true">
+    <adm:synopsis>
+      The length of substrings in a substring index.
+    </adm:synopsis>
+    <adm:requires-admin-action>
+      <adm:other>
+        <adm:synopsis>
+          The index must be rebuilt before it will reflect the
+          new value.
+        </adm:synopsis>
+      </adm:other>
+    </adm:requires-admin-action>
+    <adm:default-behavior>
+      <adm:defined>
+        <adm:value>6</adm:value>
+      </adm:defined>
+    </adm:default-behavior>
+    <adm:syntax>
+      <adm:integer lower-limit="3" />
+    </adm:syntax>
+    <adm:profile name="ldap">
+      <ldap:attribute>
+        <ldap:name>ds-cfg-substring-length</ldap:name>
+      </ldap:attribute>
+    </adm:profile>
+  </adm:property>
+  <adm:property name="index-extensible-matching-rule" multi-valued="true">
+    <adm:synopsis>
+      The extensible matching rule in an extensible index.
+    </adm:synopsis>
+    <adm:description>
+      An extensible matching rule must be specified using either LOCALE or OID of the matching rule.
+    </adm:description>
+    <adm:requires-admin-action>
+      <adm:other>
+        <adm:synopsis>
+          The index must be rebuilt before it will reflect the
+          new value.
+        </adm:synopsis>
+      </adm:other>
+    </adm:requires-admin-action>
+    <adm:default-behavior>
+      <adm:alias>
+        <adm:synopsis>
+          No extensible matching rules will be indexed.
+        </adm:synopsis>
+      </adm:alias>
+    </adm:default-behavior>
+ <adm:syntax>
+     <adm:string>
+       <adm:pattern>
+          <adm:regex>([a-z][a-z](-[A-Z][A-Z]){0,2}(.(([a-z]{2,3})|\\d))?)|(^\\d.((\\d)+.)+\\d$)</adm:regex>
+          <adm:usage>LOCALE | OID</adm:usage>
+          <adm:synopsis>
+            A Locale or an OID.
+          </adm:synopsis>
+        </adm:pattern>
+       </adm:string>
+   </adm:syntax>
+    <adm:profile name="ldap">
+      <ldap:attribute>
+        <ldap:name>ds-cfg-index-extensible-matching-rule</ldap:name>
+      </ldap:attribute>
+    </adm:profile>
+  </adm:property>
+</adm:managed-object>
diff --git a/opendj-sdk/opendj-config-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/BackendVLVIndexConfiguration.xml b/opendj-sdk/opendj-config-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/BackendVLVIndexConfiguration.xml
new file mode 100644
index 0000000..670d09f
--- /dev/null
+++ b/opendj-sdk/opendj-config-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/BackendVLVIndexConfiguration.xml
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ! CDDL HEADER START
+  !
+  ! The contents of this file are subject to the terms of the
+  ! Common Development and Distribution License, Version 1.0 only
+  ! (the "License").  You may not use this file except in compliance
+  ! with the License.
+  !
+  ! You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+  ! or http://forgerock.org/license/CDDLv1.0.html.
+  ! See the License for the specific language governing permissions
+  ! and limitations under the License.
+  !
+  ! When distributing Covered Code, include this CDDL HEADER in each
+  ! file and include the License file at legal-notices/CDDLv1_0.txt.
+  ! If applicable, add the following below this CDDL HEADER, with the
+  ! fields enclosed by brackets "[]" replaced with your own identifying
+  ! information:
+  !      Portions Copyright [yyyy] [name of copyright owner]
+  !
+  ! CDDL HEADER END
+  !
+  !
+  !      Copyright 2007-2008 Sun Microsystems, Inc.
+  !      Portions copyright 2014 ForgeRock AS.
+  ! -->
+<adm:managed-object name="backend-vlv-index"
+  plural-name="backend-vlv-indexes"
+  package="org.forgerock.opendj.server.config"
+  xmlns:adm="http://opendj.forgerock.org/admin"
+  xmlns:ldap="http://opendj.forgerock.org/admin-ldap">
+  <adm:synopsis>
+    <adm:user-friendly-plural-name />
+    are used to store information about a specific search request that
+    makes it possible to efficiently process them using the VLV control.
+  </adm:synopsis>
+  <adm:description>
+    A VLV index effectively notifies the server that a virtual list
+    view, with specific query and sort parameters, will be performed.
+    This index also allows the server to collect and maintain the
+    information required to make using the virtual list view faster.
+  </adm:description>
+  <adm:tag name="database" />
+  <adm:profile name="ldap">
+    <ldap:object-class>
+      <ldap:name>ds-cfg-backend-vlv-index</ldap:name>
+      <ldap:superior>top</ldap:superior>
+    </ldap:object-class>
+  </adm:profile>
+  <adm:property name="base-dn" mandatory="true">
+    <adm:synopsis>
+      Specifies the base DN used in the search query that is being 
+      indexed.
+    </adm:synopsis>
+    <adm:requires-admin-action>
+      <adm:other>
+        <adm:synopsis>
+          The index must be rebuilt after modifying this
+          property.
+        </adm:synopsis>
+      </adm:other>
+    </adm:requires-admin-action>
+    <adm:syntax>
+      <adm:dn />
+    </adm:syntax>
+    <adm:profile name="ldap">
+      <ldap:attribute>
+        <ldap:name>ds-cfg-base-dn</ldap:name>
+      </ldap:attribute>
+    </adm:profile>
+  </adm:property>
+  <adm:property name="scope" mandatory="true">
+    <adm:synopsis>
+      Specifies the LDAP scope of the query that is being indexed.
+    </adm:synopsis>
+    <adm:requires-admin-action>
+      <adm:other>
+        <adm:synopsis>
+          The index must be rebuilt after modifying this
+          property.
+        </adm:synopsis>
+      </adm:other>
+    </adm:requires-admin-action>
+    <adm:syntax>
+      <adm:enumeration>
+        <adm:value name="base-object">
+          <adm:synopsis>Search the base object only.</adm:synopsis>
+        </adm:value>
+        <adm:value name="single-level">
+          <adm:synopsis>
+            Search the immediate children of the base object but do not 
+            include any of their descendants or the base object itself.
+          </adm:synopsis>
+        </adm:value>
+        <adm:value name="subordinate-subtree">
+          <adm:synopsis>
+            Search the entire subtree below the base object but do not
+            include the base object itself.
+          </adm:synopsis>
+        </adm:value>
+        <adm:value name="whole-subtree">
+          <adm:synopsis>
+            Search the base object and the entire subtree below the base
+            object.
+          </adm:synopsis>
+        </adm:value>
+      </adm:enumeration>
+    </adm:syntax>
+    <adm:profile name="ldap">
+      <ldap:attribute>
+        <ldap:name>ds-cfg-scope</ldap:name>
+      </ldap:attribute>
+    </adm:profile>
+  </adm:property>
+  <adm:property name="filter" mandatory="true">
+    <adm:synopsis>
+      Specifies the LDAP filter used in the query that is being indexed.
+    </adm:synopsis>
+    <adm:requires-admin-action>
+      <adm:other>
+        <adm:synopsis>
+          The index must be rebuilt after modifying this
+          property.
+        </adm:synopsis>
+      </adm:other>
+    </adm:requires-admin-action>
+    <adm:syntax>
+      <adm:string>
+        <adm:pattern>
+        <adm:regex>.*</adm:regex>
+        <adm:usage>STRING</adm:usage>
+          <adm:synopsis>
+            A valid LDAP search filter.
+          </adm:synopsis>
+        </adm:pattern>
+      </adm:string>
+    </adm:syntax> 
+    <adm:profile name="ldap">
+      <ldap:attribute>
+        <ldap:name>ds-cfg-filter</ldap:name>
+      </ldap:attribute>
+    </adm:profile>
+  </adm:property>
+  <adm:property name="sort-order" mandatory="true">
+    <adm:synopsis>
+      Specifies the names of the attributes that are used to sort the 
+      entries for the query being indexed.
+    </adm:synopsis>
+    <adm:description>
+      Multiple attributes can be used to determine the sort order by 
+      listing the attribute names from highest to lowest precedence. 
+      Optionally, + or - can be prefixed to the attribute name to sort 
+      the attribute in ascending order or descending order respectively.
+    </adm:description> 
+    <adm:requires-admin-action>
+      <adm:other>
+        <adm:synopsis>
+          The index must be rebuilt after modifying this
+          property.
+        </adm:synopsis>
+      </adm:other>
+    </adm:requires-admin-action>
+    <adm:syntax>
+      <adm:string>
+        <adm:pattern>
+        <adm:regex>.*</adm:regex>
+        <adm:usage>STRING</adm:usage>
+          <adm:synopsis>
+            Valid attribute types defined in the schema, separated by a 
+            space and optionally prefixed by + or -.
+          </adm:synopsis>
+        </adm:pattern>
+      </adm:string>
+    </adm:syntax> 
+    <adm:profile name="ldap">
+      <ldap:attribute>
+        <ldap:name>ds-cfg-sort-order</ldap:name>
+      </ldap:attribute>
+    </adm:profile>
+  </adm:property>
+  <adm:property name="name" mandatory="true" read-only="true">
+    <adm:synopsis>
+      Specifies a unique name for this VLV index.
+    </adm:synopsis>
+    <adm:requires-admin-action>
+      <adm:none>
+        <adm:synopsis>
+          The VLV index name cannot be altered after the index is created.
+        </adm:synopsis>
+      </adm:none>
+    </adm:requires-admin-action>  
+    <adm:syntax>
+      <adm:string />
+    </adm:syntax>
+    <adm:profile name="ldap">
+      <ldap:attribute>
+        <ldap:name>ds-cfg-name</ldap:name>
+      </ldap:attribute>
+    </adm:profile>
+  </adm:property>
+  <adm:property name="max-block-size" read-only="true"
+    advanced="true">
+    <adm:synopsis>
+      Specifies the number of entry IDs to store in a single sorted
+      set before it must be split.
+    </adm:synopsis>
+    <adm:requires-admin-action>
+      <adm:none>
+        <adm:synopsis>
+          The blocks are resized lazily the next time the index is 
+          modified.
+        </adm:synopsis>
+      </adm:none>
+    </adm:requires-admin-action>  
+    <adm:default-behavior>
+      <adm:defined>
+        <adm:value>4000</adm:value>
+      </adm:defined>
+    </adm:default-behavior>
+    <adm:syntax>
+      <adm:integer>
+        <adm:unit-synopsis>Number of entry IDs</adm:unit-synopsis>
+      </adm:integer>
+    </adm:syntax>
+    <adm:profile name="ldap">
+      <ldap:attribute>
+        <ldap:name>ds-cfg-max-block-size</ldap:name>
+      </ldap:attribute>
+    </adm:profile>
+  </adm:property>
+</adm:managed-object>
diff --git a/opendj-sdk/opendj-config-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/PluggableBackendConfiguration.xml b/opendj-sdk/opendj-config-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/PluggableBackendConfiguration.xml
index 882f836..b3be01a 100644
--- a/opendj-sdk/opendj-config-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/PluggableBackendConfiguration.xml
+++ b/opendj-sdk/opendj-config-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/PluggableBackendConfiguration.xml
@@ -39,8 +39,8 @@
       <ldap:superior>ds-cfg-backend</ldap:superior>
     </ldap:object-class>
   </adm:profile>
-  <adm:relation name="backend-index" managed-object-name="local-db-index">
-    <adm:one-to-many naming-property="attribute" plural-name="backend-indexes">
+  <adm:relation name="backend-index">
+    <adm:one-to-many naming-property="attribute">
       <adm:default-managed-object name="aci">
         <adm:property name="index-type">
           <adm:value>presence</adm:value>
@@ -93,8 +93,8 @@
       </cli:relation>
     </adm:profile>
   </adm:relation>
-  <adm:relation name="backend-vlv-index" managed-object-name="local-db-vlv-index">
-    <adm:one-to-many naming-property="name" plural-name="backend-vlv-indexes"/>
+  <adm:relation name="backend-vlv-index">
+    <adm:one-to-many naming-property="name"/>
     <adm:profile name="ldap">
       <ldap:rdn-sequence>cn=VLV Index</ldap:rdn-sequence>
     </adm:profile>
diff --git a/opendj-sdk/opendj-server3x-adapter/src/test/resources/config/schema/02-config.ldif b/opendj-sdk/opendj-server3x-adapter/src/test/resources/config/schema/02-config.ldif
index 3cdbe64..9df4060 100644
--- a/opendj-sdk/opendj-server3x-adapter/src/test/resources/config/schema/02-config.ldif
+++ b/opendj-sdk/opendj-server3x-adapter/src/test/resources/config/schema/02-config.ldif
@@ -5774,4 +5774,25 @@
         ds-cfg-disk-full-threshold $
         ds-cfg-disk-low-threshold )
   X-ORIGIN 'OpenDJ Directory Server' )
+objectClasses: ( 1.3.6.1.4.1.36733.2.1.2.24
+  NAME 'ds-cfg-backend-index'
+  SUP top
+  STRUCTURAL
+  MUST ( ds-cfg-attribute $
+         ds-cfg-index-type )
+  MAY ( ds-cfg-index-entry-limit $
+              ds-cfg-substring-length $
+              ds-cfg-index-extensible-matching-rule )
+  X-ORIGIN 'OpenDJ Directory Server' )
+objectClasses: ( 1.3.6.1.4.1.36733.2.1.2.25
+  NAME 'ds-cfg-backend-vlv-index'
+  SUP top
+  STRUCTURAL
+  MUST ( ds-cfg-base-dn $
+         ds-cfg-scope $
+         ds-cfg-filter $
+         ds-cfg-sort-order $
+         ds-cfg-name )
+  MAY ds-cfg-max-block-size
+  X-ORIGIN 'OpenDJ Directory Server' )
 

--
Gitblit v1.10.0