コード例 #1
0
        /// <summary>
        /// Creates a new instance of the <see cref="SqlTableConfigBuilder"/>.
        /// </summary>
        /// <param name="tableName">The table name.</param>
        /// <param name="uniqueKey">The unique key columns.</param>
        /// <returns>The <see cref="SqlTableConfigBuilder"/>.</returns>
        /// <exception cref="ArgumentNullException">If <paramref name="tableName"/> or <paramref name="uniqueKey"/> is <c>null</c>.</exception>
        public static SqlTableConfigBuilder Create(TableExpressionDelegate tableName, string[] uniqueKey)
        {
            if (tableName == null)
            {
                throw new ArgumentNullException(nameof(tableName));
            }
            if (uniqueKey == null)
            {
                throw new ArgumentNullException(nameof(uniqueKey));
            }

            var config = new SqlTableConfig(tableName, uniqueKey);

            return(new SqlTableConfigBuilder(config));
        }
コード例 #2
0
 private SqlTableConfigBuilder(SqlTableConfig sqlTableConfig)
 {
     SqlTableConfig = sqlTableConfig;
 }
コード例 #3
0
        private Node HandleTable(Node?parent, Field fieldAst, FieldType field, IComplexGraphType graphType,
                                 SqlTableConfig config, int depth, IResolveFieldContext context)
        {
            var arguments = HandleArguments(field, fieldAst, context);

            var fieldName = fieldAst.Alias ?? fieldAst.Name;
            var tableName = config.Table(arguments, context);
            var tableAs   = _aliasGenerator.GenerateTableAlias(fieldName);

            var grabMany = field.ResolvedType.IsListType();

            var where = field.GetSqlWhere();
            var join     = field.GetSqlJoin();
            var junction = field.GetSqlJunction();
            var batch    = field.GetSqlBatch();
            var orderBy  = field.GetSqlOrder();
            var sortKey  = field.GetSqlSortKey();
            var paginate = false;

            if (!grabMany && field.ResolvedType.GetNamedType().IsConnectionType())
            {
                paginate = field.GetSqlPaginate().GetValueOrDefault(false);
                grabMany = true;
            }

            var sqlTable = new SqlTable(parent, config, tableName, fieldName, tableAs, arguments, grabMany)
                           .WithLocation(fieldAst.SourceLocation);

            if (config.UniqueKey.Length == 1)
            {
                var alias = _aliasGenerator.GenerateColumnAlias(config.UniqueKey[0]);
                sqlTable.Columns.Add(new SqlColumn(sqlTable, config.UniqueKey[0], config.UniqueKey[0], alias, true));
            }
            else
            {
                var clumsyName = string.Join("#", config.UniqueKey);
                var alias      = _aliasGenerator.GenerateColumnAlias(clumsyName);
                sqlTable.Columns.Add(new SqlComposite(sqlTable, config.UniqueKey, clumsyName, alias, true));
            }

            if (config.AlwaysFetch != null)
            {
                foreach (var column in config.AlwaysFetch)
                {
                    var alias = _aliasGenerator.GenerateColumnAlias(column);
                    sqlTable.Columns.Add(new SqlColumn(sqlTable, column, column, alias));
                }
            }

            if (fieldAst.SelectionSet != null)
            {
                HandleSelections(sqlTable, graphType, fieldAst.SelectionSet.Selections, depth, context);
            }

            sqlTable.ColumnExpression = config.ColumnExpression;

            if (where != null)
            {
                sqlTable.Where = where;
            }

            if (orderBy != null)
            {
                var builder = new OrderByBuilder(sqlTable.As);
                orderBy(builder, arguments, context, sqlTable);
                sqlTable.OrderBy = builder.OrderBy;
            }

            if (sortKey != null)
            {
                var builder = new SortKeyBuilder(sqlTable.As, _aliasGenerator);
                sortKey(builder, arguments, context, sqlTable);
                sqlTable.SortKey = builder.SortKey;
            }

            sqlTable.Paginate = paginate;

            if (join != null)
            {
                sqlTable.Join = join;
            }
            else if (junction != null)
            {
                sqlTable.Junction = new SqlJunction(sqlTable, junction.Table, _aliasGenerator.GenerateTableAlias(junction.Table));

                if (junction.Where != null)
                {
                    sqlTable.Junction.Where = junction.Where;
                }

                if (junction.OrderBy != null)
                {
                    var builder = new OrderByBuilder(tableAs);
                    junction.OrderBy(builder, arguments, context, sqlTable);
                    sqlTable.Junction.OrderBy = builder.OrderBy;
                }

                if (junction.SortKey != null)
                {
                    var builder = new SortKeyBuilder(tableAs, _aliasGenerator);
                    junction.SortKey(builder, arguments, context, sqlTable);
                    sqlTable.Junction.SortKey = builder.SortKey;
                }
                var batchConfig = junction.BatchConfig;

                if (junction.FromParent != null && junction.ToChild != null)
                {
                    sqlTable.Junction.FromParent = junction.FromParent;
                    sqlTable.Junction.ToChild    = junction.ToChild;
                }
                else if (batchConfig != null)
                {
                    sqlTable.Junction.Batch = new SqlBatch(
                        new SqlColumn(sqlTable, batchConfig.ThisKey, batchConfig.ThisKey,
                                      _aliasGenerator.GenerateColumnAlias(batchConfig.ThisKey))
                    {
                        FromOtherTable = sqlTable.Junction.As,
                        Expression     = batchConfig.ThisKeyExpression
                    },
                        new SqlColumn(sqlTable, batchConfig.ParentKey, fieldName,
                                      _aliasGenerator.GenerateColumnAlias(batchConfig.ParentKey))
                    {
                        Expression = batchConfig.ParentKeyExpression
                    }
                        )
                    {
                        Join  = batchConfig.Join,
                        Where = batchConfig.Where
                    };
                }
            }
            else if (batch != null)
            {
                sqlTable.Batch = new SqlBatch(
                    new SqlColumn(sqlTable, batch.ThisKey, batch.ThisKey, _aliasGenerator.GenerateColumnAlias(batch.ThisKey))
                {
                    Expression = batch.ThisKeyExpression
                },
                    new SqlColumn(sqlTable, batch.ParentKey, batch.ParentKey, _aliasGenerator.GenerateColumnAlias(batch.ParentKey))
                {
                    Expression = batch.ParentKeyExpression
                }
                    )
                {
                    Where = batch.Where
                };
            }

            if (paginate)
            {
                HandleColumnsRequiredForPagination(sqlTable);
            }

            return(sqlTable);
        }