Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 46 additions & 51 deletions packages/node_modules/pouchdb-abstract-mapreduce/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,16 +136,16 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {
}

function readAttachmentsAsBlobOrBuffer(res) {
res.rows.forEach(function (row) {
for (const row of res.rows) {
const atts = row.doc && row.doc._attachments;
if (!atts) {
return;
continue;
}
Object.keys(atts).forEach(function (filename) {
for (const filename of Object.keys(atts)) {
const att = atts[filename];
atts[filename].data = b64ToBluffer(att.data, att.content_type);
});
});
}
}
}

function postprocessAttachments(opts) {
Expand Down Expand Up @@ -216,12 +216,12 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {
'{group: true}');
}
}
['group_level', 'limit', 'skip'].forEach(function (optionName) {
for (const optionName of ['group_level', 'limit', 'skip']) {
const error = checkPositiveInteger(options[optionName]);
if (error) {
throw error;
}
});
}
}

async function httpQuery(db, fun, opts) {
Expand Down Expand Up @@ -298,12 +298,12 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {
}

// fail the entire request if the result contains an error
result.rows.forEach(function (row) {
for (const row of result.rows) {
/* istanbul ignore if */
if (row.value && row.value.error && row.value.error === "builtin_reduce_error") {
throw new Error(row.reason);
}
});
}

return new Promise(function (resolve) {
resolve(result);
Expand All @@ -312,13 +312,13 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {

// We are using a temporary view, terrible for performance, good for testing
body = body || {};
Object.keys(fun).forEach(function (key) {
for (const key of Object.keys(fun)) {
if (Array.isArray(fun[key])) {
body[key] = fun[key];
} else {
body[key] = fun[key].toString();
}
});
}

const response = await db.fetch('_temp_view' + params, {
headers: new Headers({'Content-Type': 'application/json'}),
Expand Down Expand Up @@ -412,8 +412,7 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {
const kvDocs = [];
const oldKeys = new Set();

for (let i = 0, len = kvDocsRes.rows.length; i < len; i++) {
const row = kvDocsRes.rows[i];
for (const row of kvDocsRes.rows) {
const doc = row.doc;
if (!doc) { // deleted
continue;
Expand All @@ -429,7 +428,7 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {
}
}
const newKeys = mapToKeysArray(indexableKeysToKeyValues);
newKeys.forEach(function (key) {
for (const key of newKeys) {
if (!oldKeys.has(key)) {
// new doc
const kvDoc = {
Expand All @@ -441,7 +440,7 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {
}
kvDocs.push(kvDoc);
}
});
}
metaDoc.keys = uniq(newKeys.concat(metaDoc.keys));
kvDocs.push(metaDoc);

Expand Down Expand Up @@ -664,8 +663,7 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {

function createDocIdsToChangesAndEmits(results) {
const docIdsToChangesAndEmits = new Map();
for (let i = 0, len = results.length; i < len; i++) {
const change = results[i];
for (const change of results) {
if (change.doc._id[0] !== '_') {
mapResults = [];
doc = change.doc;
Expand Down Expand Up @@ -718,48 +716,48 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {
}

const shouldGroup = options.group || options.group_level;

const reduceFun = reducer(view.reduceFun);

const groups = [];
const lvl = isNaN(options.group_level) ? Number.POSITIVE_INFINITY :
options.group_level;
results.forEach(function (e) {
const lvl = isNaN(options.group_level)
? Number.POSITIVE_INFINITY
: options.group_level;

for (const result of results) {
const last = groups[groups.length - 1];
let groupKey = shouldGroup ? e.key : null;
let groupKey = shouldGroup ? result.key : null;

// only set group_level for array keys
if (shouldGroup && Array.isArray(groupKey)) {
groupKey = groupKey.slice(0, lvl);
}

if (last && collate(last.groupKey, groupKey) === 0) {
last.keys.push([e.key, e.id]);
last.values.push(e.value);
return;
last.keys.push([result.key, result.id]);
last.values.push(result.value);
continue;
}
groups.push({
keys: [[e.key, e.id]],
values: [e.value],
keys: [[result.key, result.id]],
values: [result.value],
groupKey
});
});
}

results = [];
for (let i = 0, len = groups.length; i < len; i++) {
const e = groups[i];
const reduceTry = tryReduce(view.sourceDB, reduceFun, e.keys, e.values, false);
for (const group of groups) {
const reduceTry = tryReduce(view.sourceDB, reduceFun, group.keys, group.values, false);
if (reduceTry.error && reduceTry.error instanceof BuiltInError) {
// CouchDB returns an error if a built-in errors out
throw reduceTry.error;
}
results.push({
// CouchDB just sets the value to null if a non-built-in errors out
value: reduceTry.error ? null : reduceTry.output,
key: e.groupKey
key: group.groupKey
});
}
// no total_rows/offset when reducing
return {rows: sliceResults(results, options.limit, options.skip)};
return { rows: sliceResults(results, options.limit, options.skip) };
}

function queryView(view, opts) {
Expand Down Expand Up @@ -841,20 +839,18 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {
binary: opts.binary
});
const docIdsToDocs = new Map();
allDocsRes.rows.forEach(function (row) {
for (const row of allDocsRes.rows) {
docIdsToDocs.set(row.id, row.doc);
});
rows.forEach(function (row) {
}
for (const row of rows) {
const docId = rowToDocId(row);
const doc = docIdsToDocs.get(docId);
if (doc) {
row.doc = doc;
}
});
return finalResults;
} else {
return finalResults;
}
}
return finalResults;
}

if (typeof opts.keys !== 'undefined') {
Expand Down Expand Up @@ -945,7 +941,7 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {
const metaDoc = await db.get('_local/' + localDocName);
const docsToViews = new Map();

Object.keys(metaDoc.views).forEach(function (fullViewName) {
for (const fullViewName of Object.keys(metaDoc.views)) {
const parts = parseViewName(fullViewName);
const designDocName = '_design/' + parts[0];
const viewName = parts[1];
Expand All @@ -955,17 +951,17 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {
docsToViews.set(designDocName, views);
}
views.add(viewName);
});
}
const opts = {
keys : mapToKeysArray(docsToViews),
include_docs : true
};

const res = await db.allDocs(opts);
const viewsToStatus = {};
res.rows.forEach(function (row) {
for (const row of res.rows) {
const ddocName = row.key.substring(8); // cuts off '_design/'
docsToViews.get(row.key).forEach(function (viewName) {
for (const viewName of docsToViews.get(row.key)) {
let fullViewName = ddocName + '/' + viewName;
/* istanbul ignore if */
if (!metaDoc.views[fullViewName]) {
Expand All @@ -977,12 +973,11 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {
// design doc deleted, or view function nonexistent
const statusIsGood = row.doc && row.doc.views &&
row.doc.views[viewName];
viewDBNames.forEach(function (viewDBName) {
viewsToStatus[viewDBName] =
viewsToStatus[viewDBName] || statusIsGood;
});
});
});
for (const viewDBName of viewDBNames) {
viewsToStatus[viewDBName] = viewsToStatus[viewDBName] || statusIsGood;
}
}
}

const dbsToDelete = Object.keys(viewsToStatus)
.filter(function (viewDBName) { return !viewsToStatus[viewDBName]; });
Expand Down