UNPKG

@harishreddym/baqend

Version:

Baqend JavaScript SDK

164 lines (145 loc) 3.78 kB
'use strict'; const Accessor = require('../binding/Accessor'); /** * @alias metamodel.Attribute */ class Attribute { /** * Returns the persistent attribute type * @type Attribute.PersistentAttributeType * @readonly */ get persistentAttributeType() { return -1; } /** * @type boolean * @readonly */ get isAssociation() { return this.persistentAttributeType > Attribute.PersistentAttributeType.EMBEDDED; } /** * @type boolean * @readonly */ get isCollection() { return this.persistentAttributeType === Attribute.PersistentAttributeType.ELEMENT_COLLECTION; } /** * @param {string} name The attribute name * @param {boolean=} isMetadata <code>true</code> if the attribute is an metadata attribute */ constructor(name, isMetadata) { /** @type boolean */ this.isMetadata = !!isMetadata; /** @type boolean */ this.isId = false; /** @type boolean */ this.isVersion = false; /** @type boolean */ this.isAcl = false; /** @type string */ this.name = name; /** @type number */ this.order = null; /** @type binding.Accessor */ this.accessor = null; /** @type metamodel.ManagedType */ this.declaringType = null; /** @type Object<string,string>|null */ this.metadata = null; } /** * @param {metamodel.ManagedType} declaringType The type that owns this attribute * @param {number} order Position of the attribute * @return {void} */ init(declaringType, order) { if (this.declaringType) { throw new Error('The attribute is already initialized.'); } this.order = order; this.accessor = new Accessor(); this.declaringType = declaringType; } /** * @param {Object} entity * @return {*} */ getValue(entity) { return this.accessor.getValue(entity, this); } /** * @param {Object} entity * @param {*} value * @return {void} */ setValue(entity, value) { this.accessor.setValue(entity, this, value); } /** * Retrieves whether this type has specific metadata * * @param {string} key * @return {boolean} */ hasMetadata(key) { return this.metadata && !!this.metadata[key]; } /** * Gets some metadata of this type * * @param {string} key * @return {null|string} */ getMetadata(key) { if (!this.hasMetadata(key)) { return null; } return this.metadata[key]; } /** * Gets this attribute value form the object as json * @param {util.Metadata} state The root object state * @param {*} object The object which contains the value of this attribute * @param {Object} options additional options which are applied through the conversion * @return {*} The converted json value * @abstract */ getJsonValue(state, object, options) {} // eslint-disable-line no-unused-vars /** * Sets this attribute value from json to the object * @param {util.Metadata} state The root state * @param {*} object The object which contains the attribute * @param {*} jsonValue The json value to convert an set * @param {Object} options additional options which are applied through the conversion * @return {void} * @abstract */ setJsonValue(state, object, jsonValue, options) {} // eslint-disable-line no-unused-vars /** * Converts this attribute field to json * @return {json} The attribute description as json */ toJSON() { return { name: this.name, metadata: this.metadata || undefined, order: this.order, }; } } /** * @enum {number} */ Attribute.PersistentAttributeType = { BASIC: 0, ELEMENT_COLLECTION: 1, EMBEDDED: 2, MANY_TO_MANY: 3, MANY_TO_ONE: 4, ONE_TO_MANY: 5, ONE_TO_ONE: 6, }; module.exports = Attribute;