coveo-search-ui
Version:
Coveo JavaScript Search Framework
91 lines (77 loc) • 3.52 kB
text/typescript
import { ExecutionReport } from './ExecutionReport';
import { TableBuilder, ITableDataSource } from './TableBuilder';
import { IQueryResult } from '../../rest/QueryResult';
import { IRankingExpression } from '../../rest/RankingExpression';
import { map, find } from 'underscore';
import { GenericValueOutput } from './GenericValueOutput';
import { Dom } from '../../utils/Dom';
import { IComponentBindings } from '../Base/ComponentBindings';
import agGridModule = require('ag-grid/main');
import { QueryBuilder } from '../Base/QueryBuilder';
export class ExecutionReportRankingModifiers {
public async build(
results: IQueryResult[],
rankingExpressions: IRankingExpression[],
bindings: IComponentBindings
): Promise<{ container: Dom; gridOptions: agGridModule.GridOptions }> {
const { container, agGridElement } = ExecutionReport.standardSectionHeader('Ranking Modifiers & Machine Learning Boosts');
const dataSourcePromises = map(rankingExpressions, async rankingExpression => {
const isAutomaticBoostRegex = /^(@permanentid|@urihash)="?([a-zA-Z0-9]+)"?$/;
let thumbnailPreview: Record<string, ITableDataSource> = TableBuilder.thumbnailCell(null, null);
let returnedByIndexForCurrentQuery = '-- NULL --';
let result: IQueryResult = null;
const isAutomaticBoost = rankingExpression.expression.match(isAutomaticBoostRegex);
if (isAutomaticBoost) {
const permanentIDUsedInAutomaticBoost = isAutomaticBoost[2];
const extracted = await this.extractDocumentInfoFromBoost(results, permanentIDUsedInAutomaticBoost, rankingExpression, bindings);
thumbnailPreview = TableBuilder.thumbnailCell(extracted.result, bindings);
result = extracted.result;
returnedByIndexForCurrentQuery = extracted.returnedByIndexForCurrentQuery.toString();
}
return {
...thumbnailPreview,
ReturnedByIndexForCurrentQuery: new GenericValueOutput().output(returnedByIndexForCurrentQuery),
IsRecommendation: new GenericValueOutput().output(result ? result.isRecommendation : '-- NULL --'),
Expression: { ...new GenericValueOutput().output(rankingExpression.expression), width: 150 },
Modifier: new GenericValueOutput().output(rankingExpression.modifier)
};
});
const dataSource = await Promise.all(dataSourcePromises);
const { gridOptions } = await new TableBuilder().build(dataSource, agGridElement, {
rowHeight: 150
});
return {
container,
gridOptions
};
}
private async extractDocumentInfoFromBoost(
results: IQueryResult[],
permanentID: string,
rankingExpression: IRankingExpression,
bindings: IComponentBindings
) {
let matchingResult = {
result: null,
returnedByIndexForCurrentQuery: false
};
const resultInResultSet = find(results, result => {
return result.raw.permanentid == permanentID || result.raw.urihash == permanentID;
});
if (resultInResultSet) {
matchingResult = {
result: resultInResultSet,
returnedByIndexForCurrentQuery: true
};
return matchingResult;
}
const queryBuilder = new QueryBuilder();
queryBuilder.advancedExpression.add(rankingExpression.expression);
const resultsFromIndex = await bindings.queryController.getEndpoint().search(queryBuilder.build());
matchingResult = {
result: resultsFromIndex.results[0],
returnedByIndexForCurrentQuery: false
};
return matchingResult;
}
}