Browse Source

fix: add option to sort cache data

pull/8759/head
Pranav C 6 months ago
parent
commit
6489a4e3cf
  1. 33
      packages/nocodb/src/cache/CacheMgr.ts
  2. 7
      packages/nocodb/src/cache/NocoCache.ts
  3. 53
      packages/nocodb/src/models/Filter.ts
  4. 20
      packages/nocodb/src/models/HookFilter.ts

33
packages/nocodb/src/cache/CacheMgr.ts vendored

@ -251,6 +251,11 @@ export default abstract class CacheMgr {
async getList(
scope: string,
subKeys: string[],
orderBy?: {
key: string;
dir?: 'asc' | 'desc';
isString?: boolean;
},
): Promise<{
list: any[];
isNoneList: boolean;
@ -328,6 +333,34 @@ export default abstract class CacheMgr {
}
}
// Check if orderBy parameter is provided and valid
if (orderBy?.key) {
// Destructure the properties from orderBy object
const { key, dir, isString } = orderBy;
// Determine the multiplier for sorting order: -1 for descending, 1 for ascending
const orderMultiplier = dir === 'desc' ? -1 : 1;
// Sort the values array based on the specified property
values.sort((a, b) => {
// Get the property values from a and b
const aValue = a?.[key];
const bValue = b?.[key];
// If aValue is null or undefined, move it to the end
if (aValue === null || aValue === undefined) return 1;
// If bValue is null or undefined, move it to the end
if (bValue === null || bValue === undefined) return -1;
if (isString) {
// If the property is a string, use localeCompare for comparison
return orderMultiplier * String(aValue).localeCompare(String(bValue));
}
// If the property is a number, subtract the values directly
return orderMultiplier * (aValue - bValue);
});
}
return {
list: values.map((res) => {
try {

7
packages/nocodb/src/cache/NocoCache.ts vendored

@ -62,6 +62,11 @@ export default class NocoCache {
public static async getList(
scope: string,
subKeys: string[],
orderBy?: {
key: string;
dir?: 'asc' | 'desc';
isString?: boolean;
},
): Promise<{
list: any[];
isNoneList: boolean;
@ -71,7 +76,7 @@ export default class NocoCache {
list: [],
isNoneList: false,
});
return this.client.getList(scope, subKeys);
return this.client.getList(scope, subKeys, orderBy);
}
public static async setList(

53
packages/nocodb/src/models/Filter.ts

@ -385,9 +385,13 @@ export default class Filter implements FilterType {
): Promise<Filter[]> {
if (this.children) return this.children;
if (!this.is_group) return null;
const cachedList = await NocoCache.getList(CacheScope.FILTER_EXP, [
this.id,
]);
const cachedList = await NocoCache.getList(
CacheScope.FILTER_EXP,
[this.id],
{
key: 'order',
},
);
let { list: childFilters } = cachedList;
const { isNoneList } = cachedList;
if (!isNoneList && !childFilters.length) {
@ -438,9 +442,13 @@ export default class Filter implements FilterType {
},
ncMeta = Noco.ncMeta,
): Promise<FilterType> {
const cachedList = await NocoCache.getList(CacheScope.FILTER_EXP, [
viewId || hookId || linkColId,
]);
const cachedList = await NocoCache.getList(
CacheScope.FILTER_EXP,
[viewId || hookId || linkColId],
{
key: 'order',
},
);
let { list: filters } = cachedList;
const { isNoneList } = cachedList;
if (!isNoneList && !filters.length) {
@ -596,7 +604,13 @@ export default class Filter implements FilterType {
{ viewId }: { viewId: any },
ncMeta = Noco.ncMeta,
) {
const cachedList = await NocoCache.getList(CacheScope.FILTER_EXP, [viewId]);
const cachedList = await NocoCache.getList(
CacheScope.FILTER_EXP,
[viewId],
{
key: 'order',
},
);
let { list: filterObjs } = cachedList;
const { isNoneList } = cachedList;
if (!isNoneList && !filterObjs.length) {
@ -623,7 +637,11 @@ export default class Filter implements FilterType {
{ hookId }: { hookId: any },
ncMeta = Noco.ncMeta,
) {
const cachedList = await NocoCache.getList(CacheScope.FILTER_EXP, [hookId]);
const cachedList = await NocoCache.getList(
CacheScope.FILTER_EXP,
[hookId],
{ key: 'order' },
);
let { list: filterObjs } = cachedList;
const { isNoneList } = cachedList;
if (!isNoneList && !filterObjs.length) {
@ -654,9 +672,11 @@ export default class Filter implements FilterType {
},
ncMeta = Noco.ncMeta,
) {
const cachedList = await NocoCache.getList(CacheScope.FILTER_EXP, [
parentId,
]);
const cachedList = await NocoCache.getList(
CacheScope.FILTER_EXP,
[parentId],
{ key: 'order' },
);
let { list: filterObjs } = cachedList;
const { isNoneList } = cachedList;
if (!isNoneList && !filterObjs.length) {
@ -690,10 +710,13 @@ export default class Filter implements FilterType {
},
ncMeta = Noco.ncMeta,
) {
const cachedList = await NocoCache.getList(CacheScope.FILTER_EXP, [
hookId,
parentId,
]);
const cachedList = await NocoCache.getList(
CacheScope.FILTER_EXP,
[hookId, parentId],
{
key: 'order',
},
);
let { list: filterObjs } = cachedList;
const { isNoneList } = cachedList;
if (!isNoneList && !filterObjs.length) {

20
packages/nocodb/src/models/HookFilter.ts

@ -247,9 +247,11 @@ export default class Filter {
): Promise<Filter[]> {
if (this.children) return this.children;
if (!this.is_group) return null;
const cachedList = await NocoCache.getList(CacheScope.FILTER_EXP, [
this.id,
]);
const cachedList = await NocoCache.getList(
CacheScope.FILTER_EXP,
[this.id],
{ key: 'order' },
);
let { list: childFilters } = cachedList;
const { isNoneList } = cachedList;
if (!isNoneList && !childFilters.length) {
@ -293,7 +295,11 @@ export default class Filter {
},
ncMeta = Noco.ncMeta,
): Promise<FilterType> {
const cachedList = await NocoCache.getList(CacheScope.FILTER_EXP, [viewId]);
const cachedList = await NocoCache.getList(
CacheScope.FILTER_EXP,
[viewId],
{ key: 'order' },
);
let { list: filters } = cachedList;
const { isNoneList } = cachedList;
if (!isNoneList && !filters.length) {
@ -393,7 +399,11 @@ export default class Filter {
{ viewId }: { viewId: any },
ncMeta = Noco.ncMeta,
) {
const cachedList = await NocoCache.getList(CacheScope.FILTER_EXP, [viewId]);
const cachedList = await NocoCache.getList(
CacheScope.FILTER_EXP,
[viewId],
{ key: 'order' },
);
let { list: filterObjs } = cachedList;
const { isNoneList } = cachedList;
if (!isNoneList && !filterObjs.length) {

Loading…
Cancel
Save