@antelopejs/interface-data-api 0.4.0 → 0.5.0
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/dist/components.d.ts +15 -7
- package/dist/components.js +98 -645
- package/dist/components.js.map +1 -1
- package/dist/index.d.ts +41 -36
- package/dist/index.js +94 -92
- package/dist/index.js.map +1 -1
- package/dist/internal/computed.d.ts +6 -0
- package/dist/internal/computed.js +43 -0
- package/dist/internal/computed.js.map +1 -0
- package/dist/internal/controller-types.d.ts +19 -0
- package/dist/internal/controller-types.js +4 -0
- package/dist/internal/controller-types.js.map +1 -0
- package/dist/internal/default-filter.d.ts +4 -0
- package/dist/internal/default-filter.js +19 -0
- package/dist/internal/default-filter.js.map +1 -0
- package/dist/internal/deferred-joined-stream.d.ts +11 -0
- package/dist/internal/deferred-joined-stream.js +112 -0
- package/dist/internal/deferred-joined-stream.js.map +1 -0
- package/dist/internal/field-types.d.ts +183 -0
- package/dist/internal/field-types.js +4 -0
- package/dist/internal/field-types.js.map +1 -0
- package/dist/internal/filters.d.ts +4 -0
- package/dist/internal/filters.js +15 -0
- package/dist/internal/filters.js.map +1 -0
- package/dist/internal/foreign.d.ts +6 -0
- package/dist/internal/foreign.js +116 -0
- package/dist/internal/foreign.js.map +1 -0
- package/dist/internal/guards.d.ts +20 -0
- package/dist/internal/guards.js +74 -0
- package/dist/internal/guards.js.map +1 -0
- package/dist/internal/joined.d.ts +28 -0
- package/dist/internal/joined.js +127 -0
- package/dist/internal/joined.js.map +1 -0
- package/dist/internal/list.d.ts +16 -0
- package/dist/internal/list.js +178 -0
- package/dist/internal/list.js.map +1 -0
- package/dist/internal/meta-records.d.ts +17 -0
- package/dist/internal/meta-records.js +73 -0
- package/dist/internal/meta-records.js.map +1 -0
- package/dist/internal/properties.d.ts +4 -0
- package/dist/internal/properties.js +43 -0
- package/dist/internal/properties.js.map +1 -0
- package/dist/internal/table-reference.d.ts +11 -0
- package/dist/internal/table-reference.js +46 -0
- package/dist/internal/table-reference.js.map +1 -0
- package/dist/internal/tables.d.ts +18 -0
- package/dist/internal/tables.js +37 -0
- package/dist/internal/tables.js.map +1 -0
- package/dist/internal/validation.d.ts +11 -0
- package/dist/internal/validation.js +88 -0
- package/dist/internal/validation.js.map +1 -0
- package/dist/metadata.d.ts +27 -228
- package/dist/metadata.js +61 -188
- package/dist/metadata.js.map +1 -1
- package/dist/tests/components/access_control.test.js +20 -20
- package/dist/tests/components/access_control.test.js.map +1 -1
- package/dist/tests/components/computed.test.js +28 -30
- package/dist/tests/components/computed.test.js.map +1 -1
- package/dist/tests/components/cross_instance.test.js +8 -6
- package/dist/tests/components/cross_instance.test.js.map +1 -1
- package/dist/tests/components/deferred_joined.test.js +56 -53
- package/dist/tests/components/deferred_joined.test.js.map +1 -1
- package/dist/tests/components/filter_options.test.js +8 -7
- package/dist/tests/components/filter_options.test.js.map +1 -1
- package/dist/tests/components/foreign_computed.test.js +14 -16
- package/dist/tests/components/foreign_computed.test.js.map +1 -1
- package/dist/tests/components/foreign_joined.test.js +19 -27
- package/dist/tests/components/foreign_joined.test.js.map +1 -1
- package/dist/tests/components/joined.test.js +41 -45
- package/dist/tests/components/joined.test.js.map +1 -1
- package/dist/tests/components/listable.test.js +59 -58
- package/dist/tests/components/listable.test.js.map +1 -1
- package/dist/tests/components/localized_sort.test.js +10 -11
- package/dist/tests/components/localized_sort.test.js.map +1 -1
- package/dist/tests/components/mandatory.test.js +25 -25
- package/dist/tests/components/mandatory.test.js.map +1 -1
- package/dist/tests/components/modifier_key.test.js +19 -18
- package/dist/tests/components/modifier_key.test.js.map +1 -1
- package/dist/tests/components/parse_body.test.d.ts +1 -0
- package/dist/tests/components/parse_body.test.js +75 -0
- package/dist/tests/components/parse_body.test.js.map +1 -0
- package/dist/tests/components/parsed_value.test.js +23 -21
- package/dist/tests/components/parsed_value.test.js.map +1 -1
- package/dist/tests/components/partial_edit.test.js +33 -32
- package/dist/tests/components/partial_edit.test.js.map +1 -1
- package/dist/tests/components/per_action_access.test.js +12 -12
- package/dist/tests/components/per_action_access.test.js.map +1 -1
- package/dist/tests/components/validator.test.js +45 -37
- package/dist/tests/components/validator.test.js.map +1 -1
- package/dist/tests/helpers/other-instance.d.ts +11 -1
- package/dist/tests/helpers/other-instance.js +27 -5
- package/dist/tests/helpers/other-instance.js.map +1 -1
- package/dist/tests/index/get_guard.test.js +6 -6
- package/dist/tests/index/get_guard.test.js.map +1 -1
- package/dist/tests/index/inheritance.test.js +10 -9
- package/dist/tests/index/inheritance.test.js.map +1 -1
- package/dist/tests/index/routes.test.js +40 -44
- package/dist/tests/index/routes.test.js.map +1 -1
- package/dist/tests/integration.test.d.ts +1 -1
- package/dist/tests/integration.test.js +53 -729
- package/dist/tests/integration.test.js.map +1 -1
- package/dist/tests/internal/http.d.ts +23 -0
- package/dist/tests/internal/http.js +35 -0
- package/dist/tests/internal/http.js.map +1 -0
- package/dist/tests/internal/shop-api.d.ts +1 -0
- package/dist/tests/internal/shop-api.js +331 -0
- package/dist/tests/internal/shop-api.js.map +1 -0
- package/dist/tests/internal/shop-schema.d.ts +154 -0
- package/dist/tests/internal/shop-schema.js +387 -0
- package/dist/tests/internal/shop-schema.js.map +1 -0
- package/dist/tests/utils.d.ts +5 -5
- package/dist/tests/utils.js +1 -3
- package/dist/tests/utils.js.map +1 -1
- package/dist/tests/utils.test.js +10 -11
- package/dist/tests/utils.test.js.map +1 -1
- package/docs/3.routes.md +8 -3
- package/docs/5.validators.md +12 -3
- package/docs/8.filters.md +7 -3
- package/package.json +14 -3
- package/skills/data-api-interface/SKILL.md +4 -0
- package/skills/data-api-interface/cases.json +99 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** @internal @packageDocumentation */
|
|
2
|
+
import { type Datum, type SchemaInstance, type Stream } from "@antelopejs/interface-database";
|
|
3
|
+
import type { DataAPIMeta, FieldFilter } from "../metadata";
|
|
4
|
+
export interface JoinedFieldSplit {
|
|
5
|
+
filter: Set<string>;
|
|
6
|
+
sort: Set<string>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Splits the joined fields of `meta` between those {@link List} must
|
|
10
|
+
* materialize before the filter and count (`filter`) and those it only
|
|
11
|
+
* needs after the count (`sort`). Joined fields referenced by neither are
|
|
12
|
+
* left out so the list route can defer their lookups to the returned page.
|
|
13
|
+
*
|
|
14
|
+
* Computed expressions may read joined fields, so materializing a computed
|
|
15
|
+
* field pulls every remaining joined group in with it. Groups whose local
|
|
16
|
+
* key is also a foreign field must resolve before `Foreign` replaces the
|
|
17
|
+
* key with the looked-up record.
|
|
18
|
+
*/
|
|
19
|
+
export declare function splitJoinedFields(meta: DataAPIMeta, sorting?: [string, "asc" | "desc" | undefined], filters?: Record<string, FieldFilter>): JoinedFieldSplit;
|
|
20
|
+
/**
|
|
21
|
+
* Joined field names that {@link List} does not materialize for the given
|
|
22
|
+
* split. The default list route resolves these after pagination so their
|
|
23
|
+
* lookups only run on the returned page.
|
|
24
|
+
*/
|
|
25
|
+
export declare function deferredJoinedFields(meta: DataAPIMeta, split: JoinedFieldSplit): Set<string>;
|
|
26
|
+
export declare function Joined(db: SchemaInstance<any>, meta: DataAPIMeta, query: Stream<any>, only?: Set<string>): Stream<any>;
|
|
27
|
+
export declare function Joined(db: SchemaInstance<any>, meta: DataAPIMeta, query: Datum<any>, only?: Set<string>): Datum<any>;
|
|
28
|
+
export declare function Joined(db: SchemaInstance<any>, meta: DataAPIMeta, query: Stream<any> | Datum<any>, only?: Set<string>): Stream<any> | Datum<any>;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** @internal @packageDocumentation */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.splitJoinedFields = splitJoinedFields;
|
|
5
|
+
exports.deferredJoinedFields = deferredJoinedFields;
|
|
6
|
+
exports.Joined = Joined;
|
|
7
|
+
const interface_database_1 = require("@antelopejs/interface-database");
|
|
8
|
+
const tables_1 = require("./tables");
|
|
9
|
+
function collectJoinedGroups(meta) {
|
|
10
|
+
const groups = new Map();
|
|
11
|
+
for (const [name, field] of Object.entries(meta.fields)) {
|
|
12
|
+
if (!field.joined)
|
|
13
|
+
continue;
|
|
14
|
+
const j = field.joined;
|
|
15
|
+
const groupKey = `${j.schemaName ?? ""}|${j.table}|${j.localKey}|${j.remoteIndex}`;
|
|
16
|
+
let group = groups.get(groupKey);
|
|
17
|
+
if (!group) {
|
|
18
|
+
group = {
|
|
19
|
+
table: j.table,
|
|
20
|
+
tableClass: j.tableClass,
|
|
21
|
+
localKey: j.localKey,
|
|
22
|
+
remoteIndex: j.remoteIndex,
|
|
23
|
+
schemaName: j.schemaName,
|
|
24
|
+
fields: [],
|
|
25
|
+
};
|
|
26
|
+
groups.set(groupKey, group);
|
|
27
|
+
}
|
|
28
|
+
group.fields.push({ name, remoteField: j.remoteField });
|
|
29
|
+
}
|
|
30
|
+
return Array.from(groups.values());
|
|
31
|
+
}
|
|
32
|
+
function addAll(target, names) {
|
|
33
|
+
for (const name of names) {
|
|
34
|
+
target.add(name);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Splits the joined fields of `meta` between those {@link List} must
|
|
39
|
+
* materialize before the filter and count (`filter`) and those it only
|
|
40
|
+
* needs after the count (`sort`). Joined fields referenced by neither are
|
|
41
|
+
* left out so the list route can defer their lookups to the returned page.
|
|
42
|
+
*
|
|
43
|
+
* Computed expressions may read joined fields, so materializing a computed
|
|
44
|
+
* field pulls every remaining joined group in with it. Groups whose local
|
|
45
|
+
* key is also a foreign field must resolve before `Foreign` replaces the
|
|
46
|
+
* key with the looked-up record.
|
|
47
|
+
*/
|
|
48
|
+
function splitJoinedFields(meta, sorting, filters) {
|
|
49
|
+
const split = { filter: new Set(), sort: new Set() };
|
|
50
|
+
const filterNames = Object.keys(meta.filters).filter((name) => filters && name in filters);
|
|
51
|
+
const hasComputedFilter = filterNames.some((name) => meta.fields[name]?.computed);
|
|
52
|
+
const sortField = sorting?.[0];
|
|
53
|
+
const hasComputedSort = !!sortField && !!meta.fields[sortField]?.computed;
|
|
54
|
+
for (const group of collectJoinedGroups(meta)) {
|
|
55
|
+
const names = group.fields.map((field) => field.name);
|
|
56
|
+
if (hasComputedFilter || names.some((name) => filterNames.includes(name))) {
|
|
57
|
+
addAll(split.filter, names);
|
|
58
|
+
}
|
|
59
|
+
else if (hasComputedSort ||
|
|
60
|
+
(sortField && names.includes(sortField)) ||
|
|
61
|
+
meta.fields[group.localKey]?.foreign) {
|
|
62
|
+
addAll(split.sort, names);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return split;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Joined field names that {@link List} does not materialize for the given
|
|
69
|
+
* split. The default list route resolves these after pagination so their
|
|
70
|
+
* lookups only run on the returned page.
|
|
71
|
+
*/
|
|
72
|
+
function deferredJoinedFields(meta, split) {
|
|
73
|
+
return new Set(Object.entries(meta.fields)
|
|
74
|
+
.filter(([name, field]) => field.joined && !split.filter.has(name) && !split.sort.has(name))
|
|
75
|
+
.map(([name]) => name));
|
|
76
|
+
}
|
|
77
|
+
function Joined(db, meta, query, only) {
|
|
78
|
+
const groups = collectJoinedGroups(meta).filter((group) => !only || group.fields.some((field) => only.has(field.name)));
|
|
79
|
+
if (groups.length === 0) {
|
|
80
|
+
return query;
|
|
81
|
+
}
|
|
82
|
+
const emptyRemote = {};
|
|
83
|
+
const tmpKeyFor = (localKey) => `__joined_orig_${localKey}`;
|
|
84
|
+
if ((0, interface_database_1.IsStream)(query)) {
|
|
85
|
+
let stream = query;
|
|
86
|
+
const tmpKeys = [];
|
|
87
|
+
for (const group of groups) {
|
|
88
|
+
const remoteFields = group.fields.map((f) => f.remoteField);
|
|
89
|
+
const remoteTable = (0, tables_1.pluckedTable)((0, tables_1.targetTable)(db, group), group.remoteIndex, ...remoteFields);
|
|
90
|
+
const tmpKey = tmpKeyFor(group.localKey);
|
|
91
|
+
tmpKeys.push(tmpKey);
|
|
92
|
+
stream = stream
|
|
93
|
+
.map((row) => row.merge({ [tmpKey]: row.key(group.localKey) }))
|
|
94
|
+
.lookup(remoteTable, group.localKey, group.remoteIndex)
|
|
95
|
+
.map((row) => {
|
|
96
|
+
const merged = {};
|
|
97
|
+
const remote = row.key(group.localKey).default(emptyRemote);
|
|
98
|
+
for (const f of group.fields) {
|
|
99
|
+
merged[f.name] = remote.key(f.remoteField).default(null);
|
|
100
|
+
}
|
|
101
|
+
merged[group.localKey] = row.key(tmpKey);
|
|
102
|
+
return row.merge(merged);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return stream.without(...tmpKeys);
|
|
106
|
+
}
|
|
107
|
+
let datum = query;
|
|
108
|
+
for (const group of groups) {
|
|
109
|
+
const remoteFields = group.fields.map((f) => f.remoteField);
|
|
110
|
+
const remoteTable = (0, tables_1.pluckedTable)((0, tables_1.targetTable)(db, group), group.remoteIndex, ...remoteFields);
|
|
111
|
+
const tmpKey = tmpKeyFor(group.localKey);
|
|
112
|
+
datum = datum
|
|
113
|
+
.do((row) => row.merge({ [tmpKey]: row.key(group.localKey) }))
|
|
114
|
+
.lookup(remoteTable, group.localKey, group.remoteIndex)
|
|
115
|
+
.do((row) => {
|
|
116
|
+
const merged = {};
|
|
117
|
+
const remote = row.key(group.localKey).default(emptyRemote);
|
|
118
|
+
for (const f of group.fields) {
|
|
119
|
+
merged[f.name] = remote.key(f.remoteField).default(null);
|
|
120
|
+
}
|
|
121
|
+
merged[group.localKey] = row.key(tmpKey);
|
|
122
|
+
return row.merge(merged);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return datum;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=joined.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"joined.js","sourceRoot":"","sources":["../../src/internal/joined.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** @internal @packageDocumentation */
|
|
2
|
+
import type { RequestContext } from "@antelopejs/interface-api";
|
|
3
|
+
import type { Datum, SchemaInstance, Stream, Table } from "@antelopejs/interface-database";
|
|
4
|
+
import type { Query } from "../components";
|
|
5
|
+
import { type DataAPIMeta } from "../metadata";
|
|
6
|
+
type ListPageOptions = Query.ListPageOptions;
|
|
7
|
+
/** The arguments {@link Query.List} takes after the request context. */
|
|
8
|
+
interface ListArguments {
|
|
9
|
+
sorting?: Parameters<typeof Query.List>[4];
|
|
10
|
+
filters?: Parameters<typeof Query.List>[5];
|
|
11
|
+
db?: Parameters<typeof Query.List>[6];
|
|
12
|
+
options?: Parameters<typeof Query.List>[7];
|
|
13
|
+
}
|
|
14
|
+
export declare function List<T extends Record<string, any>>(obj: any, meta: DataAPIMeta, request: Table<T>, reqCtx: RequestContext, { sorting, filters, db, options }: ListArguments): [sorted: Stream<T>, total: Datum<number>, deferredJoined: Set<string>];
|
|
15
|
+
export declare function ListPage(db: SchemaInstance<any>, meta: DataAPIMeta, query: Stream<any>, options: ListPageOptions): Stream<any>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** @internal @packageDocumentation */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.List = List;
|
|
5
|
+
exports.ListPage = ListPage;
|
|
6
|
+
const common_1 = require("@antelopejs/interface-database-decorators/common");
|
|
7
|
+
const common_2 = require("@antelopejs/interface-database-decorators/modifiers/common");
|
|
8
|
+
const metadata_1 = require("../metadata");
|
|
9
|
+
const computed_1 = require("./computed");
|
|
10
|
+
const deferred_joined_stream_1 = require("./deferred-joined-stream");
|
|
11
|
+
const foreign_1 = require("./foreign");
|
|
12
|
+
const joined_1 = require("./joined");
|
|
13
|
+
const validation_1 = require("./validation");
|
|
14
|
+
function listResultTuple(tmpRequest, total, meta, joinedSplit, { db, options }) {
|
|
15
|
+
const deferredJoined = (0, joined_1.deferredJoinedFields)(meta, joinedSplit);
|
|
16
|
+
if (options?.exposeDeferredJoined || !db || deferredJoined.size === 0) {
|
|
17
|
+
return [tmpRequest, total, deferredJoined];
|
|
18
|
+
}
|
|
19
|
+
return [
|
|
20
|
+
(0, deferred_joined_stream_1.wrapDeferredJoined)(db, meta, deferredJoined, tmpRequest),
|
|
21
|
+
total,
|
|
22
|
+
new Set(),
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
/** Where a list sorted on a modifier-held field keeps the value it sorts on. */
|
|
26
|
+
const MODIFIED_SORT_KEY = "__dataApiSortValue";
|
|
27
|
+
/**
|
|
28
|
+
* Whether a field is held by a modifier the controller keys (a localized
|
|
29
|
+
* field read in the request's locale): stored under the modifier, it sorts
|
|
30
|
+
* on the value the request reads, not on the stored field.
|
|
31
|
+
*/
|
|
32
|
+
function isHeldByKeyedModifier(meta, field) {
|
|
33
|
+
const keyed = new Set(Array.from(meta.modifierKeys.keys(), (modifier) => modifier.name));
|
|
34
|
+
return ((0, common_1.getMetadata)(meta.tableClass, common_2.ModifiersStaticMetadata).fields[field]?.some(({ id }) => keyed.has(id)) ?? false);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The rows {@link List} starts from: the index lookup serving the one field
|
|
38
|
+
* filtered once with `eq` on a single-field index, else the whole table.
|
|
39
|
+
*/
|
|
40
|
+
function indexedSource(meta, request, filterList, filters) {
|
|
41
|
+
const indexed = filterList.find(([field]) => {
|
|
42
|
+
const fieldFilters = filters ? (0, metadata_1.FilterValuesOf)(filters[field]) : [];
|
|
43
|
+
return (fieldFilters.length === 1 &&
|
|
44
|
+
fieldFilters[0][1] === "eq" &&
|
|
45
|
+
meta.fields[field]?.indexable);
|
|
46
|
+
})?.[0];
|
|
47
|
+
const indexName = indexed
|
|
48
|
+
? meta.fields[indexed].dbName || indexed
|
|
49
|
+
: undefined;
|
|
50
|
+
const equality = indexed
|
|
51
|
+
? (0, metadata_1.FilterValuesOf)(filters?.[indexed] ?? [])[0]
|
|
52
|
+
: undefined;
|
|
53
|
+
const source = indexName
|
|
54
|
+
? request.getAll(equality?.[0] ?? "", indexName)
|
|
55
|
+
: request;
|
|
56
|
+
return { indexFilter: indexed, source };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Merges the joined and computed fields the filters read, before
|
|
60
|
+
* {@link List} filters and counts.
|
|
61
|
+
*/
|
|
62
|
+
function materializeFilterFields(source, meta, db, joinedSplit, { filterList }) {
|
|
63
|
+
const joined = db && joinedSplit.filter.size > 0
|
|
64
|
+
? (0, joined_1.Joined)(db, meta, source, joinedSplit.filter)
|
|
65
|
+
: source;
|
|
66
|
+
const filteredComputed = new Set(filterList
|
|
67
|
+
.map(([field]) => field)
|
|
68
|
+
.filter((field) => meta.fields[field]?.computed));
|
|
69
|
+
const stream = db && filteredComputed.size > 0
|
|
70
|
+
? (0, computed_1.Computed)(db, meta, joined, filteredComputed)
|
|
71
|
+
: joined;
|
|
72
|
+
return { stream, filteredComputed };
|
|
73
|
+
}
|
|
74
|
+
/** The field a list request sorts on, how, and whether a modifier holds it. */
|
|
75
|
+
function sortPlan(meta, sorting) {
|
|
76
|
+
const sortField = sorting?.[0];
|
|
77
|
+
const shouldSort = sortField ? meta.fields[sortField]?.sortable : undefined;
|
|
78
|
+
const isModifiedSort = !!shouldSort && !!sortField && isHeldByKeyedModifier(meta, sortField);
|
|
79
|
+
return { sortField, shouldSort, isModifiedSort };
|
|
80
|
+
}
|
|
81
|
+
/** Sorts on an indexed field before the filters, when the plan allows it. */
|
|
82
|
+
function orderedByIndex(stream, { sortField, shouldSort, isModifiedSort }, sorting) {
|
|
83
|
+
if (shouldSort?.indexed && sortField && !isModifiedSort) {
|
|
84
|
+
return stream.orderBy(sortField, sorting?.[1] ?? "asc");
|
|
85
|
+
}
|
|
86
|
+
return stream;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Merges the joined fields the sort reads, then a computed sort field no
|
|
90
|
+
* filter already merged, after {@link List} counts.
|
|
91
|
+
*/
|
|
92
|
+
function materializeSortFields(stream, sortField, { db, meta, joinedSplit, filteredComputed }) {
|
|
93
|
+
if (!db)
|
|
94
|
+
return stream;
|
|
95
|
+
const joined = joinedSplit.sort.size > 0
|
|
96
|
+
? (0, joined_1.Joined)(db, meta, stream, joinedSplit.sort)
|
|
97
|
+
: stream;
|
|
98
|
+
const sortsOnComputed = !!sortField &&
|
|
99
|
+
!!meta.fields[sortField]?.computed &&
|
|
100
|
+
!filteredComputed.has(sortField);
|
|
101
|
+
return sortsOnComputed
|
|
102
|
+
? (0, computed_1.Computed)(db, meta, joined, new Set([sortField]))
|
|
103
|
+
: joined;
|
|
104
|
+
}
|
|
105
|
+
function List(obj, meta, request, reqCtx, { sorting, filters, db, options }) {
|
|
106
|
+
const filterList = Object.entries(meta.filters).filter(([name]) => filters && name in filters);
|
|
107
|
+
const { indexFilter, source } = indexedSource(meta, request, filterList, filters);
|
|
108
|
+
const joinedSplit = (0, joined_1.splitJoinedFields)(meta, sorting, filters);
|
|
109
|
+
const filtering = materializeFilterFields(source, meta, db, joinedSplit, {
|
|
110
|
+
filterList,
|
|
111
|
+
});
|
|
112
|
+
const plan = sortPlan(meta, sorting);
|
|
113
|
+
const { sortField, shouldSort, isModifiedSort } = plan;
|
|
114
|
+
let tmpRequest = orderedByIndex(filtering.stream, plan, sorting);
|
|
115
|
+
if (filterList.length > 0) {
|
|
116
|
+
tmpRequest = filterList.reduce((req, [name, filter]) => {
|
|
117
|
+
const fieldFilter = filters?.[name];
|
|
118
|
+
if (!fieldFilter || name === indexFilter)
|
|
119
|
+
return req;
|
|
120
|
+
return (0, metadata_1.FilterValuesOf)(fieldFilter).reduce((filtered, [value, mode]) => filtered.filter((row) => filter(Object.assign(reqCtx, { this: obj }), (0, validation_1.UnlockRequest)(obj, meta, row, name), name, value, mode, row.cast())), req);
|
|
121
|
+
}, tmpRequest);
|
|
122
|
+
}
|
|
123
|
+
const total = tmpRequest.count();
|
|
124
|
+
tmpRequest = materializeSortFields(tmpRequest, sortField, {
|
|
125
|
+
db,
|
|
126
|
+
meta,
|
|
127
|
+
joinedSplit,
|
|
128
|
+
filteredComputed: filtering.filteredComputed,
|
|
129
|
+
});
|
|
130
|
+
if (isModifiedSort && sortField) {
|
|
131
|
+
tmpRequest = tmpRequest
|
|
132
|
+
.cast()
|
|
133
|
+
.map((row) => row.merge({
|
|
134
|
+
[MODIFIED_SORT_KEY]: (0, validation_1.UnlockRequest)(obj, meta, row, sortField),
|
|
135
|
+
}))
|
|
136
|
+
.orderBy(MODIFIED_SORT_KEY, sorting?.[1] ?? "asc")
|
|
137
|
+
.without(MODIFIED_SORT_KEY)
|
|
138
|
+
.cast();
|
|
139
|
+
}
|
|
140
|
+
else if (shouldSort && !shouldSort.indexed && sortField) {
|
|
141
|
+
tmpRequest = tmpRequest.orderBy(sortField, sorting?.[1] ?? "asc");
|
|
142
|
+
}
|
|
143
|
+
return listResultTuple(tmpRequest, total, meta, joinedSplit, {
|
|
144
|
+
db,
|
|
145
|
+
options,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
function pageComputedFields(meta, options) {
|
|
149
|
+
const merged = new Set(Object.keys(options.filters ?? {}).filter((name) => name in meta.filters));
|
|
150
|
+
if (options.sortKey)
|
|
151
|
+
merged.add(options.sortKey);
|
|
152
|
+
const names = Object.entries(meta.fields)
|
|
153
|
+
.filter(([name, field]) => field.computed &&
|
|
154
|
+
!merged.has(name) &&
|
|
155
|
+
(!options.pluck || options.pluck.has(name)))
|
|
156
|
+
.map(([name]) => name);
|
|
157
|
+
return new Set(names);
|
|
158
|
+
}
|
|
159
|
+
function pageJoinedFields(options, materializeAll) {
|
|
160
|
+
const deferred = options.deferredJoined ?? new Set();
|
|
161
|
+
if (materializeAll || !options.pluck)
|
|
162
|
+
return deferred;
|
|
163
|
+
const pluck = options.pluck;
|
|
164
|
+
return new Set(Array.from(deferred).filter((name) => pluck.has(name)));
|
|
165
|
+
}
|
|
166
|
+
function ListPage(db, meta, query, options) {
|
|
167
|
+
let page = query.slice(options.offset, options.limit);
|
|
168
|
+
const computed = pageComputedFields(meta, options);
|
|
169
|
+
const joined = pageJoinedFields(options, computed.size > 0);
|
|
170
|
+
if (joined.size > 0)
|
|
171
|
+
page = (0, joined_1.Joined)(db, meta, page, joined);
|
|
172
|
+
if (computed.size > 0)
|
|
173
|
+
page = (0, computed_1.Computed)(db, meta, page, computed);
|
|
174
|
+
if (!options.noForeign)
|
|
175
|
+
page = (0, foreign_1.Foreign)(db, meta, page, options.pluck);
|
|
176
|
+
return options.pluck ? page.pluck("_internal", ...options.pluck) : page;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/internal/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** @internal @packageDocumentation */
|
|
2
|
+
import type { FieldData, ForeignJoinedRef } from "./field-types";
|
|
3
|
+
/** Copies into `dst` the entries of `src` it lacks. */
|
|
4
|
+
export declare function merge<Value>(src: Record<string, Value>, dst: Record<string, Value>): void;
|
|
5
|
+
/** Rebuilds the fields each list mode plucks from the fields' listable modes. */
|
|
6
|
+
export declare function rebuildPluck(pluck: Record<string, Set<string>>, fields: Record<string, FieldData>): void;
|
|
7
|
+
/**
|
|
8
|
+
* The `@Joined` fields of a relation target that `pluck` names, or all of
|
|
9
|
+
* them when `pluck` is unset; `undefined` when there are none.
|
|
10
|
+
*/
|
|
11
|
+
export declare function targetJoinedFields(fields: Record<string, FieldData>, pluck?: string[]): ForeignJoinedRef[] | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* The database fields a listable field selects: itself (`true`), none
|
|
14
|
+
* (`false`) or the given ones, plus the field and its local key when it is
|
|
15
|
+
* joined and selects any.
|
|
16
|
+
*/
|
|
17
|
+
export declare function listedNames(name: string, requiredFields: boolean | string[], field: FieldData): string[];
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** @internal @packageDocumentation */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.merge = merge;
|
|
5
|
+
exports.rebuildPluck = rebuildPluck;
|
|
6
|
+
exports.targetJoinedFields = targetJoinedFields;
|
|
7
|
+
exports.listedNames = listedNames;
|
|
8
|
+
/** Copies into `dst` the entries of `src` it lacks. */
|
|
9
|
+
function merge(src, dst) {
|
|
10
|
+
for (const key in src) {
|
|
11
|
+
if (!(key in dst)) {
|
|
12
|
+
dst[key] = src[key];
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** Rebuilds the fields each list mode plucks from the fields' listable modes. */
|
|
17
|
+
function rebuildPluck(pluck, fields) {
|
|
18
|
+
for (const set of Object.values(pluck)) {
|
|
19
|
+
set.clear();
|
|
20
|
+
}
|
|
21
|
+
for (const [_, field] of Object.entries(fields)) {
|
|
22
|
+
if (field.listable) {
|
|
23
|
+
for (const [mode, names] of Object.entries(field.listable)) {
|
|
24
|
+
if (!(mode in pluck)) {
|
|
25
|
+
pluck[mode] = new Set();
|
|
26
|
+
}
|
|
27
|
+
for (const name of names) {
|
|
28
|
+
pluck[mode].add(name);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The `@Joined` fields of a relation target that `pluck` names, or all of
|
|
36
|
+
* them when `pluck` is unset; `undefined` when there are none.
|
|
37
|
+
*/
|
|
38
|
+
function targetJoinedFields(fields, pluck) {
|
|
39
|
+
const pluckSet = pluck ? new Set(pluck) : undefined;
|
|
40
|
+
const groups = [];
|
|
41
|
+
for (const [fieldName, field] of Object.entries(fields)) {
|
|
42
|
+
if (!field.joined || (pluckSet && !pluckSet.has(fieldName))) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const j = field.joined;
|
|
46
|
+
groups.push({
|
|
47
|
+
name: fieldName,
|
|
48
|
+
table: j.table,
|
|
49
|
+
tableClass: j.tableClass,
|
|
50
|
+
localKey: j.localKey,
|
|
51
|
+
remoteField: j.remoteField,
|
|
52
|
+
remoteIndex: j.remoteIndex,
|
|
53
|
+
schemaName: j.schemaName,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return groups.length > 0 ? groups : undefined;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The database fields a listable field selects: itself (`true`), none
|
|
60
|
+
* (`false`) or the given ones, plus the field and its local key when it is
|
|
61
|
+
* joined and selects any.
|
|
62
|
+
*/
|
|
63
|
+
function listedNames(name, requiredFields, field) {
|
|
64
|
+
const baseNames = requiredFields === true
|
|
65
|
+
? [name]
|
|
66
|
+
: requiredFields === false
|
|
67
|
+
? []
|
|
68
|
+
: requiredFields;
|
|
69
|
+
return baseNames.length > 0 && field.joined
|
|
70
|
+
? Array.from(new Set([...baseNames, name, field.joined.localKey]))
|
|
71
|
+
: baseNames;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=meta-records.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta-records.js","sourceRoot":"","sources":["../../src/internal/meta-records.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** @internal @packageDocumentation */
|
|
2
|
+
import type { Query } from "../components";
|
|
3
|
+
import type { DataAPIMeta } from "../metadata";
|
|
4
|
+
export declare function WriteProperties(obj: any, meta: DataAPIMeta, bodyData: Parameters<typeof Query.WriteProperties>[2], action?: string, existingDBData?: Parameters<typeof Query.WriteProperties>[4]): Record<string, any>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** @internal @packageDocumentation */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.WriteProperties = WriteProperties;
|
|
5
|
+
function writableInBody(writable, bodyData) {
|
|
6
|
+
return {
|
|
7
|
+
props: writable.props.filter(([key]) => Object.hasOwn(bodyData, key)),
|
|
8
|
+
setters: writable.setters.filter(([key]) => Object.hasOwn(bodyData, key)),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function writeTargetDefaults(instance, meta, dbData) {
|
|
12
|
+
for (const [key, value] of Object.entries(new meta.target())) {
|
|
13
|
+
if (value !== undefined) {
|
|
14
|
+
instance[key] = value;
|
|
15
|
+
if (key in meta.fields) {
|
|
16
|
+
dbData[meta.fields[key].dbName || key] = value;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function WriteProperties(obj, meta, bodyData, action, existingDBData) {
|
|
22
|
+
const actionWritable = meta.writable[action ?? "_default"] ?? meta.writable._default;
|
|
23
|
+
const writable = existingDBData
|
|
24
|
+
? writableInBody(actionWritable, bodyData)
|
|
25
|
+
: actionWritable;
|
|
26
|
+
const instance = { ...obj };
|
|
27
|
+
const dbData = existingDBData || {};
|
|
28
|
+
Object.setPrototypeOf(dbData, meta.tableClass.prototype);
|
|
29
|
+
if (!existingDBData) {
|
|
30
|
+
writeTargetDefaults(instance, meta, dbData);
|
|
31
|
+
}
|
|
32
|
+
for (const [key, field] of writable.props) {
|
|
33
|
+
instance[key] = bodyData[key];
|
|
34
|
+
dbData[field.dbName || key] = bodyData[key];
|
|
35
|
+
}
|
|
36
|
+
instance.table = dbData;
|
|
37
|
+
Object.setPrototypeOf(instance, meta.target.prototype);
|
|
38
|
+
for (const [key, field] of writable.setters) {
|
|
39
|
+
field.desc?.set?.apply(instance, [bodyData[key]]);
|
|
40
|
+
}
|
|
41
|
+
return dbData;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=properties.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"properties.js","sourceRoot":"","sources":["../../src/internal/properties.ts"],"names":[],"mappings":";AAAA,sCAAsC;;AA8BtC,0CA6BC;AAtDD,SAAS,cAAc,CACrB,QAA8B,EAC9B,QAAqD;IAErD,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACrE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAqD,EACrD,IAAiB,EACjB,MAAuE;IAEvE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QAC7D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAC7B,GAAQ,EACR,IAAiB,EACjB,QAAqD,EACrD,MAAe,EACf,cAA4D;IAE5D,MAAM,cAAc,GAClB,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAChE,MAAM,QAAQ,GAAG,cAAc;QAC7B,CAAC,CAAC,cAAc,CAAC,cAAc,EAAE,QAAQ,CAAC;QAC1C,CAAC,CAAC,cAAc,CAAC;IACnB,MAAM,QAAQ,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;IAC5B,MAAM,MAAM,GACV,cAAc,IAAI,EAAE,CAAC;IACvB,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,mBAAmB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC1C,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;IACD,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** @internal @packageDocumentation */
|
|
2
|
+
import type { Class } from "@antelopejs/interface-core/decorators";
|
|
3
|
+
import { type Table } from "@antelopejs/interface-database-decorators";
|
|
4
|
+
interface ResolvedTableReference {
|
|
5
|
+
tableName: string;
|
|
6
|
+
tableClass?: Class<Table>;
|
|
7
|
+
/** `undefined` means same schema as the source DataAPI. */
|
|
8
|
+
schemaName?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function resolveTableReference(sourceSchemaName: string, table: string | Class<Table>, explicitSchema: string | undefined, contextLabel: string): ResolvedTableReference;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** @internal @packageDocumentation */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.resolveTableReference = resolveTableReference;
|
|
5
|
+
const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
|
|
6
|
+
const guards_1 = require("./guards");
|
|
7
|
+
function readTableMetadata(table) {
|
|
8
|
+
const meta = (0, interface_database_decorators_1.getMetadata)(table, interface_database_decorators_1.DatumStaticMetadata);
|
|
9
|
+
return { schemaName: meta?.schemaName, tableName: meta?.tableName };
|
|
10
|
+
}
|
|
11
|
+
function resolveTableReference(sourceSchemaName, table, explicitSchema, contextLabel) {
|
|
12
|
+
if (!(0, guards_1.isString)(table)) {
|
|
13
|
+
const inferred = readTableMetadata(table);
|
|
14
|
+
const schemaName = explicitSchema ?? inferred.schemaName;
|
|
15
|
+
const tableName = inferred.tableName;
|
|
16
|
+
if (!schemaName || !tableName) {
|
|
17
|
+
throw new Error(`Unable to infer table name/schema for ${contextLabel}: pass @RegisterTable on the table class`);
|
|
18
|
+
}
|
|
19
|
+
if (explicitSchema &&
|
|
20
|
+
inferred.schemaName &&
|
|
21
|
+
explicitSchema !== inferred.schemaName) {
|
|
22
|
+
throw new Error(`Schema mismatch for ${contextLabel}: class registers in "${inferred.schemaName}" but option specifies "${explicitSchema}"`);
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
tableName,
|
|
26
|
+
tableClass: table,
|
|
27
|
+
schemaName: schemaName === sourceSchemaName ? undefined : schemaName,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const targetSchema = explicitSchema ?? sourceSchemaName;
|
|
31
|
+
const databaseSchema = (0, interface_database_decorators_1.getTablesForSchema)(targetSchema);
|
|
32
|
+
if (!databaseSchema) {
|
|
33
|
+
throw new Error(`Schema "${targetSchema}" not found for ${contextLabel}`);
|
|
34
|
+
}
|
|
35
|
+
const tableClass = databaseSchema[table];
|
|
36
|
+
const isOtherSchema = targetSchema !== sourceSchemaName;
|
|
37
|
+
if (isOtherSchema && !tableClass) {
|
|
38
|
+
throw new Error(`Table "${table}" is not registered in schema "${targetSchema}" for ${contextLabel}: register its class with @RegisterTable before declaring the field`);
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
tableName: table,
|
|
42
|
+
tableClass,
|
|
43
|
+
schemaName: isOtherSchema ? targetSchema : undefined,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=table-reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-reference.js","sourceRoot":"","sources":["../../src/internal/table-reference.ts"],"names":[],"mappings":";AAAA,sCAAsC;;AAwBtC,sDAgDC;AArED,6FAKmD;AAEnD,qCAAoC;AASpC,SAAS,iBAAiB,CAAC,KAAmB;IAC5C,MAAM,IAAI,GAAG,IAAA,2CAAW,EAAC,KAAK,EAAE,mDAAmB,CAAC,CAAC;IACrD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AACtE,CAAC;AAED,SAAgB,qBAAqB,CACnC,gBAAwB,EACxB,KAA4B,EAC5B,cAAkC,EAClC,YAAoB;IAEpB,IAAI,CAAC,IAAA,iBAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,cAAc,IAAI,QAAQ,CAAC,UAAU,CAAC;QACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;QACrC,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,yCAAyC,YAAY,0CAA0C,CAChG,CAAC;QACJ,CAAC;QACD,IACE,cAAc;YACd,QAAQ,CAAC,UAAU;YACnB,cAAc,KAAK,QAAQ,CAAC,UAAU,EACtC,CAAC;YACD,MAAM,IAAI,KAAK,CACb,uBAAuB,YAAY,yBAAyB,QAAQ,CAAC,UAAU,2BAA2B,cAAc,GAAG,CAC5H,CAAC;QACJ,CAAC;QACD,OAAO;YACL,SAAS;YACT,UAAU,EAAE,KAAK;YACjB,UAAU,EAAE,UAAU,KAAK,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;SACrE,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,cAAc,IAAI,gBAAgB,CAAC;IACxD,MAAM,cAAc,GAAG,IAAA,kDAAkB,EAAC,YAAY,CAAC,CAAC;IACxD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,WAAW,YAAY,mBAAmB,YAAY,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,YAAY,KAAK,gBAAgB,CAAC;IACxD,IAAI,aAAa,IAAI,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,UAAU,KAAK,kCAAkC,YAAY,SAAS,YAAY,qEAAqE,CACxJ,CAAC;IACJ,CAAC;IACD,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,UAAU;QACV,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;KACrD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** @internal @packageDocumentation */
|
|
2
|
+
import type { Constructible } from "@antelopejs/interface-database-decorators/common";
|
|
3
|
+
import type { SchemaInstance, Table, ValueProxy } from "@antelopejs/interface-database";
|
|
4
|
+
import type { ComputedFieldData } from "../metadata";
|
|
5
|
+
export type TableRow = Parameters<ComputedFieldData["expr"]>[0];
|
|
6
|
+
export interface TableTargetReference {
|
|
7
|
+
table: string;
|
|
8
|
+
tableClass?: Constructible;
|
|
9
|
+
schemaName?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function targetTable(sourceDb: SchemaInstance<any>, target: TableTargetReference): Table<any>;
|
|
12
|
+
/**
|
|
13
|
+
* The lookup side of a relation: `table` reduced to `fields`, with the
|
|
14
|
+
* internal fields the modifiers keep. A plucked table is a staged selection
|
|
15
|
+
* the database accepts wherever it takes a table, but its type is a stream.
|
|
16
|
+
*/
|
|
17
|
+
export declare function pluckedTable(table: Table<any>, ...fields: string[]): Table<any>;
|
|
18
|
+
export declare function Get(table: Table<any>, id: string | ValueProxy<string>, index?: string): import("@antelopejs/interface-database").Datum<any>;
|