[ENG-1709] Smarter params merging in search api (#2346)

do smarter params merging in search api
This commit is contained in:
Brendan Allan 2024-04-18 22:16:18 +08:00 committed by GitHub
parent 029250e1b2
commit e4dd2b73ec
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -63,35 +63,17 @@ pub enum SearchFilterArgs {
}
impl SearchFilterArgs {
async fn into_params<T>(
async fn into_params(
self,
db: &PrismaClient,
file_path: fn(Vec<prisma::file_path::WhereParam>) -> Vec<T>,
object: fn(Vec<prisma::object::WhereParam>) -> Vec<T>,
) -> Result<Vec<T>, rspc::Error> {
file_path: &mut Vec<prisma::file_path::WhereParam>,
object: &mut Vec<prisma::object::WhereParam>,
) -> Result<(), rspc::Error> {
Ok(match self {
Self::FilePath(v) => file_path(v.into_params(db).await?),
Self::Object(v) => object(v.into_params()),
Self::FilePath(v) => file_path.extend(v.into_params(db).await?),
Self::Object(v) => object.extend(v.into_params()),
})
}
async fn into_file_path_params(
self,
db: &PrismaClient,
) -> Result<Vec<prisma::file_path::WhereParam>, rspc::Error> {
self.into_params(db, |v| v, |v| vec![prisma::file_path::object::is(v)])
.await
}
async fn into_object_params(
self,
db: &PrismaClient,
) -> Result<Vec<prisma::object::WhereParam>, rspc::Error> {
dbg!(
self.into_params(db, |v| vec![prisma::object::file_paths::some(v)], |v| v)
.await
)
}
}
pub fn mount() -> AlphaRouter<Ctx> {
@ -305,13 +287,11 @@ pub fn mount() -> AlphaRouter<Ctx> {
let Library { db, .. } = library.as_ref();
let params = {
let mut params = Vec::new();
let (mut fp, obj) = merge_filters(filters, db).await?;
for filter in filters {
params.extend(filter.into_file_path_params(db).await?);
}
fp.push(prisma::file_path::object::is(obj));
params
fp
};
let mut query = db.file_path().find_many(params);
@ -384,13 +364,11 @@ pub fn mount() -> AlphaRouter<Ctx> {
Ok(db
.file_path()
.count({
let mut params = Vec::new();
let (mut fp, obj) = merge_filters(filters, db).await?;
for filter in filters {
params.extend(filter.into_file_path_params(db).await?);
}
fp.push(prisma::file_path::object::is(obj));
params
fp
})
.exec()
.await? as u32)
@ -421,13 +399,11 @@ pub fn mount() -> AlphaRouter<Ctx> {
let mut query = db
.object()
.find_many({
let mut params = Vec::new();
let (fp, mut obj) = merge_filters(filters, db).await?;
for filter in filters {
params.extend(filter.into_object_params(db).await?);
}
obj.push(prisma::object::file_paths::some(fp));
params
obj
})
.take(take as i64);
@ -504,13 +480,11 @@ pub fn mount() -> AlphaRouter<Ctx> {
Ok(db
.object()
.count({
let mut params = Vec::new();
let (fp, mut obj) = merge_filters(filters, db).await?;
for filter in filters {
params.extend(filter.into_object_params(db).await?);
}
obj.push(prisma::object::file_paths::some(fp));
params
obj
})
.exec()
.await? as u32)
@ -518,3 +492,23 @@ pub fn mount() -> AlphaRouter<Ctx> {
})
.merge("saved.", saved::mount())
}
async fn merge_filters(
filters: Vec<SearchFilterArgs>,
db: &PrismaClient,
) -> Result<
(
Vec<prisma::file_path::WhereParam>,
Vec<prisma::object::WhereParam>,
),
rspc::Error,
> {
let mut obj = vec![];
let mut fp = vec![];
for filter in filters {
filter.into_params(db, &mut fp, &mut obj).await?;
}
Ok((fp, obj))
}