]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
DRYD-131: Now supports one or more predicate query params.
authorremillet <remillet@yahoo.com>
Thu, 21 Sep 2017 22:52:38 +0000 (15:52 -0700)
committerremillet <remillet@yahoo.com>
Thu, 21 Sep 2017 22:52:38 +0000 (15:52 -0700)
services/client/src/main/java/org/collectionspace/services/client/IQueryManager.java
services/client/src/main/java/org/collectionspace/services/client/IRelationsManager.java
services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/DocumentModelHandler.java

index 9095fb9547a5251db8cf6230bfda613fd9621ca7..24e4f3a781302b3dd9939990dc34f978616d153b 100644 (file)
@@ -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";
index 62acb7a512dcc393f32aa64326a64392b0a869ca..d9a077ceb8d1b406b17bcc12826c953d3b981247 100644 (file)
@@ -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";
index 24f36c5069993aa77939032dc8fbcac57979c245..1fe322dee5dbddd59b6108bbc3cb8d7a6a60d22a 100644 (file)
@@ -461,7 +461,7 @@ public abstract class DocumentModelHandler<T, TL>
                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);
 
@@ -474,11 +474,13 @@ public abstract class DocumentModelHandler<T, TL>
                                + 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<T, TL>
                        // 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<T, TL>
                                                                + " 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<T, TL>
         
         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;
+       }
     
 }