]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
CSPACE-5740 Added support to turn off starting Wildcard behavior for partial Tern...
authorPatrick Schmitz <pschmitz@berkeley.edu>
Mon, 14 Jan 2013 19:57:41 +0000 (11:57 -0800)
committerPatrick Schmitz <pschmitz@berkeley.edu>
Mon, 14 Jan 2013 19:57:41 +0000 (11:57 -0800)
services/client/src/main/java/org/collectionspace/services/client/IQueryManager.java
services/common/src/main/cspace/config/services/tenants/lifesci/tenant-bindings.delta.xml
services/common/src/main/java/org/collectionspace/services/common/query/QueryManager.java
services/common/src/main/java/org/collectionspace/services/common/query/nuxeo/QueryManagerNuxeoImpl.java

index ccc53d2e4d405c0ee24351ea9b92e907df5d2f99..61b4feedb99e3aeec711022aaa62cb1d651926cc 100644 (file)
@@ -91,6 +91,8 @@ public interface IQueryManager {
        final static String CMIS_TARGET_TITLE = CMIS_TARGET_PREFIX + "." + CMIS_NUXEO_TITLE;\r
        final static String CMIS_TARGET_NAME = CMIS_TARGET_PREFIX + "." + CMIS_NUXEO_NAME;\r
        final static String CMIS_TARGET_UPDATED_AT = CMIS_TARGET_PREFIX + "." + CMIS_CS_UPDATED_AT;\r
+       \r
+       final static String TENANT_USES_STARTING_WILDCARD_FOR_PARTIAL_TERM = "ptStartingWildcard";\r
 \r
        public void execQuery(String queryString);\r
        \r
@@ -131,6 +133,7 @@ public interface IQueryManager {
        public String createWhereClauseForPartialMatch(String dataSourceName,\r
                        String repositoryName,\r
                        String field,\r
+                       boolean startingWildcard,\r
                        String partialTerm);\r
 \r
        /**\r
index 1beb3f4b035adad470027bb50a5bc8dec9e403f7..d02817f3f39d400730dcd394f1a2c37d2a72cd43 100644 (file)
@@ -6,6 +6,22 @@
   <tenant:tenantBinding id="2" name="lifesci.collectionspace.org" displayName="Life Sciences/Natural History Demo Tenant" version="0.1">
 
     <tenant:repositoryDomain name="default-domain" storageName="lifesci_domain" repositoryName="lifesci_domain" repositoryClient="nuxeo-java" />
+               <!--
+                                If you have term completion performance problems and are willing to 
+                                live with not defaulting to an initial wildcard, uncomment this
+                                section. Note that in term completion, you can always specify 
+                                something like "*atrick" (without quotes) to force the wildcard
+                                at the beginning.
+                                Performance may be an issue for very large authorities, especially if
+                                many of them share common substrings.
+               <tenant:properties>
+                       <types:item xmlns:types="http://collectionspace.org/services/config/types"
+                                                                                                       merge:matcher="skip" merge:action="insert" >
+                               <types:key>ptStartingWildcard</types:key>
+                               <types:value>false</types:value>
+                       </types:item>
+               </tenant:properties>
+               -->
        
        <tenant:serviceBindings merge:matcher="id" id="CollectionObjects">
     <service:DocHandlerParams xmlns:service="http://collectionspace.org/services/config/service">
index d4b703de79ff6ee61419c5ccb41f1294364bd4f6..8863aaeb757dd0761a61871cc2ab25af516f404c 100644 (file)
 package org.collectionspace.services.common.query;\r
 \r
 import org.collectionspace.services.client.IQueryManager;\r
+import org.collectionspace.services.common.ServiceMain;\r
+import org.collectionspace.services.common.api.Tools;\r
+import org.collectionspace.services.common.config.TenantBindingConfigReaderImpl;\r
+import org.collectionspace.services.common.config.TenantBindingUtils;\r
 import org.collectionspace.services.common.context.ServiceContext;\r
 import org.collectionspace.services.common.query.nuxeo.QueryManagerNuxeoImpl;\r
+import org.collectionspace.services.config.tenant.TenantBindingType;\r
 \r
 public class QueryManager {\r
        static private final IQueryManager queryManager = new QueryManagerNuxeoImpl();\r
@@ -64,8 +69,17 @@ public class QueryManager {
                        String field,\r
                        String partialTerm) throws Exception {\r
                String repositoryName = ctx.getRepositoryName();\r
+        // Otherwise, generate that list and cache it for re-use.\r
+        TenantBindingConfigReaderImpl tReader =\r
+                ServiceMain.getInstance().getTenantBindingConfigReader();\r
+        TenantBindingType tenantBinding = tReader.getTenantBinding(ctx.getTenantId());\r
+        String ptStartingWildcardValue = TenantBindingUtils.getPropertyValue(tenantBinding,\r
+                       IQueryManager.TENANT_USES_STARTING_WILDCARD_FOR_PARTIAL_TERM);\r
+        boolean ptStartingWildcard = (ptStartingWildcardValue==null) \r
+                               || Boolean.parseBoolean(ptStartingWildcardValue);\r
+\r
                return queryManager.createWhereClauseForPartialMatch(queryManager.getDatasourceName(),\r
-                               repositoryName, field, partialTerm);\r
+                               repositoryName, field, ptStartingWildcard, partialTerm);\r
        }\r
        \r
        /**\r
index ba2b52362c0f54ed3fb5b45634591c7d1b36c1ba..20baf0c636b072d32c2f57f79f2054f46ac2844f 100644 (file)
@@ -263,18 +263,30 @@ public class QueryManagerNuxeoImpl implements IQueryManager {
        public String createWhereClauseForPartialMatch(String dataSourceName,\r
                        String repositoryName,\r
                        String field,\r
+                       boolean startingWildcard,\r
                        String partialTerm) {\r
                String trimmed = (partialTerm == null) ? "" : partialTerm.trim();\r
                if (trimmed.isEmpty()) {\r
                        throw new RuntimeException("No partialTerm specified.");\r
                }\r
+               if(trimmed.charAt(0) == '*') {\r
+                       if(trimmed.length() == 1) { // only a star is not enough\r
+                               throw new RuntimeException("No partialTerm specified.");\r
+                       }\r
+                       trimmed = trimmed.substring(1);\r
+                       startingWildcard = true;                // force a starting wildcard match\r
+               }\r
                if (field == null || field.isEmpty()) {\r
                        throw new RuntimeException("No match field specified.");\r
                }\r
-               String ptClause = field + getLikeForm(dataSourceName, repositoryName) + "'%"\r
-                               + unescapedSingleQuote.matcher(trimmed).replaceAll("\\\\'")\r
-                               + "%'";\r
-               return ptClause;\r
+                       \r
+               StringBuilder ptClause = new StringBuilder(trimmed.length()+field.length()+20);\r
+               ptClause.append(field);\r
+               ptClause.append(getLikeForm(dataSourceName, repositoryName));\r
+               ptClause.append(startingWildcard?"'%":"'");\r
+               ptClause.append(unescapedSingleQuote.matcher(trimmed).replaceAll("\\\\'"));\r
+               ptClause.append("%'");\r
+               return ptClause.toString();\r
        }\r
 \r
        /**\r