Skip to content

Commit

Permalink
Merge pull request #937 from SciCatProject/datasets-sort-not-working
Browse files Browse the repository at this point in the history
Fix: dataset table sort is not working when elasticsearch is enabled.
  • Loading branch information
nitrosx authored Dec 5, 2023
2 parents 31ed5a9 + 23933d9 commit 0d68e18
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 2 deletions.
3 changes: 3 additions & 0 deletions src/datasets/datasets.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,12 @@ export class DatasetsService {
filter.fields as IDatasetFields,
modifiers.limit,
modifiers.skip,
modifiers.sort,
);

datasets = await this.datasetModel
.find({ _id: { $in: esResult.data } })
.sort(modifiers.sort)
.exec();
}

Expand Down
9 changes: 9 additions & 0 deletions src/elastic-search/configuration/datasetFieldMapping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,15 @@ export const datasetMappings: MappingObject = {
scientificMetadata: {
type: "nested",
dynamic: true,
properties: {
runNumber: {
properties: {
value: {
type: "long",
},
},
},
},
},
history: {
type: "nested",
Expand Down
41 changes: 39 additions & 2 deletions src/elastic-search/elastic-search.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
SearchTotalHits,
SearchRequest,
AggregationsAggregate,
SortOrder,
} from "@elastic/elasticsearch/lib/api/types";
import { IDatasetFields } from "src/datasets/interfaces/dataset-filters.interface";
import {
Expand All @@ -31,6 +32,8 @@ import {
transformFacets,
} from "./helpers/utils";

import { SortFields } from "./providers/fields.enum";

@Injectable()
export class ElasticSearchService implements OnModuleInit {
private esService: Client;
Expand Down Expand Up @@ -255,6 +258,7 @@ export class ElasticSearchService implements OnModuleInit {
searchParam: IDatasetFields,
limit = 20,
skip = 0,
sort?: Record<string, SortOrder>,
): Promise<{ totalCount: number; data: string[] }> {
const defaultMinScore = searchParam.text ? 1 : 0;

Expand All @@ -263,15 +267,48 @@ export class ElasticSearchService implements OnModuleInit {

const searchOptions = {
track_scores: true,
body: searchQuery,
sort: [{ _score: { order: "desc" } }],
query: searchQuery.query,
from: skip,
size: limit,
sort: [{ _score: { order: "desc" } }],
min_score: defaultMinScore,
track_total_hits: true,
_source: [""],
} as SearchRequest;

if (sort) {
const sortField = Object.keys(sort)[0];
const sortDirection = Object.values(sort)[0];

// NOTE: To sort datasetName field we need to use datasetName.keyword field,
// as elasticsearch does not have good support for text type field sorting
const isDatasetName = sortField === SortFields.DatasetName;
const fieldForSorting = isDatasetName
? SortFields.DatasetNameKeyword
: sortField;

const isNestedField = fieldForSorting.includes(
SortFields.ScientificMetadata,
);

if (isNestedField) {
searchOptions.sort = [
{
[`${SortFields.ScientificMetadataRunNumberValue}`]: {
order: sortDirection,
nested: {
path: SortFields.ScientificMetadata,
},
},
},
];
} else {
searchOptions.sort = [
{ [fieldForSorting]: { order: sortDirection } },
];
}
}

const body = await this.esService.search(searchOptions);

const totalCount = (body.hits.total as SearchTotalHits)?.value || 0;
Expand Down
7 changes: 7 additions & 0 deletions src/elastic-search/providers/fields.enum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,10 @@ export enum QueryFields {
DatasetName = "datasetName",
Description = "description",
}

export enum SortFields {
DatasetName = "datasetName",
DatasetNameKeyword = "datasetName.keyword",
ScientificMetadata = "scientificMetadata",
ScientificMetadataRunNumberValue = "scientificMetadata.runnumber.value",
}

0 comments on commit 0d68e18

Please sign in to comment.