breeze-client 2.2.1 → 3.0.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/LICENSE +1 -1
- package/README.md +83 -63
- package/adapters/abstract-data-service-adapter.d.ts +120 -0
- package/adapters/abstract-data-service-adapter.js +395 -0
- package/adapters/abstract-data-service-adapter.js.map +1 -0
- package/adapters/adapter-ajax-fetch.d.ts +12 -0
- package/adapters/adapter-ajax-fetch.js +13 -0
- package/adapters/adapter-ajax-fetch.js.map +1 -0
- package/{adapter-ajax-post → adapters}/adapter-ajax-post.d.ts +40 -36
- package/{fesm2022/breeze-client-adapter-ajax-post.mjs → adapters/adapter-ajax-post.js} +80 -82
- package/adapters/adapter-ajax-post.js.map +1 -0
- package/{adapter-ajax-fetch → adapters}/adapter-core.d.ts +4 -4
- package/{fesm2022/breeze-client-adapter-uri-builder-json.mjs → adapters/adapter-core.js} +48 -91
- package/adapters/adapter-core.js.map +1 -0
- package/adapters/adapter-data-service-webapi.d.ts +9 -0
- package/{fesm2022/breeze-client-adapter-data-service-webapi.mjs → adapters/adapter-data-service-webapi.js} +105 -107
- package/adapters/adapter-data-service-webapi.js.map +1 -0
- package/adapters/adapter-model-library-backing-store.d.ts +32 -0
- package/adapters/adapter-model-library-backing-store.js +321 -0
- package/adapters/adapter-model-library-backing-store.js.map +1 -0
- package/adapters/adapter-uri-builder-json.d.ts +11 -0
- package/adapters/adapter-uri-builder-json.js +40 -0
- package/adapters/adapter-uri-builder-json.js.map +1 -0
- package/adapters/http.d.ts +52 -0
- package/adapters/http.js +202 -0
- package/adapters/http.js.map +1 -0
- package/angular/adapter-angular-httpclient.d.ts +21 -0
- package/angular/adapter-angular-httpclient.js +70 -0
- package/angular/adapter-angular-httpclient.js.map +1 -0
- package/breeze.d.ts +215 -0
- package/breeze.js +141 -0
- package/breeze.js.map +1 -0
- package/config/config.d.ts +212 -0
- package/config/config.js +392 -0
- package/config/config.js.map +1 -0
- package/config/configure.d.ts +66 -0
- package/config/configure.js +46 -0
- package/config/configure.js.map +1 -0
- package/config/default-adapters.d.ts +1 -0
- package/config/default-adapters.js +40 -0
- package/config/default-adapters.js.map +1 -0
- package/config/interface-registry.d.ts +191 -0
- package/config/interface-registry.js +5 -0
- package/config/interface-registry.js.map +1 -0
- package/{src → core}/assert-param.d.ts +52 -60
- package/core/assert-param.js +390 -0
- package/core/assert-param.js.map +1 -0
- package/core/core.d.ts +285 -0
- package/core/core.js +772 -0
- package/core/core.js.map +1 -0
- package/core/enum.d.ts +116 -0
- package/core/enum.js +167 -0
- package/core/enum.js.map +1 -0
- package/core/event.d.ts +169 -0
- package/core/event.js +338 -0
- package/core/event.js.map +1 -0
- package/entity/array.d.ts +3 -0
- package/entity/array.js +4 -0
- package/entity/array.js.map +1 -0
- package/entity/complex-array.d.ts +17 -0
- package/entity/complex-array.js +104 -0
- package/entity/complex-array.js.map +1 -0
- package/entity/default-property-interceptor.d.ts +1 -0
- package/entity/default-property-interceptor.js +496 -0
- package/entity/default-property-interceptor.js.map +1 -0
- package/{src → entity}/entity-action.d.ts +36 -42
- package/entity/entity-action.js +45 -0
- package/entity/entity-action.js.map +1 -0
- package/entity/entity-aspect.d.ts +457 -0
- package/entity/entity-aspect.js +1262 -0
- package/entity/entity-aspect.js.map +1 -0
- package/entity/entity-base.d.ts +55 -0
- package/entity/entity-base.js +41 -0
- package/entity/entity-base.js.map +1 -0
- package/entity/entity-group.d.ts +1 -0
- package/entity/entity-group.js +224 -0
- package/entity/entity-group.js.map +1 -0
- package/entity/entity-key.d.ts +95 -0
- package/entity/entity-key.js +189 -0
- package/entity/entity-key.js.map +1 -0
- package/{src → entity}/entity-state.d.ts +112 -84
- package/entity/entity-state.js +135 -0
- package/entity/entity-state.js.map +1 -0
- package/entity/key-generator.d.ts +57 -0
- package/entity/key-generator.js +155 -0
- package/entity/key-generator.js.map +1 -0
- package/entity/observable-array.d.ts +25 -0
- package/entity/observable-array.js +230 -0
- package/entity/observable-array.js.map +1 -0
- package/entity/primitive-array.d.ts +12 -0
- package/entity/primitive-array.js +71 -0
- package/entity/primitive-array.js.map +1 -0
- package/entity/relation-array.d.ts +24 -0
- package/entity/relation-array.js +176 -0
- package/entity/relation-array.js.map +1 -0
- package/entity/unattached-children-map.d.ts +1 -0
- package/entity/unattached-children-map.js +105 -0
- package/entity/unattached-children-map.js.map +1 -0
- package/generate-entity-classes.js +1176 -0
- package/manager/entity-manager.d.ts +801 -0
- package/manager/entity-manager.js +2395 -0
- package/manager/entity-manager.js.map +1 -0
- package/{src → manager}/save-options.d.ts +48 -42
- package/manager/save-options.js +51 -0
- package/manager/save-options.js.map +1 -0
- package/{src → metadata}/data-service.d.ts +229 -184
- package/metadata/data-service.js +246 -0
- package/metadata/data-service.js.map +1 -0
- package/metadata/data-type.d.ts +122 -0
- package/metadata/data-type.js +465 -0
- package/metadata/data-type.js.map +1 -0
- package/metadata/entity-metadata.d.ts +1193 -0
- package/metadata/entity-metadata.js +2502 -0
- package/metadata/entity-metadata.js.map +1 -0
- package/{src → metadata}/local-query-comparison-options.d.ts +65 -59
- package/metadata/local-query-comparison-options.js +69 -0
- package/metadata/local-query-comparison-options.js.map +1 -0
- package/{src → metadata}/naming-convention.d.ts +75 -72
- package/metadata/naming-convention.js +97 -0
- package/metadata/naming-convention.js.map +1 -0
- package/mixins/mixin-get-entity-graph.d.ts +63 -0
- package/{fesm2022/breeze-client-mixin-get-entity-graph.mjs → mixins/mixin-get-entity-graph.js} +331 -253
- package/mixins/mixin-get-entity-graph.js.map +1 -0
- package/mixins/mixin-save-queuing.d.ts +98 -0
- package/{fesm2022/breeze-client-mixin-save-queuing.mjs → mixins/mixin-save-queuing.js} +493 -365
- package/mixins/mixin-save-queuing.js.map +1 -0
- package/package.json +62 -93
- package/query/entity-query.d.ts +521 -0
- package/query/entity-query.js +1149 -0
- package/query/entity-query.js.map +1 -0
- package/{src → query}/mapping-context.d.ts +44 -46
- package/query/mapping-context.js +412 -0
- package/query/mapping-context.js.map +1 -0
- package/query/predicate.d.ts +394 -0
- package/query/predicate.js +1294 -0
- package/query/predicate.js.map +1 -0
- package/query/property-path.d.ts +252 -0
- package/query/property-path.js +2 -0
- package/query/property-path.js.map +1 -0
- package/{src → query}/query-options.d.ts +143 -119
- package/query/query-options.js +180 -0
- package/query/query-options.js.map +1 -0
- package/rxjs/breeze-rxjs.d.ts +72 -0
- package/rxjs/breeze-rxjs.js +117 -0
- package/rxjs/breeze-rxjs.js.map +1 -0
- package/validation/validate.d.ts +583 -0
- package/validation/validate.js +961 -0
- package/validation/validate.js.map +1 -0
- package/{src → validation}/validation-options.d.ts +67 -63
- package/validation/validation-options.js +70 -0
- package/validation/validation-options.js.map +1 -0
- package/adapter-ajax-angularjs/adapter-ajax-angularjs.d.ts +0 -17
- package/adapter-ajax-angularjs/adapter-core.d.ts +0 -4
- package/adapter-ajax-angularjs/index.d.ts +0 -5
- package/adapter-ajax-fetch/adapter-ajax-fetch.d.ts +0 -18
- package/adapter-ajax-fetch/index.d.ts +0 -5
- package/adapter-ajax-httpclient/adapter-ajax-httpclient.d.ts +0 -13
- package/adapter-ajax-httpclient/adapter-core.d.ts +0 -4
- package/adapter-ajax-httpclient/index.d.ts +0 -5
- package/adapter-ajax-jquery/adapter-ajax-jquery.d.ts +0 -15
- package/adapter-ajax-jquery/index.d.ts +0 -5
- package/adapter-ajax-post/index.d.ts +0 -5
- package/adapter-data-service-odata/adapter-core.d.ts +0 -4
- package/adapter-data-service-odata/adapter-data-service-odata.d.ts +0 -17
- package/adapter-data-service-odata/index.d.ts +0 -5
- package/adapter-data-service-webapi/adapter-data-service-webapi.d.ts +0 -15
- package/adapter-data-service-webapi/index.d.ts +0 -5
- package/adapter-model-library-backing-store/adapter-model-library-backing-store.d.ts +0 -10
- package/adapter-model-library-backing-store/index.d.ts +0 -5
- package/adapter-model-library-ko/adapter-model-library-ko.d.ts +0 -10
- package/adapter-model-library-ko/index.d.ts +0 -5
- package/adapter-uri-builder-json/adapter-core.d.ts +0 -4
- package/adapter-uri-builder-json/adapter-uri-builder-json.d.ts +0 -8
- package/adapter-uri-builder-json/index.d.ts +0 -5
- package/adapter-uri-builder-odata/adapter-core.d.ts +0 -4
- package/adapter-uri-builder-odata/adapter-uri-builder-odata.d.ts +0 -8
- package/adapter-uri-builder-odata/index.d.ts +0 -5
- package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +0 -135
- package/esm2022/adapter-ajax-angularjs/adapter-core.mjs +0 -49
- package/esm2022/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +0 -5
- package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +0 -135
- package/esm2022/adapter-ajax-fetch/adapter-core.mjs +0 -49
- package/esm2022/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +0 -5
- package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +0 -139
- package/esm2022/adapter-ajax-httpclient/adapter-core.mjs +0 -49
- package/esm2022/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +0 -5
- package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +0 -107
- package/esm2022/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +0 -5
- package/esm2022/adapter-ajax-post/adapter-ajax-post.mjs +0 -77
- package/esm2022/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +0 -5
- package/esm2022/adapter-data-service-odata/adapter-core.mjs +0 -49
- package/esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs +0 -461
- package/esm2022/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +0 -5
- package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +0 -100
- package/esm2022/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +0 -5
- package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +0 -269
- package/esm2022/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +0 -5
- package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +0 -241
- package/esm2022/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +0 -5
- package/esm2022/adapter-uri-builder-json/adapter-core.mjs +0 -49
- package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +0 -37
- package/esm2022/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +0 -5
- package/esm2022/adapter-uri-builder-odata/adapter-core.mjs +0 -49
- package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +0 -191
- package/esm2022/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +0 -5
- package/esm2022/breeze-client.mjs +0 -5
- package/esm2022/index.mjs +0 -2
- package/esm2022/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +0 -5
- package/esm2022/mixin-get-entity-graph/mixin-get-entity-graph.mjs +0 -269
- package/esm2022/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +0 -5
- package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +0 -421
- package/esm2022/src/abstract-data-service-adapter.mjs +0 -325
- package/esm2022/src/array.mjs +0 -4
- package/esm2022/src/assert-param.mjs +0 -330
- package/esm2022/src/breeze.mjs +0 -85
- package/esm2022/src/complex-array.mjs +0 -117
- package/esm2022/src/config.mjs +0 -232
- package/esm2022/src/core.mjs +0 -712
- package/esm2022/src/csdl-metadata-parser.mjs +0 -385
- package/esm2022/src/data-service.mjs +0 -221
- package/esm2022/src/data-type.mjs +0 -510
- package/esm2022/src/default-property-interceptor.mjs +0 -460
- package/esm2022/src/entity-action.mjs +0 -45
- package/esm2022/src/entity-aspect.mjs +0 -897
- package/esm2022/src/entity-group.mjs +0 -192
- package/esm2022/src/entity-key.mjs +0 -125
- package/esm2022/src/entity-manager.mjs +0 -2163
- package/esm2022/src/entity-metadata.mjs +0 -2242
- package/esm2022/src/entity-query.mjs +0 -1024
- package/esm2022/src/entity-state.mjs +0 -107
- package/esm2022/src/enum.mjs +0 -143
- package/esm2022/src/event.mjs +0 -264
- package/esm2022/src/interface-registry.mjs +0 -39
- package/esm2022/src/key-generator.mjs +0 -110
- package/esm2022/src/local-query-comparison-options.mjs +0 -65
- package/esm2022/src/mapping-context.mjs +0 -411
- package/esm2022/src/naming-convention.mjs +0 -92
- package/esm2022/src/observable-array.mjs +0 -183
- package/esm2022/src/predicate.mjs +0 -1259
- package/esm2022/src/primitive-array.mjs +0 -85
- package/esm2022/src/query-options.mjs +0 -152
- package/esm2022/src/relation-array.mjs +0 -173
- package/esm2022/src/save-options.mjs +0 -41
- package/esm2022/src/unattached-children-map.mjs +0 -56
- package/esm2022/src/validate.mjs +0 -995
- package/esm2022/src/validation-options.mjs +0 -64
- package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs +0 -190
- package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-fetch.mjs +0 -190
- package/fesm2022/breeze-client-adapter-ajax-fetch.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs +0 -194
- package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-jquery.mjs +0 -114
- package/fesm2022/breeze-client-adapter-ajax-jquery.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-post.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-data-service-odata.mjs +0 -516
- package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs +0 -276
- package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-model-library-ko.mjs +0 -248
- package/fesm2022/breeze-client-adapter-model-library-ko.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-uri-builder-json.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs +0 -246
- package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs.map +0 -1
- package/fesm2022/breeze-client-mixin-get-entity-graph.mjs.map +0 -1
- package/fesm2022/breeze-client-mixin-save-queuing.mjs.map +0 -1
- package/fesm2022/breeze-client.mjs +0 -14144
- package/fesm2022/breeze-client.mjs.map +0 -1
- package/index.d.ts +0 -1
- package/mixin-get-entity-graph/index.d.ts +0 -5
- package/mixin-get-entity-graph/mixin-get-entity-graph.d.ts +0 -31
- package/mixin-save-queuing/index.d.ts +0 -5
- package/mixin-save-queuing/mixin-save-queuing.d.ts +0 -32
- package/src/abstract-data-service-adapter.d.ts +0 -84
- package/src/array.d.ts +0 -3
- package/src/breeze.d.ts +0 -139
- package/src/complex-array.d.ts +0 -13
- package/src/config.d.ts +0 -104
- package/src/core.d.ts +0 -164
- package/src/csdl-metadata-parser.d.ts +0 -7
- package/src/data-type.d.ts +0 -89
- package/src/default-property-interceptor.d.ts +0 -4
- package/src/entity-aspect.d.ts +0 -332
- package/src/entity-group.d.ts +0 -28
- package/src/entity-key.d.ts +0 -77
- package/src/entity-manager.d.ts +0 -680
- package/src/entity-metadata.d.ts +0 -988
- package/src/entity-query.d.ts +0 -444
- package/src/enum.d.ts +0 -100
- package/src/event.d.ts +0 -142
- package/src/interface-registry.d.ts +0 -150
- package/src/key-generator.d.ts +0 -12
- package/src/observable-array.d.ts +0 -52
- package/src/predicate.d.ts +0 -376
- package/src/primitive-array.d.ts +0 -7
- package/src/relation-array.d.ts +0 -18
- package/src/unattached-children-map.d.ts +0 -19
- package/src/validate.d.ts +0 -650
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ObservableArray } from './observable-array.js';
|
|
2
|
+
import type { Entity, QueriedAs } from './entity-aspect.js';
|
|
3
|
+
import type { QueryErrorCallback, QueryResult, QuerySuccessCallback } from '../manager/entity-manager.js';
|
|
4
|
+
import type { DataProperty, NavigationProperty } from '../metadata/entity-metadata.js';
|
|
5
|
+
/** The value of a collection navigation property, such as `customer.orders`. It is a real array:
|
|
6
|
+
adding an entity sets the entity's inverse navigation property (or foreign key) to point at the
|
|
7
|
+
parent, attaching it to the parent's manager if it is detached, and removing one sets its inverse
|
|
8
|
+
navigation property to null. Changes raise the array's `arrayChanged` event with an {@link ArrayChangedArgs}. */
|
|
9
|
+
export interface RelationArray<T extends Entity = Entity> extends ObservableArray<T> {
|
|
10
|
+
/** The entity whose navigation property holds this array. */
|
|
11
|
+
parentEntity: Entity;
|
|
12
|
+
/** Not set on a relation array: always undefined. Use `navigationProperty`. */
|
|
13
|
+
parentProperty?: DataProperty;
|
|
14
|
+
/** The {@link NavigationProperty} of `parentEntity` that holds this array. */
|
|
15
|
+
navigationProperty: NavigationProperty;
|
|
16
|
+
load(): Promise<QueryResult<QueriedAs<T>>>;
|
|
17
|
+
/** @deprecated Await the returned promise instead of passing callbacks. */
|
|
18
|
+
load(querySuccessCallback?: QuerySuccessCallback, queryErrorCallback?: QueryErrorCallback): Promise<QueryResult<QueriedAs<T>>>;
|
|
19
|
+
}
|
|
20
|
+
/** For use by breeze plugin authors only. The class is for use in building a {@link ModelLibraryAdapter} implementation.
|
|
21
|
+
@adapter (see {@link ModelLibraryAdapter})
|
|
22
|
+
@hidden
|
|
23
|
+
*/
|
|
24
|
+
export declare function makeRelationArray(arr: any[], parentEntity: Entity, navigationProperty: NavigationProperty): RelationArray;
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { BreezeEvent } from '../core/event.js';
|
|
2
|
+
import { observableArray } from './observable-array.js';
|
|
3
|
+
import { EntityState } from './entity-state.js';
|
|
4
|
+
import { EntityQuery } from '../query/entity-query.js';
|
|
5
|
+
/*
|
|
6
|
+
Relation arrays are not a class: they are real arrays whose mutating methods are replaced, so that
|
|
7
|
+
changing one updates both ends of the relationship. A relation array is a collection of entities
|
|
8
|
+
associated with a navigation property on a single entity, i.e. customer.orders or
|
|
9
|
+
order.orderDetails.
|
|
10
|
+
@class {relationArray}
|
|
11
|
+
*/
|
|
12
|
+
/*
|
|
13
|
+
An {@link BreezeEvent} that fires whenever the contents of this array changed. This event
|
|
14
|
+
is fired any time a new entity is attached or added to the EntityManager and happens to belong to this collection.
|
|
15
|
+
Adds that occur as a result of query or import operations are batched so that all of the adds or removes to any individual
|
|
16
|
+
collections are collected into a single notification event for each relation array.
|
|
17
|
+
@example
|
|
18
|
+
// assume order is an order entity attached to an EntityManager.
|
|
19
|
+
orders.arrayChanged.subscribe(
|
|
20
|
+
function (arrayChangedArgs) {
|
|
21
|
+
let addedEntities = arrayChangedArgs.added;
|
|
22
|
+
let removedEntities = arrayChanged.removed;
|
|
23
|
+
});
|
|
24
|
+
@event arrayChanged
|
|
25
|
+
@param added {Array of Entity} An array of all of the entities added to this collection.
|
|
26
|
+
@param removed {Array of Entity} An array of all of the removed from this collection.
|
|
27
|
+
@readOnly
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
Performs an asynchronous load of all other the entities associated with this relationArray.
|
|
31
|
+
@example
|
|
32
|
+
// assume orders is an empty, as yet unpopulated, relation array of orders
|
|
33
|
+
// associated with a specific customer.
|
|
34
|
+
orders.load().then(...)
|
|
35
|
+
The callback arguments are deprecated. They still work, but the promise is the supported
|
|
36
|
+
form and they will be removed in a future major version.
|
|
37
|
+
@param [callback] {Function} Deprecated.
|
|
38
|
+
@param [errorCallback] {Function} Deprecated.
|
|
39
|
+
@returns {Promise}
|
|
40
|
+
*/
|
|
41
|
+
function load(callback, errorCallback) {
|
|
42
|
+
const parent = this.parentEntity;
|
|
43
|
+
const query = EntityQuery.fromEntityNavigation(this.parentEntity, this.navigationProperty);
|
|
44
|
+
const em = parent.entityAspect.entityManager;
|
|
45
|
+
return em.executeQuery(query, callback, errorCallback);
|
|
46
|
+
}
|
|
47
|
+
const relationArrayOps = {
|
|
48
|
+
getGoodAdds: function (arr, adds) {
|
|
49
|
+
return getGoodAdds(arr, adds);
|
|
50
|
+
},
|
|
51
|
+
beforeChange: function (arr) {
|
|
52
|
+
// a relation array does not change the state of the entity that owns it
|
|
53
|
+
},
|
|
54
|
+
processAdds: function (arr, adds) {
|
|
55
|
+
processAdds(arr, adds);
|
|
56
|
+
},
|
|
57
|
+
processRemoves: function (arr, removes) {
|
|
58
|
+
processRemoves(arr, removes);
|
|
59
|
+
},
|
|
60
|
+
getEventParent: function (arr) {
|
|
61
|
+
return arr.parentEntity.entityAspect;
|
|
62
|
+
},
|
|
63
|
+
getPendingPubs: function (arr) {
|
|
64
|
+
const em = arr.parentEntity.entityAspect.entityManager;
|
|
65
|
+
return em && em._pendingPubs;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
function getGoodAdds(relationArray, adds) {
|
|
69
|
+
let goodAdds = checkForDups(relationArray, adds);
|
|
70
|
+
if (!goodAdds.length) {
|
|
71
|
+
return goodAdds;
|
|
72
|
+
}
|
|
73
|
+
let parentEntity = relationArray.parentEntity;
|
|
74
|
+
let entityManager = parentEntity.entityAspect.entityManager;
|
|
75
|
+
// we do not want to attach an entity during loading
|
|
76
|
+
// because these will all be 'attached' at a later step.
|
|
77
|
+
if (entityManager && !entityManager.isLoading) {
|
|
78
|
+
goodAdds.forEach(function (add) {
|
|
79
|
+
if (add.entityAspect.entityState.isDetached()) {
|
|
80
|
+
relationArray._obs.inProgress = true;
|
|
81
|
+
try {
|
|
82
|
+
entityManager.attachEntity(add, EntityState.Added);
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
relationArray._obs.inProgress = false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return goodAdds;
|
|
91
|
+
}
|
|
92
|
+
function processAdds(relationArray, adds) {
|
|
93
|
+
let parentEntity = relationArray.parentEntity;
|
|
94
|
+
let np = relationArray.navigationProperty;
|
|
95
|
+
let addsInProcess = relationArray._obs.addsInProcess;
|
|
96
|
+
let invNp = np.inverse;
|
|
97
|
+
let startIx = addsInProcess.length;
|
|
98
|
+
try {
|
|
99
|
+
adds.forEach(function (childEntity) {
|
|
100
|
+
addsInProcess.push(childEntity);
|
|
101
|
+
if (invNp) {
|
|
102
|
+
childEntity.setProperty(invNp.name, parentEntity);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// This occurs with a unidirectional 1-n navigation - in this case
|
|
106
|
+
// we need to update the fks instead of the navProp
|
|
107
|
+
let pks = parentEntity.entityType.keyProperties;
|
|
108
|
+
np.invForeignKeyNames.forEach(function (fk, i) {
|
|
109
|
+
childEntity.setProperty(fk, parentEntity.getProperty(pks[i].name));
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
addsInProcess.splice(startIx, adds.length);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function processRemoves(relationArray, removes) {
|
|
119
|
+
let inp = relationArray.navigationProperty.inverse;
|
|
120
|
+
if (inp) {
|
|
121
|
+
removes.forEach(function (childEntity) {
|
|
122
|
+
childEntity.setProperty(inp.name, null);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function checkForDups(relationArray, adds) {
|
|
127
|
+
// don't allow dups in this array. - also prevents recursion
|
|
128
|
+
let parentEntity = relationArray.parentEntity;
|
|
129
|
+
let navProp = relationArray.navigationProperty;
|
|
130
|
+
let inverseProp = navProp.inverse;
|
|
131
|
+
let addsInProcess = relationArray._obs.addsInProcess;
|
|
132
|
+
let goodAdds;
|
|
133
|
+
if (inverseProp) {
|
|
134
|
+
goodAdds = adds.filter(function (a) {
|
|
135
|
+
if (addsInProcess.indexOf(a) >= 0) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
let inverseValue = a.getProperty(inverseProp.name);
|
|
139
|
+
return inverseValue !== parentEntity;
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// This occurs with a unidirectional 1->N relation ( where there is no n -> 1)
|
|
144
|
+
// in this case we compare fks.
|
|
145
|
+
let fkPropNames = navProp.invForeignKeyNames;
|
|
146
|
+
let keyProps = parentEntity.entityType.keyProperties;
|
|
147
|
+
goodAdds = adds.filter(function (a) {
|
|
148
|
+
if (addsInProcess.indexOf(a) >= 0) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
return fkPropNames.some(function (fk, i) {
|
|
152
|
+
let keyProp = keyProps[i].name;
|
|
153
|
+
let keyVal = parentEntity.getProperty(keyProp);
|
|
154
|
+
let fkVal = a.getProperty(fk);
|
|
155
|
+
return keyVal !== fkVal;
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
return goodAdds;
|
|
160
|
+
}
|
|
161
|
+
/** For use by breeze plugin authors only. The class is for use in building a {@link ModelLibraryAdapter} implementation.
|
|
162
|
+
@adapter (see {@link ModelLibraryAdapter})
|
|
163
|
+
@hidden
|
|
164
|
+
*/
|
|
165
|
+
export function makeRelationArray(arr, parentEntity, navigationProperty) {
|
|
166
|
+
const arrX = arr;
|
|
167
|
+
arrX.parentEntity = parentEntity;
|
|
168
|
+
arrX.navigationProperty = navigationProperty;
|
|
169
|
+
arrX.arrayChanged = new BreezeEvent("arrayChanged", arrX);
|
|
170
|
+
arrX.load = load;
|
|
171
|
+
// addsInProcess: the pushes currently being processed on this array, which is what stops the
|
|
172
|
+
// relationship fixup from recursing back into it.
|
|
173
|
+
observableArray.initialize(arrX, relationArrayOps, { addsInProcess: [] });
|
|
174
|
+
return arrX;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=relation-array.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-array.js","sourceRoot":"","sources":["../../src/entity/relation-array.ts"],"names":[],"mappings":"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","sourcesContent":["import { BreezeEvent } from '../core/event.js';\r\nimport { ObservableArray, ObservableArrayOps, observableArray } from './observable-array.js';\r\nimport { EntityState } from './entity-state.js';\r\nimport { EntityQuery } from '../query/entity-query.js';\r\nimport type { Entity, QueriedAs } from './entity-aspect.js';\r\nimport type { QueryErrorCallback, QueryResult, QuerySuccessCallback } from '../manager/entity-manager.js';\r\nimport type { DataProperty, NavigationProperty } from '../metadata/entity-metadata.js';\r\n\r\n/** The value of a collection navigation property, such as `customer.orders`. It is a real array:\r\nadding an entity sets the entity's inverse navigation property (or foreign key) to point at the\r\nparent, attaching it to the parent's manager if it is detached, and removing one sets its inverse\r\nnavigation property to null. Changes raise the array's `arrayChanged` event with an {@link ArrayChangedArgs}. */\r\nexport interface RelationArray<T extends Entity = Entity> extends ObservableArray<T> {\r\n /** The entity whose navigation property holds this array. */\r\n parentEntity: Entity;\r\n /** Not set on a relation array: always undefined. Use `navigationProperty`. */\r\n parentProperty?: DataProperty;\r\n /** The {@link NavigationProperty} of `parentEntity` that holds this array. */\r\n navigationProperty: NavigationProperty;\r\n load(): Promise<QueryResult<QueriedAs<T>>>;\r\n /** @deprecated Await the returned promise instead of passing callbacks. */\r\n load(querySuccessCallback?: QuerySuccessCallback, queryErrorCallback?: QueryErrorCallback): Promise<QueryResult<QueriedAs<T>>>;\r\n}\r\n\r\n/*\r\n Relation arrays are not a class: they are real arrays whose mutating methods are replaced, so that\r\n changing one updates both ends of the relationship. A relation array is a collection of entities\r\n associated with a navigation property on a single entity, i.e. customer.orders or\r\n order.orderDetails.\r\n @class {relationArray}\r\n */\r\n\r\n/*\r\nAn {@link BreezeEvent} that fires whenever the contents of this array changed. This event\r\nis fired any time a new entity is attached or added to the EntityManager and happens to belong to this collection.\r\nAdds that occur as a result of query or import operations are batched so that all of the adds or removes to any individual\r\ncollections are collected into a single notification event for each relation array.\r\n@example\r\n // assume order is an order entity attached to an EntityManager.\r\n orders.arrayChanged.subscribe(\r\n function (arrayChangedArgs) {\r\n let addedEntities = arrayChangedArgs.added;\r\n let removedEntities = arrayChanged.removed;\r\n });\r\n@event arrayChanged\r\n@param added {Array of Entity} An array of all of the entities added to this collection.\r\n@param removed {Array of Entity} An array of all of the removed from this collection.\r\n@readOnly\r\n*/\r\n\r\n/**\r\nPerforms an asynchronous load of all other the entities associated with this relationArray.\r\n@example\r\n // assume orders is an empty, as yet unpopulated, relation array of orders\r\n // associated with a specific customer.\r\n orders.load().then(...)\r\nThe callback arguments are deprecated. They still work, but the promise is the supported\r\nform and they will be removed in a future major version.\r\n@param [callback] {Function} Deprecated.\r\n@param [errorCallback] {Function} Deprecated.\r\n@returns {Promise}\r\n*/\r\nfunction load(this: RelationArray, callback?: QuerySuccessCallback, errorCallback?: QueryErrorCallback): Promise<QueryResult> {\r\n const parent = this.parentEntity;\r\n const query = EntityQuery.fromEntityNavigation(this.parentEntity, this.navigationProperty);\r\n const em = parent.entityAspect.entityManager!;\r\n return em.executeQuery(query, callback, errorCallback);\r\n}\r\n\r\nconst relationArrayOps: ObservableArrayOps = {\r\n\r\n getGoodAdds: function (arr: RelationArray, adds: Entity[]) {\r\n return getGoodAdds(arr, adds);\r\n },\r\n\r\n beforeChange: function (arr: RelationArray) {\r\n // a relation array does not change the state of the entity that owns it\r\n },\r\n\r\n processAdds: function (arr: RelationArray, adds: Entity[]) {\r\n processAdds(arr, adds);\r\n },\r\n\r\n processRemoves: function (arr: RelationArray, removes: Entity[]) {\r\n processRemoves(arr, removes);\r\n },\r\n\r\n getEventParent: function (arr: RelationArray) {\r\n return arr.parentEntity.entityAspect;\r\n },\r\n\r\n getPendingPubs: function (arr: RelationArray) {\r\n const em = arr.parentEntity.entityAspect.entityManager;\r\n return em && (em as any)._pendingPubs;\r\n }\r\n};\r\n\r\nfunction getGoodAdds(relationArray: RelationArray, adds: Entity[]) {\r\n let goodAdds = checkForDups(relationArray, adds);\r\n if (!goodAdds.length) {\r\n return goodAdds;\r\n }\r\n let parentEntity = relationArray.parentEntity;\r\n let entityManager = parentEntity.entityAspect.entityManager;\r\n // we do not want to attach an entity during loading\r\n // because these will all be 'attached' at a later step.\r\n if (entityManager && !entityManager.isLoading) {\r\n goodAdds.forEach(function (add) {\r\n if (add.entityAspect.entityState.isDetached()) {\r\n relationArray._obs.inProgress = true;\r\n try {\r\n entityManager!.attachEntity(add, EntityState.Added);\r\n } finally {\r\n relationArray._obs.inProgress = false;\r\n }\r\n }\r\n });\r\n }\r\n return goodAdds;\r\n}\r\n\r\nfunction processAdds(relationArray: RelationArray, adds: Entity[]) {\r\n let parentEntity = relationArray.parentEntity;\r\n let np = relationArray.navigationProperty;\r\n let addsInProcess = relationArray._obs.addsInProcess!;\r\n\r\n let invNp = np.inverse;\r\n let startIx = addsInProcess.length;\r\n try {\r\n adds.forEach(function (childEntity) {\r\n addsInProcess.push(childEntity);\r\n if (invNp) {\r\n childEntity.setProperty(invNp.name, parentEntity);\r\n } else {\r\n // This occurs with a unidirectional 1-n navigation - in this case\r\n // we need to update the fks instead of the navProp\r\n let pks = parentEntity.entityType.keyProperties;\r\n np.invForeignKeyNames.forEach(function (fk, i) {\r\n childEntity.setProperty(fk, parentEntity.getProperty(pks[i].name));\r\n });\r\n }\r\n });\r\n } finally {\r\n addsInProcess.splice(startIx, adds.length);\r\n }\r\n\r\n}\r\n\r\nfunction processRemoves(relationArray: RelationArray, removes: Entity[]) {\r\n let inp = relationArray.navigationProperty.inverse;\r\n if (inp) {\r\n removes.forEach(function (childEntity) {\r\n childEntity.setProperty(inp!.name, null);\r\n });\r\n }\r\n}\r\n\r\nfunction checkForDups(relationArray: RelationArray, adds: Entity[]) {\r\n // don't allow dups in this array. - also prevents recursion\r\n let parentEntity = relationArray.parentEntity;\r\n let navProp = relationArray.navigationProperty;\r\n let inverseProp = navProp.inverse;\r\n let addsInProcess = relationArray._obs.addsInProcess!;\r\n let goodAdds: Entity[];\r\n if (inverseProp) {\r\n goodAdds = adds.filter(function (a) {\r\n if (addsInProcess.indexOf(a) >= 0) {\r\n return false;\r\n }\r\n let inverseValue = a.getProperty(inverseProp!.name);\r\n return inverseValue !== parentEntity;\r\n });\r\n } else {\r\n // This occurs with a unidirectional 1->N relation ( where there is no n -> 1)\r\n // in this case we compare fks.\r\n let fkPropNames = navProp.invForeignKeyNames;\r\n let keyProps = parentEntity.entityType.keyProperties;\r\n goodAdds = adds.filter(function (a) {\r\n if (addsInProcess.indexOf(a) >= 0) {\r\n return false;\r\n }\r\n return fkPropNames.some(function (fk, i) {\r\n let keyProp = keyProps[i].name;\r\n let keyVal = parentEntity.getProperty(keyProp);\r\n let fkVal = a.getProperty(fk);\r\n return keyVal !== fkVal;\r\n });\r\n });\r\n }\r\n return goodAdds;\r\n}\r\n\r\n/** For use by breeze plugin authors only. The class is for use in building a {@link ModelLibraryAdapter} implementation.\r\n@adapter (see {@link ModelLibraryAdapter})\r\n@hidden\r\n*/\r\nexport function makeRelationArray(arr: any[], parentEntity: Entity, navigationProperty: NavigationProperty): RelationArray {\r\n const arrX = arr as any;\r\n arrX.parentEntity = parentEntity;\r\n arrX.navigationProperty = navigationProperty;\r\n arrX.arrayChanged = new BreezeEvent(\"arrayChanged\", arrX);\r\n arrX.load = load;\r\n // addsInProcess: the pushes currently being processed on this array, which is what stops the\r\n // relationship fixup from recursing back into it.\r\n observableArray.initialize(arrX, relationArrayOps, { addsInProcess: [] });\r\n return arrX as RelationArray;\r\n}\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { core } from '../core/core.js';
|
|
2
|
+
/** @hidden @internal */
|
|
3
|
+
// Represents entities not yet attached to navigationProperties.
|
|
4
|
+
export class UnattachedChildrenMap {
|
|
5
|
+
// key is EntityKey.toString(), value is array of { navigationProperty, children }
|
|
6
|
+
map = new Map();
|
|
7
|
+
// Which keys each child is parked under, so that detaching it is a lookup rather than a scan
|
|
8
|
+
// of the whole map. A WeakMap because it is only ever read for a child we are already holding,
|
|
9
|
+
// and an entry that outlives its entity would be the leak this exists to close.
|
|
10
|
+
childKeys = new WeakMap();
|
|
11
|
+
addChild(parentEntityKey, navigationProperty, child) {
|
|
12
|
+
let tuple = this.getTuple(parentEntityKey, navigationProperty);
|
|
13
|
+
if (!tuple) {
|
|
14
|
+
tuple = { navigationProperty: navigationProperty, children: [] };
|
|
15
|
+
core.getMapArray(this.map, parentEntityKey.toString()).push(tuple);
|
|
16
|
+
}
|
|
17
|
+
tuple.children.push(child);
|
|
18
|
+
// getTuple looks up the hierarchy, so the tuple just pushed into may be stored under a base
|
|
19
|
+
// type's key. Record every key it could be under; removeChild ignores the ones it is not in.
|
|
20
|
+
let keys = this.childKeys.get(child);
|
|
21
|
+
if (!keys) {
|
|
22
|
+
keys = new Set();
|
|
23
|
+
this.childKeys.set(child, keys);
|
|
24
|
+
}
|
|
25
|
+
keys.add(parentEntityKey.toString());
|
|
26
|
+
let entityType = parentEntityKey.entityType;
|
|
27
|
+
while (entityType.baseEntityType) {
|
|
28
|
+
entityType = entityType.baseEntityType;
|
|
29
|
+
keys.add(parentEntityKey.toString(entityType));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Takes a child out of every entry it is parked under, and drops an entry that is left empty.
|
|
34
|
+
*
|
|
35
|
+
* Called when an entity is detached. Without it a child whose parent never arrived is held for
|
|
36
|
+
* the life of the manager: `clear()` replaces the whole map, but `detachEntity` is how an
|
|
37
|
+
* application drops one row. See the retention tier.
|
|
38
|
+
*/
|
|
39
|
+
removeChild(child) {
|
|
40
|
+
const keys = this.childKeys.get(child);
|
|
41
|
+
if (!keys)
|
|
42
|
+
return;
|
|
43
|
+
for (const keyString of keys) {
|
|
44
|
+
const tuples = this.map.get(keyString);
|
|
45
|
+
if (!tuples)
|
|
46
|
+
continue;
|
|
47
|
+
for (let i = tuples.length - 1; i >= 0; i--) {
|
|
48
|
+
const children = tuples[i].children;
|
|
49
|
+
const ix = children.indexOf(child);
|
|
50
|
+
if (ix >= 0)
|
|
51
|
+
children.splice(ix, 1);
|
|
52
|
+
if (children.length === 0)
|
|
53
|
+
tuples.splice(i, 1);
|
|
54
|
+
}
|
|
55
|
+
if (tuples.length === 0)
|
|
56
|
+
this.map.delete(keyString);
|
|
57
|
+
}
|
|
58
|
+
this.childKeys.delete(child);
|
|
59
|
+
}
|
|
60
|
+
removeChildren(parentEntityKeyString, navigationProperty) {
|
|
61
|
+
let tuples = this.map.get(parentEntityKeyString);
|
|
62
|
+
if (!tuples)
|
|
63
|
+
return;
|
|
64
|
+
core.arrayRemoveItem(tuples, (t) => {
|
|
65
|
+
return t.navigationProperty === navigationProperty;
|
|
66
|
+
});
|
|
67
|
+
if (!tuples.length) {
|
|
68
|
+
this.map.delete(parentEntityKeyString);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
getTuple(parentEntityKey, navigationProperty) {
|
|
72
|
+
let tuples = this.getTuples(parentEntityKey);
|
|
73
|
+
if (!tuples)
|
|
74
|
+
return null;
|
|
75
|
+
let tuple = core.arrayFirst(tuples, function (t) {
|
|
76
|
+
return t.navigationProperty === navigationProperty;
|
|
77
|
+
});
|
|
78
|
+
return tuple;
|
|
79
|
+
}
|
|
80
|
+
getTuples(parentEntityKey) {
|
|
81
|
+
let tuples = this.map.get(parentEntityKey.toString());
|
|
82
|
+
let entityType = parentEntityKey.entityType;
|
|
83
|
+
// Nothing above it in the hierarchy, which is the usual case: there is only one entry to
|
|
84
|
+
// find, so hand back the stored array rather than copying it into a new one. addChild goes
|
|
85
|
+
// through here for every child it registers.
|
|
86
|
+
if (!entityType.baseEntityType)
|
|
87
|
+
return tuples && tuples.length ? tuples : undefined;
|
|
88
|
+
let allTuples;
|
|
89
|
+
while (entityType.baseEntityType) {
|
|
90
|
+
entityType = entityType.baseEntityType;
|
|
91
|
+
let baseTuples = this.map.get(parentEntityKey.toString(entityType));
|
|
92
|
+
if (baseTuples) {
|
|
93
|
+
// only now is a combined array needed
|
|
94
|
+
allTuples = allTuples || (tuples ? tuples.slice() : []);
|
|
95
|
+
allTuples.push(...baseTuples);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
allTuples = allTuples || tuples;
|
|
99
|
+
return allTuples && allTuples.length ? allTuples : undefined;
|
|
100
|
+
}
|
|
101
|
+
getTuplesByString(parentEntityKeyString) {
|
|
102
|
+
return this.map.get(parentEntityKeyString);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=unattached-children-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unattached-children-map.js","sourceRoot":"","sources":["../../src/entity/unattached-children-map.ts"],"names":[],"mappings":"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","sourcesContent":["import { core } from '../core/core.js';\r\nimport { Entity } from './entity-aspect.js';\r\nimport { NavigationProperty } from '../metadata/entity-metadata.js';\r\nimport { EntityKey } from './entity-key.js';\r\n\r\n/** @hidden @internal */\r\nexport interface INavTuple {\r\n navigationProperty: NavigationProperty;\r\n children: Entity[];\r\n}\r\n\r\n/** @hidden @internal */\r\n// Represents entities not yet attached to navigationProperties. \r\nexport class UnattachedChildrenMap {\r\n // key is EntityKey.toString(), value is array of { navigationProperty, children }\r\n map = new Map<string, INavTuple[]>();\r\n\r\n // Which keys each child is parked under, so that detaching it is a lookup rather than a scan\r\n // of the whole map. A WeakMap because it is only ever read for a child we are already holding,\r\n // and an entry that outlives its entity would be the leak this exists to close.\r\n private childKeys = new WeakMap<Entity, Set<string>>();\r\n\r\n addChild(parentEntityKey: EntityKey, navigationProperty: NavigationProperty, child: Entity) {\r\n let tuple = this.getTuple(parentEntityKey, navigationProperty);\r\n if (!tuple) {\r\n tuple = { navigationProperty: navigationProperty, children: [] };\r\n core.getMapArray(this.map, parentEntityKey.toString()).push(tuple);\r\n }\r\n tuple.children.push(child);\r\n\r\n // getTuple looks up the hierarchy, so the tuple just pushed into may be stored under a base\r\n // type's key. Record every key it could be under; removeChild ignores the ones it is not in.\r\n let keys = this.childKeys.get(child);\r\n if (!keys) { keys = new Set<string>(); this.childKeys.set(child, keys); }\r\n keys.add(parentEntityKey.toString());\r\n let entityType = parentEntityKey.entityType;\r\n while (entityType.baseEntityType) {\r\n entityType = entityType.baseEntityType;\r\n keys.add(parentEntityKey.toString(entityType));\r\n }\r\n }\r\n\r\n /**\r\n * Takes a child out of every entry it is parked under, and drops an entry that is left empty.\r\n *\r\n * Called when an entity is detached. Without it a child whose parent never arrived is held for\r\n * the life of the manager: `clear()` replaces the whole map, but `detachEntity` is how an\r\n * application drops one row. See the retention tier.\r\n */\r\n removeChild(child: Entity) {\r\n const keys = this.childKeys.get(child);\r\n if (!keys) return;\r\n for (const keyString of keys) {\r\n const tuples = this.map.get(keyString);\r\n if (!tuples) continue;\r\n for (let i = tuples.length - 1; i >= 0; i--) {\r\n const children = tuples[i].children;\r\n const ix = children.indexOf(child);\r\n if (ix >= 0) children.splice(ix, 1);\r\n if (children.length === 0) tuples.splice(i, 1);\r\n }\r\n if (tuples.length === 0) this.map.delete(keyString);\r\n }\r\n this.childKeys.delete(child);\r\n }\r\n\r\n removeChildren(parentEntityKeyString: string, navigationProperty: NavigationProperty) {\r\n let tuples = this.map.get(parentEntityKeyString);\r\n if (!tuples) return;\r\n core.arrayRemoveItem(tuples, (t: any) => {\r\n return t.navigationProperty === navigationProperty;\r\n });\r\n if (!tuples.length) {\r\n this.map.delete(parentEntityKeyString);\r\n }\r\n }\r\n\r\n getTuple(parentEntityKey: EntityKey, navigationProperty: NavigationProperty) {\r\n let tuples = this.getTuples(parentEntityKey);\r\n if (!tuples) return null;\r\n let tuple = core.arrayFirst(tuples, function (t) {\r\n return t.navigationProperty === navigationProperty;\r\n });\r\n return tuple;\r\n }\r\n\r\n getTuples(parentEntityKey: EntityKey) {\r\n let tuples = this.map.get(parentEntityKey.toString());\r\n let entityType = parentEntityKey.entityType;\r\n // Nothing above it in the hierarchy, which is the usual case: there is only one entry to\r\n // find, so hand back the stored array rather than copying it into a new one. addChild goes\r\n // through here for every child it registers.\r\n if (!entityType.baseEntityType) return tuples && tuples.length ? tuples : undefined;\r\n\r\n let allTuples: INavTuple[] | undefined;\r\n while (entityType.baseEntityType) {\r\n entityType = entityType.baseEntityType;\r\n let baseTuples = this.map.get(parentEntityKey.toString(entityType));\r\n if (baseTuples) {\r\n // only now is a combined array needed\r\n allTuples = allTuples || (tuples ? tuples.slice() : []);\r\n allTuples.push(...baseTuples);\r\n }\r\n }\r\n allTuples = allTuples || tuples;\r\n return allTuples && allTuples.length ? allTuples : undefined;\r\n }\r\n\r\n getTuplesByString(parentEntityKeyString: string) {\r\n return this.map.get(parentEntityKeyString);\r\n }\r\n\r\n}\r\n"]}
|