@columnus/shared 0.1.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/apiProfile.d.ts +1072 -0
- package/dist/apiProfile.js +4210 -0
- package/dist/apiProfile.js.map +1 -0
- package/dist/apiProfileSlug.d.ts +11 -0
- package/dist/apiProfileSlug.js +39 -0
- package/dist/apiProfileSlug.js.map +1 -0
- package/dist/apiToken.d.ts +6 -0
- package/dist/apiToken.js +35 -0
- package/dist/apiToken.js.map +1 -0
- package/dist/betterAuthSession.d.ts +8 -0
- package/dist/betterAuthSession.js +57 -0
- package/dist/betterAuthSession.js.map +1 -0
- package/dist/bffHost.d.ts +36 -0
- package/dist/bffHost.js +74 -0
- package/dist/bffHost.js.map +1 -0
- package/dist/bffProtocol.d.ts +1357 -0
- package/dist/bffProtocol.js +4362 -0
- package/dist/bffProtocol.js.map +1 -0
- package/dist/bffRedact.d.ts +30 -0
- package/dist/bffRedact.js +55 -0
- package/dist/bffRedact.js.map +1 -0
- package/dist/ciPreviewEnv.d.ts +49 -0
- package/dist/ciPreviewEnv.js +143 -0
- package/dist/ciPreviewEnv.js.map +1 -0
- package/dist/clipboardTransfer.d.ts +25 -0
- package/dist/clipboardTransfer.js +4862 -0
- package/dist/clipboardTransfer.js.map +1 -0
- package/dist/convexSiteUrl.d.ts +73 -0
- package/dist/convexSiteUrl.js +137 -0
- package/dist/convexSiteUrl.js.map +1 -0
- package/dist/csv.d.ts +54 -0
- package/dist/csv.js +5499 -0
- package/dist/csv.js.map +1 -0
- package/dist/dataTransfer.d.ts +21 -0
- package/dist/dataTransfer.js +74 -0
- package/dist/dataTransfer.js.map +1 -0
- package/dist/dateValues.d.ts +18 -0
- package/dist/dateValues.js +73 -0
- package/dist/dateValues.js.map +1 -0
- package/dist/deployOutput.d.ts +3 -0
- package/dist/deployOutput.js +23 -0
- package/dist/deployOutput.js.map +1 -0
- package/dist/displayLabel.d.ts +13 -0
- package/dist/displayLabel.js +4342 -0
- package/dist/displayLabel.js.map +1 -0
- package/dist/displayTemplateGenerator.d.ts +11 -0
- package/dist/displayTemplateGenerator.js +98 -0
- package/dist/displayTemplateGenerator.js.map +1 -0
- package/dist/displayTypes.d.ts +10 -0
- package/dist/displayTypes.js +3 -0
- package/dist/displayTypes.js.map +1 -0
- package/dist/dotenv.d.ts +8 -0
- package/dist/dotenv.js +61 -0
- package/dist/dotenv.js.map +1 -0
- package/dist/erdLayout.d.ts +27 -0
- package/dist/erdLayout.js +78 -0
- package/dist/erdLayout.js.map +1 -0
- package/dist/fieldTypeFormat.d.ts +5 -0
- package/dist/fieldTypeFormat.js +63 -0
- package/dist/fieldTypeFormat.js.map +1 -0
- package/dist/fieldTypeMeta.d.ts +50 -0
- package/dist/fieldTypeMeta.js +84 -0
- package/dist/fieldTypeMeta.js.map +1 -0
- package/dist/fieldValueEqual.d.ts +4 -0
- package/dist/fieldValueEqual.js +58 -0
- package/dist/fieldValueEqual.js.map +1 -0
- package/dist/importMatch.d.ts +80 -0
- package/dist/importMatch.js +5643 -0
- package/dist/importMatch.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.js +10647 -0
- package/dist/index.js.map +1 -0
- package/dist/inferIdentifier.d.ts +18 -0
- package/dist/inferIdentifier.js +49 -0
- package/dist/inferIdentifier.js.map +1 -0
- package/dist/keyboard.d.ts +16 -0
- package/dist/keyboard.js +71 -0
- package/dist/keyboard.js.map +1 -0
- package/dist/manifestDeploy.d.ts +27 -0
- package/dist/manifestDeploy.js +16 -0
- package/dist/manifestDeploy.js.map +1 -0
- package/dist/manifestHash.d.ts +11 -0
- package/dist/manifestHash.js +35 -0
- package/dist/manifestHash.js.map +1 -0
- package/dist/previewDeployName.d.ts +26 -0
- package/dist/previewDeployName.js +77 -0
- package/dist/previewDeployName.js.map +1 -0
- package/dist/proposePolicy.d.ts +17 -0
- package/dist/proposePolicy.js +33 -0
- package/dist/proposePolicy.js.map +1 -0
- package/dist/queryBetween.d.ts +20 -0
- package/dist/queryBetween.js +28 -0
- package/dist/queryBetween.js.map +1 -0
- package/dist/queryExecution.d.ts +5 -0
- package/dist/queryExecution.js +58 -0
- package/dist/queryExecution.js.map +1 -0
- package/dist/queryFieldOps.d.ts +66 -0
- package/dist/queryFieldOps.js +138 -0
- package/dist/queryFieldOps.js.map +1 -0
- package/dist/queryMerge.d.ts +29 -0
- package/dist/queryMerge.js +4277 -0
- package/dist/queryMerge.js.map +1 -0
- package/dist/queryPlan.d.ts +97 -0
- package/dist/queryPlan.js +4564 -0
- package/dist/queryPlan.js.map +1 -0
- package/dist/queryStudio.d.ts +25 -0
- package/dist/queryStudio.js +4658 -0
- package/dist/queryStudio.js.map +1 -0
- package/dist/queryTypes.d.ts +402 -0
- package/dist/queryTypes.js +4239 -0
- package/dist/queryTypes.js.map +1 -0
- package/dist/queryValidators.d.ts +99 -0
- package/dist/queryValidators.js +76 -0
- package/dist/queryValidators.js.map +1 -0
- package/dist/readApiQuery.d.ts +10 -0
- package/dist/readApiQuery.js +24 -0
- package/dist/readApiQuery.js.map +1 -0
- package/dist/recordTableColumns.d.ts +21 -0
- package/dist/recordTableColumns.js +4469 -0
- package/dist/recordTableColumns.js.map +1 -0
- package/dist/refDisplayRequests.d.ts +17 -0
- package/dist/refDisplayRequests.js +4877 -0
- package/dist/refDisplayRequests.js.map +1 -0
- package/dist/refGraph.d.ts +23 -0
- package/dist/refGraph.js +102 -0
- package/dist/refGraph.js.map +1 -0
- package/dist/refsRecompute.d.ts +8 -0
- package/dist/refsRecompute.js +12 -0
- package/dist/refsRecompute.js.map +1 -0
- package/dist/richDoc.d.ts +67 -0
- package/dist/richDoc.js +4408 -0
- package/dist/richDoc.js.map +1 -0
- package/dist/schemaGenerator.d.ts +31 -0
- package/dist/schemaGenerator.js +198 -0
- package/dist/schemaGenerator.js.map +1 -0
- package/dist/schemaShrink.d.ts +74 -0
- package/dist/schemaShrink.js +132 -0
- package/dist/schemaShrink.js.map +1 -0
- package/dist/schemaShrinkValidators.d.ts +72 -0
- package/dist/schemaShrinkValidators.js +31 -0
- package/dist/schemaShrinkValidators.js.map +1 -0
- package/dist/schemaTypes.d.ts +454 -0
- package/dist/schemaTypes.js +4557 -0
- package/dist/schemaTypes.js.map +1 -0
- package/dist/share.d.ts +8 -0
- package/dist/share.js +4755 -0
- package/dist/share.js.map +1 -0
- package/dist/shareApiBridge.d.ts +18 -0
- package/dist/shareApiBridge.js +4283 -0
- package/dist/shareApiBridge.js.map +1 -0
- package/dist/shareGuestPolicy.d.ts +14 -0
- package/dist/shareGuestPolicy.js +90 -0
- package/dist/shareGuestPolicy.js.map +1 -0
- package/dist/shareProposal.d.ts +113 -0
- package/dist/shareProposal.js +4810 -0
- package/dist/shareProposal.js.map +1 -0
- package/dist/shareProposalDiff.d.ts +13 -0
- package/dist/shareProposalDiff.js +91 -0
- package/dist/shareProposalDiff.js.map +1 -0
- package/dist/shareScopes.d.ts +14 -0
- package/dist/shareScopes.js +223 -0
- package/dist/shareScopes.js.map +1 -0
- package/dist/shareTokenCrypto.d.ts +9 -0
- package/dist/shareTokenCrypto.js +87 -0
- package/dist/shareTokenCrypto.js.map +1 -0
- package/dist/shareTokens.d.ts +6 -0
- package/dist/shareTokens.js +26 -0
- package/dist/shareTokens.js.map +1 -0
- package/dist/shareTypes.d.ts +107 -0
- package/dist/shareTypes.js +3 -0
- package/dist/shareTypes.js.map +1 -0
- package/dist/shareValidators.d.ts +168 -0
- package/dist/shareValidators.js +124 -0
- package/dist/shareValidators.js.map +1 -0
- package/dist/shareWizard.d.ts +14 -0
- package/dist/shareWizard.js +200 -0
- package/dist/shareWizard.js.map +1 -0
- package/dist/spaceBundle.d.ts +67 -0
- package/dist/spaceBundle.js +4664 -0
- package/dist/spaceBundle.js.map +1 -0
- package/dist/storageFieldValues.d.ts +10 -0
- package/dist/storageFieldValues.js +4421 -0
- package/dist/storageFieldValues.js.map +1 -0
- package/dist/studioBoot.d.ts +49 -0
- package/dist/studioBoot.js +167 -0
- package/dist/studioBoot.js.map +1 -0
- package/dist/syncClampMembership.d.ts +22 -0
- package/dist/syncClampMembership.js +74 -0
- package/dist/syncClampMembership.js.map +1 -0
- package/dist/tenantHosts.d.ts +30 -0
- package/dist/tenantHosts.js +60 -0
- package/dist/tenantHosts.js.map +1 -0
- package/dist/tenantSecretsCrypto.d.ts +31 -0
- package/dist/tenantSecretsCrypto.js +145 -0
- package/dist/tenantSecretsCrypto.js.map +1 -0
- package/dist/useDebouncedCommit.d.ts +11 -0
- package/dist/useDebouncedCommit.js +34 -0
- package/dist/useDebouncedCommit.js.map +1 -0
- package/dist/useDebouncedValue.d.ts +1 -0
- package/dist/useDebouncedValue.js +15 -0
- package/dist/useDebouncedValue.js.map +1 -0
- package/dist/useModifierHeld.d.ts +2 -0
- package/dist/useModifierHeld.js +28 -0
- package/dist/useModifierHeld.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { FieldType, Table } from "./schemaTypes.ts";
|
|
2
|
+
/** One edit surface for each predicate operation's wire shape and UI label. */
|
|
3
|
+
export declare const PREDICATE_VARIANTS: readonly [{
|
|
4
|
+
readonly value: "unknown";
|
|
5
|
+
readonly ops: readonly [{
|
|
6
|
+
readonly op: "eq";
|
|
7
|
+
readonly label: "=";
|
|
8
|
+
}, {
|
|
9
|
+
readonly op: "neq";
|
|
10
|
+
readonly label: "≠";
|
|
11
|
+
}];
|
|
12
|
+
}, {
|
|
13
|
+
readonly value: "unknownArray";
|
|
14
|
+
readonly ops: readonly [{
|
|
15
|
+
readonly op: "in";
|
|
16
|
+
readonly label: "in";
|
|
17
|
+
}];
|
|
18
|
+
}, {
|
|
19
|
+
readonly value: "unknown";
|
|
20
|
+
readonly ops: readonly [{
|
|
21
|
+
readonly op: "gt";
|
|
22
|
+
readonly label: ">";
|
|
23
|
+
}, {
|
|
24
|
+
readonly op: "gte";
|
|
25
|
+
readonly label: "≥";
|
|
26
|
+
}, {
|
|
27
|
+
readonly op: "lt";
|
|
28
|
+
readonly label: "<";
|
|
29
|
+
}, {
|
|
30
|
+
readonly op: "lte";
|
|
31
|
+
readonly label: "≤";
|
|
32
|
+
}];
|
|
33
|
+
}, {
|
|
34
|
+
readonly value: "between";
|
|
35
|
+
readonly ops: readonly [{
|
|
36
|
+
readonly op: "between";
|
|
37
|
+
readonly label: "between";
|
|
38
|
+
}];
|
|
39
|
+
}, {
|
|
40
|
+
readonly value: "unknownArray";
|
|
41
|
+
readonly ops: readonly [{
|
|
42
|
+
readonly op: "containsAll";
|
|
43
|
+
readonly label: "contains all";
|
|
44
|
+
}];
|
|
45
|
+
}];
|
|
46
|
+
type PredicateOperator = (typeof PREDICATE_VARIANTS)[number]["ops"][number];
|
|
47
|
+
export type PredicateOp = PredicateOperator["op"];
|
|
48
|
+
export declare const PREDICATE_OPS: PredicateOp[];
|
|
49
|
+
export declare function predicateOpLabel(op: PredicateOp): string;
|
|
50
|
+
export type FieldOpSupport = {
|
|
51
|
+
eq: boolean;
|
|
52
|
+
neq: boolean;
|
|
53
|
+
in: boolean;
|
|
54
|
+
ranges: boolean;
|
|
55
|
+
sort: boolean;
|
|
56
|
+
containsAll: boolean;
|
|
57
|
+
};
|
|
58
|
+
/** Resolve field type for user fields and system fields (`_id`, `_creationTime`). */
|
|
59
|
+
export declare function resolveQueryFieldType(table: Pick<Table, "name" | "fields">, field: string): FieldType | null;
|
|
60
|
+
/** Effective type used for operator eligibility (unwraps homogeneous unions). */
|
|
61
|
+
export declare function effectiveQueryFieldType(t: FieldType): FieldType | null;
|
|
62
|
+
export declare function fieldOpSupport(type: FieldType): FieldOpSupport;
|
|
63
|
+
export declare function opAllowedForType(type: FieldType, op: PredicateOp): boolean;
|
|
64
|
+
export declare function fieldSupportsSort(type: FieldType): boolean;
|
|
65
|
+
export declare function isRangeOp(op: PredicateOp): boolean;
|
|
66
|
+
export {};
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// packages/@columnus/shared/src/queryFieldOps.ts
|
|
2
|
+
var PREDICATE_VARIANTS = [
|
|
3
|
+
{
|
|
4
|
+
value: "unknown",
|
|
5
|
+
ops: [
|
|
6
|
+
{ op: "eq", label: "=" },
|
|
7
|
+
{ op: "neq", label: "\u2260" }
|
|
8
|
+
]
|
|
9
|
+
},
|
|
10
|
+
{ value: "unknownArray", ops: [{ op: "in", label: "in" }] },
|
|
11
|
+
{
|
|
12
|
+
value: "unknown",
|
|
13
|
+
ops: [
|
|
14
|
+
{ op: "gt", label: ">" },
|
|
15
|
+
{ op: "gte", label: "\u2265" },
|
|
16
|
+
{ op: "lt", label: "<" },
|
|
17
|
+
{ op: "lte", label: "\u2264" }
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
{ value: "between", ops: [{ op: "between", label: "between" }] },
|
|
21
|
+
{
|
|
22
|
+
value: "unknownArray",
|
|
23
|
+
ops: [{ op: "containsAll", label: "contains all" }]
|
|
24
|
+
}
|
|
25
|
+
];
|
|
26
|
+
var PREDICATE_OPS = PREDICATE_VARIANTS.flatMap(
|
|
27
|
+
(variant) => variant.ops.map(({ op }) => op)
|
|
28
|
+
);
|
|
29
|
+
var PREDICATE_OP_LABELS = new Map(
|
|
30
|
+
PREDICATE_VARIANTS.flatMap((variant) => variant.ops.map(({ op, label }) => [op, label]))
|
|
31
|
+
);
|
|
32
|
+
function predicateOpLabel(op) {
|
|
33
|
+
return PREDICATE_OP_LABELS.get(op) ?? op;
|
|
34
|
+
}
|
|
35
|
+
var NONE = {
|
|
36
|
+
eq: false,
|
|
37
|
+
neq: false,
|
|
38
|
+
in: false,
|
|
39
|
+
ranges: false,
|
|
40
|
+
sort: false,
|
|
41
|
+
containsAll: false
|
|
42
|
+
};
|
|
43
|
+
var SCALAR_ORDERED = {
|
|
44
|
+
eq: true,
|
|
45
|
+
neq: true,
|
|
46
|
+
in: true,
|
|
47
|
+
ranges: true,
|
|
48
|
+
sort: true,
|
|
49
|
+
containsAll: false
|
|
50
|
+
};
|
|
51
|
+
var SCALAR_EQ = {
|
|
52
|
+
eq: true,
|
|
53
|
+
neq: true,
|
|
54
|
+
in: true,
|
|
55
|
+
ranges: false,
|
|
56
|
+
sort: true,
|
|
57
|
+
containsAll: false
|
|
58
|
+
};
|
|
59
|
+
function resolveQueryFieldType(table, field) {
|
|
60
|
+
if (field === "_id") return { kind: "id", table: table.name };
|
|
61
|
+
if (field === "_creationTime") return { kind: "number" };
|
|
62
|
+
return table.fields.find((f) => f.name === field)?.type ?? null;
|
|
63
|
+
}
|
|
64
|
+
function comparableUnionKind(t) {
|
|
65
|
+
if (t.kind !== "union" || t.options.length === 0) return null;
|
|
66
|
+
const first = t.options[0];
|
|
67
|
+
if (!t.options.every((o) => o.kind === first.kind)) return null;
|
|
68
|
+
if (first.kind === "string" || first.kind === "number" || first.kind === "bigint" || first.kind === "boolean" || first.kind === "date" || first.kind === "datetime" || first.kind === "id") {
|
|
69
|
+
return first;
|
|
70
|
+
}
|
|
71
|
+
if (first.kind === "literal") {
|
|
72
|
+
const v = first.value;
|
|
73
|
+
if (typeof v === "string") return { kind: "string" };
|
|
74
|
+
if (typeof v === "number") return { kind: "number" };
|
|
75
|
+
if (typeof v === "boolean") return { kind: "boolean" };
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
function effectiveQueryFieldType(t) {
|
|
80
|
+
if (t.kind === "union") return comparableUnionKind(t);
|
|
81
|
+
return t;
|
|
82
|
+
}
|
|
83
|
+
function fieldOpSupport(type) {
|
|
84
|
+
const t = effectiveQueryFieldType(type);
|
|
85
|
+
if (!t) return NONE;
|
|
86
|
+
switch (t.kind) {
|
|
87
|
+
case "string":
|
|
88
|
+
case "number":
|
|
89
|
+
case "bigint":
|
|
90
|
+
case "date":
|
|
91
|
+
case "datetime":
|
|
92
|
+
return SCALAR_ORDERED;
|
|
93
|
+
case "boolean":
|
|
94
|
+
case "id":
|
|
95
|
+
case "literal":
|
|
96
|
+
return SCALAR_EQ;
|
|
97
|
+
case "array":
|
|
98
|
+
if (t.element.kind === "id" || t.element.kind === "string" || t.element.kind === "number" || t.element.kind === "boolean" || t.element.kind === "literal") {
|
|
99
|
+
return { ...NONE, containsAll: true };
|
|
100
|
+
}
|
|
101
|
+
return NONE;
|
|
102
|
+
default:
|
|
103
|
+
return NONE;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function opAllowedForType(type, op) {
|
|
107
|
+
const support = fieldOpSupport(type);
|
|
108
|
+
switch (op) {
|
|
109
|
+
case "eq":
|
|
110
|
+
return support.eq;
|
|
111
|
+
case "neq":
|
|
112
|
+
return support.neq;
|
|
113
|
+
case "in":
|
|
114
|
+
return support.in;
|
|
115
|
+
case "gt":
|
|
116
|
+
case "gte":
|
|
117
|
+
case "lt":
|
|
118
|
+
case "lte":
|
|
119
|
+
case "between":
|
|
120
|
+
return support.ranges;
|
|
121
|
+
case "containsAll":
|
|
122
|
+
return support.containsAll;
|
|
123
|
+
default: {
|
|
124
|
+
const _exhaustive = op;
|
|
125
|
+
return _exhaustive;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function fieldSupportsSort(type) {
|
|
130
|
+
return fieldOpSupport(type).sort;
|
|
131
|
+
}
|
|
132
|
+
function isRangeOp(op) {
|
|
133
|
+
return op === "gt" || op === "gte" || op === "lt" || op === "lte" || op === "between";
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export { PREDICATE_OPS, PREDICATE_VARIANTS, effectiveQueryFieldType, fieldOpSupport, fieldSupportsSort, isRangeOp, opAllowedForType, predicateOpLabel, resolveQueryFieldType };
|
|
137
|
+
//# sourceMappingURL=queryFieldOps.js.map
|
|
138
|
+
//# sourceMappingURL=queryFieldOps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/queryFieldOps.ts"],"names":[],"mappings":"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","file":"queryFieldOps.js","sourcesContent":["import type { FieldType, Table } from \"./schemaTypes.ts\";\n\n/** One edit surface for each predicate operation's wire shape and UI label. */\nexport const PREDICATE_VARIANTS = [\n {\n value: \"unknown\",\n ops: [\n { op: \"eq\", label: \"=\" },\n { op: \"neq\", label: \"≠\" },\n ],\n },\n { value: \"unknownArray\", ops: [{ op: \"in\", label: \"in\" }] },\n {\n value: \"unknown\",\n ops: [\n { op: \"gt\", label: \">\" },\n { op: \"gte\", label: \"≥\" },\n { op: \"lt\", label: \"<\" },\n { op: \"lte\", label: \"≤\" },\n ],\n },\n { value: \"between\", ops: [{ op: \"between\", label: \"between\" }] },\n {\n value: \"unknownArray\",\n ops: [{ op: \"containsAll\", label: \"contains all\" }],\n },\n] as const;\n\ntype PredicateOperator = (typeof PREDICATE_VARIANTS)[number][\"ops\"][number];\nexport type PredicateOp = PredicateOperator[\"op\"];\nexport const PREDICATE_OPS = PREDICATE_VARIANTS.flatMap((variant) =>\n variant.ops.map(({ op }) => op),\n) as PredicateOp[];\n\nconst PREDICATE_OP_LABELS = new Map<PredicateOp, string>(\n PREDICATE_VARIANTS.flatMap((variant) => variant.ops.map(({ op, label }) => [op, label] as const)),\n);\n\nexport function predicateOpLabel(op: PredicateOp): string {\n return PREDICATE_OP_LABELS.get(op) ?? op;\n}\n\nexport type FieldOpSupport = {\n eq: boolean;\n neq: boolean;\n in: boolean;\n ranges: boolean;\n sort: boolean;\n containsAll: boolean;\n};\n\nconst NONE: FieldOpSupport = {\n eq: false,\n neq: false,\n in: false,\n ranges: false,\n sort: false,\n containsAll: false,\n};\n\nconst SCALAR_ORDERED: FieldOpSupport = {\n eq: true,\n neq: true,\n in: true,\n ranges: true,\n sort: true,\n containsAll: false,\n};\n\nconst SCALAR_EQ: FieldOpSupport = {\n eq: true,\n neq: true,\n in: true,\n ranges: false,\n sort: true,\n containsAll: false,\n};\n\n/** Resolve field type for user fields and system fields (`_id`, `_creationTime`). */\nexport function resolveQueryFieldType(\n table: Pick<Table, \"name\" | \"fields\">,\n field: string,\n): FieldType | null {\n if (field === \"_id\") return { kind: \"id\", table: table.name };\n if (field === \"_creationTime\") return { kind: \"number\" };\n return table.fields.find((f) => f.name === field)?.type ?? null;\n}\n\nfunction comparableUnionKind(t: FieldType): FieldType | null {\n if (t.kind !== \"union\" || t.options.length === 0) return null;\n const first = t.options[0]!;\n if (!t.options.every((o) => o.kind === first.kind)) return null;\n if (\n first.kind === \"string\" ||\n first.kind === \"number\" ||\n first.kind === \"bigint\" ||\n first.kind === \"boolean\" ||\n first.kind === \"date\" ||\n first.kind === \"datetime\" ||\n first.kind === \"id\"\n ) {\n return first;\n }\n if (first.kind === \"literal\") {\n const v = first.value;\n if (typeof v === \"string\") return { kind: \"string\" };\n if (typeof v === \"number\") return { kind: \"number\" };\n if (typeof v === \"boolean\") return { kind: \"boolean\" };\n }\n return null;\n}\n\n/** Effective type used for operator eligibility (unwraps homogeneous unions). */\nexport function effectiveQueryFieldType(t: FieldType): FieldType | null {\n if (t.kind === \"union\") return comparableUnionKind(t);\n return t;\n}\n\nexport function fieldOpSupport(type: FieldType): FieldOpSupport {\n const t = effectiveQueryFieldType(type);\n if (!t) return NONE;\n\n switch (t.kind) {\n case \"string\":\n case \"number\":\n case \"bigint\":\n case \"date\":\n case \"datetime\":\n return SCALAR_ORDERED;\n case \"boolean\":\n case \"id\":\n case \"literal\":\n return SCALAR_EQ;\n case \"array\":\n if (\n t.element.kind === \"id\" ||\n t.element.kind === \"string\" ||\n t.element.kind === \"number\" ||\n t.element.kind === \"boolean\" ||\n t.element.kind === \"literal\"\n ) {\n return { ...NONE, containsAll: true };\n }\n return NONE;\n default:\n return NONE;\n }\n}\n\nexport function opAllowedForType(type: FieldType, op: PredicateOp): boolean {\n const support = fieldOpSupport(type);\n switch (op) {\n case \"eq\":\n return support.eq;\n case \"neq\":\n return support.neq;\n case \"in\":\n return support.in;\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\":\n case \"between\":\n return support.ranges;\n case \"containsAll\":\n return support.containsAll;\n default: {\n const _exhaustive: never = op;\n return _exhaustive;\n }\n }\n}\n\nexport function fieldSupportsSort(type: FieldType): boolean {\n return fieldOpSupport(type).sort;\n}\n\nexport function isRangeOp(op: PredicateOp): boolean {\n return op === \"gt\" || op === \"gte\" || op === \"lt\" || op === \"lte\" || op === \"between\";\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type ClampQuery, type Predicate, type Query, type QueryError } from "./queryTypes.ts";
|
|
2
|
+
export type MergedQuery = {
|
|
3
|
+
/** Logical caller query after predicate/default merge; preserves explicit caller options. */
|
|
4
|
+
query: Query;
|
|
5
|
+
/** Execution ceiling after applying the profile/share limit to the caller request. */
|
|
6
|
+
effectiveMaxScan: number;
|
|
7
|
+
};
|
|
8
|
+
export type MergeQueryInput = {
|
|
9
|
+
caller?: Query | null;
|
|
10
|
+
clamp?: ClampQuery | null;
|
|
11
|
+
/** Profile/share ceiling; defaults to {@link DEFAULT_MAX_SCAN_LIMIT}. */
|
|
12
|
+
maxScanLimit?: number;
|
|
13
|
+
};
|
|
14
|
+
export declare function predicatesEqual(a: Predicate, b: Predicate): boolean;
|
|
15
|
+
/** Detect contradictory equality / membership on the same field. */
|
|
16
|
+
export declare function findUnsatisfiablePredicates(predicates: Predicate[]): QueryError | null;
|
|
17
|
+
/**
|
|
18
|
+
* AND-merge clamp with caller query.
|
|
19
|
+
* Clamp supplies defaults for order/search; caller may override.
|
|
20
|
+
* The caller's optional `maxScan` stays in the AST; `effectiveMaxScan` applies the ceiling.
|
|
21
|
+
* `indexHint` comes from the caller only.
|
|
22
|
+
*/
|
|
23
|
+
export declare function mergeQuery(input: MergeQueryInput): {
|
|
24
|
+
ok: true;
|
|
25
|
+
merged: MergedQuery;
|
|
26
|
+
} | {
|
|
27
|
+
ok: false;
|
|
28
|
+
error: QueryError;
|
|
29
|
+
};
|