Skip to content

Commit 258db2d

Browse files
committed
fix #284 - add bulk document delete
1 parent edd1344 commit 258db2d

File tree

5 files changed

+75
-9
lines changed

5 files changed

+75
-9
lines changed

src/main/java/com/marklogic/client/document/DocumentManager.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,25 @@ public void delete(String docId)
852852
*/
853853
public void delete(String docId, Transaction transaction)
854854
throws ResourceNotFoundException, ForbiddenUserException, FailedRequestException;
855+
/**
856+
* Deletes the documents' metadata and content
857+
*
858+
* To call delete(), an application must authenticate as rest-writer or rest-admin.
859+
*
860+
* @param uris the identifiers for the documents to delete
861+
*/
862+
public void delete(String... uris)
863+
throws ResourceNotFoundException, ForbiddenUserException, FailedRequestException;
864+
/**
865+
* Deletes the documents' metadata and content from an open database transaction
866+
*
867+
* To call delete(), an application must authenticate as rest-writer or rest-admin.
868+
*
869+
* @param transaction an open transaction
870+
* @param uris the identifiers for the documents to delete
871+
*/
872+
public void delete(Transaction transaction, String... uris)
873+
throws ResourceNotFoundException, ForbiddenUserException, FailedRequestException;
855874
/**
856875
* Deletes the document metadata and content from the database
857876
*

src/main/java/com/marklogic/client/impl/DocumentManagerImpl.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,22 @@ public void delete(String uri, Transaction transaction)
843843
delete(new DocumentDescriptorImpl(uri, true), transaction);
844844
}
845845

846+
@Override
847+
public void delete(String... uris)
848+
throws ResourceNotFoundException, ForbiddenUserException,
849+
FailedRequestException
850+
{
851+
services.delete(requestLogger, null, uris);
852+
}
853+
854+
@Override
855+
public void delete(Transaction transaction, String... uris)
856+
throws ResourceNotFoundException, ForbiddenUserException,
857+
FailedRequestException
858+
{
859+
services.delete(requestLogger, transaction, uris);
860+
}
861+
846862
@Override
847863
public void delete(DocumentDescriptor desc) throws ResourceNotFoundException,
848864
ForbiddenUserException, FailedRequestException {

src/main/java/com/marklogic/client/impl/JerseyServices.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2290,13 +2290,24 @@ public void deleteSearch(RequestLogger reqlog, DeleteQueryDefinition queryDef,
22902290
throw new FailedRequestException("delete failed: "
22912291
+ status.getReasonPhrase(), extractErrorFields(response));
22922292
}
2293-
2293+
2294+
response.close();
2295+
22942296
logRequest(
22952297
reqlog,
22962298
"deleted search results in %s transaction",
22972299
getTransactionId(transaction));
22982300
}
22992301

2302+
@Override
2303+
public void delete(RequestLogger logger, Transaction transaction, String... uris)
2304+
throws ResourceNotFoundException, ForbiddenUserException, FailedRequestException
2305+
{
2306+
RequestParameters params = new RequestParameters();
2307+
addEncodedParam(((RequestParametersImplementation) params).getMapImpl(), "uri", uris);
2308+
deleteResource(logger, "documents", transaction, params, null);
2309+
}
2310+
23002311
@Override
23012312
public <T> T values(Class<T> as, ValuesDefinition valDef, String mimetype,
23022313
long start, long pageLength, Transaction transaction
@@ -4450,15 +4461,20 @@ private void checkStatus(ClientResponse response,
44504461
ClientResponse.Status status, String operation, String entityType,
44514462
String path, ResponseStatus expected) {
44524463
if (!expected.isExpected(status)) {
4464+
FailedRequest failure = extractErrorFields(response);
44534465
if (status == ClientResponse.Status.NOT_FOUND) {
44544466
throw new ResourceNotFoundException("Could not " + operation
44554467
+ " " + entityType + " at " + path,
4456-
extractErrorFields(response));
4468+
failure);
44574469
}
44584470
if (status == ClientResponse.Status.FORBIDDEN) {
4471+
if (failure.getMessageCode().equals("RESTAPI-CONTENTNOVERSION")) {
4472+
throw new FailedRequestException("Content version required to " +
4473+
operation + " " + entityType + " at " + path, failure);
4474+
}
44594475
throw new ForbiddenUserException("User is not allowed to "
44604476
+ operation + " " + entityType + " at " + path,
4461-
extractErrorFields(response));
4477+
failure);
44624478
}
44634479
throw new FailedRequestException("failed to " + operation + " "
44644480
+ entityType + " at " + path + ": "

src/main/java/com/marklogic/client/impl/RESTServices.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ public <T> T search(RequestLogger reqlog, Class<T> as, QueryDefinition queryDef,
120120

121121
public void deleteSearch(RequestLogger logger, DeleteQueryDefinition queryDef, Transaction transaction)
122122
throws ForbiddenUserException, FailedRequestException;
123+
public void delete(RequestLogger logger, Transaction transaction, String... uris)
124+
throws ResourceNotFoundException, ForbiddenUserException, FailedRequestException;
123125

124126
public Transaction openTransaction(String name, int timeLimit)
125127
throws ForbiddenUserException, FailedRequestException;

src/test/java/com/marklogic/client/test/BulkReadWriteTest.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,6 @@ public void testC_BulkSearch() {
256256
}
257257
}
258258

259-
//public void testMixedLoad() {
260259
@Test
261260
public void testD_JsonLoad() {
262261
JSONDocumentManager docMgr = Common.client.newJSONDocumentManager();
@@ -342,7 +341,7 @@ public void testE_TextLoad() {
342341
}
343342

344343
@Test
345-
public void testF_DefaultMetadata() {
344+
public void testF_DefaultMetadata() throws Throwable {
346345
// Synthesize input content
347346
StringHandle doc1 = new StringHandle(
348347
"{\"number\": 1}").withFormat(Format.JSON);
@@ -452,6 +451,24 @@ public void testF_DefaultMetadata() {
452451
} finally {
453452
documents.close();
454453
}
454+
jdm.setMetadataCategories();
455+
String[] uris = new String[] { "doc1.json", "doc2.json", "doc3.json", "doc4.json", "doc5.json",
456+
"doc6.json", "doc7.json", "doc8.json"};
457+
Transaction t1 = Common.client.openTransaction();
458+
try {
459+
// delete from within the transaction
460+
jdm.delete(t1, uris);
461+
// read from outside any transaction (the docs are still there)
462+
documents = jdm.read(uris);
463+
documents.close();
464+
assertEquals(8, documents.size());
465+
// read from inside the transaction (the docs are gone)
466+
documents = jdm.read(t1, uris);
467+
documents.close();
468+
assertEquals(0, documents.size());
469+
} finally {
470+
t1.commit();
471+
}
455472
}
456473

457474
@Test
@@ -712,9 +729,5 @@ public static void cleanUp() {
712729
DeleteQueryDefinition deleteQuery = queryMgr.newDeleteDefinition();
713730
deleteQuery.setDirectory("/cities/");
714731
queryMgr.delete(deleteQuery);
715-
JSONDocumentManager docMgr = Common.client.newJSONDocumentManager();
716-
for ( int i=1; i <= 8; i++ ) {
717-
docMgr.delete("doc" + i + ".json");
718-
}
719732
}
720733
}

0 commit comments

Comments
 (0)