func NewTable()

in azkustodata/query/v1/table.go [11:77]


func NewTable(d query.BaseDataset, dt *RawTable, index *TableIndexRow) (query.Table, error) {
	var id string
	var kind string
	var name string
	var ordinal int64

	if index != nil {
		id = index.Id
		kind = index.Kind
		name = index.Name
		ordinal = index.Ordinal
	} else {
		// this case exists for the index table itself
		id = ""
		kind = ""
		name = dt.TableName
		ordinal = 0
	}

	op := d.Op()

	columns := make([]query.Column, len(dt.Columns))

	for i, c := range dt.Columns {
		// ColumnType should always be available, but in rare cases there are still commands that don't provide it.
		if c.ColumnType == "" {
			c.ColumnType = strings.ToLower(c.DataType)
		}
		normal := types.NormalizeColumn(c.ColumnType)
		if normal == "" {
			return nil, errors.ES(op, errors.KClientArgs, "column[%d] is of type %q, which is not valid", i, c.ColumnType)
		}

		columns[i] = query.NewColumn(i, c.ColumnName, normal)
	}

	baseTable := query.NewBaseTable(d, ordinal, id, name, kind, columns)

	rows := make([]query.Row, 0, len(dt.Rows))

	for i, r := range dt.Rows {
		if r.Errors != nil && len(r.Errors) > 0 {
			for _, e := range r.Errors {
				err := errors.ES(op, errors.KInternal, "row %d has an error: %s", i, e)
				return nil, err
			}
		}

		if r.Row == nil {
			continue
		}

		values := make(value.Values, len(r.Row))
		for j, v := range r.Row {
			parsed := value.Default(columns[j].Type())
			if v != nil {
				err := parsed.Unmarshal(v)
				if err != nil {
					return nil, errors.ES(op, errors.KInternal, "unable to unmarshal column %s into a %s value: %s", columns[j].Name(), columns[j].Type(), err)
				}
			}
			values[j] = parsed
		}
		rows = append(rows, query.NewRowFromParts(baseTable.Columns(), baseTable.ColumnByName, i, values))
	}
	return query.NewTable(baseTable, rows), nil
}