@sap/odata-v4
Version:
OData V4.0 server library
147 lines (118 loc) • 6.58 kB
JavaScript
'use strict';
const CsdlExpressionKinds = require('../../csdl/annotationExpression/CsdlAnnotationExpression').kinds;
const EdmAnnotationPathExpression = require('./EdmAnnotationPathExpression');
const EdmApplyExpression = require('./EdmApplyExpression');
const EdmArithmeticExpression = require('./EdmArithmeticExpression');
const EdmBinaryExpression = require('./EdmBinaryExpression');
const EdmCastExpression = require('./EdmCastExpression');
const EdmCollectionExpression = require('./EdmCollectionExpression');
const EdmConstantExpression = require('./EdmConstantExpression');
const EdmIfExpression = require('./EdmIfExpression');
const EdmIsOfExpression = require('./EdmIsOfExpression');
const EdmLabeledElementExpression = require('./EdmLabeledElementExpression');
const EdmLabeledElementReferenceExpression = require('./EdmLabeledElementReferenceExpression');
const EdmModelElementPathExpression = require('./EdmModelElementPathExpression');
const EdmNavigationPropertyPathExpression = require('./EdmNavigationPropertyPathExpression');
const EdmNegationExpression = require('./EdmNegationExpression');
const EdmNotExpression = require('./EdmNotExpression');
const EdmNullExpression = require('./EdmNullExpression');
const EdmPathExpression = require('./EdmPathExpression');
const EdmPropertyPathExpression = require('./EdmPropertyPathExpression');
const EdmPropertyValueExpression = require('./EdmPropertyValueExpression');
const EdmRecordExpression = require('./EdmRecordExpression');
const EdmUrlRefExpression = require('./EdmUrlRefExpression');
/**
* Factory to build Edm annotation expressions from Csdl annotation expressions.
*
* !!!This is not implemented as class and so module.exports is not reassigned. This is important to resolve
* cyclic dependencies!!!
*/
/**
* Builds a expression tree from nested CsdlAnnotationExpression classes. The returned tree is build with nodes of type
* EdmAnnotationExpression.
*
* @param {Edm} edm The edm itself
* @param {CsdlAnnotationExpression} csdlExpression a
* valid CsdlAnnotationExpression (it must contain a kind attribute)
* @returns {EdmAnnotationExpression} Tree of Edm annotation expressions
*/
module.exports.createEdmExpressionFromCsdlExpression =
function createEdmExpressionFromCsdlExpression(edm, csdlExpression) {
switch (csdlExpression.kind) {
case CsdlExpressionKinds.AnnotationPath:
// noinspection JSCheckFunctionSignatures
return new EdmAnnotationPathExpression(csdlExpression);
case CsdlExpressionKinds.Apply:
// noinspection JSCheckFunctionSignatures
return new EdmApplyExpression(edm, csdlExpression);
case CsdlExpressionKinds.Arithmetic:
return new EdmArithmeticExpression(edm, csdlExpression);
case CsdlExpressionKinds.Binary:
// noinspection JSCheckFunctionSignatures
return new EdmBinaryExpression(edm, csdlExpression);
case CsdlExpressionKinds.Cast:
// noinspection JSCheckFunctionSignatures
return new EdmCastExpression(edm, csdlExpression);
case CsdlExpressionKinds.Collection:
// noinspection JSCheckFunctionSignatures
return new EdmCollectionExpression(edm, csdlExpression);
case CsdlExpressionKinds.Constant:
return new EdmConstantExpression(edm, csdlExpression);
case CsdlExpressionKinds.If:
// noinspection JSCheckFunctionSignatures
return new EdmIfExpression(edm, csdlExpression);
case CsdlExpressionKinds.IsOf:
// noinspection JSCheckFunctionSignatures
return new EdmIsOfExpression(edm, csdlExpression);
case CsdlExpressionKinds.LabeledElement:
// noinspection JSCheckFunctionSignatures
return new EdmLabeledElementExpression(edm, csdlExpression);
case CsdlExpressionKinds.LabeledElementReference:
// noinspection JSCheckFunctionSignatures
return new EdmLabeledElementReferenceExpression(csdlExpression);
case CsdlExpressionKinds.ModelElementPath:
return new EdmModelElementPathExpression(csdlExpression);
case CsdlExpressionKinds.NavigationPropertyPath:
// noinspection JSCheckFunctionSignatures
return new EdmNavigationPropertyPathExpression(csdlExpression);
case CsdlExpressionKinds.Null:
// noinspection JSCheckFunctionSignatures
return new EdmNullExpression(edm, csdlExpression);
case CsdlExpressionKinds.Path:
// noinspection JSCheckFunctionSignatures
return new EdmPathExpression(csdlExpression);
case CsdlExpressionKinds.PropertyPath:
// noinspection JSCheckFunctionSignatures
return new EdmPropertyPathExpression(csdlExpression);
case CsdlExpressionKinds.PropertyValue:
// noinspection JSCheckFunctionSignatures
return new EdmPropertyValueExpression(edm, csdlExpression);
case CsdlExpressionKinds.Record:
// noinspection JSCheckFunctionSignatures
return new EdmRecordExpression(edm, csdlExpression);
case CsdlExpressionKinds.Negation:
return new EdmNegationExpression(edm, csdlExpression);
case CsdlExpressionKinds.Not:
// noinspection JSCheckFunctionSignatures
return new EdmNotExpression(edm, csdlExpression);
case CsdlExpressionKinds.UrlRef:
// noinspection JSCheckFunctionSignatures
return new EdmUrlRefExpression(edm, csdlExpression);
default:
return null;
}
};
/**
* Creates an EdmAnnotation from a given CsdlAnnotation
*
* @param {Edm} edm The edm itself
* @param {CsdlAnnotation} annotation Csdl annotation
* @returns {EdmAnnotation}
*/
module.exports.createAnnotation = function createAnnotation(edm, annotation) {
// This avoids an error in the cyclic dependency chain:
// anywhere->require('EdmAnnotation')->require('AnnotationExpressionFactory')->require('EdmAnnotation')
// EdmAnnotation replaces module.exports which actually destroys the chain
const EdmAnnotation = require('../EdmAnnotation'); // eslint-disable-line global-require
return new EdmAnnotation(edm, annotation);
};