public string BuildKSql(Expression expression, QueryContext queryContext) { queryMetadata = new KSqlQueryMetadata(); kSqlVisitor = new KSqlVisitor(queryMetadata); whereClauses = new Queue <Expression>(); joins = new List <(MethodInfo, IEnumerable <Expression>, LambdaExpression)>(); Visit(expression); string finalFromItemName = InterceptFromItemName(queryContext.FromItemName ?? fromItemName); queryContext.AutoOffsetReset = autoOffsetReset; queryMetadata.FromItemType = fromTableType; if (joins.Any()) { queryMetadata.Joins = joins.Select(c => c.Item2.ToArray()[0].Type.GenericTypeArguments[0]).Append(queryMetadata.FromItemType) .Select(c => new FromItem { Type = c }) .ToArray(); var joinsVisitor = new KSqlJoinsVisitor(kSqlVisitor.StringBuilder, options, new QueryContext { FromItemName = finalFromItemName }, queryMetadata); joinsVisitor.VisitJoinTable(joins); } else { kSqlVisitor.Append("SELECT "); if (queryMetadata.Select != null) { kSqlVisitor.Visit(queryMetadata.Select.Body); } else { kSqlVisitor.Append("*"); } kSqlVisitor.Append($" FROM {finalFromItemName}"); } bool isFirst = true; foreach (var methodCallExpression in whereClauses) { if (isFirst) { kSqlVisitor.Append(HasJoins ? string.Empty : Environment.NewLine); kSqlVisitor.Append("WHERE "); isFirst = false; } else { kSqlVisitor.Append(" AND "); } kSqlVisitor.Visit(methodCallExpression); } TryGenerateWindowAggregation(); if (groupBy != null) { kSqlVisitor.Append(" GROUP BY "); kSqlVisitor.Visit(groupBy.Body); } if (having != null) { kSqlVisitor.Append(" HAVING "); kSqlVisitor.Visit(having.Body); } if (partitionBy != null) { kSqlVisitor.Append(" PARTITION BY "); kSqlVisitor.Visit(partitionBy.Body); } if (ShouldEmitChanges) { string separator = string.Empty; if (!HasJoins || (HasJoins && whereClauses.Any())) { separator = " "; } kSqlVisitor.Append($"{separator}EMIT CHANGES"); } if (Limit.HasValue) { kSqlVisitor.Append($" LIMIT {Limit}"); } kSqlVisitor.Append(";"); return(kSqlVisitor.BuildKSql()); }
public override void TestInitialize() { base.TestInitialize(); ClassUnderTest = new KSqlVisitor(); }
public override void TestInitialize() { base.TestInitialize(); ClassUnderTest = new KSqlVisitor(new KSqlQueryMetadata()); }