@sap/cds-compiler 2.5.2 → 2.11.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/CHANGELOG.md +235 -9
- package/bin/cdsc.js +44 -27
- package/bin/cdsse.js +1 -0
- package/doc/CHANGELOG_BETA.md +37 -3
- package/lib/api/.eslintrc.json +2 -0
- package/lib/api/main.js +37 -123
- package/lib/api/options.js +27 -15
- package/lib/api/validate.js +34 -9
- package/lib/backends.js +9 -89
- package/lib/base/dictionaries.js +2 -1
- package/lib/base/keywords.js +32 -2
- package/lib/base/message-registry.js +73 -11
- package/lib/base/messages.js +86 -30
- package/lib/base/model.js +6 -6
- package/lib/base/optionProcessorHelper.js +56 -22
- package/lib/checks/defaultValues.js +27 -2
- package/lib/checks/elements.js +1 -6
- package/lib/checks/foreignKeys.js +0 -6
- package/lib/checks/managedWithoutKeys.js +17 -0
- package/lib/checks/nonexpandableStructured.js +38 -0
- package/lib/checks/onConditions.js +9 -45
- package/lib/checks/queryNoDbArtifacts.js +25 -7
- package/lib/checks/selectItems.js +29 -2
- package/lib/checks/types.js +26 -2
- package/lib/checks/unknownMagic.js +41 -0
- package/lib/checks/utils.js +61 -0
- package/lib/checks/validator.js +60 -7
- package/lib/compiler/assert-consistency.js +23 -7
- package/lib/compiler/base.js +65 -0
- package/lib/compiler/builtins.js +30 -1
- package/lib/compiler/checks.js +8 -5
- package/lib/compiler/definer.js +157 -133
- package/lib/compiler/index.js +89 -31
- package/lib/compiler/propagator.js +5 -2
- package/lib/compiler/resolver.js +375 -185
- package/lib/compiler/shared.js +49 -202
- package/lib/compiler/utils.js +173 -0
- package/lib/edm/annotations/genericTranslation.js +183 -187
- package/lib/edm/csn2edm.js +104 -108
- package/lib/edm/edm.js +18 -21
- package/lib/edm/edmPreprocessor.js +388 -146
- package/lib/edm/edmUtils.js +104 -34
- package/lib/gen/Dictionary.json +22 -0
- package/lib/gen/language.checksum +1 -1
- package/lib/gen/language.interp +28 -1
- package/lib/gen/language.tokens +79 -69
- package/lib/gen/languageLexer.interp +28 -1
- package/lib/gen/languageLexer.js +879 -805
- package/lib/gen/languageLexer.tokens +71 -62
- package/lib/gen/languageParser.js +5330 -4300
- package/lib/json/from-csn.js +110 -52
- package/lib/json/to-csn.js +434 -120
- package/lib/language/antlrParser.js +15 -3
- package/lib/language/errorStrategy.js +1 -0
- package/lib/language/genericAntlrParser.js +93 -26
- package/lib/language/language.g4 +172 -31
- package/lib/main.d.ts +216 -19
- package/lib/main.js +32 -7
- package/lib/model/api.js +78 -0
- package/lib/model/csnRefs.js +413 -149
- package/lib/model/csnUtils.js +286 -75
- package/lib/model/enrichCsn.js +50 -6
- package/lib/model/revealInternalProperties.js +22 -5
- package/lib/modelCompare/compare.js +39 -21
- package/lib/optionProcessor.js +35 -18
- package/lib/render/.eslintrc.json +4 -1
- package/lib/render/DuplicateChecker.js +9 -6
- package/lib/render/toCdl.js +121 -36
- package/lib/render/toHdbcds.js +148 -98
- package/lib/render/toSql.js +114 -43
- package/lib/render/utils/common.js +8 -13
- package/lib/render/utils/sql.js +3 -3
- package/lib/sql-identifier.js +6 -1
- package/lib/transform/db/assertUnique.js +5 -6
- package/lib/transform/db/constraints.js +281 -106
- package/lib/transform/db/draft.js +11 -8
- package/lib/transform/db/expansion.js +584 -0
- package/lib/transform/db/flattening.js +341 -0
- package/lib/transform/db/groupByOrderBy.js +2 -2
- package/lib/transform/db/transformExists.js +345 -65
- package/lib/transform/db/views.js +438 -0
- package/lib/transform/forHanaNew.js +131 -793
- package/lib/transform/forOdataNew.js +30 -24
- package/lib/transform/localized.js +39 -10
- package/lib/transform/odata/attachPath.js +19 -4
- package/lib/transform/odata/generateForeignKeyElements.js +11 -10
- package/lib/transform/odata/referenceFlattener.js +60 -39
- package/lib/transform/odata/sortByAssociationDependency.js +2 -2
- package/lib/transform/odata/structuralPath.js +72 -0
- package/lib/transform/odata/structureFlattener.js +19 -18
- package/lib/transform/odata/typesExposure.js +22 -12
- package/lib/transform/transformUtilsNew.js +144 -78
- package/lib/transform/translateAssocsToJoins.js +22 -27
- package/lib/transform/universalCsnEnricher.js +67 -0
- package/lib/utils/file.js +5 -14
- package/lib/utils/moduleResolve.js +6 -8
- package/lib/utils/term.js +65 -42
- package/lib/utils/timetrace.js +48 -26
- package/package.json +1 -1
- package/lib/json/walker.js +0 -26
- package/lib/transform/sqlite +0 -0
- package/lib/utils/string.js +0 -17
package/lib/edm/edmUtils.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
+
const { setProp } = require('../base/model');
|
|
2
3
|
const { isBuiltinType, isEdmPropertyRendered } = require('../model/csnUtils');
|
|
3
4
|
|
|
4
5
|
/* eslint max-statements-per-line:off */
|
|
@@ -114,6 +115,12 @@ function isToMany(assoc) {
|
|
|
114
115
|
return targetMax === '*' || Number(targetMax) > 1;
|
|
115
116
|
}
|
|
116
117
|
|
|
118
|
+
function isSingleton(entityCsn, v) {
|
|
119
|
+
const singleton = entityCsn['@odata.singleton'];
|
|
120
|
+
const hasNullable = entityCsn['@odata.singleton.nullable'] !== undefined && entityCsn['@odata.singleton.nullable'] !== null;
|
|
121
|
+
return v && singleton || ((singleton === undefined || singleton === null) && hasNullable);
|
|
122
|
+
}
|
|
123
|
+
|
|
117
124
|
function isEntity(artifact)
|
|
118
125
|
{
|
|
119
126
|
return ['entity'].includes(artifact.kind);
|
|
@@ -142,7 +149,7 @@ function isActionOrFunction(artifact) {
|
|
|
142
149
|
return ['action', 'function'].includes(artifact.kind);
|
|
143
150
|
}
|
|
144
151
|
|
|
145
|
-
function resolveOnConditionAndPrepareConstraints(assocCsn, messageFunctions) {
|
|
152
|
+
function resolveOnConditionAndPrepareConstraints(csn, assocCsn, messageFunctions) {
|
|
146
153
|
if(!assocCsn._constraints)
|
|
147
154
|
throw Error('Please debug me: need _constraints');
|
|
148
155
|
|
|
@@ -154,7 +161,7 @@ function resolveOnConditionAndPrepareConstraints(assocCsn, messageFunctions) {
|
|
|
154
161
|
getExpressionArguments(assocCsn.on);
|
|
155
162
|
|
|
156
163
|
// for all $self conditions, fill constraints of partner (if any)
|
|
157
|
-
let isBacklink = assocCsn._constraints.selfs.length
|
|
164
|
+
let isBacklink = assocCsn._constraints.selfs.length === 1 && assocCsn._constraints.termCount === 1;
|
|
158
165
|
|
|
159
166
|
/* example for _originalTarget:
|
|
160
167
|
entity E (with parameters) {
|
|
@@ -167,27 +174,35 @@ function resolveOnConditionAndPrepareConstraints(assocCsn, messageFunctions) {
|
|
|
167
174
|
ON Condition back.toE => parter=toE cannot be resolved in EParameters, _originalTarget 'E' is
|
|
168
175
|
required for that
|
|
169
176
|
*/
|
|
170
|
-
assocCsn._constraints.selfs.filter(p => p).forEach(
|
|
171
|
-
|
|
172
|
-
const
|
|
177
|
+
assocCsn._constraints.selfs.filter(p => p).forEach(partnerPath => {
|
|
178
|
+
// resolve partner path in target
|
|
179
|
+
const originAssocCsn = resolveOriginAssoc(csn, (assocCsn._originalTarget || assocCsn._target), partnerPath);
|
|
180
|
+
const parentName = assocCsn.$abspath[0];
|
|
181
|
+
const parent = csn.definitions[parentName];
|
|
173
182
|
if(originAssocCsn) {
|
|
174
|
-
|
|
183
|
+
const originParentName = originAssocCsn.$abspath[0];
|
|
184
|
+
if(parent.$mySchemaName && originAssocCsn._originalTarget !== parent && originAssocCsn._target !== parent) {
|
|
175
185
|
isBacklink = false;
|
|
176
|
-
|
|
177
|
-
|
|
186
|
+
// Partnership is ambiguous
|
|
187
|
+
setProp(originAssocCsn, '$noPartner', true);
|
|
188
|
+
info(null, ['definitions', parentName, 'elements', assocCsn.name],
|
|
189
|
+
`"${originParentName}:${partnerPath.join('.')}" with target "${originAssocCsn._target.name}" is compared with $self which represents "${parentName}"`);
|
|
178
190
|
}
|
|
179
191
|
if(isAssociationOrComposition(originAssocCsn)) {
|
|
180
192
|
// Mark this association as backlink if $self appears exactly once
|
|
181
193
|
// to surpress edm:Association generation in V2 mode
|
|
182
194
|
if(isBacklink) {
|
|
183
|
-
//
|
|
195
|
+
// establish partnership with origin assoc but only if this association is the first one
|
|
184
196
|
if(originAssocCsn._selfReferences.length === 0) {
|
|
185
197
|
assocCsn._constraints._partnerCsn = originAssocCsn;
|
|
186
198
|
}
|
|
187
199
|
else {
|
|
188
200
|
isBacklink = false;
|
|
189
201
|
}
|
|
190
|
-
|
|
202
|
+
}
|
|
203
|
+
// store all backlinks at forward, required to calculate rendering of foreign keys
|
|
204
|
+
// if the termCount != 1 or more than one $self compare this is not a backlink
|
|
205
|
+
if(parent.$mySchemaName && assocCsn._constraints.selfs.length === 1 && assocCsn._constraints.termCount === 1) {
|
|
191
206
|
originAssocCsn._selfReferences.push(assocCsn);
|
|
192
207
|
}
|
|
193
208
|
assocCsn._constraints._origins.push(originAssocCsn);
|
|
@@ -203,8 +218,8 @@ function resolveOnConditionAndPrepareConstraints(assocCsn, messageFunctions) {
|
|
|
203
218
|
}
|
|
204
219
|
else
|
|
205
220
|
{
|
|
206
|
-
warning(null, ['definitions',
|
|
207
|
-
{ partner: `${assocCsn._target.name}/${
|
|
221
|
+
warning(null, ['definitions', parentName],
|
|
222
|
+
{ partner: `${assocCsn._target.name}/${partnerPath}`, name: `${parentName}/${assocCsn.name}` },
|
|
208
223
|
'Can\'t resolve backlink to $(PARTNER) from $(NAME)');
|
|
209
224
|
}
|
|
210
225
|
});
|
|
@@ -268,7 +283,7 @@ function resolveOnConditionAndPrepareConstraints(assocCsn, messageFunctions) {
|
|
|
268
283
|
// do we have a $self id?
|
|
269
284
|
// if so, store partner in selfs array
|
|
270
285
|
if(c[0][0] === '$self' && c[0].length === 1) {
|
|
271
|
-
assocCsn._constraints.selfs.push(c[1]
|
|
286
|
+
assocCsn._constraints.selfs.push(c[1]);
|
|
272
287
|
} else {
|
|
273
288
|
const key = c.join(',');
|
|
274
289
|
assocCsn._constraints.constraints[key] = c;
|
|
@@ -281,7 +296,7 @@ function resolveOnConditionAndPrepareConstraints(assocCsn, messageFunctions) {
|
|
|
281
296
|
}
|
|
282
297
|
}
|
|
283
298
|
|
|
284
|
-
function finalizeReferentialConstraints(assocCsn, options,
|
|
299
|
+
function finalizeReferentialConstraints(csn, assocCsn, options, info)
|
|
285
300
|
{
|
|
286
301
|
if(!assocCsn._constraints)
|
|
287
302
|
throw Error('Please debug me: need _constraints');
|
|
@@ -317,11 +332,16 @@ function finalizeReferentialConstraints(assocCsn, options, warning)
|
|
|
317
332
|
});
|
|
318
333
|
|
|
319
334
|
if(!assocCsn._target.$isParamEntity) {
|
|
320
|
-
//
|
|
321
|
-
|
|
335
|
+
// Use $path to identify main artifact in case assocs parent was a nested type and deanonymized
|
|
336
|
+
// Some (draft) associations don't have a $path, use _parent as last resort
|
|
337
|
+
let dependentEntity = assocCsn.$path ? csn.definitions[assocCsn.$path[1]] : assocCsn._parent;
|
|
338
|
+
let localDepEntity = assocCsn._parent;
|
|
339
|
+
// _target must always be a main artifact
|
|
322
340
|
let principalEntity = assocCsn._target;
|
|
323
341
|
if(assocCsn.type === 'cds.Composition') {
|
|
324
|
-
|
|
342
|
+
// Header is composed of Items => Cds.Composition: Header is principal => use header's primary keys
|
|
343
|
+
principalEntity = dependentEntity;
|
|
344
|
+
localDepEntity = undefined;
|
|
325
345
|
dependentEntity = assocCsn._target;
|
|
326
346
|
// Swap the constraint elements to be correct on Composition [principal, dependent] => [dependent, principal]
|
|
327
347
|
Object.keys(assocCsn._constraints.constraints).forEach(cn => {
|
|
@@ -332,14 +352,44 @@ function finalizeReferentialConstraints(assocCsn, options, warning)
|
|
|
332
352
|
const remainingPrincipalRefs = [];
|
|
333
353
|
foreach(assocCsn._constraints.constraints,
|
|
334
354
|
c => {
|
|
355
|
+
// rc === true will remove the constraint (positive filter expression)
|
|
356
|
+
let rc = true;
|
|
335
357
|
// concatenate all paths in flat mode to identify the correct element
|
|
336
358
|
// in structured mode only resolve top level element (path rewriting is done elsewhere)
|
|
337
|
-
const
|
|
338
|
-
const
|
|
339
|
-
const
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
359
|
+
const depEltName = ( options.isFlatFormat ? c[0].join('_') : c[0][0] );
|
|
360
|
+
const principalEltName = ( options.isFlatFormat ? c[1].join('_') : c[1][0] );
|
|
361
|
+
const fk = (isEntity(dependentEntity) && dependentEntity.elements[ depEltName ]) ||
|
|
362
|
+
(localDepEntity && localDepEntity.elements && localDepEntity.elements[ depEltName ]);
|
|
363
|
+
const pk = principalEntity.$keys && principalEntity.$keys[ principalEltName ];
|
|
364
|
+
if(isConstraintCandidate(fk) && isConstraintCandidate(pk)) {
|
|
365
|
+
if(options.isStructFormat) {
|
|
366
|
+
// In structured mode it might be the association has a new _parent due to
|
|
367
|
+
// type de-anonymization.
|
|
368
|
+
// There are three cases for dependent ON condition paths:
|
|
369
|
+
// 1) path is relative to assoc in same sub structure
|
|
370
|
+
// 2) path is absolute and ends up in a different environment
|
|
371
|
+
// 3) path is absolute and touches in assoc's environment
|
|
372
|
+
|
|
373
|
+
// => 1) if _parents are equal, fk path is relative to assoc
|
|
374
|
+
if(fk._parent === assocCsn._parent) {
|
|
375
|
+
rc = false;
|
|
376
|
+
}
|
|
377
|
+
// => 2) & 3) if path is not relative to assoc, remove main entity (pos=0) and assoc (pos=n-1)
|
|
378
|
+
// and check path identity: If absolute path touches assoc's _parent, add it
|
|
379
|
+
else if(!assocCsn.$abspath.slice(1, assocCsn.$abspath.length-1).some((p,i) => c[0][i] !== p)) {
|
|
380
|
+
// this was an absolute addressed path, remove environment prefix
|
|
381
|
+
c[0].splice(0, assocCsn.$abspath.length-2);
|
|
382
|
+
rc = false;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
// for flat mode isConstraintCandidate(fk) && isConstraintCandidate(pk) is sufficient
|
|
387
|
+
rc = false;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
if(!rc)
|
|
391
|
+
remainingPrincipalRefs.push(principalEltName);
|
|
392
|
+
return rc;
|
|
343
393
|
},
|
|
344
394
|
(c, cn) => { delete assocCsn._constraints.constraints[cn]; }
|
|
345
395
|
);
|
|
@@ -349,8 +399,8 @@ function finalizeReferentialConstraints(assocCsn, options, warning)
|
|
|
349
399
|
const renderedKeys = Object.values(principalEntity.$keys).filter(isConstraintCandidate).map(v=>v.name);
|
|
350
400
|
if(options.isV2() && intersect(renderedKeys, remainingPrincipalRefs).length !== renderedKeys.length)
|
|
351
401
|
if(options.odataV2PartialConstr) {
|
|
352
|
-
|
|
353
|
-
|
|
402
|
+
info('odata-spec-violation-constraints',
|
|
403
|
+
['definitions', assocCsn._parent.name, 'elements', assocCsn.name], { api: 'OData V2' });
|
|
354
404
|
}
|
|
355
405
|
else {
|
|
356
406
|
assocCsn._constraints.constraints = {};
|
|
@@ -387,8 +437,8 @@ function finalizeReferentialConstraints(assocCsn, options, warning)
|
|
|
387
437
|
const renderedKeys = Object.values(assocCsn._target.$keys).filter(isConstraintCandidate).map(v=>v.name);
|
|
388
438
|
if(options.isV2() && intersect(renderedKeys, remainingPrincipalRefs).length !== renderedKeys.length) {
|
|
389
439
|
if(options.odataV2PartialConstr) {
|
|
390
|
-
|
|
391
|
-
|
|
440
|
+
info('odata-spec-violation-constraints',
|
|
441
|
+
['definitions', assocCsn._parent.name, 'elements', assocCsn.name], { api: 'OData V2' } );
|
|
392
442
|
}
|
|
393
443
|
else {
|
|
394
444
|
assocCsn._constraints.constraints = {};
|
|
@@ -474,7 +524,7 @@ function determineMultiplicity(csn)
|
|
|
474
524
|
|
|
475
525
|
function mapCdsToEdmType(csn, messageFunctions, isV2=false, isMediaType=false)
|
|
476
526
|
{
|
|
477
|
-
const {
|
|
527
|
+
const { error } = messageFunctions || { error: ()=>true };
|
|
478
528
|
let cdsType = csn.type;
|
|
479
529
|
if(cdsType === undefined) {
|
|
480
530
|
error(null, csn.$location, `no type found`);
|
|
@@ -543,8 +593,6 @@ function mapCdsToEdmType(csn, messageFunctions, isV2=false, isMediaType=false)
|
|
|
543
593
|
if(['cds.hana.ST_POINT', 'cds.hana.ST_GEOMETRY'].includes(cdsType)) {
|
|
544
594
|
error(null, csn.$path, { type: cdsType }, `OData V2 does not support Geometry data types, $(TYPE) can't be mapped`);
|
|
545
595
|
}
|
|
546
|
-
if(cdsType === 'cds.DecimalFloat' || cdsType === 'cds.hana.SMALLDECIMAL')
|
|
547
|
-
warning(null, csn.$path, { type: cdsType }, `OData V2 does not support $(TYPE)`);
|
|
548
596
|
}
|
|
549
597
|
else // isV4
|
|
550
598
|
{
|
|
@@ -571,13 +619,21 @@ function addTypeFacets(node, csn)
|
|
|
571
619
|
// node.Precision = 16;
|
|
572
620
|
else if (csn.type === 'cds.Timestamp' && node.Type === 'Edm.DateTimeOffset')
|
|
573
621
|
node.Precision = 7;
|
|
574
|
-
|
|
622
|
+
if([ 'cds.Decimal', 'cds.DecimalFloat', 'cds.hana.SMALLDECIMAL' ].includes(csn.type)) {
|
|
575
623
|
if(isV2) {
|
|
576
|
-
|
|
624
|
+
// no prec/scale or scale is 'floating'/'variable'
|
|
625
|
+
if(!(csn.precision || csn.scale) || ['floating', 'variable'].includes(csn.scale)) {
|
|
626
|
+
node.setXml( { 'sap:variable-scale': true } );
|
|
627
|
+
delete node.Scale;
|
|
628
|
+
}
|
|
577
629
|
}
|
|
578
630
|
else {
|
|
579
|
-
//
|
|
580
|
-
node.
|
|
631
|
+
// map both floating and variable to => variable
|
|
632
|
+
if(node.Scale === 'floating')
|
|
633
|
+
node.Scale = 'variable';
|
|
634
|
+
if(!csn.precision && !csn.scale)
|
|
635
|
+
// if Decimal has no p, s set scale 'variable'
|
|
636
|
+
node.setXml( { Scale: 'variable' } ); // floating is V4.01
|
|
581
637
|
}
|
|
582
638
|
}
|
|
583
639
|
// Unicode unused today
|
|
@@ -636,6 +692,19 @@ function getBaseName(name) {
|
|
|
636
692
|
return (lastDotIdx > 0 ) ? name.substring(lastDotIdx+1, name.length) : name;
|
|
637
693
|
}
|
|
638
694
|
|
|
695
|
+
// This is a poor mans path resolver for $self partner paths only
|
|
696
|
+
function resolveOriginAssoc(csn, env, path) {
|
|
697
|
+
for(let i = 0; i < path.length; i++) {
|
|
698
|
+
let elements = (env.items && env.items.elements || env.elements);
|
|
699
|
+
if(elements)
|
|
700
|
+
env = env.elements[path[i]];
|
|
701
|
+
let type = (env.items && env.items.type || env.type);
|
|
702
|
+
if(type && !isBuiltinType(type) && !(env.items && env.items.elements || env.elements))
|
|
703
|
+
env = csn.definitions[env.type];
|
|
704
|
+
}
|
|
705
|
+
return env;
|
|
706
|
+
}
|
|
707
|
+
|
|
639
708
|
module.exports = {
|
|
640
709
|
validateOptions,
|
|
641
710
|
intersect,
|
|
@@ -647,6 +716,7 @@ module.exports = {
|
|
|
647
716
|
isComposition,
|
|
648
717
|
isAssociationOrComposition,
|
|
649
718
|
isToMany,
|
|
719
|
+
isSingleton,
|
|
650
720
|
isEntity,
|
|
651
721
|
isStructuredType,
|
|
652
722
|
isStructuredArtifact,
|
package/lib/gen/Dictionary.json
CHANGED
|
@@ -729,6 +729,13 @@
|
|
|
729
729
|
],
|
|
730
730
|
"$experimental": true
|
|
731
731
|
},
|
|
732
|
+
"Common.Composition": {
|
|
733
|
+
"Type": "Core.Tag",
|
|
734
|
+
"AppliesTo": [
|
|
735
|
+
"NavigationProperty"
|
|
736
|
+
],
|
|
737
|
+
"$experimental": true
|
|
738
|
+
},
|
|
732
739
|
"Common.SAPObjectNodeTypeReference": {
|
|
733
740
|
"Type": "Edm.String",
|
|
734
741
|
"AppliesTo": [
|
|
@@ -1345,6 +1352,9 @@
|
|
|
1345
1352
|
"Core.SymbolicName": {
|
|
1346
1353
|
"Type": "Core.SimpleIdentifier"
|
|
1347
1354
|
},
|
|
1355
|
+
"Core.GeometryFeature": {
|
|
1356
|
+
"Type": "Core.GeometryFeatureType"
|
|
1357
|
+
},
|
|
1348
1358
|
"Graph.links": {
|
|
1349
1359
|
"Type": "Collection(Graph.link)",
|
|
1350
1360
|
"AppliesTo": [
|
|
@@ -3018,6 +3028,14 @@
|
|
|
3018
3028
|
"DefaultValue": "Edm.String"
|
|
3019
3029
|
}
|
|
3020
3030
|
},
|
|
3031
|
+
"Core.GeometryFeatureType": {
|
|
3032
|
+
"$kind": "ComplexType",
|
|
3033
|
+
"Properties": {
|
|
3034
|
+
"geometry": "Edm.Geometry",
|
|
3035
|
+
"properties": "Core.Dictionary",
|
|
3036
|
+
"id": "Edm.String"
|
|
3037
|
+
}
|
|
3038
|
+
},
|
|
3021
3039
|
"Core.RevisionKind": {
|
|
3022
3040
|
"$kind": "EnumType",
|
|
3023
3041
|
"Members": [
|
|
@@ -3066,6 +3084,10 @@
|
|
|
3066
3084
|
"$kind": "TypeDefinition",
|
|
3067
3085
|
"UnderlyingType": "Edm.String"
|
|
3068
3086
|
},
|
|
3087
|
+
"Core.QualifiedActionName": {
|
|
3088
|
+
"$kind": "TypeDefinition",
|
|
3089
|
+
"UnderlyingType": "Edm.String"
|
|
3090
|
+
},
|
|
3069
3091
|
"Core.LocalDateTime": {
|
|
3070
3092
|
"$kind": "TypeDefinition",
|
|
3071
3093
|
"UnderlyingType": "Edm.String"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
e80280336eed20b6633835d33df8ec76
|