UNPKG

breeze-client

Version:

Breeze data management for JavaScript clients

1 lines 20 kB
{"version":3,"file":"breeze-client-mixin-get-entity-graph.mjs","sources":["../../src/mixin-get-entity-graph.ts","../../src/breeze-client-mixin-get-entity-graph.ts"],"sourcesContent":["//#region Copyright, Version, and Description\r\n/*\r\n * Copyright 2015-2021 IdeaBlade, Inc. All Rights Reserved.\r\n * Use, reproduction, distribution, and modification of this code is subject to the terms and\r\n * conditions of the IdeaBlade Breeze license, available at http://www.breezejs.com/license\r\n *\r\n * Author: Ward Bell\r\n * Version: 0.9.5 - Steve Schmitt - convert to TypeScript, migrate to breeze-client repo, add HasEntityGraph and mixinEntityGraph\r\n * Version: 0.9.4 - Marcel Good - fix UMD module name\r\n * --------------------------------------------------------------------------------\r\n * Adds getEntityGraph method to Breeze EntityManager prototype.\r\n * Call mixinEntityGraph(EntityManager) to apply the mixin in a tree-shaking-resistant way.\r\n * Then (manager as any).getEntityGraph(entity, \"child\");\r\n *\r\n * Depends on Breeze which it patches\r\n *\r\n * For discussion, see:\r\n * http://www.breezejs.com/documentation/getentitygraph\r\n *\r\n * For example usage, see:\r\n * https://github.com/Breeze/breeze.js.samples/tree/master/net/DocCode/DocCode/tests/getEntityGraphTests.js\r\n */\r\n//#endregion\r\nimport { Entity, EntityManager, EntityQuery, EntityState, EntityType, ExpandClause } from 'breeze-client';\r\n\r\ninterface EntityGroup {\r\n _entities: (Entity | null)[];\r\n _indexMap: { [index: string]: number };\r\n}\r\n\r\n// module augmentation failed to build with ng-packagr, so we have a separate interface\r\nexport interface HasEntityGraph extends EntityManager {\r\n /**\r\n Get related entities of root entity (or root entities) as specified by expand.\r\n @example\r\n var graph = breeze.EntityManager.getEntityGraph(customer, 'Orders.OrderDetails');\r\n // graph will be the customer, all of its orders and their details even if deleted.\r\n @method getEntityGraph\r\n @param roots {Entity|Array of Entity} The root entity or root entities.\r\n @param expand {String|Array of String|Object} an expand string, a query expand clause, or array of string paths\r\n @return {Array of Entity} root entities and their related entities, including deleted entities. Duplicates are removed and entity order is indeterminate.\r\n **/\r\n getEntityGraph(roots: Entity | Array<Entity>, expand: string | Array<string> | ExpandClause): Array<Entity>;\r\n\r\n /**\r\n Execute query locally and return both the query results and their related entities as specified by the optional expand parameter or the query's expand clause.\r\n @example\r\n var query = breeze.EntityQuery.from('Customers')\r\n .where('CompanyName', 'startsWith', 'Alfred')\r\n .expand('Orders.OrderDetails');\r\n var graph = manager.getEntityGraph(query);\r\n // graph will be the 'Alfred' customers, their orders and their details even if deleted.\r\n @method getEntityGraph\r\n @param query {EntityQuery} A query to be executed against the manager's local cache.\r\n @param [expand] {String|Array of String|Object} an expand string, a query expand clause, or array of string paths\r\n @return {Array of Entity} local queried root entities and their related entities, including deleted entities. Duplicates are removed and entity order is indeterminate.\r\n **/\r\n getEntityGraph(query: EntityQuery, expand: string | Array<string> | ExpandClause): Array<Entity>;\r\n\r\n}\r\n\r\nexport function mixinEntityGraph(emclass: { new(): EntityManager }) {\r\n const proto = EntityManager.prototype;\r\n\r\n if (!(proto as any).getEntityGraph) {\r\n (proto as any).getEntityGraph = getEntityGraph;\r\n }\r\n}\r\n\r\nmixinEntityGraph(EntityManager);\r\n\r\n\r\nfunction getEntityGraph(roots: Entity | Array<Entity> | EntityQuery, expand: string | Array<string> | ExpandClause) {\r\n if (roots instanceof EntityQuery) {\r\n let newRoots = this.executeQueryLocally(roots);\r\n return getEntityGraphCore(newRoots, expand || roots.expandClause);\r\n } else {\r\n return getEntityGraphCore(roots, expand);\r\n }\r\n}\r\n\r\nfunction getEntityGraphCore(root: Entity | Array<Entity>, expand: string | Array<string> | ExpandClause) {\r\n let entityGroupMap: { [index: string]: EntityGroup };\r\n let graph = [] as Array<Entity>;\r\n let rootType: EntityType;\r\n let roots = Array.isArray(root) ? root : [root];\r\n addToGraph(roots); // removes dups & nulls\r\n roots = graph.slice(); // copy of de-duped roots\r\n if (roots.length) {\r\n getRootInfo();\r\n getExpand();\r\n buildGraph();\r\n }\r\n return graph;\r\n\r\n function addToGraph(entities: Array<Entity>) {\r\n entities.forEach(function (entity) {\r\n if (entity && graph.indexOf(entity) < 0) {\r\n graph.push(entity);\r\n }\r\n });\r\n }\r\n\r\n function getRootInfo() {\r\n let compatTypes: Array<EntityType>;\r\n\r\n roots.forEach(function (root, ix) {\r\n let aspect;\r\n if (!root || !(aspect = root.entityAspect)) {\r\n throw getRootErr(ix, 'is not an entity');\r\n }\r\n if (aspect.entityState === EntityState.Detached) {\r\n throw getRootErr(ix, 'is a detached entity');\r\n }\r\n\r\n let em = aspect.entityManager;\r\n if (entityGroupMap) {\r\n if (entityGroupMap !== em._entityGroupMap) {\r\n throw getRootErr(ix, \"has a different 'EntityManager' than other roots\");\r\n }\r\n } else {\r\n entityGroupMap = em._entityGroupMap;\r\n }\r\n getRootType(root, ix);\r\n\r\n });\r\n\r\n function getRootErr(ix: number, msg: string) {\r\n return new Error(\"'getEntityGraph' root[\" + ix + \"] \" + msg);\r\n }\r\n\r\n function getRootType(root: Entity, ix: number) {\r\n let thisType = root.entityType;\r\n if (!rootType) {\r\n rootType = thisType;\r\n return;\r\n } else if (rootType === thisType) {\r\n return;\r\n }\r\n // Types differs. Look for closest common base type\r\n // does thisType derive from current rootType?\r\n let baseType = rootType;\r\n do {\r\n compatTypes = compatTypes || baseType.getSelfAndSubtypes();\r\n if (compatTypes.indexOf(thisType) > -1) {\r\n rootType = baseType;\r\n return;\r\n }\r\n baseType = baseType.baseEntityType;\r\n compatTypes = null;\r\n } while (baseType);\r\n\r\n // does current rootType derives from thisType?\r\n baseType = thisType;\r\n do {\r\n compatTypes = baseType.getSelfAndSubtypes();\r\n if (compatTypes.indexOf(rootType) > -1) {\r\n rootType = baseType;\r\n return;\r\n }\r\n baseType = baseType.baseEntityType;\r\n } while (baseType);\r\n\r\n throw getRootErr(ix, \"is not EntityType-compatible with other roots\");\r\n }\r\n }\r\n\r\n function getExpand() {\r\n try {\r\n if (!expand) {\r\n expand = [];\r\n } else if (typeof expand === 'string') {\r\n // tricky because Breeze expandClause not exposed publically\r\n expand = new EntityQuery().expand(expand).expandClause;\r\n }\r\n if (expand instanceof ExpandClause && expand.propertyPaths) { // expand clause\r\n expand = expand.propertyPaths;\r\n } else if (Array.isArray(expand)) {\r\n if (!expand.every(function (elem) { return typeof elem === 'string'; })) {\r\n throw '';\r\n }\r\n } else {\r\n throw '';\r\n }\r\n } catch (_) {\r\n throw new Error(\r\n \"expand must be an expand string, array of string paths, or a query expand clause\");\r\n }\r\n }\r\n\r\n function buildGraph() {\r\n if (expand && expand instanceof Array && expand.length) {\r\n let fns = expand.map(makePathFn);\r\n fns.forEach(function (fn) { fn(roots); });\r\n }\r\n }\r\n\r\n // Make function to get entities along a single expand path\r\n // such as 'Orders.OrderDetails.Product'\r\n function makePathFn(path: string) {\r\n let fns = [] as Array<Function>,\r\n segments = path.split('.'),\r\n type = rootType;\r\n\r\n for (let i = 0, slen = segments.length; i < slen; i++) {\r\n let f = makePathSegmentFn(type, segments[i]);\r\n type = (f as any).navType;\r\n fns.push(f);\r\n }\r\n\r\n return function pathFn(entities: Array<Entity>) {\r\n for (let j = 0, flen = fns.length; j < flen; j++) {\r\n let elen = entities.length;\r\n if (elen === 0) { return; } // nothing left to explore\r\n // fn to get related entities for this path segment\r\n let fn = fns[j];\r\n // get entities related by this path segment\r\n let related = [] as Array<Entity>;\r\n for (let k = 0; k < elen; k++) {\r\n related = related.concat(fn(entities[k]));\r\n }\r\n addToGraph(related);\r\n if (j >= flen - 1) { return; } // no more path segments\r\n\r\n // reset entities to deduped related entities\r\n entities = [];\r\n for (let l = 0, rlen = related.length; l < rlen; l++) {\r\n let r = related[l];\r\n if (entities.indexOf(r) < 0) { entities.push(r); }\r\n }\r\n }\r\n };\r\n }\r\n\r\n // Make function to get entities along a single expand path segment\r\n // such as the 'OrderDetails' in the 'Orders.OrderDetails.Product' path\r\n function makePathSegmentFn(baseType: EntityType, segment: string) {\r\n let baseTypeName: string, fn = undefined, navType;\r\n try {\r\n baseTypeName = baseType.name;\r\n let nav = baseType.getNavigationProperty(segment);\r\n let fkName = nav.foreignKeyNames[0];\r\n if (!nav) {\r\n throw new Error(segment + \" is not a navigation property of \" + baseTypeName);\r\n }\r\n navType = nav.entityType;\r\n // add derived types\r\n let navTypes = navType.getSelfAndSubtypes();\r\n let grps = [] as Array<EntityGroup>; // non-empty groups for these types\r\n navTypes.forEach(function (t) {\r\n let grp = entityGroupMap[t.name];\r\n if (grp && grp._entities.length > 0) {\r\n grps.push(grp);\r\n }\r\n });\r\n let grpCount = grps.length;\r\n if (grpCount === 0) {\r\n // no related entities in cache\r\n fn = function () { return [] as Array<Entity>; };\r\n } else if (fkName) {\r\n fn = function (entity: Entity) {\r\n let val = null;\r\n try {\r\n let keyValue = entity.getProperty(fkName);\r\n for (let i = 0; i < grpCount; i += 1) {\r\n val = grps[i]._entities[grps[i]._indexMap[keyValue]];\r\n if (val) { break; }\r\n }\r\n } catch (e) { rethrow(e); }\r\n return val;\r\n };\r\n } else {\r\n fkName = nav.inverse ?\r\n nav.inverse.foreignKeyNames[0] :\r\n nav.invForeignKeyNames[0];\r\n if (!fkName) { throw new Error(\"No inverse keys\"); }\r\n fn = function (entity: Entity) {\r\n let vals = [] as Array<Entity>;\r\n try {\r\n let keyValue = entity.entityAspect.getKey().values[0];\r\n grps.forEach(function (grp) {\r\n vals = vals.concat(grp._entities.filter(function (en) {\r\n return en && en.getProperty(fkName) === keyValue;\r\n }));\r\n });\r\n } catch (e) { rethrow(e); }\r\n return vals;\r\n };\r\n }\r\n (fn as any).navType = navType;\r\n (fn as any).path = segment;\r\n\r\n } catch (err) { rethrow(err); }\r\n return fn;\r\n\r\n function rethrow(e: Error) {\r\n let typeName = baseTypeName || baseType;\r\n let error = new Error(\"'getEntityGraph' can't expand '\" + segment + \"' for \" + typeName);\r\n (error as any).innerError = e;\r\n throw error;\r\n }\r\n }\r\n}\r\n\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './mixin-get-entity-graph';\n"],"names":[],"mappings":"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"}