Skip to content
Merged
197 changes: 67 additions & 130 deletions handwritten/firestore/dev/src/pipelines/pipelines.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ import {
InternalDefineStageOptions,
InternalSubcollectionStageOptions,
UpdateStage,
InternalUpdateStageOptions,
Search,
InternalSearchStageOptions,
InsertStage,
Expand Down Expand Up @@ -135,37 +136,24 @@ export class PipelineSource implements firestore.Pipelines.PipelineSource {
* Set the pipeline's source to the in-memory documents specified by the given records.
*
* @param documents An array of objects/records specifying the in-memory documents.
*/
literals(documents: Array<Record<string, unknown>>): Pipeline;
/**
* Set the pipeline's source to the in-memory documents specified by the given records.
*
* @param options Options defining how this LiteralsSource stage is evaluated.
*/
literals(
documents: Array<Record<string, unknown>>,
options?: firestore.Pipelines.LiteralsStageOptions,
): Pipeline;
literals(options: firestore.Pipelines.LiteralsStageOptions): Pipeline;
literals(
docsOrOptions:
documentsOrOptions:
Array<Record<string, unknown>> | firestore.Pipelines.LiteralsStageOptions,
options?: firestore.Pipelines.LiteralsStageOptions,
): Pipeline {
let documents: Array<Record<string, unknown>> = [];
let opts: InternalLiteralsStageOptions = {};

if (Array.isArray(docsOrOptions)) {
documents = docsOrOptions;
opts = options ?? {};
} else if (
docsOrOptions &&
Array.isArray(
(docsOrOptions as firestore.Pipelines.LiteralsStageOptions).documents,
)
) {
const {documents: docs, ...rest} =
docsOrOptions as firestore.Pipelines.LiteralsStageOptions;
documents = docs ?? [];
opts = rest;
}

return new Pipeline(this.db, [new LiteralsSource(documents, opts)]);
const options: InternalLiteralsStageOptions = Array.isArray(
documentsOrOptions,
)
? {documents: documentsOrOptions}
: documentsOrOptions;
Comment thread
MarkDuckworth marked this conversation as resolved.
return new Pipeline(this.db, [new LiteralsSource(options)]);
}

/**
Expand Down Expand Up @@ -1788,8 +1776,16 @@ export class Pipeline implements firestore.Pipelines.Pipeline {
*
* @return A new {@code Pipeline} object with this stage appended to the stage list.
*/
delete(): Pipeline {
return this._addStage(new DeleteStage());
delete(): Pipeline;
/**
* Performs a delete operation on documents from previous stages.
*
* @param options - Options defining how this Delete stage is evaluated.
* @return A new {@code Pipeline} object with this stage appended to the stage list.
*/
delete(options: firestore.Pipelines.DeleteStageOptions): Pipeline;
delete(options?: firestore.Pipelines.DeleteStageOptions): Pipeline {
return this._addStage(new DeleteStage(options ?? {}));
}

/**
Expand Down Expand Up @@ -1819,47 +1815,55 @@ export class Pipeline implements firestore.Pipelines.Pipeline {
/**
* Performs an update operation using documents from previous stages.
*
* @param fieldsMap - Map of field transformations to apply.
* @param options - Options defining how this Update stage is evaluated.
* @return A new {@code Pipeline} object with this stage appended to the stage list.
*/
update(options: firestore.Pipelines.UpdateStageOptions): Pipeline;
update(
fieldsMap: Record<string, Expression> | Map<string, Expression>,
): Pipeline;
update(
transformedFieldsOrMap?:
transformedFieldOrOptions?:
| AliasedExpression
| AliasedExpression[]
| Map<string, Expression>
| Record<string, Expression>,
| firestore.Pipelines.UpdateStageOptions,
...additionalFields: AliasedExpression[]
): Pipeline {
if (isAliasedExpr(transformedFieldsOrMap)) {
return this._addStage(
new UpdateStage([transformedFieldsOrMap, ...additionalFields]),
);
} else if (
transformedFieldsOrMap instanceof Map ||
Array.isArray(transformedFieldsOrMap)
) {
return this._addStage(new UpdateStage(transformedFieldsOrMap));
} else if (
transformedFieldsOrMap &&
isPlainObject(transformedFieldsOrMap)
) {
const map = new Map<string, Expression>(
Object.entries(transformedFieldsOrMap as Record<string, Expression>),
);
return this._addStage(new UpdateStage(map));
let options: firestore.Pipelines.UpdateStageOptions;
if (isAliasedExpr(transformedFieldOrOptions)) {
options = {
transformedFields: [transformedFieldOrOptions, ...additionalFields],
};
} else if (Array.isArray(transformedFieldOrOptions)) {
options = {transformedFields: transformedFieldOrOptions};
} else {
options = transformedFieldOrOptions ?? {};
}
return this._addStage(new UpdateStage());

const {transformedFields, ...rest} = options;
const internalOptions: InternalUpdateStageOptions = {
...rest,
...(transformedFields
? {
transformedFields: selectablesToMap(
transformedFields as AliasedExpression[],
),
}
: {}),
};
return this._addStage(new UpdateStage(internalOptions));
Comment thread
MarkDuckworth marked this conversation as resolved.
}

/**
* Performs an insert operation on documents from previous stages.
*
* @return A new {@code Pipeline} object with this stage appended to the stage list.
*/
insert(): Pipeline;
/**
* Performs an insert operation on documents from previous stages.
*
* @param options - Options defining how this Insert stage is evaluated.
* @return A new {@code Pipeline} object with this stage appended to the stage list.
*/
insert(options: firestore.Pipelines.InsertStageOptions): Pipeline;
insert(options?: firestore.Pipelines.InsertStageOptions): Pipeline {
return this._addStage(
new InsertStage((options ?? {}) as InternalInsertStageOptions),
Expand All @@ -1872,13 +1876,6 @@ export class Pipeline implements firestore.Pipelines.Pipeline {
* @return A new {@code Pipeline} object with this stage appended to the stage list.
*/
upsert(): Pipeline;
/**
* Performs an upsert operation on documents from previous stages.
*
* @param options - Options defining how this Upsert stage is evaluated.
* @return A new {@code Pipeline} object with this stage appended to the stage list.
*/
upsert(options: firestore.Pipelines.UpsertStageOptions): Pipeline;
/**
* Performs an upsert operation on documents from previous stages.
*
Expand All @@ -1893,83 +1890,23 @@ export class Pipeline implements firestore.Pipelines.Pipeline {
/**
* Performs an upsert operation on documents from previous stages.
*
* @param additionalFields - Additional fields to apply on upsert.
* @param options - Options defining how this Upsert stage is evaluated.
* @return A new {@code Pipeline} object with this stage appended to the stage list.
*/
upsert(options: firestore.Pipelines.UpsertStageOptions): Pipeline;
upsert(
additionalFields: AliasedExpression[],
options?: firestore.Pipelines.UpsertStageOptions,
): Pipeline;
upsert(
additionalFieldsOrOptions?:
| AliasedExpression
| AliasedExpression[]
| firestore.Pipelines.UpsertStageOptions,
...restArgs: unknown[]
): Pipeline {
let additionalFields: AliasedExpression[] | undefined;
let options: firestore.Pipelines.UpsertStageOptions | undefined;

if (isAliasedExpr(additionalFieldsOrOptions)) {
additionalFields = [
additionalFieldsOrOptions,
...(restArgs as AliasedExpression[]),
];
options = undefined;
} else if (Array.isArray(additionalFieldsOrOptions)) {
additionalFields = additionalFieldsOrOptions;
options = restArgs[0] as
firestore.Pipelines.UpsertStageOptions | undefined;
} else {
additionalFields = undefined;
options = additionalFieldsOrOptions;
}

return this._addStage(
new UpsertStage({
...options,
...(additionalFields ? {additionalFields} : {}),
}),
);
}

/**
* Appends a literals stage to the pipeline.
*
* @param documents An array of objects/records specifying in-memory documents.
* @param options Options defining how this LiteralsSource stage is evaluated.
* @return A new {@code Pipeline} object with this stage appended to the stage list.
*/
literals(
documents: Array<Record<string, unknown>>,
options?: firestore.Pipelines.LiteralsStageOptions,
): Pipeline;
literals(options: firestore.Pipelines.LiteralsStageOptions): Pipeline;
literals(
docsOrOptions:
Array<Record<string, unknown>> | firestore.Pipelines.LiteralsStageOptions,
options?: firestore.Pipelines.LiteralsStageOptions,
additionalFieldOrOptions?:
AliasedExpression | firestore.Pipelines.UpsertStageOptions,
...additionalFields: AliasedExpression[]
): Pipeline {
let documents: Array<Record<string, unknown>> = [];
let opts: InternalLiteralsStageOptions = {};

if (Array.isArray(docsOrOptions)) {
documents = docsOrOptions;
opts = options ?? {};
} else if (
docsOrOptions &&
Array.isArray(
(docsOrOptions as firestore.Pipelines.LiteralsStageOptions).documents,
)
) {
const {documents: docs, ...rest} =
docsOrOptions as firestore.Pipelines.LiteralsStageOptions;
documents = docs ?? [];
opts = rest;
if (isAliasedExpr(additionalFieldOrOptions)) {
return this._addStage(
new UpsertStage({
additionalFields: [additionalFieldOrOptions, ...additionalFields],
}),
);
}

return this._addStage(new LiteralsSource(documents, opts));
return this._addStage(new UpsertStage(additionalFieldOrOptions ?? {}));
}

/**
Expand Down
Loading
Loading