public SelectionElementFunction(SelectionElement mySelectionElement, ChainPartFuncDefinition myFunction, List <AExpressionDefinition> myParameters) { this.Alias = mySelectionElement.Alias; this.EdgeList = mySelectionElement.EdgeList; this.Element = mySelectionElement.Element; this.Selection = mySelectionElement.Selection; this.IsGroupedOrAggregated = mySelectionElement.IsGroupedOrAggregated; this.LevelKey = mySelectionElement.LevelKey; this.RelatedIDChainDefinition = mySelectionElement.RelatedIDChainDefinition; Function = myFunction; Parameters = myParameters; }
public SelectionElementFunction(SelectionElement mySelectionElement, ChainPartFuncDefinition myFunction, List<AExpressionDefinition> myParameters) { this.Alias = mySelectionElement.Alias; this.EdgeList = mySelectionElement.EdgeList; this.Element = mySelectionElement.Element; this.Selection = mySelectionElement.Selection; this.IsGroupedOrAggregated = mySelectionElement.IsGroupedOrAggregated; this.LevelKey = mySelectionElement.LevelKey; this.RelatedIDChainDefinition = mySelectionElement.RelatedIDChainDefinition; Function = myFunction; Parameters = myParameters; }
/// <summary> /// The element <paramref name="myNewElement"/> is new if /// - it is not a special type attribute and there is an asterisk selection at this level /// - it is not the last part AND there is already an item of this part with the same alias and the same Depth /// </summary> /// <param name="myExistingElement"></param> /// <param name="myNewElement"></param> /// <returns></returns> private Boolean IsNewSelectionElement(SelectionElement myExistingElement, SelectionElement myNewElement) { #region The existing is an asterisk and the new one is NOT a SpecialTypeAttribute if (myExistingElement.Selection == TypesOfSelect.Asterisk && !myNewElement.RelatedIDChainDefinition.IsSpecialTypeAttribute()) { return false; } #endregion #region The same level is already selected var item = myExistingElement; var selElem = myNewElement; if (item.Alias == selElem.Alias// && // same depth or Undefined and one lower depth Friends.Undefined is Depth 1 and Friends.Age is Depth 2 but at the same selection level // (item.RelatedIDChainDefinition.Depth == selElem.RelatedIDChainDefinition.Depth || // (selElem.RelatedIDChainDefinition.IsUndefinedAttribute && item.RelatedIDChainDefinition.Depth == selElem.RelatedIDChainDefinition.Depth + 1)) ) { return false; } #endregion return true; }
/// <summary> /// Adds the typeNode as an asterisk *, rhomb # or minus - or ad /// </summary> public void AddSelectionType(string myReference, IVertexType myType, TypesOfSelect mySelType, long? myTypeID = null) { var selElem = new SelectionElement(mySelType, myTypeID); if (!_Selections.ContainsKey(myReference)) _Selections.Add(myReference, new Dictionary<EdgeList, List<SelectionElement>>()); var level = new EdgeList(new EdgeKey(myType.ID)); if (!_Selections[myReference].ContainsKey(level)) _Selections[myReference].Add(level, new List<SelectionElement>()); if (!_Selections[myReference][level].Exists(item => item.Selection == mySelType)) { _Selections[myReference][level].Add(selElem); } }
/// <summary> Gets an attribute value - references will be resolved. </summary> /// /// <remarks> Stefan, 16.04.2010. </remarks> /// /// <param name="myType"> Type. </param> /// <param name="myTypeAttribute"> my type attribute. </param> /// <param name="myDBObject"> my database object. </param> /// <param name="myDepth"> Depth of my. </param> /// <param name="myLevelKey"> my level key. </param> /// <param name="reference"> The reference. </param> /// <param name="myUsingGraph"> true to my using graph. </param> /// <param name="attributeValue"> [out] The attribute value. </param> /// /// <returns> true if it succeeds, false if the DBO does not have the attribute. </returns> private Boolean GetAttributeValueAndResolve(SecurityToken mySecurityToken, Int64 myTransactionToken, IVertexType myType, SelectionElement mySelectionelement, IVertex myDBObject, Int64 myDepth, EdgeList myLevelKey, String reference, Boolean myUsingGraph, out Object attributeValue, String myUndefAttrName = null) { var typeAttribute = mySelectionelement.Element; switch (typeAttribute.Kind) { case AttributeType.Property: #region property var property = (IPropertyDefinition)typeAttribute; attributeValue = property.GetValue(myDBObject); return attributeValue != null; #endregion case AttributeType.IncomingEdge: #region IsBackwardEdge var incomingEdgeAttribute = (IIncomingEdgeDefinition)typeAttribute; if (myDBObject.HasIncomingVertices(incomingEdgeAttribute.RelatedEdgeDefinition.RelatedType.ID, incomingEdgeAttribute.RelatedEdgeDefinition.ID)) { var dbos = myDBObject.GetIncomingVertices(incomingEdgeAttribute.RelatedEdgeDefinition.RelatedType.ID, incomingEdgeAttribute.RelatedEdgeDefinition.ID); if (dbos != null) { if (myDepth > 0) { attributeValue = ResolveIncomingEdgeValue(incomingEdgeAttribute, dbos, myDepth, myLevelKey, myDBObject, reference, myUsingGraph, mySecurityToken, myTransactionToken); } else { attributeValue = GetNotResolvedReferenceEdgeAttributeValue(dbos); } return true; } } #endregion break; case AttributeType.OutgoingEdge: #region outgoing edges if (myDBObject.HasOutgoingEdge(typeAttribute.ID)) { var edge = myDBObject.GetOutgoingEdge(typeAttribute.ID); if (edge != null) { if (myDepth > 0) { attributeValue = ResolveAttributeValue( (IOutgoingEdgeDefinition)typeAttribute, edge, myDepth, myLevelKey, myDBObject, reference, myUsingGraph, mySecurityToken, myTransactionToken); } else { attributeValue = GetNotResolvedReferenceEdgeAttributeValue(edge.GetTargetVertices()); } return true; } } #endregion break; case AttributeType.BinaryProperty: default: break; } attributeValue = null; return false; }
/// <summary> /// Single IDNode selection attribute /// </summary> public void AddElementToSelection(string myAlias, String myReference, IDChainDefinition myIDChainDefinition, Boolean myIsGroupedOrAggregated, SelectValueAssignment mySelectValueAssignment = null) { SelectionElement lastElem = null; var curLevel = new EdgeList(); EdgeList preLevel = null; if (myReference != null && _Selections.ContainsKey(myReference) && _Selections[myReference].Any(kv => kv.Value.Any(se => se.RelatedIDChainDefinition == myIDChainDefinition && se.Alias == myAlias))) { throw new DuplicateAttributeSelectionException(myAlias); } foreach (var nodeEdgeKey in myIDChainDefinition) { if (nodeEdgeKey is ChainPartTypeOrAttributeDefinition) { #region Usual attribute preLevel = null; var selElem = new SelectionElement(myAlias, curLevel, myIsGroupedOrAggregated, myIDChainDefinition); var typeOrAttr = (nodeEdgeKey as ChainPartTypeOrAttributeDefinition); if (true || typeOrAttr.DBType != null && typeOrAttr.TypeAttribute != null) { #region defined var edgeKey = typeOrAttr.EdgeKey; selElem.Element = typeOrAttr.TypeAttribute; //_DBContext.DBTypeManager.GetTypeAttributeByEdge(edgeKey); if (String.IsNullOrEmpty(selElem.Alias) || (nodeEdgeKey.Next != null && !(nodeEdgeKey.Next is ChainPartFuncDefinition))) { selElem.Alias = typeOrAttr.TypeAttribute.Name;//_DBContext.DBTypeManager.GetTypeAttributeByEdge(edgeKey).Name; } curLevel += edgeKey; preLevel = curLevel.GetPredecessorLevel(); #endregion } else { #region undefined attribute if (myIDChainDefinition.Level == 0) { preLevel = new EdgeList(myIDChainDefinition.LastType.ID); } else { var element = _Selections[myReference].Last(); preLevel = curLevel.GetPredecessorLevel(); //preLevel = curLevel; } selElem.Alias = typeOrAttr.TypeOrAttributeName; selElem.Element = new UnstructuredProperty(typeOrAttr.TypeOrAttributeName); #endregion } #region Add to _Selections if valid if (!_Selections.ContainsKey(myReference)) { _Selections.Add(myReference, new Dictionary<EdgeList, List<SelectionElement>>()); } if (!_Selections[myReference].ContainsKey(preLevel)) { _Selections[myReference].Add(preLevel, new List<SelectionElement>()); } /// /// Duplicate AttributeSelection is: "U.Name, U.Name" or "U.Name.TOUPPER(), U.Name" but not "U.Friends.TOP(1).Name, U.Friends.TOP(1).Age" if ((nodeEdgeKey.Next == null || (nodeEdgeKey.Next is ChainPartFuncDefinition && nodeEdgeKey.Next.Next == null)) // U.Name, U.Name U.Name.TOUPPER, U.Name && _Selections[myReference][preLevel].Exists(item => item.Alias == selElem.Alias && selElem.EdgeList.Level == item.EdgeList.Level && item.RelatedIDChainDefinition.Depth == selElem.RelatedIDChainDefinition.Depth && item.Element != null) && !myIsGroupedOrAggregated) { throw new DuplicateAttributeSelectionException(selElem.Alias); } // Do not add again if: // - it is a defined attribute and there is an asterisk selection at this level // - it is not the last part AND // - there is already an item of this part with the same alias and the same Depth if (nodeEdgeKey.Next == null || _Selections[myReference][preLevel].Count == 0 || _Selections[myReference][preLevel].Any(item => IsNewSelectionElement(item, selElem))) { _Selections[myReference][preLevel].Add(selElem); } #endregion lastElem = selElem; #endregion } else if (nodeEdgeKey is ChainPartFuncDefinition) { var chainPartFuncDefinition = (nodeEdgeKey as ChainPartFuncDefinition); #region Function if (myReference == null) { #region Type independent functions var selElem = new SelectionElement(myAlias, myIDChainDefinition); if (String.IsNullOrEmpty(selElem.Alias)) { selElem.Alias = chainPartFuncDefinition.SourceParsedString; } var funcElem = new SelectionElementFunction(selElem, chainPartFuncDefinition, chainPartFuncDefinition.Parameters); if (lastElem is SelectionElementFunction) { (lastElem as SelectionElementFunction).AddFollowingFunction(funcElem); lastElem = funcElem; } else { if (_SelectionElementsTypeIndependend.Any(se => se.Alias == funcElem.Alias)) { throw new DuplicateAttributeSelectionException(funcElem.Alias); } _SelectionElementsTypeIndependend.Add(funcElem); lastElem = funcElem; } #endregion } else { #region Type dependent function var funcElem = new SelectionElementFunction(lastElem, (nodeEdgeKey as ChainPartFuncDefinition), (nodeEdgeKey as ChainPartFuncDefinition).Parameters); funcElem.RelatedIDChainDefinition = myIDChainDefinition; if (!String.IsNullOrEmpty(myAlias) && nodeEdgeKey.Next == null) { funcElem.Alias = myAlias; } if (lastElem is SelectionElementFunction) { (lastElem as SelectionElementFunction).AddFollowingFunction(funcElem); } else if (_Selections[myReference][preLevel].Contains(lastElem)) { #region Add function to the last selection element (replace it) _Selections[myReference][preLevel].Remove(lastElem); //lastElem = new SelectionElementFunction(lastElem, (nodeEdgeKey as ChainPartFuncDefinition), (nodeEdgeKey as ChainPartFuncDefinition).Parameters); //lastElem.RelatedIDChainDefinition = myIDChainDefinition; //if (!String.IsNullOrEmpty(alias) && nodeEdgeKey.Next == null) //{ // lastElem.Alias = alias; //} if (!_Selections[myReference][preLevel].Contains(funcElem)) // In case this Element with func is already in the selection list do nothing. { _Selections[myReference][preLevel].Add(funcElem); } #endregion } //functions are not equal && it is the end of a function sequence else if (!_Selections[myReference][preLevel].Contains(funcElem) && !(nodeEdgeKey.Next is ChainPartFuncDefinition)) { #region In this case we have a similar function but NOT THE SAME. Since we don't know what to do, return error. throw new InvalidVertexAttributeSelectionException(myIDChainDefinition.ContentString); #endregion } //always assign funcElem to lastElem, otherwise the part of add following functions doesn't work lastElem = funcElem; #endregion } #endregion } } #region Set the SelectValueAssignment for the last element if (lastElem != null && mySelectValueAssignment != null) { #region Error handling System.Diagnostics.Debug.Assert(lastElem.Element != null); if (lastElem.Element.Kind != AttributeType.Property && lastElem.Element.Kind != AttributeType.BinaryProperty) { throw new InvalidSelectValueAssignmentException(lastElem.Element.Name); } if (!(mySelectValueAssignment.TermDefinition is ValueDefinition)) { throw new NotImplementedQLException(""); } #endregion #region Validate datatype if the attribute is a defined attribute //if (!(lastElem.Element is UnstructuredProperty)) //{ // if (!lastElem.Element.GetADBBaseObjectType(_DBContext.DBTypeManager).IsValidValue((mySelectValueAssignment.TermDefinition as ValueDefinition).Value.Value)) // { // return new Exceptional(new Error_SelectValueAssignmentDataTypeDoesNotMatch(lastElem.Element.GetADBBaseObjectType(_DBContext.DBTypeManager).ObjectName, (mySelectValueAssignment.TermDefinition as ValueDefinition).Value.ObjectName)); // } // var typedValue = new ValueDefinition(lastElem.Element.GetADBBaseObjectType(_DBContext.DBTypeManager).Clone((mySelectValueAssignment.TermDefinition as ValueDefinition).Value.Value)); // mySelectValueAssignment.TermDefinition = typedValue; //} #endregion lastElem.SelectValueAssignment = mySelectValueAssignment; } #endregion }