@clickup/ent-framework
Version:
A PostgreSQL graph-database-alike library with microsharding and row-level security
75 lines (66 loc) • 2 kB
text/typescript
import type { QueryAnnotation } from "../abstract/QueryAnnotation";
import { QueryBase } from "../abstract/QueryBase";
import type { Schema } from "../abstract/Schema";
import type { Row, Table } from "../types";
import { ID } from "../types";
import type { PgClient } from "./PgClient";
import { PgRunner } from "./PgRunner";
export class PgQueryLoad<TTable extends Table> extends QueryBase<
TTable,
string,
Row<TTable> | null,
PgClient
> {
/** @ignore */
readonly RUNNER_CLASS = PgRunnerLoad;
}
class PgRunnerLoad<TTable extends Table> extends PgRunner<
TTable,
string,
Row<TTable> | null
> {
static override readonly IS_WRITE = false;
private builder;
readonly op = "SELECT_BY_ID";
readonly maxBatchSize = 1000; // Select by ID is cheap, so we can have much bigger load batches.
readonly default = null; // If no row is found, returns null.
constructor(schema: Schema<TTable>, client: PgClient) {
super(schema, client);
this.builder = {
prefix: this.fmt("SELECT %SELECT_FIELDS FROM %T WHERE "),
func: this.createOneOfBuilder(ID),
suffix: this.fmt(""),
};
}
override key(input: string): string {
return input;
}
async runSingle(
input: string,
annotations: QueryAnnotation[],
): Promise<Row<TTable> | undefined> {
const sql =
this.builder.prefix + this.builder.func([input]) + this.builder.suffix;
const rows = await this.clientQuery<Row<TTable>>(sql, annotations, 1);
return rows[0];
}
async runBatch(
inputs: Map<string, string>,
annotations: QueryAnnotation[],
): Promise<Map<string, Row<TTable>>> {
const sql =
this.builder.prefix +
this.builder.func(inputs.values()) +
this.builder.suffix;
const rows = await this.clientQuery<Row<TTable>>(
sql,
annotations,
inputs.size,
);
const outputs = new Map<string, Row<TTable>>();
for (const row of rows) {
outputs.set(row[ID], row);
}
return outputs;
}
}