protected virtual ValueTask <QsiTableStructure> BuildInlineDerivedTableStructure(TableCompileContext context, IQsiInlineDerivedTableNode table) { context.ThrowIfCancellationRequested(); var alias = table.Alias?.Name; if (alias == null && table.Parent is IQsiDerivedColumnNode && !context.Options.AllowNoAliasInDerivedTable) { throw new QsiException(QsiError.NoAlias); } var declaredTable = new QsiTableStructure { Type = QsiTableType.Inline, Identifier = alias == null ? null : new QsiQualifiedIdentifier(alias) }; int?columnCount = null; switch (table.Columns) { case null: case var cd when cd.All(c => c is IQsiAllColumnNode { Path: null } all) : // Skip break; case var cd when cd.TryCast(out IQsiSequentialColumnNode[] sequentialColumns): foreach (var column in sequentialColumns) { var c = declaredTable.NewColumn(); c.Name = column.Alias.Name; } columnCount = sequentialColumns.Length; break; default: throw new NotSupportedException("Not supported columns in inline derived table."); } // Skip trace columns in expression. // Because don't know the possibility of declaring a referenceable column in the expression. // ISSUE: row.ColumnValues foreach (var row in table.Rows ?? Enumerable.Empty <IQsiRowValueExpressionNode>()) { if (!columnCount.HasValue) { columnCount = row.ColumnValues.Length; } else if (columnCount != row.ColumnValues.Length) { throw new QsiException(QsiError.DifferentColumnsCount); } } if ((columnCount ?? 0) == 0) { if (!context.Options.AllowEmptyColumnsInInline) { throw new QsiException(QsiError.NoColumnsSpecified, alias); } columnCount = 0; } if (declaredTable.Columns.Count != columnCount) { for (int i = 0; i < columnCount; i++) { declaredTable.NewColumn(); } } return(new ValueTask <QsiTableStructure>(declaredTable)); }
protected virtual ValueTask <QsiTableStructure> BuildInlineDerivedTableStructure(TableCompileContext context, IQsiInlineDerivedTableNode table) { context.ThrowIfCancellationRequested(); var alias = table.Alias?.Name; if (alias == null && table.Parent is IQsiDerivedColumnNode && !context.Options.AllowNoAliasInDerivedTable) { throw new QsiException(QsiError.NoAlias); } var declaredTable = new QsiTableStructure { Type = QsiTableType.Inline, Identifier = alias == null ? null : new QsiQualifiedIdentifier(alias) }; int?columnCount = null; switch (table.Columns) { case null: case var cd when cd.All(c => c is IQsiAllColumnNode { Path: null }) : // Skip break;