internal override GremlinToSqlContext GetContext() { GremlinToSqlContext inputContext = GetInputContext(); if (inputContext.PivotVariable != null) { throw new QueryCompilationException("This step only can be a start step."); } GremlinFreeVertexVariable newVariable = new GremlinFreeVertexVariable(); inputContext.VariableList.Add(newVariable); inputContext.TableReferences.Add(newVariable); inputContext.SetPivotVariable(newVariable); inputContext.PivotVariable.OutE(inputContext, new List <string>()); if (EdgeIdsOrElements.Count > 0) { List <WBooleanExpression> booleanExprList = new List <WBooleanExpression>(); foreach (var id in EdgeIdsOrElements) { if (GremlinUtil.IsNumber(id) || id is string) { WScalarExpression firstExpr = inputContext.PivotVariable.GetVariableProperty(GremlinKeyword.EdgeID).ToScalarExpression(); WScalarExpression secondExpr = SqlUtil.GetValueExpr(id); WBooleanComparisonExpression booleanExpr = SqlUtil.GetEqualBooleanComparisonExpr(firstExpr, secondExpr); booleanExprList.Add(booleanExpr); } } inputContext.AddPredicate(SqlUtil.ConcatBooleanExprWithOr(booleanExprList)); } return(inputContext); }
internal virtual void Is(GremlinToSqlContext currentContext, object value) { WScalarExpression firstExpr = DefaultVariableProperty().ToScalarExpression(); WScalarExpression secondExpr = SqlUtil.GetValueExpr(value); currentContext.AddPredicate(SqlUtil.GetEqualBooleanComparisonExpr(firstExpr, secondExpr)); }
internal override GremlinToSqlContext GetContext() { GremlinToSqlContext inputContext = GetInputContext(); GremlinFreeVertexVariable newVariable = new GremlinFreeVertexVariable(); if (VertexIdsOrElements.Count > 0) { List <WBooleanExpression> booleanExprList = new List <WBooleanExpression>(); foreach (var id in VertexIdsOrElements) { if (id is int || id is string) { WScalarExpression firstExpr = newVariable.GetVariableProperty(GremlinKeyword.NodeID).ToScalarExpression(); WScalarExpression secondExpr = SqlUtil.GetValueExpr(id); WBooleanComparisonExpression booleanExpr = SqlUtil.GetEqualBooleanComparisonExpr(firstExpr, secondExpr); booleanExprList.Add(booleanExpr); } } inputContext.AddPredicate(SqlUtil.ConcatBooleanExprWithOr(booleanExprList)); } inputContext.VariableList.Add(newVariable); inputContext.TableReferences.Add(newVariable); inputContext.SetPivotVariable(newVariable); return(inputContext); }
internal void Has(GremlinVariable lastVariable, string propertyKey, object value) { WScalarExpression firstExpr = lastVariable.GetVariableProperty(propertyKey).ToScalarExpression(); WScalarExpression secondExpr = SqlUtil.GetValueExpr(value); AddPredicate(SqlUtil.GetEqualBooleanComparisonExpr(firstExpr, secondExpr)); }
internal void HasLabel(GremlinVariable lastVariable, List <object> values) { List <WBooleanExpression> booleanExprList = new List <WBooleanExpression>(); foreach (var value in values) { WScalarExpression firstExpr = lastVariable.GetVariableProperty(GremlinKeyword.Label).ToScalarExpression(); WScalarExpression secondExpr = SqlUtil.GetValueExpr(value); booleanExprList.Add(SqlUtil.GetEqualBooleanComparisonExpr(firstExpr, secondExpr)); } WBooleanExpression concatSql = SqlUtil.ConcatBooleanExprWithOr(booleanExprList); AddPredicate(SqlUtil.GetBooleanParenthesisExpr(concatSql)); }
internal void AddLabelPredicateForEdge(GremlinEdgeTableVariable edgeTable, List <string> edgeLabels) { if (edgeLabels.Count == 0) { return; } List <WBooleanExpression> booleanExprList = new List <WBooleanExpression>(); foreach (var edgeLabel in edgeLabels) { var firstExpr = edgeTable.GetVariableProperty(GremlinKeyword.Label).ToScalarExpression(); var secondExpr = SqlUtil.GetValueExpr(edgeLabel); booleanExprList.Add(SqlUtil.GetEqualBooleanComparisonExpr(firstExpr, secondExpr)); } AddPredicate(SqlUtil.GetBooleanParenthesisExpr(SqlUtil.ConcatBooleanExprWithOr(booleanExprList))); }
private WBooleanExpression CreateBooleanExpression(GremlinVariableProperty variableProperty, object valuesOrPredicate) { if (valuesOrPredicate is string || valuesOrPredicate is int || valuesOrPredicate is bool) { WScalarExpression firstExpr = variableProperty.ToScalarExpression(); WScalarExpression secondExpr = SqlUtil.GetValueExpr(valuesOrPredicate); return(SqlUtil.GetEqualBooleanComparisonExpr(firstExpr, secondExpr)); } if (valuesOrPredicate is Predicate) { WScalarExpression firstExpr = variableProperty.ToScalarExpression(); WScalarExpression secondExpr = SqlUtil.GetValueExpr((valuesOrPredicate as Predicate).Value); return(SqlUtil.GetBooleanComparisonExpr(firstExpr, secondExpr, valuesOrPredicate as Predicate)); } throw new ArgumentException(); }
/// <summary> /// Given a node / TVF, a traversalLink and backwardEdges, try to find all predicates that can be evaluated /// </summary> /// <param name="node"></param> /// <param name="traversalLink"></param> /// <param name="backwardEdges"></param> /// <param name="predicateLinksAccessedTableAliases"></param> private List <Tuple <PredicateLink, int> > FindPredicates( CompileNode node, CompileLink traversalLink, List <Tuple <MatchEdge, int> > backwardEdges, List <Tuple <PredicateLink, HashSet <string> > > predicateLinksAccessedTableAliases) { // Record temporary aliases and predicates HashSet <string> temporaryAliases = new HashSet <string>(this.ExistingNodesAndEdges); HashSet <string> temporaryPredicates = new HashSet <string>(this.ExistingPredicateLinks); List <Tuple <PredicateLink, int> > forwardLinks = new List <Tuple <PredicateLink, int> >(); // priority = 1 // retrieve traversalLink and add predicates if (traversalLink != null && !this.ExistingNodesAndEdges.Contains(traversalLink.LinkAlias)) { // Find predicates that can be evaluated after retrieving this traversalLink if (traversalLink is MatchEdge) { temporaryAliases.Add(traversalLink.LinkAlias); } else if (traversalLink is PredicateLink) { temporaryPredicates.Add(traversalLink.LinkAlias); } else { throw new QueryCompilationException("Cannot support " + traversalLink + " as a traversal link or an edge"); } foreach (Tuple <PredicateLink, HashSet <string> > tuple in predicateLinksAccessedTableAliases) { if (!temporaryPredicates.Contains(tuple.Item1.LinkAlias) && temporaryAliases.IsSupersetOf(tuple.Item2)) { temporaryPredicates.Add(tuple.Item1.LinkAlias); forwardLinks.Add(new Tuple <PredicateLink, int>(tuple.Item1, 1)); } } // Make sure the all existing edges and this traversalLink are consistent // Because all existing edges are consistent, we just need make one exstring edge and this traversalLink consistent MatchNode matchNode = node as MatchNode; WColumnReferenceExpression nodeColumnReferenceExprFromTraversalLink = GetNodeColumnReferenceExprFromLink(traversalLink); WColumnReferenceExpression nodeColumnReferenceExprFromAnExistingEdge = GetNodeColumnReferenceExprFromAnExistingEdge(matchNode, this.ExistingNodesAndEdges); if (nodeColumnReferenceExprFromTraversalLink != null && nodeColumnReferenceExprFromAnExistingEdge != null) { forwardLinks.Add( new Tuple <PredicateLink, int>( new PredicateLink( SqlUtil.GetEqualBooleanComparisonExpr(nodeColumnReferenceExprFromTraversalLink, nodeColumnReferenceExprFromAnExistingEdge)), 1)); } } // priority = 2 // retrieve node and some edges and add predicates temporaryAliases.Add(node.NodeAlias); foreach (Tuple <MatchEdge, int> tuple in backwardEdges) { if (tuple.Item2 == 2) { temporaryAliases.Add(tuple.Item1.LinkAlias); MatchNode otherNode = tuple.Item1.SinkNode; WColumnReferenceExpression nodeColumnReferenceExprFromBackwardEdge = null; WColumnReferenceExpression nodeColumnReferenceExprFromAnExistingEdge = GetNodeColumnReferenceExprFromAnExistingEdge(otherNode, this.ExistingNodesAndEdges); if (nodeColumnReferenceExprFromAnExistingEdge != null) { foreach (MatchEdge edge in otherNode.Neighbors) { if (edge.LinkAlias == tuple.Item1.LinkAlias) { nodeColumnReferenceExprFromBackwardEdge = GetNodeColumnReferenceExprFromLink(edge); break; } } if (nodeColumnReferenceExprFromBackwardEdge == null) { foreach (MatchEdge edge in otherNode.ReverseNeighbors) { if (edge.LinkAlias == tuple.Item1.LinkAlias) { nodeColumnReferenceExprFromBackwardEdge = GetNodeColumnReferenceExprFromLink(edge); break; } } } if (nodeColumnReferenceExprFromBackwardEdge == null) { foreach (MatchEdge edge in otherNode.DanglingEdges) { if (edge.LinkAlias == tuple.Item1.LinkAlias) { nodeColumnReferenceExprFromBackwardEdge = GetNodeColumnReferenceExprFromLink(edge); break; } } } } // Because all existing edges are consistent, we just need make one exstring edge and this edge consistent if (nodeColumnReferenceExprFromBackwardEdge != null && nodeColumnReferenceExprFromAnExistingEdge != null) { temporaryPredicates.Add(tuple.Item1.LinkAlias); forwardLinks.Add( new Tuple <PredicateLink, int>( new PredicateLink( SqlUtil.GetEqualBooleanComparisonExpr(nodeColumnReferenceExprFromBackwardEdge, nodeColumnReferenceExprFromAnExistingEdge)), 2)); } } } // Check predicates foreach (Tuple <PredicateLink, HashSet <string> > tuple in predicateLinksAccessedTableAliases) { if (!temporaryPredicates.Contains(tuple.Item1.LinkAlias) && temporaryAliases.IsSupersetOf(tuple.Item2)) { temporaryPredicates.Add(tuple.Item1.LinkAlias); forwardLinks.Add(new Tuple <PredicateLink, int>(tuple.Item1, 2)); } } // priority = 3 // retrieve another edges and add predicates foreach (Tuple <MatchEdge, int> tuple in backwardEdges) { if (tuple.Item2 == 3) { temporaryAliases.Add(tuple.Item1.LinkAlias); MatchNode otherNode = tuple.Item1.SinkNode; WColumnReferenceExpression nodeColumnReferenceExprFromBackwardEdge = null; WColumnReferenceExpression nodeColumnReferenceExprFromAnExistingEdge = GetNodeColumnReferenceExprFromAnExistingEdge(otherNode, this.ExistingNodesAndEdges); if (nodeColumnReferenceExprFromAnExistingEdge != null) { foreach (MatchEdge edge in otherNode.Neighbors) { if (edge.LinkAlias == tuple.Item1.LinkAlias) { nodeColumnReferenceExprFromBackwardEdge = GetNodeColumnReferenceExprFromLink(edge); break; } } if (nodeColumnReferenceExprFromBackwardEdge == null) { foreach (MatchEdge edge in otherNode.ReverseNeighbors) { if (edge.LinkAlias == tuple.Item1.LinkAlias) { nodeColumnReferenceExprFromBackwardEdge = GetNodeColumnReferenceExprFromLink(edge); break; } } } if (nodeColumnReferenceExprFromBackwardEdge == null) { foreach (MatchEdge edge in otherNode.DanglingEdges) { if (edge.LinkAlias == tuple.Item1.LinkAlias) { nodeColumnReferenceExprFromBackwardEdge = GetNodeColumnReferenceExprFromLink(edge); break; } } } } // Because all existing edges are consistent, we just need make one exstring edge and this edge consistent if (nodeColumnReferenceExprFromBackwardEdge != null && nodeColumnReferenceExprFromAnExistingEdge != null) { temporaryPredicates.Add(tuple.Item1.LinkAlias); forwardLinks.Add( new Tuple <PredicateLink, int>( new PredicateLink( SqlUtil.GetEqualBooleanComparisonExpr(nodeColumnReferenceExprFromBackwardEdge, nodeColumnReferenceExprFromAnExistingEdge)), 3)); } } } // Check predicates foreach (Tuple <PredicateLink, HashSet <string> > tuple in predicateLinksAccessedTableAliases) { if (!temporaryPredicates.Contains(tuple.Item1.LinkAlias) && temporaryAliases.IsSupersetOf(tuple.Item2)) { temporaryPredicates.Add(tuple.Item1.LinkAlias); forwardLinks.Add(new Tuple <PredicateLink, int>(tuple.Item1, 3)); } } return(forwardLinks); }