@finos/legend-graph
Version:
Legend graph and graph manager
249 lines • 12.3 kB
JavaScript
/**
* Copyright (c) 2020-present, Goldman Sachs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { createModelSchema, primitive, raw, serialize, deserialize, custom, alias, optional, SKIP, } from 'serializr';
import { usingConstantValueSchema, UnsupportedOperationError, usingModelSchema, customList, optionalCustomList, optionalCustomListWithSchema, isString, } from '@finos/legend-shared';
import { V1_RawLambda } from '../../../model/rawValueSpecification/V1_RawLambda.js';
import { V1_RawGenericType, V1_RawRawType, V1_RawVariable, } from '../../../model/rawValueSpecification/V1_RawVariable.js';
import { V1_multiplicityModelSchema } from '../../../transformation/pureProtocol/serializationHelpers/V1_CoreSerializationHelper.js';
import { V1_RawBaseExecutionContext } from '../../../model/rawValueSpecification/V1_RawExecutionContext.js';
import { V1_RawPrimitiveInstanceValue } from '../../../model/rawValueSpecification/V1_RawPrimitiveInstanceValue.js';
import { CORE_PURE_PATH, PRIMITIVE_TYPE, } from '../../../../../../../graph/MetaModelConst.js';
import { V1_Type_Type } from './V1_TypeSerializationHelper.js';
import { V1_Multiplicity } from '../../../model/packageableElements/domain/V1_Multiplicity.js';
import { matchFunctionName } from '../../../../../../../graph/MetaModelUtils.js';
var V1_RawExecutionContextType;
(function (V1_RawExecutionContextType) {
V1_RawExecutionContextType["BASE_EXECUTION_CONTEXT"] = "BaseExecutionContext";
})(V1_RawExecutionContextType || (V1_RawExecutionContextType = {}));
export var V1_RawValueSpecificationType;
(function (V1_RawValueSpecificationType) {
V1_RawValueSpecificationType["LAMBDA"] = "lambda";
V1_RawValueSpecificationType["VARIABLE"] = "var";
V1_RawValueSpecificationType["CINTEGER"] = "integer";
V1_RawValueSpecificationType["CDECIMAL"] = "decimal";
V1_RawValueSpecificationType["CSTRING"] = "string";
V1_RawValueSpecificationType["CBOOLEAN"] = "boolean";
V1_RawValueSpecificationType["CFLOAT"] = "float";
V1_RawValueSpecificationType["CDATETIME"] = "dateTime";
V1_RawValueSpecificationType["CSTRICTDATE"] = "strictDate";
V1_RawValueSpecificationType["CSTRICTTIME"] = "strictTime";
V1_RawValueSpecificationType["CLATESTDATE"] = "latestDate";
V1_RawValueSpecificationType["CDATE"] = "date";
})(V1_RawValueSpecificationType || (V1_RawValueSpecificationType = {}));
const rawRawTypeSchemaModel = createModelSchema(V1_RawRawType, {
_type: usingConstantValueSchema(V1_Type_Type.PACKAGEABLE_TYPE),
fullPath: primitive(),
});
const V1_RawGenericTypeSchemaModelInner = createModelSchema(V1_RawGenericType, {
multiplicityArguments: customList((val) => serialize(V1_multiplicityModelSchema, val), (val) => deserialize(V1_multiplicityModelSchema, val), {
INTERNAL__forceReturnEmptyInTest: true,
}),
rawType: usingConstantValueSchema(rawRawTypeSchemaModel),
typeArguments: optionalCustomList(
// To avoid circular dependency, we need to use V1_RawGenericType object model schema
// instead of the static V1_RawGenericType model schema
(value) => serialize(V1_RawGenericType, value), (value) => deserialize(V1_RawGenericType, value), {
INTERNAL__forceReturnEmptyInTest: true,
}),
typeVariableValues: optionalCustomList(
// TODO
(value) => SKIP, (value) => SKIP, {
INTERNAL__forceReturnEmptyInTest: true,
}),
});
const V1_RawGenericTypeSchemaModel = createModelSchema(V1_RawGenericType, {
multiplicityArguments: customList((val) => serialize(V1_multiplicityModelSchema, val), (val) => deserialize(V1_multiplicityModelSchema, val), {
INTERNAL__forceReturnEmptyInTest: true,
}),
rawType: usingModelSchema(rawRawTypeSchemaModel),
typeArguments: optionalCustomListWithSchema(V1_RawGenericTypeSchemaModelInner, {
INTERNAL__forceReturnEmptyInTest: true,
}),
typeVariableValues: optionalCustomList(
// TODO
(value) => SKIP, (value) => SKIP, {
INTERNAL__forceReturnEmptyInTest: true,
}),
});
const V1_deserializeRawGenericType = (val) => {
let genericType;
/** @backwardCompatibility */
if (isString(val)) {
genericType = new V1_RawGenericType();
const packageableType = new V1_RawRawType();
packageableType.fullPath = val;
genericType.rawType = packageableType;
}
else {
genericType = deserialize(V1_RawGenericTypeSchemaModel, val);
}
if (matchFunctionName(genericType.rawType.fullPath, CORE_PURE_PATH.TABULAR_RESULT) &&
!genericType.multiplicityArguments.length &&
!genericType.typeArguments.length) {
genericType.multiplicityArguments = [new V1_Multiplicity(1, undefined)];
const _anytype = new V1_RawRawType();
_anytype.fullPath = CORE_PURE_PATH.ANY;
const arGenType = new V1_RawGenericType();
arGenType.rawType = _anytype;
genericType.typeArguments = [arGenType];
}
return genericType;
};
export const V1_rawBaseExecutionContextModelSchema = createModelSchema(V1_RawBaseExecutionContext, {
_type: usingConstantValueSchema(V1_RawExecutionContextType.BASE_EXECUTION_CONTEXT),
queryTimeOutInSeconds: primitive(),
enableConstraints: primitive(),
});
export const V1_rawLambdaModelSchema = createModelSchema(V1_RawLambda, {
_type: usingConstantValueSchema(V1_RawValueSpecificationType.LAMBDA),
body: raw(),
parameters: raw(),
});
export const V1_rawVariableModelSchema = createModelSchema(V1_RawVariable, {
_type: usingConstantValueSchema(V1_RawValueSpecificationType.VARIABLE),
genericType: custom((val) => serialize(V1_RawGenericTypeSchemaModel, val), (val) => V1_deserializeRawGenericType(val), {
beforeDeserialize: function (callback, jsonValue, jsonParentValue) {
/** @backwardCompatibility */
if (jsonParentValue.class !== undefined &&
jsonParentValue.genericType === undefined) {
callback(null, jsonParentValue.class);
}
else {
callback(null, jsonValue);
}
},
}),
multiplicity: usingModelSchema(V1_multiplicityModelSchema),
name: primitive(),
});
export const V1_rawPrimitiveInstanceValueSchema = createModelSchema(V1_RawPrimitiveInstanceValue, {
type: alias('_type', custom((val) => {
switch (val) {
case PRIMITIVE_TYPE.INTEGER:
return V1_RawValueSpecificationType.CINTEGER;
case PRIMITIVE_TYPE.DECIMAL:
return V1_RawValueSpecificationType.CDECIMAL;
case PRIMITIVE_TYPE.STRING:
return V1_RawValueSpecificationType.CSTRING;
case PRIMITIVE_TYPE.BOOLEAN:
return V1_RawValueSpecificationType.CBOOLEAN;
case PRIMITIVE_TYPE.FLOAT:
return V1_RawValueSpecificationType.CFLOAT;
case PRIMITIVE_TYPE.DATETIME:
return V1_RawValueSpecificationType.CDATETIME;
case PRIMITIVE_TYPE.STRICTDATE:
return V1_RawValueSpecificationType.CSTRICTDATE;
case PRIMITIVE_TYPE.STRICTTIME:
return V1_RawValueSpecificationType.CSTRICTTIME;
case PRIMITIVE_TYPE.LATESTDATE:
return V1_RawValueSpecificationType.CLATESTDATE;
default:
throw new UnsupportedOperationError(`Can't serialize raw instance value type '${val}'`);
}
}, (val) => {
switch (val) {
case V1_RawValueSpecificationType.CINTEGER:
return PRIMITIVE_TYPE.INTEGER;
case V1_RawValueSpecificationType.CDECIMAL:
return PRIMITIVE_TYPE.DECIMAL;
case V1_RawValueSpecificationType.CSTRING:
return PRIMITIVE_TYPE.STRING;
case V1_RawValueSpecificationType.CBOOLEAN:
return PRIMITIVE_TYPE.BOOLEAN;
case V1_RawValueSpecificationType.CFLOAT:
return PRIMITIVE_TYPE.FLOAT;
case V1_RawValueSpecificationType.CDATETIME:
return PRIMITIVE_TYPE.DATETIME;
case V1_RawValueSpecificationType.CSTRICTDATE:
return PRIMITIVE_TYPE.STRICTDATE;
case V1_RawValueSpecificationType.CSTRICTTIME:
return PRIMITIVE_TYPE.STRICTTIME;
case V1_RawValueSpecificationType.CLATESTDATE:
return PRIMITIVE_TYPE.LATESTDATE;
default:
throw new UnsupportedOperationError(`Can't deserialize raw value instance value type '${val}'`);
}
})),
value: optional(primitive()),
});
/** @backwardCompatibility */
const deserializePrimitiveInstanceValue = (json) => deserialize(V1_rawPrimitiveInstanceValueSchema, {
...json,
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
value: Array.isArray(json.values) && json.values.length === 1
? json.values[0]
: json.value,
});
class V1_RawValueSpecificationSerializer {
visit_Lambda(rawValueSpecification) {
return serialize(V1_rawLambdaModelSchema, rawValueSpecification);
}
visit_Variable(rawValueSpecification) {
return serialize(V1_rawVariableModelSchema, rawValueSpecification);
}
visit_PrimitiveInstanceValue(rawValueSpecification) {
return serialize(V1_rawPrimitiveInstanceValueSchema, rawValueSpecification);
}
}
export function V1_serializeRawValueSpecification(protocol) {
return protocol.accept_RawValueSpecificationVisitor(new V1_RawValueSpecificationSerializer());
}
export function V1_deserializeRawValueSpecification(json) {
switch (json._type) {
case V1_RawValueSpecificationType.LAMBDA:
return deserialize(V1_rawLambdaModelSchema, json);
case V1_RawValueSpecificationType.VARIABLE:
return deserialize(V1_rawVariableModelSchema, json);
case V1_RawValueSpecificationType.CINTEGER:
case V1_RawValueSpecificationType.CDECIMAL:
case V1_RawValueSpecificationType.CSTRING:
case V1_RawValueSpecificationType.CBOOLEAN:
case V1_RawValueSpecificationType.CFLOAT:
case V1_RawValueSpecificationType.CDATETIME:
case V1_RawValueSpecificationType.CSTRICTDATE:
case V1_RawValueSpecificationType.CSTRICTTIME:
case V1_RawValueSpecificationType.CLATESTDATE:
return deserializePrimitiveInstanceValue(json);
default:
throw new UnsupportedOperationError(`Can't deserialize raw value specification of type '${json._type}'`);
}
}
export function V1_deserializeRawValueSpecificationType(type) {
switch (type) {
case PRIMITIVE_TYPE.INTEGER:
return V1_RawValueSpecificationType.CINTEGER;
case PRIMITIVE_TYPE.DECIMAL:
return V1_RawValueSpecificationType.CDECIMAL;
case PRIMITIVE_TYPE.STRING:
return V1_RawValueSpecificationType.CSTRING;
case PRIMITIVE_TYPE.BOOLEAN:
return V1_RawValueSpecificationType.CBOOLEAN;
case PRIMITIVE_TYPE.FLOAT:
return V1_RawValueSpecificationType.CFLOAT;
case PRIMITIVE_TYPE.DATE:
case PRIMITIVE_TYPE.DATETIME:
return V1_RawValueSpecificationType.CDATETIME;
case PRIMITIVE_TYPE.STRICTDATE:
return V1_RawValueSpecificationType.CSTRICTDATE;
case PRIMITIVE_TYPE.STRICTTIME:
return V1_RawValueSpecificationType.CSTRICTTIME;
case PRIMITIVE_TYPE.LATESTDATE:
return V1_RawValueSpecificationType.CLATESTDATE;
default:
throw new UnsupportedOperationError(`Can't serialize raw instance value type '${type}'`);
}
}
//# sourceMappingURL=V1_RawValueSpecificationSerializationHelper.js.map