public override FuncParameter ExecFunc(IAttributeDefinition myAttributeDefinition, Object myCallingObject, IVertex myDBObject, IGraphDB myGraphDB, SecurityToken mySecurityToken, Int64 myTransactionToken, params FuncParameter[] myParams) { var currentInnerEdgeType = ((IOutgoingEdgeDefinition)myAttributeDefinition).InnerEdgeType; bool orderByWeight = false; IPropertyDefinition weightProperty = null; int numOfEntries = Convert.ToInt32(myParams[0].Value); if (currentInnerEdgeType.HasProperty("Weight")) { orderByWeight = true; weightProperty = currentInnerEdgeType.GetPropertyDefinition("Weight"); } if (myCallingObject is IHyperEdge) { var hyperEdge = myCallingObject as IHyperEdge; if (orderByWeight) { var topVertices = hyperEdge.InvokeHyperEdgeFunc <IEnumerable <IVertex> >(singleEdges => { return(singleEdges .OrderByDescending(edge => weightProperty.GetValue(edge)) .Select(aOrderedEdge => aOrderedEdge.GetTargetVertex())); }).Take(numOfEntries); return(new FuncParameter(topVertices)); } else { return(new FuncParameter(hyperEdge.GetTargetVertices().Take(numOfEntries))); } } throw new InvalidTypeException(myCallingObject.GetType().ToString(), "IHyperEdge"); }
public List <FuncParameter> Execute(IVertexType myTypeOfDBObject, IVertex myDBObject, String myReference, GQLPluginManager myPluginManager, IGraphDB myGraphDB, SecurityToken mySecurityToken, Int64 myTransactionToken) { List <FuncParameter> evaluatedParams = new List <FuncParameter>(); int paramCounter = 0; FuncParameter validationOutput; //ParameterValue currentParameter; for (int i = 0; i < Parameters.Count; i++) { ParameterValue currentParameter = Function.GetParameter(paramCounter); if (Parameters[i] is BinaryExpressionDefinition) { ((BinaryExpressionDefinition)Parameters[i]).Validate(myPluginManager, myGraphDB, mySecurityToken, myTransactionToken); #region handle BinExp var calculatedGraphResult = ((BinaryExpressionDefinition)Parameters[i]).Calculon(myPluginManager, myGraphDB, mySecurityToken, myTransactionToken, new CommonUsageGraph(myGraphDB, mySecurityToken, myTransactionToken)); var extractedDBOs = calculatedGraphResult.Select(new LevelKey(myTypeOfDBObject.ID, myGraphDB, mySecurityToken, myTransactionToken), null, true); #region validation validationOutput = ValidateAndAddParameter(currentParameter, extractedDBOs, null); evaluatedParams.Add(validationOutput); #endregion #endregion } else { if (Parameters[i] is IDChainDefinition) { #region handle IDNode var tempIDChain = (IDChainDefinition)Parameters[i]; tempIDChain.Validate(myPluginManager, myGraphDB, mySecurityToken, myTransactionToken, false); if (currentParameter.Value is IAttributeDefinition) { #region validation validationOutput = ValidateAndAddParameter(currentParameter, tempIDChain.LastAttribute, null); evaluatedParams.Add(validationOutput); #endregion } else { if ((tempIDChain.LastAttribute == null) && (tempIDChain.SelectType != TypesOfSelect.None)) { #region IDNode with asterisk #region validation validationOutput = ValidateAndAddParameter(currentParameter, tempIDChain, null); evaluatedParams.Add(validationOutput); #endregion #endregion } else { switch (tempIDChain.LastAttribute.Kind) { case AttributeType.Property: #region Property IPropertyDefinition propertyDefinition = (IPropertyDefinition)tempIDChain.LastAttribute; IComparable value = null; if (myDBObject.HasProperty(propertyDefinition.ID)) { value = propertyDefinition.GetValue(myDBObject); } #region validation validationOutput = ValidateAndAddParameter(currentParameter, value, tempIDChain.LastAttribute); evaluatedParams.Add(validationOutput); #endregion #endregion break; case AttributeType.IncomingEdge: #region IncomingEdge IIncomingEdgeDefinition incomingEdgeAttribute = (IIncomingEdgeDefinition)tempIDChain.LastAttribute; IEnumerable <IVertex> dbos = new List <IVertex>(); if (myDBObject.HasIncomingVertices(incomingEdgeAttribute.RelatedEdgeDefinition.SourceVertexType.ID, incomingEdgeAttribute.RelatedEdgeDefinition.ID)) { dbos = myDBObject.GetIncomingVertices(incomingEdgeAttribute.RelatedEdgeDefinition.SourceVertexType.ID, incomingEdgeAttribute.RelatedEdgeDefinition.ID); } #region validation validationOutput = ValidateAndAddParameter(currentParameter, dbos, tempIDChain.LastAttribute); evaluatedParams.Add(validationOutput); #endregion #endregion break; case AttributeType.OutgoingEdge: #region outgoing Edge IOutgoingEdgeDefinition outgoingEdgeAttribute = (IOutgoingEdgeDefinition)tempIDChain.LastAttribute; IEnumerable <IVertex> outgoingDBOs = new List <IVertex>(); if (myDBObject.HasOutgoingEdge(outgoingEdgeAttribute.ID)) { outgoingDBOs = myDBObject.GetOutgoingEdge(outgoingEdgeAttribute.ID).GetTargetVertices(); } #region validation validationOutput = ValidateAndAddParameter(currentParameter, outgoingDBOs, tempIDChain.LastAttribute); evaluatedParams.Add(validationOutput); #endregion #endregion break; default: break; } } } #endregion } else { #region any other #region validation validationOutput = ValidateAndAddParameter(currentParameter, Parameters[i], null); evaluatedParams.Add(validationOutput); #endregion #endregion } } #region increase parameter counter if (!currentParameter.VariableNumOfParams) { paramCounter++; } #endregion } return(evaluatedParams); }