public void GetContent(CompilerContext context, ParseTreeNode parseNode) { var content = parseNode.FirstChild.AstNode as AddToListAttrUpdateNode; AttributeUpdateList = content.AttributeUpdateList; base.ParsingResult.PushIExceptional(content.ParsingResult); }
protected Exceptional<Boolean> RemoveBackwardEdgesOnReferences(AAttributeAssignOrUpdate myAAttributeAssign, IReferenceEdge myReference, DBObjectStream myDBObject, DBContext myDBContext) { foreach (var item in myReference.GetAllReferenceIDs()) { var streamExcept = myDBContext.DBObjectCache.LoadDBObjectStream(myAAttributeAssign.AttributeIDChain.LastAttribute.GetDBType(myDBContext.DBTypeManager), (ObjectUUID)item); if (!streamExcept.Success()) return new Exceptional<Boolean>(streamExcept.IErrors.First()); var removeExcept = myDBContext.DBObjectManager.RemoveBackwardEdge(streamExcept.Value, myAAttributeAssign.AttributeIDChain.LastAttribute.RelatedGraphDBTypeUUID, myAAttributeAssign.AttributeIDChain.LastAttribute.UUID, myDBObject.ObjectUUID); if (!removeExcept.Success()) return new Exceptional<Boolean>(removeExcept.IErrors.First()); } return new Exceptional<Boolean>(true); }
internal Exceptional<Tuple<String, TypeAttribute, IObject>> ApplyAssignAttribute(AAttributeAssignOrUpdate myAAttributeAssign, DBContext myDBContext, DBObjectStream myDBObject, GraphDBType myGraphDBType) { System.Diagnostics.Debug.Assert(myAAttributeAssign != null); //get value for assignement var aValue = myAAttributeAssign.GetValueForAttribute(myDBObject, myDBContext, myGraphDBType); if (aValue.Failed()) { return new Exceptional<Tuple<String, TypeAttribute, IObject>>(aValue); } object oldValue = null; IObject newValue = aValue.Value; if (myDBObject.HasAttribute(myAAttributeAssign.AttributeIDChain.LastAttribute.UUID, myGraphDBType)) { #region Update the value because it already exists oldValue = myDBObject.GetAttribute(myAAttributeAssign.AttributeIDChain.LastAttribute, myGraphDBType, myDBContext).Value; switch (myAAttributeAssign.AttributeIDChain.LastAttribute.KindOfType) { case KindsOfType.SetOfReferences: var typeOfCollection = ((AttributeAssignOrUpdateList)myAAttributeAssign).CollectionDefinition.CollectionType; if (typeOfCollection == CollectionType.List) return new Exceptional<Tuple<String, TypeAttribute, IObject>>(new Error_InvalidAssignOfSet(myAAttributeAssign.AttributeIDChain.LastAttribute.Name)); var removeRefExcept = RemoveBackwardEdgesOnReferences(myAAttributeAssign, (IReferenceEdge)oldValue, myDBObject, myDBContext); if (!removeRefExcept.Success()) return new Exceptional<Tuple<String, TypeAttribute, IObject>>(removeRefExcept.IErrors.First()); newValue = (ASetOfReferencesEdgeType)newValue; break; case KindsOfType.SetOfNoneReferences: case KindsOfType.ListOfNoneReferences: newValue = (IBaseEdge)newValue; break; case KindsOfType.SingleNoneReference: if (!(oldValue as ADBBaseObject).IsValidValue((newValue as ADBBaseObject).Value)) { return new Exceptional<Tuple<string, TypeAttribute, IObject>>(new Error_DataTypeDoesNotMatch((oldValue as ADBBaseObject).ObjectName, (newValue as ADBBaseObject).ObjectName)); } newValue = (oldValue as ADBBaseObject).Clone((newValue as ADBBaseObject).Value); break; case KindsOfType.SingleReference: if (newValue is ASingleReferenceEdgeType) { removeRefExcept = RemoveBackwardEdgesOnReferences(myAAttributeAssign, (IReferenceEdge)oldValue, myDBObject, myDBContext); if (!removeRefExcept.Success()) return new Exceptional<Tuple<String, TypeAttribute, IObject>>(removeRefExcept.IErrors.First()); ((ASingleReferenceEdgeType)oldValue).Merge((ASingleReferenceEdgeType)newValue); newValue = (ASingleReferenceEdgeType)oldValue; } break; case KindsOfType.SpecialAttribute: // Special attributes can't be updated currently if ((newValue as DBString) != null && (newValue as DBString).CompareTo(oldValue) == 0) { return new Exceptional<Tuple<string, GraphDB.TypeManagement.TypeAttribute, GraphDB.TypeManagement.IObject>>(new Tuple<string, GraphDB.TypeManagement.TypeAttribute, GraphDB.TypeManagement.IObject>(myAAttributeAssign.AttributeIDChain.LastAttribute.Name, myAAttributeAssign.AttributeIDChain.LastAttribute, newValue as IObject)); } else { return new Exceptional<Tuple<String, TypeAttribute, IObject>>(new Error_NotImplemented(new System.Diagnostics.StackTrace(true))); } break; default: return new Exceptional<Tuple<String, TypeAttribute, IObject>>(new Error_NotImplemented(new System.Diagnostics.StackTrace(true))); } #endregion } var alterExcept = myDBObject.AlterAttribute(myAAttributeAssign.AttributeIDChain.LastAttribute.UUID, newValue); if (alterExcept.Failed()) return new Exceptional<Tuple<string, TypeAttribute, IObject>>(alterExcept); if (!alterExcept.Value) { myDBObject.AddAttribute(myAAttributeAssign.AttributeIDChain.LastAttribute.UUID, newValue); } #region add backward edges if (myAAttributeAssign.AttributeIDChain.LastAttribute.GetDBType(myDBContext.DBTypeManager).IsUserDefined) { Dictionary<AttributeUUID, IObject> userdefinedAttributes = new Dictionary<AttributeUUID, IObject>(); userdefinedAttributes.Add(myAAttributeAssign.AttributeIDChain.LastAttribute.UUID, newValue); var omm = new ObjectManipulationManager(myDBContext, myGraphDBType); var setBackEdges = omm.SetBackwardEdges(userdefinedAttributes, myDBObject.ObjectUUID); if (setBackEdges.Failed()) return new Exceptional<Tuple<string, TypeAttribute, IObject>>(setBackEdges); } #endregion return new Exceptional<Tuple<String, TypeAttribute, IObject>>(new Tuple<String, TypeAttribute, IObject>(myAAttributeAssign.AttributeIDChain.LastAttribute.Name, myAAttributeAssign.AttributeIDChain.LastAttribute, newValue)); }
private void GetContent(CompilerContext context, ParseTreeNode parseNode) { #region get myAttributeName _AttributeIDNode = ((IDNode)parseNode.ChildNodes[0].AstNode).IDChainDefinition; var attributeType = GraphDBTypeMapper.ConvertGraph2CSharp(parseNode.ChildNodes[2].Term.GetType().Name); #endregion var _Node = parseNode.ChildNodes[2]; if (_Node.Token != null) { AttributeValue = new AttributeAssignOrUpdateValue(_AttributeIDNode, attributeType, _Node.Token.Value); } else if (_Node.AstNode is BinaryExpressionNode) { #region binary expression AttributeValue = new AttributeAssignOrUpdateExpression(_AttributeIDNode, (_Node.AstNode as BinaryExpressionNode).BinaryExpressionDefinition); #endregion } else if (_Node.AstNode is TupleNode) { #region Tuple TupleNode tempTupleNode = (TupleNode)_Node.AstNode; if (tempTupleNode.TupleDefinition.Count() == 1) { if (tempTupleNode.TupleDefinition.First().Value is BinaryExpressionDefinition) { AttributeValue = new AttributeAssignOrUpdateExpression(_AttributeIDNode, tempTupleNode.TupleDefinition.First().Value as BinaryExpressionDefinition); } else { throw new GraphDBException(new Error_InvalidTuple("Could not extract BinaryExpressionNode from TupleNode.")); } } else { throw new GraphDBException(new Error_InvalidTuple("It is not possible to have more than one binary expression in one tuple. Please check brackets.")); } #endregion } else if (_Node.AstNode is IDNode) { throw new GraphDBException(new Error_InvalidAttributeValue(_AttributeIDNode.ToString(), (_Node.AstNode as IDNode).ToString())); } else if (_Node.AstNode is SetRefNode) { #region setref AttributeValue = new AttributeAssignOrUpdateSetRef(_AttributeIDNode, (_Node.AstNode as SetRefNode).SetRefDefinition); #endregion } else if ((_Node.AstNode is CollectionOfDBObjectsNode)) { #region collection like list AttributeValue = new AttributeAssignOrUpdateList((_Node.AstNode as CollectionOfDBObjectsNode).CollectionDefinition, _AttributeIDNode, true); #endregion } else { throw new GraphDBException(new Error_NotImplemented(new System.Diagnostics.StackTrace(true))); } }