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());
    }
Exemplo n.º 2
0
        public override void TestInitialize()
        {
            base.TestInitialize();

            ClassUnderTest = new KSqlVisitor();
        }
Exemplo n.º 3
0
    public override void TestInitialize()
    {
        base.TestInitialize();

        ClassUnderTest = new KSqlVisitor(new KSqlQueryMetadata());
    }