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); }
private ThenSortKeyBuilder ThenBy(string column, Type?type, SortDirection direction) { SortKey.ThenBy = new SortKey(Table, column, _aliasGenerator.GenerateColumnAlias(column), type, direction); return(new ThenSortKeyBuilder(Table, SortKey.ThenBy, _aliasGenerator)); }