/// <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)); }
private SqlTableConfigBuilder(SqlTableConfig sqlTableConfig) { SqlTableConfig = sqlTableConfig; }
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); }