// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();
async function insertingDataTypes() {
  // Inserts data of various BigQuery-supported types into a table.
  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = 'my_dataset';
  // const tableId = 'my_table';
  // Describe the schema of the table
  // For more information on supported data types, see
  // https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types
  const schema = [
    {
      name: 'name',
      type: 'STRING',
    },
    {
      name: 'age',
      type: 'INTEGER',
    },
    {
      name: 'school',
      type: 'BYTES',
    },
    {
      name: 'metadata',
      type: 'JSON',
    },
    {
      name: 'location',
      type: 'GEOGRAPHY',
    },
    {
      name: 'measurements',
      mode: 'REPEATED',
      type: 'FLOAT',
    },
    {
      name: 'datesTimes',
      type: 'RECORD',
      fields: [
        {
          name: 'day',
          type: 'DATE',
        },
        {
          name: 'firstTime',
          type: 'DATETIME',
        },
        {
          name: 'secondTime',
          type: 'TIME',
        },
        {
          name: 'thirdTime',
          type: 'TIMESTAMP',
        },
      ],
    },
  ];
  // For all options, see https://cloud.google.com/bigquery/docs/reference/v2/tables#resource
  const options = {
    schema: schema,
  };
  // Create a new table in the dataset
  const [table] = await bigquery
    .dataset(datasetId)
    .createTable(tableId, options);
  console.log(`Table ${table.id} created.`);
  // The DATE type represents a logical calendar date, independent of time zone.
  // A DATE value does not represent a specific 24-hour time period.
  // Rather, a given DATE value represents a different 24-hour period when
  // interpreted in different time zones, and may represent a shorter or longer
  // day during Daylight Savings Time transitions.
  const bqDate = bigquery.date('2019-1-12');
  // A DATETIME object represents a date and time, as they might be
  // displayed on a calendar or clock, independent of time zone.
  const bqDatetime = bigquery.datetime('2019-02-17 11:24:00.000');
  // A TIME object represents a time, as might be displayed on a watch,
  // independent of a specific date and timezone.
  const bqTime = bigquery.time('14:00:00');
  // A TIMESTAMP object represents an absolute point in time,
  // independent of any time zone or convention such as Daylight
  // Savings Time with microsecond precision.
  const bqTimestamp = bigquery.timestamp('2020-04-27T18:07:25.356Z');
  const bqGeography = bigquery.geography('POINT(1 2)');
  const schoolBuffer = Buffer.from('Test University');
  // a JSON field needs to be converted to a string
  const metadata = JSON.stringify({
    owner: 'John Doe',
    contact: 'johndoe@example.com',
  });
  // Rows to be inserted into table
  const rows = [
    {
      name: 'Tom',
      age: '30',
      location: bqGeography,
      school: schoolBuffer,
      metadata: metadata,
      measurements: [50.05, 100.5],
      datesTimes: {
        day: bqDate,
        firstTime: bqDatetime,
        secondTime: bqTime,
        thirdTime: bqTimestamp,
      },
    },
    {
      name: 'Ada',
      age: '35',
      measurements: [30.08, 121.7],
    },
  ];
  // Insert data into table
  await bigquery.dataset(datasetId).table(tableId).insert(rows);
  console.log(`Inserted ${rows.length} rows`);
}