Skip to content

Commit 30369f3

Browse files
committed
Merge branch 'bulkReadWrite' of github.com:marklogic/java-client-api into dev
2 parents 331a683 + 91c5623 commit 30369f3

File tree

9 files changed

+119
-37
lines changed

9 files changed

+119
-37
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,10 @@ public <T extends R> T read(DocumentDescriptor desc, DocumentMetadataReadHandle
376376

377377
public DocumentPage read(ServerTransform transform, Transaction transaction, String... uris);
378378

379+
public DocumentPage readMetadata(String... uris);
380+
381+
public DocumentPage readMetadata(Transaction transaction, String... uris);
382+
379383
public DocumentPage search(QueryDefinition querydef, long start);
380384

381385
public DocumentPage search(QueryDefinition querydef, long start, Transaction transaction);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import com.marklogic.client.io.marker.DocumentMetadataWriteHandle;
2020

2121
public interface DocumentWriteOperation {
22-
public enum OperationType { METADATA_DEFAULT, DOCUMENT_WRITE };
22+
public enum OperationType { METADATA_DEFAULT, DISABLE_METADATA_DEFAULT, DOCUMENT_WRITE };
2323

2424
public OperationType getOperationType();
2525

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
public interface DocumentWriteSet extends Set<DocumentWriteOperation> {
2424
public DocumentWriteSet addDefault(DocumentMetadataWriteHandle metadataHandle);
2525

26+
public DocumentWriteSet disableDefault();
27+
2628
public DocumentWriteSet add(String docId, AbstractWriteHandle contentHandle);
2729

2830
public DocumentWriteSet add(String docId, DocumentMetadataWriteHandle metadataHandle, AbstractWriteHandle contentHandle);

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616
package com.marklogic.client.impl;
1717

1818
import java.util.ArrayList;
19+
import java.util.Collection;
1920
import java.util.HashSet;
2021
import java.util.Set;
2122

2223
import org.slf4j.Logger;
2324
import org.slf4j.LoggerFactory;
2425

2526
import com.fasterxml.jackson.databind.JsonNode;
26-
2727
import com.marklogic.client.DatabaseClientFactory.HandleFactoryRegistry;
2828
import com.marklogic.client.FailedRequestException;
2929
import com.marklogic.client.ForbiddenUserException;
@@ -67,6 +67,10 @@ public boolean add(Metadata e) {
6767
isProcessedMetadataModified = true;
6868
return super.add(e);
6969
}
70+
public boolean addAll(Collection<? extends Metadata> c) {
71+
isProcessedMetadataModified = true;
72+
return super.addAll(c);
73+
}
7074
};
7175
{
7276
processedMetadata.add(Metadata.ALL);
@@ -322,6 +326,13 @@ public DocumentPage read(ServerTransform transform, String... uris) {
322326
}
323327

324328
public DocumentPage read(ServerTransform transform, Transaction transaction, String... uris) {
329+
boolean withContent = true;
330+
return read(transform, transaction, withContent, uris);
331+
}
332+
333+
public DocumentPage read(ServerTransform transform, Transaction transaction,
334+
boolean withContent, String... uris)
335+
{
325336
if (uris == null || uris.length == 0)
326337
throw new IllegalArgumentException("Attempt to call read with no uris");
327338

@@ -335,9 +346,20 @@ public DocumentPage read(ServerTransform transform, Transaction transaction, Str
335346
isProcessedMetadataModified ? processedMetadata : null,
336347
responseFormat,
337348
null,
349+
withContent,
338350
uris);
339351
}
340352

353+
public DocumentPage readMetadata(String... uris) {
354+
boolean withContent = false;
355+
return read(null, null, withContent, uris);
356+
}
357+
358+
public DocumentPage readMetadata(Transaction transaction, String... uris) {
359+
boolean withContent = false;
360+
return read(null, transaction, withContent, uris);
361+
}
362+
341363
public DocumentPage search(QueryDefinition querydef, long start) {
342364
return search(querydef, start, null, null);
343365
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import com.marklogic.client.document.DocumentWriteOperation;
2121
import com.marklogic.client.document.DocumentWriteOperation.OperationType;
2222
import com.marklogic.client.impl.DocumentWriteOperationImpl;
23+
import com.marklogic.client.io.Format;
24+
import com.marklogic.client.io.StringHandle;
2325
import com.marklogic.client.io.marker.AbstractWriteHandle;
2426
import com.marklogic.client.io.marker.DocumentMetadataWriteHandle;
2527

@@ -32,6 +34,12 @@ public DocumentWriteSet addDefault(DocumentMetadataWriteHandle metadataHandle) {
3234
return this;
3335
}
3436

37+
public DocumentWriteSet disableDefault() {
38+
add(new DocumentWriteOperationImpl(OperationType.DISABLE_METADATA_DEFAULT,
39+
null, new StringHandle("{ }").withFormat(Format.JSON), null));
40+
return this;
41+
}
42+
3543
public DocumentWriteSet add(String docId, AbstractWriteHandle contentHandle) {
3644
add(new DocumentWriteOperationImpl(OperationType.DOCUMENT_WRITE,
3745
docId, null, contentHandle));

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

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -694,12 +694,12 @@ private boolean getDocumentImpl(RequestLogger reqlog,
694694
@Override
695695
public DocumentPage getBulkDocuments(RequestLogger reqlog,
696696
String transactionId, Set<Metadata> categories,
697-
Format format, RequestParameters extraParams, String... uris)
697+
Format format, RequestParameters extraParams, boolean withContent, String... uris)
698698
throws ResourceNotFoundException, ForbiddenUserException, FailedRequestException {
699699
boolean hasMetadata = categories != null && categories.size() > 0;
700700
JerseyResultIterator iterator =
701-
getBulkDocumentsImpl(reqlog, transactionId, categories, format, extraParams, uris);
702-
return convertToDocumentPage(iterator, hasMetadata);
701+
getBulkDocumentsImpl(reqlog, transactionId, categories, format, extraParams, withContent, uris);
702+
return convertToDocumentPage(iterator, withContent, hasMetadata);
703703
}
704704

705705
@Override
@@ -708,34 +708,38 @@ public DocumentPage getBulkDocuments(RequestLogger reqlog,
708708
long start, long pageLength,
709709
String transactionId,
710710
SearchReadHandle searchHandle, QueryView view,
711-
Set<Metadata> categories, Format format, RequestParameters extraParams)
711+
Set<Metadata> categories, Format format, RequestParameters extraParams)
712712
throws ResourceNotFoundException, ForbiddenUserException, FailedRequestException {
713713
boolean hasMetadata = categories != null && categories.size() > 0;
714+
boolean hasContent = true;
714715
JerseyResultIterator iterator =
715716
getBulkDocumentsImpl(reqlog, querydef, start, pageLength, transactionId,
716717
searchHandle, view, categories, format, extraParams);
717-
return convertToDocumentPage(iterator, hasMetadata);
718+
return convertToDocumentPage(iterator, hasContent, hasMetadata);
718719
}
719720

720-
private DocumentPage convertToDocumentPage(JerseyResultIterator iterator, boolean hasMetadata) {
721+
private DocumentPage convertToDocumentPage(JerseyResultIterator iterator, boolean hasContent,
722+
boolean hasMetadata)
723+
{
721724
ArrayList<DocumentRecord> records = new ArrayList<DocumentRecord>();
722725
if ( iterator == null ) {
723726
return new DocumentPageImpl(records, 1, 0, 0, 0);
724727
}
725728
while (iterator.hasNext()) {
726729
JerseyResult result = iterator.next();
727730
DocumentRecord record;
728-
if ( hasMetadata ) {
729-
if ( ! iterator.hasNext() ) {
730-
throw new MarkLogicInternalException(
731-
"Metadata and content parts should always come in pairs!");
732-
}
731+
if ( hasContent && hasMetadata ) {
733732
JerseyResult metadata = result;
734733
JerseyResult content = iterator.next();
735734
record = new JerseyDocumentRecord(content, metadata);
736-
} else {
735+
} else if ( hasContent ) {
737736
JerseyResult content = result;
738737
record = new JerseyDocumentRecord(content);
738+
} else if ( hasMetadata ) {
739+
JerseyResult metadata = result;
740+
record = new JerseyDocumentRecord(null, metadata);
741+
} else {
742+
throw new IllegalStateException("Should never have neither content nor metadata");
739743
}
740744
records.add(record);
741745
}
@@ -745,12 +749,11 @@ record = new JerseyDocumentRecord(content);
745749

746750
private JerseyResultIterator getBulkDocumentsImpl(RequestLogger reqlog,
747751
String transactionId, Set<Metadata> categories,
748-
Format format, RequestParameters extraParams, String... uris)
752+
Format format, RequestParameters extraParams, boolean withContent, String... uris)
749753
throws ResourceNotFoundException, ForbiddenUserException, FailedRequestException {
750754

751755
String path = "documents";
752756
RequestParameters params = new RequestParameters();
753-
boolean withContent = true;
754757
addCategoryParams(categories, params, withContent);
755758
if (format != null) params.add("format", format.toString().toLowerCase());
756759
for (String uri: uris) {
@@ -3431,7 +3434,15 @@ public <R extends AbstractReadHandle> R postBulkDocuments(
34313434
HandleAccessor.checkHandle(write.getMetadata(), "write");
34323435
HandleImplementation content =
34333436
HandleAccessor.checkHandle(write.getContent(), "write");
3434-
if ( metadata != null ) {
3437+
if ( write.getOperationType() ==
3438+
DocumentWriteOperation.OperationType.DISABLE_METADATA_DEFAULT )
3439+
{
3440+
MultivaluedMap headers = new MultivaluedMapImpl();
3441+
headers.add(HttpHeaders.CONTENT_TYPE, metadata.getMimetype());
3442+
headers.add("Content-Disposition", "inline; category=metadata");
3443+
headerList.add(headers);
3444+
writeHandles.add(write.getMetadata());
3445+
} else if ( metadata != null ) {
34353446
MultivaluedMap headers = new MultivaluedMapImpl();
34363447
headers.add(HttpHeaders.CONTENT_TYPE, metadata.getMimetype());
34373448
if ( write.getOperationType() == DocumentWriteOperation.OperationType.METADATA_DEFAULT ) {
@@ -4393,7 +4404,13 @@ public JerseyDocumentRecord(JerseyResult content) {
43934404
}
43944405

43954406
public String getUri() {
4396-
return content.getUri();
4407+
if ( content == null && metadata != null ) {
4408+
return metadata.getUri();
4409+
} else if ( content != null ) {
4410+
return content.getUri();
4411+
} else {
4412+
throw new IllegalStateException("Missing both content and metadata!");
4413+
}
43974414
}
43984415

43994416
public Format getFormat() {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ public DocumentDescriptor head(RequestLogger logger, String uri, String transact
7474
throws ForbiddenUserException, FailedRequestException;
7575

7676
public DocumentPage getBulkDocuments(RequestLogger logger, String transactionId,
77-
Set<Metadata> categories, Format format, RequestParameters extraParams, String... uris)
77+
Set<Metadata> categories, Format format, RequestParameters extraParams,
78+
boolean withContent, String... uris)
7879
throws ResourceNotFoundException, ForbiddenUserException, FailedRequestException;
7980
public DocumentPage getBulkDocuments(RequestLogger logger, QueryDefinition querydef,
8081
long start, long pageLength, String transactionId, SearchReadHandle searchHandle,

src/main/java/com/marklogic/client/io/DocumentMetadataHandle.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ private PropertiesImpl() {
278278
private DocumentPermissions permissions;
279279
private DocumentProperties properties;
280280
private int quality = 0;
281+
private boolean qualityModified = false;
281282
private ValueSerializer valueSerializer;
282283

283284
/**
@@ -407,6 +408,7 @@ public int getQuality() {
407408
*/
408409
public void setQuality(int quality) {
409410
this.quality = quality;
411+
this.qualityModified = true;
410412
}
411413
/**
412414
* Locally specifies the match quality for the document.
@@ -696,6 +698,7 @@ private void sendMetadataImpl(OutputStream out) {
696698
}
697699
}
698700
private void sendCollectionsImpl(XMLStreamWriter serializer) throws XMLStreamException {
701+
if ( getCollections() == null || getCollections().size() == 0 ) return;
699702
serializer.writeStartElement("rapi", "collections", REST_API_NS);
700703

701704
for (String collection: getCollections()) {
@@ -707,6 +710,7 @@ private void sendCollectionsImpl(XMLStreamWriter serializer) throws XMLStreamExc
707710
serializer.writeEndElement();
708711
}
709712
private void sendPermissionsImpl(XMLStreamWriter serializer) throws XMLStreamException {
713+
if ( getPermissions() == null || getPermissions().size() == 0 ) return;
710714
serializer.writeStartElement("rapi", "permissions", REST_API_NS);
711715

712716
for (Map.Entry<String, Set<Capability>> permission: getPermissions().entrySet()) {
@@ -728,6 +732,7 @@ private void sendPermissionsImpl(XMLStreamWriter serializer) throws XMLStreamExc
728732
serializer.writeEndElement();
729733
}
730734
private void sendPropertiesImpl(final XMLStreamWriter serializer) throws XMLStreamException, TransformerFactoryConfigurationError, TransformerException {
735+
if ( getProperties() == null || getProperties().size() == 0 ) return;
731736
serializer.writeStartElement("prop", "properties", PROPERTY_API_NS);
732737

733738
for (Map.Entry<QName, Object> property: getProperties().entrySet()) {
@@ -765,6 +770,7 @@ private void sendPropertiesImpl(final XMLStreamWriter serializer) throws XMLStre
765770
serializer.writeEndElement();
766771
}
767772
private void sendQualityImpl(XMLStreamWriter serializer) throws XMLStreamException {
773+
if ( qualityModified == false ) return;
768774
serializer.writeStartElement("rapi", "quality", REST_API_NS);
769775
serializer.writeCharacters(String.valueOf(getQuality()));
770776
serializer.writeEndElement();

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

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,12 @@ public void testF_DefaultMetadata() {
277277
"{\"number\": 4}").withFormat(Format.JSON);
278278
StringHandle doc5 = new StringHandle(
279279
"{\"number\": 5}").withFormat(Format.JSON);
280+
StringHandle doc6 = new StringHandle(
281+
"{\"number\": 6}").withFormat(Format.JSON);
282+
StringHandle doc7 = new StringHandle(
283+
"{\"number\": 7}").withFormat(Format.JSON);
284+
StringHandle doc8 = new StringHandle(
285+
"{\"number\": 8}").withFormat(Format.JSON);
280286

281287
// Synthesize input metadata
282288
DocumentMetadataHandle defaultMetadata1 =
@@ -303,6 +309,14 @@ public void testF_DefaultMetadata() {
303309
batch.addDefault(defaultMetadata2);
304310
batch.add("doc5.json", doc5); // batch default
305311

312+
// replace default metadata with blank metadata (back to system defaults)
313+
batch.disableDefault();
314+
batch.add("doc6.json", doc6); // system default metadata
315+
batch.addDefault(defaultMetadata1);
316+
batch.add("doc7.json", doc7); // batch default metadata
317+
batch.disableDefault();
318+
batch.add("doc8.json", doc8); // system default metadata
319+
306320
// Execute the write operation
307321
jdm.write(batch);
308322

@@ -323,29 +337,37 @@ public void testF_DefaultMetadata() {
323337
assertEquals("Doc3 should be in the collection \"myCollection\", from the document-specific metadata.",
324338
"myCollection", collections.iterator().next());
325339

326-
//
327-
assertEquals("Doc4 should also use the 1st batch default metadata, with quality 1", defaultMetadata1.getQuality(),
328-
jdm.readMetadata("doc4.json", new DocumentMetadataHandle()).getQuality());
329-
assertEquals("Doc5 should use the 2nd batch default metadata, with quality 2", defaultMetadata2.getQuality(),
330-
jdm.readMetadata("doc5.json", new DocumentMetadataHandle()).getQuality());
331-
332-
// let's check getting just quality metadata with content in bulk read
340+
// let's check getting content with just quality in the metadata
333341
jdm.setMetadataCategories(Metadata.QUALITY);
334-
DocumentPage documents = jdm.read("doc1.json", "doc2.json", "doc3.json");
342+
DocumentPage documents = jdm.read("doc4.json", "doc5.json");
335343

336344
for ( DocumentRecord doc: documents ) {
337345
DocumentMetadataHandle metadata = doc.getMetadata(new DocumentMetadataHandle());
338346
StringHandle content = doc.getContent(new StringHandle());
339-
if ( "doc1.json".equals(doc.getUri()) ) {
340-
assertEquals("Doc 1 should have the system default quality of 0", 0, metadata.getQuality());
341-
assertTrue("Doc 1 contents are wrong", content.get().matches("\\{\"number\": ?1\\}"));
342-
} else if ( "doc2.json".equals(doc.getUri()) ) {
343-
assertEquals("Doc 2 should use the first batch default metadata, with quality 1", 1, metadata.getQuality());
344-
assertTrue("Doc 2 contents are wrong", content.get().matches("\\{\"number\": ?2\\}"));
345-
} else if ( "doc3.json".equals(doc.getUri()) ) {
346-
assertEquals("Doc 3 should have the system default document quality (0) because quality " +
347-
"was not included in the document-specific metadata.", 0, metadata.getQuality());
348-
assertTrue("Doc 3 contents are wrong", content.get().matches("\\{\"number\": ?3\\}"));
347+
if ( "doc4.json".equals(doc.getUri()) ) {
348+
assertEquals("Doc4 should also use the 1st batch default metadata, with quality 1", 1,
349+
metadata.getQuality());
350+
assertTrue("Doc 4 contents are wrong", content.get().matches("\\{\"number\": ?4\\}"));
351+
} else if ( "doc5.json".equals(doc.getUri()) ) {
352+
assertEquals("Doc5 should use the 2nd batch default metadata, with quality 2", 2,
353+
metadata.getQuality());
354+
assertTrue("Doc 5 contents are wrong", content.get().matches("\\{\"number\": ?5\\}"));
355+
}
356+
}
357+
358+
// now try with just metadata
359+
documents = jdm.readMetadata("doc6.json", "doc7.json", "doc8.json");
360+
for ( DocumentRecord doc: documents ) {
361+
DocumentMetadataHandle metadata = doc.getMetadata(new DocumentMetadataHandle());
362+
if ( "doc6.json".equals(doc.getUri()) ) {
363+
assertEquals("Doc 6 should have the system default quality of 0", 0,
364+
metadata.getQuality());
365+
} else if ( "doc7.json".equals(doc.getUri()) ) {
366+
assertEquals("Doc7 should also use the 1st batch default metadata, with quality 1", 1,
367+
metadata.getQuality());
368+
} else if ( "doc8.json".equals(doc.getUri()) ) {
369+
assertEquals("Doc 8 should have the system default quality of 0", 0,
370+
metadata.getQuality());
349371
}
350372
}
351373
}

0 commit comments

Comments
 (0)