Skip to content

Commit 2e21508

Browse files
committed
Merge branch '2.0-develop' into 2.0-master
2 parents a961eca + 3fa0c02 commit 2e21508

12 files changed

+84
-72
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ db.createCollection(
4444
{author: 'WG Sebald', ...}
4545
)
4646
.result(function(response) {
47-
console.log(JSON.stringify(response,null,2));
47+
console.log(JSON.stringify(response, null, 2));
4848
}, function (error) {
49-
console.log(JSON.stringify(error,null,2));
49+
console.log(JSON.stringify(error, null, 2));
5050
});
5151
```
5252

lib/responder.js

Lines changed: 54 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ BodyDispatcher.prototype.promise = function dispatchBodyPromise(
147147
contentType, response
148148
) {
149149
var operation = this.operation;
150-
150+
151151
operation.logger.debug('body promise');
152152
var collectObject = function collectPromiseBodyObject(data) {
153153
operation.data = operation.collectBodyObject(data);
@@ -166,7 +166,7 @@ BodyDispatcher.prototype.chunkedStream = function dispatchBodyChunkedStream(
166166
contentType, response
167167
) {
168168
var operation = this.operation;
169-
169+
170170
operation.logger.debug('body chunked stream');
171171

172172
response.pipe(operation.outputStream);
@@ -175,7 +175,7 @@ BodyDispatcher.prototype.objectStream = function dispatchBodyObjectStream(
175175
contentType, response
176176
) {
177177
var operation = this.operation;
178-
178+
179179
operation.logger.debug('body object stream');
180180

181181
var outputStream = operation.outputStream;
@@ -345,7 +345,7 @@ MultipartDispatcher.prototype.chunkedStream = function dispatchMultipartChunkedS
345345
boundary, response
346346
) {
347347
var operation = this.operation;
348-
348+
349349
var errorListener = operation.errorListener;
350350

351351
var outputStream = operation.outputStream;
@@ -414,7 +414,7 @@ MultipartDispatcher.prototype.objectStream = function dispatchMultipartObjectStr
414414
boundary, response
415415
) {
416416
var operation = this.operation;
417-
417+
418418
var errorListener = operation.errorListener;
419419

420420
var rawHeaderQueue = new FifoQueue(5);
@@ -426,31 +426,13 @@ MultipartDispatcher.prototype.objectStream = function dispatchMultipartObjectStr
426426
var hasParsed = false;
427427
var hasEnded = false;
428428

429-
var partTransform = function objectPartQueueTransform(
430-
isLast, data, objectQueue
431-
) {
429+
var partTransform = function objectPartQueueTransform(data) {
432430
parsedParts++;
431+
var objectQueue = queuedReader.getItemQueue();
433432
metadataBuffer = operation.queueDocument(
434433
(data.length === 0) ? null : data, rawHeaderQueue, metadataBuffer, objectQueue
435434
);
436-
437-
if (isLast) {
438-
if (metadataBuffer !== null) {
439-
operation.queueMetadata(metadataBuffer, objectQueue);
440-
metadataBuffer = null;
441-
}
442-
443-
rawHeaderQueue = null;
444-
queuedReader = null;
445-
parser = null;
446-
partHeadersListener = null;
447-
partListener = null;
448-
parseFinishListener = null;
449-
responseEndListener = null;
450-
partTransform = null;
451-
} else if (!hasEnded && parsedParts === parsingParts) {
452-
parser.emit('drain');
453-
}
435+
doneChecker();
454436
};
455437

456438
var queuedReader = new QueuedReader(
@@ -470,15 +452,44 @@ MultipartDispatcher.prototype.objectStream = function dispatchMultipartObjectStr
470452
queuedReader.addReader(partReadStream);
471453
};
472454

473-
var parseFinishListener = function promiseParseFinishListener() {
455+
var parseFinishListener = function objectParseFinishListener() {
474456
hasParsed = true;
475-
if (queuedReader !== null) {
476-
queuedReader.queuedAll();
477-
}
457+
doneChecker();
478458
};
479459

480-
var responseEndListener = function promiseResponseEndListener() {
460+
var responseEndListener = function objectResponseEndListener() {
481461
hasEnded = true;
462+
doneChecker();
463+
};
464+
465+
/**
466+
* Check if HTTP response has ended, Dicer has finished parsing,
467+
* and the Queue is empty. If all are true, then we can call end()
468+
* on output stream.
469+
*/
470+
var doneChecker = function doneChecker() {
471+
472+
if (queuedReader.isQueueEmpty() && hasParsed && hasEnded) {
473+
if (metadataBuffer !== null) {
474+
var objectQueue = queuedReader.getItemQueue();
475+
operation.queueMetadata(metadataBuffer, objectQueue);
476+
metadataBuffer = null;
477+
}
478+
479+
rawHeaderQueue = null;
480+
queuedReader = null;
481+
parser = null;
482+
partHeadersListener = null;
483+
partListener = null;
484+
parseFinishListener = null;
485+
responseEndListener = null;
486+
partTransform = null;
487+
488+
operation.outputStream.end();
489+
} else if (!hasEnded && parsedParts === parsingParts) {
490+
parser.emit('drain');
491+
}
492+
482493
};
483494

484495
var parser = new Dicer({boundary: boundary});
@@ -537,13 +548,10 @@ function QueuedReader(options, logger, itemsTransform) {
537548

538549
self.logger.debug('concatenated item');
539550

540-
var isLast = (self.queueDone && self.readerQueue.length() === 0 &&
541-
self.writerQueue.length() === 0);
542-
543551
var itemQueue = self.itemQueue;
544552
var beforeLength = itemQueue.length();
545553

546-
self.itemsTransform(isLast, data, itemQueue);
554+
self.itemsTransform(data);
547555

548556
if (beforeLength < itemQueue.length()) {
549557
if (beforeLength === 0) {
@@ -569,6 +577,12 @@ QueuedReader.prototype.addReader = function queuedAddReader(reader) {
569577
this.logger.debug('queued item %d', readerQueue.getTotal());
570578
this.nextReader();
571579
};
580+
QueuedReader.prototype.getItemQueue = function getItemQueue() {
581+
return this.itemQueue;
582+
};
583+
QueuedReader.prototype.isQueueEmpty = function isQueueEmpty() {
584+
return (this.readerQueue.length() === 0 && this.writerQueue.length() === 0);
585+
};
572586
QueuedReader.prototype.nextReader = function queuedReaderNextReader() {
573587
if (!this.isReading) {
574588
return;
@@ -635,12 +649,6 @@ QueuedReader.prototype._read = function queuedReaderRead(/*size*/) {
635649
this.nextReader();
636650
}
637651
};
638-
QueuedReader.prototype.queuedAll = function queuedReaderAll() {
639-
if (!this.queueDone) {
640-
this.logger.debug('queued all items');
641-
this.queueDone = true;
642-
}
643-
};
644652

645653
function FifoQueue(min) {
646654
if (!(this instanceof FifoQueue)) {
@@ -799,13 +807,13 @@ function operationResultPromise(fullfilled, rejected) {
799807
switch (operation.outputMode) {
800808
case 'none':
801809
if (operation.startedResponse === true) {
802-
throw new Error('cannot create result promise after receiving response');
810+
throw new Error('cannot create result promise after receiving response');
803811
}
804812
break;
805813
case 'promise':
806-
throw new Error('already created result promise');
814+
throw new Error('already created result promise');
807815
default:
808-
throw new Error('cannot create result promise after creating stream');
816+
throw new Error('cannot create result promise after creating stream');
809817
}
810818
operation.outputMode = 'promise';
811819

@@ -847,7 +855,7 @@ function resolvedPromise(operation, resolve) {
847855
)+' data');
848856

849857
if (!hasData) {
850-
resolve.call(operation);
858+
resolve.call(operation);
851859
} else {
852860
resolve.call(operation, data);
853861
}
@@ -932,7 +940,7 @@ function operationResultStream() {
932940
if (error != null) {
933941
var i = 0;
934942
for (; i < error.length; i++) {
935-
outputStream.emit('error', error[i]);
943+
outputStream.emit('error', error[i]);
936944
}
937945
operation.error = undefined;
938946
}

lib/values-builder.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -307,19 +307,27 @@ function udf() {
307307

308308
/**
309309
* Sets the slice clause of a built query to select the slice
310-
* of the result set based on the first tuple and the number
311-
* of tuples (aka rows).
310+
* of the result set based on the start tuple within the result set
311+
* and the number of tuples (aka rows) in the slice.
312312
* This function must be called on the builtQuery returned
313313
* by the {@link valuesBuilder#valuesFromIndexes} function
314314
* or another function specifying a values query clause.
315+
* By default, the slice uses array slice mode, but you can switch
316+
* to legacy slice mode with {@link marklogic.setSliceMode}. Legacy
317+
* slice mode is deprecated and will be removed in the next major release.
315318
* @method valuesBuilder.BuiltQuery#slice
316319
* @since 1.0
317-
* @param {number} start - the one-based position within the
318-
* result set of the first tuple.
319-
* @param {number} length - the number of tuples in the slice.
320+
* @param {number} start - in array slice mode, the zero-based position
321+
* within the result set of the first tuple; in legacy slice mode, the
322+
* one-based position within the result set of the first tuple or 0 to
323+
* suppress the tuples and return only the summary
324+
* @param {number} length - in array slice mode, the zero-based position
325+
* of the tuple after the last document in the slice or 0 to suppress
326+
* the documents and return only the summary; in legacy slice mode, the
327+
* number of tuples in the slice
320328
* @param {transform} [transform] - a transform to apply to the
321329
* slice on the server as specified by the {@link valuesBuilder#transform}
322-
* function.
330+
* function
323331
* @returns {valuesBuilder.BuiltQuery} a built query
324332
*/
325333
ValueBuilder.prototype.slice = function valuesSlice() {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"name": "marklogic",
44
"description": "The official MarkLogic Node.js client API.",
55
"homepage": "http://github.com/marklogic/node-client-api",
6-
"version": "2.0.2",
6+
"version": "2.0.3",
77
"license": "Apache-2.0",
88
"main": "./lib/marklogic.js",
99
"keywords": [

test-complete/data/geo/Prime-Meridian-json.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"line-desc":"Json Linestring In Prime-Meridian",
88
"line-vertices":"6",
99

10-
"circle":"@5673.4567 37.463235,0",
10+
"circle":"@3525 37.463235,0",
1111
"circle-desc":"Json Circle In Prime-Meridian",
1212

1313
"box":"[30.8456, -10.34634, 40.345, 10.4564]",

test-complete/data/geo/Prime-Meridian.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<line-desc>Linestring In Prime-Meridian</line-desc>
99
<line-vertices>6</line-vertices>
1010

11-
<circle>@5673.4567 37.463235,0</circle>
11+
<circle>@3525 37.463235,0</circle>
1212
<circle-desc>Circle In Prime-Meridian</circle-desc>
1313

1414
<box>[30.8456, -10.34634, 40.345, 10.4564]</box>

test-complete/nodejs-documents-extract.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ var dbAdmin = marklogic.createDatabaseClient(testconfig.restAdminConnection);
2626

2727
describe('Document extract test', function(){
2828
before(function(done){
29-
this.timeout(10000);
29+
this.timeout(30000);
3030
dbWriter.documents.write({
3131
uri: '/test/query/matchDir/doc1.json',
3232
collections: ['matchCollection1'],

test-complete/nodejs-documents-patch-2.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ var dbAdmin = marklogic.createDatabaseClient(testconfig.restAdminConnection);
2727

2828
describe('document patch test 2', function(){
2929
before(function(done){
30-
this.timeout(10000);
30+
this.timeout(30000);
3131
// NOTE: must create a string range index on rangeKey1 and rangeKey2
3232
dbWriter.documents.write({
3333
uri: '/test/query/matchDir/doc1.json',

test-complete/nodejs-documents-patch-negative.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ var dbAdmin = marklogic.createDatabaseClient(testconfig.restAdminConnection);
2727

2828
describe('document patch negative test', function(){
2929
before(function(done){
30-
this.timeout(10000);
30+
this.timeout(30000);
3131
// NOTE: must create a string range index on rangeKey1 and rangeKey2
3232
dbWriter.documents.write({
3333
uri: '/test/query/matchDir/doc1.json',

test-complete/nodejs-documents-patch.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ var dbAdmin = marklogic.createDatabaseClient(testconfig.restAdminConnection);
2727

2828
describe('document patch test', function(){
2929
before(function(done){
30-
this.timeout(6000);
30+
this.timeout(30000);
3131
// NOTE: must create a string range index on rangeKey1 and rangeKey2
3232
dbWriter.documents.write({
3333
uri: '/test/patch/doc1.json',

test-complete/nodejs-documents-qbe.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ var dbAdmin = marklogic.createDatabaseClient(testconfig.restAdminConnection);
2626

2727
describe('Document qbe test', function(){
2828
before(function(done){
29-
this.timeout(10000);
29+
this.timeout(30000);
3030
dbWriter.documents.write({
3131
uri: '/test/query/matchDir/doc1.json',
3232
collections: ['matchCollection1'],

test-complete/nodejs-documents-query-geo-region.js

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ var geoDataFiles = [
113113

114114
describe('Document geo query test', function(){
115115
before(function(done){
116-
this.timeout(10000);
116+
this.timeout(30000);
117117
dbWriter.documents.write(geoDataFiles).
118118
result(function(response){done();})
119119
.catch(done);
@@ -314,13 +314,11 @@ describe('Document geo query test', function(){
314314
).
315315
result(function(response) {
316316
//console.log(JSON.stringify(response, null, 2));
317-
response.length.should.equal(6);
317+
response.length.should.equal(4);
318318
response[0].uri.should.equal('/geo/region/test/South-More-json.json');
319319
response[1].uri.should.equal('/geo/region/test/Equator.xml');
320320
response[2].uri.should.equal('/geo/region/test/Equator-json.json');
321321
response[3].uri.should.equal('/geo/region/test/South-More.xml');
322-
response[4].uri.should.equal('/geo/region/test/Prime-Meridian.xml');
323-
response[5].uri.should.equal('/geo/region/test/Prime-Meridian-json.json');
324322
done();
325323
}, done);
326324
});
@@ -451,11 +449,9 @@ describe('Document geo query test', function(){
451449
).
452450
result(function(response) {
453451
//console.log(JSON.stringify(response, null, 2));
454-
response.length.should.equal(4);
455-
response[0].uri.should.equal('/geo/region/test/Tropic-of-Capricorn-json.json');
456-
response[1].uri.should.equal('/geo/region/test/Tropic-of-Cancer-json.json');
457-
response[2].uri.should.equal('/geo/region/test/Tropic-of-Capricorn.xml');
458-
response[3].uri.should.equal('/geo/region/test/Tropic-of-Cancer.xml');
452+
response.length.should.equal(8);
453+
response[0].uri.should.equal('/geo/region/test/International-Date-Line.xml');
454+
response[7].uri.should.equal('/geo/region/test/North-West.xml');
459455
done();
460456
}, done);
461457
});
@@ -557,7 +553,7 @@ describe('Document geo query test', function(){
557553
done();
558554
}, function(error) {
559555
//console.log(JSON.stringify(error, null, 2));
560-
error.body.errorResponse.message.should.containEql('XDMP-OPERATION');
556+
error.body.errorResponse.message.should.containEql('XDMP-INVGEOOP');
561557
done();
562558
});
563559
});

0 commit comments

Comments
 (0)