/// <summary> /// Creates a new DBObject of a given GraphType inserts its UUID into all indices of the given GraphType. /// </summary> /// <param name="_graphDBType">The GraphType of the DBObject to create</param> /// <param name="myDBObjectAttributes">A dictionary of attributes for the new DBObject</param> /// <param name="mySpecialTypeAttributes">Special values which should be set to a object</param> /// <param name="myCheckUniqueness">check for unique constraints</param> /// <returns>The UUID of the new DBObject</returns> public Exceptional<DBObjectStream> CreateNewDBObjectStream(GraphDBType myGraphDBType, Dictionary<AttributeUUID, IObject> myDBObjectAttributes, Dictionary<String, IObject> myUndefAttributes, Dictionary<ASpecialTypeAttribute, Object> mySpecialTypeAttributes, SessionSettings mySessionSettings, Boolean myCheckUniqueness) { #region Input validation if (myGraphDBType == null) return new Exceptional<DBObjectStream>(new Error_ArgumentNullOrEmpty("The parameter myGraphType must not be null!")); if (myDBObjectAttributes == null) return new Exceptional<DBObjectStream>(new Error_ArgumentNullOrEmpty("The parameter myDBObjectAttributes must not be null!")); #endregion #region Check uniqueness if (myCheckUniqueness) { var parentTypes = _DBContext.DBTypeManager.GetAllParentTypes(myGraphDBType, true, false); var CheckVal = _DBContext.DBIndexManager.CheckUniqueConstraint(myGraphDBType, parentTypes, myDBObjectAttributes); if (CheckVal.Failed()) return new Exceptional<DBObjectStream>(CheckVal); } #endregion #region Create a new DBObjectStream DBObjectStream _NewDBObjectStream = null; ObjectUUID _NewObjectUUID = null; ASpecialTypeAttribute _SpecialTypeAttribute_UUID_Key = new SpecialTypeAttribute_UUID(); Object _SpecialTypeAttribute_UUID_Value = null; #region Search for an user-defined ObjectUUID if (mySpecialTypeAttributes != null) { if (mySpecialTypeAttributes.TryGetValue(_SpecialTypeAttribute_UUID_Key, out _SpecialTypeAttribute_UUID_Value)) { // User-defined ObjectUUID of _graphDBType UInt64 var _ValueAsUInt64 = _SpecialTypeAttribute_UUID_Value as UInt64?; if (_ValueAsUInt64 != null) _NewObjectUUID = new ObjectUUID(_ValueAsUInt64.Value); // User-defined ObjectUUID of _graphDBType String or anything else... else { var _String = _SpecialTypeAttribute_UUID_Value.ToString(); if (_String == null || _String == "") return new Exceptional<DBObjectStream>(new Error_InvalidAttributeValue(SpecialTypeAttribute_UUID.AttributeName, _String)); _NewObjectUUID = new ObjectUUID(_SpecialTypeAttribute_UUID_Value.ToString()); } mySpecialTypeAttributes[_SpecialTypeAttribute_UUID_Key] = _NewObjectUUID; } } #endregion // If _NewObjectUUID == null a new one will be generated! if (_NewObjectUUID == null) { _NewObjectUUID = ObjectUUID.NewUUID; } _NewDBObjectStream = new DBObjectStream(_NewObjectUUID, myGraphDBType, myDBObjectAttributes, new ObjectLocation(myGraphDBType.ObjectLocation, DBConstants.DBObjectsLocation, _NewObjectUUID.ToString())); #endregion #region Check for duplicate ObjectUUIDs... maybe resolve duplicates! var _DBObjectStreamAlreadyExistsResult = ObjectExistsOnFS(_NewDBObjectStream); if (_DBObjectStreamAlreadyExistsResult.Failed()) return new Exceptional<DBObjectStream>(_DBObjectStreamAlreadyExistsResult); while (_DBObjectStreamAlreadyExistsResult.Value == Trinary.TRUE) { if (_SpecialTypeAttribute_UUID_Value != null) { //so there was an explicit UUID return new Exceptional<DBObjectStream>(new Error_DBObjectCollision(_NewDBObjectStream)); } var newUUID = ObjectUUID.NewUUID; _NewDBObjectStream = new DBObjectStream(newUUID, myGraphDBType, myDBObjectAttributes, new ObjectLocation(myGraphDBType.ObjectLocation, DBConstants.DBObjectsLocation, newUUID.ToString())); _DBObjectStreamAlreadyExistsResult = ObjectExistsOnFS(_NewDBObjectStream); if (_DBObjectStreamAlreadyExistsResult.Failed()) return new Exceptional<DBObjectStream>(_DBObjectStreamAlreadyExistsResult); } #endregion #region Check for ExtractSetting attributes unlike UUID if (mySpecialTypeAttributes != null && mySpecialTypeAttributes.Any()) { foreach (var _SpecialAttribute in mySpecialTypeAttributes) { // Skip SpecialTypeAttribute_UUID! if (!(_SpecialAttribute.Key is SpecialTypeAttribute_UUID)) { var result = _SpecialAttribute.Key.ApplyTo(_NewDBObjectStream, _SpecialAttribute.Value); if (result.Failed()) { return new Exceptional<DBObjectStream>(result); } } } } #endregion // Flush new DBObject var flushResult = FlushDBObject(_NewDBObjectStream); if (flushResult.Failed()) return new Exceptional<DBObjectStream>(flushResult); #region Add UUID of the new DBObject to all indices of myGraphType var uuidIndex = myGraphDBType.GetUUIDIndex(_DBContext); uuidIndex.Insert(_NewDBObjectStream, myGraphDBType, _DBContext); foreach (var _GraphDBType in _DBContext.DBTypeManager.GetAllParentTypes(myGraphDBType, true, false)) { foreach (var _AAttributeIndex in _GraphDBType.GetAllAttributeIndices(_DBContext, false)) { //Find out if the dbobject carries all necessary attributes if (_NewDBObjectStream.HasAtLeastOneAttribute(_AAttributeIndex.IndexKeyDefinition.IndexKeyAttributeUUIDs, _GraphDBType, mySessionSettings)) { //valid dbo for idx _AAttributeIndex.Insert(_NewDBObjectStream, _GraphDBType, _DBContext); } } } #endregion #region add undefined attributes to the object if (!myUndefAttributes.IsNullOrEmpty()) { foreach (var item in myUndefAttributes) { var addExcept = _NewDBObjectStream.AddUndefinedAttribute(item.Key, item.Value, this); if (addExcept.Failed()) { return new Exceptional<DBObjectStream>(addExcept); } } } #endregion return new Exceptional<DBObjectStream>(_NewDBObjectStream); }