private static void MatchData(DataContainer data, IExpressionGraph resultGraph, IGraphDB myGraphDB, SecurityToken mySecurityToken, Int64 myTransactionToken, TypesOfOperators myTypeOfOperator, BinaryOperator myOperator, String myExpressionIndex) { #region data LevelKey myLevelKey = CreateLevelKey(data.IDChainDefinitions.Item1, myGraphDB, mySecurityToken, myTransactionToken); #endregion var vertices = myGraphDB.GetVertices <List <IVertex> >( mySecurityToken, myTransactionToken, new GraphDB.Request.RequestGetVertices( new BinaryExpression( new PropertyExpression(data.IDChainDefinitions.Item1.LastType.Name, data.IDChainDefinitions.Item1.LastAttribute.Name), myOperator, GenerateLiteral(data.Operands.Item1, ((IPropertyDefinition)data.IDChainDefinitions.Item1.LastAttribute).BaseType), myExpressionIndex)), (stats, vertexEnumerable) => vertexEnumerable.ToList()); foreach (var aVertex in vertices) { IntegrateInGraph(aVertex, resultGraph, myLevelKey, myTypeOfOperator); } if (resultGraph.ContainsLevelKey(myLevelKey)) { #region clean lower levels if (myTypeOfOperator == TypesOfOperators.AffectsLowerLevels) { CleanLowerLevel(myLevelKey, resultGraph, myGraphDB, mySecurityToken, myTransactionToken); } #endregion } else { resultGraph.AddEmptyLevel(myLevelKey); } }
private static void IntegrateInGraph(IVertex myDBObjectStream, IExpressionGraph myExpressionGraph, LevelKey myLevelKey, TypesOfOperators myTypesOfOperators) { if (myTypesOfOperators == TypesOfOperators.AffectsLowerLevels) { myExpressionGraph.AddNode(myDBObjectStream, myLevelKey, 1); } else { myExpressionGraph.AddNode(myDBObjectStream, myLevelKey, 0); } }
/// <summary> /// Finds matching result corresponding to a binary expression. /// </summary> /// <param name="myLeftValueObject">The left value of a binary expression.</param> /// <param name="myRightValueObject">The right value of a binary expression.</param> /// <param name="myPluginManager"></param> /// <param name="myGraphDB"></param> /// <param name="mySecurityToken"></param> /// <param name="myTransactionToken"></param> /// <param name="typeOfBinExpr">Type of the binary expression.</param> /// <param name="resultGr"></param> /// <param name="mytypesOfOpertators"></param> /// <param name="myOperator">The binary operator.</param> /// <param name="myExpressionIndex">The name of the index which should be used for the expression.</param> /// <param name="aggregateAllowed"></param> /// <returns>An expression graph.</returns> public static IExpressionGraph TypeOperation(AExpressionDefinition myLeftValueObject, AExpressionDefinition myRightValueObject, GQLPluginManager myPluginManager, IGraphDB myGraphDB, SecurityToken mySecurityToken, Int64 myTransactionToken, TypesOfBinaryExpression typeOfBinExpr, IExpressionGraph resultGr, TypesOfOperators mytypesOfOpertators, BinaryOperator myOperator, String myExpressionIndex, Boolean aggregateAllowed = true) { #region Data //DataContainer for all data that is used by a binary expression/comparer DataContainer data; #endregion #region extract data //data extraction with an eye on the type of the binary expression switch (typeOfBinExpr) { case TypesOfBinaryExpression.Atom: //sth like 3 = 4 #region Get Atom data //no further data has to be generated //data = new DataContainer(null, new Tuple<Object, Object>(myLeftValueObject, myRightValueObject), null); data = new DataContainer(); #endregion break; case TypesOfBinaryExpression.LeftComplex: //sth like U.Age = 21 #region Get LeftComplex data data = ExtractData(myLeftValueObject, myRightValueObject, ref typeOfBinExpr, myPluginManager, myGraphDB, mySecurityToken, myTransactionToken, aggregateAllowed); #endregion break; case TypesOfBinaryExpression.RightComplex: //sth like 21 = U.Age #region Get RightComplex data data = ExtractData(myRightValueObject, myLeftValueObject, ref typeOfBinExpr, myPluginManager, myGraphDB, mySecurityToken, myTransactionToken, aggregateAllowed); #endregion break; case TypesOfBinaryExpression.Complex: //sth like U.Age = F.Alter #region Get Complex data var leftData = ExtractData(myLeftValueObject, myRightValueObject, ref typeOfBinExpr, myPluginManager, myGraphDB, mySecurityToken, myTransactionToken, aggregateAllowed); var rightData = ExtractData(myRightValueObject, myLeftValueObject, ref typeOfBinExpr, myPluginManager, myGraphDB, mySecurityToken, myTransactionToken, aggregateAllowed); if (typeOfBinExpr == TypesOfBinaryExpression.Unknown) { typeOfBinExpr = SetTypeOfBinaryExpression(leftData, rightData); switch (typeOfBinExpr) { case TypesOfBinaryExpression.Atom: data = new DataContainer(new Tuple <IDChainDefinition, IDChainDefinition>(null, null), new Tuple <AExpressionDefinition, AExpressionDefinition>(leftData.Operands.Item1, leftData.Operands.Item1), new Tuple <AExpressionDefinition, AExpressionDefinition>(null, null)); break; case TypesOfBinaryExpression.LeftComplex: data = new DataContainer(new Tuple <IDChainDefinition, IDChainDefinition>(leftData.IDChainDefinitions.Item1, null), new Tuple <AExpressionDefinition, AExpressionDefinition>(rightData.Operands.Item1, null), new Tuple <AExpressionDefinition, AExpressionDefinition>(null, null)); break; case TypesOfBinaryExpression.RightComplex: data = new DataContainer(new Tuple <IDChainDefinition, IDChainDefinition>(rightData.IDChainDefinitions.Item1, null), new Tuple <AExpressionDefinition, AExpressionDefinition>(leftData.Operands.Item1, null), new Tuple <AExpressionDefinition, AExpressionDefinition>(null, null)); break; case TypesOfBinaryExpression.Complex: case TypesOfBinaryExpression.Unknown: default: throw new NotImplementedQLException(""); } } else { data = JoinData(leftData, rightData); } #endregion break; default: throw new ArgumentException(); } #endregion #region match data switch (typeOfBinExpr) { case TypesOfBinaryExpression.Atom: #region Atom //do nothing 3 = 3 (or 2 != 3) doesnt bother U #endregion break; case TypesOfBinaryExpression.LeftComplex: #region LeftComplex MatchData(data, resultGr, myGraphDB, mySecurityToken, myTransactionToken, mytypesOfOpertators, myOperator, myExpressionIndex); #endregion break; case TypesOfBinaryExpression.RightComplex: #region RightComplex MatchData(data, resultGr, myGraphDB, mySecurityToken, myTransactionToken, mytypesOfOpertators, myOperator, myExpressionIndex); #endregion break; case TypesOfBinaryExpression.Complex: #region Complex throw new NotImplementedQLException(""); #endregion } #endregion return(resultGr); }
/// <summary> /// Finds matching result corresponding to a binary expression. /// </summary> /// <param name="myLeftValueObject">The left value of a binary expression.</param> /// <param name="myRightValueObject">The right value of a binary expression.</param> /// <returns></returns> public static IExpressionGraph TypeOperation( AExpressionDefinition myLeftValueObject, AExpressionDefinition myRightValueObject, GQLPluginManager myPluginManager, IGraphDB myGraphDB, SecurityToken mySecurityToken, Int64 myTransactionToken, TypesOfBinaryExpression typeOfBinExpr, IExpressionGraph resultGr, TypesOfOperators mytypesOfOpertators, BinaryOperator myOperator, Boolean aggregateAllowed = true) { #region Data //DataContainer for all data that is used by a binary expression/comparer DataContainer data; #endregion #region extract data //data extraction with an eye on the type of the binary expression switch (typeOfBinExpr) { case TypesOfBinaryExpression.Atom: //sth like 3 = 4 #region Get Atom data //no further data has to be generated //data = new DataContainer(null, new Tuple<Object, Object>(myLeftValueObject, myRightValueObject), null); data = new DataContainer(); #endregion break; case TypesOfBinaryExpression.LeftComplex: //sth like U.Age = 21 #region Get LeftComplex data data = ExtractData(myLeftValueObject, myRightValueObject, ref typeOfBinExpr, myPluginManager, myGraphDB, mySecurityToken, myTransactionToken, aggregateAllowed); #endregion break; case TypesOfBinaryExpression.RightComplex: //sth like 21 = U.Age #region Get RightComplex data data = ExtractData(myRightValueObject, myLeftValueObject, ref typeOfBinExpr, myPluginManager, myGraphDB, mySecurityToken, myTransactionToken, aggregateAllowed); #endregion break; case TypesOfBinaryExpression.Complex: //sth like U.Age = F.Alter #region Get Complex data var leftData = ExtractData(myLeftValueObject, myRightValueObject, ref typeOfBinExpr, myPluginManager, myGraphDB, mySecurityToken, myTransactionToken, aggregateAllowed); var rightData = ExtractData(myRightValueObject, myLeftValueObject, ref typeOfBinExpr, myPluginManager, myGraphDB, mySecurityToken, myTransactionToken, aggregateAllowed); if (typeOfBinExpr == TypesOfBinaryExpression.Unknown) { typeOfBinExpr = SetTypeOfBinaryExpression(leftData, rightData); switch (typeOfBinExpr) { case TypesOfBinaryExpression.Atom: data = new DataContainer(new Tuple<IDChainDefinition, IDChainDefinition>(null, null), new Tuple<AExpressionDefinition, AExpressionDefinition>(leftData.Operands.Item1, leftData.Operands.Item1), new Tuple<AExpressionDefinition, AExpressionDefinition>(null, null)); break; case TypesOfBinaryExpression.LeftComplex: data = new DataContainer(new Tuple<IDChainDefinition, IDChainDefinition>(leftData.IDChainDefinitions.Item1, null), new Tuple<AExpressionDefinition, AExpressionDefinition>(rightData.Operands.Item1, null), new Tuple<AExpressionDefinition, AExpressionDefinition>(null, null)); break; case TypesOfBinaryExpression.RightComplex: data = new DataContainer(new Tuple<IDChainDefinition, IDChainDefinition>(rightData.IDChainDefinitions.Item1, null), new Tuple<AExpressionDefinition, AExpressionDefinition>(leftData.Operands.Item1, null), new Tuple<AExpressionDefinition, AExpressionDefinition>(null, null)); break; case TypesOfBinaryExpression.Complex: case TypesOfBinaryExpression.Unknown: default: throw new NotImplementedQLException(""); } } else { data = JoinData(leftData, rightData); } #endregion break; default: throw new ArgumentException(); } #endregion #region match data switch (typeOfBinExpr) { case TypesOfBinaryExpression.Atom: #region Atom //do nothing 3 = 3 (or 2 != 3) doesnt bother U #endregion break; case TypesOfBinaryExpression.LeftComplex: #region LeftComplex MatchData(data, resultGr, myGraphDB, mySecurityToken, myTransactionToken, mytypesOfOpertators, myOperator); #endregion break; case TypesOfBinaryExpression.RightComplex: #region RightComplex MatchData(data, resultGr, myGraphDB, mySecurityToken, myTransactionToken, mytypesOfOpertators, myOperator); #endregion break; case TypesOfBinaryExpression.Complex: #region Complex throw new NotImplementedQLException(""); #endregion } #endregion return resultGr; }
private static void MatchData(DataContainer data, IExpressionGraph resultGraph, IGraphDB myGraphDB, SecurityToken mySecurityToken, Int64 myTransactionToken, TypesOfOperators myTypeOfOperator, BinaryOperator myOperator) { #region data LevelKey myLevelKey = CreateLevelKey(data.IDChainDefinitions.Item1, myGraphDB, mySecurityToken, myTransactionToken); #endregion var vertices = myGraphDB.GetVertices<List<IVertex>>( mySecurityToken, myTransactionToken, new GraphDB.Request.RequestGetVertices( new BinaryExpression( new PropertyExpression(data.IDChainDefinitions.Item1.LastType.Name, data.IDChainDefinitions.Item1.LastAttribute.Name), myOperator, GenerateLiteral(data.Operands.Item1, ((IPropertyDefinition)data.IDChainDefinitions.Item1.LastAttribute).BaseType))), (stats, vertexEnumerable) => vertexEnumerable.ToList()); foreach (var aVertex in vertices) { IntegrateInGraph(aVertex, resultGraph, myLevelKey, myTypeOfOperator); } if (resultGraph.ContainsLevelKey(myLevelKey)) { #region clean lower levels if (myTypeOfOperator == TypesOfOperators.AffectsLowerLevels) { CleanLowerLevel(myLevelKey, resultGraph, myGraphDB, mySecurityToken, myTransactionToken); } #endregion } else { resultGraph.AddEmptyLevel(myLevelKey); } }