Skip to content

Commit

Permalink
Hide cardinality protocol values more. Consolidate when necessary to …
Browse files Browse the repository at this point in the history
…enum usage.
  • Loading branch information
CarsonF committed Mar 4, 2024
1 parent 97e1883 commit 618659f
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 24 deletions.
4 changes: 3 additions & 1 deletion packages/driver/src/baseClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import Event from "./primitives/event";
import { LifoQueue } from "./primitives/queues";
import { BaseRawConnection } from "./baseConn";
import { ConnectWithTimeout, retryingConnect } from "./retry";
import { util } from "./reflection/util";
import { Transaction } from "./transaction";
import { sleep } from "./utils";

Expand Down Expand Up @@ -661,11 +662,12 @@ export class Client implements Executor {
Cardinality.MANY,
this.options.session
);
const cardinality = util.parseCardinality(result[0]);

return {
in: result[1],
out: result[2],
cardinality: result[0],
cardinality,
};
} finally {
await holder.release();
Expand Down
6 changes: 0 additions & 6 deletions packages/driver/src/codecs/consts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,3 @@ export const KNOWN_TYPENAMES = (() => {
}
return res;
})();

export const NO_RESULT = 0x6e;
export const AT_MOST_ONE = 0x6f;
export const ONE = 0x41;
export const MANY = 0x6d;
export const AT_LEAST_ONE = 0x4d;
8 changes: 4 additions & 4 deletions packages/driver/src/codecs/object.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
* limitations under the License.
*/

import { Cardinality } from "../ifaces";
import { ICodec, Codec, uuid, CodecKind } from "./ifaces";
import { ReadBuffer, WriteBuffer } from "../primitives/buffer";
import { ONE, AT_LEAST_ONE } from "./consts";
import {
InvalidArgumentError,
MissingArgumentError,
Expand All @@ -34,7 +34,7 @@ export interface ObjectFieldInfo {
name: string;
implicit: boolean;
linkprop: boolean;
cardinality: number;
cardinality: Cardinality;
}

export class ObjectCodec extends Codec implements ICodec {
Expand Down Expand Up @@ -104,7 +104,7 @@ export class ObjectCodec extends Codec implements ICodec {
const arg = args[i];
if (arg == null) {
const card = this.cardinalities[i];
if (card === ONE || card === AT_LEAST_ONE) {
if (card === Cardinality.ONE || card === Cardinality.AT_LEAST_ONE) {
throw new MissingArgumentError(
`argument ${this.fields[i].name} is required, but received ${arg}`
);
Expand Down Expand Up @@ -154,7 +154,7 @@ export class ObjectCodec extends Codec implements ICodec {
elemData.writeInt32(0); // reserved bytes
if (val == null) {
const card = this.cardinalities[i];
if (card === ONE || card === AT_LEAST_ONE) {
if (card === Cardinality.ONE || card === Cardinality.AT_LEAST_ONE) {
throw new MissingArgumentError(
`argument ${this.fields[i].name} is required, but received ${val}`
);
Expand Down
26 changes: 16 additions & 10 deletions packages/driver/src/reflection/analyzeQuery.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { ArrayCodec } from "../codecs/array";
import { AT_LEAST_ONE, AT_MOST_ONE, MANY, ONE } from "../codecs/consts";
import { EnumCodec } from "../codecs/enum";
import type { ICodec } from "../codecs/ifaces";
import { ScalarCodec } from "../codecs/ifaces";
Expand All @@ -9,8 +8,9 @@ import { MultiRangeCodec, RangeCodec } from "../codecs/range";
import { NullCodec } from "../codecs/codecs";
import { SetCodec } from "../codecs/set";
import { TupleCodec } from "../codecs/tuple";
import { Cardinality } from "../ifaces";
import type { Client } from "../baseClient";
import { Cardinality } from "./enums";
import { util } from "./util";

type QueryType = {
args: string;
Expand Down Expand Up @@ -58,13 +58,13 @@ export function applyCardinalityToTsType(
cardinality: Cardinality
): string {
switch (cardinality) {
case Cardinality.MANY:
case Cardinality.Many:
return `${type}[]`;
case Cardinality.ONE:
case Cardinality.One:
return type;
case Cardinality.AT_MOST_ONE:
case Cardinality.AtMostOne:
return `${type} | null`;
case Cardinality.AT_LEAST_ONE:
case Cardinality.AtLeastOne:
return `[(${type}), ...(${type})[]]`;
}
throw Error(`unexpected cardinality: ${cardinality}`);
Expand Down Expand Up @@ -98,24 +98,30 @@ function walkCodec(
const fields =
codec instanceof ObjectCodec
? codec.getFields()
: codec.getNames().map((name) => ({ name, cardinality: ONE }));
: codec.getNames().map((name) => ({ name, cardinality: undefined }));
const subCodecs = codec.getSubcodecs();
const objectShape = `{\n${fields
.map((field, i) => {
const cardinality = field.cardinality
? util.parseCardinality(field.cardinality)
: Cardinality.One;
let subCodec = subCodecs[i];
if (subCodec instanceof SetCodec) {
if (
!(field.cardinality === MANY || field.cardinality === AT_LEAST_ONE)
!(
cardinality === Cardinality.Many ||
cardinality === Cardinality.AtLeastOne
)
) {
throw Error("subcodec is SetCodec, but upper cardinality is one");
}
subCodec = subCodec.getSubcodecs()[0];
}
return `${ctx.indent} ${JSON.stringify(field.name)}${
ctx.optionalNulls && field.cardinality === AT_MOST_ONE ? "?" : ""
ctx.optionalNulls && cardinality === Cardinality.AtMostOne ? "?" : ""
}: ${applyCardinalityToTsType(
walkCodec(subCodec, { ...ctx, indent: ctx.indent + " " }),
field.cardinality
cardinality
)};`;
})
.join("\n")}\n${ctx.indent}}`;
Expand Down
21 changes: 21 additions & 0 deletions packages/driver/src/reflection/util.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import { Cardinality as RawCardinality } from "../ifaces";
import { Cardinality } from "./enums";

export namespace util {
export function assertNever(arg: never, error?: Error): never {
throw error ?? new Error(`${arg} is supposed to be of "never" type`);
Expand Down Expand Up @@ -88,4 +91,22 @@ export namespace util {
}
return obj;
}

export const parseCardinality = (
cardinality: RawCardinality
): Cardinality => {
switch (cardinality) {
case RawCardinality.MANY:
return Cardinality.Many;
case RawCardinality.ONE:
return Cardinality.One;
case RawCardinality.AT_MOST_ONE:
return Cardinality.AtMostOne;
case RawCardinality.AT_LEAST_ONE:
return Cardinality.AtMostOne;
case RawCardinality.NO_RESULT:
return Cardinality.Empty;
}
throw new Error(`Unexpected cardinality: ${cardinality}`);
};
}
5 changes: 2 additions & 3 deletions packages/generate/src/queries.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { $, adapter, type Client } from "edgedb";
import { Cardinality } from "edgedb/dist/ifaces";
import { type CommandOptions } from "./commandutil";
import { headerComment } from "./genutil";
import { type Target, camelify } from "./genutil";
Expand Down Expand Up @@ -193,9 +192,9 @@ export function generateFiles(params: {
);

const method =
params.types.cardinality === Cardinality.ONE
params.types.cardinality === $.Cardinality.One
? "queryRequiredSingle"
: params.types.cardinality === Cardinality.AT_MOST_ONE
: params.types.cardinality === $.Cardinality.AtMostOne
? "querySingle"
: "query";
const functionName = camelify(baseFileName);
Expand Down

0 comments on commit 618659f

Please sign in to comment.