--- /dev/null
+<?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&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
<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
<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
--- /dev/null
+<?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
--- /dev/null
+<?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
--- /dev/null
+<?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
@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;
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);
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.
\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
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
\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