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 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);
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 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 = relObjectCsidCol + " = " + targetCsidCol
- + " OR " + relSubjectCsidCol + " = " + targetCsidCol;
- theWhereClause = relSubjectCsidCol + " = " + "'" + asEitherCsid + "'"
- + " OR " + relObjectCsidCol + " = " + "'" + asEitherCsid + "'";
+// } 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.");
if (handler.isCMISQuery() == true) {
String inList = buildInListForDocTypes(docTypes);
ctx.getQueryParams().add(IQueryManager.SEARCH_RELATED_MATCH_OBJ_DOCTYPES, inList);
- docList = getFilteredCMIS(repoSession, ctx, handler, queryContext);
+ if (isSubjectOrObjectQuery(ctx)) {
+ docList = getFilteredCMISForSubjectOrObject(repoSession, ctx, handler, queryContext);
+ } else {
+ docList = getFilteredCMIS(repoSession, ctx, handler, queryContext);
+ }
} else {
String query = NuxeoUtils.buildNXQLQuery(docTypes, queryContext);
if (logger.isDebugEnabled()) {
return wrapDoc;
}
- /**
+ private DocumentModelList getFilteredCMISForSubjectOrObject(CoreSessionInterface repoSession,
+ ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx, DocumentHandler handler, QueryContext queryContext) throws DocumentNotFoundException, DocumentException {
+ DocumentModelList result = null;
+
+ if (isSubjectOrObjectQuery(ctx) == true) {
+ MultivaluedMap<String, String> queryParams = ctx.getQueryParams();
+ String asEitherCsid = (String)queryParams.getFirst(IQueryManager.SEARCH_RELATED_TO_CSID_AS_EITHER);
+
+ queryParams.remove(IQueryManager.SEARCH_RELATED_TO_CSID_AS_SUBJECT);
+ queryParams.remove(IQueryManager.SEARCH_RELATED_TO_CSID_AS_OBJECT);
+
+ //
+ // First query for subjectCsid results.
+ //
+ queryParams.addFirst(IQueryManager.SEARCH_RELATED_TO_CSID_AS_SUBJECT, asEitherCsid);
+ DocumentModelList subjectDocList = getFilteredCMIS(repoSession, ctx, handler, queryContext);
+ queryParams.remove(IQueryManager.SEARCH_RELATED_TO_CSID_AS_SUBJECT);
+
+ //
+ // Next query for objectCsid results.
+ //
+ queryParams.addFirst(IQueryManager.SEARCH_RELATED_TO_CSID_AS_OBJECT, asEitherCsid);
+ DocumentModelList objectDocList = getFilteredCMIS(repoSession, ctx, handler, queryContext);
+ queryParams.remove(IQueryManager.SEARCH_RELATED_TO_CSID_AS_OBJECT);
+
+ //
+ // Finally, combine the two results
+ //
+ result = mergeDocumentModelLists(subjectDocList, objectDocList);
+ }
+
+ return result;
+ }
+
+ private DocumentModelList mergeDocumentModelLists(DocumentModelList subjectDocList,
+ DocumentModelList objectDocList) {
+ DocumentModelList result = null;
+
+ if (subjectDocList == null || subjectDocList.isEmpty()) {
+ return objectDocList;
+ }
+
+ if (objectDocList == null || objectDocList.isEmpty()) {
+ return subjectDocList;
+ }
+
+ result = new DocumentModelListImpl();
+
+ // Add the subject list
+ Iterator<DocumentModel> iterator = subjectDocList.iterator();
+ while (iterator.hasNext()) {
+ DocumentModel dm = iterator.next();
+ addToResults(result, dm);
+ }
+
+ // Add the object list
+ iterator = objectDocList.iterator();
+ while (iterator.hasNext()) {
+ DocumentModel dm = iterator.next();
+ addToResults(result, dm);
+ }
+
+ // Set the 'totalSize' value for book keeping sake
+ ((DocumentModelListImpl) result).setTotalSize(result.size());
+
+ return result;
+ }
+
+ //
+ // Only add if it is not already in the list
+ private void addToResults(DocumentModelList result, DocumentModel dm) {
+ Iterator<DocumentModel> iterator = result.iterator();
+ boolean found = false;
+
+ while (iterator.hasNext()) {
+ DocumentModel existingDm = iterator.next();
+ if (existingDm.getId().equals(dm.getId())) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found == false) {
+ result.add(dm);
+ }
+ }
+
+ private boolean isSubjectOrObjectQuery(ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx) {
+ MultivaluedMap<String, String> queryParams = ctx.getQueryParams();
+ String asEitherCsid = (String)queryParams.getFirst(IQueryManager.SEARCH_RELATED_TO_CSID_AS_EITHER);
+ return asEitherCsid != null && !asEitherCsid.isEmpty();
+ }
+
+ /**
* Find a list of documentModels from the Nuxeo repository
*
* @param docTypes a list of DocType names to match
if (handler.isJDBCQuery() == true) {
docList = getFilteredJDBC(repoSession, ctx, handler);
// CMIS query
- } else if (handler.isCMISQuery() == true) {
- docList = getFilteredCMIS(repoSession, ctx, handler, queryContext); //FIXME: REM - Need to deal with paging info in CMIS query
+ } else if (handler.isCMISQuery() == true) { //FIXME: REM - Need to deal with paging info in CMIS query
+ if (isSubjectOrObjectQuery(ctx)) {
+ docList = getFilteredCMISForSubjectOrObject(repoSession, ctx, handler, queryContext);
+ } else {
+ docList = getFilteredCMIS(repoSession, ctx, handler, queryContext);
+ }
// NXQL query
} else {
String query = NuxeoUtils.buildNXQLQuery(queryContext);