@attivio/suit
Version:
Attivio SUIT, the Search UI Toolkit, is a library for creating search clients for searching the Attivio platform.
87 lines (68 loc) • 2.81 kB
JavaScript
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
import QueryResponse from '../api/QueryResponse';
import SearchDocument from '../api/SearchDocument';
import SearchFacet from '../api/SearchFacet';
/**
* Convert the response from a call to the Elasticsearch
* engine into an Attivio QueryResponse so that it can be
* processed by the Search UI.
*/
var ElasticToQueryResponse = function () {
function ElasticToQueryResponse() {
_classCallCheck(this, ElasticToQueryResponse);
}
ElasticToQueryResponse.convert = function convert(json, customOptions) {
var result = new QueryResponse();
if (json.took) {
result.totalTime = json.took;
}
if (json.hits.total) {
result.totalHits = json.hits.total;
}
if (json.hits.hits.length > 0) {
result.documents = ElasticToQueryResponse.getElasticDocuments(json.hits.hits, customOptions);
}
if (json.aggregations || Object.keys(json.aggregations).length > 0) {
result.facets = ElasticToQueryResponse.getElasticFacets(json.aggregations, customOptions);
}
return result;
};
/**
* Turn non-array field values into arrays.
*/
ElasticToQueryResponse.wrapIfNotArray = function wrapIfNotArray(v) {
return Array.isArray(v) ? v : [v];
};
ElasticToQueryResponse.getElasticDocuments = function getElasticDocuments(documents, customOptions) {
return documents.map(function (doc) {
var mapp = customOptions.mappings;
var fields = {};
Object.keys(mapp).forEach(function (k) {
if (mapp[k] && doc._source[mapp[k]]) {
// eslint-disable-line no-underscore-dangle
fields[k] = ElasticToQueryResponse.wrapIfNotArray(doc._source[mapp[k]]); // eslint-disable-line no-underscore-dangle
}
});
fields['.id'] = [doc._id]; // eslint-disable-line no-underscore-dangle
fields['.score'] = [doc._score || 0]; // eslint-disable-line no-underscore-dangle
return SearchDocument.fromJson({ fields: fields });
});
};
ElasticToQueryResponse.getElasticFacets = function getElasticFacets(facets, customOptions) {
return Object.keys(facets).map(function (field) {
var facetConfig = customOptions.facets.find(function (f) {
return f.field === field;
}) || {};
return SearchFacet.fromJson({
name: facetConfig.field,
field: facetConfig.field,
label: facetConfig.displayName,
buckets: facets[field].buckets.map(function (b) {
return { value: b.key, count: b.doc_count, filter: facetConfig.field + ':\'' + b.key + '\'' };
})
});
});
};
return ElasticToQueryResponse;
}();
export { ElasticToQueryResponse as default };