Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
148 lines
4.6 KiB
Plaintext
148 lines
4.6 KiB
Plaintext
import { inArray } from 'drizzle-orm';
|
|
import { buildQuery } from '../queries/buildQuery.js';
|
|
import { selectDistinct } from '../queries/selectDistinct.js';
|
|
import { transform } from '../transform/read/index.js';
|
|
import { getNameFromDrizzleTable } from '../utilities/getNameFromDrizzleTable.js';
|
|
import { getTransaction } from '../utilities/getTransaction.js';
|
|
import { buildFindManyArgs } from './buildFindManyArgs.js';
|
|
export const findMany = async function find({ adapter, collectionSlug, draftsEnabled, fields, joins: joinQuery, limit: limitArg, locale, page = 1, pagination, req, select, sort, tableName, versions, where: whereArg }) {
|
|
let limit = limitArg;
|
|
let totalDocs;
|
|
let totalPages;
|
|
let hasPrevPage;
|
|
let hasNextPage;
|
|
let pagingCounter;
|
|
const offset = (page - 1) * limit;
|
|
if (limit === 0) {
|
|
pagination = false;
|
|
limit = undefined;
|
|
}
|
|
const { joins, orderBy, selectFields, where } = buildQuery({
|
|
adapter,
|
|
fields,
|
|
locale,
|
|
sort,
|
|
tableName,
|
|
where: whereArg
|
|
});
|
|
const orderedIDMap = {};
|
|
let orderedIDs;
|
|
const findManyArgs = buildFindManyArgs({
|
|
adapter,
|
|
collectionSlug,
|
|
depth: 0,
|
|
draftsEnabled,
|
|
fields,
|
|
joinQuery,
|
|
joins,
|
|
locale,
|
|
select,
|
|
tableName,
|
|
versions
|
|
});
|
|
if (orderBy) {
|
|
for(const key in selectFields){
|
|
const column = selectFields[key];
|
|
if (!column || column.primary) {
|
|
continue;
|
|
}
|
|
if (!orderBy.some((col)=>col.column.name === column.name && getNameFromDrizzleTable(col.column.table) === getNameFromDrizzleTable(column.table))) {
|
|
delete selectFields[key];
|
|
}
|
|
}
|
|
}
|
|
const db = await getTransaction(adapter, req);
|
|
const selectDistinctResult = await selectDistinct({
|
|
adapter,
|
|
db,
|
|
joins,
|
|
query: ({ query })=>{
|
|
if (orderBy) {
|
|
query = query.orderBy(()=>orderBy.map(({ column, order })=>order(column)));
|
|
}
|
|
return query.offset(offset).limit(limit);
|
|
},
|
|
selectFields,
|
|
tableName,
|
|
where
|
|
});
|
|
if (selectDistinctResult) {
|
|
if (selectDistinctResult.length === 0) {
|
|
return {
|
|
docs: [],
|
|
hasNextPage: false,
|
|
hasPrevPage: false,
|
|
limit,
|
|
nextPage: null,
|
|
page: 1,
|
|
pagingCounter: 0,
|
|
prevPage: null,
|
|
totalDocs: 0,
|
|
totalPages: 0
|
|
};
|
|
} else {
|
|
// set the id in an object for sorting later
|
|
selectDistinctResult.forEach(({ id }, i)=>{
|
|
orderedIDMap[id] = i;
|
|
});
|
|
orderedIDs = Object.keys(orderedIDMap);
|
|
findManyArgs.where = inArray(adapter.tables[tableName].id, orderedIDs);
|
|
}
|
|
} else {
|
|
findManyArgs.limit = limit;
|
|
findManyArgs.offset = offset;
|
|
findManyArgs.orderBy = ()=>orderBy.map(({ column, order })=>order(column));
|
|
if (where) {
|
|
findManyArgs.where = where;
|
|
}
|
|
}
|
|
const findPromise = db.query[tableName].findMany(findManyArgs);
|
|
if (pagination !== false && (orderedIDs ? orderedIDs?.length <= limit : true)) {
|
|
totalDocs = await adapter.countDistinct({
|
|
db,
|
|
joins,
|
|
tableName,
|
|
where
|
|
});
|
|
totalPages = typeof limit === 'number' && limit !== 0 ? Math.ceil(totalDocs / limit) : 1;
|
|
hasPrevPage = page > 1;
|
|
hasNextPage = totalPages > page;
|
|
pagingCounter = (page - 1) * limit + 1;
|
|
}
|
|
const rawDocs = await findPromise;
|
|
// sort rawDocs from selectQuery
|
|
if (Object.keys(orderedIDMap).length > 0) {
|
|
rawDocs.sort((a, b)=>orderedIDMap[a.id] - orderedIDMap[b.id]);
|
|
}
|
|
if (pagination === false || !totalDocs) {
|
|
totalDocs = rawDocs.length;
|
|
totalPages = 1;
|
|
pagingCounter = 1;
|
|
hasPrevPage = false;
|
|
hasNextPage = false;
|
|
}
|
|
const docs = rawDocs.map((data)=>{
|
|
return transform({
|
|
adapter,
|
|
config: adapter.payload.config,
|
|
data,
|
|
fields,
|
|
joinQuery,
|
|
tableName
|
|
});
|
|
});
|
|
return {
|
|
docs,
|
|
hasNextPage,
|
|
hasPrevPage,
|
|
limit: limitArg,
|
|
nextPage: hasNextPage ? page + 1 : null,
|
|
page,
|
|
pagingCounter,
|
|
prevPage: hasPrevPage ? page - 1 : null,
|
|
totalDocs,
|
|
totalPages
|
|
};
|
|
};
|
|
|
|
//# sourceMappingURL=findMany.js.map |