1 var REST = library.REST.REST();
  2 var mySearch = null;
  3 
  4 /**
  5  * Builds a Boolean criterion
  6  * @returns BooleanCriterion
  7  */
  8 function buildCriterion(theJSONSearch) {
  9   var aBooleanCriterion = new BooleanCriterion(theJSONSearch.conjunction);
 10   for (var i = 0; i < theJSONSearch.criteria.length; i++) {
 11     var aJSONCriterion = theJSONSearch.criteria[i];
 12     var aCriterion;
 13     if (aJSONCriterion.conjunction) {
 14       aCriterion = buildCriterion(aJSONCriterion);
 15     } else {
 16       var aProperty = REST.getProperty(aJSONCriterion.fieldId);
 17       if (aProperty.namespace === "database") {
 18         aCriterion = new DatabaseCriterion(aProperty.name);
 19       } else {
 20         aCriterion = new XmpCriterion(aProperty);
 21       }
 22       aCriterion.setCondition(aJSONCriterion.condition);
 23       if (aProperty.name == "directory") {
 24         aCriterion.setValue(REST.getFullPath(aJSONCriterion.value));
 25       } else {
 26         aCriterion.setValue(aJSONCriterion.value);
 27       }
 28     }
 29     aBooleanCriterion.addCriterion(aCriterion);
 30   }
 31   return aBooleanCriterion;
 32 }
 33 
 34 /**
 35  * returns a Search wrapper created from the JSON search object
 36  * @param theJSONSearch the search object
 37  * @param theQuickSearch a quicksearch to include with the search object
 38  * @returns {Search}
 39  */
 40 function generateSearch(theJSONSearch, theQuickSearch) {
 41   var aSearch = new Search();
 42   var aCriteria = new Criteria("and");
 43   if (!!theQuickSearch) {
 44     var aQSCriteria = searchManager
 45       .createQuickSearch(theQuickSearch)
 46       .getCriteria();
 47     var aQSCriterion = aQSCriteria.getRootCriterion();
 48     aCriteria.addCriterion(aQSCriterion);
 49   }
 50   aCriteria.addCriterion(buildCriterion(theJSONSearch));
 51   aSearch.setCriteria(aCriteria);
 52   return aSearch;
 53 }
 54 
 55 /**
 56  * Adds a result to the result array in myData
 57  * @param theManagedFile
 58  */
 59 function search() {
 60   var aResults = REST.executeSearchWithPaging(mySearch);
 61   for (var i in aResults) {
 62     REST.push(aResults[i], {}, true);
 63   }
 64 }
 65 
 66 /**
 67  * @name Search
 68  * @class Runs a search for assets.
 69  * @description Runs a search and displays the asset info for each result
 70  * @param search a JSON search object to execute.
 71  * search =
 72  * {
 73  *      "conjunction":"or",
 74  *      "criteria":
 75  *          [
 76  *              {
 77  *                  "fieldId":"http://purl.org/dc/elements/1.1/ subject",
 78  *                  "condition":"cont",
 79  *                  "value":"newValue"
 80  *              },
 81  *              {
 82  *                  "fieldId":"directory",
 83  *                  "condition":"beg",
 84  *                  "value":"Upload"
 85  *              }
 86  *          ]
 87  *  }
 88  * @param [savedSearchId] the ID of the saved search to execute
 89  * @param [pageSize=100] the number of assets to give in the response
 90  * @param [pageIndex=0] the index of the page to return
 91  * @param [sortField] the namespace of the desired field ex "record_id" or "http://purl.org/dc/elements/1.1/ subject"
 92  * @param [sortDirection] "ASC" or "DESC".  the order in which the sortFiled should be applied
 93  * @param [verbose=false] Setting this to true will collect a variety of default values for each asset.
 94  * @param [FILTERS] Filtering can be applied to the "id", "name", "path", "height", "width", "bytes", "lastModified", "mimeType", and "resolver" properties if verbose=true.
 95  * @param [fields] An array of field id's to collect the values for each asset
 96  * @returns [{AssetData}, ... ]
 97  <br>
 98  * Supported Search Conditions
 99  * <ul>
100  <li>Container Fields</li>
101  <ul>
102  <li>cont</li>
103  <li>not_cont</li>
104  <li>not</li>
105  <li>null</li>
106  <li>cont_part</li>
107  <li>not_cont_part</li>
108  </ul>
109  <li>Integer Fields</li>
110  <ul>
111  <li>not</li>
112  <li>null</li>
113  <li>eq</li>
114  <li>ne</li>
115  <li>le</li>
116  <li>lt</li>
117  <li>ge</li>
118  <li>gt</li>
119  <li>anyval</li>
120  <li>notchanged</li>
121  </ul>
122  <li>Hierarchy Fields</li>
123  <ul>
124  <li>not</li>
125  <li>null</li>
126  <li>eq</li>
127  <li>ne</li>
128  <li>cont</li>
129  <li>not_cont</li>
130  <li>anyval</li>
131  <li>notchanged</li>
132  </ul>
133  <li>Date Fields</li>
134  <ul>
135  <li>not</li>
136  <li>null</li>
137  <li>eq</li>
138  <li>ne</li>
139  <li>le</li>
140  <li>lt</li>
141  <li>ge</li>
142  <li>gt</li>
143  <li>between</li>
144  <li>anyval</li>
145  <li>notchanged</li>
146  </ul>
147  <li>Other Fields</li>
148  <ul>
149  <li>not</li>
150  <li>null</li>
151  <li>eq</li>
152  <li>ne</li>
153  <li>beg</li>
154  <li>not_beg</li>
155  <li>end</li>
156  <li>not_end</li>
157  <li>cont</li>
158  <li>not_cont</li>
159  <li>all</li>
160  <li>any</li>
161  <li>phrase</li>
162  <li>wo</li>
163  <li>anyval</li>
164  <li>notchanged</li>
165  </ul>
166  </ul>
167  *
168  *<br>
169  * English Translations
170  * <ul>
171  *     <li>eq = Equals</li>
172  *     <li>ne = Does not equal</li>
173  *     <li>lt = Less than</li>
174  *     <li>le = Less than or equal to</li>
175  *     <li>gt = Greater than</li>
176  *     <li>ge = Greater than or equal to</li>
177  *     <li>between = Between</li>
178  *     <li>cont = Contains</li>
179  *     <li>not_cont = Does not contain</li>
180  *     <li>beg = Begins with</li>
181  *     <li>not_beg = Does not begin with</li>
182  *     <li>end = Ends with</li>
183  *     <li>not_end = does not end with</li>
184  *     <li>null = is null</li>
185  *     <li>not = is not null</li>
186  *     <li>cont_part = Contains partial value</li>
187  *     <li>not_cont_part = Does not contain partial value</li>
188  *     <li>anyval = Any value</li>
189  *     <li>all = All words</li>
190  *     <li>any = Any Words</li>
191  *     <li>phrase = Has Exact phrase</li>
192  *     <li>wo = Without word</li>
193  * </ul>
194  *
195  * @example A search for assets where the Dublin Core Keywords field contains the value "newValue"
196  * /wf/restapi/v2/search
197  *
198  * Parameters:
199  * fields = ["http://purl.org/dc/elements/1.1/ subject"]
200  * search =
201  * {
202  *      "conjunction":"or",
203  *      "criteria":
204  *          [
205  *              {
206  *                  "fieldId":"http://purl.org/dc/elements/1.1/ subject",
207  *                  "condition":"cont",
208  *                  "value":"newValue"
209  *              }
210  *          ]
211  *  }
212  *
213  Response:
214  [
215     {
216 	 "id": 201628187,
217 	 "fields": {
218 	   "http://purl.org/dc/elements/1.1/ subject": [
219 		 "newValue",
220 		 "newValue"
221 	   ]
222 	 }
223    },
224  ]
225 
226  * @example A search for assets where the Dublin Core Keywords field contains the value "newValue" or "check"
227  * /wf/restapi/v2/search
228  *
229  * Parameters:
230  * fields = ["http://purl.org/dc/elements/1.1/ subject"]
231  * search =
232  * {
233  *      "conjunction":"or",
234  *      "criteria":
235  *          [
236  *              {
237  *                  "fieldId":"http://purl.org/dc/elements/1.1/ subject",
238  *                  "condition":"cont",
239  *                  "value":"newValue"
240  *              },
241  *              {
242  *                  "fieldId":"http://purl.org/dc/elements/1.1/ subject",
243  *                  "condition":"cont",
244  *                  "value":"check"
245  *              }
246  *          ]
247  *  }
248  *
249  Response:
250  [
251     {
252 		"id": 201629260,
253 		"fields": {
254 		  "http://purl.org/dc/elements/1.1/ subject": [
255 			"check",
256 			"1",
257 			"2"
258 		  ]
259 		}
260 	},
261 	 {
262 	   "id": 201628187,
263 	   "fields": {
264 		 "http://purl.org/dc/elements/1.1/ subject": [
265 		   "newValue",
266 		   "newValue"
267 		 ]
268 	   }
269 	 }
270  ]
271 
272  * @example Include a quick search with the search object
273  * /wf/restapi/v2/search
274  *
275  * Parameters:
276  * quickSearch=apple
277  * verbose=true
278  * search =
279 {
280 	 "conjunction":"AND",
281 	 "criteria":[
282 		 {
283 			 "fieldId":"file_name",
284 			 "condition":"ne",
285 			 "value":"__easter_egg__"
286 		 }
287 	 ]
288 }
289  *
290  Response:
291 [
292  {
293    "id": 201631733,
294    "name": "apple.jpeg",
295    "path": "apple.jpeg",
296    "height": 240,
297    "width": 210,
298    "bytes": 40335,
299    "lastModified": 1518701186000,
300    "mimeType": "image/jpeg",
301    "previews": {
302 	 "thumbnail": "http://10.31.210.2:55555/servlet/jb.view?table=thumbnails&col=thumbnails&id=pe_323031363331373333",
303 	 "viewex": "http://10.31.210.2:55555/servlet/jb.view?table=viewex&col=viewex&id=pe_323031363331373333",
304 	 "downloadUrl": "http://10.31.210.2:55555/servlet/dload?id=pe_323031363331373333"
305    }
306  }
307 ]
308 
309  * @example Include a saved search ID instead of a JSON search
310  * /wf/restapi/v2/search
311  *
312  * Parameters:
313  * savedSearchId=1
314  * verbose=true
315  *
316  Response:
317  [
318 	 {
319 	   "savedSearchId": 201631733,
320 	   "name": "apple.jpeg",
321 	   "path": "apple.jpeg",
322 	   "height": 240,
323 	   "width": 210,
324 	   "bytes": 40335,
325 	   "lastModified": 1518701186000,
326 	   "mimeType": "image/jpeg",
327 	   "previews": {
328 		 "thumbnail": "http://10.31.210.2:55555/servlet/jb.view?table=thumbnails&col=thumbnails&id=pe_323031363331373333",
329 		 "viewex": "http://10.31.210.2:55555/servlet/jb.view?table=viewex&col=viewex&id=pe_323031363331373333",
330 		 "downloadUrl": "http://10.31.210.2:55555/servlet/dload?id=pe_323031363331373333"
331 	   }
332 	 }
333  ]
334  */
335 function main() {
336   try {
337     var aSavedSearchId = context.getParameter("savedSearchId");
338     var aSearchObject = context.getParameter("search");
339     var aQuickSearchTerm = context.getParameter("quickSearch");
340     mySearch = generateSearch(aSearchObject, aQuickSearchTerm);
341     if (!!aSavedSearchId) {
342       var aSavedSearch = searchManager.getSearch(aSavedSearchId);
343       if (!!aSearchObject || !!aQuickSearchTerm) {
344         var aSavedSearchCriterion = aSavedSearch
345           .getCriteria()
346           .getRootCriterion();
347         var aBuiltSearchCriterion = mySearch.getCriteria().getRootCriterion();
348         var aCombinedCriteria = new Criteria("and");
349         aCombinedCriteria.addCriterion(aSavedSearchCriterion);
350         aCombinedCriteria.addCriterion(aBuiltSearchCriterion);
351         mySearch.setCriteria(aCombinedCriteria);
352       }
353     }
354   } catch (anE) {
355     REST.pushError(
356       REST.errors.e400,
357       "Failed to build search with search=" + JSON.stringify(mySearch),
358       anE
359     );
360   }
361   REST.setCallback(search);
362   return REST.execute();
363 }
364 
365 main();
366