@opra/elastic
Version:
Opra Elastic Search adapter package
33 lines (32 loc) • 970 B
JavaScript
export default function preparePatch(doc) {
const script = [];
const params = {};
_preparePatch(doc, script, params, '');
return {
source: script.join('\n'),
params,
lang: 'painless',
};
}
function _preparePatch(src, script, params, path) {
let f;
let field;
for (const [k, v] of Object.entries(src)) {
f = k.startsWith('*') ? k.substring(1) : k;
field = path ? path + '.' + f : f;
if (v == null) {
script.push(`ctx._source.remove('${field}');`);
continue;
}
if (v &&
typeof v === 'object' &&
!Array.isArray(v) &&
/** If field name starts with "*", do "replace" operation except "merge" */
!k.startsWith('*')) {
_preparePatch(v, script, params, field);
continue;
}
script.push(`ctx._source['${field}'] = params['${field}'];`);
params[field] = v;
}
}