This commit is contained in:
Jonasz Bigda
2023-03-25 21:51:42 +01:00
parent 0db1d5117e
commit b332e9ceb0
1044 changed files with 37502 additions and 63938 deletions

View File

@@ -9,10 +9,16 @@ const handleCallback = require('../utils').handleCallback;
const isObject = require('../utils').isObject;
const loadDb = require('../dynamic_loaders').loadDb;
const OperationBase = require('./operation').OperationBase;
const resolveReadPreference = require('../utils').resolveReadPreference;
const ReadPreference = require('../core').ReadPreference;
const toError = require('../utils').toError;
const Aspect = require('./operation').Aspect;
const defineAspects = require('./operation').defineAspects;
const decorateWithExplain = require('../utils').decorateWithExplain;
const maxWireVersion = require('../core/utils').maxWireVersion;
const MongoError = require('../error').MongoError;
const exclusionList = [
'explain',
'readPreference',
'session',
'bypassDocumentValidation',
@@ -59,8 +65,8 @@ class MapReduceOperation extends OperationBase {
const reduce = this.reduce;
let options = this.options;
const mapCommandHash = {
mapreduce: coll.collectionName,
let mapCommandHash = {
mapReduce: coll.collectionName,
map: map,
reduce: reduce
};
@@ -80,7 +86,7 @@ class MapReduceOperation extends OperationBase {
options = Object.assign({}, options);
// Ensure we have the right read preference inheritance
options.readPreference = resolveReadPreference(coll, options);
options.readPreference = ReadPreference.resolve(coll, options);
// If we have a read preference and inline is not set as output fail hard
if (
@@ -110,6 +116,14 @@ class MapReduceOperation extends OperationBase {
return callback(err, null);
}
if (this.explain) {
if (maxWireVersion(coll.s.topology) < 9) {
callback(new MongoError(`server does not support explain on mapReduce`));
return;
}
mapCommandHash = decorateWithExplain(mapCommandHash, this.explain);
}
// Execute command
executeCommand(coll.s.db, mapCommandHash, options, (err, result) => {
if (err) return handleCallback(callback, err);
@@ -118,6 +132,9 @@ class MapReduceOperation extends OperationBase {
return handleCallback(callback, toError(result));
}
// If an explain operation was executed, don't process the server results
if (this.explain) return callback(undefined, result);
// Create statistics value
const stats = {};
if (result.timeMillis) stats['processtime'] = result.timeMillis;
@@ -187,4 +204,6 @@ function processScope(scope) {
return new_scope;
}
defineAspects(MapReduceOperation, [Aspect.EXPLAINABLE]);
module.exports = MapReduceOperation;