Merge pull request #26240 from drodil/get_entities_db_order
feat: move `getEntities` ordering to database
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
---
|
||||
'@backstage/catalog-client': patch
|
||||
'@backstage/plugin-catalog-backend': patch
|
||||
---
|
||||
|
||||
Moved `getEntities` ordering to utilize database instead of having it inside catalog client
|
||||
|
||||
Please note that the latest version of `@backstage/catalog-client` will not order the entities in the same way as before. This is because the ordering is now done in the database query instead of in the client. If you rely on the ordering of the entities, you may need to update your backend plugin or code to handle this change.
|
||||
@@ -18,7 +18,6 @@ import {
|
||||
CompoundEntityRef,
|
||||
Entity,
|
||||
parseEntityRef,
|
||||
stringifyEntityRef,
|
||||
stringifyLocationRef,
|
||||
} from '@backstage/catalog-model';
|
||||
import { ResponseError } from '@backstage/errors';
|
||||
@@ -142,35 +141,7 @@ export class CatalogClient implements CatalogApi {
|
||||
options,
|
||||
),
|
||||
);
|
||||
|
||||
// do not sort entities, if order is provided
|
||||
if (encodedOrder.length) {
|
||||
return { items: entities };
|
||||
}
|
||||
|
||||
const refCompare = (a: Entity, b: Entity) => {
|
||||
// in case field filtering is used, these fields might not be part of the response
|
||||
if (
|
||||
a.metadata?.name === undefined ||
|
||||
a.kind === undefined ||
|
||||
b.metadata?.name === undefined ||
|
||||
b.kind === undefined
|
||||
) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const aRef = stringifyEntityRef(a);
|
||||
const bRef = stringifyEntityRef(b);
|
||||
if (aRef < bRef) {
|
||||
return -1;
|
||||
}
|
||||
if (aRef > bRef) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
|
||||
return { items: entities.sort(refCompare) };
|
||||
return { items: entities };
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -249,7 +249,18 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog {
|
||||
]);
|
||||
}
|
||||
});
|
||||
entitiesQuery = entitiesQuery.orderBy('final_entities.entity_id', 'asc'); // stable sort
|
||||
|
||||
if (!request?.order) {
|
||||
entitiesQuery = entitiesQuery
|
||||
.leftOuterJoin(
|
||||
'refresh_state',
|
||||
'refresh_state.entity_id',
|
||||
'final_entities.entity_id',
|
||||
)
|
||||
.orderBy('refresh_state.entity_ref', 'asc'); // default sort
|
||||
} else {
|
||||
entitiesQuery.orderBy('final_entities.entity_id', 'asc'); // stable sort
|
||||
}
|
||||
|
||||
const { limit, offset } = parsePagination(request?.pagination);
|
||||
if (limit !== undefined) {
|
||||
|
||||
Reference in New Issue
Block a user