Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: orgDatablock fetch retuns with datasetExist field #507

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
feat: orgDatablock fetch retuns with datasetExist field
  • Loading branch information
Junjiequan committed May 21, 2023
commit e0ee3c8379b50ad7bdade7398482f8b0de0674b7
25 changes: 25 additions & 0 deletions src/common/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,31 @@ export const parseLimitFilters = (
return { limit, skip, sort };
};

export const parseLimitFiltersForPipeline = (
limits: ILimitsFilter | undefined,
): PipelineStage[] => {
const pipelineStages: PipelineStage[] = [];

if (!limits) {
pipelineStages.push({ $skip: 0 }, { $limit: 100 });
} else {
const { limit = 100, skip = 0, order } = limits;

pipelineStages.push({ $skip: skip }, { $limit: limit });

if (order) {
const [field, direction] = order.split(":");
if (direction === "asc" || direction === "desc") {
// NOTE string val of "asc" & "desc" is not supported for aggregate pipeline
const sortIntVal = direction === "asc" ? 1 : -1;
pipelineStages.unshift({ $sort: { [field]: sortIntVal } });
}
}
}

return pipelineStages;
};

export const createNewFacetPipelineStage = (
name: string,
type: string,
Expand Down
50 changes: 25 additions & 25 deletions src/origdatablocks/origdatablocks.controller.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/quotes */
import {
Controller,
Get,
Expand All @@ -22,7 +23,6 @@ import { Action } from "src/casl/action.enum";
import {
OrigDatablock,
OrigDatablockDocument,
OrigDatablockFileList,
} from "./schemas/origdatablock.schema";
import { IFilters } from "src/common/interfaces/common.interface";
import { IOrigDatablockFields } from "./interfaces/origdatablocks.interface";
Expand Down Expand Up @@ -91,10 +91,19 @@ export class OrigDatablocksController {
)
@Get("/fullquery")
@ApiQuery({
name: "filters",
name: "fields",
description:
"Database query and filters to apply when retrieve all origdatablocks",
"Define the filter conditions by specifying the name of values of fields requested. There is also support for a `text` search to look for strings anywhere in the origdatablocks.",
required: false,
type: String,
example: {},
})
@ApiQuery({
name: "limits",
description: "Define further query parameters like skip, limit, order",
required: false,
type: String,
example: '{ "skip": 0, "limit": 25, "order": "creationTime:desc" }',
})
async fullquery(
@Query() filters: { fields?: string; limits?: string },
Expand All @@ -114,38 +123,29 @@ export class OrigDatablocksController {
)
@Get("/fullquery/files")
@ApiQuery({
name: "filters",
name: "fields",
description:
"Database query and filters to apply when retrieve all origdatablocks with files",
"Define the filter conditions by specifying the name of values of fields requested. There is also support for a `text` search to look for strings anywhere in the origdatablocks.",
required: false,
type: String,
example: {},
})
@ApiQuery({
name: "limits",
description: "Define further query parameters like skip, limit, order",
required: false,
type: String,
example: '{ "skip": 0, "limit": 25, "order": "creationTime:desc" }',
})
async fullqueryFiles(
@Query() filters: { fields?: string; limits?: string },
): Promise<OrigDatablockFileList[] | null> {
): Promise<OrigDatablock[] | null> {
const parsedFilters = {
fields: JSON.parse(filters.fields ?? "{}"),
limits: JSON.parse(filters.limits ?? "{}"),
};

const origdatablockList = await this.origDatablocksService.fullquery(
parsedFilters,
);

// This conversion process is needed to get output directly rather than from _doc
const origdatablockListCopy: OrigDatablock[] | null = JSON.parse(
JSON.stringify(origdatablockList),
);

if (!origdatablockListCopy) return null;

const dataFileList = origdatablockListCopy.flatMap((data) => {
return data.dataFileList.map((file) => ({
...data,
dataFileList: file,
}));
});

return dataFileList;
return this.origDatablocksService.fullqueryFilesList(parsedFilters);
}

// GET /origdatablocks/fullfacet
Expand Down
45 changes: 37 additions & 8 deletions src/origdatablocks/origdatablocks.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@ import { Injectable, Inject, Scope } from "@nestjs/common";
import { REQUEST } from "@nestjs/core";
import { Request } from "express";
import { InjectModel } from "@nestjs/mongoose";
import { FilterQuery, Model, QueryOptions } from "mongoose";
import { FilterQuery, Model, PipelineStage, QueryOptions } from "mongoose";
import { IFacets, IFilters } from "src/common/interfaces/common.interface";
import {
addCreatedByFields,
addUpdatedByField,
createFullfacetPipeline,
createFullqueryFilter,
parseLimitFilters,
parseLimitFiltersForPipeline,
} from "src/common/utils";
import { CreateOrigDatablockDto } from "./dto/create-origdatablock.dto";
import { UpdateOrigDatablockDto } from "./dto/update-origdatablock.dto";
Expand Down Expand Up @@ -61,11 +62,41 @@ export class OrigDatablocksService {
);
const modifiers: QueryOptions = parseLimitFilters(filter.limits);

const origDatablocks = await this.origDatablockModel
.find(filterQuery, null, modifiers)
.exec();
return this.origDatablockModel.find(filterQuery, null, modifiers).exec();
}

return origDatablocks;
async fullqueryFilesList(
filter: IFilters<OrigDatablockDocument, IOrigDatablockFields>,
): Promise<OrigDatablock[] | null> {
const filterQuery: FilterQuery<OrigDatablockDocument> =
createFullqueryFilter<OrigDatablockDocument>(
this.origDatablockModel,
"_id",
filter.fields as FilterQuery<OrigDatablockDocument>,
);
const modifiers = parseLimitFiltersForPipeline(filter.limits);

const pipelineStages: PipelineStage[] = [
{ $match: filterQuery },
{
$lookup: {
from: "Dataset",
localField: "datasetId",
foreignField: "pid",
as: "Dataset",
},
},
{
$addFields: {
datasetExist: { $gt: [{ $size: "$Dataset" }, 0] },
},
},
{ $unset: "Dataset" },
{ $unwind: "$dataFileList" },
...modifiers,
];

return this.origDatablockModel.aggregate(pipelineStages).exec();
}

async fullfacet(
Expand All @@ -79,9 +110,7 @@ export class OrigDatablocksService {
FilterQuery<OrigDatablockDocument>
>(this.origDatablockModel, "datasetId", fields, facets, subField);

const result = await this.origDatablockModel.aggregate(pipeline).exec();

return result;
return this.origDatablockModel.aggregate(pipeline).exec();
}

async update(
Expand Down
3 changes: 0 additions & 3 deletions src/origdatablocks/schemas/origdatablock.schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@ import { v4 as uuidv4 } from "uuid";
import { DataFile, DataFileSchema } from "../../common/schemas/datafile.schema";

export type OrigDatablockDocument = OrigDatablock & Document;
export type OrigDatablockFileList = Omit<OrigDatablock, "dataFileList"> & {
dataFileList: DataFile;
};

@Schema({
collection: "OrigDatablock",
Expand Down