]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
CSPACE-4394 - Added a "ts" filter parameter to the list/search for authority items...
authorPatrick Schmitz <pschmitz@berkeley.edu>
Tue, 15 Nov 2011 23:29:58 +0000 (23:29 +0000)
committerPatrick Schmitz <pschmitz@berkeley.edu>
Tue, 15 Nov 2011 23:29:58 +0000 (23:29 +0000)
services/IntegrationTests/src/test/resources/test-data/xmlreplay/person/personTermStatusSearch.xml [new file with mode: 0644]
services/IntegrationTests/src/test/resources/test-data/xmlreplay/person/person_pmadry.xml
services/IntegrationTests/src/test/resources/test-data/xmlreplay/person/person_pschmitz.xml
services/IntegrationTests/src/test/resources/test-data/xmlreplay/person/res/personlistActive.res.xml [new file with mode: 0644]
services/IntegrationTests/src/test/resources/test-data/xmlreplay/person/res/personlistAll.res.xml [new file with mode: 0644]
services/IntegrationTests/src/test/resources/test-data/xmlreplay/person/res/personlistNone.res.xml [new file with mode: 0644]
services/authority/service/src/main/java/org/collectionspace/services/common/vocabulary/AuthorityResource.java
services/client/src/main/java/org/collectionspace/services/client/IQueryManager.java
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

diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/person/personTermStatusSearch.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/person/personTermStatusSearch.xml
new file mode 100644 (file)
index 0000000..4999518
--- /dev/null
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<xmlReplay>\r
+    <!-- \r
+         testGroup ID="person" is not live.  It works, but may not clean up correctly. \r
+         For now, use ID="updatePerson"\r
+    -->\r
+    <testGroup ID="personTermStatus" autoDeletePOSTS="true">\r
+        <test ID="PersonAuth1" auth="admin@core.collectionspace.org">\r
+            <method>POST</method>\r
+            <uri>/cspace-services/personauthorities/</uri>\r
+            <filename>person/personauthorities_common.xml</filename>\r
+            <vars>\r
+                <var ID="authShortIdentifier">TermStatusTestAuth</var>\r
+            </vars>\r
+        </test>\r
+        <test ID="Patrick">\r
+            <method>POST</method>\r
+            <uri>/cspace-services/personauthorities/${PersonAuth1.CSID}/items/</uri>\r
+            <filename>person/person_pschmitz.xml</filename>\r
+            <vars>\r
+                <var ID="termStatus">Approved</var>\r
+            </vars>\r
+        </test>\r
+        <test ID="Penelope">\r
+            <method>POST</method>\r
+            <uri>/cspace-services/personauthorities/${PersonAuth1.CSID}/items/</uri>\r
+            <filename>person/person_pmadry.xml</filename>\r
+            <vars>\r
+                <var ID="termStatus">Inactive</var>\r
+            </vars>\r
+        </test>\r
+\r
+        <test ID="GetAll">\r
+            <method>GET</method>\r
+                                               <uri>/cspace-services/personauthorities/${PersonAuth1.CSID}/items</uri>\r
+                                               <response>\r
+                                                       <expected level="ADDOK"/>\r
+                                                       <filename>person/res/personlistAll.res.xml</filename>\r
+                                               </response>\r
+        </test>\r
+        <test ID="GetActive">\r
+            <method>GET</method>\r
+            <uri>/cspace-services/personauthorities/${PersonAuth1.CSID}/items?ts=Inactive</uri>\r
+                                               <response>\r
+                                                       <expected level="ADDOK"/>\r
+                                                       <filename>person/res/personlistActive.res.xml</filename>\r
+                                               </response>\r
+        </test>\r
+        <test ID="GetBogus">\r
+            <method>GET</method>\r
+            <uri>/cspace-services/personauthorities/${PersonAuth1.CSID}/items?ts=Garbage</uri>\r
+                                               <response>\r
+                                                       <expected level="ADDOK"/>\r
+                                                       <filename>person/res/personlistAll.res.xml</filename>\r
+                                               </response>\r
+        </test>\r
+        <test ID="GetNone">\r
+            <method>GET</method>\r
+            <uri>/cspace-services/personauthorities/${PersonAuth1.CSID}/items?ts=Inactive%7CApproved</uri>\r
+                                               <response>\r
+                                                       <expected level="ADDOK"/>\r
+                                                       <filename>person/res/personlistNone.res.xml</filename>\r
+                                               </response>\r
+        </test>\r
+                               <test ID="GetPartial">\r
+            <method>GET</method>\r
+            <uri>/cspace-services/personauthorities/${PersonAuth1.CSID}/items?pt=Patrick</uri>\r
+                                               <response>\r
+                                                       <expected level="ADDOK"/>\r
+                                                       <filename>person/res/personlistActive.res.xml</filename>\r
+                                               </response>\r
+        </test>\r
+                               <test ID="GetPartialNone">\r
+            <method>GET</method>\r
+            <uri>/cspace-services/personauthorities/${PersonAuth1.CSID}/items?pt=Patrick&amp;ts=Approved</uri>\r
+                                               <response>\r
+                                                       <expected level="ADDOK"/>\r
+                                                       <filename>person/res/personlistNone.res.xml</filename>\r
+                                               </response>\r
+        </test>\r
+   </testGroup>\r
+\r
+</xmlReplay>\r
index 6e4b9731ef64ccf05d23b477c3dc5aa559bf18ca..b6b8a196fab4f3e404008ceebb36f4ed01d6e632 100644 (file)
@@ -2,11 +2,11 @@
 <document name="persons">\r
   <ns2:persons_common xmlns:ns2="http://collectionspace.org/services/person" xmlns:ns3="http://collectionspace.org/services/jaxb">\r
        <shortIdentifier>pmadry</shortIdentifier>\r
-       <refName>urn:cspace:org.collectionspace.demo:personauthority:name(testpersonauth):person:name(pmadry)'Penelope Madry'</refName>\r
        <displayNameComputed>false</displayNameComputed>\r
        <shortDisplayNameComputed>false</shortDisplayNameComputed>\r
        <shortDisplayName>Penelope Madry</shortDisplayName>\r
        <displayName>Penelope Madry, New York</displayName>\r
+       <termStatus>${termStatus}</termStatus>\r
        <bioNote>Project Manager for CollectionSpace</bioNote>\r
   </ns2:persons_common>\r
 </document>\r
index 585a15d30a27c809da28c795db06864257d810cf..ee908b05572b8832fc2fc1b9dbf128c793feecfa 100644 (file)
@@ -2,11 +2,11 @@
 <document name="persons">\r
   <ns2:persons_common xmlns:ns2="http://collectionspace.org/services/person" xmlns:ns3="http://collectionspace.org/services/jaxb">\r
        <shortIdentifier>pschmitz</shortIdentifier>\r
-       <refName>urn:cspace:org.collectionspace.demo:personauthority:name(testpersonauth):person:name(pschmitz)'Patrick Schmitz'</refName>\r
        <displayNameComputed>false</displayNameComputed>\r
        <shortDisplayNameComputed>false</shortDisplayNameComputed>\r
        <shortDisplayName>Patrick Schmitz</shortDisplayName>\r
        <displayName>Patrick Schmitz, Berkeley</displayName>\r
+       <termStatus>${termStatus}</termStatus>\r
        <bioNote>Technical Lead for CollectionSpace</bioNote>\r
     <description>This is a test PersonAuthority item</description>\r
     <source>Some mythical book</source>\r
diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/person/res/personlistActive.res.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/person/res/personlistActive.res.xml
new file mode 100644 (file)
index 0000000..9fe8400
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<ns2:abstract-common-list xmlns:ns2="http://collectionspace.org/services/jaxb">\r
+    <pageNum>0</pageNum>\r
+    <pageSize>40</pageSize>\r
+               <itemsInPage>1</itemsInPage>\r
+    <fieldsReturned>csid|uri|updatedAt|displayName|shortIdentifier|refName|termStatus</fieldsReturned>\r
+    <list-item>\r
+        <shortIdentifier>pschmitz</shortIdentifier>\r
+    </list-item>\r
+</ns2:abstract-common-list>\r
+\r
diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/person/res/personlistAll.res.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/person/res/personlistAll.res.xml
new file mode 100644 (file)
index 0000000..322dbe5
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<ns2:abstract-common-list xmlns:ns2="http://collectionspace.org/services/jaxb">\r
+    <pageNum>0</pageNum>\r
+    <pageSize>40</pageSize>\r
+               <itemsInPage>2</itemsInPage>\r
+    <fieldsReturned>csid|uri|updatedAt|displayName|shortIdentifier|refName|termStatus</fieldsReturned>\r
+    <list-item>\r
+        <shortIdentifier>pschmitz</shortIdentifier>\r
+    </list-item>\r
+    <list-item>\r
+        <shortIdentifier>pmadry</shortIdentifier>\r
+    </list-item>\r
+</ns2:abstract-common-list>\r
+\r
diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/person/res/personlistNone.res.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/person/res/personlistNone.res.xml
new file mode 100644 (file)
index 0000000..8f085a3
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<ns2:abstract-common-list xmlns:ns2="http://collectionspace.org/services/jaxb">\r
+    <pageNum>0</pageNum>\r
+    <pageSize>40</pageSize>\r
+               <itemsInPage>0</itemsInPage>\r
+    <fieldsReturned>csid|uri|updatedAt|displayName|shortIdentifier|refName|termStatus</fieldsReturned>\r
+</ns2:abstract-common-list>\r
+\r
index 0ada88dd6c0419b0a22329897f58c96db7f4770c..f72d750c52106fbae2508bc99c0fe2a18f6b9db5 100644 (file)
@@ -103,6 +103,8 @@ import java.util.List;
 @Produces("application/xml")
 public abstract class AuthorityResource<AuthCommon, AuthItemHandler>
         extends ResourceBase {
+       
+       final static String SEARCH_TYPE_TERMSTATUS = "ts";
 
     protected Class<AuthCommon> authCommonClass;
     protected Class<?> resourceClass;
@@ -638,6 +640,7 @@ public abstract class AuthorityResource<AuthCommon, AuthItemHandler>
         try {
             MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
             String partialTerm = queryParams.getFirst(IQueryManager.SEARCH_TYPE_PARTIALTERM);
+            String termStatus = queryParams.getFirst(SEARCH_TYPE_TERMSTATUS);
             String keywords = queryParams.getFirst(IQueryManager.SEARCH_TYPE_KEYWORDS_KW);
             String advancedSearch = queryParams.getFirst(IQueryManager.SEARCH_TYPE_KEYWORDS_AS);
 
@@ -660,12 +663,21 @@ public abstract class AuthorityResource<AuthCommon, AuthItemHandler>
             if (sortBy == null || sortBy.isEmpty()) {
                 myFilter.setOrderByClause(qualifiedDisplayNameField);
             }
-
+            
             myFilter.appendWhereClause(authorityItemCommonSchemaName + ":"
                     + AuthorityItemJAXBSchema.IN_AUTHORITY + "="
                     + "'" + parentcsid + "'",
                     IQueryManager.SEARCH_QUALIFIER_AND);
 
+            if (Tools.notBlank(termStatus)) {
+               // Start with the qualified termStatus field
+               String qualifiedTermStatusField = authorityItemCommonSchemaName + ":"
+                        + AuthorityItemJAXBSchema.TERM_STATUS;
+               String[] filterTerms = termStatus.trim().split("\\|");
+               String tsClause = QueryManager.createWhereClauseToFilterFromStringList(qualifiedTermStatusField, filterTerms, IQueryManager.FILTER_EXCLUDE);
+                myFilter.appendWhereClause(tsClause, IQueryManager.SEARCH_QUALIFIER_AND);
+            }
+                
             // AND vocabularyitems_common:displayName LIKE '%partialTerm%'
             // NOTE: Partial terms searches are mutually exclusive to keyword and advanced-search, but
             // the PT query param trumps the KW and AS query params.
index 493d5fa3af58f0c6ea68acc27f4a3aa93c397819..ceac6ee94d6a0ed56fa877dac2089af549dc9719 100644 (file)
@@ -56,6 +56,19 @@ public interface IQueryManager {
        \r
        public String createWhereClauseFromAdvancedSearch(String advancedSearch);\r
 \r
+       final static boolean FILTER_EXCLUDE = true;\r
+       final static boolean FILTER_INCLUDE = false;\r
+       \r
+       /**\r
+        * Creates a query to filter a qualified (string) field according to a list of string values. \r
+        * @param qualifiedField The schema-qualified field to filter on\r
+        * @param filterTerms the list of one or more strings to filter on\r
+        * @param fExclude If true, will require qualifiedField NOT match the filters strings.\r
+        *                                      If false, will require qualifiedField does match one of the filters strings.\r
+        * @return queryString\r
+        */\r
+       public String createWhereClauseToFilterFromStringList(String qualifiedField, String[] filterTerms, boolean fExclude);\r
+       \r
        /**\r
         * Creates the where clause for partial term match.\r
         * \r
index 8a0e0c0a0c262d3a0048392e165a1b54bc7df90a..86be6ed1cce31938a97813534a395919c5748a25 100644 (file)
@@ -63,6 +63,19 @@ public class QueryManager {
                return queryManager.createWhereClauseForPartialMatch(field, partialTerm);\r
        }\r
        \r
+       /**\r
+        * Creates a query to filter a qualified (string) field according to a list of string values. \r
+        * @param qualifiedField The schema-qualified field to filter on\r
+        * @param filterTerms the list of one or more strings to filter on\r
+        * @param fExclude If true, will require qualifiedField NOT match the filters strings.\r
+        *                                      If false, will require qualifiedField does match one of the filters strings.\r
+        * @return queryString\r
+        */\r
+       static public String createWhereClauseToFilterFromStringList(String qualifiedField, String[] filterTerms, boolean fExclude) {\r
+               return queryManager.createWhereClauseToFilterFromStringList(qualifiedField, filterTerms, fExclude);\r
+       }\r
+\r
+       \r
        /**\r
         * Creates a filtering where clause from docType, for invocables.\r
         * \r
index 16be5b55abd8fda7e0376e214a0b19b639a5588d..e7a8282c8fa0c17b66c57d51a719615a98e4774c 100644 (file)
@@ -296,4 +296,36 @@ public class QueryManagerNuxeoImpl implements IQueryManager {
 \r
                return fFilteredChars;\r
        }\r
+       \r
+       /**\r
+        * Creates a query to filter a qualified (string) field according to a list of string values. \r
+        * @param qualifiedField The schema-qualified field to filter on\r
+        * @param filterTerms the list of one or more strings to filter on\r
+        * @param fExclude If true, will require qualifiedField NOT match the filters strings.\r
+        *                                      If false, will require qualifiedField does match one of the filters strings.\r
+        * @return queryString\r
+        */\r
+       @Override\r
+       public String createWhereClauseToFilterFromStringList(String qualifiedField, String[] filterTerms, boolean fExclude) {\r
+       // Start with the qualified termStatus field\r
+       StringBuilder filterClause = new StringBuilder(qualifiedField);\r
+       if(filterTerms.length == 1) {\r
+               filterClause.append(fExclude?" <> '":" = '");\r
+               filterClause.append(filterTerms[0]);\r
+               filterClause.append('\'');  \r
+       } else {\r
+               filterClause.append(fExclude?" NOT IN (":" IN (");\r
+               for(int i=0; i<filterTerms.length; i++) {\r
+                       if(i>0) {\r
+                               filterClause.append(',');\r
+                       }\r
+                       filterClause.append('\'');  \r
+                       filterClause.append(filterTerms[i]);\r
+                       filterClause.append('\'');  \r
+               }\r
+               filterClause.append(')');  \r
+       }\r
+       return filterClause.toString();\r
+       }\r
+\r
 }\r