From 107fb5f2e801b8554fa5f10b1b34419adc0b72f2 Mon Sep 17 00:00:00 2001 From: remillet Date: Fri, 22 Sep 2017 14:19:59 -0700 Subject: [PATCH] DRYD-120: Added support for 'sbjOrObj' query param so you can find relationships where the the CSID is either the subject or the object. --- .../services/client/IRelationsManager.java | 3 +++ .../common/relation/RelationResource.java | 8 +++++--- .../common/relation/nuxeo/RelationsUtils.java | 18 +++++++++++++++--- .../client/java/NuxeoDocumentModelHandler.java | 2 +- 4 files changed, 24 insertions(+), 7 deletions(-) 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 d9a077ceb..723dccd49 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 @@ -31,6 +31,9 @@ public interface IRelationsManager { // static public final String SUBJECT_TYPE = "subjectType"; static public final String SUBJECT_TYPE_QP = SUBJECT_QP + "Type"; + // A query param for specifying either Subject or Object + static public final String SUBJECT_OR_OBJECT = "sbjOrObj"; + /** The Constant PREDICATE. */ static public final String PREDICATE = "predicate"; static public final String PREDICATE_QP = "prd"; diff --git a/services/common/src/main/java/org/collectionspace/services/common/relation/RelationResource.java b/services/common/src/main/java/org/collectionspace/services/common/relation/RelationResource.java index d4dcd462c..1339e6786 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/relation/RelationResource.java +++ b/services/common/src/main/java/org/collectionspace/services/common/relation/RelationResource.java @@ -91,8 +91,9 @@ public class RelationResource extends NuxeoBasedResource { String predicate = queryParams.getFirst(IRelationsManager.PREDICATE_QP); String objectCsid = queryParams.getFirst(IRelationsManager.OBJECT_QP); String objectType = queryParams.getFirst(IRelationsManager.OBJECT_TYPE_QP); + String subjectOrObject = queryParams.getFirst(IRelationsManager.SUBJECT_OR_OBJECT); - return this.getRelationList(parentCtx, uriInfo, subjectCsid, subjectType, predicate, objectCsid, objectType); + return this.getRelationList(parentCtx, uriInfo, subjectCsid, subjectType, predicate, objectCsid, objectType, subjectOrObject); } private RelationsCommonList getRelationList( @@ -101,7 +102,8 @@ public class RelationResource extends NuxeoBasedResource { String subjectCsid, String subjectType, String predicate, String objectCsid, - String objectType) throws CSWebApplicationException { + String objectType, + String subjectOrObject) throws CSWebApplicationException { try { ServiceContext ctx = createServiceContext(uriInfo); if (parentCtx != null && parentCtx.getCurrentRepositorySession() != null) { // If the parent context has a non-null and open repository session then use it @@ -109,7 +111,7 @@ public class RelationResource extends NuxeoBasedResource { } DocumentHandler handler = createDocumentHandler(ctx); - String relationClause = RelationsUtils.buildWhereClause(subjectCsid, subjectType, predicate, objectCsid, objectType); + String relationClause = RelationsUtils.buildWhereClause(subjectCsid, subjectType, predicate, objectCsid, objectType, subjectOrObject); handler.getDocumentFilter().appendWhereClause(relationClause, IQueryManager.SEARCH_QUALIFIER_AND); // // Handle keyword clause diff --git a/services/common/src/main/java/org/collectionspace/services/common/relation/nuxeo/RelationsUtils.java b/services/common/src/main/java/org/collectionspace/services/common/relation/nuxeo/RelationsUtils.java index 3c1b66424..cb974e88f 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/relation/nuxeo/RelationsUtils.java +++ b/services/common/src/main/java/org/collectionspace/services/common/relation/nuxeo/RelationsUtils.java @@ -52,20 +52,32 @@ public class RelationsUtils { */ public static String buildWhereClause(String subject, String subjectType, String predicate, - String object, String objectType) { + String object, String objectType, + String subjectOrObject) { String result = null; - StringBuilder stringBuilder = new StringBuilder(); + StringBuilder stringBuilder = new StringBuilder(); + if (subject != null) { stringBuilder.append(RelationConstants.NUXEO_SCHEMA_NAME + ":" + RelationJAXBSchema.SUBJECT_CSID + " = " + "'" + subject + "'"); } + // (subectCsid = ${csid} OR objectCsid = ${csid}) + if (subjectOrObject != null) { + if (stringBuilder.length() > 0) { + stringBuilder.append(IQueryManager.SEARCH_QUALIFIER_AND); + } + stringBuilder.append("(" + RelationConstants.NUXEO_SCHEMA_NAME + ":" + + RelationJAXBSchema.SUBJECT_CSID + " = " + "'" + subjectOrObject + "'"); + stringBuilder.append(" OR " + RelationConstants.NUXEO_SCHEMA_NAME + ":" + + RelationJAXBSchema.OBJECT_CSID + " = " + "'" + subjectOrObject + "'" + ")"); + } + if (subjectType != null) { if (stringBuilder.length() > 0) { stringBuilder.append(IQueryManager.SEARCH_QUALIFIER_AND); } - // BUG - this should use the new field RelationJAXBSchema.SUBJECT_DOCTYPE stringBuilder.append(RelationConstants.NUXEO_SCHEMA_NAME + ":" + RelationJAXBSchema.SUBJECT_DOCTYPE + " = " + "'" + subjectType + "'"); } diff --git a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoDocumentModelHandler.java b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoDocumentModelHandler.java index 064d12d10..640ea8b4e 100644 --- a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoDocumentModelHandler.java +++ b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoDocumentModelHandler.java @@ -273,7 +273,7 @@ public abstract class NuxeoDocumentModelHandler extends RemoteDocumentModelHa String id = NuxeoUtils.getCsid(docModel); item.put(STANDARD_LIST_CSID_FIELD, id); if (markRtSbj != null) { - String relationClause = RelationsUtils.buildWhereClause(markRtSbj, null, null, id, null); + String relationClause = RelationsUtils.buildWhereClause(markRtSbj, null, null, id, null, null); String whereClause = relationClause + IQueryManager.SEARCH_QUALIFIER_AND + NuxeoUtils.buildWorkflowNotDeletedWhereClause(); QueryContext queryContext = new QueryContext(ctx, whereClause); -- 2.47.3