Example #1
0
        public bool VisitExprTableAlias(ExprTableAlias expr, TCtx arg)
        {
            var res = this.Visit(expr, "TableAlias", arg, out var argOut) && this.Accept("Alias", expr.Alias, argOut);

            this._visitor.EndVisitExpr(expr, arg);
            return(res);
        }
Example #2
0
 public static ExprTableAlias WithAlias(this ExprTableAlias original, IExprAlias newAlias)
 => new ExprTableAlias(alias: newAlias);
Example #3
0
 public static ExprDerivedTableValues WithAlias(this ExprDerivedTableValues original, ExprTableAlias newAlias)
 => new ExprDerivedTableValues(values: original.Values, alias: newAlias, columns: original.Columns);
Example #4
0
 public static ExprDerivedTableQuery WithAlias(this ExprDerivedTableQuery original, ExprTableAlias newAlias)
 => new ExprDerivedTableQuery(query: original.Query, alias: newAlias, columns: original.Columns);
Example #5
0
 internal MergeDataBuilder(TTable table, IEnumerable <TItem> data, IExprAlias sourceTableAlias)
 {
     this._table            = table;
     this._data             = data;
     this._sourceTableAlias = new ExprTableAlias(sourceTableAlias);
 }
 public static ExprDerivedTableQuery As(this IExprSubQuery expressionBuilder, ExprTableAlias tableAlias)
 => new ExprDerivedTableQuery(expressionBuilder, tableAlias, null);
Example #7
0
 public MergerUpdateSetter(TTable target, ExprTableAlias sourceDataAlias) : base(target)
 {
     this.SourceDataAlias = sourceDataAlias;
 }
Example #8
0
 public bool VisitExprTableAlias(ExprTableAlias tableAlias, IExpr?parent)
 {
     tableAlias.Alias.Accept(this, tableAlias);
     return(true);
 }
Example #9
0
 protected ExprDerivedTable(ExprTableAlias alias)
 {
     this.Alias = alias;
 }
Example #10
0
 public ExprDerivedTableQuery(IExprSubQuery query, ExprTableAlias alias, IReadOnlyList <ExprColumnName>?columns) : base(alias)
 {
     this.Query   = query;
     this.Columns = columns;
 }
Example #11
0
 public ExprDerivedTableValues(ExprTableValueConstructor values, ExprTableAlias alias, IReadOnlyList <ExprColumnName> columns) : base(alias)
 {
     this.Values  = values;
     this.Columns = columns;
 }
Example #12
0
        public static UpdateDataAnalysis AnalyzeUpdateData <TTable, TItem>
        (
            IEnumerable <TItem> data,
            TTable targetTable,
            DataMapping <TTable, TItem> dataMapKeys,
            DataMapping <TTable, TItem>?dataMap,
            IndexDataMapping?extraDataMap,
            ExprTableAlias sourceTableAlias
        )
        {
            var records = data.TryToCheckLength(out var capacity)
                ? capacity > 0 ? new List <ExprValueRow>(capacity) : null
                : new List <ExprValueRow>();

            if (records == null)
            {
                throw new SqExpressException("Input data should not be empty");
            }

            DataMapSetter <TTable, TItem>? setter          = null;
            List <ExprColumnName>?         keys            = null;
            IReadOnlyList <ExprColumnName>?allTableColumns = null;
            IReadOnlyList <ExprColumnName>?totalColumns    = null;

            foreach (var item in data)
            {
                setter ??= new DataMapSetter <TTable, TItem>(targetTable, item);

                setter.NextItem(item, totalColumns?.Count);
                dataMapKeys(setter);

                keys ??= new List <ExprColumnName>(setter.Columns);

                keys.AssertNotEmpty("There should be at least one key");

                dataMap?.Invoke(setter);

                totalColumns = allTableColumns ??= new List <ExprColumnName>(setter.Columns);

                if (extraDataMap != null)
                {
                    extraDataMap.Invoke(setter);
                    if (ReferenceEquals(totalColumns, allTableColumns))
                    {
                        totalColumns = new List <ExprColumnName>(setter.Columns);
                    }
                }

                setter.EnsureRecordLength();
                records.Add(new ExprValueRow(setter.Record.AssertFatalNotNull(nameof(setter.Record))));
            }

            if (records.Count < 1)
            {
                throw new SqExpressException("Input data should not be empty");
            }

            keys            = keys.AssertFatalNotNull(nameof(keys));
            allTableColumns = allTableColumns.AssertFatalNotNull(nameof(allTableColumns));
            totalColumns    = totalColumns.AssertFatalNotNull(nameof(allTableColumns));

            var exprValuesTable = new ExprDerivedTableValues(new ExprTableValueConstructor(records), sourceTableAlias, totalColumns);

            if (keys.Count > allTableColumns.Count)
            {
                throw new SqExpressException("The number of keys exceeds the number of columns");
            }

            return(new UpdateDataAnalysis(keys, allTableColumns, exprValuesTable));
        }