public override void Visit(WSelectQueryBlock node) { if (node.SelectElements == null || node.SelectElements.Count < 2) { throw new GraphViewException("Numbers of select elements mismatch."); } var sourceTableScalar = node.SelectElements[0] as WSelectScalarExpression; if (sourceTableScalar == null) throw new GraphViewException("Source node id should be a scalar expression."); var sourceTableColumn = sourceTableScalar.SelectExpr as WColumnReferenceExpression; if (sourceTableColumn == null) throw new GraphViewException("Source node id column should be a column reference expression."); var sourceTableName = sourceTableColumn.MultiPartIdentifier.Identifiers.Last().Value; var sourceNodeIdExpr = new WColumnReferenceExpression(); foreach (var identifier in sourceTableColumn.MultiPartIdentifier.Identifiers) sourceNodeIdExpr.Add(identifier); sourceNodeIdExpr.AddIdentifier("GlobalNodeId"); if (node.SelectElements.Count < 2) throw new GraphViewException("Source and Sink tables should be specified in select elements."); if (node.GroupByClause != null) { throw new GraphViewException("GROUP BY clause is not allowed in INSERT EDGE statement."); } var collectVarVisitor = new CollectVariableVisitor(); var context = collectVarVisitor.Invoke(node); WColumnReferenceExpression sinkNodeIdExpr = null; for (var index = 1; index < node.SelectElements.Count; ++index) { var element = node.SelectElements[index] as WSelectScalarExpression; if (element == null) throw new GraphViewException("Edge property should be a scalar expression."); //sink table if (index == 1) { var sinkTableColumn = element.SelectExpr as WColumnReferenceExpression; if (sinkTableColumn == null) throw new GraphViewException("Sink node id column should be a column reference expression."); var sinkTableName = sinkTableColumn.MultiPartIdentifier.Identifiers.Last().Value; _sinkTable = context[sinkTableName]; sinkNodeIdExpr = new WColumnReferenceExpression(); foreach (var identifier in sinkTableColumn.MultiPartIdentifier.Identifiers) sinkNodeIdExpr.Add(identifier); sinkNodeIdExpr.AddIdentifier("GlobalNodeId"); } else { _edgeProperties.Add(element.SelectExpr); } } var sourceTable = context[sourceTableName] as WNamedTableReference; if (sourceTable == null) { throw new GraphViewException("Source table of INSERT EDGE statement should be a named table reference."); } var sourceNodeId = new WSelectScalarExpression { SelectExpr = sourceNodeIdExpr, ColumnName = "src", }; var sinkNodeId = new WSelectScalarExpression { SelectExpr = sinkNodeIdExpr, ColumnName = "sink" }; var elements = new List<WSelectElement> { sourceNodeId, sinkNodeId }; var result = new WCommonTableExpression { ExpressionName = new Identifier {Value = _tempTableName}, QueryExpression = new WSelectQueryBlock { FromClause = node.FromClause, WhereClause = new WWhereClause { SearchCondition = node.WhereClause.SearchCondition }, HavingClause = node.HavingClause, OrderByClause = node.OrderByClause, TopRowFilter = node.TopRowFilter, UniqueRowFilter = node.UniqueRowFilter, SelectElements = elements, MatchClause = node.MatchClause } }; _result = result; }
public virtual void Visit(WCommonTableExpression node) { node.AcceptChildren(this); }