MultivaluedMap<String, String> queryParams = getServiceContext().getQueryParams();
String asSubjectCsid = (String)queryParams.getFirst(IQueryManager.SEARCH_RELATED_TO_CSID_AS_SUBJECT);
String asObjectCsid = (String)queryParams.getFirst(IQueryManager.SEARCH_RELATED_TO_CSID_AS_OBJECT);
-// String asEitherCsid = (String)queryParams.getFirst(IQueryManager.SEARCH_RELATED_TO_CSID_AS_EITHER);
+
String matchObjDocTypes = (String)queryParams.getFirst(IQueryManager.SEARCH_RELATED_MATCH_OBJ_DOCTYPES);
String selectDocType = (String)queryParams.getFirst(IQueryManager.SELECT_DOC_TYPE_FIELD);
+ IRelationsManager.CMIS_CSPACE_RELATIONS_TITLE + ", "
+ IRelationsManager.CMIS_CSPACE_RELATIONS_OBJECT_ID + ", "
+ IRelationsManager.CMIS_CSPACE_RELATIONS_SUBJECT_ID;
+
String targetTable = docType + " " + IQueryManager.CMIS_TARGET_PREFIX;
String relTable = IRelationsManager.DOC_TYPE + " " + IQueryManager.CMIS_RELATIONS_PREFIX;
- String relObjectCsidCol = IRelationsManager.CMIS_CSPACE_RELATIONS_OBJECT_ID;
+
String relSubjectCsidCol = IRelationsManager.CMIS_CSPACE_RELATIONS_SUBJECT_ID;
- String relEitherCsidCol = IRelationsManager.CMIS_CSPACE_RELATIONS_EITHER_ID;
+ String relObjectCsidCol = IRelationsManager.CMIS_CSPACE_RELATIONS_OBJECT_ID;
+
String targetCsidCol = IQueryManager.CMIS_TARGET_CSID;
String tenantID = this.getServiceContext().getTenantId();
// Since our query param is the "object" value, join the tables where the CSID of the document is the other side (the "subject") of the relationship.
theOnClause = relSubjectCsidCol + " = " + targetCsidCol;
theWhereClause = relObjectCsidCol + " = " + "'" + asObjectCsid + "'";
-// } else if (asEitherCsid != null && !asEitherCsid.isEmpty()) {
-// theOnClause = relEitherCsidCol + " = " + targetCsidCol; // See https://issues.collectionspace.org/browse/DRYD-119
-// theWhereClause = relSubjectCsidCol + " = " + "'" + asEitherCsid + "'"
-// + " OR " + relObjectCsidCol + " = " + "'" + asEitherCsid + "'";
} else {
//Since the call to isCMISQuery() return true, we should never get here.
logger.error("Attempt to make CMIS query failed because the HTTP request was missing valid query parameters.");
+ " IN " + matchObjDocTypes + ")";
}
+ // Qualify the search for predicate types
+ theWhereClause = addWhereClauseForPredicates(theWhereClause, queryParams);
+
// Qualify the query with the current tenant ID.
theWhereClause += IQueryManager.SEARCH_QUALIFIER_AND + IQueryManager.CMIS_JOIN_TENANT_ID_FILTER + " = '" + tenantID + "'";
return result;
}
+
+ private String addWhereClauseForPredicates(String theWhereClause, MultivaluedMap<String, String> queryParams) {
+ if (queryParams.containsKey(IQueryManager.SEARCH_RELATED_PREDICATE)) {
+ List<String> predicateList = queryParams.get(IQueryManager.SEARCH_RELATED_PREDICATE);
+
+ if (predicateList.size() == 1) {
+ String predicate = (String)queryParams.getFirst(IQueryManager.SEARCH_RELATED_PREDICATE);
+ if (predicate != null && !predicate.trim().isEmpty()) {
+ theWhereClause += IQueryManager.SEARCH_QUALIFIER_AND + IRelationsManager.CMIS_CSPACE_RELATIONS_PREDICATE + " = '" + predicate + "'";
+ }
+ } else if (predicateList.size() > 1) {
+ StringBuffer partialClause = new StringBuffer();
+ for (String predicate : predicateList) {
+ if (!predicate.trim().isEmpty()) {
+ partialClause.append("'" + predicate + "', ");
+ }
+ }
+ String inValues = partialClause.toString().replaceAll(", $", ""); // remove the last ', ' squence
+ if (!inValues.trim().isEmpty()) {
+ theWhereClause += IQueryManager.SEARCH_QUALIFIER_AND + IRelationsManager.CMIS_CSPACE_RELATIONS_PREDICATE + " IN (" + inValues + ")";
+ }
+ }
+ }
+
+ return theWhereClause;
+ }
}