@sugarcube/plugin-elasticsearch
Version:
Use [Elasticsearch](https://www.elastic.co/products/elasticsearch) for SugarCube data.
85 lines (71 loc) • 2.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _fp = require("lodash/fp");
var _dashp = require("dashp");
var _fs = _interopRequireDefault(require("fs"));
var _core = require("@sugarcube/core");
var _glob = _interopRequireDefault(require("glob"));
var _pify = _interopRequireDefault(require("pify"));
var _elastic = require("../elastic");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const globP = (0, _pify.default)(_glob.default);
const querySourceGlob = "glob_pattern";
const querySourceQuery = "elastic_query";
const plugin = async (envelope, {
cfg,
log,
stats
}) => {
const host = (0, _fp.get)("elastic.host", cfg);
const port = (0, _fp.get)("elastic.port", cfg);
const index = (0, _fp.get)("elastic.index", cfg);
const amount = (0, _fp.get)("elastic.amount", cfg);
const includeFields = (0, _fp.get)("elastic.include_fields", cfg);
const files = await (0, _dashp.flowP)([_core.envelope.queriesByType(querySourceGlob), (0, _dashp.flatmapP)(p => globP(...[p, {
nodir: true
}])), (0, _fp.map)(file => JSON.parse(_fs.default.readFileSync(file)))], envelope);
const queries = (0, _fp.flow)([_core.envelope.queriesByType(querySourceQuery), (0, _fp.map)(query => JSON.parse(query))])(envelope);
log.debug(`Read ${(0, _fp.size)(files)} bodies from file.`);
log.debug(`Read ${(0, _fp.size)(queries)} bodies from queries.`);
log.debug(`Using ${host}:${port}/${index}.`);
const bodies = [files, queries].reduce(_fp.concat, []);
return _elastic.Elastic.Do(function* queryData({
query
}) {
let results = [];
for (let body of bodies) {
if (includeFields) body = (0, _fp.merge)(body, {
_source: includeFields.concat(["_sc_*_hash"]).map(f => f.replace(/^_sc/, "$sc"))
});
const units = yield query(index, body, amount);
log.debug(`Query: ${JSON.stringify(body)}`);
results = results.concat(units);
}
log.info(`Fetched ${(0, _fp.size)(results)} units for ${(0, _fp.size)(bodies)} queries.`);
stats.count("total", (0, _fp.size)(results));
return results;
}, {
host,
port
}).then(([rs, history]) => {
history.forEach(([k, meta]) => log.debug(`${k}: ${JSON.stringify(meta)}.`));
return _core.envelope.concatData(rs, envelope);
});
};
plugin.argv = {
"elastic.amount": {
type: "number",
nargs: 1,
desc: "The amount of units to fetch."
},
"elastic.include_fields": {
type: "array",
desc: "Only include those fields when importing data."
}
};
plugin.desc = "Fetch units from Elasticsearch by query files.";
var _default = plugin;
exports.default = _default;