public KSqlJoinsVisitor(StringBuilder stringBuilder, KSqlDBContextOptions contextOptions, QueryContext queryContext, KSqlQueryMetadata queryMetadata)
     : base(stringBuilder, queryMetadata)
 {
     this.contextOptions = contextOptions ?? throw new ArgumentNullException(nameof(contextOptions));
     this.queryContext   = queryContext ?? throw new ArgumentNullException(nameof(queryContext));
     this.queryMetadata  = queryMetadata ?? throw new ArgumentNullException(nameof(queryMetadata));
 }
Exemplo n.º 2
0
    public KSqlVisitor(KSqlQueryMetadata queryMetadata)
    {
        this.queryMetadata = queryMetadata ?? throw new ArgumentNullException(nameof(queryMetadata));

        useTableAlias = queryMetadata.Joins?.Any() ?? false;

        stringBuilder = new();
    }
Exemplo n.º 3
0
 public AggregationFunctionVisitor(StringBuilder stringBuilder, KSqlQueryMetadata queryMetadata)
     : base(stringBuilder, queryMetadata)
 {
 }
Exemplo n.º 4
0
 public KSqlFunctionLambdaVisitor(StringBuilder stringBuilder, KSqlQueryMetadata queryMetadata)
     : base(stringBuilder, queryMetadata)
 {
 }
Exemplo n.º 5
0
 public KSqlWindowsVisitor(StringBuilder stringBuilder, KSqlQueryMetadata queryMetadata)
     : base(stringBuilder, queryMetadata)
 {
 }
Exemplo n.º 6
0
 internal KSqlVisitor(StringBuilder stringBuilder, KSqlQueryMetadata queryMetadata)
     : this(queryMetadata)
 {
     this.stringBuilder = stringBuilder ?? throw new ArgumentNullException(nameof(stringBuilder));
 }
 public KSqlInvocationFunctionVisitor(StringBuilder stringBuilder, KSqlQueryMetadata queryMetadata)
     : base(stringBuilder, queryMetadata)
 {
     this.stringBuilder = stringBuilder ?? throw new ArgumentNullException(nameof(stringBuilder));
     this.queryMetadata = queryMetadata ?? throw new ArgumentNullException(nameof(queryMetadata));
 }
Exemplo n.º 8
0
 public OperatorBetweenKSqlVisitor(StringBuilder stringBuilder, KSqlQueryMetadata queryMetadata)
     : base(stringBuilder, queryMetadata)
 {
 }
 internal KSqlJoinSelectFieldsVisitor(StringBuilder stringBuilder, KSqlQueryMetadata queryMetadata)
     : base(stringBuilder, queryMetadata)
 {
     this.queryMetadata = queryMetadata;
 }
    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());
    }