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