From 529e914994ec1fd16ddf9bbc5eda3232459d1b40 Mon Sep 17 00:00:00 2001 From: remillet Date: Thu, 21 Sep 2017 15:52:38 -0700 Subject: [PATCH] DRYD-131: Now supports one or more predicate query params. --- .../services/client/IQueryManager.java | 2 + .../services/client/IRelationsManager.java | 6 +-- .../client/java/DocumentModelHandler.java | 41 +++++++++++++++---- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/services/client/src/main/java/org/collectionspace/services/client/IQueryManager.java b/services/client/src/main/java/org/collectionspace/services/client/IQueryManager.java index 9095fb954..24e4f3a78 100644 --- a/services/client/src/main/java/org/collectionspace/services/client/IQueryManager.java +++ b/services/client/src/main/java/org/collectionspace/services/client/IQueryManager.java @@ -63,6 +63,8 @@ public interface IQueryManager { // final static String SEARCH_RELATED_TO_CSID_AS_SUBJECT = "rtSbj"; final static String SEARCH_RELATED_TO_CSID_AS_OBJECT = "rtObj"; + final static String SEARCH_RELATED_PREDICATE = "rtPredicate"; + final static String SEARCH_RELATED_TO_CSID_AS_EITHER = "rtEither"; final static String SEARCH_RELATED_MATCH_OBJ_DOCTYPES = "rtObjDocTypes"; final static String SELECT_DOC_TYPE_FIELD = "selectDocType"; diff --git a/services/client/src/main/java/org/collectionspace/services/client/IRelationsManager.java b/services/client/src/main/java/org/collectionspace/services/client/IRelationsManager.java index 62acb7a51..d9a077ceb 100644 --- a/services/client/src/main/java/org/collectionspace/services/client/IRelationsManager.java +++ b/services/client/src/main/java/org/collectionspace/services/client/IRelationsManager.java @@ -13,9 +13,9 @@ public interface IRelationsManager { + "." + SERVICE_COMMONPART_NAME + ":subjectCsid"; public final static String CMIS_CSPACE_RELATIONS_OBJECT_ID = IQueryManager.CMIS_RELATIONS_PREFIX + "." + SERVICE_COMMONPART_NAME + ":objectCsid"; - public final static String CMIS_CSPACE_RELATIONS_EITHER_ID = IQueryManager.CMIS_RELATIONS_PREFIX - + "." + SERVICE_COMMONPART_NAME + ":either"; - + public final static String CMIS_CSPACE_RELATIONS_PREDICATE = IQueryManager.CMIS_RELATIONS_PREFIX + + "." + SERVICE_COMMONPART_NAME + ":relationshipType"; + public final static String CMIS_CSPACE_RELATIONS_OBJECT_TYPE = IQueryManager.CMIS_RELATIONS_PREFIX + "." + SERVICE_COMMONPART_NAME + ":objectDocumentType"; diff --git a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/DocumentModelHandler.java b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/DocumentModelHandler.java index 24f36c506..1fe322dee 100644 --- a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/DocumentModelHandler.java +++ b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/DocumentModelHandler.java @@ -461,7 +461,7 @@ public abstract class DocumentModelHandler MultivaluedMap 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); @@ -474,11 +474,13 @@ public abstract class DocumentModelHandler + 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(); @@ -495,10 +497,6 @@ public abstract class DocumentModelHandler // 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."); @@ -511,6 +509,9 @@ public abstract class DocumentModelHandler + " 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 + "'"; @@ -547,5 +548,31 @@ public abstract class DocumentModelHandler return result; } + + private String addWhereClauseForPredicates(String theWhereClause, MultivaluedMap queryParams) { + if (queryParams.containsKey(IQueryManager.SEARCH_RELATED_PREDICATE)) { + List 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; + } } -- 2.47.3