/// <summary> /// Removes an attribute of the given type. /// </summary> /// <param name="aUserType">The target type.</param> /// <param name="attributeUUID">The attribute uuid, referencing the deprecated attribute.</param> /// <returns></returns> private Exceptional<ResultType> RemoveAttributeOfType(GraphDBType aUserType, AttributeUUID attributeUUID) { #region INPUT EXCEPTIONS if (aUserType == null) { return new Exceptional<ResultType>(new Error_ArgumentNullOrEmpty("aUserType")); } #endregion #region remove attribute from type TypeAttribute typeAttribute = aUserType.Attributes[attributeUUID]; if (typeAttribute != null) { aUserType.RemoveAttribute(typeAttribute.UUID); var FlushExcept = FlushType(aUserType); if (FlushExcept.Failed()) { aUserType.AddAttribute(typeAttribute, this, false); return new Exceptional<ResultType>(FlushExcept); } #region update lookup tables ob sub-classes foreach (var aSubType in GetAllSubtypes(aUserType).Where(aType => aType != aUserType)) { //delete from lookuptable aSubType.RemoveAttributeFromLookupTable(typeAttribute.UUID); } #endregion } else { return new Exceptional<ResultType>(new Error_AttributeIsNotDefined(aUserType.Name, typeAttribute.Name)); } #endregion return new Exceptional<ResultType>(ResultType.Successful); }
public override Exceptional Execute(DBContext dbContext, GraphDBType graphDBType) { var listOfTypeAttrs = new List<TypeAttribute>(); var retExcept = new Exceptional(); foreach (var attr in _ListOfAttributes) { var typeAttr = graphDBType.GetTypeAttributeByName(attr); if (typeAttr == null) { return new Exceptional(new Error_AttributeIsNotDefined(attr)); } var attrType = dbContext.DBTypeManager.GetTypeByUUID(typeAttr.DBTypeUUID); if (attrType == null) return new Exceptional(new Error_TypeDoesNotExist("")); if (attrType.IsUserDefined) return new Exceptional(new Error_InvalidReferenceAssignmentOfUndefAttr()); listOfTypeAttrs.Add(typeAttr); } var dbobjects = dbContext.DBObjectCache.SelectDBObjectsForLevelKey(new LevelKey(graphDBType, dbContext.DBTypeManager), dbContext); foreach (var item in dbobjects) { if (!item.Success()) { retExcept.PushIExceptional(item); } else { foreach (var attr in listOfTypeAttrs) { if (item.Value.HasAttribute(attr.UUID, graphDBType)) { var attrVal = item.Value.GetAttribute(attr.UUID); var addExcept = item.Value.AddUndefinedAttribute(attr.Name, attrVal, dbContext.DBObjectManager); if (!addExcept.Success()) retExcept.PushIExceptional(addExcept); item.Value.RemoveAttribute(attr.UUID); var saveExcept = dbContext.DBObjectManager.FlushDBObject(item.Value); if (!saveExcept.Success()) retExcept.PushIExceptional(saveExcept); } } } } var indices = graphDBType.GetAllAttributeIndices(); List<AAttributeIndex> idxToDelete = new List<AAttributeIndex>(); //remove attributes from type foreach (var attr in listOfTypeAttrs) { foreach (var item in indices) { var index = item.IndexKeyDefinition.IndexKeyAttributeUUIDs.Find(idx => idx == attr.UUID); if (index != null && item.IndexKeyDefinition.IndexKeyAttributeUUIDs.Count == 1) { idxToDelete.Add(item); } } //remove indices foreach (var idx in idxToDelete) { var remExcept = graphDBType.RemoveIndex(idx.IndexName, idx.IndexEdition, dbContext.DBTypeManager); if (!remExcept.Success()) { retExcept.PushIExceptional(remExcept); } } idxToDelete.Clear(); graphDBType.RemoveAttribute(attr.UUID); var flushExcept = dbContext.DBTypeManager.FlushType(graphDBType); if (!flushExcept.Success()) { retExcept.PushIExceptional(flushExcept); } } return retExcept; }