123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- // Copyright 2015 Google Inc. All Rights Reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- package bigquery
- import bq "google.golang.org/api/bigquery/v2"
- // Schema describes the fields in a table or query result.
- type Schema []*FieldSchema
- // TODO(mcgreevy): add a function to generate a schema from a struct.
- type FieldSchema struct {
- // The field name.
- // Must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_),
- // and must start with a letter or underscore.
- // The maximum length is 128 characters.
- Name string
- // A description of the field. The maximum length is 16,384 characters.
- Description string
- // Whether the field may contain multiple values.
- Repeated bool
- // Whether the field is required. Ignored if Repeated is true.
- Required bool
- // The field data type. If Type is Record, then this field contains a nested schema,
- // which is described by Schema.
- Type FieldType
- // Describes the nested schema if Type is set to Record.
- Schema Schema
- }
- func (fs *FieldSchema) asTableFieldSchema() *bq.TableFieldSchema {
- tfs := &bq.TableFieldSchema{
- Description: fs.Description,
- Name: fs.Name,
- Type: string(fs.Type),
- }
- if fs.Repeated {
- tfs.Mode = "REPEATED"
- } else if fs.Required {
- tfs.Mode = "REQUIRED"
- } // else leave as default, which is interpreted as NULLABLE.
- for _, f := range fs.Schema {
- tfs.Fields = append(tfs.Fields, f.asTableFieldSchema())
- }
- return tfs
- }
- func (s Schema) asTableSchema() *bq.TableSchema {
- var fields []*bq.TableFieldSchema
- for _, f := range s {
- fields = append(fields, f.asTableFieldSchema())
- }
- return &bq.TableSchema{Fields: fields}
- }
- func convertTableFieldSchema(tfs *bq.TableFieldSchema) *FieldSchema {
- fs := &FieldSchema{
- Description: tfs.Description,
- Name: tfs.Name,
- Repeated: tfs.Mode == "REPEATED",
- Required: tfs.Mode == "REQUIRED",
- Type: FieldType(tfs.Type),
- }
- for _, f := range tfs.Fields {
- fs.Schema = append(fs.Schema, convertTableFieldSchema(f))
- }
- return fs
- }
- func convertTableSchema(ts *bq.TableSchema) Schema {
- var s Schema
- for _, f := range ts.Fields {
- s = append(s, convertTableFieldSchema(f))
- }
- return s
- }
- type FieldType string
- const (
- StringFieldType FieldType = "STRING"
- IntegerFieldType FieldType = "INTEGER"
- FloatFieldType FieldType = "FLOAT"
- BooleanFieldType FieldType = "BOOLEAN"
- TimestampFieldType FieldType = "TIMESTAMP"
- RecordFieldType FieldType = "RECORD"
- )
|